diff --git a/.circleci/config.yml b/.circleci/config.yml index a96d0e47ec..69bb8f1c02 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,8 +7,8 @@ version: 2.1 jobs: aarch64-test-docker-image: machine: - # https://circleci.com/developer/machine/image/ubuntu-2204 - image: ubuntu-2204:2023.10.1 + # https://circleci.com/developer/machine/image/ubuntu-2404 + image: ubuntu-2404:2025.09.1 resource_class: arm.medium # Add steps to the job # See: https://circleci.com/docs/2.0/configuration-reference/#steps @@ -32,8 +32,8 @@ jobs: aarch64-build-and-push-docker-image: machine: - # https://circleci.com/developer/machine/image/ubuntu-2204 - image: ubuntu-2204:2023.10.1 + # https://circleci.com/developer/machine/image/ubuntu-2404 + image: ubuntu-2404:2025.09.1 resource_class: arm.medium # Add steps to the job # See: https://circleci.com/docs/2.0/configuration-reference/#steps diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 4e38b1cb8f..cf12867b8e 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -7,7 +7,7 @@ permissions: read-all jobs: acceptance: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c2d0e05141..3ee37a4f26 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -13,7 +13,7 @@ permissions: read-all jobs: analyze: name: Analyze - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: read contents: read diff --git a/.github/workflows/coverity_scan.yml b/.github/workflows/coverity_scan.yml index eb783f4d53..9e9fa65200 100644 --- a/.github/workflows/coverity_scan.yml +++ b/.github/workflows/coverity_scan.yml @@ -11,7 +11,7 @@ permissions: read-all jobs: scan: name: "coverity scan" - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Clone repository uses: actions/checkout@v6 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d1ed7af2cf..201df83f5c 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -9,7 +9,7 @@ permissions: read-all jobs: build_and_push: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] diff --git a/.github/workflows/integration_bugtracker.yml b/.github/workflows/integration_bugtracker.yml index 6b7ed5d9c7..83e4de843e 100644 --- a/.github/workflows/integration_bugtracker.yml +++ b/.github/workflows/integration_bugtracker.yml @@ -5,12 +5,16 @@ on: branches: master pull_request: +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + permissions: read-all jobs: integration_test: name: ${{ matrix.tracker }} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 8e104139ab..1c32c5f359 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,11 +5,15 @@ on: branches: master pull_request: +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + permissions: read-all jobs: doc8: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -26,7 +30,7 @@ jobs: make doc8 flake8: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -44,7 +48,7 @@ jobs: # this still contains failures pylint: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -62,28 +66,8 @@ jobs: export LANG=en-us make pylint - pylint_site_packages: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.11] - - steps: - - uses: actions/checkout@v6 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - name: Lint with pylint - run: | - pip install -r requirements/mariadb.txt - pip install -r requirements/postgres.txt - pip install -r requirements/devel.txt - - make pylint_site_packages - similar_strings: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -102,7 +86,7 @@ jobs: make similar_strings isort: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -123,7 +107,7 @@ jobs: isort --check --color --diff --skip kiwi_lint/__init__.py . black: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -136,7 +120,7 @@ jobs: - uses: psf/black@25.12.0 eslint: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 diff --git a/.github/workflows/sanity.yml b/.github/workflows/sanity.yml index 47eaebc3a4..428ca70045 100644 --- a/.github/workflows/sanity.yml +++ b/.github/workflows/sanity.yml @@ -5,11 +5,15 @@ on: branches: master pull_request: +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + permissions: read-all jobs: check-docs-source-in-git: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -27,7 +31,7 @@ jobs: make check-docs-source-in-git test-for-missing-migrations: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -54,7 +58,7 @@ jobs: make test_for_missing_migrations test-migrations-rollback: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 2d8d21d2b0..2de50933e8 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -5,11 +5,15 @@ on: branches: master pull_request: +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + permissions: read-all jobs: checkov: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -26,7 +30,7 @@ jobs: checkov --quiet --directory . bandit: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -42,33 +46,10 @@ jobs: pip install bandit make bandit - # this is expected to fail b/c bandit detects lots of issues - # from 3rd party libraries! - bandit_site_packages: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.11] - - steps: - - uses: actions/checkout@v6 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - name: Check with bandit - run: | - pip install bandit - - pip install -r requirements/mariadb.txt - pip install -r requirements/postgres.txt - - make bandit_site_packages - # this is expected to fail but we need to know what issues are there npm_audit: name: npm audit - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 1d2ceaf572..8cb7a0882d 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -5,12 +5,16 @@ on: branches: master pull_request: +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + permissions: read-all jobs: sqlite: name: sqlite / english - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -79,7 +83,7 @@ jobs: check_for_unapplied_migrations: name: check for unapplied migrations - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -123,7 +127,7 @@ jobs: without_internal_bugtracker: name: without internal bugtracker - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -168,7 +172,7 @@ jobs: mariadb: name: mariadb / slovenian - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -222,7 +226,7 @@ jobs: postgres: name: postgres / french - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] @@ -285,7 +289,7 @@ jobs: path: postgres-container.log docker: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: matrix: python-version: [3.11] diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 913926fc4f..d2e95c4c2b 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -11,7 +11,7 @@ build: apt_packages: - python3-pydot - graphviz - os: "ubuntu-22.04" + os: "ubuntu-24.04" tools: python: "3.11" jobs: diff --git a/Dockerfile.buildroot b/Dockerfile.buildroot index 082d837416..8ba86058f2 100644 --- a/Dockerfile.buildroot +++ b/Dockerfile.buildroot @@ -19,7 +19,7 @@ ENV PATH=/venv/bin:${PATH} \ RUN python3.11 -m venv /venv # because we get some errors from other packages which need newer versions -RUN pip3 install --no-cache-dir --upgrade pip setuptools twine wheel +RUN pip3 install --no-cache-dir --upgrade pip "setuptools<82" twine wheel # build and install the application COPY . /Kiwi/ diff --git a/Makefile b/Makefile index 8c8913d4d2..e33b9b3406 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,5 @@ default: help -PATH_TO_SITE_PACKAGES = $(shell python -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib())') VERSION = $(shell python -m tcms) FLAKE8_EXCLUDE=.git @@ -69,26 +68,11 @@ pylint: similar_strings: PYTHONPATH=.:./tcms/ DJANGO_SETTINGS_MODULE=$(DJANGO_SETTINGS_MODULE) pylint --load-plugins=kiwi_lint -d all -e similar-string tcms/ tcms_settings_dir/ -.PHONY: pylint_site_packages -pylint_site_packages: - if [ -d "$(PATH_TO_SITE_PACKAGES)" ]; then \ - PYTHONPATH=.:./tcms/ DJANGO_SETTINGS_MODULE=tcms.settings.common \ - pylint --load-plugins=kiwi_lint --disable=all --enable=avoid-generic-foreign-key \ - --ignore=setuptools $(PATH_TO_SITE_PACKAGES) ;\ - fi - .PHONY: bandit bandit: bandit -r *.py tcms/ kiwi_lint/ tcms_settings_dir/ -.PHONY: bandit_site_packages -bandit_site_packages: - if [ -d "$(PATH_TO_SITE_PACKAGES)" ]; then \ - bandit -a vuln -r $(PATH_TO_SITE_PACKAGES); \ - fi - - .PHONY: docker-image docker-image: sudo rm -rf dist/ diff --git a/requirements/base.txt b/requirements/base.txt index cb6c59bb78..4e4dd33ae0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -13,9 +13,9 @@ django-grappelli==4.0.3 django-guardian==3.2.0 django-modern-rpc==1.1.0 django-simple-history==3.11.0 -django-tree-queries==0.23.0 +django-tree-queries==0.23.1 jira==3.10.5 -Markdown==3.10.1 +Markdown==3.10.2 # transient dependency of django-color-field/django-simple-captcha pillow==11.3.0 PyGithub==2.8.1 diff --git a/requirements/devel.txt b/requirements/devel.txt index 97fdc58a8c..536f65b2d5 100644 --- a/requirements/devel.txt +++ b/requirements/devel.txt @@ -4,7 +4,7 @@ doc8 isort==6.1.0 colorama black==25.12.0 -locust==2.43.2 +locust==2.43.3 locust-plugins[playwright] parameterized robotframework diff --git a/requirements/mariadb.txt b/requirements/mariadb.txt index a4d0a9b060..29622ab895 100644 --- a/requirements/mariadb.txt +++ b/requirements/mariadb.txt @@ -1,2 +1,2 @@ -r base.txt -mysqlclient==2.2.7 +mysqlclient==2.2.8 diff --git a/requirements/readthedocs.txt b/requirements/readthedocs.txt index 8e2b209753..0b34c62f09 100644 --- a/requirements/readthedocs.txt +++ b/requirements/readthedocs.txt @@ -1,5 +1,6 @@ -r base.txt +setuptools<82 Sphinx==9.0.4 sphinx-removed-in docutils diff --git a/tcms/locale/es_VE/LC_MESSAGES/django.po b/tcms/locale/es_VE/LC_MESSAGES/django.po index b0811306ab..1f2bd52a63 100644 --- a/tcms/locale/es_VE/LC_MESSAGES/django.po +++ b/tcms/locale/es_VE/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: kiwitcms\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-12-17 10:23+0000\n" -"PO-Revision-Date: 2025-12-17 12:44\n" +"PO-Revision-Date: 2026-02-23 20:04\n" "Last-Translator: \n" "Language-Team: Spanish, Venezuela\n" "Language: es_VE\n" @@ -42,7 +42,7 @@ msgstr "Descripción del problema:\n\n\n" #: tcms/bugs/templates/bugs/search.html:22 #: tcms/bugs/templates/bugs/search.html:112 msgid "Severity" -msgstr "" +msgstr "Gravedad" #: tcms/bugs/templates/bugs/get.html:37 tcms/bugs/templates/bugs/search.html:93 #: tcms/issuetracker/kiwitcms.py:49 tcms/templates/include/bug_details.html:3 @@ -58,7 +58,7 @@ msgstr "Cerrado" #: tcms/bugs/templates/bugs/search.html:118 #: tcms/templates/include/bug_details.html:7 msgid "Reporter" -msgstr "Informador" +msgstr "Reporte" #: tcms/bugs/templates/bugs/get.html:64 #: tcms/bugs/templates/bugs/mutable.html:94 @@ -70,7 +70,7 @@ msgstr "Informador" #: tcms/testruns/templates/testruns/get.html:215 #: tcms/testruns/templates/testruns/get.html:275 msgid "Assignee" -msgstr "Asignatario" +msgstr "Analista Asignado" #: tcms/bugs/templates/bugs/get.html:75 #: tcms/bugs/templates/bugs/mutable.html:45 @@ -127,11 +127,11 @@ msgstr "Versión" #: tcms/testruns/templates/testruns/search.html:59 #: tcms/testruns/templates/testruns/search.html:189 msgid "Build" -msgstr "Compilación" +msgstr "Reléase" #: tcms/bugs/templates/bugs/get.html:119 msgid "commented on" -msgstr "comentado en" +msgstr "Comentado por" #: tcms/bugs/templates/bugs/get.html:149 msgid "Reopen" @@ -151,7 +151,7 @@ msgstr "Guardar" #: tcms/bugs/templates/bugs/get.html:153 msgid "Close" -msgstr "Cerrar" +msgstr "Cerrado" #: tcms/bugs/templates/bugs/mutable.html:20 #: tcms/bugs/templates/bugs/search.html:17 @@ -183,20 +183,20 @@ msgstr "" #: tcms/testplans/templates/testplans/mutable.html:34 #: tcms/testruns/templates/testruns/mutable.html:48 msgid "add new Product" -msgstr "agregar un nuevo producto" +msgstr "Agregar nuevo Producto" #: tcms/bugs/templates/bugs/mutable.html:62 #: tcms/testplans/templates/testplans/clone.html:38 #: tcms/testplans/templates/testplans/mutable.html:50 msgid "add new Version" -msgstr "añadir nueva versión" +msgstr "añadir una nueva Versión" #: tcms/bugs/templates/bugs/mutable.html:81 #: tcms/bugs/templates/bugs/mutable.html:82 #: tcms/testruns/templates/testruns/mutable.html:93 #: tcms/testruns/templates/testruns/mutable.html:94 msgid "add new Build" -msgstr "añadir nueva compilación" +msgstr "Añadir nueva Compilación" #: tcms/bugs/templates/bugs/mutable.html:98 #: tcms/testruns/templates/testruns/mutable.html:32 @@ -217,7 +217,7 @@ msgstr "Buscar errores" #: tcms/testplans/templates/testplans/search.html:13 #: tcms/testruns/templates/testruns/search.html:11 msgid "No records found" -msgstr "Ningún registro encontrado" +msgstr "No hay registros" #: tcms/bugs/templates/bugs/search.html:12 #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:12 @@ -354,7 +354,7 @@ msgstr "ID" #: tcms/testplans/templates/testplans/search.html:118 #: tcms/testruns/templates/testruns/mutable.html:231 msgid "Created on" -msgstr "Creado en" +msgstr "Creado" #: tcms/bugs/views.py:42 tcms/testcases/views.py:133 #: tcms/testplans/templates/testplans/get.html:385 tcms/testplans/views.py:143 @@ -366,7 +366,7 @@ msgstr "Editar" #: tcms/testplans/views.py:151 tcms/testruns/views.py:207 #: tcms/testruns/views.py:316 msgid "Object permissions" -msgstr "" +msgstr "Permisos de objeto" #: tcms/bugs/views.py:50 #: tcms/templates/include/comments_for_object_template.html:10 @@ -378,7 +378,7 @@ msgstr "" #: tcms/testruns/templates/testruns/get.html:458 tcms/testruns/views.py:215 #: tcms/testruns/views.py:324 msgid "Delete" -msgstr "Borrar" +msgstr "Eliminar" #: tcms/bugs/views.py:68 tcms/settings/common.py:400 msgid "New Bug" @@ -386,11 +386,11 @@ msgstr "Nuevo error" #: tcms/bugs/views.py:188 msgid "Edit bug" -msgstr "Editar bug" +msgstr "Editar error" #: tcms/bugs/views.py:231 msgid "*bug closed*" -msgstr "* error cerrado*" +msgstr "*error cerrado*" #: tcms/bugs/views.py:235 msgid "*bug reopened*" @@ -432,7 +432,7 @@ msgstr "%(amount)s%% completo" #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:44 #: tcms/testruns/templates/testruns/get.html:78 msgid "Started at" -msgstr "Comenzó el" +msgstr "Comenzado el" #: tcms/core/templates/dashboard.html:32 #, python-format @@ -443,7 +443,7 @@ msgstr "%(total_count)s TestRun(s) o TestCase(s) asignados a usted necesita ser #: tcms/core/templates/dashboard.html:36 tcms/core/templates/dashboard.html:80 msgid "SEE ALL" -msgstr "VER TODOS" +msgstr "MOSTRAR TODO" #: tcms/core/templates/dashboard.html:39 msgid "There are no TestRun(s) assigned to you" @@ -451,7 +451,7 @@ msgstr "No hay pruebas(s) asignadas a usted" #: tcms/core/templates/dashboard.html:46 msgid "Your Test plans" -msgstr "Sus planes de prueba" +msgstr "Tus planes de prueba" #: tcms/core/templates/dashboard.html:52 msgid "TestPlan" @@ -479,7 +479,7 @@ msgstr "Administras %(total_count)s TestPlan(s), %(disabled_count)s están desac #: tcms/core/templates/dashboard.html:83 msgid "There are no TestPlan(s) that belong to you" -msgstr "No hay ningún Plan(s) de prueba que le pertenezca" +msgstr "No hay ningún Plan de Pruebas que le pertenezca" #: tcms/core/views.py:47 #, python-format @@ -508,15 +508,15 @@ msgstr "" #: tcms/kiwi_attachments/validators.py:97 msgid "Uploading executable files is forbidden" -msgstr "" +msgstr "Está prohibido cargar archivos ejecutables" #: tcms/kiwi_auth/admin.py:36 tcms/settings/common.py:443 msgid "Users" -msgstr "" +msgstr "Usuarios" #: tcms/kiwi_auth/admin.py:62 msgid "Deactivate selected accounts" -msgstr "" +msgstr "Desactivar cuentas seleccionadas" #: tcms/kiwi_auth/admin.py:69 #, python-format @@ -527,7 +527,7 @@ msgstr "" #: tcms/kiwi_auth/templates/accounts/reset_user_email.html:5 #: tcms/templates/navbar.html:102 msgid "Reset email address" -msgstr "" +msgstr "Restablecer dirección de correo" #: tcms/kiwi_auth/admin.py:169 msgid "Personal info" @@ -539,7 +539,7 @@ msgstr "Permisos" #: tcms/kiwi_auth/admin.py:208 msgid "This is the last superuser, it cannot be deleted!" -msgstr "" +msgstr "Este es el último superusuario, ¡no se puede eliminar!" #: tcms/kiwi_auth/forms.py:28 msgid "A user with that email already exists." @@ -547,15 +547,15 @@ msgstr "Ya existe un usuario con este correo electrónico." #: tcms/kiwi_auth/forms.py:48 msgid "Please confirm your Kiwi TCMS account email address" -msgstr "" +msgstr "Por favor, confirma tu dirección de correo electrónico de Kiwi TCMS" #: tcms/kiwi_auth/forms.py:142 msgid "Email mismatch" -msgstr "" +msgstr "Email no coincide" #: tcms/kiwi_auth/templates/accounts/reset_user_email.html:14 msgid "Warning" -msgstr "" +msgstr "Advertencia" #: tcms/kiwi_auth/templates/accounts/reset_user_email.html:19 msgid "After clicking the 'Save' button your account will become inactive\n" @@ -583,11 +583,11 @@ msgstr "Confirmar" #: tcms/kiwi_auth/templates/accounts/reset_user_email.html:71 msgid "Please type! Do not copy-and-paste value from previous field!" -msgstr "" +msgstr "¡Escribe! ¡No copie y pegue el valor del campo anterior!" #: tcms/kiwi_auth/views.py:70 msgid "Your account has been created, please check your mailbox for confirmation" -msgstr "Su cuenta ha sido creada, por favor, compruebe su buzón para confirmación" +msgstr "Su cuenta ha sido creada, por favor revise su buzón de correo para obtener confirmación" #: tcms/kiwi_auth/views.py:75 msgid "Your account has been created, but you need an administrator to activate it" @@ -595,7 +595,7 @@ msgstr "Tu cuenta ha sido creada, pero necesitas un administrador para activarla #: tcms/kiwi_auth/views.py:80 msgid "Following is the administrator list" -msgstr "Siguiente es la lista de administradores" +msgstr "Lo siguiente es la lista de administradores" #: tcms/kiwi_auth/views.py:123 msgid "This activation key no longer exists in the database" @@ -607,7 +607,7 @@ msgstr "Esta clave de activación ha expirado" #: tcms/kiwi_auth/views.py:141 msgid "Your account has been activated successfully" -msgstr "Su cuenta ha sido activada con éxito" +msgstr "Su cuenta ha sido activada correctamente" #: tcms/kiwi_auth/views.py:168 tcms/kiwi_auth/views.py:177 #: tcms/kiwi_auth/views.py:196 tcms/kiwi_auth/views.py:205 @@ -617,7 +617,7 @@ msgstr "" #: tcms/kiwi_auth/views.py:256 msgid "Email address has been reset, please check inbox for further instructions" -msgstr "" +msgstr "La dirección de correo electrónico ha sido restablecida, por favor verifique la bandeja de entrada para más instrucciones" #: tcms/management/models.py:20 msgid "Classification" @@ -625,11 +625,11 @@ msgstr "" #: tcms/management/models.py:21 msgid "Classifications" -msgstr "" +msgstr "Clasificaciones" #: tcms/management/models.py:57 msgid "Products" -msgstr "" +msgstr "Productos" #: tcms/management/models.py:77 #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:32 @@ -671,11 +671,11 @@ msgstr "Componentes" #: tcms/management/models.py:126 msgid "Versions" -msgstr "" +msgstr "Versiones" #: tcms/management/models.py:172 msgid "Builds" -msgstr "" +msgstr "Compilaciones" #: tcms/management/models.py:194 #: tcms/testcases/templates/testcases/search.html:140 @@ -697,7 +697,7 @@ msgstr "Etiquetas" #: tcms/rpc/api/bug.py:69 msgid "Enable reporting to this Issue Tracker by configuring its base_url!" -msgstr "¡Habilita la notificación a este gestor de problemas configurando su base_url!" +msgstr "¡Habilitar reportar a este rastreador de incidencias configurando su base_url!" #: tcms/rpc/api/forms/__init__.py:9 msgid "Invalid date format. Expected YYYY-MM-DD [HH:MM:SS]." @@ -709,7 +709,7 @@ msgstr "TESTING" #: tcms/settings/common.py:393 tcms/testruns/templates/testruns/mutable.html:70 msgid "New Test Plan" -msgstr "Nuevo plan de prueba" +msgstr "Nuevo Plan de Prueba" #: tcms/settings/common.py:395 #: tcms/testcases/templates/testcases/mutable.html:12 @@ -721,7 +721,7 @@ msgstr "Nuevo Caso de Prueba" #: tcms/testruns/templates/testruns/get.html:180 #: tcms/testruns/templates/testruns/mutable.html:11 msgid "New Test Run" -msgstr "" +msgstr "Nueva Ejecución de Caso de Pruebas" #: tcms/settings/common.py:407 msgid "SEARCH" @@ -729,7 +729,7 @@ msgstr "BUSCAR" #: tcms/settings/common.py:409 tcms/testplans/templates/testplans/search.html:5 msgid "Search Test Plans" -msgstr "Buscar planes de prueba" +msgstr "Buscar Planes de Prueba" #: tcms/settings/common.py:410 tcms/testcases/templates/testcases/search.html:5 msgid "Search Test Cases" @@ -741,7 +741,7 @@ msgstr "Buscar ejecuciones de Casos de Prueba" #: tcms/settings/common.py:412 msgid "Search Test Executions" -msgstr "" +msgstr "Buscar Ejecuciones de prueba" #: tcms/settings/common.py:421 msgid "TELEMETRY" @@ -757,16 +757,16 @@ msgstr "Desglose" #: tcms/settings/common.py:428 msgid "Execution" -msgstr "" +msgstr "Ejecuciones" #: tcms/settings/common.py:431 #: tcms/testruns/templates/testruns/mutable.html:177 msgid "Matrix" -msgstr "" +msgstr "Matriz" #: tcms/settings/common.py:432 msgid "Trends" -msgstr "" +msgstr "Tendencias" #: tcms/settings/common.py:435 #: tcms/telemetry/templates/telemetry/testing/test-case-health.html:5 @@ -775,11 +775,11 @@ msgstr "Salud del Caso de Prueba" #: tcms/settings/common.py:441 msgid "ADMIN" -msgstr "ADMINISTRACIÓN" +msgstr "ADMIN" #: tcms/settings/common.py:444 msgid "Groups" -msgstr "" +msgstr "Grupos" #: tcms/settings/common.py:446 msgid "Everything else" @@ -787,7 +787,7 @@ msgstr "Todo lo demás" #: tcms/settings/common.py:449 msgid "MORE" -msgstr "" +msgstr "MAS" #: tcms/settings/common.py:459 msgid "Report an Issue" @@ -807,7 +807,7 @@ msgstr "Guía de Administración" #: tcms/settings/common.py:469 msgid "User Guide" -msgstr "Guía de usuario" +msgstr "Guía del Usuario" #: tcms/settings/common.py:470 msgid "API Help" @@ -850,13 +850,13 @@ msgstr "TOTAL" #: tcms/testruns/templates/testruns/mutable.html:67 #: tcms/testruns/templates/testruns/search.html:186 msgid "Test plan" -msgstr "Plan de pruebas" +msgstr "Plan de Pruebas" #: tcms/telemetry/templates/telemetry/include/filters.html:66 #: tcms/telemetry/templates/telemetry/testing/status-matrix.html:32 #: tcms/testcases/templates/testcases/search.html:146 msgid "Test run" -msgstr "Prueba de ejecución" +msgstr "Ejecución de Prueba" #: tcms/telemetry/templates/telemetry/include/filters.html:70 #: tcms/testruns/templates/testruns/search.html:21 @@ -898,7 +898,7 @@ msgstr "Categorías" #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:5 msgid "Execution Dashboard" -msgstr "" +msgstr "Panel de ejecución" #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:19 #: tcms/telemetry/templates/telemetry/testing/status-matrix.html:15 @@ -945,11 +945,11 @@ msgstr "Tester por defecto" #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:39 msgid "TC" -msgstr "" +msgstr "TC" #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:40 msgid "TR" -msgstr "" +msgstr "TR" #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:43 #: tcms/testruns/templates/testruns/get.html:276 @@ -966,7 +966,7 @@ msgstr "Terminado el" #: tcms/telemetry/templates/telemetry/testing/execution-trends.html:5 msgid "Execution Trends" -msgstr "" +msgstr "Tendencias de ejecución" #: tcms/telemetry/templates/telemetry/testing/execution-trends.html:21 msgid "Positive" @@ -982,23 +982,23 @@ msgstr "Negativo" #: tcms/telemetry/templates/telemetry/testing/status-matrix.html:5 msgid "Execution Matrix" -msgstr "" +msgstr "Matriz de ejecución" #: tcms/telemetry/templates/telemetry/testing/status-matrix.html:21 msgid "Order" -msgstr "" +msgstr "Pedido" #: tcms/telemetry/templates/telemetry/testing/status-matrix.html:24 msgid "Ascending" -msgstr "" +msgstr "Ascendente" #: tcms/telemetry/templates/telemetry/testing/status-matrix.html:24 msgid "Descending" -msgstr "" +msgstr "Descendente" #: tcms/telemetry/templates/telemetry/testing/status-matrix.html:32 msgid "Test case" -msgstr "Caso de prueba" +msgstr "Caso de Prueba" #: tcms/telemetry/templates/telemetry/testing/test-case-health.html:12 msgid "Most frequently failing test cases" @@ -1027,11 +1027,11 @@ msgstr "Error interno del servidor" #: tcms/templates/admin/auth/user/submit_line.html:7 msgid "Deactivate" -msgstr "" +msgstr "Desactivar" #: tcms/templates/attachments/add.html:3 msgid "Attachment upload error" -msgstr "" +msgstr "Error al subir el archivo adjunto" #: tcms/templates/attachments/delete_link.html:3 msgid "Are you sure you want to delete this attachment?" @@ -1155,7 +1155,7 @@ msgstr "Archivo" #: tcms/templates/include/attachments.html:19 msgid "Owner" -msgstr "Propietario/a" +msgstr "Propietario" #: tcms/templates/include/attachments.html:20 msgid "Date" @@ -1169,7 +1169,7 @@ msgstr "URL (dirección web)" #: tcms/templates/include/properties_card.html:9 tcms/testruns/admin.py:117 #: tcms/testruns/templates/testruns/get.html:353 msgid "Parameters" -msgstr "" +msgstr "Parámetros" #: tcms/templates/include/properties_card.html:15 #: tcms/testruns/templates/testruns/mutable.html:170 @@ -1204,19 +1204,19 @@ msgstr "Nombre" #: tcms/templates/initdb.html:5 tcms/templates/initdb.html:17 #: tcms/templates/initdb.html:29 msgid "Initialize database" -msgstr "" +msgstr "Inicializar base de datos" #: tcms/templates/initdb.html:20 msgid "Your database has not been initialized yet. Click the button below to initialize it!" -msgstr "" +msgstr "Tu base de datos aún no ha sido inicializada. ¡Haz clic en el botón de abajo para inicializarla!" #: tcms/templates/initdb.html:22 msgid "WARNING: this operation will take a while! This page will redirect when done." -msgstr "" +msgstr "ADVERTENCIA: ¡Esta operación tomará un tiempo! Esta página redirigirá cuando termine." #: tcms/templates/initdb.html:27 msgid "Please wait" -msgstr "" +msgstr "Por favor espere" #: tcms/templates/navbar.html:9 msgid "Toggle navigation" @@ -1224,7 +1224,7 @@ msgstr "Cambiar el modo de navegación" #: tcms/templates/navbar.html:15 msgid "DASHBOARD" -msgstr "DASHBOARD" +msgstr "PANEL" #: tcms/templates/navbar.html:41 msgid "Language" @@ -1232,7 +1232,7 @@ msgstr "Idioma" #: tcms/templates/navbar.html:45 msgid "Change language" -msgstr "" +msgstr "Cambiar idioma" #: tcms/templates/navbar.html:46 msgid "Supported languages" @@ -1277,7 +1277,7 @@ msgstr "Cambiar Contraseña" #: tcms/templates/navbar.html:108 msgid "Logout" -msgstr "Cerrar sesión" +msgstr "Cerrar Sesión" #: tcms/templates/navbar.html:113 tcms/templates/registration/login.html:4 msgid "Login" @@ -1296,7 +1296,7 @@ msgstr "Contraseña" #: tcms/templates/registration/login.html:32 msgid "Forgot password" -msgstr "" +msgstr "Olvidó la contraseña" #: tcms/templates/registration/login.html:35 msgid "Log in" @@ -1316,7 +1316,7 @@ msgstr "o" #: tcms/templates/registration/login.html:55 msgid "register an account" -msgstr "registrar una cuenta" +msgstr "Registrar una cuenta" #: tcms/templates/registration/login.html:56 msgid "if you don't have one!" @@ -1340,7 +1340,7 @@ msgstr "solicitar un nuevo restablecimiento de contraseña" #: tcms/templates/registration/password_reset_done.html:11 msgid "Password reset email was sent" -msgstr "Se envió el email de restablecimiento de contraseña" +msgstr "Se envió el correo electrónico de restablecimiento de contraseña" #: tcms/templates/registration/password_reset_form.html:27 msgid "Password reset" @@ -1366,7 +1366,7 @@ msgstr "" #: tcms/testcases/admin.py:131 msgid "Bug URL" -msgstr "" +msgstr "URL de error" #: tcms/testcases/admin.py:151 msgid "External Issue Tracker Integration" @@ -1380,7 +1380,7 @@ msgstr "" #: tcms/testcases/admin.py:168 msgid "Configuration health check" -msgstr "" +msgstr "Control de estado de configuración" #: tcms/testcases/admin.py:172 msgid "Kiwi TCMS will try fetching details for the given bug URL using the integration defined above! Click the `Save and continue` button and watch out for messages at the top of the screen. WARNING: in case of failures some issue trackers will fall back to fetching details via the OpenGraph protocol. In that case the result will include field named `from_open_graph`." @@ -1388,11 +1388,11 @@ msgstr "" #: tcms/testcases/admin.py:192 msgid "Failed creating Issue Tracker" -msgstr "" +msgstr "Error al crear el rastreador de incidencias" #: tcms/testcases/admin.py:201 msgid "Details extracted via OpenGraph. Issue Tracker may still be configured incorrectly!" -msgstr "" +msgstr "Detalles extraídos a través de OpenGraph. ¡El rastreador de incidencias todavía puede ser configurado incorrectamente!" #: tcms/testcases/admin.py:210 msgid "Details extracted via API. Issue Tracker configuration looks good!" @@ -1400,7 +1400,7 @@ msgstr "" #: tcms/testcases/admin.py:223 msgid "Issue Tracker configuration check failed" -msgstr "" +msgstr "Falló la comprobación de configuración del rastreador de problemas" #: tcms/testcases/helpers/email.py:14 #, python-format @@ -1427,24 +1427,24 @@ msgstr "BORRADO: Caso de prueba #%(pk)d - %(summary)s" #: tcms/testcases/models.py:23 msgid "Test case status" -msgstr "" +msgstr "Estado del caso de prueba" #: tcms/testcases/models.py:24 msgid "Test case statuses" -msgstr "" +msgstr "Estados de caso de prueba" #: tcms/testcases/models.py:379 #: tcms/testcases/templates/testcases/mutable.html:107 msgid "Template" -msgstr "" +msgstr "Plantilla" #: tcms/testcases/models.py:380 msgid "Templates" -msgstr "" +msgstr "Plantillas" #: tcms/testcases/templates/testcases/clone.html:5 msgid "Clone TestCase" -msgstr "Clonar TestCase" +msgstr "Clonar Caso de Pruebas" #: tcms/testcases/templates/testcases/clone.html:15 msgid "Add new TC into TP" @@ -1494,16 +1494,16 @@ msgstr "Categoría" #: tcms/testcases/templates/testcases/get.html:73 #: tcms/testcases/templates/testcases/mutable.html:120 msgid "Setup duration" -msgstr "Duración de instalación" +msgstr "Duración de configuración" #: tcms/testcases/templates/testcases/get.html:78 #: tcms/testcases/templates/testcases/mutable.html:127 msgid "Testing duration" -msgstr "Duración de prueba" +msgstr "Duración de la prueba" #: tcms/testcases/templates/testcases/get.html:83 msgid "Expected duration" -msgstr "Duración prevista" +msgstr "Duración esperada" #: tcms/testcases/templates/testcases/get.html:98 #: tcms/testcases/templates/testcases/mutable.html:143 @@ -1542,19 +1542,19 @@ msgstr "Errores" #: tcms/testcases/templates/testcases/get.html:159 msgid "Test plans" -msgstr "Planes de prueba" +msgstr "Plan de Pruebas" #: tcms/testcases/templates/testcases/mutable.html:10 msgid "Edit TestCase" -msgstr "Editar TestCase" +msgstr "Editar Caso de Pruebas" #: tcms/testcases/templates/testcases/mutable.html:59 msgid "add new Category" -msgstr "añadir nueva categoría" +msgstr "añadir nueva Categoría" #: tcms/testcases/templates/testcases/mutable.html:108 msgid "add new Template" -msgstr "" +msgstr "Añadir nueva plantilla" #: tcms/testcases/templates/testcases/mutable.html:180 #: tcms/testruns/templates/testruns/get.html:525 @@ -1584,7 +1584,7 @@ msgstr "El Caso de Prueba está actualizado" #: tcms/testcases/templates/testcases/mutable.html:236 msgid "TestCase is deleted" -msgstr "TestCase ha sido eliminado" +msgstr "El Caso de Prueba está eliminado" #: tcms/testcases/templates/testcases/mutable.html:245 msgid "CC to" @@ -1592,7 +1592,7 @@ msgstr "CC a" #: tcms/testcases/templates/testcases/mutable.html:250 msgid "Email addresses separated by comma. A notification email will be sent to each Email address within CC list." -msgstr "Direcciones de correo electrónico separadas por coma. Se enviará un correo de notificación a cada dirección de correo electrónico dentro de la lista CC." +msgstr "Direcciones de correo separadas por comas. Se enviará un correo electrónico de notificación a cada dirección de correo dentro de la lista CC." #: tcms/testcases/templates/testcases/mutable.html:264 #: tcms/testruns/templates/testruns/get.html:600 @@ -1602,7 +1602,7 @@ msgstr "Cancelar" #: tcms/testcases/templates/testcases/search.html:19 msgid "Test case summary" -msgstr "Resumen de caso de prueba" +msgstr "Resumen del Caso de Prueba" #: tcms/testcases/templates/testcases/search.html:49 msgid "Both" @@ -1610,11 +1610,11 @@ msgstr "Ambos" #: tcms/testcases/templates/testcases/search.html:65 msgid "include in search request" -msgstr "" +msgstr "Incluir en la solicitud de búsqueda" #: tcms/testcases/templates/testcases/search.html:78 msgid "include child test plans" -msgstr "" +msgstr "Incluir planes de pruebas hijas" #: tcms/testcases/templates/testcases/search.html:132 msgid "Text" @@ -1628,7 +1628,7 @@ msgstr "Separar varios valores con coma (,)" #: tcms/testcases/templates/testcases/search.html:182 msgid "Select" -msgstr "" +msgstr "Seleccionar" #: tcms/testcases/views.py:141 tcms/testplans/views.py:146 #: tcms/testruns/templates/testruns/get.html:466 tcms/testruns/views.py:202 @@ -1637,7 +1637,7 @@ msgstr "Historial" #: tcms/testcases/views.py:253 msgid "TestCase cloning was successful" -msgstr "La clonación de prueba fue exitosa" +msgstr "La clonación del caso de prueba fue exitosa" #: tcms/testcases/views.py:284 msgid "At least one TestCase is required" @@ -1666,25 +1666,25 @@ msgstr "Establecer el TP fuente como padre del nuevo TP" #: tcms/testplans/templates/testplans/get.html:25 #: tcms/testruns/templates/testruns/get.html:23 msgid "Enter username, email or user ID:" -msgstr "" +msgstr "Introduzca nombre de usuario, email o ID de usuario:" #: tcms/testplans/templates/testplans/get.html:26 #: tcms/testruns/templates/testruns/get.html:22 msgid "No rows selected! Please select at least one!" -msgstr "" +msgstr "No hay filas seleccionadas! Por favor seleccione al menos una!" #: tcms/testplans/templates/testplans/get.html:27 #: tcms/testruns/templates/testruns/get.html:24 msgid "Are you sure?" -msgstr "¿Estás seguro/a?" +msgstr "¿Estás seguro?" #: tcms/testplans/templates/testplans/get.html:28 msgid "Cannot create TestRun with unconfirmed test cases" -msgstr "" +msgstr "No se puede crear TestRun con casos de prueba no confirmados" #: tcms/testplans/templates/testplans/get.html:29 msgid "Error adding test cases" -msgstr "" +msgstr "Error al añadir casos de prueba" #: tcms/testplans/templates/testplans/get.html:43 msgid "Show more" @@ -1696,7 +1696,7 @@ msgstr "Tipo de plan" #: tcms/testplans/templates/testplans/get.html:100 msgid "Test cases" -msgstr "Casos de prueba" +msgstr "Casos de Prueba" #: tcms/testplans/templates/testplans/get.html:182 #: tcms/testplans/templates/testplans/get.html:426 @@ -1722,12 +1722,12 @@ msgstr "Buscar y añadir casos de prueba" #: tcms/testplans/templates/testplans/get.html:263 #: tcms/testruns/templates/testruns/get.html:306 msgid "Advanced search" -msgstr "Busqueda avanzada" +msgstr "Búsqueda avanzada" #: tcms/testplans/templates/testplans/get.html:271 #: tcms/testruns/templates/testruns/get.html:314 msgid "records" -msgstr "" +msgstr "registros" #: tcms/testplans/templates/testplans/get.html:291 msgid "Active test runs" @@ -1739,7 +1739,7 @@ msgstr "Más" #: tcms/testplans/templates/testplans/get.html:315 msgid "Inactive" -msgstr "Inactivas" +msgstr "Inactivo" #: tcms/testplans/templates/testplans/get.html:449 #: tcms/testruns/templates/testruns/get.html:502 @@ -1765,7 +1765,7 @@ msgstr "ID padre" #: tcms/testplans/templates/testplans/mutable.html:100 msgid "Enter to assign; Backspace + Enter to clear" -msgstr "" +msgstr "Introducir para asignar; Backspace + Enter para limpiar" #: tcms/testplans/templates/testplans/mutable.html:110 msgid "Test plan document:" @@ -1777,7 +1777,7 @@ msgstr "Notificar:" #: tcms/testplans/templates/testplans/mutable.html:127 msgid "TestCase author" -msgstr "Autor de TestCase" +msgstr "Autor del Caso de Prueba" #: tcms/testplans/templates/testplans/mutable.html:141 msgid "Notify when:" @@ -1798,11 +1798,11 @@ msgstr "Activo" #: tcms/testplans/templates/testplans/search.html:12 msgid "Some child test plans do not match search criteria" -msgstr "" +msgstr "Algunos planes de prueba hijo no coinciden con los criterios de búsqueda" #: tcms/testplans/templates/testplans/search.html:22 msgid "Test plan name" -msgstr "Nombre del plan de prueba" +msgstr "Nombre del Plan de Prueba" #: tcms/testruns/admin.py:32 msgid "Permission denied: TestRun does not belong to you" @@ -1818,31 +1818,31 @@ msgstr "¡Para más información sobre la personalización de los estados de eje #: tcms/testruns/admin.py:95 msgid "1 negative, 1 neutral & 1 positive status required!" -msgstr "" +msgstr "1 negativo, 1 neutral y 1 positivo requerido!" #: tcms/testruns/admin.py:106 msgid "Edit parameters" -msgstr "" +msgstr "Editar parámetros" #: tcms/testruns/forms.py:39 msgid "Full" -msgstr "" +msgstr "Lleno" #: tcms/testruns/forms.py:40 msgid "Pairwise" -msgstr "" +msgstr "Pareados" #: tcms/testruns/models.py:230 msgid "Test execution statuses" -msgstr "Probar estados de ejecución" +msgstr "Probar Estados de Ejecución" #: tcms/testruns/templates/testruns/get.html:25 msgid "Unconfirmed test cases were not added" -msgstr "" +msgstr "No se han añadido casos de prueba no confirmados" #: tcms/testruns/templates/testruns/get.html:26 msgid "Type 0 or 1" -msgstr "" +msgstr "Tipo 0 o 1" #: tcms/testruns/templates/testruns/get.html:27 msgid "Comment" @@ -1859,26 +1859,26 @@ msgstr "Administrador" #: tcms/testruns/templates/testruns/mutable.html:110 #: tcms/testruns/templates/testruns/search.html:131 msgid "Planned start" -msgstr "" +msgstr "Inicio planeado" #: tcms/testruns/templates/testruns/get.html:84 msgid "Start" -msgstr "" +msgstr "Comenzar" #: tcms/testruns/templates/testruns/get.html:91 #: tcms/testruns/templates/testruns/mutable.html:123 #: tcms/testruns/templates/testruns/search.html:151 msgid "Planned stop" -msgstr "" +msgstr "Parada planificada" #: tcms/testruns/templates/testruns/get.html:102 msgid "Stop" -msgstr "" +msgstr "Parar" #: tcms/testruns/templates/testruns/get.html:139 #: tcms/testruns/templates/testruns/mutable.html:160 msgid "Environment" -msgstr "" +msgstr "Entorno" #: tcms/testruns/templates/testruns/get.html:171 msgid "View all in Execution Dashboard" @@ -1886,25 +1886,25 @@ msgstr "" #: tcms/testruns/templates/testruns/get.html:190 msgid "Update text version" -msgstr "" +msgstr "Actualizar versión de texto" #: tcms/testruns/templates/testruns/get.html:225 msgid "Add comment" -msgstr "" +msgstr "Añadir comentario" #: tcms/testruns/templates/testruns/get.html:236 #: tcms/testruns/templates/testruns/get.html:339 #: tcms/testruns/templates/testruns/get.html:576 msgid "Add hyperlink" -msgstr "" +msgstr "Añadir hiperenlace" #: tcms/testruns/templates/testruns/get.html:287 msgid "Mine" -msgstr "" +msgstr "Mina" #: tcms/testruns/templates/testruns/get.html:288 msgid "All" -msgstr "" +msgstr "Todos" #: tcms/testruns/templates/testruns/get.html:340 #: tcms/testruns/templates/testruns/get.html:615 @@ -1914,32 +1914,32 @@ msgstr "Reportar error" #: tcms/testruns/templates/testruns/get.html:347 msgid "Test case is not part of parent test plan" -msgstr "" +msgstr "El caso de prueba no es parte del plan de prueba padre" #: tcms/testruns/templates/testruns/get.html:379 msgid "Assigned to" -msgstr "" +msgstr "Asignado a" #: tcms/testruns/templates/testruns/get.html:387 #: tcms/testruns/templates/testruns/get.html:389 msgid "Last bug" -msgstr "" +msgstr "Último error" #: tcms/testruns/templates/testruns/get.html:431 msgid "Text version" -msgstr "" +msgstr "Versión de texto" #: tcms/testruns/templates/testruns/get.html:439 msgid "Bugs and hyperlinks" -msgstr "Bugs e hipervínculos" +msgstr "Errores e hipervínculos" #: tcms/testruns/templates/testruns/get.html:593 msgid "Is a defect" -msgstr "" +msgstr "Es un defecto" #: tcms/testruns/templates/testruns/get.html:620 msgid "Issue Tracker" -msgstr "" +msgstr "Rastreador de incidencias" #: tcms/testruns/templates/testruns/mutable.html:7 msgid "Edit TestRun" @@ -1951,15 +1951,15 @@ msgstr "Clonar Ejecución de Caso de Pruebas" #: tcms/testruns/templates/testruns/mutable.html:180 msgid "Affects only test cases with parameters" -msgstr "" +msgstr "Afecta solo casos de prueba con parámetros" #: tcms/testruns/templates/testruns/mutable.html:194 msgid "more information" -msgstr "" +msgstr "más información" #: tcms/testruns/templates/testruns/mutable.html:218 msgid "Selected TestCase(s):" -msgstr "Prueba seleccionada(s):" +msgstr "Caso de prueba seleccionado(s):" #: tcms/testruns/templates/testruns/mutable.html:221 #, python-format @@ -1983,16 +1983,16 @@ msgstr "Ejecutando" #: tcms/testruns/templates/testruns/search.html:90 #: tcms/testruns/templates/testruns/search.html:190 msgid "Start date" -msgstr "" +msgstr "Fecha de Inicio" #: tcms/testruns/templates/testruns/search.html:110 #: tcms/testruns/templates/testruns/search.html:191 msgid "Stop date" -msgstr "" +msgstr "Fecha de Culminación" #: tcms/testruns/views.py:273 msgid "Clone of " -msgstr "Clon de " +msgstr "Clonar de " #: testcases.TestCaseStatus/name:1 msgid "PROPOSED" @@ -2016,15 +2016,15 @@ msgstr "EN EJECUCIÓN" #: testruns.TestExecutionStatus/name:3 msgid "PAUSED" -msgstr "EN PAUSA" +msgstr "PAUSADO" #: testruns.TestExecutionStatus/name:4 msgid "PASSED" -msgstr "PASO" +msgstr "PASÓ" #: testruns.TestExecutionStatus/name:5 msgid "FAILED" -msgstr "FALLO" +msgstr "FALLÓ" #: testruns.TestExecutionStatus/name:6 msgid "BLOCKED" @@ -2036,7 +2036,7 @@ msgstr "ERROR" #: testruns.TestExecutionStatus/name:8 msgid "WAIVED" -msgstr "WAIVADO" +msgstr "NO APLICA" #: tcms_github_app/admin.py:122 #, python-format @@ -2050,7 +2050,7 @@ msgstr "Integración de GitHub" #: tcms_github_app/menu.py:12 msgid "Resync" -msgstr "" +msgstr "Resync" #: tcms_github_app/menu.py:13 msgid "Settings" @@ -2112,15 +2112,15 @@ msgstr "" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:14 msgid "Tenant subscriptions" -msgstr "" +msgstr "Suscripciones del cliente" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:23 msgid "You can access the following tenants" -msgstr "" +msgstr "Puede acceder a los siguientes inquilinos" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:28 msgid "Tenant" -msgstr "" +msgstr "Instante" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:39 #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:140 @@ -2130,11 +2130,11 @@ msgstr "Organización" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:52 msgid "Private repository credentials" -msgstr "" +msgstr "Credenciales de repositorio privado" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:68 msgid "Click 'Password' to reveal!" -msgstr "" +msgstr "Haga clic en 'contraseña' para mostrar!" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:70 msgid "Private containers instructions" @@ -2146,7 +2146,7 @@ msgstr "" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:125 msgid "You own the following tenants" -msgstr "" +msgstr "Usted posee los siguientes inquilinos" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:147 #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:148 @@ -2170,11 +2170,11 @@ msgstr "Cancelar suscripción" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:177 msgid "You don't own any tenants" -msgstr "" +msgstr "No posees ningún inquilino" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:181 msgid "Subscribe via FastSpring" -msgstr "" +msgstr "Suscríbete vía FastSpring" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:197 msgid "Transaction history" @@ -2197,7 +2197,7 @@ msgstr "Recibido en" #: tcms_github_marketplace/templates/tcms_tenants/include/tenant_extra_emails.html:11 msgid "Extra emails" -msgstr "" +msgstr "Emails adicionales" #: tcms_github_marketplace/templates/tcms_tenants/include/tenant_extra_emails.html:21 msgid "Kiwi TCMS will try to match recurring billing events against tenant.owner.email + tenant.extra_emails" @@ -2209,7 +2209,7 @@ msgstr "" #: tcms_github_marketplace/templates/tcms_tenants/override_new.html:52 msgid "Private Tenant Warning" -msgstr "" +msgstr "Advertencia para inquilinos privados" #: tcms_github_marketplace/templates/tcms_tenants/override_new.html:57 msgid "You are about to create a Private Tenant for Kiwi TCMS.\n" @@ -2222,11 +2222,11 @@ msgstr "" #: tcms_github_marketplace/utils.py:58 msgid "Kiwi TCMS Subscription Exit Poll" -msgstr "" +msgstr "Suscripción Kiwi TCMS Salir encuesta" #: tcms_github_marketplace/views.py:617 msgid "Kiwi TCMS subscription notification" -msgstr "" +msgstr "Notificación de suscripción a Kiwi TCMS" #: tcms_github_marketplace/views.py:833 msgid "mo" @@ -2238,7 +2238,7 @@ msgstr "año" #: build/lib/tcms_enterprise/admin.py:22 tcms_enterprise/admin.py:22 msgid "Export as CSV" -msgstr "" +msgstr "Exportar como CSV" #: build/lib/tcms_enterprise/pipeline.py:22 tcms_enterprise/pipeline.py:21 msgid "Email address is required" @@ -2255,7 +2255,7 @@ msgstr "Información legal" #: tcms_enterprise/templates/registration/custom_login.html:27 msgid "Continue with" -msgstr "" +msgstr "Continuar con" #: tcms_tenants/admin.py:55 tcms_tenants/admin.py:62 #: tcms_tenants/middleware.py:35 @@ -2264,7 +2264,7 @@ msgstr "No autorizado" #: tcms_tenants/admin.py:86 msgid "Existing username, email or user ID" -msgstr "" +msgstr "Nombre de usuario, email o ID de usuario existente" #: tcms_tenants/admin.py:159 msgid "Full name" @@ -2281,7 +2281,7 @@ msgstr "Crear" #: tcms_tenants/menu.py:20 #: tcms_tenants/templates/tcms_tenants/invite_users.html:17 msgid "Invite users" -msgstr "" +msgstr "Invitar usuarios" #: tcms_tenants/menu.py:21 msgid "Authorized users" @@ -2293,7 +2293,7 @@ msgstr "No pagado" #: tcms_tenants/middleware.py:70 msgid "Tenant expires soon" -msgstr "" +msgstr "La suscripción expira pronto" #: tcms_tenants/templates/tcms_tenants/email/invite_user.txt:1 #, python-format @@ -2315,27 +2315,27 @@ msgstr "" #: tcms_tenants/templates/tcms_tenants/invite_users.html:28 msgid "Email" -msgstr "" +msgstr "Correo electrónico" #: tcms_tenants/templates/tcms_tenants/new.html:18 msgid "New tenant" -msgstr "" +msgstr "Nuevo inquilino" #: tcms_tenants/templates/tcms_tenants/new.html:35 msgid "Company, team or project name" -msgstr "Prueba Marcos" +msgstr "Nombre de la empresa, equipo o proyecto" #: tcms_tenants/templates/tcms_tenants/new.html:43 msgid "Schema" -msgstr "Esquema prueba Marcos" +msgstr "Esquema" #: tcms_tenants/templates/tcms_tenants/new.html:56 msgid "Validation pattern" -msgstr "Patrón de validación prueba Marcos" +msgstr "Patrón de validación" #: tcms_tenants/templates/tcms_tenants/new.html:61 msgid "Publicly readable" -msgstr "" +msgstr "Públicamente legible" #: tcms_tenants/templates/tcms_tenants/new.html:80 msgid "Tenant logo" @@ -2343,7 +2343,7 @@ msgstr "" #: tcms_tenants/utils.py:66 msgid "Schema name already in use" -msgstr "" +msgstr "Nombre de esquema ya esta en uso" #: tcms_tenants/utils.py:170 msgid "New Kiwi TCMS tenant created" @@ -2356,40 +2356,40 @@ msgstr "" #: tcms_tenants/utils.py:262 msgid "Invitation to join Kiwi TCMS" -msgstr "" +msgstr "Invitación a unirse a Kiwi TCMS" #: tcms_tenants/views.py:84 msgid "Only super-user and tenant owner are allowed to edit tenant properties" -msgstr "" +msgstr "Sólo el super-usuario y el propietario del inquilino pueden editar propiedades del inquilino" #: tcms_tenants/views.py:102 msgid "Edit tenant" -msgstr "" +msgstr "Editar inquilino" #: tcms_tenants/views.py:153 msgid "Only users who are authorized for this tenant can invite others" -msgstr "" +msgstr "Sólo los usuarios autorizados para esta instancia pueden invitar a otros" #: tenant_groups/admin.py:30 msgid "users" -msgstr "" +msgstr "Usuarios" #: tenant_groups/models.py:34 msgid "name" -msgstr "" +msgstr "nombre" #: tenant_groups/models.py:37 msgid "permissions" -msgstr "" +msgstr "permisos" #: tenant_groups/models.py:47 msgid "group" -msgstr "" +msgstr "grupo" #: tenant_groups/models.py:48 msgid "groups" -msgstr "" +msgstr "Grupos" #: trackers_integration/menu.py:4 msgid "Personal API tokens" -msgstr "" +msgstr "Tokens API personales" diff --git a/tcms/locale/fr_FR/LC_MESSAGES/django.po b/tcms/locale/fr_FR/LC_MESSAGES/django.po index 61cdb7c026..d9bc8551c1 100644 --- a/tcms/locale/fr_FR/LC_MESSAGES/django.po +++ b/tcms/locale/fr_FR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: kiwitcms\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-12-17 10:23+0000\n" -"PO-Revision-Date: 2025-12-17 12:44\n" +"PO-Revision-Date: 2026-02-09 16:36\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -705,7 +705,7 @@ msgstr "Format de date non valide. YYYY-MM-JJ attendu [HH:MM:SS]." #: tcms/settings/common.py:391 msgid "TESTING" -msgstr "EN_TEST" +msgstr "TESTER" #: tcms/settings/common.py:393 tcms/testruns/templates/testruns/mutable.html:70 msgid "New Test Plan" diff --git a/tcms/locale/pt_BR/LC_MESSAGES/django.po b/tcms/locale/pt_BR/LC_MESSAGES/django.po index 300303b121..71379b1d2d 100644 --- a/tcms/locale/pt_BR/LC_MESSAGES/django.po +++ b/tcms/locale/pt_BR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: kiwitcms\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-12-17 10:23+0000\n" -"PO-Revision-Date: 2025-12-17 12:44\n" +"PO-Revision-Date: 2026-02-24 17:26\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -516,12 +516,12 @@ msgstr "Usuários" #: tcms/kiwi_auth/admin.py:62 msgid "Deactivate selected accounts" -msgstr "" +msgstr "Desativar as contas selecionadas" #: tcms/kiwi_auth/admin.py:69 #, python-format msgid "Account '%s' was deactivated" -msgstr "" +msgstr "Conta '%s' foi desativada" #: tcms/kiwi_auth/admin.py:103 #: tcms/kiwi_auth/templates/accounts/reset_user_email.html:5 @@ -622,15 +622,15 @@ msgstr "Endereço de e-mail foi redefinido, por favor, verifique a caixa de entr #: tcms/management/models.py:20 msgid "Classification" -msgstr "" +msgstr "Classificação" #: tcms/management/models.py:21 msgid "Classifications" -msgstr "" +msgstr "Classificações" #: tcms/management/models.py:57 msgid "Products" -msgstr "" +msgstr "Produtos" #: tcms/management/models.py:77 #: tcms/telemetry/templates/telemetry/testing/execution-dashboard.html:32 @@ -672,7 +672,7 @@ msgstr "Componentes" #: tcms/management/models.py:126 msgid "Versions" -msgstr "" +msgstr "Versões" #: tcms/management/models.py:172 msgid "Builds" @@ -788,7 +788,7 @@ msgstr "Todo o resto" #: tcms/settings/common.py:449 msgid "MORE" -msgstr "" +msgstr "MAIS" #: tcms/settings/common.py:459 msgid "Report an Issue" @@ -1028,7 +1028,7 @@ msgstr "Erro Interno do Servidor" #: tcms/templates/admin/auth/user/submit_line.html:7 msgid "Deactivate" -msgstr "" +msgstr "Desativar" #: tcms/templates/attachments/add.html:3 msgid "Attachment upload error" @@ -1436,7 +1436,15 @@ msgid "Test case %(pk)d has been created.\n\n" "Default tester: %(default_tester)s\n" "Text:\n" "%(text)s" -msgstr "" +msgstr "O caso %(pk)d de teste foi criado.\n\n" +"### Informação básica ###\n" +"Resumo: %(summary)s\n\n" +"Produto: %(product)s\n" +"Categoria: %(category)s\n" +"Prioridade: %(priority)s\n\n" +"Testador padrão: %(default_tester)s\n" +"Texto:\n" +"%(text)s" #: tcms/testcases/helpers/email.py:62 #, python-format @@ -1900,7 +1908,7 @@ msgstr "Ambiente" #: tcms/testruns/templates/testruns/get.html:171 msgid "View all in Execution Dashboard" -msgstr "" +msgstr "Visualizar tudo no Painel de Execução" #: tcms/testruns/templates/testruns/get.html:190 msgid "Update text version" @@ -1941,7 +1949,7 @@ msgstr "Atribuído para" #: tcms/testruns/templates/testruns/get.html:387 #: tcms/testruns/templates/testruns/get.html:389 msgid "Last bug" -msgstr "" +msgstr "Último bug" #: tcms/testruns/templates/testruns/get.html:431 msgid "Text version" @@ -2152,11 +2160,11 @@ msgstr "Organização" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:52 msgid "Private repository credentials" -msgstr "" +msgstr "Credenciais do repositório privado" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:68 msgid "Click 'Password' to reveal!" -msgstr "" +msgstr "Clique em \"Senha\" para revelar!" #: tcms_github_marketplace/templates/tcms_github_marketplace/subscription.html:70 msgid "Private containers instructions" @@ -2266,7 +2274,7 @@ msgstr "ano" #: build/lib/tcms_enterprise/admin.py:22 tcms_enterprise/admin.py:22 msgid "Export as CSV" -msgstr "" +msgstr "Exportar para CSV" #: build/lib/tcms_enterprise/pipeline.py:22 tcms_enterprise/pipeline.py:21 msgid "Email address is required" @@ -2283,7 +2291,7 @@ msgstr "Informações legais" #: tcms_enterprise/templates/registration/custom_login.html:27 msgid "Continue with" -msgstr "" +msgstr "Continuar com" #: tcms_tenants/admin.py:55 tcms_tenants/admin.py:62 #: tcms_tenants/middleware.py:35 diff --git a/tcms/package-lock.json b/tcms/package-lock.json index 4701fa7077..4b69b679b2 100644 --- a/tcms/package-lock.json +++ b/tcms/package-lock.json @@ -4,6 +4,7 @@ "requires": true, "packages": { "": { + "name": "tcms", "dependencies": { "bootstrap-duration-picker": "2.1.3", "bootstrap-switch": "3.3.4", @@ -11,7 +12,7 @@ "html5sortable": "0.14.0", "jszip": "3.10.1", "patternfly": "3.59.5", - "pdfmake": "0.3.3", + "pdfmake": "0.3.4", "simplemde": "1.11.2", "typeahead.js": "0.11.1" }, @@ -21,7 +22,7 @@ "eslint-plugin-import": "2.32.0", "eslint-plugin-n": "16.6.2", "eslint-plugin-node": "11.1.0", - "webpack": "5.105.0", + "webpack": "5.105.2", "webpack-cli": "6.0.1" } }, @@ -879,10 +880,11 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -912,10 +914,11 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2484,12 +2487,14 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -2497,10 +2502,11 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/font-awesome": { "version": "4.7.0", @@ -3444,6 +3450,13 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3485,6 +3498,16 @@ "setimmediate": "^1.0.5" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3618,10 +3641,11 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3976,9 +4000,9 @@ } }, "node_modules/pdfmake": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.3.3.tgz", - "integrity": "sha512-jSnF8rVLkbLLX37bnXWRFhEDO48quE7OIg7lgWBa6ihAbpCxASaBLWFOXNxSDeLBNt92304SBwpYcPkJnIArlA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.3.4.tgz", + "integrity": "sha512-zbGBox6pgNeGdG7tlLVBbQJlYIlTHtXo5q8+dNhCb2O0Q2+Nc5bcpsgNzbzqfzlcJ0gX9f+ZBv1z4FuJjUHwVA==", "dependencies": { "linebreak": "^1.1.0", "pdfkit": "^0.17.2", @@ -4444,10 +4468,11 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5177,9 +5202,9 @@ } }, "node_modules/webpack": { - "version": "5.105.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", - "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "version": "5.105.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz", + "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -6237,9 +6262,9 @@ "requires": {} }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -6258,9 +6283,9 @@ }, "dependencies": { "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "requires": { "fast-deep-equal": "^3.1.3", @@ -7387,19 +7412,20 @@ "dev": true }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "requires": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, "font-awesome": { @@ -8025,6 +8051,12 @@ "argparse": "^2.0.1" } }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -8063,6 +8095,15 @@ "setimmediate": "^1.0.5" } }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8159,9 +8200,9 @@ } }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8430,9 +8471,9 @@ } }, "pdfmake": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.3.3.tgz", - "integrity": "sha512-jSnF8rVLkbLLX37bnXWRFhEDO48quE7OIg7lgWBa6ihAbpCxASaBLWFOXNxSDeLBNt92304SBwpYcPkJnIArlA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.3.4.tgz", + "integrity": "sha512-zbGBox6pgNeGdG7tlLVBbQJlYIlTHtXo5q8+dNhCb2O0Q2+Nc5bcpsgNzbzqfzlcJ0gX9f+ZBv1z4FuJjUHwVA==", "requires": { "linebreak": "^1.1.0", "pdfkit": "^0.17.2", @@ -8751,9 +8792,9 @@ }, "dependencies": { "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "requires": { "fast-deep-equal": "^3.1.3", @@ -9271,9 +9312,9 @@ } }, "webpack": { - "version": "5.105.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", - "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "version": "5.105.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz", + "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.7", diff --git a/tcms/package.json b/tcms/package.json index b9e0956e70..b9e72dc257 100644 --- a/tcms/package.json +++ b/tcms/package.json @@ -6,7 +6,7 @@ "html5sortable": "0.14.0", "jszip": "3.10.1", "patternfly": "3.59.5", - "pdfmake": "0.3.3", + "pdfmake": "0.3.4", "simplemde": "1.11.2", "typeahead.js": "0.11.1" }, @@ -23,7 +23,7 @@ "eslint-plugin-import": "2.32.0", "eslint-plugin-n": "16.6.2", "eslint-plugin-node": "11.1.0", - "webpack": "5.105.0", + "webpack": "5.105.2", "webpack-cli": "6.0.1" } } diff --git a/tcms/testruns/static/testruns/js/get.js b/tcms/testruns/static/testruns/js/get.js index aead2c3ec6..8e9047e132 100644 --- a/tcms/testruns/static/testruns/js/get.js +++ b/tcms/testruns/static/testruns/js/get.js @@ -20,10 +20,20 @@ const permissions = { removeTag: false, addComment: false, removeComment: false, - viewHistoricalTestExecution: false + viewHistoricalTestExecution: false, + addAttachment: false, + deleteAttachment: false } const autocompleteCache = {} +function showAttachmentCountForTe (container, executionCount, caseCount) { + const jsAttachments = container.find('.js-attachments') + if (executionCount > 0 || caseCount > 0) { + jsAttachments.removeClass('hidden') + jsAttachments.find('.test-execution-attachment-count').text(`E:${executionCount} / TC:${caseCount}`) + } +} + function showLastBugForTe (testExecutionRow, bugUrl) { const jsBugs = testExecutionRow.find('.js-bugs') jsBugs.removeClass('hidden') @@ -42,6 +52,8 @@ export function pageTestrunsGetReadyHandler () { permissions.addComment = $('#test_run_pk').data('perm-add-comment') === 'True' permissions.removeComment = $('#test_run_pk').data('perm-remove-comment') === 'True' permissions.viewHistoricalTestExecution = $('#test_run_pk').data('perm-view-historical-testexecution') === 'True' + permissions.addAttachment = $('#test_run_pk').data('perm-add-attachment') === 'True' + permissions.deleteAttachment = $('#test_run_pk').data('perm-delete-attachment') === 'True' const testRunId = $('#test_run_pk').data('pk') @@ -544,23 +556,36 @@ function getExpandArea (testExecution) { bindDeleteLinkButton() }) + const attachCounts = { execution: 0, testcase: 0 } + + loadExecutionAttachments(container, testExecution, attachCounts) + jsonRPC('TestCase.list_attachments', [testExecution.case], attachments => { - const ul = container.find('.test-case-attachments') + attachCounts.testcase = attachments.length + showAttachmentCountForTe(container, attachCounts.execution, attachCounts.testcase) + + const table = container.find('.test-case-attachments') + const tbody = table.find('tbody') if (!attachments.length) { - ul.find('.hidden').removeClass('hidden') + tbody.find('.no-tc-attachments').removeClass('hidden') return } - const liTemplate = $('#attachments-list-item')[0].content + const rowTemplate = container.find('.attachments-list-item')[0].content attachments.forEach(attachment => { - const li = liTemplate.cloneNode(true) - const attachmentLink = $(li).find('a')[0] + const row = rowTemplate.cloneNode(true) + const link = $(row).find('.tc-attachment-link') + link.attr('href', attachment.url) + link.text(attachment.url.split('/').slice(-1)[0]) + + $(row).find('.tc-attachment-owner').text(attachment.owner_username || '-') + $(row).find('.tc-attachment-date').text( + attachment.date ? moment(attachment.date).format('DD MMM YYYY, HH:mm a') : '-' + ) - attachmentLink.href = attachment.url - attachmentLink.innerText = attachment.url.split('/').slice(-1)[0] - ul.append(li) + tbody.append(row) }) }) @@ -983,3 +1008,89 @@ function testExecutionUpdateArgs (statusId) { return updateArgs } + +function loadExecutionAttachments (container, testExecution, attachCounts) { + if (!permissions.addAttachment) { + container.find('.execution-attachment-upload').hide() + } + + refreshExecutionAttachments(container, testExecution, attachCounts) + + container.find('.execution-attachment-file-input').on('change', function () { + const files = this.files + if (!files.length) return + + let pending = files.length + for (let i = 0; i < files.length; i++) { + const file = files[i] + const reader = new FileReader() + reader.onload = function (e) { + const b64content = e.target.result.split('base64,')[1] + jsonRPC('TestExecution.add_attachment', [testExecution.id, file.name, b64content], () => { + pending-- + if (pending === 0) { + refreshExecutionAttachments(container, testExecution, attachCounts) + } + }) + } + reader.readAsDataURL(file) + } + + // reset the input so the same file can be uploaded again + this.value = '' + }) +} + +function refreshExecutionAttachments (container, testExecution, attachCounts) { + const table = container.find('.test-execution-attachments') + const tbody = table.find('tbody') + + // remove previously rendered rows but keep template and placeholder + tbody.find('tr:not(.no-execution-attachments)').remove() + + jsonRPC('TestExecution.list_attachments', [testExecution.id], attachments => { + if (attachCounts) { + attachCounts.execution = attachments.length + showAttachmentCountForTe(container, attachCounts.execution, attachCounts.testcase) + } + + if (!attachments.length) { + tbody.find('.no-execution-attachments').removeClass('hidden') + return + } + + tbody.find('.no-execution-attachments').addClass('hidden') + const rowTemplate = container.find('.execution-attachment-template')[0].content + + attachments.forEach(attachment => { + const row = rowTemplate.cloneNode(true) + const link = $(row).find('.execution-attachment-link') + link.attr('href', attachment.url) + link.text(attachment.url.split('/').slice(-1)[0]) + + $(row).find('.execution-attachment-owner').text(attachment.owner_username || '-') + $(row).find('.execution-attachment-date').text( + attachment.date ? moment(attachment.date).format('DD MMM YYYY, HH:mm a') : '-' + ) + + const deleteBtn = $(row).find('.js-remove-execution-attachment') + if (permissions.deleteAttachment) { + deleteBtn.on('click', function (e) { + e.preventDefault() + jsonRPC('Attachment.remove_attachment', attachment.pk, () => { + $(this).parents('tr').fadeOut(500, function () { + $(this).remove() + if (!tbody.find('tr:not(.no-execution-attachments)').length) { + tbody.find('.no-execution-attachments').removeClass('hidden') + } + }) + }) + }) + } else { + deleteBtn.hide() + } + + tbody.append(row) + }) + }) +} diff --git a/tcms/testruns/templates/testruns/get.html b/tcms/testruns/templates/testruns/get.html index b7f78e9985..9b89e8a3d1 100644 --- a/tcms/testruns/templates/testruns/get.html +++ b/tcms/testruns/templates/testruns/get.html @@ -19,6 +19,8 @@
| {% trans 'File' %} | +{% trans 'Owner' %} | +{% trans 'Date' %} | ++ |
|---|---|---|---|
| + | + | + | + + + + | +