diff --git a/.ci/docker-compose-ci.yml b/.ci/docker-compose-ci.yml index f28b89dd130..c2fcd04c3a4 100644 --- a/.ci/docker-compose-ci.yml +++ b/.ci/docker-compose-ci.yml @@ -5,12 +5,18 @@ services: db: image: mysql:5.7 container_name: db + platform: linux/amd64 command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci environment: MYSQL_ROOT_PASSWORD: "password" MYSQL_DATABASE: "ecommerce" ecommerce: - image: edxops/ecommerce:latest + platform: linux/amd64 + build: + context: ../. + target: dev + args: + PYTHON_VERSION: $PYTHON_VERSION container_name: ecommerce_testing volumes: - ..:/edx/app/ecommerce/ecommerce diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d11de37d26..ecb4daa17ab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,61 +11,65 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - include: - - django-env: django32 - testname: quality-and-jobs - targets: PYTHON_ENV=py38 requirements.js check_translations_up_to_date validate_translations clean_static static quality validate_js check_keywords - - django-env: django32 - testname: test-python - targets: PYTHON_ENV=py38 requirements.js clean_static static validate_python - - django-env: django32 - testname: acceptance-python - targets: PYTHON_ENV=py38 requirements.js clean_static static acceptance - + python-version: ['py38', 'py311', 'py312'] + django-env: ['django32'] + test: ['quality-and-jobs', 'test-python'] steps: - uses: actions/checkout@v2 + - name: Setup and Format Python Version + id: format_python_version + shell: bash + run: | + # Remove 'py' and insert a dot to format the version + FORMATTED_VERSION=${{ matrix.python-version }} # e.g., py38 + FORMATTED_VERSION=${FORMATTED_VERSION/py3/3.} # becomes 3.8 + # Set environment variables + echo "PYTHON_VERSION=$FORMATTED_VERSION" >> $GITHUB_ENV - name: Start container run: | - docker-compose -f ./.ci/docker-compose-ci.yml up -d + PYTHON_VERSION=$PYTHON_VERSION docker compose -f ./.ci/docker-compose-ci.yml up -d - name: Install dependencies run: | docker exec -t ecommerce_testing bash -c " cd /edx/app/ecommerce/ecommerce/ && - python3 -m pip install tox + python$PYTHON_VERSION -m pip install tox " - name: Run tests run: | docker exec -t -e CI=1 ecommerce_testing bash -c " cd /edx/app/ecommerce/ecommerce/ && PATH=\$PATH:/edx/app/ecommerce/nodeenvs/ecommerce/bin:/snap/bin - DJANGO_ENV=${{ matrix.django-env }} make ${{ matrix.targets }} + DJANGO_ENV=${{ matrix.django-env }} PYTHON_ENV=${{ matrix.python-version }} PYTHON_VERSION=$PYTHON_VERSION make ${{ matrix.test }} " - name: Run coverage - if: matrix.testname == 'test-python' + if: matrix.test == 'test-python' run: | docker exec ecommerce_testing /edx/app/ecommerce/ecommerce/.ci/run_coverage.sh - name: Setup Python - if: matrix.testname == 'test-python' + if: matrix.test == 'test-python' && matrix.python-version == 'py38' uses: actions/setup-python@v2 with: python-version: "3.8" architecture: x64 - name: Report coverage - if: matrix.testname == 'test-python' + if: matrix.test == 'test-python' && matrix.python-version == 'py38' uses: codecov/codecov-action@v3 with: flags: unittests fail_ci_if_error: false - docs: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 - with: - python-version: "3.8" - architecture: x64 - - name: Install Dependencies - run: pip install -r requirements/docs.txt -r requirements/tox.txt - - name: Build the docs - run: make docs + # docs: + # runs-on: ubuntu-latest + # strategy: + # matrix: + # python-version: ['3.8', '3.11', '3.12'] + # steps: + # - uses: actions/checkout@v2 + # - uses: actions/setup-python@v2 + # with: + # python-version: ${{matrix.python-version}} + # architecture: x64 + # - name: Install Dependencies + # run: pip install -r requirements/docs.txt -r requirements/tox.txt + # - name: Build the docs + # run: make docs diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml deleted file mode 100644 index fec11d6c259..00000000000 --- a/.github/workflows/commitlint.yml +++ /dev/null @@ -1,10 +0,0 @@ -# Run commitlint on the commit messages in a pull request. - -name: Lint Commit Messages - -on: - - pull_request - -jobs: - commitlint: - uses: openedx/.github/.github/workflows/commitlint.yml@master diff --git a/=3.2, b/=3.2, new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Dockerfile b/Dockerfile index 8a06c2ad9b3..70c8ac24bba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,23 @@ FROM ubuntu:focal as app +# Define 3.12 as default but it changes to the PYTHON_VERSION passed as argument +ARG PYTHON_VERSION=3.12 + ENV DEBIAN_FRONTEND noninteractive # System requirements. RUN apt update && \ + apt-get install -y software-properties-common && \ + apt-add-repository -y ppa:deadsnakes/ppa && \ apt-get install -qy \ curl \ gettext \ git \ language-pack-en \ build-essential \ - python3.8-dev \ - python3-virtualenv \ - python3.8-distutils \ + python${PYTHON_VERSION}-dev \ + python${PYTHON_VERSION}-distutils \ libmysqlclient-dev \ + pkg-config \ libssl-dev \ libcairo2-dev && \ rm -rf /var/lib/apt/lists/* @@ -34,11 +39,15 @@ ARG ECOMMERCE_NODEENV_DIR="${ECOMMERCE_APP_DIR}/nodeenvs/${SERVICE_NAME}" ENV ECOMMERCE_CFG "${COMMON_CFG_DIR}/ecommerce.yml" ENV ECOMMERCE_CODE_DIR "${ECOMMERCE_CODE_DIR}" ENV ECOMMERCE_APP_DIR "${ECOMMERCE_APP_DIR}" +ENV PYTHON_VERSION "${PYTHON_VERSION}" + +RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION} +RUN pip install virtualenv # Add virtual env and node env to PATH, in order to activate them ENV PATH "${ECOMMERCE_VENV_DIR}/bin:${ECOMMERCE_NODEENV_DIR}/bin:$PATH" -RUN virtualenv -p python3.8 --always-copy ${ECOMMERCE_VENV_DIR} +RUN virtualenv -p python${PYTHON_VERSION} --always-copy ${ECOMMERCE_VENV_DIR} RUN pip install nodeenv diff --git a/Makefile b/Makefile index bdf5d197510..9b5cabadf3c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ NODE_BIN=./node_modules/.bin DIFF_COVER_BASE_BRANCH=master -PYTHON_ENV=py38 +PYTHON_ENV_VAR=$(if $(PYTHON_ENV),$(PYTHON_ENV),py312) DJANGO_ENV_VAR=$(if $(DJANGO_ENV),$(DJANGO_ENV),django32) +PYTHON_VERSION_VAR=$(if $(PYTHON_VERSION),$(PYTHON_VERSION),3.12) help: @echo '' @@ -41,21 +42,21 @@ requirements.js: $(NODE_BIN)/bower install --allow-root requirements: requirements.js - pip3 install -r requirements/pip_tools.txt - pip3 install -r requirements/dev.txt --exists-action w + pip install -r requirements/pip_tools.txt + pip install -r requirements/dev.txt --exists-action w requirements.tox: - pip3 install -U pip==20.0.2 - pip3 install -r requirements/tox.txt --exists-action w + pip install -U pip + pip install -r requirements/tox.txt --exists-action w production-requirements: requirements.js - pip3 install -r requirements.txt --exists-action w + pip install -r requirements.txt --exists-action w migrate: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-migrate + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-migrate serve: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-serve + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-serve clean: find . -name '*.pyc' -delete @@ -65,18 +66,18 @@ clean_static: rm -rf assets/* ecommerce/static/build/* run_check_isort: requirements.tox - tox -e $(PYTHON_ENV)-check_isort + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-check_isort run_isort: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-run_isort + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-run_isort run_pycodestyle: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-pycodestyle + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-pycodestyle run_pep8: run_pycodestyle run_pylint: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-pylint + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-pylint quality: run_check_isort run_pycodestyle run_pylint @@ -86,42 +87,42 @@ validate_js: $(NODE_BIN)/gulp lint validate_python: clean requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-tests + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-tests acceptance: clean requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-acceptance + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-acceptance fast_validate_python: clean requirements.tox - DISABLE_ACCEPTANCE_TESTS=True tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-tests + DISABLE_ACCEPTANCE_TESTS=True python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-tests validate: validate_python validate_js quality theme_static: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-theme_static + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-theme_static static: requirements.js theme_static requirements.tox $(NODE_BIN)/r.js -o build.js - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-static + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-static html_coverage: requirements.tox - tox -e $(PYTHON_ENV)-coverage_html + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-coverage_html diff_coverage: validate fast_diff_coverage fast_diff_coverage: requirements.tox - tox -e $(PYTHON_ENV)-fast_diff_coverage + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-fast_diff_coverage e2e: requirements.tox - tox -e $(PYTHON_ENV)-e2e + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-e2e extract_translations: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-extract_translations + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-extract_translations dummy_translations: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-dummy_translations + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-dummy_translations compile_translations: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-compile_translations + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-compile_translations fake_translations: extract_translations dummy_translations compile_translations @@ -134,18 +135,18 @@ update_translations: pull_translations fake_translations # extract_translations should be called before this command can detect changes detect_changed_source_translations: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-detect_changed_translations + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-detect_changed_translations # @FIXME: skip detect_changed_source_translations until git diff works again (REV-2737) check_translations_up_to_date: fake_translations # detect_changed_source_translations # Validate translations validate_translations: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-validate_translations + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-validate_translations # Scan the Django models in all installed apps in this project for restricted field names check_keywords: requirements.tox - tox -e $(PYTHON_ENV)-${DJANGO_ENV_VAR}-check_keywords + python$(PYTHON_VERSION_VAR) -m tox -e $(PYTHON_ENV_VAR)-${DJANGO_ENV_VAR}-check_keywords COMMON_CONSTRAINTS_TXT=requirements/common_constraints.txt .PHONY: $(COMMON_CONSTRAINTS_TXT) @@ -173,6 +174,12 @@ upgrade: $(COMMON_CONSTRAINTS_TXT) docs: tox -e docs +quality-and-jobs: requirements.js check_translations_up_to_date validate_translations clean_static static quality validate_js check_keywords + +test-python: requirements.js clean_static static validate_python + +acceptance-python: requirements.js clean_static static acceptance + # Targets in a Makefile which do not produce an output file with the same name as the target name .PHONY: help requirements migrate serve clean validate_python quality validate_js validate html_coverage e2e \ extract_translations dummy_translations compile_translations fake_translations pull_translations \ diff --git a/ecommerce/conf/locale/en/LC_MESSAGES/django.po b/ecommerce/conf/locale/en/LC_MESSAGES/django.po new file mode 100644 index 00000000000..6d393fd475e --- /dev/null +++ b/ecommerce/conf/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,4081 @@ +# edX translation file. +# Copyright (C) 2024 EdX +# This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. +# EdX Team , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.1a\n" +"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" +"POT-Creation-Date: 2023-06-13 08:00+0000\n" +"PO-Revision-Date: 2023-06-13 09:00+0000\n" +"Last-Translator: \n" +"Language-Team: openedx-translation \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: core/admin.py:25 +msgid "Personal info" +msgstr "" + +#: core/admin.py:26 +msgid "Permissions" +msgstr "" + +#: core/admin.py:28 +msgid "Important dates" +msgstr "" + +#. Translators: "Waffle" is the name of a third-party library. It should not +#. be translated +#: core/admin.py:35 +#, python-brace-format +msgid "" +"User administration has been disabled due to the load on the database. This " +"functionality can be restored by activating the {switch_name} Waffle switch." +" Be careful when re-activating this switch!" +msgstr "" + +#: core/models.py:41 +msgid "LMS base url for custom site/microsite" +msgstr "" + +#: core/models.py:42 +msgid "Root URL of this site's LMS (e.g. https://courses.stage.edx.org)" +msgstr "" + +#: core/models.py:47 +msgid "Path to custom site theme" +msgstr "" + +#: core/models.py:54 +msgid "Payment processors" +msgstr "" + +#: core/models.py:55 +msgid "Comma-separated list of processor names: 'cybersource,paypal'" +msgstr "" + +#: core/models.py:61 +msgid "Client-side payment processor" +msgstr "" + +#: core/models.py:62 +msgid "Processor that will be used for client-side payments" +msgstr "" + +#: core/models.py:68 +msgid "OAuth settings" +msgstr "" + +#: core/models.py:69 +msgid "JSON string containing OAuth backend settings." +msgstr "" + +#: core/models.py:75 +msgid "Segment key" +msgstr "" + +#: core/models.py:76 +msgid "Segment write/API key." +msgstr "" + +#: core/models.py:82 +msgid "From email" +msgstr "" + +#: core/models.py:83 +msgid "Address from which emails are sent." +msgstr "" + +#: core/models.py:89 +msgid "Enable enrollment codes" +msgstr "" + +#: core/models.py:90 +msgid "Enable the creation of enrollment codes." +msgstr "" + +#: core/models.py:95 +msgid "Payment support email" +msgstr "" + +#: core/models.py:96 +msgid "Contact email for payment support issues." +msgstr "" + +#: core/models.py:102 +msgid "Payment support url" +msgstr "" + +#: core/models.py:103 +msgid "URL for payment support issues." +msgstr "" + +#: core/models.py:108 +msgid "UTM Cookie Name" +msgstr "" + +#: core/models.py:109 +msgid "Name of cookie storing UTM data." +msgstr "" + +#: core/models.py:115 +msgid "Affiliate Cookie Name" +msgstr "" + +#: core/models.py:116 +msgid "Name of cookie storing affiliate data." +msgstr "" + +#: core/models.py:122 +msgid "Send refund email notification" +msgstr "" + +#: core/models.py:127 +msgid "Enable SDN check" +msgstr "" + +#: core/models.py:128 +msgid "Enable SDN check at checkout." +msgstr "" + +#: core/models.py:132 +msgid "[Deprecated] US Treasury SDN API URL" +msgstr "" + +#: core/models.py:137 +msgid "[Deprecated] US Treasury SDN API key" +msgstr "" + +#: core/models.py:142 +msgid "SDN lists" +msgstr "" + +#: core/models.py:143 +msgid "A comma-separated list of Treasury OFAC lists to check against." +msgstr "" + +#: core/models.py:148 +msgid "Require Account Activation" +msgstr "" + +#: core/models.py:149 +msgid "" +"Require users to activate their account before allowing them to redeem a " +"coupon." +msgstr "" + +#: core/models.py:153 +msgid "Optimizely snippet source URL" +msgstr "" + +#: core/models.py:154 +msgid "This script will be loaded on every page." +msgstr "" + +#: core/models.py:159 +msgid "Base Cookie Domain" +msgstr "" + +#: core/models.py:160 +msgid "Base cookie domain used to share cookies across services." +msgstr "" + +#: core/models.py:166 +msgid "Enable embargo check" +msgstr "" + +#: core/models.py:167 +msgid "Enable embargo check at checkout." +msgstr "" + +#: core/models.py:171 +msgid "Discovery API URL" +msgstr "" + +#. Translators: Do not translate "Apple Pay" +#: core/models.py:177 +msgid "Enable Apple Pay" +msgstr "" + +#: core/models.py:181 +msgid "Enable Partial Program Offer" +msgstr "" + +#: core/models.py:182 +msgid "" +"Enable the application of program offers to remaining unenrolled or " +"unverified courses" +msgstr "" + +#: core/models.py:187 +msgid "Hubspot Portal Secret Key" +msgstr "" + +#: core/models.py:188 +msgid "Secret key for Hubspot portal authentication" +msgstr "" + +#: core/models.py:193 +msgid "Enable Microfrontend for Basket Page" +msgstr "" + +#: core/models.py:194 +msgid "" +"Use the microfrontend implementation of the basket page instead of the " +"server-side template" +msgstr "" + +#: core/models.py:199 +msgid "Payment Microfrontend URL" +msgstr "" + +#: core/models.py:200 +msgid "" +"URL for the Payment Microfrontend (used if Enable Microfrontend for Basket " +"Page is set)" +msgstr "" + +#: core/models.py:446 +msgid "last name" +msgstr "" + +#: core/models.py:449 +msgid "first name" +msgstr "" + +#: core/models.py:450 +msgid "Full Name" +msgstr "" + +#: core/models.py:456 +msgid "LMS user id" +msgstr "" + +#: core/models.py:710 extensions/basket/models.py:130 +#: templates/oscar/dashboard/offers/offer_detail.html:62 +#: templates/oscar/dashboard/offers/offer_detail.html:116 +#: templates/oscar/dashboard/offers/summary.html:10 +#: templates/oscar/dashboard/orders/order_detail.html:31 +#: templates/oscar/dashboard/orders/order_detail.html:42 +msgid "Name" +msgstr "" + +#: core/models.py:712 extensions/offer/models.py:582 +msgid "EnterpriseCustomer UUID" +msgstr "" + +#: core/models.py:713 extensions/offer/models.py:452 +#: extensions/offer/models.py:676 extensions/offer/models.py:742 +msgid "UUID for an EnterpriseCustomer from the Enterprise Service." +msgstr "" + +#: coupons/views.py:76 coupons/views.py:125 +msgid "Coupon does not exist." +msgstr "" + +#: coupons/views.py:81 +msgid "This coupon code is not yet valid." +msgstr "" + +#: coupons/views.py:83 +msgid "This coupon code has expired." +msgstr "" + +#: coupons/views.py:95 +#, python-brace-format +msgid "Product [{product}] not available for purchase." +msgstr "" + +#: coupons/views.py:100 +msgid "This coupon code is no longer available." +msgstr "" + +#: coupons/views.py:120 +msgid "This coupon code is invalid." +msgstr "" + +#: coupons/views.py:127 +msgid "The voucher is not applicable to your current basket." +msgstr "" + +#: coupons/views.py:137 +msgid "Welcome to edX" +msgstr "" + +#: coupons/views.py:138 +msgid "" +"Please choose from the courses selected by your organization to start " +"learning." +msgstr "" + +#: coupons/views.py:168 +msgid "Code not provided." +msgstr "" + +#: coupons/views.py:170 +msgid "SKU not provided." +msgstr "" + +#: coupons/views.py:181 +msgid "The product does not exist." +msgstr "" + +#: coupons/views.py:195 +msgid "You are not eligible to use this coupon." +msgstr "" + +#: coupons/views.py:210 +msgid "Couldn't find a matching Enterprise Customer for this coupon." +msgstr "" + +#: coupons/views.py:218 +msgid "" +"This coupon is not valid for purchasing a program. Try using this on an " +"individual course in the program. If you need assistance, contact edX " +"support." +msgstr "" + +#: coupons/views.py:245 +msgid "Invalid data sharing consent token provided." +msgstr "" + +#: coupons/views.py:265 +#, python-brace-format +msgid "You have already purchased {course} seat." +msgstr "" + +#: coupons/views.py:289 +#, python-brace-format +msgid "A discount has been applied, courtesy of {enterprise_customer_name}." +msgstr "" + +#: coupons/views.py:299 +msgid "This coupon code is not valid for this course. Try a different course." +msgstr "" + +#: courses/models.py:33 extensions/basket/models.py:20 +#: extensions/offer/models.py:238 extensions/payment/models.py:68 +#: templates/oscar/dashboard/offers/summary.html:14 +msgid "Site" +msgstr "" + +#: courses/models.py:40 +msgid "" +"Last date/time on which verification for this product can be submitted." +msgstr "" + +#: courses/publishers.py:78 +#, python-brace-format +msgid "Failed to publish commerce data for {course_id} to LMS." +msgstr "" + +#: courses/utils.py:138 +msgid "Audit" +msgstr "" + +#: courses/utils.py:139 +msgid "Credit" +msgstr "" + +#: courses/utils.py:140 +msgid "Honor" +msgstr "" + +#: courses/utils.py:141 +msgid "Professional" +msgstr "" + +#: courses/utils.py:142 +msgid "Verified" +msgstr "" + +#: courses/utils.py:143 +msgid "Executive Education" +msgstr "" + +#: courses/utils.py:144 +msgid "Paid Executive Education" +msgstr "" + +#: courses/utils.py:145 +msgid "Unpaid Executive Education" +msgstr "" + +#: courses/utils.py:146 +msgid "Paid Bootcamp" +msgstr "" + +#: courses/utils.py:147 +msgid "Unpaid Bootcamp" +msgstr "" + +#: credit/views.py:40 +msgid "" +"An error has occurred. We could not confirm that you are eligible for course" +" credit. Try the transaction again." +msgstr "" + +#: credit/views.py:61 +#, python-brace-format +msgid "" +"Credit is not currently available for \"{course_name}\". If you are " +"currently enrolled in the course, please try again after all grading is " +"complete. If you need additional assistance, please contact the {site_name} " +"Support Team." +msgstr "" + +#: credit/views.py:75 +msgid "" +"An error has occurred. We could not confirm that the institution you " +"selected offers this course credit. Try the transaction again." +msgstr "" + +#: enterprise/benefits.py:24 +#, python-format +msgid "%d%% enterprise discount" +msgstr "" + +#: enterprise/benefits.py:36 +#, python-brace-format +msgid "{value} fixed-price enterprise discount" +msgstr "" + +#: enterprise/benefits.py:45 extensions/payment/models.py:86 +#: invoice/models.py:25 programs/constants.py:15 +msgid "Percentage" +msgstr "" + +#: enterprise/benefits.py:46 extensions/payment/models.py:87 +#: programs/constants.py:16 +msgid "Absolute" +msgstr "" + +#: enterprise/conditions.py:216 +#, python-brace-format +msgid "" +"This coupon has been made available through {new_enterprise}. To redeem this" +" coupon, you must first logout. When you log back in, please select " +"{new_enterprise} as your enterprise and try again." +msgstr "" + +#: enterprise/conditions.py:370 +msgid "" +"This code is not valid with your email. Please login with the correct email " +"assigned to the code or contact your Learning Manager for additional " +"questions." +msgstr "" + +#: enterprise/forms.py:38 +#: enterprise/templates/enterprise/enterpriseoffer_list.html:30 +msgid "Enterprise Customer UUID" +msgstr "" + +#: enterprise/forms.py:39 +#: enterprise/templates/enterprise/enterpriseoffer_list.html:31 +msgid "Enterprise Customer Catalog UUID" +msgstr "" + +#: enterprise/forms.py:40 programs/forms.py:23 +msgid "Discount Type" +msgstr "" + +#: enterprise/forms.py:42 programs/forms.py:25 +msgid "Discount Value" +msgstr "" + +#: enterprise/forms.py:45 +msgid "Contract Discount Type" +msgstr "" + +#: enterprise/forms.py:48 +msgid "Contract Discount" +msgstr "" + +#: enterprise/forms.py:51 +msgid "Prepaid Invoice Amount" +msgstr "" + +#: enterprise/forms.py:53 +msgid "Salesforce Opportunity ID" +msgstr "" + +#: enterprise/forms.py:55 +msgid "Salesforce Opportunity Line Item" +msgstr "" + +#: enterprise/forms.py:58 +msgid "Emails Addresses" +msgstr "" + +#: enterprise/forms.py:59 +msgid "Comma separated emails which will receive the offer usage alerts" +msgstr "" + +#: enterprise/forms.py:64 +msgid "Frequency for offer usage emails" +msgstr "" + +#: enterprise/forms.py:79 +msgid "The maximum number of enrollments that can redeem this offer." +msgstr "" + +#: enterprise/forms.py:80 +msgid "The maximum USD dollar amount that can be redeemed by this offer." +msgstr "" + +#: enterprise/forms.py:81 +msgid "" +"The maximum number of enrollments, by a user, that can redeem this offer." +msgstr "" + +#: enterprise/forms.py:82 +msgid "" +"The maximum USD dollar amount that can be redeemed using this offer by a " +"user." +msgstr "" + +#: enterprise/forms.py:85 programs/forms.py:35 +msgid "Start Date" +msgstr "" + +#: enterprise/forms.py:86 programs/forms.py:36 +msgid "End Date" +msgstr "" + +#: enterprise/forms.py:87 +msgid "Enrollment Limit" +msgstr "" + +#: enterprise/forms.py:88 +msgid "Bookings Limit" +msgstr "" + +#: enterprise/forms.py:89 +msgid "Per User Enrollment Limit" +msgstr "" + +#: enterprise/forms.py:90 +msgid "Per User Bookings Limit" +msgstr "" + +#: enterprise/forms.py:152 enterprise/forms.py:220 +#, python-brace-format +msgid "" +"Ensure new value must be greater than or equal to " +"consumed({offer_enrollments}) value." +msgstr "" + +#: enterprise/forms.py:166 +msgid "" +"Salesforce Opportunity ID must be 18 alphanumeric characters and begin with " +"006." +msgstr "" + +#: enterprise/forms.py:176 +msgid "" +"The Salesforce Opportunity Line Item must be 18 alphanumeric characters and " +"begin with '00k'." +msgstr "" + +#: enterprise/forms.py:184 enterprise/forms.py:232 +msgid "Ensure this value is greater than or equal to 0." +msgstr "" + +#: enterprise/forms.py:191 enterprise/forms.py:248 +#, python-brace-format +msgid "" +"Ensure new value must be greater than or equal to " +"consumed({consumed_discount:.2f}) value." +msgstr "" + +#: enterprise/forms.py:265 +#, python-brace-format +msgid "Given email address {email} is not a valid email." +msgstr "" + +#: enterprise/forms.py:290 +msgid "An offer already exists for this Enterprise & Catalog combination." +msgstr "" + +#: enterprise/forms.py:293 enterprise/forms.py:302 programs/forms.py:73 +msgid "Percentage discounts cannot be greater than 100%." +msgstr "" + +#: enterprise/forms.py:296 programs/forms.py:76 +msgid "A start date must be specified when specifying an end date." +msgstr "" + +#: enterprise/forms.py:299 programs/forms.py:79 +msgid "The start date must occur before the end date." +msgstr "" + +#: enterprise/forms.py:307 +msgid "More than 2 digits after the decimal not allowed for absolute value." +msgstr "" + +#: enterprise/forms.py:312 +msgid "This field is required when contract discount type is absolute." +msgstr "" + +#: enterprise/forms.py:337 +msgid "Discount of type {} provided by {} for {}." +msgstr "" + +#: enterprise/templates/enterprise/enterprise_coupon_app.html:5 +msgid "Enterprise Coupon Codes" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:9 +#, python-format +msgid "Edit Enterprise Offer: %(enterprise_customer_name)s" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:14 +#: enterprise/templates/enterprise/enterpriseoffer_form.html:47 +#: enterprise/templates/enterprise/enterpriseoffer_form.html:60 +#: enterprise/templates/enterprise/enterpriseoffer_list.html:20 +msgid "Create Enterprise Offer" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:30 +#: enterprise/templates/enterprise/enterpriseoffer_list.html:6 +#: enterprise/templates/enterprise/enterpriseoffer_list.html:17 +#: templates/edx/partials/_administration_menu.html:14 +msgid "Enterprise Offers" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:34 +#: programs/templates/programs/programoffer_form.html:34 +#: templates/oscar/dashboard/catalogue/product_row_actions.html:11 +#: templates/oscar/dashboard/catalogue/product_update.html:267 +#: templates/oscar/dashboard/offers/offer_detail.html:64 +#: templates/oscar/dashboard/offers/offer_detail.html:77 +#: templates/oscar/dashboard/offers/offer_detail.html:82 +#: templates/oscar/dashboard/offers/offer_detail.html:97 +#: templates/oscar/dashboard/offers/summary.html:9 +#: templates/oscar/dashboard/offers/summary.html:19 +#: templates/oscar/dashboard/offers/summary.html:25 +#: templates/oscar/dashboard/offers/summary.html:30 +#: templates/oscar/dashboard/orders/order_detail.html:720 +msgid "Edit" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:36 +#: programs/templates/programs/programoffer_form.html:36 +msgid "Create" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:45 +msgid "Edit Enterprise Offer" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:58 +#: programs/templates/programs/programoffer_form.html:58 +msgid "Save Changes" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:62 +#: programs/templates/programs/programoffer_form.html:62 +#: templates/oscar/dashboard/catalogue/category_form.html:104 +#: templates/oscar/dashboard/catalogue/product_update.html:322 +#: templates/oscar/dashboard/partials/refund_action_modal.html:20 +msgid "Cancel" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_form.html:76 +#, python-format +msgid "" +"\n" +" %(platform_name)s Enterprise Offer Administration Tool\n" +" " +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_list.html:26 +msgid "Current enterprise offers" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_list.html:29 +msgid "Enterprise Customer Name" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_list.html:32 +#: programs/templates/programs/programoffer_list.html:31 +#: templates/oscar/dashboard/offers/offer_detail.html:71 +#: templates/oscar/dashboard/orders/order_detail.html:658 +#: templates/oscar/dashboard/orders/order_detail.html:708 +msgid "Type" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_list.html:33 +#: programs/templates/programs/programoffer_list.html:32 +msgid "Value" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_list.html:34 +#: programs/templates/programs/programoffer_list.html:33 +msgid "Start" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_list.html:35 +#: programs/templates/programs/programoffer_list.html:34 +msgid "End" +msgstr "" + +#: enterprise/templates/enterprise/enterpriseoffer_list.html:64 +#, python-format +msgid "" +"\n" +" %(platform_name)s Enterprise Offer Administration Tool\n" +" " +msgstr "" + +#: enterprise/utils.py:239 +#, python-brace-format +msgid "SKU {sku} does not exist." +msgstr "" + +#: enterprise/utils.py:248 +#, python-brace-format +msgid "There is no Enterprise Customer associated with SKU {sku}." +msgstr "" + +#: enterprise/utils.py:256 +#, python-brace-format +msgid "" +"If you have concerns about sharing your data, please contact your " +"administrator at {enterprise}." +msgstr "" + +#: enterprise/utils.py:259 +#, python-brace-format +msgid "" +"If you have concerns about sharing your data, please contact your " +"administrator at {enterprise} at {contact_info}." +msgstr "" + +#: enterprise/utils.py:265 +#, python-brace-format +msgid "Enrollment in {course_name} was not complete." +msgstr "" + +#: enterprise/views.py:39 +msgid "Enterprise offer updated!" +msgstr "" + +#: enterprise/views.py:62 +msgid "Enterprise offer created!" +msgstr "" + +#: extensions/api/exceptions.py:9 +msgid "You can't check out with an empty basket." +msgstr "" + +#: extensions/api/exceptions.py:12 +msgid "" +"We couldn't locate the identification code necessary to find one of your " +"products." +msgstr "" + +#: extensions/api/exceptions.py:15 +msgid "We couldn't find one of the products you're looking for." +msgstr "" + +#: extensions/api/exceptions.py:18 +msgid "One of the products you're trying to order is unavailable." +msgstr "" + +#: extensions/api/exceptions.py:21 +msgid "" +"We couldn't find enough information about you to perform the calculation." +msgstr "" + +#: extensions/api/serializers.py:261 +msgid "EXPIRED" +msgstr "" + +#: extensions/api/serializers.py:263 +msgid "INACTIVE" +msgstr "" + +#: extensions/api/serializers.py:264 +msgid "ACTIVE" +msgstr "" + +#: extensions/api/serializers.py:705 +msgid "Products must have a certificate type." +msgstr "" + +#: extensions/api/serializers.py:708 extensions/api/serializers.py:753 +msgid "Products must have a price." +msgstr "" + +#: extensions/api/serializers.py:715 +msgid "You need to provide a course UUID to create Course Entitlements." +msgstr "" + +#: extensions/api/serializers.py:749 +msgid "Products must indicate whether ID verification is required." +msgstr "" + +#: extensions/api/serializers.py:820 +#, python-brace-format +msgid "Invalid product class [{product_class}] requested." +msgstr "" + +#: extensions/api/serializers.py:859 +#, python-brace-format +msgid "" +"Course [{course_id}] was not published to LMS because the switch " +"[publish_course_modes_to_lms] is disabled. To avoid ghost SKUs, data has not" +" been saved." +msgstr "" + +#: extensions/api/serializers.py:1562 +msgid "Enrollment code" +msgstr "" + +#: extensions/api/serializers.py:1563 +msgid "Discount code" +msgstr "" + +#: extensions/api/serializers.py:2060 +msgid "Invalid order number or order {} does not exists." +msgstr "" + +#: extensions/api/serializers.py:2115 +msgid "New coupon voucher assignment Failure. Error: {}" +msgstr "" + +#: extensions/api/serializers.py:2133 +msgid "" +"Your order {} can not be refunded as '{}' coupon are not supported to " +"refund." +msgstr "" + +#: extensions/api/serializers.py:2164 +msgid "Could note create new voucher for the order: {}" +msgstr "" + +#: extensions/api/v2/views/baskets.py:445 extensions/basket/views.py:460 +#: extensions/iap/api/v1/views.py:131 +msgid "No SKUs provided." +msgstr "" + +#: extensions/api/v2/views/baskets.py:456 extensions/basket/views.py:467 +#, python-brace-format +msgid "Products with SKU(s) [{skus}] do not exist." +msgstr "" + +#: extensions/api/v2/views/baskets.py:467 +msgid "Provide username or is_anonymous query param, but not both" +msgstr "" + +#: extensions/api/v2/views/products.py:54 +#, python-brace-format +msgid "Product API only supports {http_method} for {product_class} products." +msgstr "" + +#: extensions/api/v2/views/products.py:69 +#, python-brace-format +msgid "Missing or bad value for: [{name}]." +msgstr "" + +#: extensions/basket/models.py:119 +#, python-brace-format +msgid "{id} - {status} basket (owner: {owner}, lines: {num_lines})" +msgstr "" + +#: extensions/basket/models.py:142 extensions/payment/models.py:28 +#: templates/oscar/basket/basket.html:9 +msgid "Basket" +msgstr "" + +#: extensions/basket/models.py:144 +msgid "Attribute Type" +msgstr "" + +#: extensions/basket/models.py:146 +msgid "Text Attribute" +msgstr "" + +#: extensions/basket/utils.py:155 +msgid "" +"Due to export controls, we cannot allow you to access this course at this " +"time." +msgstr "" + +#: extensions/basket/utils.py:245 +msgid "Click here to just purchase an enrollment for yourself" +msgstr "" + +#: extensions/basket/utils.py:248 +msgid "Click here to purchase multiple seats in this course" +msgstr "" + +#: extensions/basket/utils.py:498 +#, python-brace-format +msgid "Coupon code '{code}' has expired." +msgstr "" + +#: extensions/basket/utils.py:502 +#, python-brace-format +msgid "Coupon code '{code}' is not active." +msgstr "" + +#: extensions/basket/utils.py:508 +#, python-brace-format +msgid "Coupon code '{code}' is not available. {msg}" +msgstr "" + +#: extensions/basket/utils.py:514 +#, python-brace-format +msgid "Coupon code '{code}' is not valid for this basket." +msgstr "" + +#: extensions/basket/utils.py:527 +#, python-brace-format +msgid "" +"Coupon code '{code}' is not valid for this basket for a bundled purchase." +msgstr "" + +#: extensions/basket/utils.py:582 +#, python-brace-format +msgid "Coupon code '{code}' added to basket." +msgstr "" + +#: extensions/basket/utils.py:585 +#, python-brace-format +msgid "Basket does not qualify for coupon code {code}." +msgstr "" + +#: extensions/basket/views.py:206 +#, python-brace-format +msgid "Could not apply the code '{code}'; it requires data sharing consent." +msgstr "" + +#: extensions/basket/views.py:297 +msgid "" +"After you complete your order you will be able to select course dates from " +"your dashboard." +msgstr "" + +#: extensions/basket/views.py:312 +msgid "" +"After you complete your order you will be automatically enrolled in the " +"verified track of the course." +msgstr "" + +#: extensions/basket/views.py:316 +msgid "After you complete your order you will receive credit for your course." +msgstr "" + +#: extensions/basket/views.py:319 +msgid "" +"After you complete your order you will be automatically enrolled in the " +"course." +msgstr "" + +#: extensions/basket/views.py:323 +#, python-brace-format +msgid "" +"{paragraph_start}By purchasing, you and your organization agree to the " +"following terms:{paragraph_end} {ul_start} {li_start}Each code is valid for " +"the one course covered and can be used only one time.{li_end} {li_start}You " +"are responsible for distributing codes to your learners in your " +"organization.{li_end} {li_start}Each code will expire in one year from date " +"of purchase or, if earlier, once the course is closed.{li_end} {li_start}If " +"a course is not designated as self-paced, you should confirm that a course " +"run is available before expiration. {li_end} {li_start}You may not resell " +"codes to third parties.{li_end} {li_start}All edX for Business Sales are " +"final and not eligible for refunds.{li_end}{ul_end} {paragraph_start}You " +"will receive an email at {user_email} with your enrollment code(s). " +"{paragraph_end}" +msgstr "" + +#: extensions/basket/views.py:361 +#, python-brace-format +msgid "" +"{strong_start}Purchasing just for yourself?{strong_end}{paragraph_start}If " +"you are purchasing a single code for someone else, please continue with " +"checkout. However, if you are the learner {link_start}go back{link_end} to " +"enroll directly.{paragraph_end}" +msgstr "" + +#: extensions/basket/views.py:439 +msgid "You have already purchased these products" +msgstr "" + +#: extensions/basket/views.py:484 +msgid "No product is available to buy." +msgstr "" + +#: extensions/basket/views.py:902 +msgid "quantity successfully updated" +msgstr "" + +#: extensions/basket/views.py:921 +msgid "" +"Your basket couldn't be updated. Please correct any validation errors below." +msgstr "" + +#: extensions/basket/views.py:975 +#, python-brace-format +msgid "You have already added coupon code '{code}' to your basket." +msgstr "" + +#: extensions/basket/views.py:1051 +#, python-brace-format +msgid "Coupon code '{code}' does not exist." +msgstr "" + +#: extensions/basket/views.py:1136 +#, python-format +msgid "No coupon found with id '%s'" +msgstr "" + +#: extensions/basket/views.py:1140 +#, python-format +msgid "Coupon code '%s' was removed from your basket." +msgstr "" + +#: extensions/catalogue/models.py:70 +msgid "Last date/time on which this product can be purchased." +msgstr "" + +#: extensions/dashboard/forms.py:9 +#: templates/oscar/dashboard/refunds/refund_detail.html:50 +#: templates/oscar/dashboard/refunds/refund_list.html:60 +#: templates/oscar/dashboard/users/detail.html:40 +msgid "Username" +msgstr "" + +#: extensions/dashboard/forms.py:10 +#: templates/oscar/dashboard/refunds/refund_list.html:61 +#: templates/oscar/dashboard/users/detail.html:48 +msgid "Email" +msgstr "" + +#: extensions/dashboard/orders/views.py:74 +#, python-brace-format +msgid "" +"{link_start}Refund #{refund_id}{link_end} created! Click " +"{link_start}here{link_end} to view it." +msgstr "" + +#: extensions/dashboard/orders/views.py:78 +msgid "" +"A refund cannot be created for these lines. They may have already been " +"refunded." +msgstr "" + +#: extensions/dashboard/refunds/apps.py:13 +msgid "Refunds Dashboard" +msgstr "" + +#: extensions/dashboard/refunds/forms.py:15 +#: templates/oscar/dashboard/partials/refund_table.html:9 +#: templates/oscar/dashboard/refunds/refund_list.html:56 +msgid "Refund ID" +msgstr "" + +#: extensions/dashboard/refunds/forms.py:16 extensions/refund/models.py:72 +#: extensions/refund/models.py:316 extensions/voucher/utils.py:222 +#: extensions/voucher/utils.py:281 extensions/voucher/utils.py:318 +#: templates/oscar/dashboard/offers/offer_detail.html:118 +#: templates/oscar/dashboard/orders/line_detail.html:68 +#: templates/oscar/dashboard/orders/order_detail.html:62 +#: templates/oscar/dashboard/orders/order_detail.html:134 +#: templates/oscar/dashboard/orders/order_detail.html:625 +#: templates/oscar/dashboard/orders/order_list.html:97 +#: templates/oscar/dashboard/partials/refund_table.html:13 +#: templates/oscar/dashboard/refunds/refund_detail.html:73 +#: templates/oscar/dashboard/refunds/refund_detail.html:109 +#: templates/oscar/dashboard/refunds/refund_list.html:59 +#: templates/oscar/dashboard/users/detail.html:142 +msgid "Status" +msgstr "" + +#: extensions/dashboard/users/views.py:48 +msgid "Failed to retrieve enrollment data." +msgstr "" + +#: extensions/iap/models.py:14 +msgid "" +"Number of times to retry failing IAP client actions (e.g., payment creation," +" payment execution)" +msgstr "" + +#: extensions/iap/models.py:21 +msgid "Past number of days to fetch Android refunds for." +msgstr "" + +#: extensions/iap/models.py:27 +msgid "mobile team email" +msgstr "" + +#: extensions/iap/models.py:42 +msgid "Original Transaction ID" +msgstr "" + +#: extensions/offer/constants.py:32 +msgid "Day 3" +msgstr "" + +#: extensions/offer/constants.py:33 +msgid "Day 10" +msgstr "" + +#: extensions/offer/constants.py:34 +msgid "Day 19" +msgstr "" + +#: extensions/offer/constants.py:40 +msgid "Assign" +msgstr "" + +#: extensions/offer/constants.py:41 +msgid "Remind" +msgstr "" + +#: extensions/offer/constants.py:42 +msgid "Revoke" +msgstr "" + +#: extensions/offer/constants.py:77 +msgid "Automatic" +msgstr "" + +#: extensions/offer/constants.py:78 +msgid "Manual" +msgstr "" + +#: extensions/offer/models.py:447 +msgid "Course Catalog ID from the Discovery Service." +msgstr "" + +#: extensions/offer/models.py:458 +msgid "UUID for an EnterpriseCustomerCatalog from the Enterprise Service." +msgstr "" + +#: extensions/offer/models.py:590 +msgid "EnterpriseCustomer Name" +msgstr "" + +#: extensions/offer/models.py:595 +msgid "EnterpriseCustomerCatalog UUID" +msgstr "" + +#: extensions/offer/models.py:600 extensions/voucher/utils.py:53 +#: extensions/voucher/utils.py:190 extensions/voucher/utils.py:270 +#: extensions/voucher/utils.py:326 extensions/voucher/utils.py:335 +#: extensions/voucher/utils.py:341 programs/forms.py:22 +#: programs/templates/programs/programoffer_list.html:30 +msgid "Program UUID" +msgstr "" + +#: extensions/offer/models.py:613 +msgid "Email to user pending." +msgstr "" + +#: extensions/offer/models.py:614 +msgid "Code successfully assigned to user." +msgstr "" + +#: extensions/offer/models.py:615 +msgid "Code has been redeemed by user." +msgstr "" + +#: extensions/offer/models.py:616 +msgid "Email to user bounced." +msgstr "" + +#: extensions/offer/models.py:617 +msgid "Code has been revoked for this user." +msgstr "" + +#: extensions/offer/models.py:663 +msgid "Make a particular template version active." +msgstr "" + +#: extensions/offer/models.py:883 +msgid "Email has been sent." +msgstr "" + +#: extensions/offer/models.py:884 +msgid "This user should receive email" +msgstr "" + +#: extensions/offer/utils.py:97 +#, python-brace-format +msgid "{benefit_value}%" +msgstr "" + +#: extensions/offer/utils.py:100 +#, python-brace-format +msgid "${benefit_value}" +msgstr "" + +#. Translators: "Waffle" is the name of a third-party library. It should not +#. be translated +#: extensions/order/admin.py:35 +#, python-brace-format +msgid "" +"Order administration has been disabled due to the load on the database. This" +" functionality can be restored by activating the {switch_name} Waffle " +"switch. Be careful when re-activating this switch!" +msgstr "" + +#: extensions/order/benefits.py:22 +#, python-format +msgid "%d%% discount for manual course enrollment order" +msgstr "" + +#: extensions/order/models.py:39 extensions/payment/models.py:26 +msgid "Payment Processor" +msgstr "" + +#: extensions/order/models.py:51 +msgid "" +"It expect that the order numbers stuck in fulfillment error state will be" +" provided in a txt file format one per line." +msgstr "" + +#: extensions/partner/admin.py:28 +msgid "Click 'Save and Continue Editing' to add stock records" +msgstr "" + +#: extensions/partner/models.py:22 +#: templates/oscar/dashboard/catalogue/product_update.html:193 +#: templates/oscar/dashboard/orders/line_detail.html:71 +msgid "Partner" +msgstr "" + +#: extensions/partner/models.py:23 settings/_oscar.py:276 +msgid "Partners" +msgstr "" + +#: extensions/payment/constants.py:8 +msgid "American Express" +msgstr "" + +#: extensions/payment/constants.py:14 +msgid "Diners" +msgstr "" + +#: extensions/payment/constants.py:18 +msgid "Discover" +msgstr "" + +#: extensions/payment/constants.py:24 +msgid "JCB" +msgstr "" + +#: extensions/payment/constants.py:28 +msgid "MasterCard" +msgstr "" + +#: extensions/payment/constants.py:34 +msgid "UnionPay" +msgstr "" + +#: extensions/payment/constants.py:38 +msgid "Unknown" +msgstr "" + +#: extensions/payment/constants.py:42 +msgid "Visa" +msgstr "" + +#: extensions/payment/exceptions.py:8 +msgid "We don't support the payment option you selected." +msgstr "" + +#: extensions/payment/forms.py:31 +msgid "Choose country" +msgstr "" + +#. Translators: This is a string added next to the name of the required +#. fields on the payment form. For example, the first name field is +#. required, so this would read "First name (required)". +#: extensions/payment/forms.py:105 +#, python-brace-format +msgid "{label} (required)" +msgstr "" + +#: extensions/payment/forms.py:111 +msgid "Organization (required)" +msgstr "" + +#: extensions/payment/forms.py:124 +msgid "" +"I am purchasing on behalf of my employer or other professional organization" +msgstr "" + +#: extensions/payment/forms.py:141 extensions/payment/forms.py:218 +#: extensions/payment/views/__init__.py:87 +msgid "" +"There was a problem retrieving your basket. Refresh the page to try again." +msgstr "" + +#: extensions/payment/forms.py:144 +msgid "First Name (required)" +msgstr "" + +#: extensions/payment/forms.py:145 +msgid "Last Name (required)" +msgstr "" + +#: extensions/payment/forms.py:146 +msgid "Address (required)" +msgstr "" + +#: extensions/payment/forms.py:147 +msgid "Suite/Apartment Number" +msgstr "" + +#: extensions/payment/forms.py:148 +msgid "City (required)" +msgstr "" + +#: extensions/payment/forms.py:151 +msgid "State/Province" +msgstr "" + +#: extensions/payment/forms.py:152 +msgid "Zip/Postal Code" +msgstr "" + +#: extensions/payment/forms.py:153 +msgid "Country (required)" +msgstr "" + +#: extensions/payment/forms.py:180 extensions/payment/forms.py:182 +#: extensions/payment/forms.py:193 +msgid "This field is required." +msgstr "" + +#: extensions/payment/forms.py:199 +msgid "" +"Postal codes for the U.S. and Canada are limited to nine (9) characters." +msgstr "" + +#: extensions/payment/models.py:27 +msgid "Transaction ID" +msgstr "" + +#: extensions/payment/models.py:36 +msgid "Payment Processor Response" +msgstr "" + +#: extensions/payment/models.py:37 +msgid "Payment Processor Responses" +msgstr "" + +#: extensions/payment/models.py:54 +msgid "" +"Number of times to retry failing Paypal client actions (e.g., payment " +"creation, payment execution)" +msgstr "" + +#: extensions/payment/models.py:112 +msgid "More than 10 digits before the decimal not allowed for fixed value." +msgstr "" + +#: extensions/payment/models.py:118 +msgid "More than 2 digits after the decimal not allowed for fixed value." +msgstr "" + +#: extensions/payment/models.py:126 +msgid "Percentage greater than 100 not allowed." +msgstr "" + +#. Translators: This is a string placed in the middle of a truncated string +#. to indicate that truncation has occurred. For example, if a title may only +#. be at most 11 characters long, "A Very Long Title" (17 characters) would be +#. truncated to "A Ve...itle". +#: extensions/payment/utils.py:77 +msgid "..." +msgstr "" + +#: extensions/payment/views/cybersource.py:368 +msgid "transaction declined" +msgstr "" + +#. Translators: "Waffle" is the name of a third-party library. It should not +#. be translated +#: extensions/refund/admin.py:36 +#, python-brace-format +msgid "" +"Refund administration has been disabled due to the load on the database. " +"This functionality can be restored by activating the {switch_name} Waffle " +"switch. Be careful when re-activating this switch!" +msgstr "" + +#: extensions/refund/models.py:67 +msgid "Order" +msgstr "" + +#: extensions/refund/models.py:68 +#: templates/oscar/dashboard/orders/order_detail.html:707 +msgid "User" +msgstr "" + +#: extensions/refund/models.py:69 +msgid "Total Credit (excl. tax)" +msgstr "" + +#: extensions/refund/models.py:70 +#: templates/oscar/dashboard/catalogue/product_update.html:200 +msgid "Currency" +msgstr "" + +#: extensions/refund/models.py:308 +msgid "Refund" +msgstr "" + +#: extensions/refund/models.py:311 +msgid "Order Line" +msgstr "" + +#: extensions/refund/models.py:313 +msgid "Line Credit (excl. tax)" +msgstr "" + +#: extensions/refund/models.py:314 templates/edx/checkout/receipt.html:103 +#: templates/oscar/basket/partials/client_side_checkout_basket.html:30 +#: templates/oscar/basket/partials/client_side_checkout_basket.html:51 +#: templates/oscar/basket/partials/hosted_checkout_basket.html:43 +#: templates/oscar/dashboard/orders/line_detail.html:47 +#: templates/oscar/dashboard/orders/line_detail.html:105 +#: templates/oscar/dashboard/orders/line_detail.html:130 +#: templates/oscar/dashboard/orders/line_detail.html:161 +#: templates/oscar/dashboard/orders/order_detail.html:131 +#: templates/oscar/dashboard/refunds/refund_detail.html:106 +msgid "Quantity" +msgstr "" + +#: extensions/voucher/models.py:40 +msgid "Can be used once by one customer" +msgstr "" + +#: extensions/voucher/models.py:41 +msgid "Can be used multiple times by multiple customers" +msgstr "" + +#: extensions/voucher/models.py:42 +msgid "Can only be used once per customer" +msgstr "" + +#: extensions/voucher/models.py:43 +msgid "Can be used multiple times by one customer" +msgstr "" + +#: extensions/voucher/models.py:45 +msgid "Usage" +msgstr "" + +#: extensions/voucher/models.py:48 +msgid "Is Public Code Batch" +msgstr "" + +#: extensions/voucher/models.py:49 +msgid "Should this code batch be public or private for assignment." +msgstr "" + +#: extensions/voucher/models.py:63 +msgid "This voucher is assigned to another user." +msgstr "" + +#: extensions/voucher/utils.py:53 extensions/voucher/utils.py:192 +#: extensions/voucher/utils.py:271 extensions/voucher/utils.py:329 +#: extensions/voucher/utils.py:332 extensions/voucher/utils.py:337 +msgid "Catalog Query" +msgstr "" + +#: extensions/voucher/utils.py:55 extensions/voucher/utils.py:285 +#: extensions/voucher/utils.py:340 +msgid "Redeemed For Course IDs" +msgstr "" + +#: extensions/voucher/utils.py:57 extensions/voucher/utils.py:284 +#: extensions/voucher/utils.py:331 extensions/voucher/utils.py:339 +msgid "Redeemed For Course ID" +msgstr "" + +#: extensions/voucher/utils.py:76 extensions/voucher/utils.py:318 +msgid "Redeemed" +msgstr "" + +#: extensions/voucher/utils.py:76 +#: templates/oscar/dashboard/offers/offer_detail.html:132 +#: templates/oscar/dashboard/users/detail.html:52 +msgid "Active" +msgstr "" + +#: extensions/voucher/utils.py:78 +#: templates/oscar/dashboard/offers/offer_detail.html:134 +msgid "Inactive" +msgstr "" + +#: extensions/voucher/utils.py:95 extensions/voucher/utils.py:161 +#: templates/edx/checkout/receipt.html:135 +#: templates/oscar/dashboard/orders/order_detail.html:180 +#: templates/oscar/dashboard/orders/order_detail.html:198 +#: templates/oscar/dashboard/orders/order_detail.html:236 +msgid "Discount" +msgstr "" + +#: extensions/voucher/utils.py:95 extensions/voucher/utils.py:161 +msgid "Enrollment" +msgstr "" + +#: extensions/voucher/utils.py:96 extensions/voucher/utils.py:165 +#, python-brace-format +msgid "{percentage} %" +msgstr "" + +#: extensions/voucher/utils.py:171 extensions/voucher/utils.py:219 +#: extensions/voucher/utils.py:263 +#: templates/oscar/dashboard/offers/offer_detail.html:117 +msgid "Code" +msgstr "" + +#: extensions/voucher/utils.py:171 +msgid "This row applies to all vouchers" +msgstr "" + +#: extensions/voucher/utils.py:172 extensions/voucher/utils.py:275 +#: templates/oscar/dashboard/catalogue/product_update.html:126 +msgid "Category" +msgstr "" + +#: extensions/voucher/utils.py:173 extensions/voucher/utils.py:288 +msgid "Coupon Expiry Date" +msgstr "" + +#: extensions/voucher/utils.py:174 extensions/voucher/utils.py:264 +msgid "Coupon Name" +msgstr "" + +#: extensions/voucher/utils.py:175 extensions/voucher/utils.py:287 +msgid "Coupon Start Date" +msgstr "" + +#: extensions/voucher/utils.py:176 extensions/voucher/utils.py:267 +msgid "Coupon Type" +msgstr "" + +#: extensions/voucher/utils.py:177 extensions/voucher/utils.py:286 +msgid "Create Date" +msgstr "" + +#: extensions/voucher/utils.py:178 extensions/voucher/utils.py:279 +msgid "Discount Percentage" +msgstr "" + +#: extensions/voucher/utils.py:179 extensions/voucher/utils.py:280 +msgid "Discount Amount" +msgstr "" + +#: extensions/voucher/utils.py:180 extensions/voucher/utils.py:289 +msgid "Email Domains" +msgstr "" + +#: extensions/voucher/utils.py:181 extensions/voucher/utils.py:278 +msgid "Invoiced Amount" +msgstr "" + +#: extensions/voucher/utils.py:182 extensions/voucher/utils.py:276 +msgid "Note" +msgstr "" + +#: extensions/voucher/utils.py:183 extensions/voucher/utils.py:277 +#: templates/oscar/basket/partials/client_side_checkout_basket.html:50 +#: templates/oscar/basket/partials/client_side_checkout_basket.html:61 +#: templates/oscar/basket/partials/hosted_checkout_basket.html:63 +msgid "Price" +msgstr "" + +#: extensions/voucher/utils.py:187 extensions/voucher/utils.py:269 +#: extensions/voucher/utils.py:327 extensions/voucher/utils.py:333 +#: templates/oscar/dashboard/partials/enrollment_table.html:8 +msgid "Course ID" +msgstr "" + +#: extensions/voucher/utils.py:188 extensions/voucher/utils.py:273 +#: extensions/voucher/utils.py:328 extensions/voucher/utils.py:334 +msgid "Organization" +msgstr "" + +#: extensions/voucher/utils.py:193 extensions/voucher/utils.py:272 +#: extensions/voucher/utils.py:330 extensions/voucher/utils.py:338 +msgid "Course Seat Types" +msgstr "" + +#: extensions/voucher/utils.py:220 extensions/voucher/utils.py:265 +#: extensions/voucher/utils.py:321 +msgid "Maximum Coupon Usage" +msgstr "" + +#: extensions/voucher/utils.py:221 extensions/voucher/utils.py:266 +#: extensions/voucher/utils.py:322 +msgid "Redemption Count" +msgstr "" + +#: extensions/voucher/utils.py:223 extensions/voucher/utils.py:268 +msgid "URL" +msgstr "" + +#: extensions/voucher/utils.py:274 extensions/voucher/utils.py:297 +msgid "Client" +msgstr "" + +#: extensions/voucher/utils.py:282 extensions/voucher/utils.py:302 +#: extensions/voucher/utils.py:319 +#: templates/oscar/dashboard/users/detail.html:138 +msgid "Order Number" +msgstr "" + +#: extensions/voucher/utils.py:283 extensions/voucher/utils.py:302 +#: extensions/voucher/utils.py:320 +msgid "Redeemed By Username" +msgstr "" + +#: extensions/voucher/utils.py:786 +#, python-brace-format +msgid "Range for coupon [{coupon_id}]" +msgstr "" + +#: extensions/voucher/views.py:31 +#, python-brace-format +msgid "Coupon Report for {coupon_name}" +msgstr "" + +#: extensions/voucher/views.py:40 +msgid "" +"Failed to find a matching stock record for coupon, report download canceled." +msgstr "" + +#: invoice/models.py:13 +msgid "Not Paid" +msgstr "" + +#: invoice/models.py:14 +msgid "Paid" +msgstr "" + +#: invoice/models.py:18 +msgid "Prepaid" +msgstr "" + +#: invoice/models.py:19 +msgid "Postpaid" +msgstr "" + +#: invoice/models.py:20 +msgid "Bulk purchase" +msgstr "" + +#: invoice/models.py:21 +msgid "Not applicable" +msgstr "" + +#: invoice/models.py:26 +msgid "Fixed" +msgstr "" + +#: management/templates/management/index.html:7 +msgid "Management View" +msgstr "" + +#: management/templates/management/index.html:26 +msgid "Refund Transactions" +msgstr "" + +#: management/views.py:53 +#, python-brace-format +msgid "{action} is not a valid action." +msgstr "" + +#: programs/benefits.py:27 +#, python-brace-format +msgid "{value}% program discount" +msgstr "" + +#: programs/benefits.py:44 +#, python-brace-format +msgid "{value} fixed-price program discount" +msgstr "" + +#: programs/forms.py:70 +msgid "An offer already exists for this program." +msgstr "" + +#: programs/forms.py:90 +#, python-brace-format +msgid "{current_date} Discount for the {program_title} {program_type} Program" +msgstr "" + +#: programs/templates/programs/programoffer_form.html:9 +#, python-format +msgid "Edit Program Offer: %(program_title)s" +msgstr "" + +#: programs/templates/programs/programoffer_form.html:14 +#: programs/templates/programs/programoffer_form.html:47 +#: programs/templates/programs/programoffer_form.html:60 +#: programs/templates/programs/programoffer_list.html:20 +msgid "Create Program Offer" +msgstr "" + +#: programs/templates/programs/programoffer_form.html:30 +#: programs/templates/programs/programoffer_list.html:6 +#: programs/templates/programs/programoffer_list.html:17 +#: templates/edx/partials/_administration_menu.html:11 +msgid "Program Offers" +msgstr "" + +#: programs/templates/programs/programoffer_form.html:45 +msgid "Edit Program Offer" +msgstr "" + +#: programs/templates/programs/programoffer_form.html:76 +#: programs/templates/programs/programoffer_list.html:60 +#, python-format +msgid "" +"\n" +" %(platform_name)s Program Offer Administration Tool\n" +" " +msgstr "" + +#: programs/templates/programs/programoffer_list.html:26 +msgid "Current program offers" +msgstr "" + +#: programs/templates/programs/programoffer_list.html:29 +msgid "Program Title" +msgstr "" + +#: programs/views.py:38 +msgid "Program offer updated!" +msgstr "" + +#: programs/views.py:61 +msgid "Program offer created!" +msgstr "" + +#: referrals/models.py:26 +msgid "Affiliate ID" +msgstr "" + +#: referrals/models.py:27 +msgid "UTM Source" +msgstr "" + +#: referrals/models.py:28 +msgid "UTM Medium" +msgstr "" + +#: referrals/models.py:29 +msgid "UTM Campaign" +msgstr "" + +#: referrals/models.py:30 +msgid "UTM Term" +msgstr "" + +#: referrals/models.py:31 +msgid "UTM Content" +msgstr "" + +#: referrals/models.py:32 +msgid "UTM Created At" +msgstr "" + +#: settings/_oscar.py:233 +#: templates/oscar/dashboard/catalogue/category_form.html:15 +#: templates/oscar/dashboard/catalogue/product_update.html:18 +#: templates/oscar/dashboard/index.html:22 +#: templates/oscar/dashboard/offers/offer_detail.html:14 +#: templates/oscar/dashboard/orders/line_detail.html:14 +#: templates/oscar/dashboard/orders/order_detail.html:14 +#: templates/oscar/dashboard/orders/order_list.html:16 +#: templates/oscar/dashboard/refunds/refund_detail.html:31 +#: templates/oscar/dashboard/refunds/refund_list.html:30 +#: templates/oscar/dashboard/users/detail.html:20 +msgid "Dashboard" +msgstr "" + +#: settings/_oscar.py:238 +msgid "Catalogue" +msgstr "" + +#: settings/_oscar.py:242 +#: templates/oscar/dashboard/catalogue/product_update.html:12 +#: templates/oscar/dashboard/catalogue/product_update.html:21 +msgid "Products" +msgstr "" + +#: settings/_oscar.py:246 +msgid "Product Types" +msgstr "" + +#: settings/_oscar.py:250 +#: templates/oscar/dashboard/catalogue/category_form.html:8 +#: templates/oscar/dashboard/catalogue/category_form.html:18 +#: templates/oscar/dashboard/catalogue/product_update.html:75 +msgid "Categories" +msgstr "" + +#: settings/_oscar.py:254 +msgid "Ranges" +msgstr "" + +#: settings/_oscar.py:258 +msgid "Low stock alerts" +msgstr "" + +#: settings/_oscar.py:264 +msgid "Fulfillment" +msgstr "" + +#: settings/_oscar.py:268 templates/oscar/dashboard/index.html:33 +#: templates/oscar/dashboard/orders/line_detail.html:15 +#: templates/oscar/dashboard/orders/order_detail.html:15 +#: templates/oscar/dashboard/orders/order_list.html:10 +#: templates/oscar/dashboard/orders/order_list.html:17 +#: templates/oscar/dashboard/orders/order_list.html:24 +#: templates/oscar/dashboard/users/detail.html:120 +#: templates/oscar/dashboard/users/detail.html:134 +msgid "Orders" +msgstr "" + +#: settings/_oscar.py:272 +msgid "Statistics" +msgstr "" + +#: settings/_oscar.py:280 +#: templates/oscar/dashboard/orders/order_detail.html:91 +#: templates/oscar/dashboard/partials/refund_table.html:5 +#: templates/oscar/dashboard/refunds/refund_detail.html:32 +#: templates/oscar/dashboard/refunds/refund_list.html:11 +#: templates/oscar/dashboard/refunds/refund_list.html:31 +#: templates/oscar/dashboard/refunds/refund_list.html:38 +#: templates/oscar/dashboard/users/detail.html:121 +msgid "Refunds" +msgstr "" + +#: settings/_oscar.py:286 settings/_oscar.py:290 +#: templates/oscar/dashboard/users/detail.html:23 +msgid "Customers" +msgstr "" + +#: settings/_oscar.py:294 +msgid "Stock alert requests" +msgstr "" + +#: settings/_oscar.py:300 settings/_oscar.py:304 +#: templates/oscar/dashboard/offers/offer_detail.html:15 +msgid "Offers" +msgstr "" + +#: settings/_oscar.py:308 +msgid "Vouchers" +msgstr "" + +#: settings/_oscar.py:314 +msgid "Reports" +msgstr "" + +#: settings/base.py:93 +msgid "English" +msgstr "" + +#: settings/base.py:94 +msgid "Spanish" +msgstr "" + +#: settings/base.py:95 +msgid "Spanish (Latin American)" +msgstr "" + +#: templates/base.html:10 +msgid "Build" +msgstr "" + +#: templates/base.html:71 +msgid "Version:" +msgstr "" + +#: templates/coupons/_offer_error.html:4 templates/coupons/offer.html:5 +#: templates/edx/email_confirmation_required.html:4 +msgid "Redeem" +msgstr "" + +#: templates/coupons/coupon_app.html:5 +msgid "Coupon Codes" +msgstr "" + +#: templates/coupons/offer.html:18 +msgid "" +"Earn a verified certificate in one of our popular courses to advance your " +"career, showcase your accomplishments or enhance your college application." +msgstr "" + +#: templates/coupons/offer.html:22 +msgid "Why buy a verified certificate?" +msgstr "" + +#: templates/coupons/offer.html:27 +msgid "" +"A verified certificate (digital) confirming that a user has completed the " +"course on a specified date. The certificate includes edX's logo and the " +"university's logo, as well as signatures from faculty members involved with " +"the course. There is also a URL that can be used to verify the authenticity " +"of the certificate." +msgstr "" + +#: templates/coupons/offer.html:30 +msgid "" +"A verified certificate demonstrates to future employers that you've mastered" +" the course material." +msgstr "" + +#: templates/coupons/offer.html:32 +msgid "" +"The certificate is officially signed and stamped by the institution that " +"offers the course." +msgstr "" + +#: templates/coupons/offer.html:34 +msgid "" +"You're twelve times more likely to complete the course if you're working " +"toward a verified certificate." +msgstr "" + +#: templates/courses/course_app.html:5 +#: templates/edx/partials/_administration_menu.html:5 +msgid "Courses" +msgstr "" + +#: templates/courses/course_app.html:27 +#, python-format +msgid "" +"\n" +" %(platform_name)s Course Administration Tool\n" +" " +msgstr "" + +#: templates/courses/menu_options.html:8 +msgid "Student Dashboard" +msgstr "" + +#: templates/courses/menu_options.html:11 +msgid "Course Admin Tool" +msgstr "" + +#: templates/courses/menu_options.html:14 +msgid "E-Commerce Dashboard" +msgstr "" + +#: templates/edx/base_menu.html:7 +msgid "Sign Out" +msgstr "" + +#: templates/edx/checkout/receipt.html:13 +#, python-format +msgid "Receipt for %(order_number)s" +msgstr "" + +#: templates/edx/checkout/receipt.html:43 +msgid "Thank you for your order!" +msgstr "" + +#: templates/edx/checkout/receipt.html:53 +#, python-brace-format +msgid "" +"Your order is complete. You will receive a confirmation message and your " +"enrollment code(s) at {link_start}{email}{link_end}. If you need a receipt, " +"you can print this page." +msgstr "" + +#: templates/edx/checkout/receipt.html:60 +#, python-brace-format +msgid "" +"Your order is complete. If you need a receipt, you can print this page. " +"{next_start} Next Steps:{next_end} 1. Check your inbox for an order " +"confirmation email from Get Smarter.{next_line} 2: Follow the instructions " +"in the email to complete your registration." +msgstr "" + +#: templates/edx/checkout/receipt.html:68 +msgid "" +"Your order is complete. If you need a receipt, you can print this page." +msgstr "" + +#: templates/edx/checkout/receipt.html:87 +msgid "Order Number:" +msgstr "" + +#: templates/edx/checkout/receipt.html:90 +msgid "Payment Method:" +msgstr "" + +#: templates/edx/checkout/receipt.html:93 +msgid "Order Date:" +msgstr "" + +#: templates/edx/checkout/receipt.html:99 +msgid "Order Information" +msgstr "" + +#: templates/edx/checkout/receipt.html:104 +#: templates/oscar/dashboard/offers/offer_detail.html:67 +#: templates/oscar/dashboard/offers/summary.html:12 +msgid "Description" +msgstr "" + +#: templates/edx/checkout/receipt.html:105 +#: templates/oscar/basket/partials/hosted_checkout_basket.html:39 +msgid "Item Price" +msgstr "" + +#: templates/edx/checkout/receipt.html:109 +#: templates/oscar/dashboard/refunds/refund_detail.html:182 +msgid "Quantity:" +msgstr "" + +#: templates/edx/checkout/receipt.html:111 +msgid "Description:" +msgstr "" + +#: templates/edx/checkout/receipt.html:120 +msgid "Item Price:" +msgstr "" + +#: templates/edx/checkout/receipt.html:126 +#: templates/oscar/basket/partials/client_side_checkout_basket.html:52 +msgid "Subtotal" +msgstr "" + +#: templates/edx/checkout/receipt.html:142 +#, python-format +msgid "%(voucher_discount_amount)s off" +msgstr "" + +#: templates/edx/checkout/receipt.html:152 +#, python-format +msgid "Discount of type %(type)s provided by %(enterprise_name)s" +msgstr "" + +#: templates/edx/checkout/receipt.html:157 +msgid "Discount for your first upgrade" +msgstr "" + +#: templates/edx/checkout/receipt.html:160 +#, python-format +msgid "Discount of type %(type)s is provided." +msgstr "" + +#: templates/edx/checkout/receipt.html:174 +#, python-format +msgid "Courtesy of %(enterprise_name)s." +msgstr "" + +#: templates/edx/checkout/receipt.html:187 +msgid "Total" +msgstr "" + +#: templates/edx/checkout/receipt.html:194 +msgid "Get Your Course Credit" +msgstr "" + +#: templates/edx/checkout/receipt.html:196 +#, python-brace-format +msgid "" +"To receive academic credit for this course, you must apply for credit at the" +" organization that offers the credit. You can find a link to the " +"organization’s website on your " +"{link_start}{lms_dashboard_url}{link_middle}dashboard{link_end}, next to the" +" course name." +msgstr "" + +#: templates/edx/checkout/receipt.html:210 +msgid "Go to dashboard" +msgstr "" + +#: templates/edx/checkout/receipt.html:213 +msgid "Find more courses" +msgstr "" + +#: templates/edx/checkout/receipt_not_found.html:7 +msgid "Order Not Found" +msgstr "" + +#: templates/edx/checkout/receipt_not_found.html:19 +#, python-format +msgid " %(error_summary)s " +msgstr "" + +#: templates/edx/checkout/receipt_not_found.html:23 +msgid "" +"The specified order could not be located. Please ensure that the URL is " +"correct, and try again." +msgstr "" + +#: templates/edx/checkout/receipt_not_found.html:31 +#, python-brace-format +msgid "" +"\n" +" You may also view your previous orders on the {link_start}{order_history_url}{link_middle}{link_end}Account Settings{link_end}\n" +" page.\n" +" " +msgstr "" + +#: templates/edx/credit/_provider_detail.html:8 +msgid "Select" +msgstr "" + +#: templates/edx/credit/_provider_detail.html:16 +msgid "Credits: " +msgstr "" + +#: templates/edx/credit/_provider_detail.html:17 +msgid "Price: " +msgstr "" + +#: templates/edx/credit/_provider_detail.html:27 +#, python-format +msgid "" +"\n" +" Learn more about %(display_name)s credit?\n" +" " +msgstr "" + +#: templates/edx/credit/_provider_detail.html:47 +#, python-format +msgid "" +"\n" +" Credit available until %(date)s\n" +" " +msgstr "" + +#: templates/edx/credit/checkout.html:9 +#, python-format +msgid "Purchase Credit for %(course_name)s" +msgstr "" + +#: templates/edx/credit/checkout.html:27 +#, python-format +msgid "" +"\n" +" Purchase Credit for %(course_name)s\n" +" " +msgstr "" + +#: templates/edx/credit/checkout.html:34 +#, python-format +msgid "" +"\n" +" Congratulations! You are eligible to purchase academic course credit for this course.\n" +" You must purchase your credit before %(date)s.\n" +" Select one of the following institutions to purchase your credit.\n" +" " +msgstr "" + +#: templates/edx/credit/checkout.html:51 +msgid "Price:" +msgstr "" + +#: templates/edx/credit/checkout.html:55 +msgid "Discount:" +msgstr "" + +#: templates/edx/credit/checkout.html:60 +#: templates/oscar/basket/partials/hosted_checkout_basket.html:127 +msgid "Total:" +msgstr "" + +#: templates/edx/credit/checkout.html:89 +msgid "You deserve it." +msgstr "" + +#: templates/edx/credit/checkout.html:92 +msgid "" +"The hard work is over - you passed the course! Now get the credit you " +"deserve to start or complete a degree." +msgstr "" + +#: templates/edx/credit/checkout.html:98 +msgid "It's affordable." +msgstr "" + +#: templates/edx/credit/checkout.html:101 +msgid "" +"The credit offered through edX generally costs less than the same credit at " +"most institutions." +msgstr "" + +#: templates/edx/credit/checkout.html:107 +msgid "It opens doors." +msgstr "" + +#: templates/edx/credit/checkout.html:110 +msgid "" +"Many of today's most in-demand jobs require a college degree. Start your " +"path to success!" +msgstr "" + +#: templates/edx/credit/checkout.html:118 +msgid "Questions?" +msgstr "" + +#: templates/edx/credit/checkout.html:121 +#, python-brace-format +msgid "" +"\n" +" Please read {link_start}our FAQs to view common questions about our certificates.{link_end}\n" +" " +msgstr "" + +#: templates/edx/email_confirmation_required.html:16 +msgid "You are enrolling in: " +msgstr "" + +#: templates/edx/email_confirmation_required.html:26 +#, python-format +msgid "" +"An email has been sent to %(user_email)s with a link for you to activate " +"your account." +msgstr "" + +#: templates/edx/email_confirmation_required.html:29 +msgid "Why activate?" +msgstr "" + +#: templates/edx/email_confirmation_required.html:31 +msgid "" +"We ask you to activate your account to ensure it is really you creating the " +"account and to prevent fraud." +msgstr "" + +#: templates/edx/error.html:17 +msgid "If you need assistance, contact edX support." +msgstr "" + +#: templates/edx/partials/_administration_menu.html:6 +msgid "Coupons" +msgstr "" + +#: templates/edx/partials/_administration_menu.html:8 +msgid "Enterprise Coupons" +msgstr "" + +#: templates/edx/partials/_base_navbar.html:10 +msgid "Toggle navigation" +msgstr "" + +#: templates/edx/partials/_base_navbar.html:25 +msgid "Dashboard for:" +msgstr "" + +#: templates/edx/partials/_base_navbar.html:32 +msgid "Toggle Dropdown" +msgstr "" + +#: templates/edx/partials/_base_navbar.html:40 +#: templates/edx/partials/_base_navbar.html:41 +msgid "Login" +msgstr "" + +#: templates/edx/partials/_staff_navbar.html:9 +msgid "E-Commerce Course Administration" +msgstr "" + +#: templates/edx/partials/_staff_navbar.html:14 +msgid "E-Commerce Coupon Administration" +msgstr "" + +#: templates/edx/partials/_staff_navbar.html:19 +msgid "E-Commerce Program Offers Administration" +msgstr "" + +#: templates/oscar/basket/basket.html:48 +msgid "Your basket is empty" +msgstr "" + +#: templates/oscar/basket/basket.html:49 +#, python-brace-format +msgid "" +"\n" +" If you attempted to make a purchase, you have not been charged. Return to your {link_start}{link_middle}{homepage_url}dashboard{link_end} to try\n" +" again, or {link_start}{homepage_url}{link_middle}contact {platform_name} Support{link_end}.\n" +" " +msgstr "" + +#: templates/oscar/basket/messages/new_total.html:7 +msgid "Your basket is now empty" +msgstr "" + +#: templates/oscar/basket/messages/new_total.html:10 +#: templates/oscar/basket/messages/new_total.html:16 +#, python-brace-format +msgid "" +"\n" +" {strong_start}We’ve updated your quantity.{strong_end}\n" +" {paragraph_start}Your cart includes {num_items} enrollment codes at a total cost of {total}, that you will receive via email.{paragraph_end}\n" +" " +msgstr "" + +#: templates/oscar/basket/messages/new_total.html:27 +msgid "View basket" +msgstr "" + +#: templates/oscar/basket/messages/new_total.html:28 +msgid "Checkout now" +msgstr "" + +#: templates/oscar/basket/partials/add_voucher_form.html:11 +msgid "Applying..." +msgstr "" + +#: templates/oscar/basket/partials/add_voucher_form.html:16 +msgid "Apply" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:16 +msgid "in your cart" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:17 +msgid "Your purchase contains the following" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:36 +#: templates/oscar/basket/partials/hosted_checkout_basket.html:57 +msgid "Updating..." +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:36 +#: templates/oscar/basket/partials/hosted_checkout_basket.html:57 +#: templates/oscar/dashboard/orders/order_detail.html:541 +msgid "Update" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:47 +msgid "summary" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:68 +msgid "Discounts applied" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:80 +#, python-format +msgid "" +"\n" +" %(benefit)s discount provided by %(enterprise_customer_name)s.\n" +" " +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:87 +#, python-format +msgid "" +"\n" +" %(benefit)s%% discount for your first upgrade applied.\n" +" " +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:104 +#, python-format +msgid "" +"\n" +" Coupon %(voucher_code)s applied for %(total_benefit)s off\n" +" " +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:110 +msgid "Remove coupon" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:119 +msgid "Add coupon code" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:119 +msgid "(optional)" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:128 +msgid "TOTAL" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:135 +msgid "order details" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:153 +msgid "select payment method" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:155 +msgid "Pay with a Credit Card" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:166 +msgid "Pay with PayPal" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:175 +msgid "Pay with Apple Pay" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:190 +msgid "card holder information" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:201 +msgid "billing information" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:203 +msgid "Credit cards" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:210 +msgid "Card Number (required)" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:210 +#: templates/oscar/basket/partials/client_side_checkout_basket.html:220 +msgid "Secure" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:213 +msgid "Credit card icon" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:219 +msgid "Security Code (required)" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:223 +msgid "Help with CVV" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:226 +msgid "" +"The three last digits in the signature area on the back of your card. For " +"American Express, it is the four digits on the front of the card." +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:233 +msgid "Expiration (required)" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:237 +msgid "Month" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:247 +msgid "Year" +msgstr "" + +#: templates/oscar/basket/partials/client_side_checkout_basket.html:264 +#: templates/oscar/basket/partials/client_side_checkout_basket.html:274 +#: templates/oscar/basket/partials/hosted_checkout_basket.html:152 +msgid "Place Order" +msgstr "" + +#: templates/oscar/basket/partials/hosted_checkout_basket.html:23 +msgid "Earn a valuable certificate to showcase the skills you learn in" +msgstr "" + +#: templates/oscar/basket/partials/hosted_checkout_basket.html:70 +#, python-format +msgid "" +"\n" +" %(benefit_value)s off\n" +" " +msgstr "" + +#: templates/oscar/basket/partials/hosted_checkout_basket.html:99 +#, python-format +msgid "" +"\n" +" Coupon code %(voucher_code)s applied\n" +" " +msgstr "" + +#: templates/oscar/basket/partials/hosted_checkout_basket.html:116 +msgid "Apply a coupon code" +msgstr "" + +#: templates/oscar/basket/partials/hosted_checkout_basket.html:164 +#, python-format +msgid "Checkout with %(title)s" +msgstr "" + +#: templates/oscar/basket/partials/hosted_checkout_basket.html:166 +msgid "Checkout" +msgstr "" + +#. Translators: tags will bold the text within. Keep the +#. tags and translate the text within. +#: templates/oscar/basket/partials/hosted_checkout_basket.html:179 +#, python-brace-format +msgid "" +"{strong_start}Note:{strong_end} To complete your enrollment, select Checkout" +" or Checkout with PayPal." +msgstr "" + +#: templates/oscar/basket/partials/hosted_checkout_basket.html:185 +msgid "Have questions?" +msgstr "" + +#: templates/oscar/basket/partials/hosted_checkout_basket.html:186 +msgid "Please read our FAQs to view common questions about our certificates." +msgstr "" + +#: templates/oscar/basket/partials/seat_type.html:6 +#, python-format +msgid "" +"\n" +" %(seat_type)s Certificate\n" +" " +msgstr "" + +#: templates/oscar/checkout/cancel_checkout.html:7 +#: templates/oscar/checkout/cancel_checkout.html:16 +msgid "Checkout Cancelled" +msgstr "" + +#: templates/oscar/checkout/cancel_checkout.html:18 +#, python-brace-format +msgid "" +"\n" +" Your transaction has been cancelled. If you feel an error has occurred, contact {start_link}\n" +" {payment_support_email}{end_link}.\n" +" " +msgstr "" + +#: templates/oscar/checkout/error.html:7 +#: templates/oscar/checkout/error.html:18 +msgid "Checkout Error" +msgstr "" + +#: templates/oscar/checkout/error.html:19 +msgid "An error has occurred with your payment." +msgstr "" + +#: templates/oscar/checkout/error.html:19 +msgid "You have not been charged." +msgstr "" + +#: templates/oscar/checkout/error.html:21 +#, python-brace-format +msgid "" +"\n" +" Please try to submit your payment again. If this problem persists, please refer to our {start_link}\n" +" Payments FAQ {end_link} for troubleshooting tips.\n" +" " +msgstr "" + +#: templates/oscar/checkout/payment_error.html:7 +#: templates/oscar/checkout/payment_error.html:16 +msgid "Payment Failed" +msgstr "" + +#: templates/oscar/checkout/payment_error.html:18 +#, python-brace-format +msgid "" +"An error occurred while processing your payment. {strong_start}You have not " +"been charged.{strong_end}" +msgstr "" + +#: templates/oscar/checkout/payment_error.html:25 +#, python-brace-format +msgid "" +"Please wait a few minutes and then try again. For help, check our " +"{start_link}Help Center{end_link}." +msgstr "" + +#: templates/oscar/checkout/payment_error.html:32 +#, python-brace-format +msgid "To try again, return to your {start_link}dashboard{end_link}." +msgstr "" + +#: templates/oscar/checkout/sdn_failure.html:9 +msgid "" +"\n" +" SDN Check Failure\n" +" " +msgstr "" + +#: templates/oscar/checkout/sdn_failure.html:26 +msgid "" +"Unfortunately, your account profile or payment information appears to match " +"one or more records on a U.S. Treasury Department sanctions list. This means" +" we cannot complete your transaction or provide you with services and must " +"suspend your learner account." +msgstr "" + +#: templates/oscar/checkout/sdn_failure.html:35 +#, python-brace-format +msgid "" +"If you have questions regarding clearing a match, please contact " +"{ofac_email_link} ofac.reconsideration@treasury.gov{end_link} for " +"information about options for clearing a match. Your account will be " +"suspended until this matter is resolved satisfactorily." +msgstr "" + +#: templates/oscar/communication/email_base.html:189 +#: templates/oscar/customer/email_base.html:189 +#, python-format +msgid "Copyright © %(year)s %(platform_name)s. All rights reserved." +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.html:9 +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:4 +#, python-format +msgid "Hi %(full_name)s," +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.html:11 +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:6 +#, python-format +msgid "" +"Thank you for purchasing %(course_title)s. A charge will appear on your " +"credit or debit card statement with a company name of \"%(platform_name)s\"." +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.html:13 +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:8 +#, python-format +msgid "" +"You can access your course and complete your verification (if required) on " +"your %(platform_name)s dashboard. " +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.html:14 +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:9 +#, python-format +msgid "" +"To explore other great courses, visit the %(platform_name)s website. More " +"courses are added every day!" +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.html:17 +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:43 +msgid "View Payment Information" +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.html:20 +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:14 +msgid "Thank you. We hope you enjoy the course!" +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.html:21 +#, python-format +msgid "%(platform_name)s team " +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.html:31 +#, python-format +msgid "" +"You are receiving this email because you purchased a seat in the " +"%(platform_name)s course %(course_title)s." +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:2 +msgid "Receipt Confirmation for: " +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:11 +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:12 +msgid "To view your payment information, visit the following website." +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:16 +#, python-format +msgid "%(platform_name)s team" +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_body.txt:18 +msgid "The edX team" +msgstr "" + +#: templates/oscar/communication/emails/commtype_course_purchased_subject.txt:2 +msgid "Order Placed" +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:13 +msgid "Payment Confirmation" +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:27 +msgid "Payment confirmation for:" +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:55 +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:4 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:25 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:5 +#, python-format +msgid "Dear %(full_name)s," +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:60 +#, python-format +msgid "" +"\n" +" Thank you for purchasing %(credit_hours)s credit hours from %(credit_provider)s for %(course_title)s. A charge will appear on your credit or debit card statement with a company name of \"%(platform_name)s\".\n" +" " +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:67 +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:8 +#, python-format +msgid "" +"To receive your course credit, you must also request credit at the " +"%(credit_provider)s website. For a link to request credit from " +"%(credit_provider)s, or to see the status of your credit request, go to your" +" %(platform_name)s dashboard." +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:71 +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:10 +#, python-format +msgid "" +"To explore other credit-eligible courses, visit the %(platform_name)s " +"website. We add new courses frequently!" +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:74 +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:15 +msgid "Thank you. We hope you enjoyed your course!" +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:75 +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:16 +#, python-format +msgid "The %(platform_name)s team" +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.html:88 +#, python-format +msgid "" +"\n" +" You received this message because you purchased credit hours for %(course_title)s, an %(platform_name)s course.\n" +" " +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:2 +msgid "Payment confirmation for: " +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:6 +#, python-format +msgid "" +"Thank you for purchasing %(credit_hours)s credit hours from " +"%(credit_provider)s for %(course_title)s. A charge will appear on your " +"credit or debit card statement with a company name of \"%(platform_name)s\"." +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_body.txt:18 +#, python-format +msgid "" +"You received this message because you purchased credit hours for " +"%(course_title)s, an %(platform_name)s course." +msgstr "" + +#: templates/oscar/communication/emails/commtype_credit_receipt_subject.txt:2 +msgid "Order Receipt" +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:14 +msgid "For Business" +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:26 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:6 +#, python-format +msgid "" +"Thank you for purchasing access to %(course_name)s. Let's get your group " +"ready to learn with edX:" +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:29 +#, python-brace-format +msgid "" +"\n" +" Download and save the {link_start}{download_csv_link}{link_middle} enrollment code file.{link_end}\n" +" " +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:34 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:9 +msgid "Distribute one code per learner before the expiration date." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:35 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:10 +msgid "Pro tip: Track which code is associated with which person." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:36 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:11 +msgid "Learners sign-in/register with edX and enroll for the course." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:39 +#, python-brace-format +msgid "" +"\n" +" To view your payment information, log in to see your Order History, under {link_start}{order_history_url}{link_middle}Account Settings{link_end}.\n" +" " +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:45 +#, python-brace-format +msgid "" +"\n" +" For more information and assistance, check our {link_start}Help Center{link_end}\n" +" " +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:50 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:16 +msgid "Thank You" +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:61 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:18 +msgid "By purchasing, you and your organization agree to the following terms:" +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:63 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:20 +msgid "" +"Each code is valid for the one course covered and can be used only one time." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:64 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:21 +msgid "You are responsible for distributing codes to your learners." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:65 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:22 +msgid "" +"Each code will expire in one year from date of purchase or, if earlier, once" +" the course is closed." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:66 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:23 +msgid "" +"If a course is not designated as self-paced, you should confirm that a " +"course run is available before expiration." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:67 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:24 +msgid "You may not resell codes to third parties." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.html:68 +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:25 +msgid "All sales final. No refunds." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:2 +msgid "Order confirmation for: " +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:8 +#, python-format +msgid "" +"Please visit %(download_csv_link)s to download and save the enrollment code " +"file." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:13 +#, python-format +msgid "" +"To view your payment information, log in to see your Order History, under " +"Account Settings at %(order_history_url)s." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_body.txt:14 +msgid "For more information and assistance, contact info@edx.org." +msgstr "" + +#: templates/oscar/communication/emails/commtype_order_with_csv_subject.txt:2 +#, python-format +msgid "%(partner_name)s: Order Confirmation: [%(order_number)s]" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_form.html:37 +#: templates/oscar/dashboard/catalogue/product_update.html:61 +msgid "Sections" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_form.html:43 +#: templates/oscar/dashboard/catalogue/category_form.html:62 +msgid "Category details" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_form.html:48 +#: templates/oscar/dashboard/catalogue/category_form.html:82 +msgid "Search engine optimisation" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_form.html:106 +#: templates/oscar/dashboard/catalogue/product_update.html:324 +msgid "or" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_form.html:107 +#: templates/oscar/dashboard/catalogue/category_form.html:110 +#: templates/oscar/dashboard/catalogue/product_update.html:326 +#: templates/oscar/dashboard/catalogue/product_update.html:330 +#: templates/oscar/dashboard/catalogue/product_update.html:333 +msgid "Saving..." +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_form.html:108 +#: templates/oscar/dashboard/catalogue/product_update.html:331 +msgid "Save and continue editing" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_form.html:111 +#: templates/oscar/dashboard/catalogue/product_update.html:334 +msgid "Save" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_row_actions.html:6 +#: templates/oscar/dashboard/catalogue/product_row_actions.html:6 +#: templates/oscar/dashboard/orders/order_detail.html:139 +#: templates/oscar/dashboard/refunds/refund_detail.html:75 +#: templates/oscar/dashboard/refunds/refund_list.html:63 +#: templates/oscar/dashboard/users/detail.html:99 +msgid "Actions" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_row_actions.html:10 +msgid "Edit category" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_row_actions.html:13 +msgid "Add child category" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_row_actions.html:17 +msgid "Edit children" +msgstr "" + +#: templates/oscar/dashboard/catalogue/category_row_actions.html:20 +#: templates/oscar/dashboard/catalogue/product_row_actions.html:14 +#: templates/oscar/dashboard/catalogue/product_update.html:270 +#: templates/oscar/dashboard/orders/order_detail.html:725 +msgid "Delete" +msgstr "" + +#: templates/oscar/dashboard/catalogue/messages/product_saved.html:11 +#, python-format +msgid "" +"\n" +" Created product variant '%(name)s'.\n" +" " +msgstr "" + +#: templates/oscar/dashboard/catalogue/messages/product_saved.html:17 +#, python-format +msgid "" +"\n" +" Created variant of '%(parent_name)s'.\n" +" " +msgstr "" + +#: templates/oscar/dashboard/catalogue/messages/product_saved.html:25 +#, python-format +msgid "" +"\n" +" Updated product variant '%(name)s'.\n" +" " +msgstr "" + +#: templates/oscar/dashboard/catalogue/messages/product_saved.html:31 +#, python-format +msgid "" +"\n" +" Updated a variant of '%(parent_name)s'.\n" +" " +msgstr "" + +#: templates/oscar/dashboard/catalogue/messages/product_saved.html:42 +#, python-format +msgid "" +"\n" +" Created product '%(name)s'.\n" +" " +msgstr "" + +#: templates/oscar/dashboard/catalogue/messages/product_saved.html:48 +#, python-format +msgid "" +"\n" +" Updated product '%(name)s'.\n" +" " +msgstr "" + +#: templates/oscar/dashboard/catalogue/messages/product_saved.html:60 +msgid "Edit again" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:45 +#, python-brace-format +msgid "" +"\n" +" You are currently editing a product variant of\n" +" {start_anchor}{title}{end_anchor}.\n" +" " +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:73 +#: templates/oscar/dashboard/catalogue/product_update.html:103 +#: templates/oscar/dashboard/orders/line_detail.html:31 +msgid "Product details" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:78 +#: templates/oscar/dashboard/catalogue/product_update.html:146 +#: templates/oscar/dashboard/catalogue/product_update.html:256 +msgid "Attributes" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:81 +msgid "Images" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:84 +#: templates/oscar/dashboard/catalogue/product_update.html:188 +msgid "Stock and pricing" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:87 +#: templates/oscar/dashboard/catalogue/product_update.html:247 +msgid "Variants" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:90 +msgid "Upselling" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:148 +msgid "Product Type:" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:169 +msgid "Upload, change or remove images" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:194 +msgid "SKU" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:196 +msgid "Num in stock" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:197 +msgid "Num allocated" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:198 +msgid "Low stock threshold" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:201 +msgid "Cost price" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:202 +msgid "Price (excl tax)" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:203 +msgid "Retail price" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:204 +msgid "Delete?" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:248 +msgid "Adding..." +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:250 +msgid "Add variant" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:255 +msgid "Title" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:257 +msgid "Stock records" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:279 +msgid "This product does not have any variants." +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:281 +msgid "One can't add variants to this product at this point." +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:283 +msgid "This is likely because this product still has stock records." +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:299 +msgid "Recommended products" +msgstr "" + +#: templates/oscar/dashboard/catalogue/product_update.html:327 +msgid "Save and add another variant" +msgstr "" + +#: templates/oscar/dashboard/index.html:27 +msgid "Store Statistics (Last 24 Hours)" +msgstr "" + +#: templates/oscar/dashboard/index.html:34 +msgid "New Customers" +msgstr "" + +#: templates/oscar/dashboard/index.html:35 +#: templates/oscar/dashboard/index.html:41 +msgid "Revenue" +msgstr "" + +#: templates/oscar/dashboard/index.html:36 +msgid "Average order cost" +msgstr "" + +#: templates/oscar/dashboard/index.html:37 +msgid "Average (paid) order cost" +msgstr "" + +#: templates/oscar/dashboard/index.html:67 +msgid "Products and vouchers" +msgstr "" + +#: templates/oscar/dashboard/index.html:69 +msgid "Total products" +msgstr "" + +#: templates/oscar/dashboard/index.html:73 +msgid "Active Vouchers" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:6 +#, python-format +msgid "" +"\n" +" %(name)s | Offers\n" +" " +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:26 +msgid "Reinstating..." +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:26 +msgid "Reinstate offer" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:28 +msgid "Suspending..." +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:28 +msgid "Suspend offer" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:31 +msgid "Delete offer" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:44 +msgid "Offer currently available" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:46 +msgid "Offer not available due to restrictions!" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:49 +msgid "Total cost:" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:50 +msgid "Number of orders:" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:51 +msgid "Number of uses:" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:56 +msgid "Date created:" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:57 +msgid "Offer details" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:75 +#: templates/oscar/dashboard/offers/summary.html:20 +msgid "Incentive" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:80 +#: templates/oscar/dashboard/offers/summary.html:26 +msgid "Condition" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:85 +#: templates/oscar/dashboard/offers/summary.html:31 +msgid "Restrictions" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:101 +msgid "Num of vouchers" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:110 +msgid "Attached vouchers" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:142 +msgid "No vouchers are attached to this offer." +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:150 +msgid "Export to CSV" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:151 +msgid "Orders that used this offer" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:155 +#: templates/oscar/dashboard/orders/order_list.html:94 +msgid "Order number" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:156 +msgid "Order date" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:157 +#: templates/oscar/dashboard/orders/order_detail.html:277 +msgid "Order total" +msgstr "" + +#: templates/oscar/dashboard/offers/offer_detail.html:158 +msgid "Cost" +msgstr "" + +#: templates/oscar/dashboard/offers/summary.html:4 +msgid "Offer summary" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:6 +#, python-format +msgid "" +"\n" +" Order %(number)s - Line #%(id)s\n" +" " +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:18 +#, python-format +msgid "Line #%(id)s" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:24 +#, python-format +msgid "Order #%(number)s - Line #%(id)s" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:35 +msgctxt "Product title" +msgid "Title" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:41 +msgid "Product Type" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:44 +#: templates/oscar/dashboard/orders/order_detail.html:133 +#: templates/oscar/dashboard/refunds/refund_detail.html:108 +msgid "UPC" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:51 +msgid "Product Options" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:64 +msgid "Partner details" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:74 +msgid "Partner SKU" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:80 +msgid "Shipping details" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:84 +msgid "Partner reference number" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:87 +msgid "Partner notes" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:90 +msgid "Estimate dispatch date" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:99 +msgid "Shipping status" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:104 +msgid "State" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:116 +#: templates/oscar/dashboard/orders/line_detail.html:147 +msgid "No shipping events have occurred." +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:124 +msgid "Shipping events" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:129 +#: templates/oscar/dashboard/orders/line_detail.html:160 +#: templates/oscar/dashboard/orders/order_detail.html:432 +#: templates/oscar/dashboard/orders/order_detail.html:478 +#: templates/oscar/dashboard/refunds/refund_detail.html:166 +msgid "Event" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:131 +#: templates/oscar/dashboard/orders/order_detail.html:434 +#: templates/oscar/dashboard/orders/order_detail.html:481 +#: templates/oscar/dashboard/orders/order_detail.html:592 +#: templates/oscar/dashboard/orders/order_detail.html:624 +#: templates/oscar/dashboard/refunds/refund_detail.html:170 +msgid "Reference" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:132 +#: templates/oscar/dashboard/orders/line_detail.html:162 +#: templates/oscar/dashboard/orders/order_detail.html:399 +#: templates/oscar/dashboard/orders/order_detail.html:431 +#: templates/oscar/dashboard/orders/order_detail.html:477 +#: templates/oscar/dashboard/orders/order_detail.html:626 +#: templates/oscar/dashboard/orders/order_detail.html:706 +#: templates/oscar/dashboard/refunds/refund_detail.html:165 +msgid "Date" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:155 +msgid "Payment events" +msgstr "" + +#: templates/oscar/dashboard/orders/line_detail.html:176 +msgid "No payment events have occurred." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:8 +#, python-format +msgid "Order %(number)s" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:22 +#, python-format +msgid "Order #%(number)s" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:28 +#: templates/oscar/dashboard/refunds/refund_detail.html:47 +msgid "Customer Information" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:32 +#: templates/oscar/dashboard/orders/order_detail.html:43 +#: templates/oscar/dashboard/refunds/refund_detail.html:52 +msgid "Email address" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:36 +msgid "Customer checked out as a guest." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:50 +#: templates/oscar/dashboard/refunds/refund_detail.html:61 +msgid "Customer has deleted their account." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:57 +msgid "Order information" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:59 +msgid "Order Total" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:60 +#: templates/oscar/dashboard/orders/order_list.html:101 +msgid "Date of purchase" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:61 +msgid "Time of purchase" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:77 +msgid "Order Details" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:86 +msgid "Order contents" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:96 +#: templates/oscar/dashboard/orders/order_detail.html:514 +msgid "Shipping" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:101 +msgid "Payment" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:106 +#: templates/oscar/dashboard/orders/order_detail.html:652 +msgid "Discounts" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:111 +#: templates/oscar/dashboard/orders/order_detail.html:700 +msgid "Notes" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:120 +msgid "Items ordered" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:130 +msgid "Line ID" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:132 +#: templates/oscar/dashboard/refunds/refund_detail.html:107 +msgid "Product" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:135 +#: templates/oscar/dashboard/refunds/refund_detail.html:110 +msgid "Supplier" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:136 +#: templates/oscar/dashboard/refunds/refund_detail.html:111 +msgid "Supplier SKU" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:137 +msgid "Price excl tax (before discounts)" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:138 +msgid "Price inc tax (before discounts)" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:173 +#: templates/oscar/dashboard/orders/order_list.html:126 +#: templates/oscar/dashboard/partials/refund_table.html:26 +#: templates/oscar/dashboard/refunds/refund_list.html:91 +#: templates/oscar/dashboard/users/detail.html:155 +msgid "View" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:189 +msgid "Basket total (excl. discounts)" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:208 +msgid "Basket total (inc. discounts)" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:216 +msgid "Basket total" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:227 +msgid "Shipping total (excl. discounts)" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:246 +msgid "Shipping total (inc. discounts)" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:254 +msgid "Shipping total" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:266 +#, python-format +msgid "Surcharge %(name)s" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:294 +msgid "With selected lines" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:299 +msgid "Change line status to" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:303 +#: templates/oscar/dashboard/orders/order_detail.html:305 +#: templates/oscar/dashboard/orders/order_list.html:140 +msgid "choose new status" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:316 +msgid "Create shipping event" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:320 +#: templates/oscar/dashboard/orders/order_detail.html:322 +#: templates/oscar/dashboard/orders/order_detail.html:341 +#: templates/oscar/dashboard/orders/order_detail.html:343 +msgid "choose event type" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:329 +msgid "with reference" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:337 +msgid "Create payment event" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:350 +msgid "with amount" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:358 +msgid "Create Refund" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:364 +msgid "Go!" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:374 +#: templates/oscar/dashboard/orders/order_list.html:135 +msgid "Change order status" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:379 +#: templates/oscar/dashboard/orders/order_list.html:149 +msgid "Change status" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:382 +#: templates/oscar/dashboard/orders/order_list.html:153 +msgid "This order can't have its status changed." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:390 +msgid "Status Changes" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:397 +msgid "From" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:398 +msgid "To" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:414 +msgid "No status changes." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:424 +msgid "Shipping Events" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:433 +#: templates/oscar/dashboard/orders/order_detail.html:480 +#: templates/oscar/dashboard/refunds/refund_detail.html:168 +msgid "Lines" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:446 +#, python-format +msgid "" +"\n" +" %(title)s (quantity %(event_qty)s/%(total_qty)s)\n" +" " +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:460 +msgid "No shipping events." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:470 +#: templates/oscar/dashboard/refunds/refund_detail.html:157 +msgid "Payment Events" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:479 +#: templates/oscar/dashboard/orders/order_detail.html:623 +#: templates/oscar/dashboard/orders/order_detail.html:663 +#: templates/oscar/dashboard/refunds/refund_detail.html:167 +msgid "Amount" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:493 +#: templates/oscar/dashboard/refunds/refund_detail.html:182 +msgid "Product:" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:493 +msgid "quantity" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:503 +#: templates/oscar/dashboard/refunds/refund_detail.html:194 +msgid "No payment events." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:519 +msgid "Method name" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:523 +msgid "Method code" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:527 +msgid "Charge (incl tax)" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:531 +msgid "Charge (excl tax)" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:535 +msgid "Address" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:546 +msgid "Phone" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:550 +msgid "Instructions" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:571 +#: templates/oscar/dashboard/orders/order_list.html:100 +msgid "Billing address" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:582 +msgid "Payment sources" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:588 +#: templates/oscar/dashboard/orders/order_detail.html:622 +msgid "Source" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:589 +msgid "Allocation" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:590 +msgid "Amount debited" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:591 +msgid "Amount refunded" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:609 +msgid "No payment sources found for this order." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:617 +msgid "Transactions" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:659 +msgid "Voucher" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:660 +msgid "Offer name" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:661 +msgid "Frequency" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:662 +#: templates/oscar/dashboard/orders/order_detail.html:709 +msgid "Message" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:689 +msgid "No discounts were applied to this order." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:710 +msgid "Admin" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:733 +msgid "No notes available." +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:744 +msgid "Save note" +msgstr "" + +#: templates/oscar/dashboard/orders/order_detail.html:745 +msgid "Notes are only editable for 5 minutes after being saved." +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:30 +#: templates/oscar/dashboard/orders/order_list.html:51 +#: templates/oscar/dashboard/partials/search_form.html:4 +#: templates/oscar/dashboard/partials/search_form.html:25 +#: templates/oscar/dashboard/partials/search_form.html:45 +msgid "Search" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:52 +#: templates/oscar/dashboard/partials/search_form.html:26 +#: templates/oscar/dashboard/partials/search_form.html:34 +msgid "Advanced Search" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:78 +#: templates/oscar/dashboard/orders/order_list.html:164 +msgid "Order Search Results" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:80 +#: templates/oscar/dashboard/orders/order_list.html:166 +msgid "All Orders" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:85 +msgid "Download selected orders as a CSV" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:86 +msgid "Submitting..." +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:86 +msgid "Download" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:95 +msgid "Total inc tax" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:96 +msgid "Number of items" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:98 +msgid "Customer" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:99 +msgid "Shipping address" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:119 +#: templates/oscar/dashboard/refunds/refund_list.html:79 +#: templates/oscar/dashboard/refunds/refund_list.html:86 +msgid "Deleted" +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:148 +msgid "Changing..." +msgstr "" + +#: templates/oscar/dashboard/orders/order_list.html:169 +msgid "No orders found." +msgstr "" + +#: templates/oscar/dashboard/partials/enrollment_table.html:4 +#: templates/oscar/dashboard/users/detail.html:123 +msgid "Enrollments" +msgstr "" + +#: templates/oscar/dashboard/partials/enrollment_table.html:9 +msgid "Mode" +msgstr "" + +#: templates/oscar/dashboard/partials/enrollment_table.html:10 +msgid "Active?" +msgstr "" + +#: templates/oscar/dashboard/partials/enrollment_table.html:21 +msgid "No enrollments found." +msgstr "" + +#: templates/oscar/dashboard/partials/refund_action_modal.html:8 +msgid "Confirm Refund Processing" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_action_modal.html:11 +msgid "" +"Are you sure you want to issue a full refund and revoke student's " +"enrollment?" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_action_modal.html:14 +msgid "" +"Are you sure you want to issue a full refund without revoking student's " +"enrollment?" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_action_modal.html:17 +msgid "Are you sure you want to deny this refund request?" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_action_modal.html:21 +msgid "Confirm" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_buttons.html:5 +msgid "Approve Credit and Revoke" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_buttons.html:8 +msgid "Approve Credit Only" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_buttons.html:14 +msgid "Deny" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_table.html:10 +#: templates/oscar/dashboard/refunds/refund_list.html:58 +msgid "Number of Items" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_table.html:11 +#: templates/oscar/dashboard/refunds/refund_detail.html:71 +#: templates/oscar/dashboard/refunds/refund_detail.html:146 +#: templates/oscar/dashboard/refunds/refund_list.html:57 +msgid "Total Credit" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_table.html:12 +#: templates/oscar/dashboard/refunds/refund_detail.html:72 +#: templates/oscar/dashboard/refunds/refund_list.html:62 +msgid "Created" +msgstr "" + +#: templates/oscar/dashboard/partials/refund_table.html:31 +#: templates/oscar/dashboard/refunds/refund_list.html:105 +msgid "No refunds found." +msgstr "" + +#: templates/oscar/dashboard/partials/search_form.html:44 +msgid "Close" +msgstr "" + +#: templates/oscar/dashboard/partials/search_form.html:45 +msgid "Searching..." +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:11 +#: templates/oscar/dashboard/refunds/refund_detail.html:40 +#, python-format +msgid "Refund #%(id)s" +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:51 +#: templates/oscar/dashboard/users/detail.html:44 +msgid "Full name" +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:69 +msgid "Refund Overview" +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:74 +msgid "Associated Order" +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:95 +msgid "Refund Items" +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:104 +msgid "Refund Line ID" +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:105 +msgid "Associated Order Line" +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:112 +msgid "Credit (excl. tax)" +msgstr "" + +#: templates/oscar/dashboard/refunds/refund_detail.html:169 +msgid "Processor" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:36 +msgid "General" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:54 +msgid "Yes,No" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:58 +msgid "Superuser" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:59 +#: templates/oscar/dashboard/users/detail.html:63 +msgid "True,False" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:62 +msgid "Staff" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:66 +msgid "Last login" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:70 +msgid "Date joined" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:76 +msgid "Products viewed" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:80 +msgid "Number of orders" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:84 +msgid "Number of ordered items" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:88 +msgid "Total spent" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:94 +msgid "Reviews written" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:107 +msgid "Send password reset email" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:125 +#: templates/oscar/dashboard/users/detail.html:186 +msgid "Addresses" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:126 +#: templates/oscar/dashboard/users/detail.html:214 +msgid "Reviews" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:139 +msgid "Num items" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:140 +msgid "Total value" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:141 +msgid "Date placed" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:160 +msgid "This customer has not placed any orders yet." +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:205 +msgid "This customer has not saved any addresses." +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:217 +msgid "Product ID" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:218 +msgid "Score" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:219 +msgctxt "Product review title" +msgid "Title" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:220 +msgid "Body" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:221 +msgid "Date created" +msgstr "" + +#: templates/oscar/dashboard/users/detail.html:234 +msgid "This customer has not written any reviews yet." +msgstr "" + +#: urls.py:45 +msgid "E-Commerce Service Administration" +msgstr "" diff --git a/ecommerce/conf/locale/en/LC_MESSAGES/djangojs.po b/ecommerce/conf/locale/en/LC_MESSAGES/djangojs.po new file mode 100644 index 00000000000..0741dee6fe6 --- /dev/null +++ b/ecommerce/conf/locale/en/LC_MESSAGES/djangojs.po @@ -0,0 +1,537 @@ +# edX translation file. +# Copyright (C) 2024 EdX +# This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. +# EdX Team , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.1a\n" +"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" +"POT-Creation-Date: 2023-06-13 08:00+0000\n" +"PO-Revision-Date: 2023-06-13 09:00+0000\n" +"Last-Translator: \n" +"Language-Team: openedx-translation \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: static/js/models/coupon_model.js:33 +#: static/js/models/enterprise_coupon_model.js:15 +msgid "This field is required." +msgstr "" + +#: static/js/models/coupon_model.js:34 +#: static/js/models/enterprise_coupon_model.js:16 +msgid "This value must be a number." +msgstr "" + +#: static/js/models/coupon_model.js:35 +#: static/js/models/enterprise_coupon_model.js:17 +msgid "This value must be a date." +msgstr "" + +#: static/js/models/coupon_model.js:36 +msgid "At least one seat type must be selected." +msgstr "" + +#: static/js/models/coupon_model.js:72 +msgid "This field must be empty or contain 1-16 alphanumeric characters." +msgstr "" + +#: static/js/models/coupon_model.js:81 +#, javascript-format +msgid "Email domain {%s} is invalid." +msgstr "" + +#: static/js/models/coupon_model.js:98 +msgid "Must occur after start date" +msgstr "" + +#: static/js/models/coupon_model.js:128 +msgid "Max uses for multi-use coupons must be higher than 2." +msgstr "" + +#: static/js/models/coupon_model.js:152 +msgid "Must occur before end date" +msgstr "" + +#: static/js/models/coupon_model.js:174 +msgid "A valid course ID is required" +msgstr "" + +#: static/js/models/coupon_model.js:188 +msgid "A valid Program UUID is required." +msgstr "" + +#: static/js/models/course_model.js:54 +msgid "You must select a course type." +msgstr "" + +#: static/js/models/course_model.js:60 +msgid "You must choose if an honor seat should be created." +msgstr "" + +#: static/js/models/course_model.js:77 +msgid "The verification deadline must occur AFTER the upgrade deadline." +msgstr "" + +#: static/js/models/course_model.js:86 +msgid "Product validation failed." +msgstr "" + +#: static/js/models/course_model.js:94 +#: static/js/views/dynamic_catalog_view.js:70 +msgid "Course ID" +msgstr "" + +#: static/js/models/course_model.js:95 +msgid "Course Name" +msgstr "" + +#: static/js/models/course_model.js:96 static/js/views/course_list_view.js:77 +msgid "Course Type" +msgstr "" + +#: static/js/models/course_model.js:97 +msgid "Verification Deadline" +msgstr "" + +#: static/js/models/course_model.js:98 +msgid "Include Honor Seat" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:28 +msgid "All course seats must have a price." +msgstr "" + +#: static/js/models/course_seats/course_seat.js:45 +msgid "Verified seats must have an upgrade deadline." +msgstr "" + +#: static/js/models/course_seats/course_seat.js:53 +msgid "The upgrade deadline must occur BEFORE the verification deadline." +msgstr "" + +#: static/js/models/course_seats/course_seat.js:84 +msgid "Verified" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:86 +#: static/js/views/course_form_view.js:77 +msgid "Credit" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:89 +msgid "Professional" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:91 +msgid "Honor" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:93 +msgid "Audit" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:101 +msgid "Verified Certificate" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:105 +msgid "Professional Certificate" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:108 +msgid "Honor Certificate" +msgstr "" + +#: static/js/models/course_seats/course_seat.js:111 +msgid "No Certificate" +msgstr "" + +#: static/js/models/course_seats/credit_seat.js:26 +msgid "All credit seats must have a credit provider." +msgstr "" + +#: static/js/models/course_seats/credit_seat.js:30 +msgid "Please select a valid credit provider." +msgstr "" + +#: static/js/models/course_seats/credit_seat.js:39 +msgid "All credit seats must designate a number of credit hours." +msgstr "" + +#: static/js/models/enterprise_coupon_model.js:18 +msgid "This value must be a valid email." +msgstr "" + +#: static/js/pages/basket_page.js:27 +msgid "Problem occurred during checkout. Please contact support." +msgstr "" + +#: static/js/pages/basket_page.js:101 +msgid "This field is required" +msgstr "" + +#: static/js/pages/basket_page.js:145 +msgid "Invalid card number" +msgstr "" + +#: static/js/pages/basket_page.js:147 +msgid "Unsupported card type" +msgstr "" + +#: static/js/pages/basket_page.js:149 +msgid "Invalid security number" +msgstr "" + +#: static/js/pages/basket_page.js:154 +msgid "Invalid month" +msgstr "" + +#: static/js/pages/basket_page.js:156 +msgid "Invalid year" +msgstr "" + +#: static/js/pages/basket_page.js:158 +msgid "Card expired" +msgstr "" + +#: static/js/pages/basket_page.js:474 +msgid "" +msgstr "" + +#: static/js/pages/basket_page.js:475 +msgid "State/Province (required)" +msgstr "" + +#: static/js/pages/coupon_create_page.js:12 +#: static/js/pages/enterprise_coupon_create_page.js:12 +msgid "Create New Coupon" +msgstr "" + +#: static/js/pages/coupon_detail_page.js:13 +#: static/js/pages/enterprise_coupon_detail_page.js:13 +msgid "View Coupon" +msgstr "" + +#: static/js/pages/coupon_edit_page.js:13 +#: static/js/pages/enterprise_coupon_edit_page.js:13 +msgid "Edit Coupon" +msgstr "" + +#: static/js/pages/coupon_list_page.js:10 +msgid "Coupon Codes" +msgstr "" + +#: static/js/pages/course_create_page.js:12 +msgid "Create New Course" +msgstr "" + +#: static/js/pages/course_detail_page.js:13 +msgid "View Course" +msgstr "" + +#: static/js/pages/course_edit_page.js:13 +msgid "Edit Course" +msgstr "" + +#: static/js/pages/course_list_page.js:10 +msgid "Courses" +msgstr "" + +#: static/js/pages/enterprise_coupon_list_page.js:10 +msgid "Enterprise Coupon Codes" +msgstr "" + +#: static/js/pages/offer_page.js:14 +msgid "Redeem" +msgstr "" + +#: static/js/pages/receipt_page.js:21 +msgid "" +"Caution! Using the back button on this page may cause you to be charged " +"again." +msgstr "" + +#. Translators: Do not translate "Apple Pay". +#: static/js/payment_processors/cybersource.js:225 +msgid "" +"Apple Pay is not available at this time. Please try another payment method." +msgstr "" + +#: static/js/payment_processors/cybersource.js:255 +msgid "" +"An error occurred while processing your payment. You have NOT been charged. " +"Please try again, or select another payment method." +msgstr "" + +#: static/js/payment_processors/stripe.js:71 +msgid "" +"An error occurred while attempting to process your payment. You have not " +"been charged. Please check your payment details, and try again." +msgstr "" + +#: static/js/payment_processors/stripe.js:110 +msgid "An error occurred while processing your payment. Please try again." +msgstr "" + +#: static/js/utils/utils.js:184 +msgid "Trailing comma not allowed." +msgstr "" + +#: static/js/views/coupon_detail_view.js:108 +#: static/js/views/coupon_form_view.js:62 +#: static/js/views/enterprise_coupon_form_view.js:30 +msgid "Can be used once by one customer" +msgstr "" + +#: static/js/views/coupon_detail_view.js:110 +#: static/js/views/coupon_form_view.js:70 +#: static/js/views/enterprise_coupon_form_view.js:38 +msgid "Can be used multiple times by multiple customers" +msgstr "" + +#: static/js/views/coupon_detail_view.js:112 +#: static/js/views/coupon_form_view.js:66 +#: static/js/views/enterprise_coupon_form_view.js:34 +msgid "Can be used once by multiple customers" +msgstr "" + +#: static/js/views/coupon_form_view.js:51 +msgid "Enrollment Code" +msgstr "" + +#: static/js/views/coupon_form_view.js:55 +msgid "Discount Code" +msgstr "" + +#: static/js/views/coupon_form_view.js:787 +msgid "Save Changes" +msgstr "" + +#: static/js/views/coupon_form_view.js:802 +msgid "Create Coupon" +msgstr "" + +#: static/js/views/coupon_list_view.js:35 +#: static/js/views/enterprise_coupon_list_view.js:24 +msgid "Name" +msgstr "" + +#: static/js/views/coupon_list_view.js:42 +#: static/js/views/enterprise_coupon_list_view.js:31 +msgid "Created" +msgstr "" + +#: static/js/views/coupon_list_view.js:49 +msgid "Custom Code" +msgstr "" + +#: static/js/views/coupon_list_view.js:55 +#: static/js/views/enterprise_coupon_list_view.js:44 +msgid "Client" +msgstr "" + +#: static/js/views/coupon_list_view.js:61 +msgid "Category" +msgstr "" + +#: static/js/views/coupon_list_view.js:67 +#: static/js/views/enterprise_coupon_list_view.js:62 +msgid "Coupon Report" +msgstr "" + +#: static/js/views/coupon_list_view.js:80 +#: static/js/views/course_list_view.js:25 +msgid "Search..." +msgstr "" + +#: static/js/views/coupon_list_view.js:107 +#: static/js/views/course_list_view.js:52 +msgid "Next" +msgstr "" + +#: static/js/views/coupon_list_view.js:108 +#: static/js/views/course_list_view.js:53 +msgid "Previous" +msgstr "" + +#. Translators: _START_, _END_, and _TOTAL_ are placeholders. Do NOT translate +#. them. +#: static/js/views/coupon_list_view.js:112 +msgid "Displaying _START_ to _END_ of _TOTAL_ coupons" +msgstr "" + +#. Translators: _MAX_ is a placeholder. Do NOT translate it. +#: static/js/views/coupon_list_view.js:115 +msgid "(filtered from _MAX_ total coupons)" +msgstr "" + +#. Translators: _MENU_ is a placeholder. Do NOT translate it. +#: static/js/views/coupon_list_view.js:118 +msgid "Display _MENU_ coupons" +msgstr "" + +#: static/js/views/course_form_view.js:55 +msgid "Free (Audit)" +msgstr "" + +#: static/js/views/course_form_view.js:56 +msgid "Free audit track. No certificate." +msgstr "" + +#: static/js/views/course_form_view.js:60 +msgid "Verified and Audit" +msgstr "" + +#: static/js/views/course_form_view.js:61 +#: static/js/views/course_form_view.js:67 +msgid "" +"Paid certificate track with initial verification and Verified Certificate." +msgstr "" + +#: static/js/views/course_form_view.js:62 +msgid "Also includes the free audit track." +msgstr "" + +#: static/js/views/course_form_view.js:66 +msgid "Verified Only" +msgstr "" + +#: static/js/views/course_form_view.js:71 +msgid "Professional Education" +msgstr "" + +#: static/js/views/course_form_view.js:72 +msgid "" +"Paid certificate track with initial verification and Professional Education " +"Certificate" +msgstr "" + +#: static/js/views/course_form_view.js:78 +msgid "" +"Paid certificate track with initial verification and Verified Certificate, " +"and option to purchase credit" +msgstr "" + +#. Translators: _START_, _END_, and _TOTAL_ are placeholders. Do NOT translate +#. them. +#: static/js/views/course_list_view.js:57 +msgid "Displaying _START_ to _END_ of _TOTAL_ courses" +msgstr "" + +#. Translators: _MAX_ is a placeholder. Do NOT translate it. +#: static/js/views/course_list_view.js:60 +msgid "(filtered from _MAX_ total courses)" +msgstr "" + +#. Translators: _MENU_ is a placeholder. Do NOT translate it. +#: static/js/views/course_list_view.js:63 +msgid "Display _MENU_ courses" +msgstr "" + +#: static/js/views/course_list_view.js:69 +msgid "Course" +msgstr "" + +#: static/js/views/course_list_view.js:86 +msgid "Last Edited" +msgstr "" + +#: static/js/views/dynamic_catalog_view.js:74 +msgid "Seat title" +msgstr "" + +#: static/js/views/dynamic_catalog_view.js:78 +msgid "Seat type" +msgstr "" + +#: static/js/views/enterprise_coupon_detail_view.js:28 +#: static/js/views/enterprise_coupon_form_view.js:42 +msgid "Can be used multiple times by one customer" +msgstr "" + +#: static/js/views/enterprise_coupon_form_view.js:280 +msgid "Create and Add More" +msgstr "" + +#: static/js/views/enterprise_coupon_list_view.js:38 +msgid "Status" +msgstr "" + +#: static/js/views/enterprise_coupon_list_view.js:50 +msgid "Enterprise Customer" +msgstr "" + +#: static/js/views/enterprise_coupon_list_view.js:56 +msgid "Enterprise Customer Catalog" +msgstr "" + +#: static/js/views/form_view.js:71 +msgid "A course with the specified ID already exists." +msgstr "" + +#: static/js/views/form_view.js:81 static/js/views/form_view.js:174 +msgid "Error!" +msgstr "" + +#: static/js/views/form_view.js:127 +msgid "Saving..." +msgstr "" + +#: static/js/views/form_view.js:136 +msgid "Please complete all required fields." +msgstr "" + +#: static/js/views/form_view.js:161 +msgid "An error occurred while saving the data." +msgstr "" + +#: static/js/views/offer_view.js:198 +msgid "Ellipsis" +msgstr "" + +#: static/js/views/offer_view.js:205 +msgid "Load the records for page " +msgstr "" + +#: static/js/views/offer_view.js:212 +msgid "Load the records for the next page" +msgstr "" + +#: static/js/views/offer_view.js:220 +msgid "Load the records for the previous page" +msgstr "" + +#: static/js/views/provider_selection_view.js:33 +msgid "Select" +msgstr "" + +#: static/js/views/provider_selection_view.js:34 +msgid "Selected" +msgstr "" + +#: static/vendor-extensions/oscar/js/order_actions.js:21 +msgid "Order %(order_number)s has been fulfilled." +msgstr "" + +#: static/vendor-extensions/oscar/js/order_actions.js:27 +msgid "Failed to fulfill order %(order_number)s: %(error)s" +msgstr "" + +#: static/vendor-extensions/oscar/js/refund_list.js:24 +msgid "Refund #%(refund_id)s has been processed." +msgstr "" + +#: static/vendor-extensions/oscar/js/refund_list.js:33 +msgid "Error" +msgstr "" + +#: static/vendor-extensions/oscar/js/refund_list.js:36 +msgid "" +"Failed to process refund #%(refund_id)s: %(error)s. Please try again, or " +"contact the E-Commerce Development Team." +msgstr "" diff --git a/ecommerce/extensions/basket/migrations/0018_line_tax_code.py b/ecommerce/extensions/basket/migrations/0018_line_tax_code.py new file mode 100644 index 00000000000..87067b674b4 --- /dev/null +++ b/ecommerce/extensions/basket/migrations/0018_line_tax_code.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.25 on 2024-05-22 10:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('basket', '0017_alter_lineattribute_value'), + ] + + operations = [ + migrations.AddField( + model_name='line', + name='tax_code', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), + ), + ] diff --git a/ecommerce/extensions/catalogue/migrations/0058_auto_20240522_1020.py b/ecommerce/extensions/catalogue/migrations/0058_auto_20240522_1020.py new file mode 100644 index 00000000000..10a6f79017f --- /dev/null +++ b/ecommerce/extensions/catalogue/migrations/0058_auto_20240522_1020.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.25 on 2024-05-22 10:20 + +from django.db import migrations +import oscar.models.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalogue', '0057_auto_20231205_1034'), + ] + + operations = [ + migrations.AddField( + model_name='attributeoption', + name='code', + field=oscar.models.fields.NullCharField(max_length=255, unique=True, verbose_name='Unique identifier'), + ), + migrations.AddField( + model_name='attributeoptiongroup', + name='code', + field=oscar.models.fields.NullCharField(max_length=255, unique=True, verbose_name='Unique identifier'), + ), + migrations.AddField( + model_name='category', + name='code', + field=oscar.models.fields.NullCharField(max_length=255, unique=True, verbose_name='Code'), + ), + migrations.AddField( + model_name='historicalcategory', + name='code', + field=oscar.models.fields.NullCharField(db_index=True, max_length=255, verbose_name='Code'), + ), + migrations.AddField( + model_name='productimage', + name='code', + field=oscar.models.fields.NullCharField(max_length=255, unique=True, verbose_name='Code'), + ), + ] diff --git a/ecommerce/extensions/offer/migrations/0056_auto_20240522_1020.py b/ecommerce/extensions/offer/migrations/0056_auto_20240522_1020.py new file mode 100644 index 00000000000..a57450e8ba2 --- /dev/null +++ b/ecommerce/extensions/offer/migrations/0056_auto_20240522_1020.py @@ -0,0 +1,51 @@ +# Generated by Django 3.2.25 on 2024-05-22 10:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('offer', '0055_auto_20231108_1355'), + ] + + operations = [ + migrations.CreateModel( + name='FixedUnitDiscountBenefit', + fields=[ + ], + options={ + 'verbose_name': 'Fixed unit discount benefit', + 'verbose_name_plural': 'Fixed unit discount benefits', + 'proxy': True, + 'indexes': [], + 'constraints': [], + }, + bases=('offer.absolutediscountbenefit',), + ), + migrations.AddField( + model_name='rangeproductfileupload', + name='upload_type', + field=models.CharField(choices=[('included', 'Included products upload'), ('excluded', 'Excluded products upload')], default='included', max_length=8), + ), + migrations.AlterField( + model_name='benefit', + name='type', + field=models.CharField(blank=True, choices=[('Percentage', "Discount is a percentage off of the product's value"), ('Absolute', "Discount is a fixed amount off of the basket's total"), ('Fixed', "Discount is a fixed amount off of the product's value"), ('Multibuy', 'Discount is to give the cheapest product for free'), ('Fixed price', 'Get the products that meet the condition for a fixed price'), ('Shipping absolute', 'Discount is a fixed amount of the shipping cost'), ('Shipping fixed price', 'Get shipping for a fixed price'), ('Shipping percentage', 'Discount is a percentage off of the shipping cost')], max_length=128, verbose_name='Type'), + ), + migrations.AlterField( + model_name='historicalbenefit', + name='type', + field=models.CharField(blank=True, choices=[('Percentage', "Discount is a percentage off of the product's value"), ('Absolute', "Discount is a fixed amount off of the basket's total"), ('Fixed', "Discount is a fixed amount off of the product's value"), ('Multibuy', 'Discount is to give the cheapest product for free'), ('Fixed price', 'Get the products that meet the condition for a fixed price'), ('Shipping absolute', 'Discount is a fixed amount of the shipping cost'), ('Shipping fixed price', 'Get shipping for a fixed price'), ('Shipping percentage', 'Discount is a percentage off of the shipping cost')], max_length=128, verbose_name='Type'), + ), + migrations.AlterField( + model_name='historicalrange', + name='description', + field=models.TextField(blank=True, verbose_name='Description'), + ), + migrations.AlterField( + model_name='range', + name='description', + field=models.TextField(blank=True, verbose_name='Description'), + ), + ] diff --git a/ecommerce/extensions/order/migrations/0029_auto_20240522_1020.py b/ecommerce/extensions/order/migrations/0029_auto_20240522_1020.py new file mode 100644 index 00000000000..d82e9fffe7e --- /dev/null +++ b/ecommerce/extensions/order/migrations/0029_auto_20240522_1020.py @@ -0,0 +1,64 @@ +# Generated by Django 3.2.25 on 2024-05-22 10:20 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0028_alter_lineattribute_value'), + ] + + operations = [ + migrations.AlterModelOptions( + name='surcharge', + options={'ordering': ['pk'], 'verbose_name': 'Surcharge', 'verbose_name_plural': 'Surcharges'}, + ), + migrations.AddField( + model_name='historicalline', + name='tax_code', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), + ), + migrations.AddField( + model_name='historicalorder', + name='shipping_tax_code', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='Shipping VAT rate code'), + ), + migrations.AddField( + model_name='line', + name='tax_code', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), + ), + migrations.AddField( + model_name='lineprice', + name='tax_code', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), + ), + migrations.AddField( + model_name='order', + name='shipping_tax_code', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='Shipping VAT rate code'), + ), + migrations.AddField( + model_name='surcharge', + name='tax_code', + field=models.CharField(blank=True, max_length=64, null=True, verbose_name='VAT rate code'), + ), + migrations.CreateModel( + name='OrderLineDiscount', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_incl_tax', models.BooleanField()), + ('amount', models.DecimalField(decimal_places=2, default=0, max_digits=12, verbose_name='Line discount (excl. tax)')), + ('line', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='discounts', to='order.line', verbose_name='Line')), + ('order_discount', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='discount_lines', to='order.orderdiscount', verbose_name='Order discount')), + ], + options={ + 'verbose_name': 'Order line discount', + 'verbose_name_plural': 'Order line discounts', + 'ordering': ['pk'], + 'abstract': False, + }, + ), + ] diff --git a/media/failed_orders.txt b/media/failed_orders.txt new file mode 100644 index 00000000000..e5e0ba247f7 --- /dev/null +++ b/media/failed_orders.txt @@ -0,0 +1,3 @@ +EDX-101216 +EDX-101217 +EDX-101218 diff --git a/missing_orders_file.txt b/missing_orders_file.txt new file mode 100644 index 00000000000..2c943423d78 --- /dev/null +++ b/missing_orders_file.txt @@ -0,0 +1,2 @@ +EDX-101208 +EDX-101209 diff --git a/order_without_lines_file.txt b/order_without_lines_file.txt new file mode 100644 index 00000000000..2cd014c1e23 --- /dev/null +++ b/order_without_lines_file.txt @@ -0,0 +1,2 @@ +EDX-101210 +EDX-101211 diff --git a/orders_file.txt b/orders_file.txt new file mode 100644 index 00000000000..ddfad1ae336 --- /dev/null +++ b/orders_file.txt @@ -0,0 +1 @@ +EDX-22323 diff --git a/requirements/base.in b/requirements/base.in index ba09e456848..590ea2ff4cd 100755 --- a/requirements/base.in +++ b/requirements/base.in @@ -43,7 +43,7 @@ jsonfield2 libsass lxml[html_clean] markdown==3.4.3 -mysqlclient<1.5 +mysqlclient newrelic ndg-httpsclient openedx-atlas diff --git a/requirements/base.txt b/requirements/base.txt index 86236bfe7aa..90d6b1b5954 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -30,7 +30,7 @@ attrs==23.2.0 # jsonschema # referencing # zeep -babel==2.14.0 +babel==2.15.0 # via django-oscar backoff==1.10.0 # via analytics-python @@ -40,7 +40,7 @@ backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # celery # djangorestframework # kombu -bcrypt==4.1.2 +bcrypt==4.1.3 # via # cybersource-rest-client-python # paramiko @@ -48,9 +48,9 @@ billiard==4.2.0 # via celery bleach==6.1.0 # via -r requirements/base.in -boto3==1.34.96 +boto3==1.34.110 # via -r requirements/base.in -botocore==1.34.96 +botocore==1.34.110 # via # boto3 # s3transfer @@ -93,13 +93,13 @@ coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -coverage==7.5.0 +coverage==7.5.1 # via cybersource-rest-client-python crispy-bootstrap3==2024.1 # via -r requirements/base.in crypto==1.4.1 # via cybersource-rest-client-python -cryptography==42.0.5 +cryptography==42.0.7 # via # app-store-notifications-v2-validator # cybersource-rest-client-python @@ -109,7 +109,7 @@ cryptography==42.0.5 # social-auth-core cssselect==1.2.0 # via premailer -cssutils==2.10.2 +cssutils==2.11.0 # via premailer cybersource-rest-client-python==0.0.21 # via @@ -183,9 +183,9 @@ django-haystack==3.3b2 # via django-oscar django-libsass==0.9 # via -r requirements/base.in -django-model-utils==4.5.0 +django-model-utils==4.5.1 # via edx-rbac -django-oscar==3.2 +django-oscar==3.2.4 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -240,7 +240,7 @@ edx-django-release-util==1.4.0 # via -r requirements/base.in edx-django-sites-extensions==4.2.0 # via -r requirements/base.in -edx-django-utils==5.13.0 +edx-django-utils==5.14.0 # via # -r requirements/base.in # django-config-models @@ -259,7 +259,7 @@ edx-opaque-keys==2.9.0 # edx-drf-extensions edx-rbac==1.9.0 # via -r requirements/base.in -edx-rest-api-client==5.7.0 +edx-rest-api-client==5.6.1 # via # -r requirements/base.in # edx-ecommerce-worker @@ -269,7 +269,7 @@ extras==1.0.0 # via cybersource-rest-client-python factory-boy==3.2.1 # via django-oscar -faker==25.0.0 +faker==25.2.0 # via factory-boy fixtures==4.1.0 # via cybersource-rest-client-python @@ -326,7 +326,7 @@ isodate==0.6.1 # via zeep itypes==1.2.0 # via coreapi -jinja2==3.1.3 +jinja2==3.1.4 # via coreschema jmespath==1.0.1 # via @@ -352,7 +352,7 @@ linecache2==1.0.0 # traceback2 logger==1.4 # via cybersource-rest-client-python -lxml[html-clean,html_clean]==5.2.1 +lxml[html-clean,html_clean]==5.2.2 # via # -r requirements/base.in # lxml-html-clean @@ -370,7 +370,7 @@ multidict==6.0.5 # via # aiohttp # yarl -mysqlclient==1.4.6 +mysqlclient==2.2.4 # via -r requirements/base.in naked==0.1.32 # via @@ -378,7 +378,7 @@ naked==0.1.32 # cybersource-rest-client-python ndg-httpsclient==0.5.1 # via -r requirements/base.in -newrelic==9.9.0 +newrelic==9.9.1 # via # -r requirements/base.in # edx-django-utils @@ -408,13 +408,13 @@ pbr==6.0.0 # cybersource-rest-client-python # fixtures # stevedore -phonenumbers==8.13.35 +phonenumbers==8.13.37 # via django-oscar pillow==10.3.0 # via django-oscar pkgutil-resolve-name==1.3.10 # via jsonschema -platformdirs==4.2.1 +platformdirs==4.2.2 # via zeep premailer==2.9.2 # via -r requirements/base.in @@ -454,7 +454,7 @@ pycryptodome==3.20.0 # via cybersource-rest-client-python pycryptodomex==3.20.0 # via cybersource-rest-client-python -pygments==2.17.2 +pygments==2.18.0 # via -r requirements/base.in pyjwt[crypto]==2.8.0 # via @@ -524,8 +524,9 @@ referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.2 # via + # -c requirements/constraints.txt # -r requirements/base.in # analytics-python # coreapi @@ -543,7 +544,7 @@ requests==2.31.0 # social-auth-core # stripe # zeep -requests-file==2.0.0 +requests-file==2.1.0 # via zeep requests-oauthlib==2.0.0 # via @@ -553,7 +554,7 @@ requests-toolbelt==1.0.0 # via zeep rjsmin==1.2.1 # via django-compressor -rpds-py==0.18.0 +rpds-py==0.18.1 # via # jsonschema # referencing @@ -563,7 +564,7 @@ rsa==4.9 # google-auth # inapppy # oauth2client -rules==3.3 +rules==3.4 # via -r requirements/base.in s3transfer==0.10.1 # via boto3 @@ -608,7 +609,7 @@ stevedore==5.2.0 # via # edx-django-utils # edx-opaque-keys -stripe==9.4.0 +stripe==9.7.0 # via -r requirements/base.in testtools==2.7.1 # via @@ -660,11 +661,11 @@ yarl==1.9.4 # via aiohttp zeep==4.2.1 # via -r requirements/base.in -zipp==3.18.1 +zipp==3.18.2 # via # importlib-metadata # importlib-resources -zope-interface==6.3 +zope-interface==6.4.post0 # via # cybersource-rest-client-python # datetime diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 101ce47f946..6d226472013 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -15,13 +15,13 @@ cybersource-rest-client-python==0.0.21 # Django 3.2 support is added in version 2.2 so pinning it to 2.2 -django-oscar==3.2 +django-oscar==3.2.4 # Pinned because transifex-client==0.13.6 pins it urllib3>=1.24.2,<2.0.0 # Was causing some tox issues locally. -virtualenv==16.7.9 +virtualenv==20.26.2 # greater versions failing with extract-translations step. tox==3.14.6 @@ -41,17 +41,16 @@ social-auth-app-django==5.2.0 # (see pytest-selenium/issues/294) # - pytest-variables v3 uses pytest.stash instead of _variables. This # conflicts with how pytest-selenium uses variables prior to v3. -selenium<4.0.0 -pytest-selenium<3.0.0 -pytest-variables<3.0.0 +selenium==4.21.0 +pytest-selenium==4.1.0 +pytest-variables==3.1.0 +requests==2.32.2 -# pylint>2.12.2 requires a lot of quality fixes. Can be resolved later on. -pylint==2.12.2 -# pylint==2.12.2 requires mccabe<0.7.0 -mccabe<0.7 -# pylint==2.12.2 requires wrapt<1.14 -wrapt<1.14 +pylint==2.17.7 # backports-zoneinfo comes by-default in newer versions of python # it gives error while building wheel with python>=3.9 backports.zoneinfo ; python_version < "3.9" + +# python3.8 does not support newer version +accessible-pygments==0.0.4 \ No newline at end of file diff --git a/requirements/dev.in b/requirements/dev.in index e45bfdb001a..6a81372cbe7 100644 --- a/requirements/dev.in +++ b/requirements/dev.in @@ -2,7 +2,6 @@ -r docs.txt django-debug-toolbar - # i18n # newer version of transifex-client doesn't work with python3.12.2 transifex-client==0.12.5 @@ -11,4 +10,4 @@ transifex-client==0.12.5 ptvsd # For devserver code reloading -pywatchman +pywatchman \ No newline at end of file diff --git a/requirements/dev.txt b/requirements/dev.txt index 43bebdc53bb..bc86bada138 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -37,7 +37,7 @@ asn1crypto==1.5.1 # via # -r requirements/test.txt # cybersource-rest-client-python -astroid==2.9.3 +astroid==2.15.8 # via # -r requirements/test.txt # pylint @@ -51,9 +51,11 @@ attrs==23.2.0 # -r requirements/test.txt # aiohttp # jsonschema + # outcome # referencing + # trio # zeep -babel==2.14.0 +babel==2.15.0 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -70,7 +72,7 @@ backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # celery # djangorestframework # kombu -bcrypt==4.1.2 +bcrypt==4.1.3 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -87,9 +89,9 @@ billiard==4.2.0 # celery bleach==6.1.0 # via -r requirements/test.txt -boto3==1.34.96 +boto3==1.34.110 # via -r requirements/test.txt -botocore==1.34.96 +botocore==1.34.110 # via # -r requirements/test.txt # boto3 @@ -108,6 +110,7 @@ certifi==2024.2.2 # -r requirements/test.txt # cybersource-rest-client-python # requests + # selenium cffi==1.16.0 # via # -r requirements/test.txt @@ -155,7 +158,7 @@ coreschema==0.0.4 # via # -r requirements/test.txt # coreapi -coverage[toml]==7.5.0 +coverage[toml]==7.5.1 # via # -r requirements/test.txt # cybersource-rest-client-python @@ -166,7 +169,7 @@ crypto==1.4.1 # via # -r requirements/test.txt # cybersource-rest-client-python -cryptography==42.0.5 +cryptography==42.0.7 # via # -r requirements/test.txt # app-store-notifications-v2-validator @@ -179,7 +182,7 @@ cssselect==1.2.0 # via # -r requirements/test.txt # premailer -cssutils==2.10.2 +cssutils==2.11.0 # via # -r requirements/test.txt # premailer @@ -196,8 +199,16 @@ defusedxml==0.8.0rc2 # -r requirements/test.txt # python3-openid # social-auth-core -diff-cover==7.7.0 +diff-cover==9.0.0 # via -r requirements/test.txt +dill==0.3.8 + # via + # -r requirements/test.txt + # pylint +distlib==0.3.8 + # via + # -r requirements/test.txt + # virtualenv django==3.2.25 # via # -r requirements/test.txt @@ -270,11 +281,11 @@ django-haystack==3.3b2 # django-oscar django-libsass==0.9 # via -r requirements/test.txt -django-model-utils==4.5.0 +django-model-utils==4.5.1 # via # -r requirements/test.txt # edx-rbac -django-oscar==3.2 +django-oscar==3.2.4 # via -r requirements/test.txt django-phonenumber-field==6.4.0 # via @@ -346,7 +357,7 @@ edx-django-release-util==1.4.0 # via -r requirements/test.txt edx-django-sites-extensions==4.2.0 # via -r requirements/test.txt -edx-django-utils==5.13.0 +edx-django-utils==5.14.0 # via # -r requirements/test.txt # django-config-models @@ -367,7 +378,7 @@ edx-opaque-keys==2.9.0 # edx-drf-extensions edx-rbac==1.9.0 # via -r requirements/test.txt -edx-rest-api-client==5.7.0 +edx-rest-api-client==5.6.1 # via # -r requirements/test.txt # edx-ecommerce-worker @@ -379,6 +390,8 @@ exceptiongroup==1.2.1 # via # -r requirements/test.txt # pytest + # trio + # trio-websocket extras==1.0.0 # via # -r requirements/test.txt @@ -387,7 +400,7 @@ factory-boy==3.2.1 # via # -r requirements/test.txt # django-oscar -faker==25.0.0 +faker==25.2.0 # via # -r requirements/test.txt # factory-boy @@ -395,11 +408,12 @@ filelock==3.14.0 # via # -r requirements/test.txt # tox + # virtualenv fixtures==4.1.0 # via # -r requirements/test.txt # cybersource-rest-client-python -freezegun==1.5.0 +freezegun==1.5.1 # via -r requirements/test.txt frozenlist==1.4.1 # via @@ -438,6 +452,10 @@ googleapis-common-protos==1.63.0 # via # -r requirements/test.txt # google-api-core +h11==0.14.0 + # via + # -r requirements/test.txt + # wsproto httplib2==0.20.2 # via # -r requirements/test.txt @@ -450,6 +468,7 @@ idna==2.7 # -r requirements/test.txt # cybersource-rest-client-python # requests + # trio # yarl imagesize==1.4.1 # via @@ -497,7 +516,7 @@ itypes==1.2.0 # via # -r requirements/test.txt # coreapi -jinja2==3.1.3 +jinja2==3.1.4 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -543,7 +562,7 @@ logger==1.4 # via # -r requirements/test.txt # cybersource-rest-client-python -lxml[html-clean]==5.2.1 +lxml[html-clean]==5.2.2 # via # -r requirements/test.txt # edx-i18n-tools @@ -559,7 +578,7 @@ markupsafe==2.1.5 # -r requirements/docs.txt # -r requirements/test.txt # jinja2 -mccabe==0.6.1 +mccabe==0.7.0 # via # -r requirements/test.txt # pylint @@ -574,7 +593,7 @@ multidict==6.0.5 # -r requirements/test.txt # aiohttp # yarl -mysqlclient==1.4.6 +mysqlclient==2.2.4 # via -r requirements/test.txt naked==0.1.32 # via @@ -583,7 +602,7 @@ naked==0.1.32 # cybersource-rest-client-python ndg-httpsclient==0.5.1 # via -r requirements/test.txt -newrelic==9.9.0 +newrelic==9.9.1 # via # -r requirements/test.txt # edx-django-utils @@ -603,6 +622,10 @@ oauthlib==3.2.2 # social-auth-core openedx-atlas==0.6.0 # via -r requirements/test.txt +outcome==1.3.0.post0 + # via + # -r requirements/test.txt + # trio packaging==24.0 # via # -r requirements/docs.txt @@ -631,7 +654,7 @@ pbr==6.0.0 # cybersource-rest-client-python # fixtures # stevedore -phonenumbers==8.13.35 +phonenumbers==8.13.37 # via # -r requirements/test.txt # django-oscar @@ -643,10 +666,11 @@ pkgutil-resolve-name==1.3.10 # via # -r requirements/test.txt # jsonschema -platformdirs==4.2.1 +platformdirs==4.2.2 # via # -r requirements/test.txt # pylint + # virtualenv # zeep pluggy==0.13.1 # via @@ -725,7 +749,7 @@ pydata-sphinx-theme==0.14.4 # via # -r requirements/docs.txt # sphinx-book-theme -pygments==2.17.2 +pygments==2.18.0 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -745,7 +769,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==2.12.2 +pylint==2.17.7 # via -r requirements/test.txt pymongo==4.4.0 # via @@ -772,6 +796,10 @@ pypi==2.1 # via # -r requirements/test.txt # cybersource-rest-client-python +pysocks==1.7.1 + # via + # -r requirements/test.txt + # urllib3 pytest==7.4.4 # via # -r requirements/test.txt @@ -802,11 +830,11 @@ pytest-metadata==3.1.1 # pytest-html pytest-randomly==3.15.0 # via -r requirements/test.txt -pytest-selenium==2.0.1 +pytest-selenium==4.1.0 # via -r requirements/test.txt pytest-timeout==2.3.1 # via -r requirements/test.txt -pytest-variables==2.0.0 +pytest-variables==3.1.0 # via # -r requirements/test.txt # pytest-selenium @@ -874,7 +902,7 @@ referencing==0.35.1 # -r requirements/test.txt # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.2 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -899,7 +927,7 @@ requests==2.31.0 # sphinx # stripe # zeep -requests-file==2.0.0 +requests-file==2.1.0 # via # -r requirements/test.txt # zeep @@ -918,7 +946,7 @@ rjsmin==1.2.1 # via # -r requirements/test.txt # django-compressor -rpds-py==0.18.0 +rpds-py==0.18.1 # via # -r requirements/test.txt # jsonschema @@ -930,13 +958,13 @@ rsa==4.9 # google-auth # inapppy # oauth2client -rules==3.3 +rules==3.4 # via -r requirements/test.txt s3transfer==0.10.1 # via # -r requirements/test.txt # boto3 -selenium==3.141.0 +selenium==4.21.0 # via # -r requirements/test.txt # pytest-selenium @@ -968,13 +996,16 @@ six==1.16.0 # pyjwkest # python-dateutil # python-memcached - # tenacity # tox # transifex-client slumber==0.7.1 # via # -r requirements/test.txt # edx-rest-api-client +sniffio==1.3.1 + # via + # -r requirements/test.txt + # trio snowballstemmer==2.2.0 # via # -r requirements/docs.txt @@ -990,6 +1021,10 @@ social-auth-core==4.5.4 # social-auth-app-django sorl-thumbnail==12.10.0 # via -r requirements/test.txt +sortedcontainers==2.4.0 + # via + # -r requirements/test.txt + # trio soupsieve==2.5 # via # -r requirements/docs.txt @@ -1036,9 +1071,9 @@ stevedore==5.2.0 # -r requirements/test.txt # edx-django-utils # edx-opaque-keys -stripe==9.4.0 +stripe==9.7.0 # via -r requirements/test.txt -tenacity==6.3.1 +tenacity==8.3.0 # via # -r requirements/test.txt # pytest-selenium @@ -1052,13 +1087,17 @@ testtools==2.7.1 toml==0.10.2 # via # -r requirements/test.txt - # pylint # tox tomli==2.0.1 # via # -r requirements/test.txt # coverage + # pylint # pytest +tomlkit==0.12.5 + # via + # -r requirements/test.txt + # pylint tox==3.14.6 # via # -r requirements/test.txt @@ -1071,6 +1110,15 @@ traceback2==1.4.0 # cybersource-rest-client-python transifex-client==0.12.5 # via -r requirements/dev.in +trio==0.25.1 + # via + # -r requirements/test.txt + # selenium + # trio-websocket +trio-websocket==0.11.1 + # via + # -r requirements/test.txt + # selenium typing==3.7.4.3 # via # -r requirements/test.txt @@ -1085,6 +1133,7 @@ typing-extensions==4.11.0 # kombu # pydata-sphinx-theme # pylint + # selenium # stripe tzdata==2024.1 # via @@ -1099,7 +1148,7 @@ uritemplate==4.1.1 # coreapi # drf-yasg # google-api-python-client -urllib3==1.26.18 +urllib3[socks]==1.26.18 # via # -r requirements/docs.txt # -r requirements/test.txt @@ -1115,7 +1164,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==16.7.9 +virtualenv==20.26.2 # via # -r requirements/test.txt # tox @@ -1143,10 +1192,14 @@ wheel==0.43.0 # via # -r requirements/test.txt # cybersource-rest-client-python -wrapt==1.13.3 +wrapt==1.16.0 # via # -r requirements/test.txt # astroid +wsproto==1.2.0 + # via + # -r requirements/test.txt + # trio-websocket x509==0.1 # via # -r requirements/test.txt @@ -1159,13 +1212,13 @@ yarl==1.9.4 # aiohttp zeep==4.2.1 # via -r requirements/test.txt -zipp==3.18.1 +zipp==3.18.2 # via # -r requirements/docs.txt # -r requirements/test.txt # importlib-metadata # importlib-resources -zope-interface==6.3 +zope-interface==6.4.post0 # via # -r requirements/test.txt # cybersource-rest-client-python diff --git a/requirements/docs.txt b/requirements/docs.txt index 33ba2bc0f4f..1acc36c0730 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -5,10 +5,12 @@ # make upgrade # accessible-pygments==0.0.4 - # via pydata-sphinx-theme + # via + # -c requirements/constraints.txt + # pydata-sphinx-theme alabaster==0.7.13 # via sphinx -babel==2.14.0 +babel==2.15.0 # via # pydata-sphinx-theme # sphinx @@ -30,7 +32,7 @@ imagesize==1.4.1 # via sphinx importlib-metadata==7.1.0 # via sphinx -jinja2==3.1.3 +jinja2==3.1.4 # via sphinx markupsafe==2.1.5 # via jinja2 @@ -40,15 +42,17 @@ packaging==24.0 # sphinx pydata-sphinx-theme==0.14.4 # via sphinx-book-theme -pygments==2.17.2 +pygments==2.18.0 # via # accessible-pygments # pydata-sphinx-theme # sphinx pytz==2024.1 # via babel -requests==2.31.0 - # via sphinx +requests==2.32.2 + # via + # -c requirements/constraints.txt + # sphinx snowballstemmer==2.2.0 # via sphinx soupsieve==2.5 @@ -78,5 +82,5 @@ urllib3==1.26.18 # via # -c requirements/constraints.txt # requests -zipp==3.18.1 +zipp==3.18.2 # via importlib-metadata diff --git a/requirements/e2e.txt b/requirements/e2e.txt index 1261c29ebfa..fe572fcfe0f 100644 --- a/requirements/e2e.txt +++ b/requirements/e2e.txt @@ -8,10 +8,16 @@ asgiref==3.8.1 # via # -c requirements/base.txt # django +attrs==23.2.0 + # via + # -c requirements/base.txt + # outcome + # trio certifi==2024.2.2 # via # -c requirements/base.txt # requests + # selenium cffi==1.16.0 # via # -c requirements/base.txt @@ -39,30 +45,36 @@ django-waffle==4.1.0 # via # -c requirements/base.txt # edx-django-utils -edx-django-utils==5.13.0 +edx-django-utils==5.14.0 # via # -c requirements/base.txt # edx-rest-api-client -edx-rest-api-client==5.7.0 +edx-rest-api-client==5.6.1 # via # -c requirements/base.txt # -r requirements/e2e.in exceptiongroup==1.2.1 - # via pytest + # via + # pytest + # trio + # trio-websocket future==1.0.0 # via pyjwkest +h11==0.14.0 + # via wsproto idna==2.7 # via # -c requirements/base.txt # -c requirements/constraints.txt # requests + # trio importlib-metadata==7.1.0 # via # -c requirements/base.txt # pytest-randomly iniconfig==2.0.0 # via pytest -jinja2==3.1.3 +jinja2==3.1.4 # via # -c requirements/base.txt # pytest-html @@ -70,10 +82,12 @@ markupsafe==2.1.5 # via # -c requirements/base.txt # jinja2 -newrelic==9.9.0 +newrelic==9.9.1 # via # -c requirements/base.txt # edx-django-utils +outcome==1.3.0.post0 + # via trio packaging==24.0 # via # -c requirements/base.txt @@ -108,6 +122,8 @@ pynacl==1.5.0 # via # -c requirements/base.txt # edx-django-utils +pysocks==1.7.1 + # via urllib3 pytest==7.4.4 # via # -r requirements/e2e.in @@ -126,13 +142,13 @@ pytest-metadata==3.1.1 # via pytest-html pytest-randomly==3.15.0 # via -r requirements/e2e.in -pytest-selenium==2.0.1 +pytest-selenium==4.1.0 # via # -c requirements/constraints.txt # -r requirements/e2e.in pytest-timeout==2.3.1 # via -r requirements/e2e.in -pytest-variables==2.0.0 +pytest-variables==3.1.0 # via # -c requirements/constraints.txt # pytest-selenium @@ -142,15 +158,16 @@ pytz==2024.1 # via # -c requirements/base.txt # django -requests==2.31.0 +requests==2.32.2 # via # -c requirements/base.txt + # -c requirements/constraints.txt # edx-rest-api-client # pyjwkest # pytest-base-url # pytest-selenium # slumber -selenium==3.141.0 +selenium==4.21.0 # via # -c requirements/constraints.txt # -r requirements/e2e.in @@ -159,11 +176,14 @@ six==1.16.0 # via # -c requirements/base.txt # pyjwkest - # tenacity slumber==0.7.1 # via # -c requirements/base.txt # edx-rest-api-client +sniffio==1.3.1 + # via trio +sortedcontainers==2.4.0 + # via trio sqlparse==0.5.0 # via # -c requirements/base.txt @@ -172,21 +192,30 @@ stevedore==5.2.0 # via # -c requirements/base.txt # edx-django-utils -tenacity==6.3.1 +tenacity==8.3.0 # via pytest-selenium tomli==2.0.1 # via pytest +trio==0.25.1 + # via + # selenium + # trio-websocket +trio-websocket==0.11.1 + # via selenium typing-extensions==4.11.0 # via # -c requirements/base.txt # asgiref -urllib3==1.26.18 + # selenium +urllib3[socks]==1.26.18 # via # -c requirements/base.txt # -c requirements/constraints.txt # requests # selenium -zipp==3.18.1 +wsproto==1.2.0 + # via trio-websocket +zipp==3.18.2 # via # -c requirements/base.txt # importlib-metadata diff --git a/requirements/pip.txt b/requirements/pip.txt index e3ffcc7b6da..8a72bb0b5e3 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -10,5 +10,5 @@ wheel==0.43.0 # The following packages are considered to be unsafe in a requirements file: pip==24.0 # via -r requirements/pip.in -setuptools==69.5.1 +setuptools==70.0.0 # via -r requirements/pip.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index 858719e3767..0ae0a48cd90 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -24,7 +24,7 @@ tomli==2.0.1 # pip-tools wheel==0.43.0 # via pip-tools -zipp==3.18.1 +zipp==3.18.2 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/production.txt b/requirements/production.txt index 08b200d011d..f152338e87c 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -30,7 +30,7 @@ attrs==23.2.0 # jsonschema # referencing # zeep -babel==2.14.0 +babel==2.15.0 # via django-oscar backoff==1.10.0 # via analytics-python @@ -40,7 +40,7 @@ backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # celery # djangorestframework # kombu -bcrypt==4.1.2 +bcrypt==4.1.3 # via # cybersource-rest-client-python # paramiko @@ -48,11 +48,11 @@ billiard==4.2.0 # via celery bleach==6.1.0 # via -r requirements/base.in -boto3==1.34.96 +boto3==1.34.110 # via # -r requirements/base.in # django-ses -botocore==1.34.96 +botocore==1.34.110 # via # boto3 # s3transfer @@ -95,13 +95,13 @@ coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -coverage==7.5.0 +coverage==7.5.1 # via cybersource-rest-client-python crispy-bootstrap3==2024.1 # via -r requirements/base.in crypto==1.4.1 # via cybersource-rest-client-python -cryptography==42.0.5 +cryptography==42.0.7 # via # app-store-notifications-v2-validator # cybersource-rest-client-python @@ -111,7 +111,7 @@ cryptography==42.0.5 # social-auth-core cssselect==1.2.0 # via premailer -cssutils==2.10.2 +cssutils==2.11.0 # via premailer cybersource-rest-client-python==0.0.21 # via @@ -186,9 +186,9 @@ django-haystack==3.3b2 # via django-oscar django-libsass==0.9 # via -r requirements/base.in -django-model-utils==4.5.0 +django-model-utils==4.5.1 # via edx-rbac -django-oscar==3.2 +django-oscar==3.2.4 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -245,7 +245,7 @@ edx-django-release-util==1.4.0 # via -r requirements/base.in edx-django-sites-extensions==4.2.0 # via -r requirements/base.in -edx-django-utils==5.13.0 +edx-django-utils==5.14.0 # via # -r requirements/base.in # django-config-models @@ -264,7 +264,7 @@ edx-opaque-keys==2.9.0 # edx-drf-extensions edx-rbac==1.9.0 # via -r requirements/base.in -edx-rest-api-client==5.7.0 +edx-rest-api-client==5.6.1 # via # -r requirements/base.in # edx-ecommerce-worker @@ -274,7 +274,7 @@ extras==1.0.0 # via cybersource-rest-client-python factory-boy==3.2.1 # via django-oscar -faker==25.0.0 +faker==25.2.0 # via factory-boy fixtures==4.1.0 # via cybersource-rest-client-python @@ -333,7 +333,7 @@ isodate==0.6.1 # via zeep itypes==1.2.0 # via coreapi -jinja2==3.1.3 +jinja2==3.1.4 # via coreschema jmespath==1.0.1 # via @@ -359,7 +359,7 @@ linecache2==1.0.0 # traceback2 logger==1.4 # via cybersource-rest-client-python -lxml[html-clean,html_clean]==5.2.1 +lxml[html-clean,html_clean]==5.2.2 # via # -r requirements/base.in # lxml-html-clean @@ -377,7 +377,7 @@ multidict==6.0.5 # via # aiohttp # yarl -mysqlclient==1.4.6 +mysqlclient==2.2.4 # via -r requirements/base.in naked==0.1.32 # via @@ -385,7 +385,7 @@ naked==0.1.32 # cybersource-rest-client-python ndg-httpsclient==0.5.1 # via -r requirements/base.in -newrelic==9.9.0 +newrelic==9.9.1 # via # -r requirements/base.in # -r requirements/production.in @@ -418,13 +418,13 @@ pbr==6.0.0 # cybersource-rest-client-python # fixtures # stevedore -phonenumbers==8.13.35 +phonenumbers==8.13.37 # via django-oscar pillow==10.3.0 # via django-oscar pkgutil-resolve-name==1.3.10 # via jsonschema -platformdirs==4.2.1 +platformdirs==4.2.2 # via zeep premailer==2.9.2 # via -r requirements/base.in @@ -464,7 +464,7 @@ pycryptodome==3.20.0 # via cybersource-rest-client-python pycryptodomex==3.20.0 # via cybersource-rest-client-python -pygments==2.17.2 +pygments==2.18.0 # via -r requirements/base.in pyjwt[crypto]==2.8.0 # via @@ -540,8 +540,9 @@ referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.2 # via + # -c requirements/constraints.txt # -r requirements/base.in # analytics-python # coreapi @@ -559,7 +560,7 @@ requests==2.31.0 # social-auth-core # stripe # zeep -requests-file==2.0.0 +requests-file==2.1.0 # via zeep requests-oauthlib==2.0.0 # via @@ -569,7 +570,7 @@ requests-toolbelt==1.0.0 # via zeep rjsmin==1.2.1 # via django-compressor -rpds-py==0.18.0 +rpds-py==0.18.1 # via # jsonschema # referencing @@ -579,7 +580,7 @@ rsa==4.9 # google-auth # inapppy # oauth2client -rules==3.3 +rules==3.4 # via -r requirements/base.in s3transfer==0.10.1 # via boto3 @@ -625,7 +626,7 @@ stevedore==5.2.0 # via # edx-django-utils # edx-opaque-keys -stripe==9.4.0 +stripe==9.7.0 # via -r requirements/base.in testtools==2.7.1 # via @@ -677,11 +678,11 @@ yarl==1.9.4 # via aiohttp zeep==4.2.1 # via -r requirements/base.in -zipp==3.18.1 +zipp==3.18.2 # via # importlib-metadata # importlib-resources -zope-interface==6.3 +zope-interface==6.4.post0 # via # cybersource-rest-client-python # datetime diff --git a/requirements/test.txt b/requirements/test.txt index 53df258e568..c72e9ccf78d 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -30,7 +30,7 @@ asn1crypto==1.5.1 # via # -r requirements/base.txt # cybersource-rest-client-python -astroid==2.9.3 +astroid==2.15.8 # via pylint async-timeout==4.0.3 # via @@ -40,11 +40,14 @@ async-timeout==4.0.3 attrs==23.2.0 # via # -r requirements/base.txt + # -r requirements/e2e.txt # aiohttp # jsonschema + # outcome # referencing + # trio # zeep -babel==2.14.0 +babel==2.15.0 # via # -r requirements/base.txt # django-oscar @@ -59,7 +62,7 @@ backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # celery # djangorestframework # kombu -bcrypt==4.1.2 +bcrypt==4.1.3 # via # -r requirements/base.txt # cybersource-rest-client-python @@ -72,9 +75,9 @@ billiard==4.2.0 # celery bleach==6.1.0 # via -r requirements/base.txt -boto3==1.34.96 +boto3==1.34.110 # via -r requirements/base.txt -botocore==1.34.96 +botocore==1.34.110 # via # -r requirements/base.txt # boto3 @@ -94,6 +97,7 @@ certifi==2024.2.2 # -r requirements/e2e.txt # cybersource-rest-client-python # requests + # selenium cffi==1.16.0 # via # -r requirements/base.txt @@ -143,7 +147,7 @@ coreschema==0.0.4 # via # -r requirements/base.txt # coreapi -coverage[toml]==7.5.0 +coverage[toml]==7.5.1 # via # -r requirements/base.txt # -r requirements/test.in @@ -155,7 +159,7 @@ crypto==1.4.1 # via # -r requirements/base.txt # cybersource-rest-client-python -cryptography==42.0.5 +cryptography==42.0.7 # via # -r requirements/base.txt # app-store-notifications-v2-validator @@ -168,7 +172,7 @@ cssselect==1.2.0 # via # -r requirements/base.txt # premailer -cssutils==2.10.2 +cssutils==2.11.0 # via # -r requirements/base.txt # premailer @@ -187,8 +191,14 @@ defusedxml==0.8.0rc2 # -r requirements/base.txt # python3-openid # social-auth-core -diff-cover==7.7.0 +diff-cover==9.0.0 # via -r requirements/test.in +dill==0.3.8 + # via pylint +distlib==0.3.8 + # via + # -r requirements/tox.txt + # virtualenv # via # -c requirements/common_constraints.txt # -r requirements/base.txt @@ -260,11 +270,11 @@ django-haystack==3.3b2 # django-oscar django-libsass==0.9 # via -r requirements/base.txt -django-model-utils==4.5.0 +django-model-utils==4.5.1 # via # -r requirements/base.txt # edx-rbac -django-oscar==3.2 +django-oscar==3.2.4 # via # -c requirements/constraints.txt # -r requirements/base.txt @@ -336,7 +346,7 @@ edx-django-release-util==1.4.0 # via -r requirements/base.txt edx-django-sites-extensions==4.2.0 # via -r requirements/base.txt -edx-django-utils==5.13.0 +edx-django-utils==5.14.0 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -358,7 +368,7 @@ edx-opaque-keys==2.9.0 # edx-drf-extensions edx-rbac==1.9.0 # via -r requirements/base.txt -edx-rest-api-client==5.7.0 +edx-rest-api-client==5.6.1 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -371,6 +381,8 @@ exceptiongroup==1.2.1 # via # -r requirements/e2e.txt # pytest + # trio + # trio-websocket extras==1.0.0 # via # -r requirements/base.txt @@ -380,7 +392,7 @@ factory-boy==3.2.1 # -r requirements/base.txt # -r requirements/test.in # django-oscar -faker==25.0.0 +faker==25.2.0 # via # -r requirements/base.txt # factory-boy @@ -388,11 +400,12 @@ filelock==3.14.0 # via # -r requirements/tox.txt # tox + # virtualenv fixtures==4.1.0 # via # -r requirements/base.txt # cybersource-rest-client-python -freezegun==1.5.0 +freezegun==1.5.1 # via -r requirements/test.in frozenlist==1.4.1 # via @@ -431,6 +444,10 @@ googleapis-common-protos==1.63.0 # via # -r requirements/base.txt # google-api-core +h11==0.14.0 + # via + # -r requirements/e2e.txt + # wsproto httplib2==0.20.2 # via # -r requirements/base.txt @@ -444,6 +461,7 @@ idna==2.7 # -r requirements/e2e.txt # cybersource-rest-client-python # requests + # trio # yarl importlib-metadata==7.1.0 # via @@ -486,7 +504,7 @@ itypes==1.2.0 # via # -r requirements/base.txt # coreapi -jinja2==3.1.3 +jinja2==3.1.4 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -529,7 +547,7 @@ logger==1.4 # via # -r requirements/base.txt # cybersource-rest-client-python -lxml[html-clean]==5.2.1 +lxml[html-clean]==5.2.2 # via # -r requirements/base.txt # -r requirements/test.in @@ -548,10 +566,8 @@ markupsafe==2.1.5 # -r requirements/base.txt # -r requirements/e2e.txt # jinja2 -mccabe==0.6.1 - # via - # -c requirements/constraints.txt - # pylint +mccabe==0.7.0 + # via pylint mock==5.1.0 # via -r requirements/test.in monotonic==1.6 @@ -563,7 +579,7 @@ multidict==6.0.5 # -r requirements/base.txt # aiohttp # yarl -mysqlclient==1.4.6 +mysqlclient==2.2.4 # via -r requirements/base.txt naked==0.1.32 # via @@ -572,7 +588,7 @@ naked==0.1.32 # cybersource-rest-client-python ndg-httpsclient==0.5.1 # via -r requirements/base.txt -newrelic==9.9.0 +newrelic==9.9.1 # via # -r requirements/base.txt # -r requirements/e2e.txt @@ -593,6 +609,10 @@ oauthlib==3.2.2 # social-auth-core openedx-atlas==0.6.0 # via -r requirements/base.txt +outcome==1.3.0.post0 + # via + # -r requirements/e2e.txt + # trio packaging==24.0 # via # -r requirements/base.txt @@ -619,7 +639,7 @@ pbr==6.0.0 # cybersource-rest-client-python # fixtures # stevedore -phonenumbers==8.13.35 +phonenumbers==8.13.37 # via # -r requirements/base.txt # django-oscar @@ -631,10 +651,12 @@ pkgutil-resolve-name==1.3.10 # via # -r requirements/base.txt # jsonschema -platformdirs==4.2.1 +platformdirs==4.2.2 # via # -r requirements/base.txt + # -r requirements/tox.txt # pylint + # virtualenv # zeep pluggy==0.13.1 # via @@ -710,7 +732,7 @@ pycryptodomex==3.20.0 # -r requirements/e2e.txt # cybersource-rest-client-python # pyjwkest -pygments==2.17.2 +pygments==2.18.0 # via # -r requirements/base.txt # diff-cover @@ -727,7 +749,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==2.12.2 +pylint==2.17.7 # via # -c requirements/constraints.txt # -r requirements/test.in @@ -757,6 +779,10 @@ pypi==2.1 # via # -r requirements/base.txt # cybersource-rest-client-python +pysocks==1.7.1 + # via + # -r requirements/e2e.txt + # urllib3 pytest==7.4.4 # via # -r requirements/e2e.txt @@ -788,13 +814,13 @@ pytest-metadata==3.1.1 # pytest-html pytest-randomly==3.15.0 # via -r requirements/e2e.txt -pytest-selenium==2.0.1 +pytest-selenium==4.1.0 # via # -c requirements/constraints.txt # -r requirements/e2e.txt pytest-timeout==2.3.1 # via -r requirements/e2e.txt -pytest-variables==2.0.0 +pytest-variables==3.1.0 # via # -c requirements/constraints.txt # -r requirements/e2e.txt @@ -861,8 +887,9 @@ referencing==0.35.1 # -r requirements/base.txt # jsonschema # jsonschema-specifications -requests==2.31.0 +requests==2.32.2 # via + # -c requirements/constraints.txt # -r requirements/base.txt # -r requirements/e2e.txt # analytics-python @@ -885,7 +912,7 @@ requests==2.31.0 # social-auth-core # stripe # zeep -requests-file==2.0.0 +requests-file==2.1.0 # via # -r requirements/base.txt # zeep @@ -904,7 +931,7 @@ rjsmin==1.2.1 # via # -r requirements/base.txt # django-compressor -rpds-py==0.18.0 +rpds-py==0.18.1 # via # -r requirements/base.txt # jsonschema @@ -916,13 +943,13 @@ rsa==4.9 # google-auth # inapppy # oauth2client -rules==3.3 +rules==3.4 # via -r requirements/base.txt s3transfer==0.10.1 # via # -r requirements/base.txt # boto3 -selenium==3.141.0 +selenium==4.21.0 # via # -c requirements/constraints.txt # -r requirements/e2e.txt @@ -958,13 +985,16 @@ six==1.16.0 # pyjwkest # python-dateutil # python-memcached - # tenacity # tox slumber==0.7.1 # via # -r requirements/base.txt # -r requirements/e2e.txt # edx-rest-api-client +sniffio==1.3.1 + # via + # -r requirements/e2e.txt + # trio social-auth-app-django==5.2.0 # via # -c requirements/constraints.txt @@ -977,6 +1007,10 @@ social-auth-core==4.5.4 # social-auth-app-django sorl-thumbnail==12.10.0 # via -r requirements/base.txt +sortedcontainers==2.4.0 + # via + # -r requirements/e2e.txt + # trio soupsieve==2.5 # via beautifulsoup4 sqlparse==0.5.0 @@ -990,9 +1024,9 @@ stevedore==5.2.0 # -r requirements/e2e.txt # edx-django-utils # edx-opaque-keys -stripe==9.4.0 +stripe==9.7.0 # via -r requirements/base.txt -tenacity==6.3.1 +tenacity==8.3.0 # via # -r requirements/e2e.txt # pytest-selenium @@ -1006,13 +1040,15 @@ testtools==2.7.1 toml==0.10.2 # via # -r requirements/tox.txt - # pylint # tox tomli==2.0.1 # via # -r requirements/e2e.txt # coverage + # pylint # pytest +tomlkit==0.12.5 + # via pylint tox==3.14.6 # via # -c requirements/constraints.txt @@ -1024,6 +1060,15 @@ traceback2==1.4.0 # via # -r requirements/base.txt # cybersource-rest-client-python +trio==0.25.1 + # via + # -r requirements/e2e.txt + # selenium + # trio-websocket +trio-websocket==0.11.1 + # via + # -r requirements/e2e.txt + # selenium typing==3.7.4.3 # via # -r requirements/base.txt @@ -1037,6 +1082,7 @@ typing-extensions==4.11.0 # edx-opaque-keys # kombu # pylint + # selenium # stripe tzdata==2024.1 # via @@ -1051,7 +1097,7 @@ uritemplate==4.1.1 # coreapi # drf-yasg # google-api-python-client -urllib3==1.26.18 +urllib3[socks]==1.26.18 # via # -c requirements/constraints.txt # -r requirements/base.txt @@ -1067,7 +1113,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==16.7.9 +virtualenv==20.26.2 # via # -c requirements/constraints.txt # -r requirements/tox.txt @@ -1090,10 +1136,12 @@ wheel==0.43.0 # via # -r requirements/base.txt # cybersource-rest-client-python -wrapt==1.13.3 +wrapt==1.16.0 + # via astroid +wsproto==1.2.0 # via - # -c requirements/constraints.txt - # astroid + # -r requirements/e2e.txt + # trio-websocket x509==0.1 # via # -r requirements/base.txt @@ -1106,13 +1154,13 @@ yarl==1.9.4 # aiohttp zeep==4.2.1 # via -r requirements/base.txt -zipp==3.18.1 +zipp==3.18.2 # via # -r requirements/base.txt # -r requirements/e2e.txt # importlib-metadata # importlib-resources -zope-interface==6.3 +zope-interface==6.4.post0 # via # -r requirements/base.txt # cybersource-rest-client-python diff --git a/requirements/tox.txt b/requirements/tox.txt index 7d48facdbc5..6426b2a6348 100644 --- a/requirements/tox.txt +++ b/requirements/tox.txt @@ -4,10 +4,16 @@ # # make upgrade # +distlib==0.3.8 + # via virtualenv filelock==3.14.0 - # via tox + # via + # tox + # virtualenv packaging==24.0 # via tox +platformdirs==4.2.2 + # via virtualenv pluggy==0.13.1 # via # -c requirements/constraints.txt @@ -25,7 +31,7 @@ tox==3.14.6 # tox-battery tox-battery==0.6.2 # via -r requirements/tox.in -virtualenv==16.7.9 +virtualenv==20.26.2 # via # -c requirements/constraints.txt # tox diff --git a/tox.ini b/tox.ini index c84ff81e9a2..f831eb3d4e1 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] skipsdist=True -envlist = py38-django32-{static,pylint,tests,theme_static,check_keywords},py38-{isort,pycodestyle,extract_translations,dummy_translations,compile_translations, detect_changed_translations,validate_translations},docs +envlist = py{38, 311, 312}-django32-{static,pylint,tests,theme_static,check_keywords},py{38, 311, 312}-{isort,pycodestyle,extract_translations,dummy_translations,compile_translations, detect_changed_translations,validate_translations},docs [pytest] addopts = --ds=ecommerce.settings.test --cov=ecommerce --cov-report term --cov-config=.coveragerc --no-cov-on-fail -p no:randomly --no-migrations -m "not acceptance" @@ -13,6 +13,8 @@ envdir= # Use the same environment for all commands running under a specific python version py35: {toxworkdir}/py35 py38: {toxworkdir}/py38 + py311: {toxworkdir}/py311 + py312: {toxworkdir}/py312 passenv = CONN_MAX_AGE DB_ENGINE