Compare commits

...

6 Commits

Author SHA1 Message Date
lebaudantoine 1306f0bcfe (backend) expose is_active field for Application in Django admin
Add minimal admin support to allow administrators to mark an
application account as inactive if it becomes rogue or compromised.

This capability was missing when the application concept was
initially introduced in the backend.
2026-03-12 13:27:08 +01:00
lebaudantoine ca4494c09e ♻️(backend) align Application model field with is_active convention
Most models in the project use `is_active` rather than `active`.
The Application model was not aligned with this convention.

Rename the field and add a migration to standardize the naming.
Update related tests accordingly.

This change should not introduce breaking changes for external
applications.
2026-03-12 13:26:37 +01:00
lebaudantoine f57db0acc8 ♻️(backend) refactor uploaded file's key format
Remove the user-provided filename while preserving the extension,
and switch to the format `uuid.extension`.

This is more natural than the previous `uuid/.extension` format
and avoids confusion.

Update related tests accordingly.
2026-03-12 10:39:59 +01:00
Florent Chehab 342f992556 🔨(python-env) migrate meet main app to UV
Migrate main meet app to use UV for dependancy management.
Also optimized the backend image build sequence for faster rebuilds
when dependencies don't change.
Also removed compiled django translations files are they are done in the build
process now.

Changes inspired by drive repo.
2026-03-12 10:25:35 +01:00
lebaudantoine d0cf3974ad 🚸(frontend) allow downloading recordings with "failed to stop" status
When support manually marks a recording as "failed to stop," enable
users to download the recording from the frontend.

This ensures users can recover their recordings even if the
automatic stop process fails.
2026-03-11 19:41:45 +01:00
lebaudantoine 0f3eb35c83 🩹(backend) add Django admin action to update recording status manually
Making the status read-only improved security and enforced least
privilege, but in production some recordings could not be properly
stopped, leaving them in an active state.

Introduce an admin action to allow support staff to mark recordings
as "failed to stop" or update their status when necessary.
2026-03-11 19:41:45 +01:00
34 changed files with 2968 additions and 464 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ __pycache__
**/__pycache__
**/*.pyc
venv
.venv
**/.venv
# System-specific files
.DS_Store
+14 -12
View File
@@ -124,15 +124,17 @@ jobs:
uses: actions/setup-python@v6
with:
python-version: "3.13"
cache: "pip"
- name: Install development dependencies
run: pip install --user .[dev]
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Install the project
run: uv sync --locked --all-extras
- name: Check code formatting with ruff
run: ~/.local/bin/ruff format . --diff
run: uv run ruff format . --diff
- name: Lint code with ruff
run: ~/.local/bin/ruff check .
run: uv run ruff check .
- name: Lint code with pylint
run: ~/.local/bin/pylint meet demo core
run: uv run pylint meet demo core
lint-agents:
runs-on: ubuntu-latest
@@ -279,10 +281,10 @@ jobs:
uses: actions/setup-python@v6
with:
python-version: "3.13"
cache: "pip"
- name: Install development dependencies
run: pip install --user .[dev]
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Install the dependencies
run: uv sync --locked --all-extras
- name: Install gettext (required to compile messages)
run: |
@@ -290,10 +292,10 @@ jobs:
sudo apt-get install -y gettext
- name: Generate a MO file from strings extracted from the project
run: python manage.py compilemessages
run: uv run python manage.py compilemessages
- name: Run tests
run: ~/.local/bin/pytest -n 2
run: uv run pytest -n 2
lint-front:
runs-on: ubuntu-latest
+1
View File
@@ -31,6 +31,7 @@ MANIFEST
# Translations # Translations
*.pot
*.mo
# Environments
.env
+3
View File
@@ -13,6 +13,7 @@ and this project adheres to
- ✨(helm) support celery with our Django backend #1124
- ✨(helm) support ingress for custom background image #1124
- ✨(backend) add authenticated user rate throttling on request-entry #1129
- ✨(backend) expose `is_active` field for Application in Django admin #1133
### Changed
@@ -22,6 +23,8 @@ and this project adheres to
- ♿(frontend) improve chat toast a11y for screen readers #1109
- ♿(frontend) improve ui and aria labels for help article links #1108
- 🌐(frontend) improve German translation #1125
- 🔨(python-env) migrate meet main app to UV #1120
- ♻️(backend) align Application model field with `is_active` convention #1133
### Fixed
+39 -23
View File
@@ -13,14 +13,28 @@ RUN apk update && \
# ---- Back-end builder image ----
FROM base AS back-builder
WORKDIR /builder
# Copy required python dependencies
COPY ./src/backend /builder
ENV UV_COMPILE_BYTECODE=1
ENV UV_LINK_MODE=copy
RUN mkdir /install && \
pip install --prefix=/install .
# Disable Python downloads, because we want to use the system interpreter
# across both images. If using a managed Python version, it needs to be
# copied from the build image into the final image;
ENV UV_PYTHON_DOWNLOADS=0
# install uv
COPY --from=ghcr.io/astral-sh/uv:0.10.9 /uv /uvx /bin/
WORKDIR /app
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=src/backend/uv.lock,target=uv.lock \
--mount=type=bind,source=src/backend/pyproject.toml,target=pyproject.toml \
uv sync --locked --no-install-project --no-dev
COPY src/backend /app
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --locked --no-dev
# ---- mails ----
FROM node:20 AS mail-builder
@@ -30,7 +44,7 @@ COPY ./src/mail /mail/app
WORKDIR /mail/app
RUN yarn install --frozen-lockfile && \
yarn build
yarn build
# ---- static link collector ----
@@ -42,17 +56,17 @@ RUN apk add \
libmagic \
rdfind
# Copy installed python dependencies
COPY --from=back-builder /install /usr/local
# Copy Meet application (see .dockerignore)
COPY ./src/backend /app/
WORKDIR /app
# Copy the application from the builder
COPY --from=back-builder /app /app
ENV PATH="/app/.venv/bin:$PATH"
# collectstatic
RUN DJANGO_CONFIGURATION=Build DJANGO_JWT_PRIVATE_SIGNING_KEY=Dummy \
python manage.py collectstatic --noinput
python manage.py collectstatic --noinput
# Replace duplicated file by a symlink to decrease the overall size of the
# final image
@@ -81,14 +95,17 @@ COPY ./docker/files/usr/local/bin/entrypoint /usr/local/bin/entrypoint
# docker user (see entrypoint).
RUN chmod g=u /etc/passwd
# Copy installed python dependencies
COPY --from=back-builder /install /usr/local
# Copy Meet application (see .dockerignore)
COPY ./src/backend /app/
# Copy the application from the builder
COPY --from=back-builder /app /app
WORKDIR /app
ENV PATH="/app/.venv/bin:$PATH"
# Generate compiled translation messages
RUN DJANGO_CONFIGURATION=Build \
python manage.py compilemessages --ignore=".venv/**/*"
# We wrap commands run in this container by the following entrypoint that
# creates a user on-the-fly with the container user ID (see USER) and root group
# ID.
@@ -103,10 +120,9 @@ USER root:root
# Install psql
RUN apk add postgresql-client
# Uninstall Meet and re-install it in editable mode along with development
# dependencies
RUN pip uninstall -y meet
RUN pip install -e .[dev]
# Install development dependencies
RUN --mount=from=ghcr.io/astral-sh/uv:0.10.9,source=/uv,target=/bin/uv \
uv sync --all-extras --locked
# Restore the un-privileged user running the application
ARG DOCKER_USER
@@ -115,7 +131,7 @@ USER ${DOCKER_USER}
# Target database host (e.g. database engine following docker compose services
# name) & port
ENV DB_HOST=postgresql \
DB_PORT=5432
DB_PORT=5432
# Run django development server
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
+1 -1
View File
@@ -223,7 +223,7 @@ superuser: ## Create an admin superuser with password "admin"
.PHONY: superuser
back-i18n-compile: ## compile the gettext files
@$(MANAGE) compilemessages --ignore="venv/**/*"
@$(MANAGE) compilemessages --ignore=".venv/**/*"
.PHONY: back-i18n-compile
back-i18n-generate: ## create the .pot files used for i18n
+2
View File
@@ -80,6 +80,7 @@ services:
volumes:
- ./src/backend:/app
- ./data/static:/data/static
- /app/.venv
depends_on:
- postgresql
- mailcatcher
@@ -105,6 +106,7 @@ services:
volumes:
- ./src/backend:/app
- ./data/static:/data/static
- /app/.venv
depends_on:
- app-dev
+1 -1
View File
@@ -71,7 +71,7 @@ backend:
# Extra volume to manage our local custom CA and avoid to set ssl_verify: false
extraVolumeMounts:
- name: certs
mountPath: /usr/local/lib/python3.12/site-packages/certifi/cacert.pem
mountPath: /app/.venv/lib/python3.13/site-packages/certifi/cacert.pem
subPath: cacert.pem
# Extra volume to manage our local custom CA and avoid to set ssl_verify: false
+35 -2
View File
@@ -197,6 +197,38 @@ def resend_notification(modeladmin, request, queryset): # pylint: disable=unuse
)
@admin.action(description=_("Mark selected recordings as 'Failed to Stop'"))
def mark_as_failed_to_stop(modeladmin, request, queryset):
"""Force selected recordings status to failed_to_stop."""
eligible_statuses = [
models.RecordingStatusChoices.ACTIVE,
models.RecordingStatusChoices.INITIATED,
models.RecordingStatusChoices.STOPPED,
]
eligible = queryset.filter(status__in=eligible_statuses)
skipped = queryset.exclude(status__in=eligible_statuses).count()
updated = eligible.update(status=models.RecordingStatusChoices.FAILED_TO_STOP)
if updated > 0:
modeladmin.message_user(
request,
_("%(count)s recording(s) successfully marked as 'Failed to Stop'.")
% {"count": updated},
level=messages.SUCCESS,
)
if skipped > 0:
modeladmin.message_user(
request,
_("Skipped %(count)s recording(s) with an ineligible status.")
% {"count": skipped},
level=messages.WARNING,
)
@admin.register(models.Recording)
class RecordingAdmin(admin.ModelAdmin):
"""Recording admin interface declaration."""
@@ -224,7 +256,7 @@ class RecordingAdmin(admin.ModelAdmin):
"updated_at",
"worker_id",
)
actions = [resend_notification]
actions = [resend_notification, mark_as_failed_to_stop]
def get_queryset(self, request):
"""Optimize queries by prefetching related access and user data to avoid N+1 queries."""
@@ -276,7 +308,7 @@ class ApplicationAdmin(admin.ModelAdmin):
form = ApplicationAdminForm
list_display = ("id", "name", "client_id", "get_scopes_display")
list_display = ("id", "name", "client_id", "get_scopes_display", "is_active")
fields = [
"name",
"id",
@@ -285,6 +317,7 @@ class ApplicationAdmin(admin.ModelAdmin):
"scopes",
"client_id",
"client_secret",
"is_active",
]
readonly_fields = ["id", "created_at", "updated_at"]
inlines = [ApplicationDomainInline]
+1 -1
View File
@@ -85,7 +85,7 @@ UUID_REGEX = (
FILE_EXT_REGEX = r"[\d\w]+"
MEDIA_STORAGE_URL_PATTERN = re.compile(
f"{settings.MEDIA_URL:s}"
rf"(?P<key>{FILE_FOLDER:s}/(?P<pk>{UUID_REGEX:s})/\.{FILE_EXT_REGEX:s})$"
rf"(?P<key>{FILE_FOLDER:s}/(?P<pk>{UUID_REGEX:s})\.{FILE_EXT_REGEX:s})$"
)
@@ -203,7 +203,7 @@ class ApplicationJWTAuthentication(BaseJWTAuthentication):
logger.warning("Application not found: %s", client_id)
raise exceptions.AuthenticationFailed("Application not found.") from e
if not application.active:
if not application.is_active:
logger.warning(
"Inactive application attempted authentication: %s", client_id
)
+1 -1
View File
@@ -61,7 +61,7 @@ class ApplicationViewSet(viewsets.ViewSet):
except models.Application.DoesNotExist as e:
raise drf_exceptions.AuthenticationFailed("Invalid credentials") from e
if not application.active:
if not application.is_active:
raise drf_exceptions.AuthenticationFailed("Application is inactive")
if not check_password(client_secret, application.client_secret):
+1 -1
View File
@@ -129,7 +129,7 @@ class ApplicationFactory(factory.django.DjangoModelFactory):
model = models.Application
name = factory.Faker("company")
active = True
is_active = True
client_id = factory.LazyFunction(utils.generate_client_id)
client_secret = factory.LazyFunction(utils.generate_client_secret)
scopes = []
@@ -0,0 +1,18 @@
# Generated by Django 5.2.12 on 2026-03-11 14:39
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('core', '0017_file'),
]
operations = [
migrations.RenameField(
model_name='application',
old_name='active',
new_name='is_active',
),
]
+2 -2
View File
@@ -759,7 +759,7 @@ class Application(BaseModel):
verbose_name=_("Application name"),
help_text=_("Descriptive name for this application."),
)
active = models.BooleanField(default=True)
is_active = models.BooleanField(default=True)
client_id = models.CharField(
max_length=100, unique=True, default=utils.generate_client_id
)
@@ -952,7 +952,7 @@ class File(BaseModel):
_, extension = splitext(self.filename)
# We store only the extension in the storage system to avoid
# leaking Personal Information in logs, etc.
return f"{self.key_base}/{extension!s}"
return f"{self.key_base}{extension!s}"
def get_abilities(self, user):
"""
@@ -118,7 +118,7 @@ def test_api_files_create_file_authenticated_success():
assert policy_parsed.scheme == "http"
assert policy_parsed.netloc == "localhost:9000"
assert policy_parsed.path == f"/meet-media-storage/files/{file.id!s}/.png"
assert policy_parsed.path == f"/meet-media-storage/files/{file.id!s}.png"
query_params = parse_qs(policy_parsed.query)
@@ -39,7 +39,7 @@ def test_api_files_update_anonymous_forbidden():
def test_api_files_update_description_and_title():
"""
Test the description and title of an file can be updated.
Test the description and title of a file can be updated.
"""
user = factories.UserFactory()
@@ -904,7 +904,7 @@ def test_api_rooms_token_unknown_application(settings):
def test_api_rooms_token_inactive_application(settings):
"""Token for inactive application should be rejected."""
application = ApplicationFactory(active=False)
application = ApplicationFactory(is_active=False)
now = datetime.now(timezone.utc)
payload = {
@@ -23,7 +23,7 @@ def test_api_applications_generate_token_success(settings):
"""Valid credentials should return a JWT token."""
UserFactory(email="User.Family@example.com")
application = ApplicationFactory(
active=True,
is_active=True,
scopes=[ApplicationScope.ROOMS_LIST, ApplicationScope.ROOMS_CREATE],
)
@@ -79,7 +79,7 @@ def test_api_applications_generate_token_invalid_client_id():
def test_api_applications_generate_token_invalid_client_secret():
"""Invalid client_secret should return 401."""
user = UserFactory(email="user@example.com")
application = ApplicationFactory(active=True)
application = ApplicationFactory(is_active=True)
client = APIClient()
response = client.post(
@@ -100,7 +100,7 @@ def test_api_applications_generate_token_invalid_client_secret():
def test_api_applications_generate_token_inactive_application():
"""Inactive application should return 401."""
user = UserFactory(email="user@example.com")
application = ApplicationFactory(active=False)
application = ApplicationFactory(is_active=False)
plain_secret = "test-secret-123"
application.client_secret = plain_secret
@@ -124,7 +124,7 @@ def test_api_applications_generate_token_inactive_application():
def test_api_applications_generate_token_invalid_email_format():
"""Invalid email format should return 400."""
application = ApplicationFactory(active=True)
application = ApplicationFactory(is_active=True)
plain_secret = "test-secret-123"
application.client_secret = plain_secret
@@ -149,7 +149,7 @@ def test_api_applications_generate_token_invalid_email_format():
def test_api_applications_generate_token_domain_not_authorized():
"""Application without domain authorization should return 403."""
user = UserFactory(email="user@denied.com")
application = ApplicationFactory(active=True)
application = ApplicationFactory(is_active=True)
ApplicationDomainFactory(application=application, domain="allowed.com")
plain_secret = "test-secret-123"
@@ -176,7 +176,7 @@ def test_api_applications_generate_token_domain_authorized():
"""Application with domain authorization should succeed."""
user = UserFactory(email="user@allowed.com")
application = ApplicationFactory(
active=True,
is_active=True,
scopes=[ApplicationScope.ROOMS_LIST],
)
ApplicationDomainFactory(application=application, domain="allowed.com")
@@ -203,7 +203,7 @@ def test_api_applications_generate_token_domain_authorized():
def test_api_applications_generate_token_user_not_found():
"""Non-existent user should return 404."""
application = ApplicationFactory(active=True)
application = ApplicationFactory(is_active=True)
plain_secret = "test-secret-123"
application.client_secret = plain_secret
@@ -231,7 +231,7 @@ def test_api_applications_token_payload_structure(settings):
user = UserFactory(email="user@example.com")
application = ApplicationFactory(
active=True,
is_active=True,
scopes=[ApplicationScope.ROOMS_LIST, ApplicationScope.ROOMS_CREATE],
)
@@ -284,7 +284,7 @@ def test_api_applications_token_new_user(settings):
assert len(User.objects.all()) == 0
application = ApplicationFactory(
active=True,
is_active=True,
scopes=[ApplicationScope.ROOMS_LIST, ApplicationScope.ROOMS_CREATE],
)
@@ -342,7 +342,7 @@ def test_api_applications_token_existing_user(settings):
assert len(User.objects.all()) == 1
application = ApplicationFactory(
active=True,
is_active=True,
scopes=[ApplicationScope.ROOMS_LIST, ApplicationScope.ROOMS_CREATE],
)
@@ -41,7 +41,7 @@ def test_models_application_name_maxlength():
def test_models_application_active_default():
"""An application should be active by default."""
application = Application.objects.create(name="Test App")
assert application.active is True
assert application.is_active is True
def test_models_application_scopes_default():
Binary file not shown.
+111 -96
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-26 17:34+0000\n"
"POT-Creation-Date: 2026-03-11 17:31+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -29,11 +29,11 @@ msgstr "Berechtigungen"
msgid "Important dates"
msgstr "Wichtige Daten"
#: core/admin.py:132 core/admin.py:243
#: core/admin.py:132 core/admin.py:275
msgid "No owner"
msgstr "Kein Eigentümer"
#: core/admin.py:135 core/admin.py:246
#: core/admin.py:135 core/admin.py:278
msgid "Multiple owners"
msgstr "Mehrere Eigentümer"
@@ -61,117 +61,132 @@ msgstr "Benachrichtigungen für %(count)s Aufnahme(n) erfolgreich gesendet."
msgid "Skipped %(count)s expired recording(s)."
msgstr "%(count)s abgelaufene Aufnahme(n) übersprungen."
#: core/admin.py:309
#: core/admin.py:200
msgid "Mark selected recordings as 'Failed to Stop'"
msgstr "Ausgewählte Aufnahmen als Fehler beim Stoppen markieren"
#: core/admin.py:218
#, python-format
msgid "%(count)s recording(s) successfully marked as 'Failed to Stop'."
msgstr "%(count)s Aufnahme(n) erfolgreich als Fehler beim Stoppen markiert."
#: core/admin.py:226
#, fuzzy, python-format
#| msgid "Skipped %(count)s expired recording(s)."
msgid "Skipped %(count)s recording(s) with an ineligible status."
msgstr "%(count)s abgelaufene Aufnahme(n) übersprungen."
#: core/admin.py:341
msgid "No scopes"
msgstr "Keine Scopes"
#: core/admin.py:311
#: core/admin.py:343
msgid "Scopes"
msgstr "Scopes"
#: core/api/filters.py:24
#: core/api/filters.py:25
msgid "Creator is me"
msgstr "Ersteller bin ich"
#: core/api/serializers.py:84
#: core/api/serializers.py:88
msgid "You must be administrator or owner of a room to add accesses to it."
msgstr ""
"Sie müssen Administrator oder Eigentümer eines Raums sein, um Zugriffe "
"hinzuzufügen."
#: core/api/serializers.py:443
#: core/api/serializers.py:516
msgid "This file extension is not allowed."
msgstr "Diese Dateiendung ist nicht erlaubt."
#: core/models.py:35
#: core/models.py:37
msgid "Member"
msgstr "Mitglied"
#: core/models.py:36
#: core/models.py:38
msgid "Administrator"
msgstr "Administrator"
#: core/models.py:37
#: core/models.py:39
msgid "Owner"
msgstr "Eigentümer"
#: core/models.py:53
#: core/models.py:55
msgid "Initiated"
msgstr "Gestartet"
#: core/models.py:54
#: core/models.py:56
msgid "Active"
msgstr "Aktiv"
#: core/models.py:55
#: core/models.py:57
msgid "Stopped"
msgstr "Beendet"
#: core/models.py:56
#: core/models.py:58
msgid "Saved"
msgstr "Gespeichert"
#: core/models.py:57
#: core/models.py:59
msgid "Aborted"
msgstr "Abgebrochen"
#: core/models.py:58
#: core/models.py:60
msgid "Failed to Start"
msgstr "Start fehlgeschlagen"
#: core/models.py:59
#: core/models.py:61
msgid "Failed to Stop"
msgstr "Stopp fehlgeschlagen"
#: core/models.py:60
#: core/models.py:62
msgid "Notification succeeded"
msgstr "Benachrichtigung erfolgreich"
#: core/models.py:87
#: core/models.py:89
msgid "SCREEN_RECORDING"
msgstr "BILDSCHIRMAUFZEICHNUNG"
#: core/models.py:88
#: core/models.py:90
msgid "TRANSCRIPT"
msgstr "TRANSKRIPT"
#: core/models.py:94
#: core/models.py:96
msgid "Public Access"
msgstr "Öffentlicher Zugriff"
#: core/models.py:95
#: core/models.py:97
msgid "Trusted Access"
msgstr "Vertrauenswürdiger Zugriff"
#: core/models.py:96
#: core/models.py:98
msgid "Restricted Access"
msgstr "Eingeschränkter Zugriff"
#: core/models.py:108
#: core/models.py:110
msgid "id"
msgstr "ID"
#: core/models.py:109
#: core/models.py:111
msgid "primary key for the record as UUID"
msgstr "Primärschlüssel des Eintrags als UUID"
#: core/models.py:115
#: core/models.py:117
msgid "created on"
msgstr "erstellt am"
#: core/models.py:116
#: core/models.py:118
msgid "date and time at which a record was created"
msgstr "Datum und Uhrzeit der Erstellung eines Eintrags"
#: core/models.py:121
#: core/models.py:123
msgid "updated on"
msgstr "aktualisiert am"
#: core/models.py:122
#: core/models.py:124
msgid "date and time at which a record was last updated"
msgstr "Datum und Uhrzeit der letzten Aktualisierung eines Eintrags"
#: core/models.py:142
#: core/models.py:144
msgid ""
"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/"
"_ characters."
@@ -179,11 +194,11 @@ msgstr ""
"Geben Sie einen gültigen Sub ein. Dieser Wert darf nur Buchstaben, Zahlen "
"und die Zeichen @/./+/-/_ enthalten."
#: core/models.py:148
#: core/models.py:150
msgid "sub"
msgstr "Sub"
#: core/models.py:150
#: core/models.py:152
msgid ""
"Optional for pending users; required upon account activation. 255 characters "
"or fewer. Letters, numbers, and @/./+/-/_ characters only."
@@ -191,55 +206,55 @@ msgstr ""
"Optional für ausstehende Benutzer; erforderlich nach Kontoaktivierung. "
"Maximal 255 Zeichen. Nur Buchstaben, Zahlen und @/./+/-/_ Zeichen erlaubt."
#: core/models.py:159
#: core/models.py:161
msgid "identity email address"
msgstr "Identitäts-E-Mail-Adresse"
#: core/models.py:164
#: core/models.py:166
msgid "admin email address"
msgstr "Administrator-E-Mail-Adresse"
#: core/models.py:166
#: core/models.py:168
msgid "full name"
msgstr "Vollständiger Name"
#: core/models.py:168
#: core/models.py:170
msgid "short name"
msgstr "Kurzname"
#: core/models.py:174
#: core/models.py:176
msgid "language"
msgstr "Sprache"
#: core/models.py:175
#: core/models.py:177
msgid "The language in which the user wants to see the interface."
msgstr "Die Sprache, in der der Benutzer die Oberfläche sehen möchte."
#: core/models.py:181
#: core/models.py:183
msgid "The timezone in which the user wants to see times."
msgstr "Die Zeitzone, in der der Benutzer die Zeiten sehen möchte."
#: core/models.py:184
#: core/models.py:186
msgid "device"
msgstr "Gerät"
#: core/models.py:186
#: core/models.py:188
msgid "Whether the user is a device or a real user."
msgstr "Ob es sich um ein Gerät oder einen echten Benutzer handelt."
#: core/models.py:189
#: core/models.py:191
msgid "staff status"
msgstr "Mitarbeiterstatus"
#: core/models.py:191
#: core/models.py:193
msgid "Whether the user can log into this admin site."
msgstr "Ob der Benutzer sich bei dieser Admin-Seite anmelden kann."
#: core/models.py:194
#: core/models.py:196
msgid "active"
msgstr "aktiv"
#: core/models.py:197
#: core/models.py:199
msgid ""
"Whether this user should be treated as active. Unselect this instead of "
"deleting accounts."
@@ -247,66 +262,66 @@ msgstr ""
"Ob dieser Benutzer als aktiv behandelt werden soll. Deaktivieren Sie dies "
"anstelle des Löschens des Kontos."
#: core/models.py:210
#: core/models.py:212
msgid "user"
msgstr "Benutzer"
#: core/models.py:211
#: core/models.py:213
msgid "users"
msgstr "Benutzer"
#: core/models.py:270
#: core/models.py:272
msgid "Resource"
msgstr "Ressource"
#: core/models.py:271
#: core/models.py:273
msgid "Resources"
msgstr "Ressourcen"
#: core/models.py:329
#: core/models.py:331
msgid "Resource access"
msgstr "Ressourcenzugriff"
#: core/models.py:330
#: core/models.py:332
msgid "Resource accesses"
msgstr "Ressourcenzugriffe"
#: core/models.py:336
#: core/models.py:338
msgid "Resource access with this User and Resource already exists."
msgstr ""
"Ein Ressourcenzugriff mit diesem Benutzer und dieser Ressource existiert "
"bereits."
#: core/models.py:392
#: core/models.py:394
msgid "Visio room configuration"
msgstr "Visio-Raumkonfiguration"
#: core/models.py:393
#: core/models.py:395
msgid "Values for Visio parameters to configure the room."
msgstr "Werte für Visio-Parameter zur Konfiguration des Raums."
#: core/models.py:400
#: core/models.py:402
msgid "Room PIN code"
msgstr "PIN-Code für den Raum"
#: core/models.py:401
#: core/models.py:403
msgid "Unique n-digit code that identifies this room in telephony mode."
msgstr ""
"Eindeutiger n-stelliger Code, der diesen Raum im Telephonmodus identifiziert."
#: core/models.py:407 core/models.py:561
#: core/models.py:409 core/models.py:563
msgid "Room"
msgstr "Raum"
#: core/models.py:408
#: core/models.py:410
msgid "Rooms"
msgstr "Räume"
#: core/models.py:572
#: core/models.py:574
msgid "Worker ID"
msgstr "Worker-ID"
#: core/models.py:574
#: core/models.py:576
msgid ""
"Enter an identifier for the worker recording.This ID is retained even when "
"the worker stops, allowing for easy tracking."
@@ -315,120 +330,120 @@ msgstr ""
"erhalten, auch wenn der Worker stoppt, was ein einfaches Nachverfolgen "
"ermöglicht."
#: core/models.py:582
#: core/models.py:584
msgid "Recording mode"
msgstr "Aufzeichnungsmodus"
#: core/models.py:583
#: core/models.py:585
msgid "Defines the mode of recording being called."
msgstr "Definiert den aufgerufenen Aufzeichnungsmodus."
#: core/models.py:588 core/models.py:589
#: core/models.py:590 core/models.py:591
msgid "Recording options"
msgstr "Aufnahmeoptionen"
#: core/models.py:595
#: core/models.py:597
msgid "Recording"
msgstr "Aufzeichnung"
#: core/models.py:596
#: core/models.py:598
msgid "Recordings"
msgstr "Aufzeichnungen"
#: core/models.py:704
#: core/models.py:706
msgid "Recording/user relation"
msgstr "Beziehung Aufzeichnung/Benutzer"
#: core/models.py:705
#: core/models.py:707
msgid "Recording/user relations"
msgstr "Beziehungen Aufzeichnung/Benutzer"
#: core/models.py:711
#: core/models.py:713
msgid "This user is already in this recording."
msgstr "Dieser Benutzer ist bereits Teil dieser Aufzeichnung."
#: core/models.py:717
#: core/models.py:719
msgid "This team is already in this recording."
msgstr "Dieses Team ist bereits Teil dieser Aufzeichnung."
#: core/models.py:723
#: core/models.py:725
msgid "Either user or team must be set, not both."
msgstr "Entweder Benutzer oder Team muss festgelegt werden, nicht beides."
#: core/models.py:740
#: core/models.py:742
msgid "Create rooms"
msgstr "Räume erstellen"
#: core/models.py:741
#: core/models.py:743
msgid "List rooms"
msgstr "Räume auflisten"
#: core/models.py:742
#: core/models.py:744
msgid "Retrieve room details"
msgstr "Raumdetails abrufen"
#: core/models.py:743
#: core/models.py:745
msgid "Update rooms"
msgstr "Räume aktualisieren"
#: core/models.py:744
#: core/models.py:746
msgid "Delete rooms"
msgstr "Räume löschen"
#: core/models.py:757
#: core/models.py:759
msgid "Application name"
msgstr "Anwendungsname"
#: core/models.py:758
#: core/models.py:760
msgid "Descriptive name for this application."
msgstr "Beschreibender Name für diese Anwendung."
#: core/models.py:768
#: core/models.py:770
msgid "Hashed on Save. Copy it now if this is a new secret."
msgstr ""
"Beim Speichern gehasht. Jetzt kopieren, wenn dies ein neues Geheimnis ist."
#: core/models.py:779
#: core/models.py:781
msgid "Application"
msgstr "Anwendung"
#: core/models.py:780
#: core/models.py:782
msgid "Applications"
msgstr "Anwendungen"
#: core/models.py:803
#: core/models.py:805
msgid "Enter a valid domain"
msgstr "Geben Sie eine gültige Domain ein"
#: core/models.py:806
#: core/models.py:808
msgid "Domain"
msgstr "Domain"
#: core/models.py:807
#: core/models.py:809
msgid "Email domain this application can act on behalf of."
msgstr "E-Mail-Domain, im Namen der diese Anwendung handeln kann."
#: core/models.py:819
#: core/models.py:821
msgid "Application domain"
msgstr "Anwendungsdomain"
#: core/models.py:820
#: core/models.py:822
msgid "Application domains"
msgstr "Anwendungsdomains"
#: core/models.py:838
#: core/models.py:840
msgid "Pending"
msgstr "Ausstehend"
#: core/models.py:846
#: core/models.py:848
msgid "Ready"
msgstr "Bereit"
#: core/models.py:852
#: core/models.py:854
msgid "Background image"
msgstr "Hintergrundbild"
#: core/models.py:864
#: core/models.py:866
msgid "title"
msgstr "Titel"
@@ -445,11 +460,11 @@ msgstr "Datei"
msgid "Files"
msgstr "Dateien"
#: core/models.py:970
#: core/models.py:1000
msgid "This file is already hard deleted."
msgstr "Diese Datei wurde bereits endgültig gelöscht."
#: core/models.py:980
#: core/models.py:1010
#, fuzzy
#| msgid "To hard delete a file, it must first be soft deleted."
msgid "To hard delete a file, it must first be soft deleted."
@@ -585,18 +600,18 @@ msgstr ""
" Wenn Sie Fragen haben oder Unterstützung benötigen, wenden Sie sich bitte "
"an unser Support-Team unter %(support_email)s. "
#: meet/settings.py:224
#: meet/settings.py:215
msgid "English"
msgstr "Englisch"
#: meet/settings.py:225
#: meet/settings.py:216
msgid "French"
msgstr "Französisch"
#: meet/settings.py:226
#: meet/settings.py:217
msgid "Dutch"
msgstr "Niederländisch"
#: meet/settings.py:227
#: meet/settings.py:218
msgid "German"
msgstr "Deutsch"
Binary file not shown.
+111 -96
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-26 17:26+0000\n"
"POT-Creation-Date: 2026-03-11 17:31+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -29,11 +29,11 @@ msgstr "Permissions"
msgid "Important dates"
msgstr "Important dates"
#: core/admin.py:132 core/admin.py:243
#: core/admin.py:132 core/admin.py:275
msgid "No owner"
msgstr "No owner"
#: core/admin.py:135 core/admin.py:246
#: core/admin.py:135 core/admin.py:278
msgid "Multiple owners"
msgstr "Multiple owners"
@@ -61,115 +61,130 @@ msgstr "Successfully sent notifications for %(count)s recording(s)."
msgid "Skipped %(count)s expired recording(s)."
msgstr "Skipped %(count)s expired recording(s)."
#: core/admin.py:309
#: core/admin.py:200
msgid "Mark selected recordings as 'Failed to Stop'"
msgstr "Mark selected recordings as 'Failed to Stop'"
#: core/admin.py:218
#, python-format
msgid "%(count)s recording(s) successfully marked as 'Failed to Stop'."
msgstr "%(count)s recording(s) successfully marked as 'Failed to Stop'."
#: core/admin.py:226
#, fuzzy, python-format
#| msgid "Skipped %(count)s expired recording(s)."
msgid "Skipped %(count)s recording(s) with an ineligible status."
msgstr "Skipped %(count)s expired recording(s)."
#: core/admin.py:341
msgid "No scopes"
msgstr "No scopes"
#: core/admin.py:311
#: core/admin.py:343
msgid "Scopes"
msgstr "Scopes"
#: core/api/filters.py:24
#: core/api/filters.py:25
msgid "Creator is me"
msgstr "Creator is me"
#: core/api/serializers.py:84
#: core/api/serializers.py:88
msgid "You must be administrator or owner of a room to add accesses to it."
msgstr "You must be administrator or owner of a room to add accesses to it."
#: core/api/serializers.py:443
#: core/api/serializers.py:516
msgid "This file extension is not allowed."
msgstr "This file extension is not allowed."
#: core/models.py:35
#: core/models.py:37
msgid "Member"
msgstr "Member"
#: core/models.py:36
#: core/models.py:38
msgid "Administrator"
msgstr "Administrator"
#: core/models.py:37
#: core/models.py:39
msgid "Owner"
msgstr "Owner"
#: core/models.py:53
#: core/models.py:55
msgid "Initiated"
msgstr "Initiated"
#: core/models.py:54
#: core/models.py:56
msgid "Active"
msgstr "Active"
#: core/models.py:55
#: core/models.py:57
msgid "Stopped"
msgstr "Stopped"
#: core/models.py:56
#: core/models.py:58
msgid "Saved"
msgstr "Saved"
#: core/models.py:57
#: core/models.py:59
msgid "Aborted"
msgstr "Aborted"
#: core/models.py:58
#: core/models.py:60
msgid "Failed to Start"
msgstr "Failed to Start"
#: core/models.py:59
#: core/models.py:61
msgid "Failed to Stop"
msgstr "Failed to Stop"
#: core/models.py:60
#: core/models.py:62
msgid "Notification succeeded"
msgstr "Notification succeeded"
#: core/models.py:87
#: core/models.py:89
msgid "SCREEN_RECORDING"
msgstr "SCREEN_RECORDING"
#: core/models.py:88
#: core/models.py:90
msgid "TRANSCRIPT"
msgstr "TRANSCRIPT"
#: core/models.py:94
#: core/models.py:96
msgid "Public Access"
msgstr "Public Access"
#: core/models.py:95
#: core/models.py:97
msgid "Trusted Access"
msgstr "Trusted Access"
#: core/models.py:96
#: core/models.py:98
msgid "Restricted Access"
msgstr "Restricted Access"
#: core/models.py:108
#: core/models.py:110
msgid "id"
msgstr "id"
#: core/models.py:109
#: core/models.py:111
msgid "primary key for the record as UUID"
msgstr "primary key for the record as UUID"
#: core/models.py:115
#: core/models.py:117
msgid "created on"
msgstr "created on"
#: core/models.py:116
#: core/models.py:118
msgid "date and time at which a record was created"
msgstr "date and time at which a record was created"
#: core/models.py:121
#: core/models.py:123
msgid "updated on"
msgstr "updated on"
#: core/models.py:122
#: core/models.py:124
msgid "date and time at which a record was last updated"
msgstr "date and time at which a record was last updated"
#: core/models.py:142
#: core/models.py:144
msgid ""
"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/"
"_ characters."
@@ -177,11 +192,11 @@ msgstr ""
"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/"
"_ characters."
#: core/models.py:148
#: core/models.py:150
msgid "sub"
msgstr "sub"
#: core/models.py:150
#: core/models.py:152
msgid ""
"Optional for pending users; required upon account activation. 255 characters "
"or fewer. Letters, numbers, and @/./+/-/_ characters only."
@@ -189,55 +204,55 @@ msgstr ""
"Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_ "
"characters only."
#: core/models.py:159
#: core/models.py:161
msgid "identity email address"
msgstr "identity email address"
#: core/models.py:164
#: core/models.py:166
msgid "admin email address"
msgstr "admin email address"
#: core/models.py:166
#: core/models.py:168
msgid "full name"
msgstr "full name"
#: core/models.py:168
#: core/models.py:170
msgid "short name"
msgstr "short name"
#: core/models.py:174
#: core/models.py:176
msgid "language"
msgstr "language"
#: core/models.py:175
#: core/models.py:177
msgid "The language in which the user wants to see the interface."
msgstr "The language in which the user wants to see the interface."
#: core/models.py:181
#: core/models.py:183
msgid "The timezone in which the user wants to see times."
msgstr "The timezone in which the user wants to see times."
#: core/models.py:184
#: core/models.py:186
msgid "device"
msgstr "device"
#: core/models.py:186
#: core/models.py:188
msgid "Whether the user is a device or a real user."
msgstr "Whether the user is a device or a real user."
#: core/models.py:189
#: core/models.py:191
msgid "staff status"
msgstr "staff status"
#: core/models.py:191
#: core/models.py:193
msgid "Whether the user can log into this admin site."
msgstr "Whether the user can log into this admin site."
#: core/models.py:194
#: core/models.py:196
msgid "active"
msgstr "active"
#: core/models.py:197
#: core/models.py:199
msgid ""
"Whether this user should be treated as active. Unselect this instead of "
"deleting accounts."
@@ -245,63 +260,63 @@ msgstr ""
"Whether this user should be treated as active. Unselect this instead of "
"deleting accounts."
#: core/models.py:210
#: core/models.py:212
msgid "user"
msgstr "user"
#: core/models.py:211
#: core/models.py:213
msgid "users"
msgstr "users"
#: core/models.py:270
#: core/models.py:272
msgid "Resource"
msgstr "Resource"
#: core/models.py:271
#: core/models.py:273
msgid "Resources"
msgstr "Resources"
#: core/models.py:329
#: core/models.py:331
msgid "Resource access"
msgstr "Resource access"
#: core/models.py:330
#: core/models.py:332
msgid "Resource accesses"
msgstr "Resource accesses"
#: core/models.py:336
#: core/models.py:338
msgid "Resource access with this User and Resource already exists."
msgstr "Resource access with this User and Resource already exists."
#: core/models.py:392
#: core/models.py:394
msgid "Visio room configuration"
msgstr "Visio room configuration"
#: core/models.py:393
#: core/models.py:395
msgid "Values for Visio parameters to configure the room."
msgstr "Values for Visio parameters to configure the room."
#: core/models.py:400
#: core/models.py:402
msgid "Room PIN code"
msgstr "Room PIN code"
#: core/models.py:401
#: core/models.py:403
msgid "Unique n-digit code that identifies this room in telephony mode."
msgstr "Unique n-digit code that identifies this room in telephony mode."
#: core/models.py:407 core/models.py:561
#: core/models.py:409 core/models.py:563
msgid "Room"
msgstr "Room"
#: core/models.py:408
#: core/models.py:410
msgid "Rooms"
msgstr "Rooms"
#: core/models.py:572
#: core/models.py:574
msgid "Worker ID"
msgstr "Worker ID"
#: core/models.py:574
#: core/models.py:576
msgid ""
"Enter an identifier for the worker recording.This ID is retained even when "
"the worker stops, allowing for easy tracking."
@@ -309,125 +324,125 @@ msgstr ""
"Enter an identifier for the worker recording.This ID is retained even when "
"the worker stops, allowing for easy tracking."
#: core/models.py:582
#: core/models.py:584
msgid "Recording mode"
msgstr "Recording mode"
#: core/models.py:583
#: core/models.py:585
msgid "Defines the mode of recording being called."
msgstr "Defines the mode of recording being called."
#: core/models.py:588 core/models.py:589
#: core/models.py:590 core/models.py:591
msgid "Recording options"
msgstr "Recording options"
#: core/models.py:595
#: core/models.py:597
msgid "Recording"
msgstr "Recording"
#: core/models.py:596
#: core/models.py:598
msgid "Recordings"
msgstr "Recordings"
#: core/models.py:704
#: core/models.py:706
msgid "Recording/user relation"
msgstr "Recording/user relation"
#: core/models.py:705
#: core/models.py:707
msgid "Recording/user relations"
msgstr "Recording/user relations"
#: core/models.py:711
#: core/models.py:713
msgid "This user is already in this recording."
msgstr "This user is already in this recording."
#: core/models.py:717
#: core/models.py:719
msgid "This team is already in this recording."
msgstr "This team is already in this recording."
#: core/models.py:723
#: core/models.py:725
msgid "Either user or team must be set, not both."
msgstr "Either user or team must be set, not both."
#: core/models.py:740
#: core/models.py:742
#, fuzzy
#| msgid "created on"
msgid "Create rooms"
msgstr "Create rooms"
#: core/models.py:741
#: core/models.py:743
msgid "List rooms"
msgstr "List rooms"
#: core/models.py:742
#: core/models.py:744
msgid "Retrieve room details"
msgstr "Retrieve room details"
#: core/models.py:743
#: core/models.py:745
#, fuzzy
#| msgid "updated on"
msgid "Update rooms"
msgstr "Update rooms"
#: core/models.py:744
#: core/models.py:746
msgid "Delete rooms"
msgstr "Delete rooms"
#: core/models.py:757
#: core/models.py:759
msgid "Application name"
msgstr "Application name"
#: core/models.py:758
#: core/models.py:760
msgid "Descriptive name for this application."
msgstr "Descriptive name for this application."
#: core/models.py:768
#: core/models.py:770
msgid "Hashed on Save. Copy it now if this is a new secret."
msgstr "Hashed on Save. Copy it now if this is a new secret."
#: core/models.py:779
#: core/models.py:781
msgid "Application"
msgstr "Application"
#: core/models.py:780
#: core/models.py:782
msgid "Applications"
msgstr "Applications"
#: core/models.py:803
#: core/models.py:805
msgid "Enter a valid domain"
msgstr "Enter a valid domain"
#: core/models.py:806
#: core/models.py:808
msgid "Domain"
msgstr "Domain"
#: core/models.py:807
#: core/models.py:809
msgid "Email domain this application can act on behalf of."
msgstr "Email domain this application can act on behalf of."
#: core/models.py:819
#: core/models.py:821
msgid "Application domain"
msgstr "Application domain"
#: core/models.py:820
#: core/models.py:822
msgid "Application domains"
msgstr "Application domains"
#: core/models.py:838
#: core/models.py:840
#, fuzzy
#| msgid "Recording"
msgid "Pending"
msgstr "Pending"
#: core/models.py:846
#: core/models.py:848
msgid "Ready"
msgstr "Ready"
#: core/models.py:852
#: core/models.py:854
msgid "Background image"
msgstr "Background image"
#: core/models.py:864
#: core/models.py:866
msgid "title"
msgstr "title"
@@ -443,13 +458,13 @@ msgstr "File"
msgid "Files"
msgstr "Files"
#: core/models.py:970
#: core/models.py:1000
#, fuzzy
#| msgid "This user is already in this recording."
msgid "This file is already hard deleted."
msgstr "This file is already hard deleted."
#: core/models.py:980
#: core/models.py:1010
msgid "To hard delete a file, it must first be soft deleted."
msgstr "To hard delete a file, it must first be soft deleted."
@@ -581,18 +596,18 @@ msgstr ""
" If you have any questions or need assistance, please contact our support "
"team at %(support_email)s. "
#: meet/settings.py:224
#: meet/settings.py:215
msgid "English"
msgstr "English"
#: meet/settings.py:225
#: meet/settings.py:216
msgid "French"
msgstr "French"
#: meet/settings.py:226
#: meet/settings.py:217
msgid "Dutch"
msgstr "Dutch"
#: meet/settings.py:227
#: meet/settings.py:218
msgid "German"
msgstr "German"
Binary file not shown.
+116 -98
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-26 17:26+0000\n"
"POT-Creation-Date: 2026-03-11 17:31+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: antoine.lebaud@mail.numerique.gouv.fr\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -29,11 +29,11 @@ msgstr "Permissions"
msgid "Important dates"
msgstr "Dates importantes"
#: core/admin.py:132 core/admin.py:243
#: core/admin.py:132 core/admin.py:275
msgid "No owner"
msgstr "Pas de propriétaire"
#: core/admin.py:135 core/admin.py:246
#: core/admin.py:135 core/admin.py:278
msgid "Multiple owners"
msgstr "Plusieurs propriétaires"
@@ -61,119 +61,134 @@ msgstr "Notifications envoyées avec succès pour %(count)s enregistrement(s)."
msgid "Skipped %(count)s expired recording(s)."
msgstr "%(count)s enregistrement(s) expiré(s) ignoré(s)."
#: core/admin.py:309
#: core/admin.py:200
msgid "Mark selected recordings as 'Failed to Stop'"
msgstr "Marquer les enregistrements sélectionnés comme « Échec darrêt »"
#: core/admin.py:218
#, python-format
msgid "%(count)s recording(s) successfully marked as 'Failed to Stop'."
msgstr "%(count)s enregistrement(s) marqué(s) avec succès comme « Échec darrêt »."
#: core/admin.py:226
#, fuzzy, python-format
#| msgid "Skipped %(count)s expired recording(s)."
msgid "Skipped %(count)s recording(s) with an ineligible status."
msgstr "%(count)s enregistrement(s) avec un statut inéligible ignoré(s)."
#: core/admin.py:341
msgid "No scopes"
msgstr "Aucun scopes"
#: core/admin.py:311
#: core/admin.py:343
msgid "Scopes"
msgstr "Scopes"
#: core/api/filters.py:24
#: core/api/filters.py:25
msgid "Creator is me"
msgstr "Je suis le créateur"
#: core/api/serializers.py:84
#: core/api/serializers.py:88
msgid "You must be administrator or owner of a room to add accesses to it."
msgstr ""
"Vous devez être administrateur ou propriétaire d'une salle pour y ajouter "
"des accès."
#: core/api/serializers.py:443
#: core/api/serializers.py:516
msgid "This file extension is not allowed."
msgstr "Cette extension n'est pas autorisée"
#: core/models.py:35
#: core/models.py:37
msgid "Member"
msgstr "Membre"
#: core/models.py:36
#: core/models.py:38
msgid "Administrator"
msgstr "Administrateur"
#: core/models.py:37
#: core/models.py:39
msgid "Owner"
msgstr "Propriétaire"
#: core/models.py:53
#: core/models.py:55
msgid "Initiated"
msgstr "Initié"
#: core/models.py:54
#: core/models.py:56
msgid "Active"
msgstr "Actif"
#: core/models.py:55
#: core/models.py:57
msgid "Stopped"
msgstr "Arrêté"
#: core/models.py:56
#: core/models.py:58
msgid "Saved"
msgstr "Enregistré"
#: core/models.py:57
#: core/models.py:59
msgid "Aborted"
msgstr "Abandonné"
#: core/models.py:58
#: core/models.py:60
msgid "Failed to Start"
msgstr "Échec au démarrage"
#: core/models.py:59
#: core/models.py:61
msgid "Failed to Stop"
msgstr "Échec à l'arrêt"
#: core/models.py:60
#: core/models.py:62
msgid "Notification succeeded"
msgstr "Notification réussie"
#: core/models.py:87
#: core/models.py:89
msgid "SCREEN_RECORDING"
msgstr "ENREGISTREMENT_ÉCRAN"
#: core/models.py:88
#: core/models.py:90
msgid "TRANSCRIPT"
msgstr "TRANSCRIPTION"
#: core/models.py:94
#: core/models.py:96
msgid "Public Access"
msgstr "Accès public"
#: core/models.py:95
#: core/models.py:97
msgid "Trusted Access"
msgstr "Accès de confiance"
#: core/models.py:96
#: core/models.py:98
msgid "Restricted Access"
msgstr "Accès restreint"
#: core/models.py:108
#: core/models.py:110
msgid "id"
msgstr "id"
#: core/models.py:109
#: core/models.py:111
msgid "primary key for the record as UUID"
msgstr "clé primaire pour l'enregistrement sous forme d'UUID"
#: core/models.py:115
#: core/models.py:117
msgid "created on"
msgstr "créé le"
#: core/models.py:116
#: core/models.py:118
msgid "date and time at which a record was created"
msgstr "date et heure auxquelles un enregistrement a été créé"
#: core/models.py:121
#: core/models.py:123
msgid "updated on"
msgstr "mis à jour le"
#: core/models.py:122
#: core/models.py:124
msgid "date and time at which a record was last updated"
msgstr ""
"date et heure auxquelles un enregistrement a été mis à jour pour la dernière "
"fois"
#: core/models.py:142
#: core/models.py:144
msgid ""
"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/"
"_ characters."
@@ -181,11 +196,11 @@ msgstr ""
"Entrez un sub valide. Cette valeur ne peut contenir que des lettres, des "
"chiffres et les caractères @/./+/-/_."
#: core/models.py:148
#: core/models.py:150
msgid "sub"
msgstr "sub"
#: core/models.py:150
#: core/models.py:152
msgid ""
"Optional for pending users; required upon account activation. 255 characters "
"or fewer. Letters, numbers, and @/./+/-/_ characters only."
@@ -193,55 +208,55 @@ msgstr ""
"Optionnel pour les utilisateurs en attente ; requis lors de l'activation du "
"compte. 255 caractères maximum. Lettres, chiffres et @/./+/-/_ uniquement."
#: core/models.py:159
#: core/models.py:161
msgid "identity email address"
msgstr "adresse e-mail d'identité"
#: core/models.py:164
#: core/models.py:166
msgid "admin email address"
msgstr "adresse e-mail d'administrateur"
#: core/models.py:166
#: core/models.py:168
msgid "full name"
msgstr "nom complet"
#: core/models.py:168
#: core/models.py:170
msgid "short name"
msgstr "nom court"
#: core/models.py:174
#: core/models.py:176
msgid "language"
msgstr "langue"
#: core/models.py:175
#: core/models.py:177
msgid "The language in which the user wants to see the interface."
msgstr "La langue dans laquelle l'utilisateur souhaite voir l'interface."
#: core/models.py:181
#: core/models.py:183
msgid "The timezone in which the user wants to see times."
msgstr "Le fuseau horaire dans lequel l'utilisateur souhaite voir les heures."
#: core/models.py:184
#: core/models.py:186
msgid "device"
msgstr "appareil"
#: core/models.py:186
#: core/models.py:188
msgid "Whether the user is a device or a real user."
msgstr "Si l'utilisateur est un appareil ou un utilisateur réel."
#: core/models.py:189
#: core/models.py:191
msgid "staff status"
msgstr "statut du personnel"
#: core/models.py:191
#: core/models.py:193
msgid "Whether the user can log into this admin site."
msgstr "Si l'utilisateur peut se connecter à ce site d'administration."
#: core/models.py:194
#: core/models.py:196
msgid "active"
msgstr "actif"
#: core/models.py:197
#: core/models.py:199
msgid ""
"Whether this user should be treated as active. Unselect this instead of "
"deleting accounts."
@@ -249,65 +264,65 @@ msgstr ""
"Si cet utilisateur doit être traité comme actif. Désélectionnez cette option "
"au lieu de supprimer des comptes."
#: core/models.py:210
#: core/models.py:212
msgid "user"
msgstr "utilisateur"
#: core/models.py:211
#: core/models.py:213
msgid "users"
msgstr "utilisateurs"
#: core/models.py:270
#: core/models.py:272
msgid "Resource"
msgstr "Ressource"
#: core/models.py:271
#: core/models.py:273
msgid "Resources"
msgstr "Ressources"
#: core/models.py:329
#: core/models.py:331
msgid "Resource access"
msgstr "Accès aux ressources"
#: core/models.py:330
#: core/models.py:332
msgid "Resource accesses"
msgstr "Accès aux ressources"
#: core/models.py:336
#: core/models.py:338
msgid "Resource access with this User and Resource already exists."
msgstr ""
"L'accès à la ressource avec cet utilisateur et cette ressource existe déjà."
#: core/models.py:392
#: core/models.py:394
msgid "Visio room configuration"
msgstr "Configuration de la salle de visioconférence"
#: core/models.py:393
#: core/models.py:395
msgid "Values for Visio parameters to configure the room."
msgstr "Valeurs des paramètres de visioconférence pour configurer la salle."
#: core/models.py:400
#: core/models.py:402
msgid "Room PIN code"
msgstr "Code PIN de la salle"
#: core/models.py:401
#: core/models.py:403
msgid "Unique n-digit code that identifies this room in telephony mode."
msgstr ""
"Code unique à n chiffres qui identifie cette salle en mode téléphonique."
#: core/models.py:407 core/models.py:561
#: core/models.py:409 core/models.py:563
msgid "Room"
msgstr "Salle"
#: core/models.py:408
#: core/models.py:410
msgid "Rooms"
msgstr "Salles"
#: core/models.py:572
#: core/models.py:574
msgid "Worker ID"
msgstr "ID du Worker"
#: core/models.py:574
#: core/models.py:576
msgid ""
"Enter an identifier for the worker recording.This ID is retained even when "
"the worker stops, allowing for easy tracking."
@@ -315,127 +330,128 @@ msgstr ""
"Entrez un identifiant pour l'enregistrement du Worker. Cet identifiant est "
"conservé même lorsque le Worker s'arrête, permettant un suivi facile."
#: core/models.py:582
#: core/models.py:584
msgid "Recording mode"
msgstr "Mode d'enregistrement"
#: core/models.py:583
#: core/models.py:585
msgid "Defines the mode of recording being called."
msgstr "Définit le mode d'enregistrement appelé."
#: core/models.py:588 core/models.py:589
#: core/models.py:590 core/models.py:591
msgid "Recording options"
msgstr "Options d'enregistrement"
#: core/models.py:595
#: core/models.py:597
msgid "Recording"
msgstr "Enregistrement"
#: core/models.py:596
#: core/models.py:598
msgid "Recordings"
msgstr "Enregistrements"
#: core/models.py:704
#: core/models.py:706
msgid "Recording/user relation"
msgstr "Relation enregistrement/utilisateur"
#: core/models.py:705
#: core/models.py:707
msgid "Recording/user relations"
msgstr "Relations enregistrement/utilisateur"
#: core/models.py:711
#: core/models.py:713
msgid "This user is already in this recording."
msgstr "Cet utilisateur est déjà dans cet enregistrement."
#: core/models.py:717
#: core/models.py:719
msgid "This team is already in this recording."
msgstr "Cette équipe est déjà dans cet enregistrement."
#: core/models.py:723
#: core/models.py:725
msgid "Either user or team must be set, not both."
msgstr "Soit l'utilisateur, soit l'équipe doit être défini, pas les deux."
#: core/models.py:740
#: core/models.py:742
msgid "Create rooms"
msgstr "Créer des salles"
#: core/models.py:741
#: core/models.py:743
msgid "List rooms"
msgstr "Lister les salles"
#: core/models.py:742
#: core/models.py:744
msgid "Retrieve room details"
msgstr "Afficher les détails dune salle"
#: core/models.py:743
#: core/models.py:745
msgid "Update rooms"
msgstr "Mettre à jour les salles"
#: core/models.py:744
#: core/models.py:746
msgid "Delete rooms"
msgstr "Supprimer les salles"
#: core/models.py:757
#: core/models.py:759
msgid "Application name"
msgstr "Nom de lapplication"
#: core/models.py:758
#: core/models.py:760
msgid "Descriptive name for this application."
msgstr "Nom descriptif de cette application."
#: core/models.py:768
#: core/models.py:770
msgid "Hashed on Save. Copy it now if this is a new secret."
msgstr ""
"Haché lors de lenregistrement. Copiez-le maintenant sil sagit dun "
"nouveau secret."
#: core/models.py:779
#: core/models.py:781
msgid "Application"
msgstr "Application"
#: core/models.py:780
#: core/models.py:782
msgid "Applications"
msgstr "Applications"
#: core/models.py:803
#: core/models.py:805
msgid "Enter a valid domain"
msgstr "Saisissez un domaine valide"
#: core/models.py:806
#: core/models.py:808
msgid "Domain"
msgstr "Domaine"
#: core/models.py:807
#: core/models.py:809
msgid "Email domain this application can act on behalf of."
msgstr "Domaine de messagerie au nom duquel cette application peut agir."
#: core/models.py:819
#: core/models.py:821
msgid "Application domain"
msgstr "Domaine dapplication"
#: core/models.py:820
#: core/models.py:822
msgid "Application domains"
msgstr "Domaines dapplication"
#: core/models.py:838
#: core/models.py:840
msgid "Pending"
msgstr "En attente"
#: core/models.py:846
#: core/models.py:848
msgid "Ready"
msgstr "Prêt"
#: core/models.py:852
#: core/models.py:854
msgid "Background image"
msgstr "Image de fond"
#: core/models.py:864
#: core/models.py:866
msgid "title"
msgstr "Titre"
#: core/models.py:890
msgid "Malware detection info when the analysis status is unsafe."
msgstr "Information concernant la détection de Malware cand le statut n'est pas sain"
msgstr ""
"Information concernant la détection de Malware cand le statut n'est pas sain"
#: core/models.py:895
msgid "File"
@@ -445,15 +461,17 @@ msgstr "Fichier"
msgid "Files"
msgstr "Fichiers"
#: core/models.py:970
#: core/models.py:1000
#, fuzzy
#| msgid "This user is already in this recording."
msgid "This file is already hard deleted."
msgstr "Ce fichier a été supprimé."
#: core/models.py:980
#: core/models.py:1010
msgid "To hard delete a file, it must first be soft deleted."
msgstr "Pour supprimer définitivement un fichier il doit d'abord avoir été marqué comme supprimé (soft delete)"
msgstr ""
"Pour supprimer définitivement un fichier il doit d'abord avoir été marqué "
"comme supprimé (soft delete)"
#: core/recording/event/notification.py:116
msgid "Your recording is ready"
@@ -583,18 +601,18 @@ msgstr ""
" Si vous avez des questions ou besoin d'assistance, veuillez contacter notre "
"équipe d'assistance à %(support_email)s. "
#: meet/settings.py:224
#: meet/settings.py:215
msgid "English"
msgstr "Anglais"
#: meet/settings.py:225
#: meet/settings.py:216
msgid "French"
msgstr "Français"
#: meet/settings.py:226
#: meet/settings.py:217
msgid "Dutch"
msgstr "Néerlandais"
#: meet/settings.py:227
#: meet/settings.py:218
msgid "German"
msgstr "Allemand"
Binary file not shown.
+111 -96
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-26 17:34+0000\n"
"POT-Creation-Date: 2026-03-11 17:31+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -29,11 +29,11 @@ msgstr "Rechten"
msgid "Important dates"
msgstr "Belangrijke datums"
#: core/admin.py:132 core/admin.py:243
#: core/admin.py:132 core/admin.py:275
msgid "No owner"
msgstr "Geen eigenaar"
#: core/admin.py:135 core/admin.py:246
#: core/admin.py:135 core/admin.py:278
msgid "Multiple owners"
msgstr "Meerdere eigenaren"
@@ -61,116 +61,131 @@ msgstr "Meldingen succesvol verzonden voor %(count)s opname(n)."
msgid "Skipped %(count)s expired recording(s)."
msgstr "%(count)s verlopen opname(n) overgeslagen."
#: core/admin.py:309
#: core/admin.py:200
msgid "Mark selected recordings as 'Failed to Stop'"
msgstr "Geselecteerde opnames markeren als 'Mislukt bij stoppen'"
#: core/admin.py:218
#, python-format
msgid "%(count)s recording(s) successfully marked as 'Failed to Stop'."
msgstr "%(count)s opname(s) succesvol gemarkeerd als 'Mislukt bij stoppen'."
#: core/admin.py:226
#, fuzzy, python-format
#| msgid "Skipped %(count)s expired recording(s)."
msgid "Skipped %(count)s recording(s) with an ineligible status."
msgstr "%(count)s opname(s) met een niet-toegestane status overgeslagen."
#: core/admin.py:341
msgid "No scopes"
msgstr "Geen scopes"
#: core/admin.py:311
#: core/admin.py:343
msgid "Scopes"
msgstr "Scopes"
#: core/api/filters.py:24
#: core/api/filters.py:25
msgid "Creator is me"
msgstr "Maker ben ik"
#: core/api/serializers.py:84
#: core/api/serializers.py:88
msgid "You must be administrator or owner of a room to add accesses to it."
msgstr ""
"Je moet beheerder of eigenaar van een ruimte zijn om toegang toe te voegen."
#: core/api/serializers.py:443
#: core/api/serializers.py:516
msgid "This file extension is not allowed."
msgstr "Deze bestandsextensie is niet toegestaan."
#: core/models.py:35
#: core/models.py:37
msgid "Member"
msgstr "Lid"
#: core/models.py:36
#: core/models.py:38
msgid "Administrator"
msgstr "Beheerder"
#: core/models.py:37
#: core/models.py:39
msgid "Owner"
msgstr "Eigenaar"
#: core/models.py:53
#: core/models.py:55
msgid "Initiated"
msgstr "Gestart"
#: core/models.py:54
#: core/models.py:56
msgid "Active"
msgstr "Actief"
#: core/models.py:55
#: core/models.py:57
msgid "Stopped"
msgstr "Gestopt"
#: core/models.py:56
#: core/models.py:58
msgid "Saved"
msgstr "Opgeslagen"
#: core/models.py:57
#: core/models.py:59
msgid "Aborted"
msgstr "Afgebroken"
#: core/models.py:58
#: core/models.py:60
msgid "Failed to Start"
msgstr "Starten mislukt"
#: core/models.py:59
#: core/models.py:61
msgid "Failed to Stop"
msgstr "Stoppen mislukt"
#: core/models.py:60
#: core/models.py:62
msgid "Notification succeeded"
msgstr "Notificatie geslaagd"
#: core/models.py:87
#: core/models.py:89
msgid "SCREEN_RECORDING"
msgstr "SCHERM_OPNAME"
#: core/models.py:88
#: core/models.py:90
msgid "TRANSCRIPT"
msgstr "TRANSCRIPT"
#: core/models.py:94
#: core/models.py:96
msgid "Public Access"
msgstr "Openbare toegang"
#: core/models.py:95
#: core/models.py:97
msgid "Trusted Access"
msgstr "Vertrouwde toegang"
#: core/models.py:96
#: core/models.py:98
msgid "Restricted Access"
msgstr "Beperkte toegang"
#: core/models.py:108
#: core/models.py:110
msgid "id"
msgstr "id"
#: core/models.py:109
#: core/models.py:111
msgid "primary key for the record as UUID"
msgstr "primaire sleutel voor het record als UUID"
#: core/models.py:115
#: core/models.py:117
msgid "created on"
msgstr "aangemaakt op"
#: core/models.py:116
#: core/models.py:118
msgid "date and time at which a record was created"
msgstr "datum en tijd waarop een record werd aangemaakt"
#: core/models.py:121
#: core/models.py:123
msgid "updated on"
msgstr "bijgewerkt op"
#: core/models.py:122
#: core/models.py:124
msgid "date and time at which a record was last updated"
msgstr "datum en tijd waarop een record voor het laatst werd bijgewerkt"
#: core/models.py:142
#: core/models.py:144
msgid ""
"Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/"
"_ characters."
@@ -178,11 +193,11 @@ msgstr ""
"Voer een geldige sub in. Deze waarde mag alleen letters, cijfers en @/./+/-/"
"_ tekens bevatten."
#: core/models.py:148
#: core/models.py:150
msgid "sub"
msgstr "sub"
#: core/models.py:150
#: core/models.py:152
msgid ""
"Optional for pending users; required upon account activation. 255 characters "
"or fewer. Letters, numbers, and @/./+/-/_ characters only."
@@ -190,55 +205,55 @@ msgstr ""
"Optioneel voor gebruikers in afwachting; vereist bij accountactivering. "
"Maximum 255 tekens. Alleen letters, cijfers en @/./+/-/_ toegestaan."
#: core/models.py:159
#: core/models.py:161
msgid "identity email address"
msgstr "identiteit e-mailadres"
#: core/models.py:164
#: core/models.py:166
msgid "admin email address"
msgstr "beheerder e-mailadres"
#: core/models.py:166
#: core/models.py:168
msgid "full name"
msgstr "volledige naam"
#: core/models.py:168
#: core/models.py:170
msgid "short name"
msgstr "korte naam"
#: core/models.py:174
#: core/models.py:176
msgid "language"
msgstr "taal"
#: core/models.py:175
#: core/models.py:177
msgid "The language in which the user wants to see the interface."
msgstr "De taal waarin de gebruiker de interface wil zien."
#: core/models.py:181
#: core/models.py:183
msgid "The timezone in which the user wants to see times."
msgstr "De tijdzone waarin de gebruiker tijden wil zien."
#: core/models.py:184
#: core/models.py:186
msgid "device"
msgstr "apparaat"
#: core/models.py:186
#: core/models.py:188
msgid "Whether the user is a device or a real user."
msgstr "Of de gebruiker een apparaat is of een echte gebruiker."
#: core/models.py:189
#: core/models.py:191
msgid "staff status"
msgstr "personeelsstatus"
#: core/models.py:191
#: core/models.py:193
msgid "Whether the user can log into this admin site."
msgstr "Of de gebruiker kan inloggen op deze beheersite."
#: core/models.py:194
#: core/models.py:196
msgid "active"
msgstr "actief"
#: core/models.py:197
#: core/models.py:199
msgid ""
"Whether this user should be treated as active. Unselect this instead of "
"deleting accounts."
@@ -246,64 +261,64 @@ msgstr ""
"Of deze gebruiker als actief moet worden behandeld. Deselecteer dit in "
"plaats van accounts te verwijderen."
#: core/models.py:210
#: core/models.py:212
msgid "user"
msgstr "gebruiker"
#: core/models.py:211
#: core/models.py:213
msgid "users"
msgstr "gebruikers"
#: core/models.py:270
#: core/models.py:272
msgid "Resource"
msgstr "Bron"
#: core/models.py:271
#: core/models.py:273
msgid "Resources"
msgstr "Bronnen"
#: core/models.py:329
#: core/models.py:331
msgid "Resource access"
msgstr "Brontoegang"
#: core/models.py:330
#: core/models.py:332
msgid "Resource accesses"
msgstr "Brontoegangsrechten"
#: core/models.py:336
#: core/models.py:338
msgid "Resource access with this User and Resource already exists."
msgstr "Brontoegang met deze gebruiker en bron bestaat al."
#: core/models.py:392
#: core/models.py:394
msgid "Visio room configuration"
msgstr "Visio-ruimteconfiguratie"
#: core/models.py:393
#: core/models.py:395
msgid "Values for Visio parameters to configure the room."
msgstr "Waarden voor Visio-parameters om de ruimte te configureren."
#: core/models.py:400
#: core/models.py:402
msgid "Room PIN code"
msgstr "Pincode van de kamer"
#: core/models.py:401
#: core/models.py:403
msgid "Unique n-digit code that identifies this room in telephony mode."
msgstr ""
"Unieke n-cijferige code die deze kamer identificeert in telefonie-modus."
#: core/models.py:407 core/models.py:561
#: core/models.py:409 core/models.py:563
msgid "Room"
msgstr "Ruimte"
#: core/models.py:408
#: core/models.py:410
msgid "Rooms"
msgstr "Ruimtes"
#: core/models.py:572
#: core/models.py:574
msgid "Worker ID"
msgstr "Worker ID"
#: core/models.py:574
#: core/models.py:576
msgid ""
"Enter an identifier for the worker recording.This ID is retained even when "
"the worker stops, allowing for easy tracking."
@@ -311,120 +326,120 @@ msgstr ""
"Voer een identificatie in voor de worker-opname. Deze ID blijft behouden, "
"zelfs wanneer de worker stopt, waardoor eenvoudige tracking mogelijk is."
#: core/models.py:582
#: core/models.py:584
msgid "Recording mode"
msgstr "Opnamemodus"
#: core/models.py:583
#: core/models.py:585
msgid "Defines the mode of recording being called."
msgstr "Definieert de modus van opname die wordt aangeroepen."
#: core/models.py:588 core/models.py:589
#: core/models.py:590 core/models.py:591
msgid "Recording options"
msgstr "Opnameopties"
#: core/models.py:595
#: core/models.py:597
msgid "Recording"
msgstr "Opname"
#: core/models.py:596
#: core/models.py:598
msgid "Recordings"
msgstr "Opnames"
#: core/models.py:704
#: core/models.py:706
msgid "Recording/user relation"
msgstr "Opname/gebruiker-relatie"
#: core/models.py:705
#: core/models.py:707
msgid "Recording/user relations"
msgstr "Opname/gebruiker-relaties"
#: core/models.py:711
#: core/models.py:713
msgid "This user is already in this recording."
msgstr "Deze gebruiker is al in deze opname."
#: core/models.py:717
#: core/models.py:719
msgid "This team is already in this recording."
msgstr "Dit team is al in deze opname."
#: core/models.py:723
#: core/models.py:725
msgid "Either user or team must be set, not both."
msgstr "Ofwel gebruiker of team moet worden ingesteld, niet beide."
#: core/models.py:740
#: core/models.py:742
msgid "Create rooms"
msgstr "Ruimtes aanmaken"
#: core/models.py:741
#: core/models.py:743
msgid "List rooms"
msgstr "Ruimtes weergeven"
#: core/models.py:742
#: core/models.py:744
msgid "Retrieve room details"
msgstr "Details van een ruimte ophalen"
#: core/models.py:743
#: core/models.py:745
msgid "Update rooms"
msgstr "Ruimtes bijwerken"
#: core/models.py:744
#: core/models.py:746
msgid "Delete rooms"
msgstr "Ruimtes verwijderen"
#: core/models.py:757
#: core/models.py:759
msgid "Application name"
msgstr "Naam van de applicatie"
#: core/models.py:758
#: core/models.py:760
msgid "Descriptive name for this application."
msgstr "Beschrijvende naam voor deze applicatie."
#: core/models.py:768
#: core/models.py:770
msgid "Hashed on Save. Copy it now if this is a new secret."
msgstr ""
"Wordt gehasht bij het opslaan. Kopieer het nu als dit een nieuw geheim is."
#: core/models.py:779
#: core/models.py:781
msgid "Application"
msgstr "Applicatie"
#: core/models.py:780
#: core/models.py:782
msgid "Applications"
msgstr "Applicaties"
#: core/models.py:803
#: core/models.py:805
msgid "Enter a valid domain"
msgstr "Voer een geldig domein in"
#: core/models.py:806
#: core/models.py:808
msgid "Domain"
msgstr "Domein"
#: core/models.py:807
#: core/models.py:809
msgid "Email domain this application can act on behalf of."
msgstr "E-maildomein namens welke deze applicatie kan handelen."
#: core/models.py:819
#: core/models.py:821
msgid "Application domain"
msgstr "Applicatiedomein"
#: core/models.py:820
#: core/models.py:822
msgid "Application domains"
msgstr "Applicatiedomeinen"
#: core/models.py:838
#: core/models.py:840
msgid "Pending"
msgstr "In afwachting"
#: core/models.py:846
#: core/models.py:848
msgid "Ready"
msgstr "Klaar"
#: core/models.py:852
#: core/models.py:854
msgid "Background image"
msgstr "Achtergrondafbeelding"
#: core/models.py:864
#: core/models.py:866
msgid "title"
msgstr "Titel"
@@ -440,11 +455,11 @@ msgstr "Bestand"
msgid "Files"
msgstr "Bestanden"
#: core/models.py:970
#: core/models.py:1000
msgid "This file is already hard deleted."
msgstr "Dit bestand is al definitief verwijderd."
#: core/models.py:980
#: core/models.py:1010
#, fuzzy
#| msgid "To hard delete a file, it must first be soft deleted."
msgid "To hard delete a file, it must first be soft deleted."
@@ -580,18 +595,18 @@ msgstr ""
" Als je vragen hebt of hulp nodig hebt, neem dan contact op met ons support "
"team via %(support_email)s. "
#: meet/settings.py:224
#: meet/settings.py:215
msgid "English"
msgstr "Engels"
#: meet/settings.py:225
#: meet/settings.py:216
msgid "French"
msgstr "Frans"
#: meet/settings.py:226
#: meet/settings.py:217
msgid "Dutch"
msgstr "Nederlands"
#: meet/settings.py:227
#: meet/settings.py:218
msgid "German"
msgstr "Duits"
+11 -11
View File
@@ -2,8 +2,8 @@
# Meet package
#
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
requires = ["uv_build>=0.10.9,<0.11.0"]
build-backend = "uv_build"
[project]
name = "meet"
@@ -21,8 +21,7 @@ classifiers = [
]
description = "A simple video and phone conferencing tool, powered by LiveKit"
keywords = ["Django", "Contacts", "Templates", "RBAC"]
license = { file = "LICENSE" }
readme = "README.md"
license = "MIT"
requires-python = ">=3.13"
dependencies = [
"boto3==1.42.49",
@@ -70,7 +69,7 @@ dependencies = [
"Homepage" = "https://github.com/suitenumerique/meet"
"Repository" = "https://github.com/suitenumerique/meet"
[project.optional-dependencies]
[dependency-groups]
dev = [
"django-extensions==4.1",
"drf-spectacular-sidecar==2026.1.1",
@@ -90,12 +89,13 @@ dev = [
"types-requests==2.32.4.20260107",
]
[tool.setuptools]
packages = { find = { where = ["."], exclude = ["tests"] } }
zip-safe = true
[tool.distutils.bdist_wheel]
universal = true
[tool.uv.build-backend]
module-root = ""
source-exclude = [
"**/tests/**",
"**/test_*.py",
"**/tests.py",
]
[tool.ruff]
exclude = [
+2365
View File
File diff suppressed because it is too large Load Diff
@@ -72,7 +72,8 @@ export const RecordingDownload = () => {
if (
data.status !== RecordingStatus.Saved &&
data.status !== RecordingStatus.NotificationSucceed
data.status !== RecordingStatus.NotificationSucceed &&
data.status !== RecordingStatus.FailedToStop
) {
return <ErrorScreen title={t('unsaved.title')} body={t('unsaved.body')} />
}
@@ -71,7 +71,7 @@ backend:
SUMMARY_SERVICE_API_TOKEN: password
RECORDING_DOWNLOAD_BASE_URL: https://meet.127.0.0.1.nip.io/recording
ROOM_TELEPHONY_ENABLED: True
SSL_CERT_FILE: /usr/local/lib/python3.12/site-packages/certifi/cacert.pem
SSL_CERT_FILE: /app/.venv/lib/python3.13/site-packages/certifi/cacert.pem
migrate:
@@ -100,7 +100,7 @@ backend:
# Extra volume mounts to manage our local custom CA and avoid to set ssl_verify: false
extraVolumeMounts:
- name: certs
mountPath: /usr/local/lib/python3.13/site-packages/certifi/cacert.pem
mountPath: /app/.venv/lib/python3.13/site-packages/certifi/cacert.pem
subPath: cacert.pem
# Extra volumes to manage our local custom CA and avoid to set ssl_verify: false
@@ -75,7 +75,7 @@ backend:
ROOM_TELEPHONY_ENABLED: True
ROOM_TELEPHONY_DEFAULT_COUNTRY: 'FR'
ROOM_TELEPHONY_PHONE_NUMBER: '+33901020304'
SSL_CERT_FILE: /usr/local/lib/python3.13/site-packages/certifi/cacert.pem
SSL_CERT_FILE: /app/.venv/lib/python3.13/site-packages/certifi/cacert.pem
ROOM_SUBTITLE_ENABLED: True
EXTERNAL_API_ENABLED: True
APPLICATION_JWT_AUDIENCE: https://meet.127.0.0.1.nip.io/external-api/v1.0/
@@ -113,7 +113,7 @@ backend:
# Extra volume mounts to manage our local custom CA and avoid to set ssl_verify: false
extraVolumeMounts:
- name: certs
mountPath: /usr/local/lib/python3.13/site-packages/certifi/cacert.pem
mountPath: /app/.venv/lib/python3.13/site-packages/certifi/cacert.pem
subPath: cacert.pem
# Extra volumes to manage our local custom CA and avoid to set ssl_verify: false
+2 -2
View File
@@ -94,7 +94,7 @@ backend:
key: BREVO_API_KEY
BREVO_API_CONTACT_LIST_IDS: 8
ROOM_TELEPHONY_ENABLED: True
SSL_CERT_FILE: /usr/local/lib/python3.13/site-packages/certifi/cacert.pem
SSL_CERT_FILE: /app/.venv/lib/python3.13/site-packages/certifi/cacert.pem
migrate:
@@ -123,7 +123,7 @@ backend:
# Extra volume mounts to manage our local custom CA and avoid to set ssl_verify: false
extraVolumeMounts:
- name: certs
mountPath: /usr/local/lib/python3.13/site-packages/certifi/cacert.pem
mountPath: /app/.venv/lib/python3.13/site-packages/certifi/cacert.pem
subPath: cacert.pem
# Extra volumes to manage our local custom CA and avoid to set ssl_verify: false