diff --git a/.github/helper/update_pot_file.sh b/.github/helper/update_pot_file.sh new file mode 100644 index 00000000..d07d2e25 --- /dev/null +++ b/.github/helper/update_pot_file.sh @@ -0,0 +1,40 @@ +#!/bin/bash +set -e +cd ~ || exit + +echo "Setting Up Bench..." + +pip install frappe-bench +bench -v init frappe-bench --skip-assets --skip-redis-config-generation --python "$(which python)" --frappe-branch "${BASE_BRANCH}" +cd ./frappe-bench || exit + +echo "Get LMS..." +bench get-app --skip-assets lms "${GITHUB_WORKSPACE}" + +echo "Generating POT file..." +bench generate-pot-file --app lms + +cd ./apps/lms || exit + +echo "Configuring git user..." +git config user.email "developers@erpnext.com" +git config user.name "frappe-pr-bot" + +echo "Setting the correct git remote..." +# Here, the git remote is a local file path by default. Let's change it to the upstream repo. +git remote add upstream https://github.com/frappe/lms.git + +echo "Creating a new branch..." +isodate=$(date -u +"%Y-%m-%d") +branch_name="pot_${BASE_BRANCH}_${isodate}" +git checkout -b "${branch_name}" + +echo "Commiting changes..." +git add lms/locale/main.pot +git commit -m "chore: update POT file" + +gh auth setup-git +git push -u upstream "${branch_name}" + +echo "Creating a PR..." +gh pr create --fill --base "${BASE_BRANCH}" --head "${branch_name}" -R frappe/lms \ No newline at end of file diff --git a/.github/workflows/generate-pot-file.yml b/.github/workflows/generate-pot-file.yml new file mode 100644 index 00000000..390393d7 --- /dev/null +++ b/.github/workflows/generate-pot-file.yml @@ -0,0 +1,34 @@ +name: Regenerate POT file (translatable strings) +on: + schedule: + - cron: "00 16 * * 5" + workflow_dispatch: + +jobs: + regeneratee-pot-file: + name: Release + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + branch: ["develop"] + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ matrix.branch }} + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Run script to update POT file + run: | + bash ${GITHUB_WORKSPACE}/.github/helper/update_pot_file.sh + env: + GH_TOKEN: ${{ secrets.RELEASE_TOKEN }} + BASE_BRANCH: ${{ matrix.branch }} diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index e6d7584c..018ee5e7 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -30,4 +30,4 @@ jobs: run: pip install semgrep - name: Run Semgrep rules - run: semgrep ci --config ./frappe-semgrep-rules/rules + run: semgrep ci --config ./frappe-semgrep-rules/rules \ No newline at end of file diff --git a/.gitignore b/.gitignore index 81bbfe1a..957c519f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ __pycache__/ *.py[cod] *$py.class node_modules -package-lock.json \ No newline at end of file +package-lock.json +lms/public/frontend +lms/www/lms.html \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b2ac7630..26145761 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,7 +32,7 @@ repos: rev: v2.7.1 hooks: - id: prettier - types_or: [javascript] + types_or: [javascript, vue] # Ignore any files that might contain jinja / bundles exclude: | (?x)^( diff --git a/README.md b/README.md index 1a94421f..0a809073 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,13 @@ cd apps/lms/docker docker-compose up ``` -Wait for some time until the setup script creates a site. After that, you can access `http://localhost:8000` in your browser and the app's login screen should show up. +Wait for some time until the setup script creates a site. After that, you can access `http://localhost:8000` in your browser and the app's login screen should appear. +You'll have to go through the setup wizard to set up the website the first time you access it. Log in using the following credentials to complete the setup wizard. + +``` +Username: Administrator +password: admin +``` ### Frappe Bench diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000..ac3875da --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,8 @@ +files: + - source: /lms/locale/main.pot + translation: /lms/locale/%two_letters_code%.po +pull_request_title: "chore: sync translations from crowdin" +pull_request_labels: + - translation +commit_message: "chore: %language% translations" +append_commit_message: false \ No newline at end of file diff --git a/cypress.config.js b/cypress.config.js index 04ebc494..d93eac9e 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -13,6 +13,6 @@ module.exports = defineConfig({ openMode: 0, }, e2e: { - baseUrl: "http://pyp:8000", + baseUrl: "http://test_site_ui:8000", }, }); diff --git a/cypress/e2e/course_creation.cy.js b/cypress/e2e/course_creation.cy.js index 2be9a71c..e453ea5b 100644 --- a/cypress/e2e/course_creation.cy.js +++ b/cypress/e2e/course_creation.cy.js @@ -1,133 +1,156 @@ describe("Course Creation", () => { it("creates a new course", () => { cy.login(); - cy.visit("/courses"); + cy.wait(1000); + cy.visit("/lms/courses"); + // Create a course - cy.get("a.btn").contains("Create a Course").click(); + cy.get("a").contains("New Course").click(); cy.wait(1000); - cy.url().should("include", "/courses/new-course/edit"); - cy.get("#title").type("Test Course"); - cy.get("#intro").type("Test Course Short Introduction"); - cy.get("#description").type("Test Course Description"); - cy.get("#video-link").type("-LPmw2Znl2c"); - cy.get("#tags-input").type("Test"); - cy.get("#published").check(); + cy.url().should("include", "/courses/new/edit"); + + cy.get("label").contains("Title").type("Test Course"); + cy.get("label") + .contains("Short Introduction") + .type("Test Course Short Introduction to test the UI"); + cy.get("div[contenteditable=true").invoke( + "text", + "Test Course Description. I need a very big description to test the UI. This is a very big description. It contains more than once sentence. Its meant to be this long as this is a UI test. Its unbearably long and I'm not sure why I'm typing this much. I'm just going to keep typing until I feel like its long enough. I think its long enough now. I'm going to stop typing now." + ); + + cy.fixture("profile.png", "base64").then((fileContent) => { + cy.get('input[type="file"]').attachFile({ + fileContent, + fileName: "profile.png", + mimeType: "image/png", + encoding: "base64", + }); + }); + + cy.get("label") + .contains("Preview Video") + .type("https://www.youtube.com/embed/-LPmw2Znl2c"); + cy.get("[id=tags]").type("Learning{enter}Frappe{enter}ERPNext{enter}"); + cy.get(".search-input").click().type("frappe"); cy.wait(1000); + cy.get("[id^=headlessui-combobox-option-") + .should("be.visible") + .first() + .click(); + cy.get("label").contains("Published").click(); + cy.get("label").contains("Published On").type("2021-01-01"); cy.button("Save").click(); // Add Chapter cy.wait(1000); - cy.link("Course Outline").click(); + cy.button("Add Chapter").click(); cy.wait(1000); - cy.get(".edit-header .btn-add-chapter").click(); - cy.wait(500); - cy.get("#chapter-title").type("Test Chapter"); - cy.get("#chapter-description").type("Test Chapter Description"); - cy.button("Save").click(); + cy.get("[id^=headlessui-dialog-panel-") + .should("be.visible") + .within(() => { + cy.get("label").contains("Title").type("Test Chapter"); + cy.button("Add Chapter").click(); + }); // Add Lesson cy.wait(1000); - cy.link("Add Lesson").click(); + cy.button("Add Lesson").click(); + cy.wait(1000); + cy.url().should("include", "/learn/1-1/edit"); cy.wait(1000); - cy.get("#lesson-title").type("Test Lesson"); - // Content - cy.get(".collapse-section.collapsed:first").click(); - cy.get("#lesson-content .ce-block") + cy.get("label").contains("Title").type("Test Lesson"); + /* cy.get("#content .ce-block") .click() - .type( - "This is an extremely big paragraph that is meant to test the UI. This is a very long paragraph. It contains more than once sentence. Its meant to be this long as this is a UI test. Its unbearably long and I'm not sure why I'm typing this much. I'm just going to keep typing until I feel like its long enough. I think its long enough now. I'm going to stop typing now. {enter}" - ); - cy.get("#lesson-content .ce-toolbar__plus").click(); - cy.get('#lesson-content [data-item-name="youtube"]').click(); - cy.get('input[data-fieldname="youtube"]').type("GoDtyItReto"); - cy.button("Insert").click(); - cy.wait(1000); + .invoke("text", "https://www.youtube.com/watch?v=GoDtyItReto"); */ + /* cy.get("#content .ce-block") + .click() + .paste("https://www.youtube.com/watch?v=GoDtyItReto"); */ + + cy.fixture("Youtube.mov", "base64").then((fileContent) => { + cy.get('input[type="file"]').attachFile({ + fileContent, + fileName: "Youtube.mov", + mimeType: "image/png", + encoding: "base64", + }); + }); + cy.get("#content .ce-block").type( + "This is an extremely big paragraph that is meant to test the UI. This is a very long paragraph. It contains more than once sentence. Its meant to be this long as this is a UI test. Its unbearably long and I'm not sure why I'm typing this much. I'm just going to keep typing until I feel like its long enough. I think its long enough now. I'm going to stop typing now." + ); cy.button("Save").click(); // View Course cy.wait(1000); - cy.visit("/courses"); - cy.get(".course-card-title:first").contains("Test Course"); - cy.get(".course-card:first").click(); - cy.url().should("include", "/courses/test-course"); - cy.get("#title").contains("Test Course"); - cy.get(".preview-video").should( + cy.visit("/lms"); + cy.wait(500); + cy.url().should("include", "/lms/courses"); + cy.get(".grid a:first").within(() => { + cy.get("div").contains("Test Course"); + cy.get("div").contains( + "Test Course Short Introduction to test the UI" + ); + cy.get(".course-image") + .invoke("css", "background-image") + .should("include", "/files/profile"); + }); + cy.get(".grid a:first").click(); + cy.url().should("include", "/lms/courses/test-course"); + cy.get("div").contains("Test Course"); + cy.get("div").contains("Test Course Short Introduction to test the UI"); + cy.get("div").contains("Learning"); + cy.get("div").contains("Frappe"); + cy.get("div").contains("ERPNext"); + cy.get("iframe").should( "have.attr", "src", "https://www.youtube.com/embed/-LPmw2Znl2c" ); - cy.get("#intro").contains("Test Course Short Introduction"); // View Chapter - cy.get(".chapter-title-main:first").contains("Test Chapter"); - cy.get(".chapter-description:first").contains( - "Test Chapter Description" - ); - cy.get(".lesson-info:first").contains("Test Lesson"); - cy.get(".lesson-info:first").click(); + cy.get("div").contains("Test Chapter"); + cy.get("[id^=headlessui-disclosure-panel-").within(() => { + cy.get("div").contains("Test Lesson").click(); + }); + cy.wait(3000); // View Lesson - cy.wait(1000); - cy.url().should("include", "learn/1.1"); - cy.get("#title").contains("Test Lesson"); - cy.get(".lesson-video iframe").should( - "have.attr", - "src", - "https://www.youtube.com/embed/GoDtyItReto" - ); - cy.get(".lesson-content-card").contains( + cy.url().should("include", "/learn/1-1"); + cy.get("div").contains("Test Lesson"); + + cy.get("video") + .should("be.visible") + .children("source") + .invoke("attr", "src") + .should("include", "/files/Youtube"); + + cy.get("div").contains( "This is an extremely big paragraph that is meant to test the UI. This is a very long paragraph. It contains more than once sentence. Its meant to be this long as this is a UI test. Its unbearably long and I'm not sure why I'm typing this much. I'm just going to keep typing until I feel like its long enough. I think its long enough now. I'm going to stop typing now." ); // Add Discussion - cy.get(".reply").click(); + cy.button("New Question").click(); cy.wait(500); - cy.get(".discussion-modal").should("be.visible"); - - // Enter title - cy.get(".modal .topic-title") - .type("Discussion from tests") - .should("have.value", "Discussion from tests"); - - // Enter comment - cy.get(".modal .discussions-comment").type( - "This is a discussion from the cypress ui tests." - ); - - // Submit - cy.get(".modal .submit-discussion").click(); - cy.wait(2000); - - // Check if discussion is added to page and content is visible - cy.get(".sidebar-parent:first .discussion-topic-title").should( - "have.text", - "Discussion from tests" - ); - cy.get(".sidebar-parent:first .discussion-topic-title").click(); - cy.get(".discussion-on-page:visible").should("have.class", "show"); - cy.get( - ".discussion-on-page:visible .reply-card .reply-text .ql-editor p" - ).should( - "have.text", - "This is a discussion from the cypress ui tests." - ); - - cy.get(".discussion-form:visible .discussions-comment").type( - "This is a discussion from the cypress ui tests. \n\nThis comment was entered through the commentbox on the page." - ); - - cy.get(".discussion-form:visible .submit-discussion").click(); - cy.wait(3000); - cy.get(".discussion-on-page:visible").should("have.class", "show"); - cy.get(".discussion-on-page:visible") - .children(".reply-card") - .eq(1) - .find(".reply-text") - .should( - "have.text", - "This is a discussion from the cypress ui tests. This comment was entered through the commentbox on the page.\n" + cy.get("[id^=headlessui-dialog-panel-").within(() => { + cy.get("label").contains("Title").type("Test Discussion"); + cy.get("div[contenteditable=true]").invoke( + "text", + "This is a test discussion. This will check if the UI is working properly." ); + cy.button("Post").click(); + }); + + // View Discussion + cy.wait(500); + cy.get("div").contains("Test Discussion").click(); + cy.get("div[contenteditable=true").invoke( + "text", + "This is a test comment. This will check if the UI is working properly." + ); + + cy.get("div").contains( + "This is a test comment. This will check if the UI is working properly." + ); }); }); diff --git a/cypress/fixtures/Youtube.mov b/cypress/fixtures/Youtube.mov new file mode 100644 index 00000000..ca6b75a2 Binary files /dev/null and b/cypress/fixtures/Youtube.mov differ diff --git a/cypress/fixtures/profile.png b/cypress/fixtures/profile.png new file mode 100644 index 00000000..1b42bb97 Binary files /dev/null and b/cypress/fixtures/profile.png differ diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 336a6355..ed5c7968 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -24,6 +24,8 @@ // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +import "cypress-file-upload"; + Cypress.Commands.add("login", (email, password) => { if (!email) { email = Cypress.config("testUser") || "Administrator"; @@ -53,3 +55,13 @@ Cypress.Commands.add("iconButton", (text) => { Cypress.Commands.add("dialog", (selector) => { return cy.get(`[role=dialog] ${selector}`); }); + +Cypress.Commands.add("paste", { prevSubject: true }, (subject, text) => { + cy.wrap(subject).then(($element) => { + const element = $element[0]; + element.focus(); + element.textContent = text; + const event = new Event("paste", { bubbles: true }); + element.dispatchEvent(event); + }); +}); diff --git a/frappe-ui b/frappe-ui index 2898a0bd..aa44431c 160000 --- a/frappe-ui +++ b/frappe-ui @@ -1 +1 @@ -Subproject commit 2898a0bdd1a07433e5f6adedb42786177c473d50 +Subproject commit aa44431c185b1e4563f2ebf6af380c7743d2cd4c diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 00000000..53f7466a --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,5 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local \ No newline at end of file diff --git a/frontend/.prettierrc.json b/frontend/.prettierrc.json new file mode 100644 index 00000000..b2095be8 --- /dev/null +++ b/frontend/.prettierrc.json @@ -0,0 +1,4 @@ +{ + "semi": false, + "singleQuote": true +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 00000000..1a41f83e --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,42 @@ +# Frappe UI Starter + +This template should help get you started developing custom frontend for Frappe +apps with Vue 3 and the Frappe UI package. + +This boilerplate sets up Vue 3, Vue Router, TailwindCSS, and Frappe UI out of +the box. + +## Usage + +This template is meant to be cloned inside an existing Frappe App. Assuming your +apps name is `todo`. Clone this template in the root folder of your app using `degit`. + +``` +cd apps/todo +npx degit netchampfaris/frappe-ui-starter frontend +cd frontend +yarn +yarn dev +``` + +In a development environment, you need to put the below key-value pair in your `site_config.json` file: + +``` +"ignore_csrf": 1 +``` + +This will prevent `CSRFToken` errors while using the vite dev server. In production environment, the `csrf_token` is attached to the `window` object in `index.html` for you. + +The Vite dev server will start on the port `8080`. This can be changed from `vite.config.js`. +The development server is configured to proxy your frappe app (usually running on port `8000`). If you have a site named `todo.test`, open `http://todo.test:8080` in your browser. If you see a button named "Click to send 'ping' request", congratulations! + +If you notice the browser URL is `/frontend`, this is the base URL where your frontend app will run in production. +To change this, open `src/router.js` and change the base URL passed to `createWebHistory`. + +## Resources + +- [Vue 3](https://v3.vuejs.org/guide/introduction.html) +- [Vue Router](https://next.router.vuejs.org/guide/) +- [Frappe UI](https://github.com/frappe/frappe-ui) +- [TailwindCSS](https://tailwindcss.com/docs/utility-first) +- [Vite](https://vitejs.dev/guide/) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 00000000..1512b016 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,49 @@ + + +
+ + + ++ {{ meta.description }} +
++ The content here is just for seo purposes. The actual content will be loaded in a few seconds. +
++ Seo checks if a page has more than 300 words. So, here are some more words to make it more than 300 words. + Page descriptions are the HTML meta tags that provide a brief summary of a web page. + Search engines use meta descriptions to help identify the page's topic - they don't use them to rank the page, but they do use them to determine whether or not to display the page in search results. + Meta descriptions are important because they're often the first thing people see when they're deciding which search result to click on. + They're also important because they can help improve your click-through rate (CTR) from search results. + A good meta description can entice people to click on your page instead of someone else's. +
+ Know More +{{ $resources.ping }}
+
+
+
+ + {{ + __( + 'This lesson is not available for preview. Please enroll in the course to access it.' + ) + }} +
+{{ _("Hey {0}").format(doc.member_name) }}
-{{ _('Your evaluation for the course {0} has been scheduled on {1} at {2}.').format(title, frappe.utils.format_date(doc.date, "medium"), frappe.utils.format_time(doc.start_time, "short")) }}
+{{ _('Your evaluation for the course {0} has been scheduled on {1} at {2} {3}.').format(title, frappe.utils.format_date(doc.date, "medium"), frappe.utils.format_time(doc.start_time, "short"), timezone) }}
+{{ _("Your evaluator is {0}").format(evaluator_name) }}
{{ _("Please prepare well and be on time for the evaluations.") }}
diff --git a/lms/lms/notification/certificate_request_creation/certificate_request_creation.json b/lms/lms/notification/certificate_request_creation/certificate_request_creation.json index 8a4302d6..15c58963 100644 --- a/lms/lms/notification/certificate_request_creation/certificate_request_creation.json +++ b/lms/lms/notification/certificate_request_creation/certificate_request_creation.json @@ -10,10 +10,10 @@ "event": "New", "idx": 0, "is_standard": 1, - "message": "{% set title = frappe.db.get_value(\"LMS Course\", doc.course, \"title\") %}\n\n{{ _(\"Hey {0}\").format(doc.member_name) }}
\n{{ _('Your evaluation for the course {0} has been scheduled on {1} at {2}.').format(title, frappe.utils.format_date(doc.date, \"medium\"), frappe.utils.format_time(doc.start_time, \"short\")) }}
\n{{ _(\"Please prepare well and be on time for the evaluations.\") }}
\n", + "message": "{% set title = frappe.db.get_value(\"LMS Course\", doc.course, \"title\") %}\n{% set timezone = frappe.db.get_value(\"LMS Batch\", doc.batch, \"timezone\") %}\n{% set timezone = timezone if timezone else '' %}\n{% set evaluator_name = frappe.db.get_value(\"User\", doc.evaluator, \"full_name\") %}\n\n{{ _(\"Hey {0}\").format(doc.member_name) }}
\n{{ _('Your evaluation for the course {0} has been scheduled on {1} at {2} {3}.').format(title, frappe.utils.format_date(doc.date, \"medium\"), frappe.utils.format_time(doc.start_time, \"short\"), timezone) }}
\n{{ _(\"Your evaluator is {0}\").format(evaluator_name) }}\n
{{ _(\"Please prepare well and be on time for the evaluations.\") }}
\n", "message_type": "HTML", - "modified": "2023-11-29 17:34:54.514031", - "modified_by": "Administrator", + "modified": "2024-07-10 15:51:03.429317", + "modified_by": "sayali@erpnext.com", "module": "LMS", "name": "Certificate Request Creation", "owner": "Administrator", @@ -23,6 +23,9 @@ }, { "receiver_by_document_field": "evaluator" + }, + { + "receiver_by_role": "Frappe School Admin" } ], "send_system_notification": 0, diff --git a/lms/lms/notification/certificate_request_reminder/certificate_request_reminder.html b/lms/lms/notification/certificate_request_reminder/certificate_request_reminder.html index feb0c476..764dcfa8 100644 --- a/lms/lms/notification/certificate_request_reminder/certificate_request_reminder.html +++ b/lms/lms/notification/certificate_request_reminder/certificate_request_reminder.html @@ -1,5 +1,8 @@ {% set title = frappe.db.get_value("LMS Course", doc.course, "title") %} +{% set timezone = frappe.db.get_value("LMS Batch", doc.batch, "timezone") %} +{% set timezone = timezone if timezone else '' %} +{% set evaluator_name = frappe.db.get_value("User", doc.evaluator, "full_name") %} -{{ _('Your evaluation for the course ${0} has been scheduled on ${1} at ${2}.').format(title, frappe.utils.format_date(doc.date, "medium"), frappe.utils.format_time(doc.start_time, "short")) }}
- +{{ _('Your evaluation for the course {0} has been scheduled on {1} at {2} {3}.').format(title, frappe.utils.format_date(doc.date, "medium"), frappe.utils.format_time(doc.start_time, "short"), timezone) }}
+{{ _("Your evaluator is {0}").format(evaluator_name) }}
{{ _("Please prepare well and be on time for the evaluations.") }}
diff --git a/lms/lms/notification/certificate_request_reminder/certificate_request_reminder.json b/lms/lms/notification/certificate_request_reminder/certificate_request_reminder.json index 0335d51b..772473d9 100644 --- a/lms/lms/notification/certificate_request_reminder/certificate_request_reminder.json +++ b/lms/lms/notification/certificate_request_reminder/certificate_request_reminder.json @@ -11,10 +11,10 @@ "event": "Days Before", "idx": 0, "is_standard": 1, - "message": "{% set title = frappe.db.get_value(\"LMS Course\", doc.course, \"title\") %}\n\n{{ _('Your evaluation for the course {0} has been scheduled on {1} at {2}.').format(title, frappe.utils.format_date(doc.date, \"medium\"), frappe.utils.format_time(doc.start_time, \"short\")) }}
\n\n{{ _(\"Please prepare well and be on time for the evaluations.\") }}
\n", + "message": "{% set title = frappe.db.get_value(\"LMS Course\", doc.course, \"title\") %}\n{% set timezone = frappe.db.get_value(\"LMS Batch\", doc.batch, \"timezone\") %}\n{% set timezone = timezone if timezone else '' %}\n{% set evaluator_name = frappe.db.get_value(\"User\", doc.evaluator, \"full_name\") %}\n\n{{ _('Your evaluation for the course {0} has been scheduled on {1} at {2} {3}.').format(title, frappe.utils.format_date(doc.date, \"medium\"), frappe.utils.format_time(doc.start_time, \"short\"), timezone) }}
\n{{ _(\"Your evaluator is {0}\").format(evaluator_name) }}\n
{{ _(\"Please prepare well and be on time for the evaluations.\") }}
\n", "message_type": "HTML", - "modified": "2023-11-29 17:26:53.355501", - "modified_by": "Administrator", + "modified": "2024-07-10 15:51:33.803704", + "modified_by": "sayali@erpnext.com", "module": "LMS", "name": "Certificate Request Reminder", "owner": "Administrator", @@ -29,4 +29,4 @@ "send_system_notification": 0, "send_to_all_assignees": 0, "subject": "Reminder for Certificate Evaluation" -} +} \ No newline at end of file diff --git a/lms/lms/page/lms_home/lms_home.js b/lms/lms/page/lms_home/lms_home.js index 4521b64d..35f91552 100644 --- a/lms/lms/page/lms_home/lms_home.js +++ b/lms/lms/page/lms_home/lms_home.js @@ -1,3 +1,3 @@ frappe.pages["lms-home"].on_page_load = function (wrapper) { - window.location.href = "/courses"; + window.location.href = "/lms/courses"; }; diff --git a/lms/lms/test_utils.py b/lms/lms/test_utils.py index e2ed069d..f655d321 100644 --- a/lms/lms/test_utils.py +++ b/lms/lms/test_utils.py @@ -22,6 +22,8 @@ class TestUtils(unittest.TestCase): ) def test_evaluation_details(self): + user = new_user("Eval", "eval@test.com") + course = new_course( "Test Evaluation Details", { @@ -30,9 +32,9 @@ class TestUtils(unittest.TestCase): "evaluator": "evaluator@example.com", "max_attempts": 3, "duration": 2, + "instructors": [{"instructor": user.name}], }, ) - user = new_user("Eval", "eval@test.com") # Two evaluations failed within max attempts. Check eligibility for a third evaluation create_evaluation(user.name, course.name, getdate("21-03-2022"), 0.4, "Fail") diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 59d3ea57..066f1133 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -11,7 +11,6 @@ from frappe.desk.doctype.notification_log.notification_log import ( enqueue_create_notification, get_title, ) -from frappe.utils import get_fullname from frappe.desk.search import get_user_groups from frappe.desk.notifications import extract_mentions from frappe.utils import ( @@ -24,7 +23,11 @@ from frappe.utils import ( get_datetime, getdate, validate_phone_number, - ceil, + get_fullname, + pretty_date, + get_time_str, + nowtime, + format_datetime, ) from frappe.utils.dateutils import get_period from lms.lms.md import find_macros, markdown_to_html @@ -81,7 +84,7 @@ def get_membership(course, member=None, batch=None): membership = frappe.db.get_value( "LMS Enrollment", filters, - ["name", "batch_old", "current_lesson", "member_type", "progress"], + ["name", "batch_old", "current_lesson", "member_type", "progress", "member"], as_dict=True, ) @@ -112,32 +115,31 @@ def get_chapters(course): return chapters -def get_lessons(course, chapter=None, get_details=True): +def get_lessons(course, chapter=None, get_details=True, progress=False): """If chapter is passed, returns lessons of only that chapter. Else returns lessons of all chapters of the course""" lessons = [] lesson_count = 0 if chapter: if get_details: - return get_lesson_details(chapter) + return get_lesson_details(chapter, progress=progress) else: return frappe.db.count("Lesson Reference", {"parent": chapter.name}) for chapter in get_chapters(course): if get_details: - lessons += get_lesson_details(chapter) + lessons += get_lesson_details(chapter, progress=progress) else: lesson_count += frappe.db.count("Lesson Reference", {"parent": chapter.name}) return lessons if get_details else lesson_count -def get_lesson_details(chapter): +def get_lesson_details(chapter, progress=False): lessons = [] lesson_list = frappe.get_all( "Lesson Reference", {"parent": chapter.name}, ["lesson", "idx"], order_by="idx" ) - for row in lesson_list: lesson_details = frappe.db.get_value( "Course Lesson", @@ -153,11 +155,16 @@ def get_lesson_details(chapter): "question", "file_type", "instructor_notes", + "course", ], as_dict=True, ) lesson_details.number = f"{chapter.idx}.{row.idx}" lesson_details.icon = get_lesson_icon(lesson_details.body) + + if progress: + lesson_details.is_complete = get_progress(lesson_details.course, lesson_details.name) + lessons.append(lesson_details) return lessons @@ -178,6 +185,7 @@ def get_lesson_icon(content): return icon +@frappe.whitelist(allow_guest=True) def get_tags(course): tags = frappe.db.get_value("LMS Course", course, "tags") return tags.split(",") if tags else [] @@ -188,14 +196,13 @@ def get_instructors(course): instructors = frappe.get_all( "Course Instructor", {"parent": course}, order_by="idx", pluck="instructor" ) - if not instructors: - instructors = frappe.db.get_value("LMS Course", course, "owner").split(" ") + for instructor in instructors: instructor_details.append( frappe.db.get_value( "User", instructor, - ["name", "username", "full_name", "user_image"], + ["name", "username", "full_name", "user_image", "first_name"], as_dict=True, ) ) @@ -219,6 +226,7 @@ def get_average_rating(course): return sum(ratings) / len(ratings) +@frappe.whitelist(allow_guest=True) def get_reviews(course): reviews = frappe.get_all( "LMS Course Review", @@ -226,6 +234,7 @@ def get_reviews(course): ["review", "rating", "owner", "creation"], order_by="creation desc", ) + out_of_ratings = frappe.db.get_all( "DocField", {"parent": "LMS Course Review", "fieldtype": "Rating"}, ["options"] ) @@ -235,6 +244,7 @@ def get_reviews(course): review.owner_details = frappe.db.get_value( "User", review.owner, ["name", "username", "full_name", "user_image"], as_dict=True ) + review.creation = pretty_date(review.creation) return reviews @@ -270,15 +280,15 @@ def get_lesson_index(lesson_name): "Lesson Reference", {"lesson": lesson_name}, ["idx", "parent"], as_dict=True ) if not lesson: - return "1.1" + return "1-1" chapter = frappe.db.get_value( "Chapter Reference", {"chapter": lesson.parent}, ["idx"], as_dict=True ) if not chapter: - return "1.1" + return "1-1" - return f"{chapter.idx}.{lesson.idx}" + return f"{chapter.idx}-{lesson.idx}" def get_lesson_url(course, lesson_number): @@ -299,9 +309,9 @@ def get_progress(course, lesson, member=None): if not member: member = frappe.session.user - return frappe.db.get_value( + return frappe.db.exists( "LMS Course Progress", - {"course": course, "owner": member, "lesson": lesson}, + {"course": course, "member": member, "lesson": lesson}, ["status"], ) @@ -356,10 +366,8 @@ def get_mentors(course): return course_mentors -def is_eligible_to_review(course, membership): +def is_eligible_to_review(course): """Checks if user is eligible to review the course""" - if not membership: - return False if frappe.db.count( "LMS Course Review", {"course": course, "owner": frappe.session.user} ): @@ -374,7 +382,7 @@ def get_course_progress(course, member=None): return 0 completed_lessons = frappe.db.count( "LMS Course Progress", - {"course": course, "owner": member or frappe.session.user, "status": "Complete"}, + {"course": course, "member": member or frappe.session.user, "status": "Complete"}, ) precision = cint(frappe.db.get_default("float_precision")) or 3 return flt(((completed_lessons / lesson_count) * 100), precision) @@ -515,7 +523,7 @@ def first_lesson_exists(course): def redirect_to_courses_list(): - frappe.local.flags.redirect_location = "/courses" + frappe.local.flags.redirect_location = "/lms/courses" raise frappe.Redirect @@ -572,7 +580,15 @@ def has_course_moderator_role(member=None): def has_course_evaluator_role(member=None): return frappe.db.get_value( "Has Role", - {"parent": member or frappe.session.user, "role": "Class Evaluator"}, + {"parent": member or frappe.session.user, "role": "Batch Evaluator"}, + "name", + ) + + +def has_student_role(member=None): + return frappe.db.get_value( + "Has Role", + {"parent": member or frappe.session.user, "role": "LMS Student"}, "name", ) @@ -623,37 +639,94 @@ def handle_notifications(doc, method): if topic.reference_doctype not in ["Course Lesson", "LMS Batch"]: return create_notification_log(doc, topic) - notify_mentions(doc, topic) + notify_mentions_on_portal(doc, topic) + notify_mentions_via_email(doc, topic) def create_notification_log(doc, topic): - course = frappe.db.get_value("Course Lesson", topic.reference_docname, "course") - instructors = frappe.db.get_all( - "Course Instructor", {"parent": course}, pluck="instructor" - ) + users = [] + if topic.reference_doctype == "Course Lesson": + course = frappe.db.get_value("Course Lesson", topic.reference_docname, "course") + course_title = frappe.db.get_value("LMS Course", course, "title") + instructors = frappe.db.get_all( + "Course Instructor", {"parent": course}, pluck="instructor" + ) + + if doc.owner != topic.owner: + users.append(topic.owner) + + users += instructors + subject = _("New reply on the topic {0} in course {1}").format( + topic.title, course_title + ) + link = get_lesson_url(course, get_lesson_index(topic.reference_docname)) + + else: + batch_title = frappe.db.get_value("LMS Batch", topic.reference_docname, "title") + subject = _("New comment in batch {0}").format(batch_title) + link = f"/batches/{topic.reference_docname}" + moderators = frappe.get_all("Has Role", {"role": "Moderator"}, pluck="parent") + users += moderators notification = frappe._dict( { - "subject": _("New reply on the topic {0}").format(topic.title), + "subject": subject, "email_content": doc.reply, "document_type": topic.reference_doctype, "document_name": topic.reference_docname, "for_user": topic.owner, "from_user": doc.owner, "type": "Alert", + "link": link, } ) - users = [] - if doc.owner != topic.owner: - users.append(topic.owner) - - if doc.owner not in instructors: - users += instructors make_notification_logs(notification, users) -def notify_mentions(doc, topic): +def notify_mentions_on_portal(doc, topic): + mentions = extract_mentions(doc.reply) + if not mentions: + return + + from_user_name = get_fullname(doc.owner) + + if topic.reference_doctype == "Course Lesson": + course = frappe.db.get_value("Course Lesson", topic.reference_docname, "course") + subject = _("{0} mentioned you in a comment in {1}").format( + from_user_name, topic.title + ) + link = get_lesson_url(course, get_lesson_index(topic.reference_docname)) + else: + batch_title = frappe.db.get_value("LMS Batch", topic.reference_docname, "title") + subject = _("{0} mentioned you in a comment in {1}").format( + from_user_name, batch_title + ) + link = f"/batches/{topic.reference_docname}" + + for user in mentions: + notification = frappe._dict( + { + "subject": subject, + "email_content": doc.reply, + "document_type": topic.reference_doctype, + "document_name": topic.reference_docname, + "for_user": user, + "from_user": doc.owner, + "type": "Alert", + "link": link, + } + ) + make_notification_logs(notification, user) + + +def notify_mentions_via_email(doc, topic): + outgoing_email_account = frappe.get_cached_value( + "Email Account", {"default_outgoing": 1, "enable_outgoing": 1}, "name" + ) + if not outgoing_email_account or not frappe.conf.get("mail_login"): + return + mentions = extract_mentions(doc.reply) if not mentions: return @@ -703,10 +776,6 @@ def get_lesson_count(course): return lesson_count -def check_profile_restriction(): - return frappe.db.get_single_value("LMS Settings", "force_profile_completion") - - def get_restriction_details(): user = frappe.db.get_value( "User", frappe.session.user, ["profile_complete", "username"], as_dict=True @@ -760,7 +829,17 @@ def has_lessons(course): @frappe.whitelist(allow_guest=True) -def get_chart_data(chart_name, timespan, timegrain, from_date, to_date): +def get_chart_data( + chart_name, + timespan="Select Date Range", + timegrain="Daily", + from_date=None, + to_date=None, +): + if not from_date: + from_date = add_months(getdate(), -1) + if not to_date: + to_date = getdate() chart = frappe.get_doc("Dashboard Chart", chart_name) filters = [([chart.document_type, "docstatus", "<", 2, False])] doctype = chart.document_type @@ -790,7 +869,7 @@ def get_chart_data(chart_name, timespan, timegrain, from_date, to_date): else get_period(r[0], timegrain) for r in result ], - "datasets": [{"name": chart.name, "values": [r[1] for r in result]}], + "datasets": [{"name": chart.name, "data": [r[1] for r in result]}], } @@ -804,7 +883,7 @@ def get_course_completion_data(): "datasets": [ { "name": "Course Completion", - "values": [completed, all_membership - completed], + "data": [completed, all_membership - completed], } ], } @@ -881,6 +960,7 @@ def get_evaluator(course, batch=None): return evaluator +@frappe.whitelist() def get_upcoming_evals(student, courses): upcoming_evals = frappe.get_all( "LMS Certificate Request", @@ -933,31 +1013,42 @@ def get_payment_options(doctype, docname, phone, country): def check_multicurrency(amount, currency, country=None, amount_usd=None): - show_usd_equivalent = frappe.db.get_single_value("LMS Settings", "show_usd_equivalent") - exception_country = frappe.get_all( - "Payment Country", filters={"parent": "LMS Settings"}, pluck="country" - ) - country = ( - country - or frappe.db.get_value("Address", {"email_id": frappe.session.user}, "country") - or frappe.db.get_value("User", frappe.session.user, "country") - or get_country_code() - ) + settings = frappe.get_single("LMS Settings") + show_usd_equivalent = settings.show_usd_equivalent - if amount_usd and country and country not in exception_country: - return amount_usd, "USD" + # Countries for which currency should not be converted + exception_country = settings.exception_country + exception_country = [country.country for country in exception_country] - if not show_usd_equivalent or currency == "USD": - return amount, currency + # Get users country + if not country: + country = frappe.db.get_value("Address", {"email_id": frappe.session.user}, "country") + if not country: + country = frappe.db.get_value("User", frappe.session.user, "country") + + if not country: + country = get_country_code() + + # If the country is the one for which conversion is not needed then return as is if not country or (exception_country and country in exception_country): return amount, currency + # If conversion is disabled from settings or the currency is already USD then return as is + if not show_usd_equivalent or currency == "USD": + return amount, currency + + # If Explicit USD price is given then return that without conversion + if amount_usd and country and country not in exception_country: + return amount_usd, "USD" + + # Conversion logic starts here. Exchange rate is fetched and amount is converted. exchange_rate = get_current_exchange_rate(currency, "USD") amount = amount * exchange_rate currency = "USD" - apply_rounding = frappe.db.get_single_value("LMS Settings", "apply_rounding") + # Check if the amount should be rounded and then apply rounding + apply_rounding = settings.apply_rounding if apply_rounding and amount % 100 != 0: amount = amount + 100 - amount % 100 @@ -965,15 +1056,15 @@ def check_multicurrency(amount, currency, country=None, amount_usd=None): def apply_gst(amount, country=None): - gst_applied = False + gst_applied = 0 apply_gst = frappe.db.get_single_value("LMS Settings", "apply_gst") if not country: country = frappe.db.get_value("User", frappe.session.user, "country") if apply_gst and country == "India": - gst_applied = True - amount = amount * 1.18 + gst_applied = amount * 0.18 + amount += gst_applied return amount, gst_applied @@ -1055,7 +1146,6 @@ def create_order(client, amount, currency): @frappe.whitelist() def verify_payment(response, doctype, docname, address, order_id): - response = json.loads(response) client = get_client() client.utility.verify_payment_signature( { @@ -1073,7 +1163,7 @@ def verify_payment(response, doctype, docname, address, order_id): def record_payment(address, response, client, doctype, docname): - address = frappe._dict(json.loads(address)) + address = frappe._dict(address) address_name = save_address(address) payment_details = get_payment_details(doctype, docname, address) @@ -1124,11 +1214,12 @@ def create_membership(course, payment): {"member": frappe.session.user, "course": course, "payment": payment.name} ) membership.save(ignore_permissions=True) - return f"/courses/{course}/learn/1.1" + return f"/lms/courses/{course}/learn/1-1" def add_student_to_batch(batchname, payment): student = frappe.new_doc("Batch Student") + current_count = frappe.db.count("Batch Student", {"parent": batchname}) student.update( { "student": frappe.session.user, @@ -1137,6 +1228,7 @@ def add_student_to_batch(batchname, payment): "parent": batchname, "parenttype": "LMS Batch", "parentfield": "students", + "idx": current_count + 1, } ) student.save(ignore_permissions=True) @@ -1158,6 +1250,322 @@ def change_currency(amount, currency, country=None): return fmt_money(amount, 0, currency) +@frappe.whitelist(allow_guest=True) +def get_courses(): + """Returns the list of courses.""" + courses = [] + course_list = frappe.get_all("LMS Course", pluck="name") + for course in course_list: + courses.append(get_course_details(course)) + + courses = get_categorized_courses(courses) + return courses + + +@frappe.whitelist(allow_guest=True) +def get_course_details(course): + course_details = frappe.db.get_value( + "LMS Course", + course, + [ + "name", + "title", + "tags", + "description", + "image", + "video_link", + "short_introduction", + "published", + "upcoming", + "featured", + "disable_self_learning", + "published_on", + "status", + "paid_course", + "course_price", + "currency", + "amount_usd", + ], + as_dict=1, + ) + course_details.tags = course_details.tags.split(",") if course_details.tags else [] + course_details.lesson_count = get_lesson_count(course_details.name) + + course_details.enrollment_count = frappe.db.count( + "LMS Enrollment", {"course": course_details.name, "member_type": "Student"} + ) + course_details.enrollment_count_formatted = format_number( + course_details.enrollment_count + ) + + avg_rating = get_average_rating(course_details.name) or 0 + course_details.avg_rating = flt( + avg_rating, frappe.get_system_settings("float_precision") or 3 + ) + + course_details.instructors = get_instructors(course_details.name) + if course_details.paid_course: + """course_details.course_price, course_details.currency = check_multicurrency( + course_details.course_price, course_details.currency, None, course_details.amount_usd + )""" + course_details.price = fmt_money( + course_details.course_price, 0, course_details.currency + ) + + if frappe.session.user == "Guest": + course_details.membership = None + course_details.is_instructor = False + else: + course_details.membership = frappe.db.get_value( + "LMS Enrollment", + {"member": frappe.session.user, "course": course_details.name}, + ["name", "course", "current_lesson", "progress", "member"], + as_dict=1, + ) + course_details.is_instructor = is_instructor(course_details.name) + + if course_details.membership and course_details.membership.current_lesson: + course_details.current_lesson = get_lesson_index( + course_details.membership.current_lesson + ) + + return course_details + + +def get_categorized_courses(courses): + live, upcoming, new, enrolled, created, under_review = [], [], [], [], [], [] + + for course in courses: + if course.status == "Under Review": + under_review.append(course) + elif course.published and course.upcoming: + upcoming.append(course) + elif course.published: + live.append(course) + + if ( + course.published + and not course.upcoming + and course.published_on > add_months(getdate(), -3) + ): + new.append(course) + + if course.membership and course.published: + enrolled.append(course) + elif course.is_instructor: + created.append(course) + + categories = [live, enrolled, created] + for category in categories: + category.sort(key=lambda x: x.enrollment_count, reverse=True) + + live.sort(key=lambda x: x.featured, reverse=True) + + return { + "live": live, + "new": new, + "upcoming": upcoming, + "enrolled": enrolled, + "created": created, + "under_review": under_review, + } + + +@frappe.whitelist(allow_guest=True) +def get_course_outline(course, progress=False): + """Returns the course outline.""" + outline = [] + chapters = frappe.get_all( + "Chapter Reference", {"parent": course}, ["chapter", "idx"], order_by="idx" + ) + for chapter in chapters: + chapter_details = frappe.db.get_value( + "Course Chapter", + chapter.chapter, + ["name", "title", "description"], + as_dict=True, + ) + chapter_details["idx"] = chapter.idx + chapter_details.lessons = get_lessons(course, chapter_details, progress=progress) + outline.append(chapter_details) + return outline + + +@frappe.whitelist(allow_guest=True) +def get_lesson(course, chapter, lesson): + chapter_name = frappe.db.get_value( + "Chapter Reference", {"parent": course, "idx": chapter}, "chapter" + ) + lesson_name = frappe.db.get_value( + "Lesson Reference", {"parent": chapter_name, "idx": lesson}, "lesson" + ) + lesson_details = frappe.db.get_value( + "Course Lesson", lesson_name, ["include_in_preview", "title"], as_dict=1 + ) + membership = get_membership(course) + course_title = frappe.db.get_value("LMS Course", course, "title") + if ( + not lesson_details.include_in_preview + and not membership + and not has_course_moderator_role() + and not is_instructor(course) + ): + return {"no_preview": 1, "title": lesson_details.title, "course_title": course_title} + + lesson_details = frappe.db.get_value( + "Course Lesson", + lesson_name, + [ + "name", + "title", + "include_in_preview", + "body", + "creation", + "youtube", + "quiz_id", + "question", + "file_type", + "instructor_notes", + "course", + "content", + "instructor_content", + ], + as_dict=True, + ) + + if frappe.session.user == "Guest": + progress = 0 + else: + progress = get_progress(course, lesson_details.name) + + lesson_details.rendered_content = render_html(lesson_details) + neighbours = get_neighbour_lesson(course, chapter, lesson) + lesson_details.next = neighbours["next"] + lesson_details.progress = progress + lesson_details.prev = neighbours["prev"] + lesson_details.membership = membership + lesson_details.instructors = get_instructors(course) + lesson_details.course_title = course_title + return lesson_details + + +def get_neighbour_lesson(course, chapter, lesson): + numbers = [] + current = f"{chapter}.{lesson}" + chapters = frappe.get_all("Chapter Reference", {"parent": course}, ["idx", "chapter"]) + for chapter in chapters: + lessons = frappe.get_all("Lesson Reference", {"parent": chapter.chapter}, pluck="idx") + for lesson in lessons: + numbers.append(f"{chapter.idx}.{lesson}") + + tuples_list = [tuple(int(x) for x in s.split(".")) for s in numbers] + sorted_tuples = sorted(tuples_list) + sorted_numbers = [".".join(str(num) for num in t) for t in sorted_tuples] + index = sorted_numbers.index(current) + + return { + "prev": sorted_numbers[index - 1] if index - 1 >= 0 else None, + "next": sorted_numbers[index + 1] if index + 1 < len(sorted_numbers) else None, + } + + +@frappe.whitelist(allow_guest=True) +def get_batches(): + batches = [] + filters = {} + if frappe.session.user == "Guest": + filters.update({"start_date": [">=", getdate()], "published": 1}) + batch_list = frappe.get_all("LMS Batch", filters) + + for batch in batch_list: + batches.append(get_batch_details(batch.name)) + + batches = categorize_batches(batches) + return batches + + +@frappe.whitelist(allow_guest=True) +def get_batch_details(batch): + batch_details = frappe.db.get_value( + "LMS Batch", + batch, + [ + "name", + "title", + "description", + "batch_details", + "batch_details_raw", + "start_date", + "end_date", + "start_time", + "end_time", + "seat_count", + "published", + "amount", + "amount_usd", + "currency", + "paid_batch", + "evaluation_end_date", + "allow_self_enrollment", + "timezone", + ], + as_dict=True, + ) + + batch_details.instructors = get_instructors(batch) + + batch_details.courses = frappe.get_all( + "Batch Course", filters={"parent": batch}, fields=["course", "title"] + ) + batch_details.students = frappe.get_all( + "Batch Student", {"parent": batch}, pluck="student" + ) + if batch_details.paid_batch and batch_details.start_date >= getdate(): + batch_details.amount, batch_details.currency = check_multicurrency( + batch_details.amount, batch_details.currency, None, batch_details.amount_usd + ) + batch_details.price = fmt_money(batch_details.amount, 0, batch_details.currency) + + if batch_details.seat_count: + batch_details.seats_left = batch_details.seat_count - len(batch_details.students) + + return batch_details + + +def categorize_batches(batches): + upcoming, archived, private, enrolled = [], [], [], [] + + for batch in batches: + if not batch.published: + private.append(batch) + elif getdate(batch.start_date) < getdate(): + archived.append(batch) + elif ( + getdate(batch.start_date) == getdate() and get_time_str(batch.start_time) < nowtime() + ): + archived.append(batch) + else: + upcoming.append(batch) + + if frappe.session.user != "Guest": + if frappe.db.exists( + "Batch Student", {"student": frappe.session.user, "parent": batch.name} + ): + enrolled.append(batch) + + categories = [archived, private, enrolled] + for category in categories: + category.sort(key=lambda x: x.start_date, reverse=True) + + upcoming.sort(key=lambda x: x.start_date) + return { + "upcoming": upcoming, + "archived": archived, + "private": private, + "enrolled": enrolled, + } + + def get_country_code(): ip = frappe.local.request_ip res = requests.get(f"http://ip-api.com/json/{ip}") @@ -1169,3 +1577,320 @@ def get_country_code(): except Exception: pass return + + +@frappe.whitelist() +def get_question_details(question): + fields = ["question", "type", "multiple"] + for i in range(1, 5): + fields.append(f"option_{i}") + fields.append(f"explanation_{i}") + fields.append(f"is_correct_{i}") + + question_details = frappe.db.get_value("LMS Question", question, fields, as_dict=1) + return question_details + + +@frappe.whitelist(allow_guest=True) +def get_batch_courses(batch): + courses = [] + course_list = frappe.get_all("Batch Course", {"parent": batch}, ["name", "course"]) + + for course in course_list: + details = get_course_details(course.course) + details.batch_course = course.name + courses.append(details) + + return courses + + +@frappe.whitelist() +def get_assessments(batch, member=None): + if not member: + member = frappe.session.user + + assessments = frappe.get_all( + "LMS Assessment", + {"parent": batch}, + ["name", "assessment_type", "assessment_name"], + ) + + for assessment in assessments: + if assessment.assessment_type == "LMS Assignment": + assessment = get_assignment_details(assessment, member) + + elif assessment.assessment_type == "LMS Quiz": + assessment = get_quiz_details(assessment, member) + + return assessments + + +def get_assignment_details(assessment, member): + assessment.title = frappe.db.get_value( + "LMS Assignment", assessment.assessment_name, "title" + ) + + existing_submission = frappe.db.exists( + { + "doctype": "LMS Assignment Submission", + "member": member, + "assignment": assessment.assessment_name, + } + ) + assessment.completed = False + if existing_submission: + assessment.submission = frappe.db.get_value( + "LMS Assignment Submission", + existing_submission, + ["name", "status", "comments"], + as_dict=True, + ) + assessment.completed = True + assessment.status = assessment.submission.status + else: + assessment.status = "Not Attempted" + assessment.color = "red" + + assessment.edit_url = f"/assignments/{assessment.assessment_name}" + submission_name = existing_submission if existing_submission else "new-submission" + assessment.url = ( + f"/assignment-submission/{assessment.assessment_name}/{submission_name}" + ) + + return assessment + + +def get_quiz_details(assessment, member): + assessment_details = frappe.db.get_value( + "LMS Quiz", assessment.assessment_name, ["title", "passing_percentage"], as_dict=1 + ) + assessment.title = assessment_details.title + + existing_submission = frappe.get_all( + "LMS Quiz Submission", + { + "member": member, + "quiz": assessment.assessment_name, + }, + ["name", "score", "percentage"], + order_by="percentage desc", + ) + + if len(existing_submission): + assessment.submission = existing_submission[0] + assessment.completed = True + assessment.status = assessment.submission.score + else: + assessment.status = "Not Attempted" + assessment.color = "red" + assessment.completed = False + + assessment.edit_url = f"/quizzes/{assessment.assessment_name}" + submission_name = ( + existing_submission[0].name if len(existing_submission) else "new-submission" + ) + assessment.url = f"/quiz-submission/{assessment.assessment_name}/{submission_name}" + + return assessment + + +@frappe.whitelist() +def get_batch_students(batch): + students = [] + + students_list = frappe.get_all( + "Batch Student", filters={"parent": batch}, fields=["student", "name"] + ) + + batch_courses = frappe.get_all("Batch Course", {"parent": batch}, pluck="course") + + assessments = frappe.get_all( + "LMS Assessment", + filters={"parent": batch}, + fields=["name", "assessment_type", "assessment_name"], + ) + + for student in students_list: + courses_completed = 0 + assessments_completed = 0 + detail = frappe.db.get_value( + "User", + student.student, + ["full_name", "email", "username", "last_active", "user_image"], + as_dict=True, + ) + detail.last_active = format_datetime(detail.last_active, "dd MMM YY") + detail.name = student.name + students.append(detail) + + for course in batch_courses: + progress = frappe.db.get_value( + "LMS Enrollment", {"course": course, "member": student.student}, "progress" + ) + + if progress == 100: + courses_completed += 1 + + detail.courses_completed = courses_completed + + for assessment in assessments: + if has_submitted_assessment( + assessment.assessment_name, assessment.assessment_type, student.student + ): + assessments_completed += 1 + + detail.assessments_completed = assessments_completed + + return students + + +@frappe.whitelist() +def get_discussion_topics(doctype, docname, single_thread): + if single_thread: + filters = { + "reference_doctype": doctype, + "reference_docname": docname, + } + topic = frappe.db.exists("Discussion Topic", filters) + if topic: + return frappe.db.get_value("Discussion Topic", topic, ["name"], as_dict=1) + else: + return create_discussion_topic(doctype, docname) + topics = frappe.get_all( + "Discussion Topic", + { + "reference_doctype": doctype, + "reference_docname": docname, + }, + ["name", "title", "owner", "creation", "modified"], + order_by="creation desc", + ) + + for topic in topics: + topic.user = frappe.db.get_value( + "User", topic.owner, ["full_name", "user_image"], as_dict=True + ) + + return topics + + +def create_discussion_topic(doctype, docname): + doc = frappe.new_doc("Discussion Topic") + doc.update( + { + "title": docname, + "reference_doctype": doctype, + "reference_docname": docname, + } + ) + doc.insert() + return doc + + +@frappe.whitelist() +def get_discussion_replies(topic): + replies = frappe.get_all( + "Discussion Reply", + { + "topic": topic, + }, + ["name", "owner", "creation", "modified", "reply"], + order_by="creation", + ) + + for reply in replies: + reply.user = frappe.db.get_value( + "User", reply.owner, ["full_name", "user_image"], as_dict=True + ) + + return replies + + +@frappe.whitelist() +def get_order_summary(doctype, docname, country=None): + if doctype == "LMS Course": + details = frappe.db.get_value( + "LMS Course", + docname, + ["title", "name", "paid_course", "course_price as amount", "currency", "amount_usd"], + as_dict=True, + ) + + if not details.paid_course: + raise frappe.throw(_("This course is free.")) + + else: + details = frappe.db.get_value( + "LMS Batch", + docname, + ["title", "name", "paid_batch", "amount", "currency", "amount_usd"], + as_dict=True, + ) + + if not details.paid_batch: + raise frappe.throw(_("To join this batch, please contact the Administrator.")) + + details.amount, details.currency = check_multicurrency( + details.amount, details.currency, country, details.amount_usd + ) + details.original_amount_formatted = fmt_money(details.amount, 0, details.currency) + + if details.currency == "INR": + details.amount, details.gst_applied = apply_gst(details.amount) + details.gst_amount_formatted = fmt_money(details.gst_applied, 0, details.currency) + + details.total_amount_formatted = fmt_money(details.amount, 0, details.currency) + return details + + +@frappe.whitelist() +def get_lesson_creation_details(course, chapter, lesson): + chapter_name = frappe.db.get_value( + "Chapter Reference", {"parent": course, "idx": chapter}, "chapter" + ) + lesson_name = frappe.db.get_value( + "Lesson Reference", {"parent": chapter_name, "idx": lesson}, "lesson" + ) + + if lesson_name: + lesson_details = frappe.db.get_value( + "Course Lesson", + lesson_name, + [ + "name", + "title", + "include_in_preview", + "body", + "content", + "instructor_notes", + "instructor_content", + "youtube", + "quiz_id", + ], + as_dict=1, + ) + + return { + "course_title": frappe.db.get_value("LMS Course", course, "title"), + "chapter": frappe.db.get_value( + "Course Chapter", chapter_name, ["title", "name"], as_dict=True + ), + "lesson": lesson_details if lesson_name else None, + } + + +@frappe.whitelist() +def get_roles(name): + frappe.only_for("Moderator") + return { + "moderator": has_course_moderator_role(name), + "course_creator": has_course_instructor_role(name), + "batch_evaluator": has_course_evaluator_role(name), + "lms_student": has_student_role(name), + } + + +def publish_notifications(doc, method): + frappe.publish_realtime( + "publish_lms_notifications", user=doc.for_user, after_commit=True + ) diff --git a/lms/lms/web_form/evaluation/evaluation.json b/lms/lms/web_form/evaluation/evaluation.json index 6dbafdae..885114e6 100644 --- a/lms/lms/web_form/evaluation/evaluation.json +++ b/lms/lms/web_form/evaluation/evaluation.json @@ -21,8 +21,7 @@ "list_columns": [], "login_required": 1, "max_attachment_size": 0, - "meta_image": "/files/og_image_web_form_evaluation_68ddf18e.png", - "modified": "2023-08-23 14:37:03.086304", + "modified": "2023-08-23 14:37:03.086305", "modified_by": "Administrator", "module": "LMS", "name": "evaluation", diff --git a/lms/lms/web_template/course_cards/course_cards.html b/lms/lms/web_template/course_cards/course_cards.html index 6cf8974b..8eb3ab8a 100644 --- a/lms/lms/web_template/course_cards/course_cards.html +++ b/lms/lms/web_template/course_cards/course_cards.html @@ -11,7 +11,7 @@ {{ widgets.CourseCard(course=course, read_only=False) }} {% endfor %} - + {{ _("Explore More") }} diff --git a/lms/www/billing/__init__.py b/lms/lms/web_template/recently_published_courses/__init__.py similarity index 100% rename from lms/www/billing/__init__.py rename to lms/lms/web_template/recently_published_courses/__init__.py diff --git a/lms/lms/web_template/recently_published_courses/recently_published_courses.html b/lms/lms/web_template/recently_published_courses/recently_published_courses.html new file mode 100644 index 00000000..448ef3d5 --- /dev/null +++ b/lms/lms/web_template/recently_published_courses/recently_published_courses.html @@ -0,0 +1,18 @@ +{{ _(subtitle) }}
+ {% endif %} + +\"+Q(u[e].content)+" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "User" +msgid "{} Active" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Enrollment" +msgid "{} Completed" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Enrollment" +msgid "{} Enrolled" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Certificate" +msgid "{} Granted" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Certificate Evaluation" +msgid "{} Passed" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Course" +msgid "{} Published" +msgstr "" + diff --git a/lms/locale/main.pot b/lms/locale/main.pot new file mode 100644 index 00000000..8de95863 --- /dev/null +++ b/lms/locale/main.pot @@ -0,0 +1,6300 @@ +# Translations template for Frappe LMS. +# Copyright (C) 2024 Frappe +# This file is distributed under the same license as the Frappe LMS project. +# FIRST AUTHOR\"};j.code_block=function(u,e,t,n,r){const c=u[e];return\", 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: Frappe LMS VERSION\n" +"Report-Msgid-Bugs-To: school@frappe.io\n" +"POT-Creation-Date: 2024-06-28 19:27+0553\n" +"PO-Revision-Date: 2024-06-28 19:27+0553\n" +"Last-Translator: school@frappe.io\n" +"Language-Team: school@frappe.io\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.13.1\n" + +#: templates/emails/assignment_submission.html:5 +msgid " Please evaluate and grade it." +msgstr "" + +#: public/frontend/assets/ProfileAbout-M7A4DT21.js:1 +msgid "About" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Cohort Join Request' +#: lms/doctype/cohort_join_request/cohort_join_request.json +msgctxt "Cohort Join Request" +msgid "Accepted" +msgstr "" + +#. Label of a Data field in DocType 'Zoom Settings' +#: lms/doctype/zoom_settings/zoom_settings.json +msgctxt "Zoom Settings" +msgid "Account ID" +msgstr "" + +#: public/frontend/assets/ProfileAbout-M7A4DT21.js:1 +msgid "Achievements" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Active" +msgstr "" + +#: public/frontend/assets/CourseOutline-BVkxGD_M.js:1 +msgid "Add Chapter" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Add Course" +msgstr "" + +#: public/frontend/assets/CourseOutline-BVkxGD_M.js:1 +msgid "Add Lesson" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Add Live Class" +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "Add Slot" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Add Student" +msgstr "" + +#: templates/onboarding_header.html:26 +msgid "Add a Chapter" +msgstr "" + +#: templates/onboarding_header.html:33 +msgid "Add a Lesson" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Add a Student" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Add a course" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "Add an image, video, pdf or audio." +msgstr "" + +#: lms/doctype/lms_question/lms_question.py:59 +msgid "Add at least one possible answer for this question: {0}" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7369 +msgid "Add web page to sidebar" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "Add your assignment as {0}" +msgstr "" + +#. Label of a Link field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Address" +msgstr "" + +#. Option for the 'Role' (Select) field in DocType 'Cohort Staff' +#: lms/doctype/cohort_staff/cohort_staff.json +msgctxt "Cohort Staff" +msgid "Admin" +msgstr "" + +#. Option for the 'Required Role' (Select) field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Admin" +msgstr "" + +#. Option for the 'Role' (Select) field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Admin" +msgstr "" + +#. Name of a role +#: lms/doctype/lms_badge/lms_badge.json +msgid "All" +msgstr "" + +#: lms/widgets/BreadCrumb.html:3 public/frontend/assets/Courses-C42D3lfQ.js:1 +msgid "All Courses" +msgstr "" + +#: templates/quiz/quiz.html:141 +msgid "All Submissions" +msgstr "" + +#: lms/doctype/lms_quiz/lms_quiz.py:41 +msgid "All questions should have the same marks if the limit is set." +msgstr "" + +#. Label of a Check field in DocType 'Job Settings' +#: job/doctype/job_settings/job_settings.json +msgctxt "Job Settings" +msgid "Allow Job Posting From Website" +msgstr "" + +#. Label of a Check field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Allow Self Enrollment" +msgstr "" + +#. Label of a Check field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Allow accessing future dates" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +msgid "Allow self enrollment" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Allow students to see each others progress in class" +msgstr "" + +#: overrides/user.py:195 +msgid "Already Registered" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:379 +msgid "Amount" +msgstr "" + +#. Label of a Currency field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Amount" +msgstr "" + +#. Label of a Currency field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Amount" +msgstr "" + +#: public/js/common_functions.js:397 +msgid "Amount (USD)" +msgstr "" + +#. Label of a Currency field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Amount (USD)" +msgstr "" + +#. Label of a Currency field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Amount (USD)" +msgstr "" + +#. Label of a Currency field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Amount with GST" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Announcement" +msgstr "" + +#. Label of a Text Editor field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Answer" +msgstr "" + +#. Label of a Text Editor field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Answer" +msgstr "" + +#. Label of a Code field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Answer" +msgstr "" + +#. Option for the 'Course Creation Access Through Website To' (Select) field in +#. DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Anyone" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Apply GST for India" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Apply Rounding on Equivalent" +msgstr "" + +#: public/frontend/assets/JobDetail-CBHvk1ll.js:1 +msgid "Apply for this job" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Approved" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Approved" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Approved" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Ask User Category during Signup" +msgstr "" + +#: templates/assessments.html:11 +msgid "Assessment" +msgstr "" + +#. Label of a Tab Break field in DocType 'LMS Batch' +#. Label of a Table field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Assessment" +msgstr "" + +#. Label of a Dynamic Link field in DocType 'LMS Assessment' +#: lms/doctype/lms_assessment/lms_assessment.json +msgctxt "LMS Assessment" +msgid "Assessment Name" +msgstr "" + +#. Label of a Link field in DocType 'LMS Assessment' +#: lms/doctype/lms_assessment/lms_assessment.json +msgctxt "LMS Assessment" +msgid "Assessment Type" +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:66 +msgid "Assessment {0} has already been added to this batch." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 templates/assessments.html:3 +msgid "Assessments" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Assessments" +msgstr "" + +#: lms/doctype/lms_badge/lms_badge.js:50 +msgid "Assign" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:32 templates/assignment.html:3 +msgid "Assignment" +msgstr "" + +#. Label of a Section Break field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Assignment" +msgstr "" + +#. Label of a Link field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Assignment" +msgstr "" + +#. Label of a Attach field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Assignment Attachment" +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Assignment Submission Template" +msgstr "" + +#. Label of a Data field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Assignment Title" +msgstr "" + +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.py:31 +msgid "Assignment for Lesson {0} by {1} already exists." +msgstr "" + +#. Description of the 'Question' (Small Text) field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Assignment will appear at the bottom of the lesson." +msgstr "" + +#: lms/doctype/lms_question/lms_question.py:41 +msgid "At least one option must be correct for this question." +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "Authorize Google Calendar Access" +msgstr "" + +#. Option for the 'Event' (Select) field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Auto Assign" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Auto Recording" +msgstr "" + +#. Label of a Select field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Auto Recording" +msgstr "" + +#: public/frontend/assets/CourseCard-BK77fFq6.js:1 +msgid "Average Rating" +msgstr "" + +#. Label of a Link field in DocType 'LMS Badge Assignment' +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +msgctxt "LMS Badge Assignment" +msgid "Badge" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Badge Assignment' +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +msgctxt "LMS Badge Assignment" +msgid "Badge Description" +msgstr "" + +#. Label of a Attach field in DocType 'LMS Badge Assignment' +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +msgctxt "LMS Badge Assignment" +msgid "Badge Image" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Batch" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Batch" +msgstr "" + +#. Label of a Link field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Batch" +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Batch Confirmation Template" +msgstr "" + +#. Name of a DocType +#: lms/doctype/batch_course/batch_course.json +msgid "Batch Course" +msgstr "" + +#: public/js/common_functions.js:428 +msgid "Batch Created" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Batch Description" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:349 +#: templates/emails/batch_confirmation.html:29 +msgid "Batch Details" +msgstr "" + +#. Label of a Text Editor field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Batch Details" +msgstr "" + +#: public/js/common_functions.js:356 +msgid "Batch Details Raw" +msgstr "" + +#. Label of a HTML Editor field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Batch Details Raw" +msgstr "" + +#. Name of a role +#: lms/doctype/course_evaluator/course_evaluator.json +#: lms/doctype/lms_batch/lms_batch.json +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgid "Batch Evaluator" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Batch Name" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Batch Old" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Batch Old" +msgstr "" + +#. Label of a Link field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Batch Old" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Batch Settings" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Batch Settings" +msgstr "" + +#: templates/emails/batch_confirmation.html:16 +msgid "Batch Start Date:" +msgstr "" + +#. Name of a DocType +#: lms/doctype/batch_student/batch_student.json +msgid "Batch Student" +msgstr "" + +#: public/js/common_functions.js:427 +msgid "Batch Updated" +msgstr "" + +#: lms/web_form/add_a_new_batch/add_a_new_batch.js:6 +msgid "Batch {0} has been successfully created!" +msgstr "" + +#: www/lms.py:61 +msgid "Batches" +msgstr "" + +#. Group in LMS Course's connections +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Batches" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Batches" +msgstr "" + +#. Label of a Date field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Begin Date" +msgstr "" + +#: templates/emails/batch_confirmation.html:36 +#: templates/emails/certification.html:20 +msgid "Best Regards" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Billing Details" +msgstr "" + +#. Label of a Data field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Billing Name" +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Bio" +msgstr "" + +#. Label of a Markdown Editor field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Body" +msgstr "" + +#: templates/signup-form.html:22 +msgid "Business Owner" +msgstr "" + +#: templates/emails/lms_message.html:11 +msgid "By" +msgstr "" + +#. Option for the 'Grade Type' (Select) field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "CGPA/4" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Cancelled" +msgstr "" + +#. Option for the 'Stage' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Cancelled" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:316 templates/signup-form.html:21 +msgid "Category" +msgstr "" + +#. Label of a Link field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Category" +msgstr "" + +#. Label of a Data field in DocType 'LMS Category' +#: lms/doctype/lms_category/lms_category.json +msgctxt "LMS Category" +msgid "Category" +msgstr "" + +#. Label of a shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Certificate" +msgid "Certificate" +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Certificate Email Template" +msgstr "" + +#: templates/emails/certification.html:13 +msgid "Certificate Link" +msgstr "" + +#: public/frontend/assets/ProfileCertificates-QrJyNc6L.js:1 +msgid "Certificates" +msgstr "" + +#. Name of a DocType +#. Label of a Card Break in the LMS Workspace +#: lms/doctype/certification/certification.json lms/workspace/lms/lms.json +msgid "Certification" +msgstr "" + +#. Label of a Link in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Certificate" +msgid "Certification" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Certification" +msgstr "" + +#. Label of a Int field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Certification Expires After (Years)" +msgstr "" + +#. Label of a Data field in DocType 'Certification' +#: lms/doctype/certification/certification.json +msgctxt "Certification" +msgid "Certification Name" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Certified Participants" +msgstr "" + +#: templates/assignment.html:13 +msgid "Change" +msgstr "" + +#. Label of a Link field in DocType 'Chapter Reference' +#: lms/doctype/chapter_reference/chapter_reference.json +msgctxt "Chapter Reference" +msgid "Chapter" +msgstr "" + +#. Label of a Link in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "Course Chapter" +msgid "Chapter" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Chapter" +msgstr "" + +#. Name of a DocType +#: lms/doctype/chapter_reference/chapter_reference.json +msgid "Chapter Reference" +msgstr "" + +#. Label of a Table field in DocType 'LMS Course' +#. Group in LMS Course's connections +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Chapters" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:120 +msgid "Check" +msgstr "" + +#: templates/emails/mention_template.html:10 +msgid "Check Discussion" +msgstr "" + +#: templates/certificates_section.html:24 +msgid "Check out the {0} to know more about certification." +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Checkout Courses" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Choices" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:53 +msgid "Choose all answers that apply" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7369 +msgid "Choose an icon" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:53 +msgid "Choose one answer" +msgstr "" + +#. Label of a Data field in DocType 'Zoom Settings' +#: lms/doctype/zoom_settings/zoom_settings.json +msgctxt "Zoom Settings" +msgid "Client ID" +msgstr "" + +#. Label of a Password field in DocType 'Zoom Settings' +#: lms/doctype/zoom_settings/zoom_settings.json +msgctxt "Zoom Settings" +msgid "Client Secret" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Closed" +msgstr "" + +#. Option for the 'Membership' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Closed" +msgstr "" + +#. Option for the 'Auto Recording' (Select) field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Cloud" +msgstr "" + +#. Label of a Code field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Code" +msgstr "" + +#. Name of a DocType +#: lms/doctype/cohort/cohort.json +msgid "Cohort" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Join Request' +#: lms/doctype/cohort_join_request/cohort_join_request.json +msgctxt "Cohort Join Request" +msgid "Cohort" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Mentor' +#: lms/doctype/cohort_mentor/cohort_mentor.json +msgctxt "Cohort Mentor" +msgid "Cohort" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Staff' +#: lms/doctype/cohort_staff/cohort_staff.json +msgctxt "Cohort Staff" +msgid "Cohort" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Subgroup' +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgctxt "Cohort Subgroup" +msgid "Cohort" +msgstr "" + +#. Option for the 'Scope' (Select) field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Cohort" +msgstr "" + +#. Label of a Link field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Cohort" +msgstr "" + +#. Name of a DocType +#: lms/doctype/cohort_join_request/cohort_join_request.json +msgid "Cohort Join Request" +msgstr "" + +#. Linked DocType in Cohort Subgroup's connections +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgctxt "Cohort Subgroup" +msgid "Cohort Join Request" +msgstr "" + +#. Name of a DocType +#: lms/doctype/cohort_mentor/cohort_mentor.json +msgid "Cohort Mentor" +msgstr "" + +#. Name of a DocType +#: lms/doctype/cohort_staff/cohort_staff.json +msgid "Cohort Staff" +msgstr "" + +#. Name of a DocType +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgid "Cohort Subgroup" +msgstr "" + +#. Linked DocType in Cohort's connections +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Cohort Subgroup" +msgstr "" + +#. Name of a DocType +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgid "Cohort Web Page" +msgstr "" + +#. Label of a Color field in DocType 'LMS Timetable Legend' +#: lms/doctype/lms_timetable_legend/lms_timetable_legend.json +msgctxt "LMS Timetable Legend" +msgid "Color" +msgstr "" + +#. Label of a Small Text field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Comments" +msgstr "" + +#. Label of a Small Text field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Comments" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Comments" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Comments" +msgstr "" + +#: config/desktop.py:11 +msgid "Community" +msgstr "" + +#. Label of a Data field in DocType 'LMS Job Application' +#: job/doctype/lms_job_application/lms_job_application.json +msgctxt "LMS Job Application" +msgid "Company" +msgstr "" + +#. Label of a Data field in DocType 'Work Experience' +#: lms/doctype/work_experience/work_experience.json +msgctxt "Work Experience" +msgid "Company" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +msgid "Company Details" +msgstr "" + +#. Label of a Section Break field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Company Details" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +msgid "Company Email Address" +msgstr "" + +#. Label of a Data field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Company Email Address" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +msgid "Company Logo" +msgstr "" + +#. Label of a Attach Image field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Company Logo" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +msgid "Company Name" +msgstr "" + +#. Label of a Data field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Company Name" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +msgid "Company Website" +msgstr "" + +#. Label of a Data field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Company Website" +msgstr "" + +#: lms/widgets/CourseCard.html:75 templates/reviews.html:48 +msgid "Complete" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Complete" +msgstr "" + +#: templates/emails/lms_invite_request_approved.html:7 +msgid "Complete Sign Up" +msgstr "" + +#: lms/widgets/CourseCard.html:78 +msgid "Completed" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Completed" +msgstr "" + +#. Option for the 'Stage' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Completed" +msgstr "" + +#. Option for the 'Grant Certificate After' (Select) field in DocType 'LMS +#. Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Completion" +msgstr "" + +#: public/frontend/assets/Statistics-Df9qvpz5.js:18 +msgid "Completions" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "Components" +msgstr "" + +#. Label of a Code field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Condition" +msgstr "" + +#. Label of a Check field in DocType 'Batch Student' +#: lms/doctype/batch_student/batch_student.json +msgctxt "Batch Student" +msgid "Confirmation Email Sent" +msgstr "" + +#: lms/doctype/lms_certificate/lms_certificate.py:25 +msgid "Congratulations on getting certified!" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:2 +msgid "Content" +msgstr "" + +#. Label of a Text field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Content" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:17 +msgid "Content Type" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "Content such as quiz, video and image will be added in the editor you select." +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Contract" +msgstr "" + +#: lms/utils.py:422 +msgid "Cookie Policy" +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Cookie Policy Page" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:17 +msgid "Copy and paste the syntax in the editor. Replace 'embed_src' with the embed source that YouTube provides. To get the source, follow the steps mentioned below." +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:29 +msgid "Copy and paste the syntax in the editor. Replace 'exercise_id' with the ID of the Exercise you want to add. You can get the ID of the exercise from the {0}." +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:23 +msgid "Copy and paste the syntax in the editor. Replace 'lms_quiz_id' with the ID of the Quiz you want to add. You can get the ID of the quiz from the {0}." +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Correct" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Exercise Latest +#. Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Correct" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Correct" +msgstr "" + +#. Label of a Link field in DocType 'Payment Country' +#: lms/doctype/payment_country/payment_country.json +msgctxt "Payment Country" +msgid "Country" +msgstr "" + +#: lms/report/course_progress_summary/course_progress_summary.js:9 +#: lms/report/course_progress_summary/course_progress_summary.py:51 +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Batch Course' +#: lms/doctype/batch_course/batch_course.json +msgctxt "Batch Course" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Mentor' +#: lms/doctype/cohort_mentor/cohort_mentor.json +msgctxt "Cohort Mentor" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Staff' +#: lms/doctype/cohort_staff/cohort_staff.json +msgctxt "Cohort Staff" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Subgroup' +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgctxt "Cohort Subgroup" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Course Chapter' +#: lms/doctype/course_chapter/course_chapter.json +msgctxt "Course Chapter" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Course" +msgstr "" + +#. Label of a Link in the LMS Workspace +#. Label of a shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Course" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Interest' +#: lms/doctype/lms_course_interest/lms_course_interest.json +msgctxt "LMS Course Interest" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Mentor Mapping' +#: lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json +msgctxt "LMS Course Mentor Mapping" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Review' +#: lms/doctype/lms_course_review/lms_course_review.json +msgctxt "LMS Course Review" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Course" +msgstr "" + +#. Label of a Link field in DocType 'Related Courses' +#: lms/doctype/related_courses/related_courses.json +msgctxt "Related Courses" +msgid "Course" +msgstr "" + +#. Name of a DocType +#: lms/doctype/course_chapter/course_chapter.json +msgid "Course Chapter" +msgstr "" + +#. Label of a Link field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Course Chapter" +msgstr "" + +#. Linked DocType in LMS Course's connections +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Course Chapter" +msgstr "" + +#. Label of a shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Enrollment" +msgid "Course Completed" +msgstr "" + +#: lms/widgets/CourseOutline.html:9 +msgid "Course Content" +msgstr "" + +#. Label of a Select field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Course Creation Access Through Website To" +msgstr "" + +#. Name of a role +#: lms/doctype/lms_course/lms_course.json +#: lms/doctype/lms_question/lms_question.json +#: lms/doctype/lms_quiz/lms_quiz.json +#: public/frontend/assets/ProfileRoles-CVq7nQGs.js:1 +msgid "Course Creator" +msgstr "" + +#. Option for the 'Course Creation Access Through Website To' (Select) field in +#. DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Course Creator Role" +msgstr "" + +#. Label of a Card Break in the LMS Workspace +#: lms/workspace/lms/lms.json +msgid "Course Data" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Course Description" +msgstr "" + +#. Name of a DocType +#: lms/doctype/course_evaluator/course_evaluator.json +msgid "Course Evaluator" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Course Image" +msgstr "" + +#. Name of a DocType +#: lms/doctype/course_instructor/course_instructor.json +msgid "Course Instructor" +msgstr "" + +#. Name of a DocType +#: lms/doctype/course_lesson/course_lesson.json +msgid "Course Lesson" +msgstr "" + +#. Linked DocType in Course Chapter's connections +#: lms/doctype/course_chapter/course_chapter.json +msgctxt "Course Chapter" +msgid "Course Lesson" +msgstr "" + +#: www/lms.py:28 +msgid "Course List" +msgstr "" + +#. Label of a Data field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Course List Search Bar Placeholder" +msgstr "" + +#: lms/report/course_progress_summary/course_progress_summary.py:58 +msgid "Course Name" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Course Price" +msgstr "" + +#. Label of a Currency field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Course Price" +msgstr "" + +#. Name of a report +#: lms/report/course_progress_summary/course_progress_summary.json +msgid "Course Progress Summary" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Course Settings" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Course Settings" +msgstr "" + +#. Label of a Card Break in the LMS Workspace +#: lms/workspace/lms/lms.json +msgid "Course Stats" +msgstr "" + +#. Label of a Data field in DocType 'Batch Course' +#: lms/doctype/batch_course/batch_course.json +msgctxt "Batch Course" +msgid "Course Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Course Title" +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:321 +msgid "Course already added to the batch." +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:55 +msgid "Course {0} has already been added to this batch." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/Statistics-Df9qvpz5.js:18 +msgid "Courses" +msgstr "" + +#. Label of a Table field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Courses" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Courses" +msgstr "" + +#: lms/web_template/lms_statistics/lms_statistics.html:14 +#: templates/statistics.html:28 +msgid "Courses Completed" +msgstr "" + +#: lms/web_template/courses_mentored/courses_mentored.html:4 +msgid "Courses Mentored" +msgstr "" + +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.js:7 +msgid "Create LMS Certificate" +msgstr "" + +#: lms/doctype/lms_certificate_request/lms_certificate_request.js:8 +msgid "Create LMS Certificate Evaluation" +msgstr "" + +#: templates/onboarding_header.html:19 +msgid "Create a Course" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Create a Live Class" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +#: public/js/common_functions.js:387 +msgid "Currency" +msgstr "" + +#. Label of a Link field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Currency" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Currency" +msgstr "" + +#. Label of a Link field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Currency" +msgstr "" + +#. Label of a Link field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Current Lesson" +msgstr "" + +#. Label of a Code field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Custom HTML" +msgstr "" + +#. Label of a Code field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Custom Script (JavaScript)" +msgstr "" + +#. Label of a Tab Break field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Customisations" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Dashboard" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 templates/quiz/quiz.html:149 +msgid "Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Batch Timetable' +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgctxt "LMS Batch Timetable" +msgid "Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Date" +msgstr "" + +#. Label of a Date field in DocType 'Scheduled Flow' +#: lms/doctype/scheduled_flow/scheduled_flow.json +msgctxt "Scheduled Flow" +msgid "Date" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +msgid "Date and Time" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Date and Time" +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "Day" +msgstr "" + +#. Label of a Select field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Day" +msgstr "" + +#. Label of a Int field in DocType 'LMS Batch Timetable' +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgctxt "LMS Batch Timetable" +msgid "Day" +msgstr "" + +#. Label of a Select field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Day" +msgstr "" + +#: templates/emails/mentor_request_creation_email.html:2 +#: templates/emails/mentor_request_status_update_email.html:2 +msgid "Dear" +msgstr "" + +#: templates/emails/batch_confirmation.html:2 +#: templates/emails/certification.html:2 +msgid "Dear " +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Default Currency" +msgstr "" + +#. Label of a Data field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Degree Type" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:17 +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +#: public/js/common_functions.js:342 +msgid "Description" +msgstr "" + +#. Label of a Small Text field in DocType 'Certification' +#: lms/doctype/certification/certification.json +msgctxt "Certification" +msgid "Description" +msgstr "" + +#. Label of a Markdown Editor field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Description" +msgstr "" + +#. Label of a Markdown Editor field in DocType 'Cohort Subgroup' +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgctxt "Cohort Subgroup" +msgid "Description" +msgstr "" + +#. Label of a Small Text field in DocType 'Course Chapter' +#: lms/doctype/course_chapter/course_chapter.json +msgctxt "Course Chapter" +msgid "Description" +msgstr "" + +#. Label of a Text Editor field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Description" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Description" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Description" +msgstr "" + +#. Label of a Markdown Editor field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Description" +msgstr "" + +#. Label of a Text Editor field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Description" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Description" +msgstr "" + +#. Label of a Text field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Description" +msgstr "" + +#. Label of a Small Text field in DocType 'Work Experience' +#: lms/doctype/work_experience/work_experience.json +msgctxt "Work Experience" +msgid "Description" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +#: public/frontend/assets/Discussions-BUeR4n3G.js:1 +msgid "Details" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Disable Self Enrollment" +msgstr "" + +#. Label of a Check field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Disable Self Learning" +msgstr "" + +#. Label of a Check field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Disabled" +msgstr "" + +#: lms/widgets/NoPreviewModal.html:25 +#: public/frontend/assets/Discussions-BUeR4n3G.js:1 templates/reviews.html:159 +msgid "Discard" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Discussions" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Discussions" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:32 +msgid "Document" +msgstr "" + +#. Option for the 'File Type' (Select) field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Document" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Document" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Document" +msgstr "" + +#: lms/doctype/lms_question/lms_question.py:31 +msgid "Duplicate options found for this question." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Duration" +msgstr "" + +#. Label of a Data field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Duration" +msgstr "" + +#. Label of a Data field in DocType 'LMS Batch Timetable' +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgctxt "LMS Batch Timetable" +msgid "Duration" +msgstr "" + +#. Label of a Int field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Duration" +msgstr "" + +#. Label of a Select field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Duration for Attempts" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Duration of the live class in minutes" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Join Request' +#: lms/doctype/cohort_join_request/cohort_join_request.json +msgctxt "Cohort Join Request" +msgid "E-Mail" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Mentor' +#: lms/doctype/cohort_mentor/cohort_mentor.json +msgctxt "Cohort Mentor" +msgid "E-mail" +msgstr "" + +#: public/frontend/assets/Lesson-59XvRJIg.js:18 +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Edit" +msgstr "" + +#: public/frontend/assets/CourseOutline-BVkxGD_M.js:1 +msgid "Edit Chapter" +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Edit Profile" +msgstr "" + +#. Name of a DocType +#: lms/doctype/education_detail/education_detail.json +msgid "Education Detail" +msgstr "" + +#: templates/signup-form.html:9 +msgid "Email" +msgstr "" + +#. Label of a Check field in DocType 'LMS Course Interest' +#: lms/doctype/lms_course_interest/lms_course_interest.json +msgctxt "LMS Course Interest" +msgid "Email Sent" +msgstr "" + +#. Label of a Tab Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Email Templates" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Emails" +msgstr "" + +#: templates/signup-form.html:24 +msgid "Employee" +msgstr "" + +#. Label of a Check field in DocType 'Zoom Settings' +#: lms/doctype/zoom_settings/zoom_settings.json +msgctxt "Zoom Settings" +msgid "Enable" +msgstr "" + +#. Label of a Check field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Enable Certification" +msgstr "" + +#: lms/doctype/lms_settings/lms_settings.py:20 +msgid "Enable Google API in Google Settings to send calendar invites for evaluations." +msgstr "" + +#. Label of a Check field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Enabled" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:282 +msgid "End Date" +msgstr "" + +#. Label of a Date field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "End Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "End Date" +msgstr "" + +#. Label of a Date field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "End Date (or expected)" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +#: public/js/common_functions.js:299 +msgid "End Time" +msgstr "" + +#. Label of a Time field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "End Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "End Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "End Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Batch Timetable' +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgctxt "LMS Batch Timetable" +msgid "End Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "End Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "End Time" +msgstr "" + +#. Label of a Time field in DocType 'Scheduled Flow' +#: lms/doctype/scheduled_flow/scheduled_flow.json +msgctxt "Scheduled Flow" +msgid "End Time" +msgstr "" + +#: public/frontend/assets/CourseCard-BK77fFq6.js:1 +msgid "Enrolled Students" +msgstr "" + +#: public/js/common_functions.js:96 +msgid "Enrolled successfully" +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:87 +msgid "Enrollment Confirmation for the Next Training Batch" +msgstr "" + +#: lms/web_template/lms_statistics/lms_statistics.html:14 +#: templates/statistics.html:20 +msgid "Enrollment Count" +msgstr "" + +#. Label of a chart in the LMS Workspace +#: lms/workspace/lms/lms.json public/frontend/assets/Statistics-Df9qvpz5.js:18 +msgid "Enrollments" +msgstr "" + +#. Label of a shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Enrollment" +msgid "Enrollments" +msgstr "" + +#: lms/doctype/lms_settings/lms_settings.py:25 +msgid "Enter Client Id and Client Secret in Google Settings to send calendar invites for evaluations." +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "Enter a URL" +msgstr "" + +#: templates/quiz/quiz.html:53 +msgid "Enter the correct answer" +msgstr "" + +#: lms/utils.py:1141 +msgid "Error during payment: {0} Please contact the Administrator. Amount {1} Currency {2} Formatted {3}" +msgstr "" + +#. Label of a Link in the LMS Workspace +#. Label of a shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Certificate Evaluation" +msgid "Evaluation" +msgstr "" + +#. Option for the 'Grant Certificate After' (Select) field in DocType 'LMS +#. Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Evaluation" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Evaluation Details" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:333 +msgid "Evaluation End Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Evaluation End Date" +msgstr "" + +#. Label of a Link in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Certificate Request" +msgid "Evaluation Request" +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:84 +msgid "Evaluation end date cannot be less than the batch end date." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/ProfileRoles-CVq7nQGs.js:1 +#: templates/upcoming_evals.html:33 +msgid "Evaluator" +msgstr "" + +#. Label of a Link field in DocType 'Batch Course' +#: lms/doctype/batch_course/batch_course.json +msgctxt "Batch Course" +msgid "Evaluator" +msgstr "" + +#. Label of a Link field in DocType 'Course Evaluator' +#: lms/doctype/course_evaluator/course_evaluator.json +msgctxt "Course Evaluator" +msgid "Evaluator" +msgstr "" + +#. Label of a Link field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Evaluator" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Evaluator" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Evaluator" +msgstr "" + +#. Name of a DocType +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgid "Evaluator Schedule" +msgstr "" + +#: lms/doctype/lms_certificate_request/lms_certificate_request.py:44 +msgid "Evaluator is unavailable from {0} to {1}. Please select a date after {1}" +msgstr "" + +#. Label of a Select field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Event" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Exercise" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Exercise" +msgstr "" + +#. Name of a DocType +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgid "Exercise Latest Submission" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:10 +msgid "Exercise List" +msgstr "" + +#. Name of a DocType +#: lms/doctype/exercise_submission/exercise_submission.json +msgid "Exercise Submission" +msgstr "" + +#. Label of a Data field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Exercise Title" +msgstr "" + +#. Label of a Data field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Exercise Title" +msgstr "" + +#. Label of a Data field in DocType 'Certification' +#: lms/doctype/certification/certification.json +msgctxt "Certification" +msgid "Expiration Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Expiry Date" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Explanation" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Explanation " +msgstr "" + +#: lms/web_template/course_cards/course_cards.html:15 +#: lms/web_template/recently_published_courses/recently_published_courses.html:16 +msgid "Explore More" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Assignment +#. Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Fail" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Certificate +#. Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Fail" +msgstr "" + +#: public/frontend/assets/CourseCard-BK77fFq6.js:1 +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Featured" +msgstr "" + +#. Label of a Check field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Featured" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "Feel free to make edits to your submission if needed." +msgstr "" + +#. Label of a Select field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Field To Check" +msgstr "" + +#. Label of a Data field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Field of Major/Study" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:13 +msgid "File DocType" +msgstr "" + +#. Label of a Select field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "File Type" +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "First Name" +msgstr "" + +#: lms/widgets/CourseCard.html:114 +msgid "Free" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Freelance" +msgstr "" + +#: templates/signup-form.html:26 +msgid "Freelancer/Just looking" +msgstr "" + +#. Option for the 'Grade Type' (Select) field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "French (e.g. Distinction)" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Friday" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Friday" +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "From" +msgstr "" + +#. Label of a Date field in DocType 'Course Evaluator' +#: lms/doctype/course_evaluator/course_evaluator.json +msgctxt "Course Evaluator" +msgid "From" +msgstr "" + +#. Label of a Date field in DocType 'Work Experience' +#: lms/doctype/work_experience/work_experience.json +msgctxt "Work Experience" +msgid "From Date" +msgstr "" + +#: templates/signup-form.html:4 +msgid "Full Name" +msgstr "" + +#. Label of a Data field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Full Name" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Full Time" +msgstr "" + +#. Name of a DocType +#: lms/doctype/function/function.json +msgid "Function" +msgstr "" + +#. Label of a Data field in DocType 'Function' +#: lms/doctype/function/function.json +msgctxt "Function" +msgid "Function" +msgstr "" + +#. Label of a Link field in DocType 'Preferred Function' +#: lms/doctype/preferred_function/preferred_function.json +msgctxt "Preferred Function" +msgid "Function" +msgstr "" + +#. Label of a Data field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "GSTIN" +msgstr "" + +#: lms/doctype/lms_certificate_request/lms_certificate_request.js:18 +msgid "Generate Google Meet Link" +msgstr "" + +#: templates/onboarding_header.html:8 +msgid "Get Started" +msgstr "" + +#. Label of a Data field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Google Meet Link" +msgstr "" + +#. Label of a Data field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Grade" +msgstr "" + +#. Label of a Check field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Grade Assignment" +msgstr "" + +#. Label of a Select field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Grade Type" +msgstr "" + +#. Label of a Select field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Grant Certificate After" +msgstr "" + +#. Label of a Check field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Grant only once" +msgstr "" + +#: templates/signup-form.html:53 +msgid "Have an account? Login" +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Headline" +msgstr "" + +#: lms/widgets/HelloWorld.html:13 +msgid "Hello" +msgstr "" + +#. Label of a Section Break field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Help" +msgstr "" + +#: templates/courses_created.html:15 +msgid "Help others learn something new by creating a course." +msgstr "" + +#: templates/reviews.html:101 +msgid "Help us improve our course material." +msgstr "" + +#: lms/web_template/courses_enrolled/courses_enrolled.html:18 +msgid "Here are a few courses we recommend for you to get started with {0}" +msgstr "" + +#: lms/notification/certificate_request_creation/certificate_request_creation.html:5 +msgid "Hey {0}" +msgstr "" + +#: templates/emails/job_report.html:3 +msgid "Hey," +msgstr "" + +#: templates/emails/lms_course_interest.html:3 +msgid "Hi {0}," +msgstr "" + +#: templates/emails/lms_invite_request_approved.html:3 +msgid "Hi," +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Hints" +msgstr "" + +#. Label of a Link field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Host" +msgstr "" + +#. Label of a Check field in DocType 'Work Experience' +#: lms/doctype/work_experience/work_experience.json +msgctxt "Work Experience" +msgid "I am currently working here" +msgstr "" + +#: templates/emails/certification.html:6 +msgid "I am delighted to inform you that you have successfully earned your certification for the {0} course. Congratulations!" +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "I am unavailable" +msgstr "" + +#: templates/signup-form.html:42 +msgid "I have read and agree to your {0}" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7369 +msgid "Icon" +msgstr "" + +#. Label of a Data field in DocType 'LMS Sidebar Item' +#: lms/doctype/lms_sidebar_item/lms_sidebar_item.json +msgctxt "LMS Sidebar Item" +msgid "Icon" +msgstr "" + +#: templates/emails/mentor_request_creation_email.html:5 +msgid "If you are not any more interested to mentor the course" +msgstr "" + +#: templates/emails/batch_confirmation.html:32 +msgid "If you have any questions or require assistance, feel free to contact us." +msgstr "" + +#: public/js/common_functions.js:400 +msgid "If you set an amount here, then the USD equivalent setting will not get applied." +msgstr "" + +#. Description of the 'Amount (USD)' (Currency) field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "If you set an amount here, then the USD equivalent setting will not get applied." +msgstr "" + +#. Description of the 'Amount (USD)' (Currency) field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "If you set an amount here, then the USD equivalent setting will not get applied." +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:32 +msgid "Image" +msgstr "" + +#. Option for the 'File Type' (Select) field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Image" +msgstr "" + +#. Label of a Code field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Image" +msgstr "" + +#. Label of a Code field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Image" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Image" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Image" +msgstr "" + +#. Label of a Attach Image field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Image" +msgstr "" + +#. Label of a Code field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Image" +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Image search powered by" +msgstr "" + +#: templates/emails/batch_confirmation.html:11 +msgid "Important Details:" +msgstr "" + +#. Option for the 'Stage' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "In Progress" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Certificate +#. Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "In Progress" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "In Progress" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Inactive" +msgstr "" + +#. Label of a Check field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Include In Preview" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Incomplete" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Incorrect" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Exercise Latest +#. Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Incorrect" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Incorrect" +msgstr "" + +#. Label of a Int field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Index" +msgstr "" + +#. Label of a Data field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Index Label" +msgstr "" + +#. Label of a Data field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Index Label" +msgstr "" + +#. Name of a DocType +#: lms/doctype/industry/industry.json +msgid "Industry" +msgstr "" + +#. Label of a Data field in DocType 'Industry' +#: lms/doctype/industry/industry.json +msgctxt "Industry" +msgid "Industry" +msgstr "" + +#. Label of a Link field in DocType 'Preferred Industry' +#: lms/doctype/preferred_industry/preferred_industry.json +msgctxt "Preferred Industry" +msgid "Industry" +msgstr "" + +#. Label of a Data field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Institution Name" +msgstr "" + +#. Label of a Link field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Instructor" +msgstr "" + +#. Label of a Link field in DocType 'Course Instructor' +#: lms/doctype/course_instructor/course_instructor.json +msgctxt "Course Instructor" +msgid "Instructor" +msgstr "" + +#. Label of a Text field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Instructor Content" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:2 +#: public/frontend/assets/Lesson-59XvRJIg.js:18 +msgid "Instructor Notes" +msgstr "" + +#. Label of a Markdown Editor field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Instructor Notes" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Instructors" +msgstr "" + +#. Label of a Table MultiSelect field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Instructors" +msgstr "" + +#. Label of a Table MultiSelect field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Instructors" +msgstr "" + +#: templates/assignment.html:17 +msgid "Instructors Comments" +msgstr "" + +#. Label of a Link in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Course Interest" +msgid "Interest" +msgstr "" + +#. Group in LMS Course's connections +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Interests" +msgstr "" + +#: lms/doctype/invite_request/invite_request.py:83 +msgid "Invalid Invite Code." +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.py:20 +msgid "Invalid Quiz ID" +msgstr "" + +#: lms/web_form/add_a_new_batch/add_a_new_batch.js:38 +msgid "Invalid Start or End Time." +msgstr "" + +#: lms/utils.py:985 +msgid "Invalid document provided." +msgstr "" + +#. Label of a Data field in DocType 'Cohort Subgroup' +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgctxt "Cohort Subgroup" +msgid "Invite Code" +msgstr "" + +#. Label of a Data field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Invite Code" +msgstr "" + +#. Label of a Data field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Invite Email" +msgstr "" + +#. Option for the 'Membership' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Invite Only" +msgstr "" + +#. Name of a DocType +#: lms/doctype/invite_request/invite_request.json +msgid "Invite Request" +msgstr "" + +#. Label of a Check field in DocType 'LMS Option' +#: lms/doctype/lms_option/lms_option.json +msgctxt "LMS Option" +msgid "Is Correct" +msgstr "" + +#. Label of a Check field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Is Correct" +msgstr "" + +#. Label of a Check field in DocType 'LMS Quiz Result' +#: lms/doctype/lms_quiz_result/lms_quiz_result.json +msgctxt "LMS Quiz Result" +msgid "Is Correct" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Is Onboarding Complete" +msgstr "" + +#. Label of a Date field in DocType 'Certification' +#: lms/doctype/certification/certification.json +msgctxt "Certification" +msgid "Issue Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Issue Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Badge Assignment' +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +msgctxt "LMS Badge Assignment" +msgid "Issued On" +msgstr "" + +#: public/frontend/assets/ProfileAbout-M7A4DT21.js:1 +#: templates/certificates_section.html:11 +msgid "Issued on" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Items in Sidebar" +msgstr "" + +#: templates/signup-form.html:5 +msgid "Jane Doe" +msgstr "" + +#. Label of a Link field in DocType 'LMS Job Application' +#: job/doctype/lms_job_application/lms_job_application.json +msgctxt "LMS Job Application" +msgid "Job" +msgstr "" + +#. Label of a Data field in DocType 'Job Settings' +#: job/doctype/job_settings/job_settings.json +msgctxt "Job Settings" +msgid "Job Board Subtitle" +msgstr "" + +#. Label of a Data field in DocType 'Job Settings' +#: job/doctype/job_settings/job_settings.json +msgctxt "Job Settings" +msgid "Job Board Title" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +msgid "Job Details" +msgstr "" + +#: www/lms.py:109 +msgid "Job Openings" +msgstr "" + +#. Name of a DocType +#: job/doctype/job_opportunity/job_opportunity.json +msgid "Job Opportunity" +msgstr "" + +#. Name of a DocType +#: job/doctype/job_settings/job_settings.json +msgid "Job Settings" +msgstr "" + +#. Label of a Data field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Job Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Job Application' +#: job/doctype/lms_job_application/lms_job_application.json +msgctxt "LMS Job Application" +msgid "Job Title" +msgstr "" + +#: public/frontend/assets/Jobs-CBReeD0M.js:1 +msgid "Jobs" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Jobs" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 templates/upcoming_evals.html:15 +msgid "Join" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Join URL" +msgstr "" + +#. Name of a Workspace +#: lms/workspace/lms/lms.json +msgid "LMS" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_assessment/lms_assessment.json +msgid "LMS Assessment" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_assignment/lms_assignment.json +msgid "LMS Assignment" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgid "LMS Assignment Submission" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_badge/lms_badge.json +msgid "LMS Badge" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +msgid "LMS Badge Assignment" +msgstr "" + +#. Linked DocType in LMS Badge's connections +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "LMS Badge Assignment" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_batch/lms_batch.json +msgid "LMS Batch" +msgstr "" + +#. Option for the 'Payment for Document Type' (Select) field in DocType 'LMS +#. Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "LMS Batch" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgid "LMS Batch Old" +msgstr "" + +#. Linked DocType in LMS Course's connections +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "LMS Batch Old" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgid "LMS Batch Timetable" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_category/lms_category.json +msgid "LMS Category" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_certificate/lms_certificate.json +msgid "LMS Certificate" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgid "LMS Certificate Evaluation" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgid "LMS Certificate Request" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_course/lms_course.json +msgid "LMS Course" +msgstr "" + +#. Option for the 'Payment for Document Type' (Select) field in DocType 'LMS +#. Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "LMS Course" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_course_interest/lms_course_interest.json +msgid "LMS Course Interest" +msgstr "" + +#. Linked DocType in LMS Course's connections +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "LMS Course Interest" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json +msgid "LMS Course Mentor Mapping" +msgstr "" + +#. Linked DocType in LMS Course's connections +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "LMS Course Mentor Mapping" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgid "LMS Course Progress" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_course_review/lms_course_review.json +msgid "LMS Course Review" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgid "LMS Enrollment" +msgstr "" + +#. Linked DocType in LMS Batch Old's connections +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "LMS Enrollment" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_exercise/lms_exercise.json +msgid "LMS Exercise" +msgstr "" + +#. Name of a DocType +#: job/doctype/lms_job_application/lms_job_application.json +msgid "LMS Job Application" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_live_class/lms_live_class.json +msgid "LMS Live Class" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgid "LMS Mentor Request" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_option/lms_option.json +msgid "LMS Option" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_payment/lms_payment.json +msgid "LMS Payment" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_question/lms_question.json +msgid "LMS Question" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_quiz/lms_quiz.json +msgid "LMS Quiz" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_quiz_question/lms_quiz_question.json +msgid "LMS Quiz Question" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_quiz_result/lms_quiz_result.json +msgid "LMS Quiz Result" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgid "LMS Quiz Submission" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_settings/lms_settings.json +msgid "LMS Settings" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_sidebar_item/lms_sidebar_item.json +msgid "LMS Sidebar Item" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_source/lms_source.json +msgid "LMS Source" +msgstr "" + +#. Name of a role +#: job/doctype/job_opportunity/job_opportunity.json +#: job/doctype/lms_job_application/lms_job_application.json +#: lms/doctype/cohort_join_request/cohort_join_request.json +#: lms/doctype/course_chapter/course_chapter.json +#: lms/doctype/course_lesson/course_lesson.json +#: lms/doctype/function/function.json lms/doctype/industry/industry.json +#: lms/doctype/lms_assignment/lms_assignment.json +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +#: lms/doctype/lms_certificate/lms_certificate.json +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +#: lms/doctype/lms_course_progress/lms_course_progress.json +#: lms/doctype/lms_course_review/lms_course_review.json +#: lms/doctype/lms_enrollment/lms_enrollment.json +#: lms/doctype/lms_live_class/lms_live_class.json +#: lms/doctype/lms_quiz/lms_quiz.json +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +#: lms/doctype/lms_source/lms_source.json +#: lms/doctype/user_skill/user_skill.json +msgid "LMS Student" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_timetable_legend/lms_timetable_legend.json +msgid "LMS Timetable Legend" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lms_timetable_template/lms_timetable_template.json +msgid "LMS Timetable Template" +msgstr "" + +#. Label of a Data field in DocType 'LMS Timetable Legend' +#: lms/doctype/lms_timetable_legend/lms_timetable_legend.json +msgctxt "LMS Timetable Legend" +msgid "Label" +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Last Name" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Latest Submission" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "Learn More" +msgstr "" + +#. Label of a Link in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "Course Lesson" +msgid "Lesson" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Lesson" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Lesson" +msgstr "" + +#. Label of a Link field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Lesson" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Lesson" +msgstr "" + +#. Label of a Link field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Lesson" +msgstr "" + +#. Label of a Link field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Lesson" +msgstr "" + +#. Label of a Link field in DocType 'Lesson Reference' +#: lms/doctype/lesson_reference/lesson_reference.json +msgctxt "Lesson Reference" +msgid "Lesson" +msgstr "" + +#. Label of a Link field in DocType 'Scheduled Flow' +#: lms/doctype/scheduled_flow/scheduled_flow.json +msgctxt "Scheduled Flow" +msgid "Lesson" +msgstr "" + +#. Name of a DocType +#: lms/doctype/lesson_reference/lesson_reference.json +msgid "Lesson Reference" +msgstr "" + +#. Label of a Data field in DocType 'Scheduled Flow' +#: lms/doctype/scheduled_flow/scheduled_flow.json +msgctxt "Scheduled Flow" +msgid "Lesson Title" +msgstr "" + +#: public/frontend/assets/CourseCard-BK77fFq6.js:1 +msgid "Lessons" +msgstr "" + +#. Label of a Table field in DocType 'Course Chapter' +#. Group in Course Chapter's connections +#: lms/doctype/course_chapter/course_chapter.json +msgctxt "Course Chapter" +msgid "Lessons" +msgstr "" + +#: lms/web_template/lms_statistics/lms_statistics.html:14 +#: templates/statistics.html:36 +msgid "Lessons Completed" +msgstr "" + +#: templates/onboarding_header.html:11 +msgid "Lets start setting up your content on the LMS so that you can reclaim time and focus on growth." +msgstr "" + +#. Option for the 'Grade Type' (Select) field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Letter Grade (e.g. A, B-)" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Limit Questions To" +msgstr "" + +#: lms/doctype/lms_quiz/lms_quiz.py:35 +msgid "Limit cannot be greater than or equal to the number of questions in the quiz." +msgstr "" + +#: public/frontend/assets/ProfileAbout-M7A4DT21.js:1 +msgid "LinkedIn" +msgstr "" + +#. Group in Cohort's connections +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Links" +msgstr "" + +#. Group in Cohort Subgroup's connections +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgctxt "Cohort Subgroup" +msgid "Links" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Live" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Live Class" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Live Class" +msgstr "" + +#. Label of a Data field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "LiveCode URL" +msgstr "" + +#. Option for the 'Auto Recording' (Select) field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Local" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +msgid "Location" +msgstr "" + +#. Label of a Data field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Location" +msgstr "" + +#. Label of a Data field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Location" +msgstr "" + +#. Label of a Data field in DocType 'Work Experience' +#: lms/doctype/work_experience/work_experience.json +msgctxt "Work Experience" +msgid "Location" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/Lesson-59XvRJIg.js:18 +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Login" +msgstr "" + +#. Label of a Table MultiSelect field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Maintain Original Currency" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Make LMS the default home" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Make an Announcement" +msgstr "" + +#. Option for the 'Role' (Select) field in DocType 'Cohort Staff' +#: lms/doctype/cohort_staff/cohort_staff.json +msgctxt "Cohort Staff" +msgid "Manager" +msgstr "" + +#: templates/signup-form.html:23 +msgid "Manager (Sales/Marketing/Customer)" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Mark" +msgstr "" + +#: public/frontend/assets/Notifications-YFJ-Ay-J.js:1 +msgid "Mark all as read" +msgstr "" + +#: public/frontend/assets/Notifications-YFJ-Ay-J.js:1 +msgid "Mark as read" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:59 +msgid "Marks" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz Question' +#: lms/doctype/lms_quiz_question/lms_quiz_question.json +msgctxt "LMS Quiz Question" +msgid "Marks" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz Result' +#: lms/doctype/lms_quiz_result/lms_quiz_result.json +msgctxt "LMS Quiz Result" +msgid "Marks" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Max Attempts" +msgstr "" + +#. Label of a Int field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Max Attempts for Evaluations" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:309 +msgid "Medium" +msgstr "" + +#. Label of a Select field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Medium" +msgstr "" + +#: templates/emails/batch_confirmation.html:20 +msgid "Medium:" +msgstr "" + +#: lms/report/course_progress_summary/course_progress_summary.py:64 +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Badge Assignment' +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +msgctxt "LMS Badge Assignment" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Enrollment' +#. Option for the 'Role' (Select) field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Member" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Member Cohort" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Member Email" +msgstr "" + +#: lms/report/course_progress_summary/course_progress_summary.py:71 +msgid "Member Name" +msgstr "" + +#. Label of a Data field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Member Name" +msgstr "" + +#. Label of a Data field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Member Name" +msgstr "" + +#. Label of a Data field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Member Name" +msgstr "" + +#. Label of a Data field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Member Name" +msgstr "" + +#. Label of a Data field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Member Name" +msgstr "" + +#. Label of a Data field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Member Name" +msgstr "" + +#. Label of a Data field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Member Name" +msgstr "" + +#. Label of a Data field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Member Name" +msgstr "" + +#. Label of a Link field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Member Subgroup" +msgstr "" + +#. Label of a Select field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Member Type" +msgstr "" + +#. Group in LMS Batch Old's connections +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Members" +msgstr "" + +#. Label of a Select field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Membership" +msgstr "" + +#. Label of a Data field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Memeber Username" +msgstr "" + +#. Option for the 'Required Role' (Select) field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Mentor" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Mentor Mapping' +#: lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json +msgctxt "LMS Course Mentor Mapping" +msgid "Mentor" +msgstr "" + +#. Option for the 'Member Type' (Select) field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Mentor" +msgstr "" + +#. Label of a Data field in DocType 'LMS Course Mentor Mapping' +#: lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json +msgctxt "LMS Course Mentor Mapping" +msgid "Mentor Name" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Settings' +#. Label of a Tab Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Mentor Request" +msgstr "" + +#: patches/create_mentor_request_email_templates.py:11 +#: patches/create_mentor_request_email_templates.py:18 +#: patches/create_mentor_request_email_templates.py:28 +msgid "Mentor Request Creation Template" +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Mentor Request Creation Template" +msgstr "" + +#: patches/create_mentor_request_email_templates.py:31 +#: patches/create_mentor_request_email_templates.py:38 +#: patches/create_mentor_request_email_templates.py:48 +msgid "Mentor Request Status Update Template" +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Mentor Request Status Update Template" +msgstr "" + +#. Group in LMS Course's connections +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Mentors" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:362 +msgid "Meta Image" +msgstr "" + +#. Label of a Attach Image field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Meta Image" +msgstr "" + +#. Label of a Check field in DocType 'LMS Batch Timetable' +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgctxt "LMS Batch Timetable" +msgid "Milestone" +msgstr "" + +#: public/frontend/assets/Statistics-Df9qvpz5.js:18 +msgid "Milestones" +msgstr "" + +#. Name of a role +#: lms/doctype/course_evaluator/course_evaluator.json +#: lms/doctype/lms_assignment/lms_assignment.json +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +#: lms/doctype/lms_batch/lms_batch.json +#: lms/doctype/lms_category/lms_category.json +#: lms/doctype/lms_certificate/lms_certificate.json +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +#: lms/doctype/lms_enrollment/lms_enrollment.json +#: lms/doctype/lms_live_class/lms_live_class.json +#: lms/doctype/lms_question/lms_question.json +#: lms/doctype/lms_quiz/lms_quiz.json lms/doctype/lms_source/lms_source.json +#: lms/doctype/lms_timetable_template/lms_timetable_template.json +#: public/frontend/assets/ProfileRoles-CVq7nQGs.js:1 +msgid "Moderator" +msgstr "" + +#: lms/doctype/lms_badge/lms_badge.js:40 +msgid "Modified By" +msgstr "" + +#: lms/api.py:188 +msgid "Module Name is incorrect or does not exist." +msgstr "" + +#: lms/api.py:184 +msgid "Module is incorrect." +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Monday" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Monday" +msgstr "" + +#. Label of a Check field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Multiple Correct Answers" +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "My availability" +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "My calendar" +msgstr "" + +#. Option for the 'Event' (Select) field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "New" +msgstr "" + +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.py:41 +msgid "New Assignment Submission" +msgstr "" + +#: public/js/common_functions.js:255 www/lms.py:87 +msgid "New Batch" +msgstr "" + +#: www/lms.py:38 +msgid "New Course" +msgstr "" + +#: public/frontend/assets/Jobs-CBReeD0M.js:1 +msgid "New Job" +msgstr "" + +#: job/doctype/lms_job_application/lms_job_application.py:27 +msgid "New Job Applicant" +msgstr "" + +#: www/new-sign-up.html:3 +msgid "New Sign Up" +msgstr "" + +#: lms/utils.py:666 +msgid "New comment in batch {0}" +msgstr "" + +#: lms/utils.py:659 +msgid "New reply on the topic {0} in course {1}" +msgstr "" + +#: public/frontend/assets/Discussions-BUeR4n3G.js:1 +msgid "New {0}" +msgstr "" + +#: public/frontend/assets/Lesson-59XvRJIg.js:18 +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Next" +msgstr "" + +#: templates/quiz/quiz.html:125 +msgid "Next Question" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 templates/assessments.html:58 +msgid "No Assessments" +msgstr "" + +#: templates/notifications.html:26 +msgid "No Notifications" +msgstr "" + +#. Option for the 'Auto Recording' (Select) field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "No Recording" +msgstr "" + +#: templates/upcoming_evals.html:43 +msgid "No Upcoming Evaluations" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "No announcements" +msgstr "" + +#: templates/certificates_section.html:23 +msgid "No certificates" +msgstr "" + +#: templates/courses_created.html:14 +msgid "No courses created" +msgstr "" + +#: templates/courses_under_review.html:14 +msgid "No courses under review" +msgstr "" + +#: public/frontend/assets/ProfileAbout-M7A4DT21.js:1 +msgid "No introduction" +msgstr "" + +#: public/frontend/assets/Jobs-CBReeD0M.js:1 +msgid "No jobs posted" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "No live classes scheduled" +msgstr "" + +#: templates/search_course/search_course.html:61 +#: templates/search_course/search_course.js:47 +msgid "No result found" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "No slots available for this date." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "No upcoming evaluations." +msgstr "" + +#: templates/course_list.html:13 +msgid "No {0}" +msgstr "" + +#: templates/quiz/quiz.html:147 +msgid "No." +msgstr "" + +#: overrides/user.py:190 +msgid "Not Allowed" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Assignment +#. Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Not Applicable" +msgstr "" + +#: templates/assessments.html:48 +msgid "Not Attempted" +msgstr "" + +#: lms/widgets/NoPreviewModal.html:6 +msgid "Not Available for Preview" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Assignment +#. Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Not Graded" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Not Permitted" +msgstr "" + +#: public/frontend/assets/Notifications-YFJ-Ay-J.js:1 +msgid "Nothing to see here." +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Notifications" +msgstr "" + +#: lms/widgets/NoPreviewModal.html:30 +msgid "Notify me when available" +msgstr "" + +#. Label of a Section Break field in DocType 'Zoom Settings' +#: lms/doctype/zoom_settings/zoom_settings.json +msgctxt "Zoom Settings" +msgid "OAuth Client ID" +msgstr "" + +#. Option for the 'Medium' (Select) field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Offline" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:21 +msgid "On clicking it, it provides an iframe. Copy the source (src) of the iframe and paste it here." +msgstr "" + +#: templates/emails/certification.html:16 +msgid "Once again, congratulations on this significant accomplishment." +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "Once the moderator grades your submission, you'll find the details here." +msgstr "" + +#. Option for the 'Medium' (Select) field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Online" +msgstr "" + +#: templates/assignment.html:6 +msgid "Only files of type {0} will be accepted." +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Open" +msgstr "" + +#. Option for the 'Membership' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Open" +msgstr "" + +#: templates/emails/assignment_submission.html:8 +msgid "Open Assignment" +msgstr "" + +#: templates/emails/lms_message.html:13 +msgid "Open Course" +msgstr "" + +#: lms/widgets/MemberCard.html:16 +msgid "Open Network" +msgstr "" + +#. Label of a Data field in DocType 'LMS Option' +#: lms/doctype/lms_option/lms_option.json +msgctxt "LMS Option" +msgid "Option" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Option 1" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Option 2" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Option 3" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Option 4" +msgstr "" + +#. Label of a Data field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Order ID" +msgstr "" + +#. Label of a Data field in DocType 'Certification' +#: lms/doctype/certification/certification.json +msgctxt "Certification" +msgid "Organization" +msgstr "" + +#: templates/signup-form.html:27 +msgid "Others" +msgstr "" + +#: lms/doctype/lms_badge/lms_badge.js:39 +msgid "Owner" +msgstr "" + +#. Label of a Data field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "PAN" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:32 +msgid "PDF" +msgstr "" + +#. Option for the 'File Type' (Select) field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "PDF" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "PDF" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "PDF" +msgstr "" + +#. Label of a Table field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Pages" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:373 +msgid "Paid Batch" +msgstr "" + +#. Label of a Check field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Paid Batch" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Paid Course" +msgstr "" + +#. Label of a Check field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Paid Course" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Part Time" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Partially Complete" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Assignment +#. Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Pass" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Certificate +#. Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Pass" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Passing Percentage" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Passing Percentage" +msgstr "" + +#. Label of a Password field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Password" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +msgid "Payment" +msgstr "" + +#. Label of a Link field in DocType 'Batch Student' +#: lms/doctype/batch_student/batch_student.json +msgctxt "Batch Student" +msgid "Payment" +msgstr "" + +#. Label of a Link field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Payment" +msgstr "" + +#. Name of a DocType +#: lms/doctype/payment_country/payment_country.json +msgid "Payment Country" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Payment Details" +msgstr "" + +#. Label of a Data field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Payment ID" +msgstr "" + +#. Label of a Check field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Payment Received" +msgstr "" + +#. Label of a Tab Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Payment Settings" +msgstr "" + +#. Label of a Dynamic Link field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Payment for Document" +msgstr "" + +#. Label of a Select field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Payment for Document Type" +msgstr "" + +#: lms/utils.py:1002 +msgid "Payment for {0} course" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Cohort Join Request' +#: lms/doctype/cohort_join_request/cohort_join_request.json +msgctxt "Cohort Join Request" +msgid "Pending" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Pending" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Certificate +#. Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Pending" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Pending" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Percentage" +msgstr "" + +#. Option for the 'Grade Type' (Select) field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Percentage (e.g. 70%)" +msgstr "" + +#: lms/doctype/lms_settings/lms_settings.py:33 +msgid "Please add {1} for {3} to send calendar invites for evaluations." +msgstr "" + +#: overrides/user.py:236 +msgid "Please ask your administrator to verify your sign-up" +msgstr "" + +#: overrides/user.py:234 +msgid "Please check your email for verification" +msgstr "" + +#: templates/emails/community_course_membership.html:7 +msgid "Please click on the following button to set your new password" +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:232 +msgid "Please enable Zoom Settings to use this feature." +msgstr "" + +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.py:38 +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.py:98 +msgid "Please enter a valid URL." +msgstr "" + +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.py:92 +msgid "Please enter the URL for assignment submission." +msgstr "" + +#: templates/quiz/quiz.js:176 +msgid "Please enter your answer" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Please login to access the quiz." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Please login to access this page." +msgstr "" + +#: lms/api.py:180 +msgid "Please login to continue with payment." +msgstr "" + +#: lms/notification/certificate_request_creation/certificate_request_creation.html:7 +#: lms/notification/certificate_request_reminder/certificate_request_reminder.html:7 +msgid "Please prepare well and be on time for the evaluations." +msgstr "" + +#: templates/emails/job_report.html:6 +msgid "Please take appropriate action at {0}" +msgstr "" + +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.py:95 +msgid "Please upload the assignment file." +msgstr "" + +#. Option for the 'Grade Type' (Select) field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Point of Score (e.g. 70)" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Possible Answer 1" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Possible Answer 2" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Possible Answer 3" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Possible Answer 4" +msgstr "" + +#: public/frontend/assets/Discussions-BUeR4n3G.js:1 +msgid "Post" +msgstr "" + +#. Name of a DocType +#: lms/doctype/preferred_function/preferred_function.json +msgid "Preferred Function" +msgstr "" + +#. Name of a DocType +#: lms/doctype/preferred_industry/preferred_industry.json +msgid "Preferred Industry" +msgstr "" + +#. Label of a Attach Image field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Preview Image" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Preview Video" +msgstr "" + +#: public/frontend/assets/Lesson-59XvRJIg.js:18 +msgid "Previous" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +#: public/js/common_functions.js:368 +msgid "Pricing" +msgstr "" + +#. Label of a Tab Break field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Pricing" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Pricing" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Mentor' +#: lms/doctype/cohort_mentor/cohort_mentor.json +msgctxt "Cohort Mentor" +msgid "Primary Subgroup" +msgstr "" + +#: lms/utils.py:421 +msgid "Privacy Policy" +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Privacy Policy Page" +msgstr "" + +#. Option for the 'Visibility' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Private" +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Profile Image" +msgstr "" + +#. Label of a Float field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Progress" +msgstr "" + +#: lms/report/course_progress_summary/course_progress_summary.py:77 +msgid "Progress (%)" +msgstr "" + +#. Option for the 'Required Role' (Select) field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Public" +msgstr "" + +#. Option for the 'Visibility' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Public" +msgstr "" + +#. Label of a Check field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Publish on Participant Page" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +#: public/js/common_functions.js:266 +msgid "Published" +msgstr "" + +#. Label of a Check field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Published" +msgstr "" + +#. Label of a Check field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Published" +msgstr "" + +#: lms/web_template/lms_statistics/lms_statistics.html:14 +#: templates/statistics.html:4 +msgid "Published Courses" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Published On" +msgstr "" + +#. Label of a Date field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Published On" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +#: templates/quiz/quiz.html:104 +msgid "Question" +msgstr "" + +#. Label of a Small Text field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Question" +msgstr "" + +#. Label of a Text Editor field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Question" +msgstr "" + +#. Label of a Text Editor field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Question" +msgstr "" + +#. Label of a Text Editor field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Question" +msgstr "" + +#. Label of a Link field in DocType 'LMS Quiz Question' +#: lms/doctype/lms_quiz_question/lms_quiz_question.json +msgctxt "LMS Quiz Question" +msgid "Question" +msgstr "" + +#. Label of a Text field in DocType 'LMS Quiz Result' +#: lms/doctype/lms_quiz_result/lms_quiz_result.json +msgctxt "LMS Quiz Result" +msgid "Question" +msgstr "" + +#: templates/quiz/quiz.html:62 +msgid "Question " +msgstr "" + +#. Label of a Link field in DocType 'LMS Quiz Result' +#: lms/doctype/lms_quiz_result/lms_quiz_result.json +msgctxt "LMS Quiz Result" +msgid "Question Name" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Question {0}" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Question {0} of {1}" +msgstr "" + +#. Label of a Table field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Questions" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:23 +msgid "Quiz" +msgstr "" + +#. Label of a Link in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Quiz" +msgid "Quiz" +msgstr "" + +#. Label of a Link field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Quiz" +msgstr "" + +#. Label of a Data field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Quiz ID" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:9 +msgid "Quiz List" +msgstr "" + +#. Label of a Link in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Quiz Submission" +msgid "Quiz Submission" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "Quiz Summary" +msgstr "" + +#: plugins.py:96 +msgid "Quiz is not available to Guest users. Please login to continue." +msgstr "" + +#. Description of the 'Quiz ID' (Data) field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Quiz will appear at the bottom of the lesson." +msgstr "" + +#: templates/reviews.html:125 +msgid "Rating" +msgstr "" + +#. Label of a Rating field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Rating" +msgstr "" + +#. Label of a Rating field in DocType 'LMS Course Review' +#: lms/doctype/lms_course_review/lms_course_review.json +msgctxt "LMS Course Review" +msgid "Rating" +msgstr "" + +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.py:17 +msgid "Rating cannot be 0" +msgstr "" + +#. Label of a Data field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Razorpay Key" +msgstr "" + +#. Label of a Password field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Razorpay Secret" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "Read the question carefully before attempting the assignment." +msgstr "" + +#. Option for the 'Stage' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Ready" +msgstr "" + +#. Label of a Dynamic Link field in DocType 'LMS Batch Timetable' +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgctxt "LMS Batch Timetable" +msgid "Reference DocName" +msgstr "" + +#. Label of a Link field in DocType 'LMS Batch Timetable' +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgctxt "LMS Batch Timetable" +msgid "Reference DocType" +msgstr "" + +#. Label of a Link field in DocType 'LMS Timetable Legend' +#: lms/doctype/lms_timetable_legend/lms_timetable_legend.json +msgctxt "LMS Timetable Legend" +msgid "Reference DocType" +msgstr "" + +#. Label of a Link field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Reference Document Type" +msgstr "" + +#: templates/emails/community_course_membership.html:17 +msgid "Regards" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Registered" +msgstr "" + +#: overrides/user.py:197 +msgid "Registered but disabled" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Cohort Join Request' +#: lms/doctype/cohort_join_request/cohort_join_request.json +msgctxt "Cohort Join Request" +msgid "Rejected" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Rejected" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Rejected" +msgstr "" + +#. Name of a DocType +#: lms/doctype/related_courses/related_courses.json +msgid "Related Courses" +msgstr "" + +#. Label of a Table field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Related Courses" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Reply To" +msgstr "" + +#: lms/widgets/RequestInvite.html:7 +msgid "Request Invite" +msgstr "" + +#: patches/create_mentor_request_email_templates.py:20 +msgid "Request for Mentorship" +msgstr "" + +#. Label of a Select field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Required Role" +msgstr "" + +#. Option for the 'Membership' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Restricted" +msgstr "" + +#. Label of a Table field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Result" +msgstr "" + +#. Label of a Attach field in DocType 'LMS Job Application' +#: job/doctype/lms_job_application/lms_job_application.json +msgctxt "LMS Job Application" +msgid "Resume" +msgstr "" + +#: templates/reviews.html:143 +msgid "Review" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Course Review' +#. Label of a Link in the LMS Workspace +#: lms/doctype/lms_course_review/lms_course_review.json +#: lms/workspace/lms/lms.json +msgctxt "LMS Course Review" +msgid "Review" +msgstr "" + +#: templates/reviews.html:100 +msgid "Review the course" +msgstr "" + +#. Label of a Link field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Reviewed By" +msgstr "" + +#: templates/reviews.html:4 +msgid "Reviews" +msgstr "" + +#. Label of a Select field in DocType 'Cohort Staff' +#: lms/doctype/cohort_staff/cohort_staff.json +msgctxt "Cohort Staff" +msgid "Role" +msgstr "" + +#. Label of a Select field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Role" +msgstr "" + +#. Label of a Data field in DocType 'LMS Sidebar Item' +#: lms/doctype/lms_sidebar_item/lms_sidebar_item.json +msgctxt "LMS Sidebar Item" +msgid "Route" +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:161 +msgid "Row #{0} Date cannot be outside the batch duration." +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:156 +msgid "Row #{0} End time cannot be outside the batch duration." +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:138 +msgid "Row #{0} Start time cannot be greater than or equal to end time." +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:147 +msgid "Row #{0} Start time cannot be outside the batch duration." +msgstr "" + +#: lms/doctype/lms_quiz/lms_quiz.py:29 +msgid "Rows {0} have the duplicate questions." +msgstr "" + +#: templates/livecode/extension_footer.html:21 +msgid "Run" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Saturday" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Saturday" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:2 +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +#: public/js/common_functions.js:405 +msgid "Save" +msgstr "" + +#. Label of a Table field in DocType 'Course Evaluator' +#: lms/doctype/course_evaluator/course_evaluator.json +msgctxt "Course Evaluator" +msgid "Schedule" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Schedule Evaluation" +msgstr "" + +#. Name of a DocType +#: lms/doctype/scheduled_flow/scheduled_flow.json +msgid "Scheduled Flow" +msgstr "" + +#. Label of a Select field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Scope" +msgstr "" + +#: templates/quiz/quiz.html:148 +msgid "Score" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Score" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz Submission' +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +msgctxt "LMS Quiz Submission" +msgid "Score Out Of" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7369 +msgid "Search for an icon" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:327 +msgid "Seat Count" +msgstr "" + +#. Label of a Int field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Seat Count" +msgstr "" + +#: public/frontend/assets/BatchDetail-DSYJhLlb.js:1 +#: public/frontend/assets/Batches-8-67VJiw.js:1 +msgid "Seat Left" +msgstr "" + +#: public/frontend/assets/BatchDetail-DSYJhLlb.js:1 +#: public/frontend/assets/Batches-8-67VJiw.js:1 +msgid "Seats Left" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "Select a Quiz" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Select a slot" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "Select an Editor" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Send calendar invite for evaluations" +msgstr "" + +#. Label of a Data field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Sessions On Days" +msgstr "" + +#: templates/emails/community_course_membership.html:1 +msgid "Set your Password" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +#: public/frontend/assets/ProfileRoles-CVq7nQGs.js:1 +msgid "Settings" +msgstr "" + +#. Label of a Section Break field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Settings" +msgstr "" + +#: public/frontend/assets/ProfileAbout-M7A4DT21.js:1 +msgid "Share on" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Short Introduction" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Short Introduction" +msgstr "" + +#. Label of a Check field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Show Answer" +msgstr "" + +#. Label of a Check field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Show Answers" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Show Cookie Policy on Signup" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Show Privacy Policy on Signup" +msgstr "" + +#. Label of a Check field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Show Submission History" +msgstr "" + +#. Label of a Column Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Show Tab in Batch" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Show Terms of Use on Signup" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Show USD Equivalent" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Show day view in timetable" +msgstr "" + +#. Label of a Check field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Show live class" +msgstr "" + +#. Label of a Check field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Shuffle Questions" +msgstr "" + +#. Label of a Tab Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Sidebar" +msgstr "" + +#. Label of a Table field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Sidebar Items" +msgstr "" + +#: overrides/user.py:190 +msgid "Sign Up is disabled" +msgstr "" + +#: templates/signup-form.html:50 +msgid "Sign up" +msgstr "" + +#. Label of a Data field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Signup Email" +msgstr "" + +#. Label of a Tab Break field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Signup Settings" +msgstr "" + +#. Label of a chart in the LMS Workspace +#: lms/workspace/lms/lms.json public/frontend/assets/Statistics-Df9qvpz5.js:18 +msgid "Signups" +msgstr "" + +#. Label of a Data field in DocType 'User Skill' +#: lms/doctype/user_skill/user_skill.json +msgctxt "User Skill" +msgid "Skill" +msgstr "" + +#. Label of a Link field in DocType 'Skills' +#: lms/doctype/skills/skills.json +msgctxt "Skills" +msgid "Skill Name" +msgstr "" + +#. Name of a DocType +#: lms/doctype/skills/skills.json +msgid "Skills" +msgstr "" + +#: overrides/user.py:38 +msgid "Skills must be unique" +msgstr "" + +#: templates/onboarding_header.html:6 +msgid "Skip" +msgstr "" + +#: lms/doctype/course_evaluator/course_evaluator.py:57 +msgid "Slot Times are overlapping for some schedules." +msgstr "" + +#. Label of a Data field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Slug" +msgstr "" + +#. Label of a Data field in DocType 'Cohort Subgroup' +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgctxt "Cohort Subgroup" +msgid "Slug" +msgstr "" + +#. Label of a Data field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Slug" +msgstr "" + +#. Label of a Code field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Solution" +msgstr "" + +#. Label of a Code field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Solution" +msgstr "" + +#. Label of a Link field in DocType 'Batch Student' +#: lms/doctype/batch_student/batch_student.json +msgctxt "Batch Student" +msgid "Source" +msgstr "" + +#. Label of a Link field in DocType 'LMS Payment' +#: lms/doctype/lms_payment/lms_payment.json +msgctxt "LMS Payment" +msgid "Source" +msgstr "" + +#. Label of a Data field in DocType 'LMS Source' +#: lms/doctype/lms_source/lms_source.json +msgctxt "LMS Source" +msgid "Source" +msgstr "" + +#. Option for the 'Role' (Select) field in DocType 'Cohort Staff' +#: lms/doctype/cohort_staff/cohort_staff.json +msgctxt "Cohort Staff" +msgid "Staff" +msgstr "" + +#. Option for the 'Member Type' (Select) field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Staff" +msgstr "" + +#. Label of a Select field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Stage" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:39 +msgid "Start" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/js/common_functions.js:275 +msgid "Start Date" +msgstr "" + +#. Label of a Date field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "Start Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Start Date" +msgstr "" + +#. Label of a Date field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Start Date" +msgstr "" + +#: public/frontend/assets/Lesson-59XvRJIg.js:18 +#: templates/emails/lms_course_interest.html:9 +msgid "Start Learning" +msgstr "" + +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +#: public/js/common_functions.js:292 +msgid "Start Time" +msgstr "" + +#. Label of a Time field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Start Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Start Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Start Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Batch Timetable' +#: lms/doctype/lms_batch_timetable/lms_batch_timetable.json +msgctxt "LMS Batch Timetable" +msgid "Start Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Start Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Start Time" +msgstr "" + +#. Label of a Time field in DocType 'Scheduled Flow' +#: lms/doctype/scheduled_flow/scheduled_flow.json +msgctxt "Scheduled Flow" +msgid "Start Time" +msgstr "" + +#: lms/doctype/course_evaluator/course_evaluator.py:28 +msgid "Start Time cannot be greater than End Time" +msgstr "" + +#: lms/web_form/add_a_new_batch/add_a_new_batch.js:43 +msgid "Start Time should be less than End Time." +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Start URL" +msgstr "" + +#: lms/web_form/add_a_new_batch/add_a_new_batch.js:30 +msgid "Start date cannot be a past date." +msgstr "" + +#: www/lms.py:134 +msgid "Statistics" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Statistics" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'Cohort Join Request' +#: lms/doctype/cohort_join_request/cohort_join_request.json +msgctxt "Cohort Join Request" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'LMS Course Progress' +#: lms/doctype/lms_course_progress/lms_course_progress.json +msgctxt "LMS Course Progress" +msgid "Status" +msgstr "" + +#. Label of a Select field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Status" +msgstr "" + +#: templates/assessments.html:17 +msgid "Status/Score" +msgstr "" + +#: public/frontend/assets/ProfileRoles-CVq7nQGs.js:1 +#: templates/signup-form.html:25 +msgid "Student" +msgstr "" + +#. Label of a Link field in DocType 'Batch Student' +#: lms/doctype/batch_student/batch_student.json +msgctxt "Batch Student" +msgid "Student" +msgstr "" + +#. Option for the 'Required Role' (Select) field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Student" +msgstr "" + +#. Option for the 'Member Type' (Select) field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Student" +msgstr "" + +#. Label of a Section Break field in DocType 'Batch Student' +#: lms/doctype/batch_student/batch_student.json +msgctxt "Batch Student" +msgid "Student Details" +msgstr "" + +#. Label of a Data field in DocType 'Batch Student' +#: lms/doctype/batch_student/batch_student.json +msgctxt "Batch Student" +msgid "Student Name" +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:44 +msgid "Student {0} has already been added to this batch." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Students" +msgstr "" + +#. Label of a Table field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Students" +msgstr "" + +#. Label of a Check field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Students" +msgstr "" + +#. Description of the 'Paid Batch' (Check) field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Students will be enrolled in a paid batch once they complete the payment" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Join Request' +#: lms/doctype/cohort_join_request/cohort_join_request.json +msgctxt "Cohort Join Request" +msgid "Subgroup" +msgstr "" + +#. Option for the 'Scope' (Select) field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Subgroup" +msgstr "" + +#. Label of a Link field in DocType 'LMS Enrollment' +#: lms/doctype/lms_enrollment/lms_enrollment.json +msgctxt "LMS Enrollment" +msgid "Subgroup" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Subject" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "Submission" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/assignment.html:9 +#: templates/livecode/extension_footer.html:25 templates/quiz/quiz.html:128 +#: templates/reviews.html:163 www/new-sign-up.html:32 +msgid "Submit" +msgstr "" + +#: public/frontend/assets/JobDetail-CBHvk1ll.js:1 +msgid "Submit your resume to proceed with your application for this position. Upon submission, it will be shared with the job poster." +msgstr "" + +#: templates/livecode/extension_footer.html:85 +#: templates/livecode/extension_footer.html:115 +msgid "Submitted {0}" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Certificate Evaluation' +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +msgctxt "LMS Certificate Evaluation" +msgid "Summary" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Sunday" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Sunday" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:32 +msgid "Supported File Types for Assignment" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:17 +#: lms/doctype/course_lesson/course_lesson.js:32 +msgid "Syntax" +msgstr "" + +#. Name of a role +#: job/doctype/job_opportunity/job_opportunity.json +#: job/doctype/job_settings/job_settings.json +#: job/doctype/lms_job_application/lms_job_application.json +#: lms/doctype/cohort/cohort.json +#: lms/doctype/cohort_join_request/cohort_join_request.json +#: lms/doctype/cohort_mentor/cohort_mentor.json +#: lms/doctype/cohort_staff/cohort_staff.json +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +#: lms/doctype/course_chapter/course_chapter.json +#: lms/doctype/course_evaluator/course_evaluator.json +#: lms/doctype/course_lesson/course_lesson.json +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +#: lms/doctype/exercise_submission/exercise_submission.json +#: lms/doctype/function/function.json lms/doctype/industry/industry.json +#: lms/doctype/invite_request/invite_request.json +#: lms/doctype/lms_assignment/lms_assignment.json +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +#: lms/doctype/lms_badge/lms_badge.json +#: lms/doctype/lms_badge_assignment/lms_badge_assignment.json +#: lms/doctype/lms_batch/lms_batch.json +#: lms/doctype/lms_batch_old/lms_batch_old.json +#: lms/doctype/lms_category/lms_category.json +#: lms/doctype/lms_certificate/lms_certificate.json +#: lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +#: lms/doctype/lms_course/lms_course.json +#: lms/doctype/lms_course_interest/lms_course_interest.json +#: lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json +#: lms/doctype/lms_course_progress/lms_course_progress.json +#: lms/doctype/lms_course_review/lms_course_review.json +#: lms/doctype/lms_enrollment/lms_enrollment.json +#: lms/doctype/lms_exercise/lms_exercise.json +#: lms/doctype/lms_live_class/lms_live_class.json +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +#: lms/doctype/lms_payment/lms_payment.json +#: lms/doctype/lms_question/lms_question.json +#: lms/doctype/lms_quiz/lms_quiz.json +#: lms/doctype/lms_quiz_submission/lms_quiz_submission.json +#: lms/doctype/lms_settings/lms_settings.json +#: lms/doctype/lms_source/lms_source.json +#: lms/doctype/lms_timetable_template/lms_timetable_template.json +#: lms/doctype/user_skill/user_skill.json +#: lms/doctype/zoom_settings/zoom_settings.json +msgid "System Manager" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Tags" +msgstr "" + +#. Label of a Data field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Tags" +msgstr "" + +#: templates/emails/community_course_membership.html:18 +#: templates/emails/mentor_request_creation_email.html:8 +#: templates/emails/mentor_request_status_update_email.html:7 +msgid "Team School" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Template" +msgstr "" + +#. Label of a Link field in DocType 'LMS Certificate' +#: lms/doctype/lms_certificate/lms_certificate.json +msgctxt "LMS Certificate" +msgid "Template" +msgstr "" + +#: overrides/user.py:201 +msgid "Temporarily Disabled" +msgstr "" + +#: lms/utils.py:420 +msgid "Terms of Use" +msgstr "" + +#. Label of a Link field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Terms of Use Page" +msgstr "" + +#. Label of a Small Text field in DocType 'Exercise Latest Submission' +#: lms/doctype/exercise_latest_submission/exercise_latest_submission.json +msgctxt "Exercise Latest Submission" +msgid "Test Results" +msgstr "" + +#. Label of a Small Text field in DocType 'Exercise Submission' +#: lms/doctype/exercise_submission/exercise_submission.json +msgctxt "Exercise Submission" +msgid "Test Results" +msgstr "" + +#. Label of a Code field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Tests" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Text" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Text" +msgstr "" + +#: templates/emails/lms_course_interest.html:17 +#: templates/emails/lms_invite_request_approved.html:15 +#: templates/emails/mentor_request_creation_email.html:7 +#: templates/emails/mentor_request_status_update_email.html:6 +msgid "Thanks and Regards" +msgstr "" + +#: templates/emails/lms_course_interest.html:5 +msgid "The course {0} is now available on {1}." +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:24 +msgid "The quiz has a time limit. For each question you will be given {0} seconds." +msgstr "" + +#: lms/doctype/lms_certificate_request/lms_certificate_request.py:61 +msgid "The slot is already booked by another participant." +msgstr "" + +#: patches/create_mentor_request_email_templates.py:40 +msgid "The status of your application has changed." +msgstr "" + +#: lms/doctype/lms_batch/lms_batch.py:129 +msgid "There are no seats available in this batch." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "There are no students in this batch." +msgstr "" + +#: templates/course_list.html:14 +msgid "There are no {0} on this site." +msgstr "" + +#: lms/utils.py:1123 +msgid "There is a problem with the payment gateway. Please contact the Administrator to proceed." +msgstr "" + +#. Description of the 'section_break_ubxi' (Section Break) field in DocType +#. 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "These customisations will work on the main batch page." +msgstr "" + +#: public/frontend/assets/Badge-DYL399Ho.js:1 +msgid "This badge has been awarded to {0} on {1}." +msgstr "" + +#. Label of a Check field in DocType 'Certification' +#: lms/doctype/certification/certification.json +msgctxt "Certification" +msgid "This certificate does no expire" +msgstr "" + +#: lms/utils.py:1081 lms/utils.py:1822 +msgid "This course is free." +msgstr "" + +#: lms/widgets/CourseOutline.html:62 +msgid "This lesson is not available for preview. As you are the Instructor of the course only you can see it." +msgstr "" + +#: public/frontend/assets/Lesson-59XvRJIg.js:18 +msgid "This lesson is not available for preview. Please enroll in the course to access it." +msgstr "" + +#: lms/widgets/NoPreviewModal.html:16 +msgid "This lesson is not available for preview. Please join the course to access it." +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:6 +msgid "This quiz consists of {0} questions." +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Thursday" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Thursday" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Time" +msgstr "" + +#. Label of a Time field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Time" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Time must be in 24 hour format (HH:mm). Example 11:30 or 22:00" +msgstr "" + +#. Label of a Tab Break field in DocType 'LMS Batch' +#. Label of a Table field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Timetable" +msgstr "" + +#. Label of a Table field in DocType 'LMS Timetable Template' +#: lms/doctype/lms_timetable_template/lms_timetable_template.json +msgctxt "LMS Timetable Template" +msgid "Timetable" +msgstr "" + +#. Label of a Table field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Timetable Legends" +msgstr "" + +#. Label of a Table field in DocType 'LMS Timetable Template' +#: lms/doctype/lms_timetable_template/lms_timetable_template.json +msgctxt "LMS Timetable Template" +msgid "Timetable Legends" +msgstr "" + +#. Label of a Link field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Timetable Template" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +msgid "Timezone" +msgstr "" + +#. Label of a Data field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Timezone" +msgstr "" + +#. Label of a Data field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Timezone" +msgstr "" + +#: templates/emails/batch_confirmation.html:24 +msgid "Timings:" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +#: public/frontend/assets/BatchCreation-9JuqnhbY.js:1 +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +#: public/frontend/assets/Discussions-BUeR4n3G.js:1 +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +#: public/js/common_functions.js:259 +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'Cohort Subgroup' +#: lms/doctype/cohort_subgroup/cohort_subgroup.json +msgctxt "Cohort Subgroup" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'Cohort Web Page' +#: lms/doctype/cohort_web_page/cohort_web_page.json +msgctxt "Cohort Web Page" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'Course Chapter' +#: lms/doctype/course_chapter/course_chapter.json +msgctxt "Course Chapter" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Batch' +#: lms/doctype/lms_batch/lms_batch.json +msgctxt "LMS Batch" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Exercise' +#: lms/doctype/lms_exercise/lms_exercise.json +msgctxt "LMS Exercise" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Live Class' +#: lms/doctype/lms_live_class/lms_live_class.json +msgctxt "LMS Live Class" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Sidebar Item' +#: lms/doctype/lms_sidebar_item/lms_sidebar_item.json +msgctxt "LMS Sidebar Item" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'LMS Timetable Template' +#: lms/doctype/lms_timetable_template/lms_timetable_template.json +msgctxt "LMS Timetable Template" +msgid "Title" +msgstr "" + +#. Label of a Data field in DocType 'Work Experience' +#: lms/doctype/work_experience/work_experience.json +msgctxt "Work Experience" +msgid "Title" +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "To" +msgstr "" + +#. Label of a Date field in DocType 'Course Evaluator' +#: lms/doctype/course_evaluator/course_evaluator.json +msgctxt "Course Evaluator" +msgid "To" +msgstr "" + +#. Label of a Date field in DocType 'Work Experience' +#: lms/doctype/work_experience/work_experience.json +msgctxt "Work Experience" +msgid "To Date" +msgstr "" + +#: lms/web_form/profile/profile.js:19 +msgid "To Date is mandatory in Work Experience." +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "To add a YouTube video, paste the URL of the video in the editor." +msgstr "" + +#: lms/utils.py:1090 lms/utils.py:1833 +msgid "To join this batch, please contact the Administrator." +msgstr "" + +#: overrides/user.py:202 +msgid "Too many users signed up recently, so the registration is disabled. Please try back in an hour" +msgstr "" + +#. Label of a Int field in DocType 'LMS Quiz' +#: lms/doctype/lms_quiz/lms_quiz.json +msgctxt "LMS Quiz" +msgid "Total Marks" +msgstr "" + +#: lms/web_template/lms_statistics/lms_statistics.html:14 +#: templates/statistics.html:12 +msgid "Total Signups" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:131 +msgid "Try Again" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Tuesday" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Tuesday" +msgstr "" + +#: public/frontend/assets/ProfileAbout-M7A4DT21.js:1 +msgid "Twitter" +msgstr "" + +#: public/frontend/assets/JobCreation-CU_0h0cz.js:1 +#: templates/assessments.html:14 +msgid "Type" +msgstr "" + +#. Label of a Select field in DocType 'Job Opportunity' +#: job/doctype/job_opportunity/job_opportunity.json +msgctxt "Job Opportunity" +msgid "Type" +msgstr "" + +#. Label of a Select field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "Type" +msgstr "" + +#. Label of a Select field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "Type" +msgstr "" + +#. Label of a Select field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "Type" +msgstr "" + +#. Option for the 'Grade Type' (Select) field in DocType 'Education Detail' +#: lms/doctype/education_detail/education_detail.json +msgctxt "Education Detail" +msgid "UK Grading (e.g. 1st, 2:2)" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment' +#: lms/doctype/lms_assignment/lms_assignment.json +msgctxt "LMS Assignment" +msgid "URL" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Assignment Submission' +#: lms/doctype/lms_assignment_submission/lms_assignment_submission.json +msgctxt "LMS Assignment Submission" +msgid "URL" +msgstr "" + +#. Label of a Section Break field in DocType 'Course Evaluator' +#: lms/doctype/course_evaluator/course_evaluator.json +msgctxt "Course Evaluator" +msgid "Unavailability" +msgstr "" + +#: lms/doctype/course_evaluator/course_evaluator.py:23 +msgid "Unavailable From Date cannot be greater than Unavailable To Date" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Under Review" +msgstr "" + +#. Option for the 'Visibility' (Select) field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Unlisted" +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "Unsplash" +msgstr "" + +#. Label of a Data field in DocType 'LMS Settings' +#: lms/doctype/lms_settings/lms_settings.json +msgctxt "LMS Settings" +msgid "Unsplash Access Key" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "Upcoming" +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'Cohort' +#: lms/doctype/cohort/cohort.json +msgctxt "Cohort" +msgid "Upcoming" +msgstr "" + +#. Label of a Check field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Upcoming" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "Upcoming Batches" +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 templates/upcoming_evals.html:3 +msgid "Upcoming Evaluations" +msgstr "" + +#: templates/emails/community_course_membership.html:11 +msgid "Update Password" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "Upload File" +msgstr "" + +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "Upload a File" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:26 +msgid "Upload a video from your local machine to the {0}. Copy and paste this syntax in the editor. Replace 'url_of_source' with the File URL field of the document you created in the File DocType." +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:19 +msgid "Upload the video on youtube." +msgstr "" + +#: public/frontend/assets/JobDetail-CBHvk1ll.js:1 +msgid "Uploading ${s}%" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +#: public/frontend/assets/CreateLesson-7ZGJlo2v.js:1 +msgid "Uploading {0}%" +msgstr "" + +#. Label of a Link field in DocType 'Cohort Staff' +#: lms/doctype/cohort_staff/cohort_staff.json +msgctxt "Cohort Staff" +msgid "User" +msgstr "" + +#. Label of a Link field in DocType 'LMS Course Interest' +#: lms/doctype/lms_course_interest/lms_course_interest.json +msgctxt "LMS Course Interest" +msgid "User" +msgstr "" + +#. Label of a Link field in DocType 'LMS Job Application' +#: job/doctype/lms_job_application/lms_job_application.json +msgctxt "LMS Job Application" +msgid "User" +msgstr "" + +#: templates/signup-form.html:16 +msgid "User Category" +msgstr "" + +#. Label of a Select field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "User Field" +msgstr "" + +#. Option for the 'Type' (Select) field in DocType 'LMS Question' +#: lms/doctype/lms_question/lms_question.json +msgctxt "LMS Question" +msgid "User Input" +msgstr "" + +#. Name of a DocType +#: lms/doctype/user_skill/user_skill.json +msgid "User Skill" +msgstr "" + +#: job/doctype/job_opportunity/job_opportunity.py:37 +msgid "User {0} has reported the job post {1}" +msgstr "" + +#. Label of a Data field in DocType 'Batch Student' +#: lms/doctype/batch_student/batch_student.json +msgctxt "Batch Student" +msgid "Username" +msgstr "" + +#. Label of a Data field in DocType 'Invite Request' +#: lms/doctype/invite_request/invite_request.json +msgctxt "Invite Request" +msgid "Username" +msgstr "" + +#. Label of a shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "User" +msgid "Users" +msgstr "" + +#. Label of a Small Text field in DocType 'LMS Quiz Result' +#: lms/doctype/lms_quiz_result/lms_quiz_result.json +msgctxt "LMS Quiz Result" +msgid "Users Response" +msgstr "" + +#: templates/signup-form.html:80 +msgid "Valid email and name required" +msgstr "" + +#. Option for the 'Event' (Select) field in DocType 'LMS Badge' +#: lms/doctype/lms_badge/lms_badge.json +msgctxt "LMS Badge" +msgid "Value Change" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:26 +msgid "Video" +msgstr "" + +#. Label of a Data field in DocType 'LMS Course' +#: lms/doctype/lms_course/lms_course.json +msgctxt "LMS Course" +msgid "Video Embed Link" +msgstr "" + +#: public/frontend/assets/Notifications-YFJ-Ay-J.js:1 +msgid "View" +msgstr "" + +#: public/frontend/assets/CreateCourse-2snz_azq.js:1 +msgid "View Course" +msgstr "" + +#. Label of a Select field in DocType 'LMS Batch Old' +#: lms/doctype/lms_batch_old/lms_batch_old.json +msgctxt "LMS Batch Old" +msgid "Visibility" +msgstr "" + +#: templates/emails/batch_confirmation.html:28 +msgid "Visit the following link to view your " +msgstr "" + +#: templates/emails/batch_confirmation.html:6 +msgid "We are pleased to inform you that you have been enrolled in our upcoming batch. Congratulations!" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7369 +msgid "Web Page" +msgstr "" + +#. Label of a Link field in DocType 'LMS Sidebar Item' +#: lms/doctype/lms_sidebar_item/lms_sidebar_item.json +msgctxt "LMS Sidebar Item" +msgid "Web Page" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7369 +msgid "Web Pages" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'Evaluator Schedule' +#: lms/doctype/evaluator_schedule/evaluator_schedule.json +msgctxt "Evaluator Schedule" +msgid "Wednesday" +msgstr "" + +#. Option for the 'Day' (Select) field in DocType 'LMS Certificate Request' +#: lms/doctype/lms_certificate_request/lms_certificate_request.json +msgctxt "LMS Certificate Request" +msgid "Wednesday" +msgstr "" + +#: lms/doctype/invite_request/invite_request.py:40 +#: templates/emails/lms_invite_request_approved.html:4 +msgid "Welcome to {0}!" +msgstr "" + +#: templates/courses_under_review.html:15 +msgid "When a course gets submitted for review, it will be listed here." +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:19 +msgid "When you share a youtube video, it shows an option called Embed." +msgstr "" + +#: templates/emails/certification.html:10 +msgid "With this certification, you can now showcase your updated skills and share your achievement with your colleagues and on LinkedIn. To access your certificate, please click on the link provided below. Make sure you are logged in to the portal." +msgstr "" + +#. Option for the 'Status' (Select) field in DocType 'LMS Mentor Request' +#: lms/doctype/lms_mentor_request/lms_mentor_request.json +msgctxt "LMS Mentor Request" +msgid "Withdrawn" +msgstr "" + +#. Name of a DocType +#: lms/doctype/work_experience/work_experience.json +msgid "Work Experience" +msgstr "" + +#: templates/reviews.html:117 +msgid "Write a Review" +msgstr "" + +#: templates/reviews.html:31 templates/reviews.html:103 +#: templates/reviews_cta.html:3 templates/reviews_cta.html:7 +msgid "Write a review" +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "Write your answer here" +msgstr "" + +#: lms/doctype/lms_certificate_request/lms_certificate_request.py:85 +msgid "You already have an evaluation on {0} at {1} for the course {2}." +msgstr "" + +#: lms/api.py:204 +msgid "You are already enrolled for this batch." +msgstr "" + +#: lms/api.py:196 +msgid "You are already enrolled for this course." +msgstr "" + +#: public/frontend/assets/Batch-BYfbr7eo.js:1 +msgid "You are not a member of this batch. Please checkout our upcoming batches." +msgstr "" + +#: lms/doctype/lms_batch_old/lms_batch_old.py:20 +msgid "You are not a mentor of the course {0}" +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:15 +msgid "You can add some more additional content to the lesson using a special syntax. The table below mentions all types of dynamic content that you can add to the lessons and the syntax for the same." +msgstr "" + +#: templates/emails/lms_course_interest.html:13 +#: templates/emails/lms_invite_request_approved.html:11 +msgid "You can also copy-paste following link in your browser" +msgstr "" + +#: templates/quiz/quiz.html:18 +msgid "You can attempt this quiz only {0} {1}" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +msgid "You can attempt this quiz {0}." +msgstr "" + +#: templates/emails/job_application.html:6 +msgid "You can find their resume attached to this email." +msgstr "" + +#: lms/doctype/lms_certificate_request/lms_certificate_request.py:105 +msgid "You cannot schedule evaluations after {0}." +msgstr "" + +#: lms/doctype/lms_certificate_request/lms_certificate_request.py:94 +msgid "You cannot schedule evaluations for past slots." +msgstr "" + +#: public/frontend/assets/Profile-CcZj7_FE.js:1 +msgid "You do not have permission to access this page." +msgstr "" + +#: templates/notifications.html:27 +msgid "You don't have any notifications." +msgstr "" + +#: templates/quiz/quiz.js:136 +msgid "You got" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 +#, python-format +msgid "You got {0}% correct answers with a score of {1} out of {2}" +msgstr "" + +#: job/doctype/lms_job_application/lms_job_application.py:22 +msgid "You have already applied for this job." +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:43 +msgid "You have already exceeded the maximum number of attempts allowed for this quiz." +msgstr "" + +#: lms/doctype/lms_course_review/lms_course_review.py:17 +msgid "You have already reviewed this course" +msgstr "" + +#: lms/widgets/NoPreviewModal.html:12 public/js/common_functions.js:126 +msgid "You have opted to be notified for this course. You will receive an email when the course becomes available." +msgstr "" + +#: lms/web_template/courses_enrolled/courses_enrolled.html:17 +msgid "You haven't enrolled for any courses" +msgstr "" + +#: public/frontend/assets/index-D1f05dS8.js:7351 templates/quiz/quiz.html:11 +#, python-format +msgid "You will have to get {0}% correct answers in order to pass the quiz." +msgstr "" + +#: templates/emails/mentor_request_creation_email.html:4 +msgid "You've applied to become a mentor for this course. Your request is currently under review." +msgstr "" + +#: public/frontend/assets/AssignmentSubmission-D1b-IhRa.js:1 +msgid "You've successfully submitted the assignment." +msgstr "" + +#: lms/doctype/course_lesson/course_lesson.js:17 +msgid "YouTube Video" +msgstr "" + +#. Label of a Data field in DocType 'Course Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "YouTube Video URL" +msgstr "" + +#. Description of the 'YouTube Video URL' (Data) field in DocType 'Course +#. Lesson' +#: lms/doctype/course_lesson/course_lesson.json +msgctxt "Course Lesson" +msgid "YouTube Video will appear at the top of the lesson." +msgstr "" + +#: www/new-sign-up.html:56 +msgid "Your Account has been successfully created!" +msgstr "" + +#: public/frontend/assets/ProfileEvaluator-bug1MVAq.js:1 +msgid "Your calendar is set." +msgstr "" + +#: lms/notification/certificate_request_creation/certificate_request_creation.html:6 +#: lms/notification/certificate_request_reminder/certificate_request_reminder.html:5 +msgid "Your evaluation for the course {0} has been scheduled on {1} at {2} {3}." +msgstr "" + +#: templates/emails/mentor_request_status_update_email.html:4 +msgid "Your request to join us as a mentor for the course" +msgstr "" + +#: templates/quiz/quiz.js:136 +msgid "Your score is" +msgstr "" + +#. Name of a DocType +#: lms/doctype/zoom_settings/zoom_settings.json +msgid "Zoom Settings" +msgstr "" + +#: templates/emails/mentor_request_creation_email.html:5 +msgid "cancel your application" +msgstr "" + +#: templates/quiz/quiz.js:136 +msgid "correct answers" +msgstr "" + +#: public/frontend/assets/Billing-CGToWkz4.js:1 +#: public/frontend/assets/CourseDetail-CwRZRbF1.js:1 +#: public/frontend/assets/JobDetail-CBHvk1ll.js:1 +msgid "div" +msgstr "" + +#: templates/emails/mentor_request_status_update_email.html:4 +msgid "has been" +msgstr "" + +#: templates/signup-form.html:11 +msgid "jane@example.com" +msgstr "" + +#: templates/quiz/quiz.html:106 +msgid "of" +msgstr "" + +#: templates/quiz/quiz.js:136 +msgid "out of" +msgstr "" + +#: templates/reviews.html:25 +msgid "ratings" +msgstr "" + +#: templates/reviews.html:43 +msgid "stars" +msgstr "" + +#: templates/emails/mentor_request_creation_email.html:5 +msgid "you can" +msgstr "" + +#: templates/emails/job_application.html:2 +msgid "{0} has applied for the job position {1}" +msgstr "" + +#: templates/emails/job_report.html:4 +msgid "{0} has reported a job post for the following reason." +msgstr "" + +#: templates/emails/assignment_submission.html:2 +msgid "{0} has submitted the assignment {1}" +msgstr "" + +#: lms/doctype/lms_enrollment/lms_enrollment.py:53 +msgid "{0} is already a Student of {1} course through {2} batch" +msgstr "" + +#: lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.py:16 +msgid "{0} is already a mentor for course {1}" +msgstr "" + +#: lms/doctype/lms_enrollment/lms_enrollment.py:26 +msgid "{0} is already a {1} of the course {2}" +msgstr "" + +#: lms/doctype/lms_certificate/lms_certificate.py:59 +msgid "{0} is already certified for the course {1}" +msgstr "" + +#: lms/utils.py:743 +msgid "{0} mentioned you in a comment" +msgstr "" + +#: templates/emails/mention_template.html:2 +msgid "{0} mentioned you in a comment in your batch." +msgstr "" + +#: lms/utils.py:696 lms/utils.py:702 +msgid "{0} mentioned you in a comment in {1}" +msgstr "" + +#: lms/utils.py:499 +msgid "{0}k" +msgstr "" + +#: public/frontend/assets/frappe-ui-0rNYcqgR.js:137 +msgid "{|}~.]+@[-a-z0-9]+(.[-a-z0-9]+)*.[a-z]+)(?=$|s)/gmi,b=/<()(?:mailto:)?([-.w]+@[-a-z0-9]+(.[-a-z0-9]+)*.[a-z]+)>/gi,w=function(h){return function(y,g,x,S,E,C,M){x=x.replace(r.helper.regexes.asteriskDashAndColon,r.helper.escapeCharactersCallback);var O=x,P=\"\",j=\"\",$=g||\"\",T=M||\"\";return/^www./i.test(x)&&(x=x.replace(/^www./i,\"http://www.\")),h.excludeTrailingPunctuationFromURLs&&C&&(P=C),h.openLinksInNewWindow&&(j=' rel=\"noopener noreferrer\" target=\"¨E95Eblank\"'),$+'\"+O+\"\"+P+T}},k=function(h,y){return function(g,x,S){var E=\"mailto:\";return x=x||\"\",S=r.subParser(\"unescapeSpecialChars\")(S,h,y),h.encodeEmails?(E=r.helper.encodeEmailAddress(E+S),S=r.helper.encodeEmailAddress(S)):E=E+S,x+''+S+\"\"}};r.subParser(\"autoLinks\",function(h,y,g){return h=g.converter._dispatch(\"autoLinks.before\",h,y,g),h=h.replace(m,w(y)),h=h.replace(b,k(y,g)),h=g.converter._dispatch(\"autoLinks.after\",h,y,g),h}),r.subParser(\"simplifiedAutoLinks\",function(h,y,g){return y.simplifiedAutoLink&&(h=g.converter._dispatch(\"simplifiedAutoLinks.before\",h,y,g),y.excludeTrailingPunctuationFromURLs?h=h.replace(p,w(y)):h=h.replace(f,w(y)),h=h.replace(v,k(y,g)),h=g.converter._dispatch(\"simplifiedAutoLinks.after\",h,y,g)),h}),r.subParser(\"blockGamut\",function(h,y,g){return h=g.converter._dispatch(\"blockGamut.before\",h,y,g),h=r.subParser(\"blockQuotes\")(h,y,g),h=r.subParser(\"headers\")(h,y,g),h=r.subParser(\"horizontalRule\")(h,y,g),h=r.subParser(\"lists\")(h,y,g),h=r.subParser(\"codeBlocks\")(h,y,g),h=r.subParser(\"tables\")(h,y,g),h=r.subParser(\"hashHTMLBlocks\")(h,y,g),h=r.subParser(\"paragraphs\")(h,y,g),h=g.converter._dispatch(\"blockGamut.after\",h,y,g),h}),r.subParser(\"blockQuotes\",function(h,y,g){h=g.converter._dispatch(\"blockQuotes.before\",h,y,g),h=h+" +msgstr "" + +#: public/frontend/assets/Lesson-59XvRJIg.js:2 +msgid "{|}~])/g,Se=/&([a-z#][a-z0-9]{1,31});/gi,Be=new RegExp(m0.source+\"|\"+Se.source,\"gi\"),ze=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i;function Te(u,e){if(e.charCodeAt(0)===35&&ze.test(e)){const n=e[1].toLowerCase()===\"x\"?parseInt(e.slice(2),16):parseInt(e.slice(1),10);return Lu(n)?bu(n):u}const t=x0(u);return t!==u?t:u}function qe(u){return u.indexOf(\"\\\")<0?u:u.replace(m0,\"$1\")}function uu(u){return u.indexOf(\"\\\")<0&&u.indexOf(\"&\")<0?u:u.replace(Be,function(e,t,n){return t||Te(e,n)})}const Ie=/[&<>\"]/,Me=/[&<>\"]/g,Ne={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\"};function Re(u){return Ne[u]}function Q(u){return Ie.test(u)?u.replace(Me,Re):u}const Le=/[.?*+^$[]\\(){}|-]/g;function Pe(u){return u.replace(Le,\"\\$&\")}function F(u){switch(u){case 9:case 32:return!0}return!1}function nu(u){if(u>=8192&&u<=8202)return!0;switch(u){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function cu(u){return Nu.test(u)||h0.test(u)}function ou(u){switch(u){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function _u(u){return u=u.trim().replace(/s+/g,\" \"),\"ẞ\".toLowerCase()===\"Ṿ\"&&(u=u.replace(/ẞ/g,\"ß\")),u.toLowerCase().toUpperCase()}const Oe={mdurl:fe,ucmicro:he},$e=Object.freeze(Object.defineProperty({__proto__:null,arrayReplaceAt:_0,assign:xu,escapeHtml:Q,escapeRE:Pe,fromCodePoint:bu,has:ve,isMdAsciiPunct:ou,isPunctChar:cu,isSpace:F,isString:Ru,isValidEntityCode:Lu,isWhiteSpace:nu,lib:Oe,normalizeReference:_u,unescapeAll:uu,unescapeMd:qe},Symbol.toStringTag,{value:\"Module\"}));function je(u,e,t){let n,r,c,i;const o=u.posMax,a=u.pos;for(u.pos=e+1,n=1;u.pos 32))return c;if(n===41){if(i===0)break;i--}r++}return e===r||i!==0||(c.str=uu(u.slice(e,r)),c.pos=r,c.ok=!0),c}function He(u,e,t,n){let r,c=e;const i={ok:!1,can_continue:!1,pos:0,str:\"\",marker:0};if(n)i.str=n.str,i.marker=n.marker;else{if(c>=t)return i;let o=u.charCodeAt(c);if(o!==34&&o!==39&&o!==40)return i;e++,c++,o===40&&(o=41),i.marker=o}for(;c \"+Q(c.content)+\" \"+Q(u[e].content)+" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "User" +msgid "{} Active" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Enrollment" +msgid "{} Completed" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Enrollment" +msgid "{} Enrolled" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Certificate" +msgid "{} Granted" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Certificate Evaluation" +msgid "{} Passed" +msgstr "" + +#. Count format of shortcut in the LMS Workspace +#: lms/workspace/lms/lms.json +msgctxt "LMS Course" +msgid "{} Published" +msgstr "" + diff --git a/lms/overrides/user.py b/lms/overrides/user.py index 3643e473..b7659493 100644 --- a/lms/overrides/user.py +++ b/lms/overrides/user.py @@ -15,7 +15,6 @@ class CustomUser(User): def validate(self): super().validate() self.validate_username_duplicates() - self.validate_completion() def validate_username_duplicates(self): while not self.username or self.username_exists(): @@ -38,19 +37,6 @@ class CustomUser(User): else: frappe.throw(_("Skills must be unique")) - def validate_completion(self): - if frappe.db.get_single_value("LMS Settings", "force_profile_completion"): - all_fields_have_value = True - profile_mandatory_fields = frappe.get_hooks("profile_mandatory_fields") - docfields = frappe.get_meta(self.doctype).fields - - for field in profile_mandatory_fields: - if not self.get(field): - all_fields_have_value = False - break - - self.profile_complete = all_fields_have_value - def get_batch_count(self) -> int: """Returns the number of batches authored by this user.""" return frappe.db.count( @@ -264,7 +250,7 @@ def on_session_creation(login_manager): if frappe.db.get_single_value( "System Settings", "setup_complete" ) and frappe.db.get_single_value("LMS Settings", "default_home"): - frappe.local.response["home_page"] = "/courses" + frappe.local.response["home_page"] = "/lms" @frappe.whitelist() @@ -356,6 +342,7 @@ def get_users(or_filters, start, page_length): @frappe.whitelist() def save_role(user, role, value): + frappe.only_for("Moderator") if cint(value): doc = frappe.get_doc( { diff --git a/lms/page_renderers.py b/lms/page_renderers.py index 55ac47c9..e6f687e2 100644 --- a/lms/page_renderers.py +++ b/lms/page_renderers.py @@ -107,3 +107,34 @@ def render_portal_page(path, **kwargs): frappe.form_dict.update(kwargs) page = TemplatePage(path) return page.render() + + +class CoursePage(BaseRenderer): + def __init__(self, path, http_status_code): + super().__init__(path, http_status_code) + self.renderer = None + + def can_render(self): + return self.path.startswith("course") + + def render(self): + if "learn" in self.path: + prefix = self.path.split("/learn")[0] + course_name = prefix.split("/")[1] + lesson_index = self.path.split("/learn/")[1] + chapter_number = lesson_index.split(".")[0] + lesson_number = lesson_index.split(".")[1] + + frappe.flags.redirect_location = ( + f"/lms/courses/{course_name}/learn/{chapter_number}-{lesson_number}" + ) + return RedirectPage(self.path).render() + + elif len(self.path.split("/")) > 1: + course_name = self.path.split("/")[1] + frappe.flags.redirect_location = f"/lms/courses/{course_name}" + return RedirectPage(self.path).render() + + else: + frappe.flags.redirect_location = "/lms/courses" + return RedirectPage(self.path).render() diff --git a/lms/patches.txt b/lms/patches.txt index 85d1485c..0c9109ac 100644 --- a/lms/patches.txt +++ b/lms/patches.txt @@ -82,4 +82,11 @@ lms.patches.v1_0.create_batch_source [post_model_sync] lms.patches.v1_0.batch_tabs_settings execute:frappe.delete_doc("Notification", "Assignment Submission Notification") -lms.patches.v1_0.change_jobs_url #17-01-2024 \ No newline at end of file +lms.patches.v1_0.change_jobs_url #19-01-2024 +lms.patches.v1_0.custom_perm_for_discussions #14-01-2024 +lms.patches.v1_0.rename_evaluator_role +lms.patches.v1_0.change_navbar_urls +lms.patches.v1_0.set_published_on +lms.patches.v2_0.fix_progress_percentage +lms.patches.v2_0.add_discussion_topic_titles +lms.patches.v2_0.sidebar_settings \ No newline at end of file diff --git a/lms/patches/v1_0/change_navbar_urls.py b/lms/patches/v1_0/change_navbar_urls.py new file mode 100644 index 00000000..8bded0fe --- /dev/null +++ b/lms/patches/v1_0/change_navbar_urls.py @@ -0,0 +1,23 @@ +import frappe + + +def execute(): + rename_link("/courses", "/lms/courses") + rename_link("/batches", "/lms/batches") + rename_link("/statistics", "/lms/statistics") + rename_link("/job-openings", "/lms/job-openings") + delete_link("/people") + + +def rename_link(source, target): + link = frappe.db.exists("Top Bar Item", {"url": source}) + + if link: + frappe.db.set_value("Top Bar Item", link, "url", target) + + +def delete_link(source): + link = frappe.db.exists("Top Bar Item", {"url": source}) + + if link: + frappe.delete_doc("Top Bar Item", link) diff --git a/lms/patches/v1_0/create_quiz_questions.py b/lms/patches/v1_0/create_quiz_questions.py index 12779cbd..0336a218 100644 --- a/lms/patches/v1_0/create_quiz_questions.py +++ b/lms/patches/v1_0/create_quiz_questions.py @@ -17,7 +17,6 @@ def execute(): ) for question in questions: - print(question.name) doc = frappe.new_doc("LMS Question") doc.update( { @@ -39,5 +38,4 @@ def execute(): ) doc.save() - print(doc.name) frappe.db.set_value("LMS Quiz Question", question.name, "question", doc.name) diff --git a/lms/patches/v1_0/custom_perm_for_discussions.py b/lms/patches/v1_0/custom_perm_for_discussions.py new file mode 100644 index 00000000..29efadce --- /dev/null +++ b/lms/patches/v1_0/custom_perm_for_discussions.py @@ -0,0 +1,42 @@ +import frappe + + +def execute(): + roles = ["LMS Student", "Moderator", "Course Creator", "Class Evaluator"] + for role in roles: + add_perm_for_discussion_topic(role) + add_perm_for_discussion_reply(role) + + +def add_perm_for_discussion_topic(role): + topic_roles = frappe.permissions.get_doctype_roles("Discussion Topic") + if role in topic_roles: + return + + topic_perm = frappe.new_doc("Custom DocPerm") + topic_perm.parent = "Discussion Topic" + topic_perm.role = role + topic_perm.if_owner = 1 + topic_perm.read = 1 + topic_perm.write = 1 + topic_perm.create = 1 + topic_perm.delete = 1 + topic_perm.insert() + frappe.db.commit() + + +def add_perm_for_discussion_reply(role): + reply_roles = frappe.permissions.get_doctype_roles("Discussion Reply") + if role in reply_roles: + return + + reply_perm = frappe.new_doc("Custom DocPerm") + reply_perm.parent = "Discussion Reply" + reply_perm.role = role + reply_perm.if_owner = 1 + reply_perm.read = 1 + reply_perm.write = 1 + reply_perm.create = 1 + reply_perm.delete = 1 + reply_perm.insert() + frappe.db.commit() diff --git a/lms/patches/v1_0/rename_evaluator_role.py b/lms/patches/v1_0/rename_evaluator_role.py new file mode 100644 index 00000000..79411a19 --- /dev/null +++ b/lms/patches/v1_0/rename_evaluator_role.py @@ -0,0 +1,8 @@ +import frappe + + +def execute(): + if frappe.db.exists("Role", "Class Evaluator") and not frappe.db.exists( + "Role", "Batch Evaluator" + ): + frappe.rename_doc("Role", "Class Evaluator", "Batch Evaluator") diff --git a/lms/patches/v1_0/set_published_on.py b/lms/patches/v1_0/set_published_on.py new file mode 100644 index 00000000..e884d614 --- /dev/null +++ b/lms/patches/v1_0/set_published_on.py @@ -0,0 +1,10 @@ +import frappe + + +def execute(): + courses = frappe.get_all( + "LMS Course", filters={"published": 1}, fields=["name", "creation"] + ) + + for course in courses: + frappe.db.set_value("LMS Course", course.name, "published_on", course.creation) diff --git a/lms/patches/v2_0/add_discussion_topic_titles.py b/lms/patches/v2_0/add_discussion_topic_titles.py new file mode 100644 index 00000000..75ad2455 --- /dev/null +++ b/lms/patches/v2_0/add_discussion_topic_titles.py @@ -0,0 +1,13 @@ +import frappe + + +def execute(): + topics = frappe.get_all( + "Discussion Topic", + {"title": ["is", "not set"]}, + ["name", "reference_docname", "title"], + ) + + for topic in topics: + if not topic.title: + frappe.db.set_value("Discussion Topic", topic.name, "title", topic.reference_docname) diff --git a/lms/patches/v2_0/fix_progress_percentage.py b/lms/patches/v2_0/fix_progress_percentage.py new file mode 100644 index 00000000..0fbf8f1d --- /dev/null +++ b/lms/patches/v2_0/fix_progress_percentage.py @@ -0,0 +1,10 @@ +import frappe +from lms.lms.utils import get_course_progress + + +def execute(): + enrollments = frappe.get_all("LMS Enrollment", fields=["name", "course", "member"]) + + for enrollment in enrollments: + progress = get_course_progress(enrollment.course, enrollment.member) + frappe.db.set_value("LMS Enrollment", enrollment.name, "progress", progress) diff --git a/lms/patches/v2_0/sidebar_settings.py b/lms/patches/v2_0/sidebar_settings.py new file mode 100644 index 00000000..d17dd244 --- /dev/null +++ b/lms/patches/v2_0/sidebar_settings.py @@ -0,0 +1,15 @@ +import frappe + + +def execute(): + fields = [ + "courses", + "batches", + "certified_participants", + "jobs", + "statistics", + "notifications", + ] + + for field in fields: + frappe.db.set_single_value("LMS Settings", field, 1) diff --git a/lms/plugins.py b/lms/plugins.py index e3241244..852d5587 100644 --- a/lms/plugins.py +++ b/lms/plugins.py @@ -91,17 +91,6 @@ class LiveCodeExtension(PageExtension): return frappe.render_template("templates/livecode/extension_footer.html", context) -def set_mandatory_fields_for_profile(): - profile_form = frappe.get_doc("Web Form", "profile") - profile_mandatory_fields = frappe.get_hooks("profile_mandatory_fields") - for field in profile_form.web_form_fields: - field.reqd = 0 - if field.fieldname in profile_mandatory_fields: - field.reqd = 1 - - profile_form.save() - - def quiz_renderer(quiz_name): if frappe.session.user == "Guest": return "" + _( @@ -180,7 +169,7 @@ def youtube_video_renderer(video_id): src="https://www.youtube.com/embed/{video_id}" title="YouTube video player" frameborder="0" - style="border-radius: var(--border-radius-lg)" + class="youtube-video allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen> diff --git a/lms/subscription_utils.py b/lms/subscription_utils.py deleted file mode 100644 index 35971180..00000000 --- a/lms/subscription_utils.py +++ /dev/null @@ -1,50 +0,0 @@ -import frappe - - -@frappe.whitelist(allow_guest=True) -def get_add_on_details(plan: str) -> dict[str, int]: - """ - Returns the number of courses and course members to be billed under add-ons for SAAS subscription - """ - - return {"courses": get_add_on_courses(plan), "members": get_add_on_members(plan)} - - -def get_published_courses() -> int: - return frappe.db.count("LMS Course", {"published": 1}) - - -def get_add_on_courses(plan: str) -> int: - COURSE_LIMITS = {"Lite": 5, "Pro": 20} - add_on_courses = 0 - courses_included_in_plans = COURSE_LIMITS.get(plan) - - if courses_included_in_plans: - published_courses = get_published_courses() - add_on_courses = ( - published_courses - courses_included_in_plans - if published_courses > courses_included_in_plans - else 0 - ) - - return add_on_courses - - -def get_add_on_members(plan: str) -> int: - MEMBER_LIMITS = {"Lite": 500, "Pro": 1000} - add_on_members = 0 - members_included_in_plans = MEMBER_LIMITS.get(plan) - - if members_included_in_plans: - active_members = get_members() - add_on_members = ( - active_members - members_included_in_plans - if active_members > members_included_in_plans - else 0 - ) - - return add_on_members - - -def get_members() -> int: - return frappe.db.count("LMS Enrollment") diff --git a/lms/templates/emails/certification.html b/lms/templates/emails/certification.html index 3d47b1b9..3e8b261b 100644 --- a/lms/templates/emails/certification.html +++ b/lms/templates/emails/certification.html @@ -7,10 +7,10 @@-{% endblock %} diff --git a/lms/www/jobs_openings/index.py b/lms/www/jobs_openings/index.py deleted file mode 100644 index 6dc2ae92..00000000 --- a/lms/www/jobs_openings/index.py +++ /dev/null @@ -1,13 +0,0 @@ -import frappe - - -def get_context(context): - context.jobs = frappe.get_all( - "Job Opportunity", - {"status": "Open", "disabled": False}, - ["job_title", "location", "type", "company_name", "company_logo", "name", "creation"], - order_by="creation desc", - ) - context.title = frappe.db.get_single_value("Job Settings", "title") - context.subtitle = frappe.db.get_single_value("Job Settings", "subtitle") - context.allow_posting = frappe.db.get_single_value("Job Settings", "allow_posting") diff --git a/lms/www/jobs_openings/job.html b/lms/www/jobs_openings/job.html deleted file mode 100644 index f2b65889..00000000 --- a/lms/www/jobs_openings/job.html +++ /dev/null @@ -1,102 +0,0 @@ -{% extends "lms/templates/lms_base.html" %} -{% block title %}{{ _(job.job_title) }}{% endblock %} - - -{% block page_content %} - -
- {{ _("With this certification, you can now showcase your updated skills and share your achievement with your colleagues and on LinkedIn. To access your certificate, please click on the link provided below.") }} + {{ _("With this certification, you can now showcase your updated skills and share your achievement with your colleagues and on LinkedIn. To access your certificate, please click on the link provided below. Make sure you are logged in to the portal.") }}
-{{ _("Certificate Link") }} +{{ _("Certificate Link") }}
{{ _("Once again, congratulations on this significant accomplishment.")}} diff --git a/lms/templates/emails/job_application.html b/lms/templates/emails/job_application.html new file mode 100644 index 00000000..c7305ce9 --- /dev/null +++ b/lms/templates/emails/job_application.html @@ -0,0 +1,8 @@ +
+ {{ _("{0} has applied for the job position {1}").format(full_name, job_title) }} +
+
++ {{ _("You can find their resume attached to this email.") }} +
+ diff --git a/lms/templates/reviews.html b/lms/templates/reviews.html index 3b7f7aa1..a1063aba 100644 --- a/lms/templates/reviews.html +++ b/lms/templates/reviews.html @@ -71,7 +71,7 @@-- - - -{% endblock %} - -{% macro BreadCrumb(job) %} - -{% endmacro %} diff --git a/lms/www/jobs_openings/job.js b/lms/www/jobs_openings/job.js deleted file mode 100644 index b776adbb..00000000 --- a/lms/www/jobs_openings/job.js +++ /dev/null @@ -1,42 +0,0 @@ -frappe.ready(() => { - $("#report").click((e) => { - open_report_dialog(e); - }); - - $("#submit-report").click((e) => { - report(e); - }); -}); - -const open_report_dialog = (e) => { - e.preventDefault(); - if (frappe.session.user == "Guest") { - window.location.href = `/login?redirect-to=/job-openings/${$( - e.currentTarget - ).data("job")}`; - return; - } - $("#report-modal").modal("show"); -}; - -const report = (e) => { - frappe.call({ - method: "lms.job.doctype.job_opportunity.job_opportunity.report", - args: { - job: $(e.currentTarget).data("job"), - reason: $(".report-field").val(), - }, - callback: (data) => { - $(".report-modal").modal("hide"); - frappe.show_alert( - { - message: __( - "Thanks for informing us about this post. The admin will look into it and take an appropriate action soon." - ), - indicator: "green", - }, - 5 - ); - }, - }); -}; diff --git a/lms/www/jobs_openings/job.py b/lms/www/jobs_openings/job.py deleted file mode 100644 index d5746d3f..00000000 --- a/lms/www/jobs_openings/job.py +++ /dev/null @@ -1,18 +0,0 @@ -import frappe - - -def get_context(context): - try: - job = frappe.form_dict["job"] - except KeyError: - frappe.local.flags.redirect_location = "/job-openings" - raise frappe.Redirect - - context.job = frappe.get_doc("Job Opportunity", job) - - context.metatags = { - "title": context.job.job_title, - "image": context.job.company_logo, - "description": f"Job Posting for {context.job.job_title} by {context.job.company_name}", - "keywords": "Job Opening, Job Posting, Job Opportunity, Job Vacancy, Job, Vacancy, Opening, Opportunity, Vacancy", - } diff --git a/lms/www/lms.py b/lms/www/lms.py new file mode 100644 index 00000000..6a75ce06 --- /dev/null +++ b/lms/www/lms.py @@ -0,0 +1,178 @@ +import frappe +from frappe.utils.telemetry import capture +from frappe import _ +from bs4 import BeautifulSoup +import re + +no_cache = 1 + + +def get_context(): + app_path = frappe.form_dict.get("app_path") + context = frappe._dict() + if app_path: + context.meta = get_meta(app_path) + else: + context.meta = {} + csrf_token = frappe.sessions.get_csrf_token() + frappe.db.commit() # nosemgrep + context.csrf_token = csrf_token + if frappe.session.user != "Guest": + capture("active_site", "lms") + return context + + +def get_meta(app_path): + if app_path == "courses": + return { + "title": _("Course List"), + "image": frappe.db.get_single_value("Website Settings", "banner_image"), + "description": "This page lists all the courses published on our website", + "keywords": "All Courses, Courses, Learn", + "link": "/courses", + } + + if re.match(r"^courses/.*$", app_path): + if "new/edit" in app_path: + return { + "title": _("New Course"), + "image": frappe.db.get_single_value("Website Settings", "banner_image"), + "description": "Create a new course", + "keywords": "New Course, Create Course", + "link": "/lms/courses/new/edit", + } + course_name = app_path.split("/")[1] + course = frappe.db.get_value( + "LMS Course", + course_name, + ["title", "image", "short_introduction", "tags"], + as_dict=True, + ) + return { + "title": course.title, + "image": course.image, + "description": course.short_introduction, + "keywords": course.tags, + "link": f"/courses/{course_name}", + } + + if app_path == "batches": + return { + "title": _("Batches"), + "image": frappe.db.get_single_value("Website Settings", "banner_image"), + "description": "This page lists all the batches published on our website", + "keywords": "All Batches, Batches, Learn", + "link": "/batches", + } + if re.match(r"^batches/details/.*$", app_path): + batch_name = app_path.split("/")[2] + batch = frappe.db.get_value( + "LMS Batch", + batch_name, + ["title", "meta_image", "description", "category", "medium"], + as_dict=True, + ) + return { + "title": batch.title, + "image": batch.meta_image, + "description": batch.description, + "keywords": f"{batch.category} {batch.medium}", + "link": f"/batches/details/{batch_name}", + } + + if re.match(r"^batches/.*$", app_path): + batch_name = app_path.split("/")[1] + if "new/edit" in app_path: + return { + "title": _("New Batch"), + "image": frappe.db.get_single_value("Website Settings", "banner_image"), + "description": "Create a new batch", + "keywords": "New Batch, Create Batch", + "link": "/lms/batches/new/edit", + } + batch = frappe.db.get_value( + "LMS Batch", + batch_name, + ["title", "meta_image", "description", "category", "medium"], + as_dict=True, + ) + return { + "title": batch.title, + "image": batch.meta_image, + "description": batch.description, + "keywords": f"{batch.category} {batch.medium}", + "link": f"/batches/{batch_name}", + } + + if app_path == "job-openings": + return { + "title": _("Job Openings"), + "image": frappe.db.get_single_value("Website Settings", "banner_image"), + "description": "This page lists all the job openings published on our website", + "keywords": "Job Openings, Jobs, Vacancies", + "link": "/job-openings", + } + + if re.match(r"^job-openings/.*$", app_path): + job_opening_name = app_path.split("/")[1] + job_opening = frappe.db.get_value( + "Job Opportunity", + job_opening_name, + ["job_title", "company_logo", "company_name"], + as_dict=True, + ) + return { + "title": job_opening.job_title, + "image": job_opening.company_logo, + "description": job_opening.company_name, + "keywords": "Job Openings, Jobs, Vacancies", + "link": f"/job-openings/{job_opening_name}", + } + + if app_path == "statistics": + return { + "title": _("Statistics"), + "image": frappe.db.get_single_value("Website Settings", "banner_image"), + "description": "This page lists all the statistics of this platform", + "keywords": "Enrollment Count, Completion, Signups", + "link": "/statistics", + } + + if re.match(r"^user/.*$", app_path): + username = app_path.split("/")[1] + user = frappe.db.get_value( + "User", + { + "username": username, + }, + ["full_name", "user_image", "bio"], + as_dict=True, + ) + + soup = BeautifulSoup(user.bio, "html.parser") + user.bio = soup.get_text() + + return { + "title": user.full_name, + "image": user.user_image, + "description": user.bio, + "keywords": f"{user.full_name}, {user.bio}", + "link": f"/user/{username}", + } + + if re.match(r"^badges/.*/.*$", app_path): + badgeName = app_path.split("/")[1] + email = app_path.split("/")[2] + badge = frappe.db.get_value( + "LMS Badge", + badgeName, + ["title", "image", "description"], + as_dict=True, + ) + return { + "title": badge.title, + "image": badge.image, + "description": badge.description, + "keywords": f"{badge.title}, {badge.description}", + "link": f"/badges/{badgeName}/{email}", + } diff --git a/lms/www/macros/__init__.py b/lms/www/macros/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/lms/www/macros/common_macro.html b/lms/www/macros/common_macro.html deleted file mode 100644 index 5b59c96d..00000000 --- a/lms/www/macros/common_macro.html +++ /dev/null @@ -1,21 +0,0 @@ -{% macro MentorsSection(mentors, is_mentor, course_name) %} -- {{ BreadCrumb(job) }} - --- --- {% set company_logo = job.company_logo.replace(' ', '%20') %} - - -- - --- - {% set application_link = job.application_link if frappe.session.user != 'Guest' else '/login?redirect-to=/job-openings/' + job.name %} -{{ _(job.job_title) }}- - - -- {{ _("Apply") }} -- -{{ _("Report") }}- {% if job.owner == frappe.session.user %} - {{ _("Edit") }} - {% endif %} -Mentors
- {% for m in mentors %} --- {% endfor %} - {% if not is_mentor %} -{{m.full_name}}-Mentored {{m.get_batch_count()}} batches-- Interested to become a mentor? - - -- - {% endif %} -{% endmacro %} diff --git a/lms/www/macros/livecode.html b/lms/www/macros/livecode.html deleted file mode 100644 index 5a77fcd0..00000000 --- a/lms/www/macros/livecode.html +++ /dev/null @@ -1,127 +0,0 @@ -{% macro LiveCodeEditorLarge(name, code) %} ---{% endmacro %} - -{% macro LiveCodeEditor(name, code, reset_code, is_exercise=False, last_submitted=None) %} ------ --------- --- - ----{% endmacro %} - - - -{% macro LiveCodeEditorJS(name, code) %} - - - - - - - - - - - - -{% endmacro %} diff --git a/lms/www/people/__init__.py b/lms/www/people/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/lms/www/people/index.html b/lms/www/people/index.html deleted file mode 100644 index 0bdee36a..00000000 --- a/lms/www/people/index.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "lms/templates/lms_base.html" %} -{% block title %} -{{ _('People') }} -{% endblock %} - - -{% block page_content %} ------ - - {% if is_exercise %} - - {% if last_submitted %} - - {% endif %} - {% endif %} -- -------- --- - ----{% endblock %} diff --git a/lms/www/people/index.js b/lms/www/people/index.js deleted file mode 100644 index 0e2f2f18..00000000 --- a/lms/www/people/index.js +++ /dev/null @@ -1,61 +0,0 @@ -frappe.ready(() => { - $("#load-more").click((e) => { - search(e); - }); - - $(".close-search-empty-state").click((e) => { - close_search_empty_state(e); - }); - - $("#search-user").keyup(function () { - let timer; - clearTimeout(timer); - timer = setTimeout(() => { - search.apply(this, arguments); - }, 300); - }); -}); - -const search = (e) => { - $("#search-empty-state").addClass("hide"); - let start = $(e.currentTarget).data("start"); - let input = $("#search-user").val(); - if ($(e.currentTarget).prop("nodeName") == "INPUT") start = 0; - - frappe.call({ - method: "lms.overrides.user.search_users", - args: { - start: start, - text: input, - }, - callback: (data) => { - if ($(e.currentTarget).prop("nodeName") == "INPUT") - $(".member-parent").empty(); - - if (data.message.user_details.length) - $("#load-more").removeClass("hide"); - else $("#search-empty-state").removeClass("hide"); - - let user_details = data.message.user_details; - user_details - .replace(/&/g, "&") - .replace(/ { - $("#search-empty-state").addClass("hide"); - $("#search-user").val("").keyup(); -}; - -const update_load_more_state = (data) => { - $("#load-more").data("start", data.message.start); - $("#load-more").data("count", data.message.count); - if ($(".member-card").length == $("#load-more").data("count")) { - $("#load-more").addClass("hide"); - } -}; diff --git a/lms/www/people/index.py b/lms/www/people/index.py deleted file mode 100644 index 4fcefd8c..00000000 --- a/lms/www/people/index.py +++ /dev/null @@ -1,13 +0,0 @@ -import frappe - - -def get_context(context): - context.user_count = frappe.db.count("User", {"enabled": True}) - context.users = frappe.get_all( - "User", - filters={"enabled": True}, - fields=["name", "username", "full_name", "user_image", "headline", "looking_for_job"], - start=0, - page_length=24, - order_by="creation desc", - ) diff --git a/lms/www/profiles/__init__.py b/lms/www/profiles/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/lms/www/profiles/__pycache__/__init__.py b/lms/www/profiles/__pycache__/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/lms/www/profiles/profile.html b/lms/www/profiles/profile.html deleted file mode 100644 index 40127207..00000000 --- a/lms/www/profiles/profile.html +++ /dev/null @@ -1,424 +0,0 @@ -{% extends "templates/base.html" %} -{% block head_include %} - -{% endblock %} - - -{% block content %} -- - {% if frappe.session.user != "Guest" %} - - {% endif %} --{{ _("People") }}- - - -- {% for user in users %} - {{ widgets.MemberCard(member=user, show_course_count=False, avatar_class="avatar-large") }} - {% endfor %} -- - {% if user_count > users | length %} --- {% endif %} -- {{ _("Load More") }} --- {{ ProfileBanner(member) }} --{% endblock %} - - - -{% macro ProfileBanner(member) %} -{% set cover_image = member.cover_image if member.cover_image else "/assets/lms/images/profile-banner.png" %} -{% set enrollment = get_course_membership(member.name, member_type="Student") | length %} -{% set enrollment_suffix = _("Courses") if enrollment > 1 else _("Course") %} - --- -- - - - - ------ - {% if not read_only %} -- {{ About(member) }} - {{ WorkDetails(member) }} - {{ EducationDetails(member) }} - {{ ExternalCertification(member) }} - {{ Contact(member) }} - {{ Skills(member) }} - {{ CareerPreference(member) }} - {{ ProfileTabs(profile_tabs) }} --- {% set courses = enrolled_courses %} - {% set title = _("Enrolled Courses") %} - {% set classes = "enrolled-courses" %} - {% include "lms/templates/course_list.html" %} -- {% endif %} - - {% if courses_created | length %} -- {% set courses = courses_created %} - {% set title = _("Created Courses") %} - {% set classes = "created-courses" %} - {% include "lms/templates/course_list.html" %} -- {% endif %} - - {% if certificates | length %} -- {% include "lms/templates/certificates_section.html" %} -- {% endif %} - - {% if not read_only %} -- {% include "lms/templates/notifications.html" %} -- {% endif %} - -- {{ RoleSettings(member) }} -- -- - --{% endmacro %} - - - -{% macro CoursesMentored(member, read_only) %} -{% if member.get_mentored_courses() | length %} ----- - -{{ member.full_name }}- - {% if courses_created | length %} -{{ _("Creator") }}- {% endif %} - - {% if member.looking_for_job %} -{{ _("Open Network") }}- {% endif %} - - {% if frappe.session.user == member.email %} - - {% endif %} ---{% endif %} -{% endmacro %} - - - -{% macro ProfileTabs(profile_tabs) %} -{{ _("Courses Mentored") }}-- {% for course in member.get_mentored_courses() %} - {{ widgets.CourseCard(course=course, read_only=read_only) }} - {% endfor %} --- {% for tab in profile_tabs %} - {% set slug = title.lower().replace(" ", "-") %} --{% endmacro %} - - - -{% macro RoleSettings(member) %} - {% if has_course_moderator_role() %} --- {% endfor %} -- {{ tab.render() }} ---- {% endif %} -{% endmacro %} - - - -{% macro About(member) %} ---{{ _("Role Settings") }}-- - --- {% if member.bio %} - {{ member.bio }} - {% else %} - {{ _("Hey, my name is ") }} {{ member.full_name }} - {% endif %} --{% endmacro %} - - - -{% macro WorkPreference(member) %} -{{ _("Work Preference") }}-{{ member.attire }}-{{ member.collaboration }}-{{ member.role }}-{{ member.location_preference }}-{{ member.time }}-{{ member.company_type }}-{% endmacro %} - - - -{% macro CareerPreference(member) %} - {% if member.preferred_functions or member.preferred_industries or member.preferred_location or member.dream_companies %} -- {{ _("Career Preference") }} --- - {% if member.preferred_functions | length %} -- {% endif %} -{% endmacro %} - - - -{% macro Contact(member) %} - {% if member.linkedin or member.medium or member.github %} -- {{ _("Preferred Functions:") }} - {% for function in member.preferred_functions %} -- {% endif %} - - {% if member.preferred_industries | length %} -{{ function.function }}- {% endfor %} -- {{ _("Preferred Industries:") }} - {% for industry in member.preferred_industries %} -- {% endif %} - - {% if member.preferred_location %} -{{ industry.industry }}- {% endfor %} -- {{ _("Preferred Locations:") }} -- {% endif %} - - {% if member.dream_companies %} -{{ member.preferred_location }}-- {{ _("Dream Companies:") }} -- {% endif %} - -{{ member.dream_companies }}-{{ _("Contact") }}-- {% if member.linkedin %} - {% set linkedin = member.linkedin[:-1] if member.linkedin[-1] == "/" else member.linkedin %} - -- {% endif %} -{% endmacro %} - - - -{% macro Skills(member) %} - {% if member.skill | length %} -{{ linkedin.split("/")[-1] }} - - {% endif %} - - {% if member.medium %} - -
{{ member.medium.split("/")[-1] }} - - {% endif %} - - {% if member.github %} - -
{{ member.github.split("/")[-1] }} - - {% endif %} - -
{{ _("Skills")}}-- {% for skill in member.skill %} -- {% endif %} -{% endmacro %} - - - -{% macro EducationDetails(member) %} - {% if member.education %} -{{ skill.skill_name }}- {% endfor %} -{{ _("Education") }}-- {% for edu in member.education %} -- {% endif %} -{% endmacro %} - - -{% macro WorkDetails(member) %} - {% set work_details = member.work_experience + member.internship %} - - {% if work_details | length %} --- {% endfor %} -{{ edu.institution_name }}-{{ edu.degree_type }} {{ edu.major }} - {% if not member.hide_private %} - - {% if edu.grade %} {{ edu.grade }} {% endif %} - {% endif %} -- -- {% if edu.start_date %} - {{ frappe.utils.format_date(edu.start_date, "MMM YYYY") }} - - {% endif %} - {{ frappe.utils.format_date(edu.end_date, "MMM YYYY") }} --{{ edu.location }}-{{ _("Work Experience") }}-- - {% for work in work_details %} -- {% endif %} -{% endmacro %} - - - -{% macro ExternalCertification(member) %} - {% if member.certification %} --- {% endfor %} - -{{ work.title }}-{{ work.company }}-- {{ frappe.utils.format_date(work.from_date, "MMM YYYY") }} - - {% if work.to_date %} {{ frappe.utils.format_date(work.to_date, "MMM YYYY") }} - {% else %} Present {% endif %} -- -{{ work.location }}- - {% if work.description %} -- {{ work.description }} -- {% endif %} -{{ _("External Certification") }}-- {% for cert in member.certification %} -- {% endif %} -{% endmacro %} diff --git a/lms/www/profiles/profile.js b/lms/www/profiles/profile.js deleted file mode 100644 index 7a5d90f3..00000000 --- a/lms/www/profiles/profile.js +++ /dev/null @@ -1,40 +0,0 @@ -frappe.ready(() => { - make_profile_active_in_navbar(); - - $(".role").change((e) => { - save_role(e); - }); -}); - -const make_profile_active_in_navbar = () => { - let member_name = $(".profile-name").data("name"); - if (member_name == frappe.session.user) { - setTimeout(() => { - let link_array = $(".nav-link").filter( - (i, elem) => $(elem).text().trim() === "My Profile" - ); - link_array.length && $(link_array[0]).addClass("active"); - }, 0); - } -}; - -const save_role = (e) => { - let member_name = $(".profile-name").data("name"); - let role = $(e.currentTarget).children("input"); - frappe.call({ - method: "lms.overrides.user.save_role", - args: { - user: member_name, - role: role.data("role"), - value: role.prop("checked") ? 1 : 0, - }, - callback: (data) => { - if (data.message) { - frappe.show_alert({ - message: __("Saved"), - indicator: "green", - }); - } - }, - }); -}; diff --git a/lms/www/profiles/profile.py b/lms/www/profiles/profile.py deleted file mode 100644 index 4fef8a77..00000000 --- a/lms/www/profiles/profile.py +++ /dev/null @@ -1,58 +0,0 @@ -import frappe - -from lms.lms.utils import get_lesson_index, get_certificates -from lms.page_renderers import get_profile_url_prefix -from lms.overrides.user import get_authored_courses, get_enrolled_courses - - -def get_context(context): - context.no_cache = 1 - - try: - username = frappe.form_dict["username"] - except KeyError: - username = frappe.db.get_value("User", frappe.session.user, ["username"]) - if username: - frappe.local.flags.redirect_location = get_profile_url_prefix() + username - raise frappe.Redirect - - try: - context.member = frappe.get_doc("User", {"username": username}) - context.courses_created = get_authored_courses(context.member.name, True) - context.enrolled_courses = ( - get_enrolled_courses()["in_progress"] + get_enrolled_courses()["completed"] - ) - context.read_only = frappe.session.user != context.member.name - context.certificates = get_certificates(context.member.name) - except Exception: - context.template = "www/404.html" - return - - context.profile_tabs = get_profile_tabs(context.member) - context.notifications = get_notifications() - - -def get_profile_tabs(user): - """Returns the enabled ProfileTab objects. - - Each ProfileTab is rendered as a tab on the profile page and the - they are specified as profile_tabs hook. - """ - tabs = frappe.get_hooks("profile_tabs") or [] - return [frappe.get_attr(tab)(user) for tab in tabs] - - -def get_notifications(): - notifications = frappe.get_all( - "Notification Log", - {"document_type": "Course Lesson", "for_user": frappe.session.user}, - ["subject", "creation", "from_user", "document_name"], - ) - - for notification in notifications: - course = frappe.db.get_value("Course Lesson", notification.document_name, "course") - notification.url = ( - f"/courses/{course}/learn/{get_lesson_index(notification.document_name)}" - ) - - return notifications diff --git a/lms/www/quiz_result/__init__.py b/lms/www/quiz_result/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/lms/www/quiz_result/quiz_result.html b/lms/www/quiz_result/quiz_result.html deleted file mode 100644 index b992110c..00000000 --- a/lms/www/quiz_result/quiz_result.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "templates/base.html" %} -{% block title %} - {{ _("Quiz Submission") }} -{% endblock %} - - -{% block content %} -- -- {% endfor %} -{{ cert.certification_name }}-{{ cert.organization }}- -- {{ frappe.utils.format_date(cert.issue_date, "MMM YYYY") }} - {% if cert.expiration_date %} - - {{ frappe.utils.format_date(cert.expiration_date, "MMM YYYY") }} - {% endif %} -- - {% if cert.description %} -- {{ cert.description }} -- {% endif %} - ---{% endblock %} diff --git a/lms/www/quiz_result/quiz_result.py b/lms/www/quiz_result/quiz_result.py deleted file mode 100644 index 62e67400..00000000 --- a/lms/www/quiz_result/quiz_result.py +++ /dev/null @@ -1,26 +0,0 @@ -import frappe - - -def get_context(context): - context.no_cache = 1 - name = frappe.form_dict["subname"] - - context.submission = frappe.db.get_value( - "LMS Quiz Submission", name, ["name", "quiz"], as_dict=1 - ) - - questions = frappe.get_all( - "LMS Quiz Result", {"parent": name}, ["question", "is_correct", "answer"] - ) - - for question in questions: - options = frappe.db.get_value( - "LMS Quiz Question", - {"question": question.question}, - ["option_1", "option_2", "option_3", "option_4"], - as_dict=1, - ) - question.update(options) - question.answer = question.answer.split(",") - - context.questions = questions diff --git a/lms/www/quiz_submission/__init__.py b/lms/www/quiz_submission/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/lms/www/quiz_submission/quiz_submission.html b/lms/www/quiz_submission/quiz_submission.html deleted file mode 100644 index 38741f38..00000000 --- a/lms/www/quiz_submission/quiz_submission.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends "lms/templates/lms_base.html" %} -{% block title %} - {{ quiz.title }} -{% endblock %} - -{% block page_content %} ------ {{ _("Quiz Submission") }} -- {% for question in questions %} -- {{ question.question }} -- {{ question.is_correct }} - {{ question.answer }} - {% for i in range(1,5) %} - {% set num = frappe.utils.cstr(i) %} - {% set option = question["option_" + num] %} - {% if question["option_" + num] %} -- {{ question["option_" + num] }} -- {% endif %} - {% endfor %} - {% endfor %} -- {{ Header() }} - -{% endblock %} - -{% macro Header() %} -- {{ SubmissionForm(quiz) }} --- -{% endmacro %} - -{% macro SubmissionForm(quiz) %} - {% include("lms/templates/quiz/quiz.html") %} -{% endmacro %} - -{% block script %} - {{ super() }} - -{% endblock %} \ No newline at end of file diff --git a/lms/www/quiz_submission/quiz_submission.py b/lms/www/quiz_submission/quiz_submission.py deleted file mode 100644 index 719d5886..00000000 --- a/lms/www/quiz_submission/quiz_submission.py +++ /dev/null @@ -1,81 +0,0 @@ -import frappe -from lms.lms.utils import has_course_moderator_role -from frappe import _ - - -def get_context(context): - context.no_cache = 1 - - if frappe.session.user == "Guest": - raise frappe.PermissionError(_("You don't have permission to access this page.")) - - context.is_moderator = has_course_moderator_role() - submission = frappe.form_dict["submission"] - quiz_name = frappe.form_dict["quiz"] - - quiz = frappe.db.get_value( - "LMS Quiz", - quiz_name, - [ - "name", - "title", - "max_attempts", - "show_answers", - "show_submission_history", - "passing_percentage", - ], - as_dict=True, - ) - quiz.questions = [] - fields = ["name", "question", "type", "multiple"] - for num in range(1, 5): - fields.append(f"option_{num}") - fields.append(f"is_correct_{num}") - fields.append(f"explanation_{num}") - fields.append(f"possibility_{num}") - - questions = frappe.get_all( - "LMS Quiz Question", - filters={"parent": quiz.name}, - fields=["question", "marks"], - order_by="idx", - ) - - for question in questions: - details = frappe.db.get_value("LMS Question", question.question, fields, as_dict=1) - details["marks"] = question.marks - quiz.questions.append(details) - context.quiz = quiz - - context.all_submissions = frappe.get_all( - "LMS Quiz Submission", - { - "quiz": context.quiz.name, - "member": frappe.session.user, - }, - ["name", "score", "creation"], - order_by="creation desc", - ) - - context.no_of_attempts = len(context.all_submissions) or 0 - - if submission == "new-submission": - context.submission = frappe._dict() - context.hide_quiz = False - else: - context.submission = frappe.db.get_value( - "LMS Quiz Submission", - submission, - ["name", "score", "member", "member_name"], - as_dict=True, - ) - - if not context.is_moderator and frappe.session.user != context.submission.member: - raise frappe.PermissionError(_("You don't have permission to access this page.")) - - if not context.quiz or not context.submission: - raise frappe.PermissionError(_("Invalid Submission URL")) - - context.hide_quiz = ( - context.is_moderator or context.submission.member != frappe.session.user - ) diff --git a/lms/www/statistics/__init__.py b/lms/www/statistics/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/lms/www/statistics/index.html b/lms/www/statistics/index.html deleted file mode 100644 index 27881531..00000000 --- a/lms/www/statistics/index.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "templates/base.html" %} - - -{% block title %} -{{ _("Statistics") }} -{% endblock %} - - -{% block content %} ------- - ---- {{ quiz.title }} --- - {{ _("All Batches") }} - --- -
- ----{% endblock %} diff --git a/lms/www/utils.py b/lms/www/utils.py index aa4a1356..fa9fd1a1 100644 --- a/lms/www/utils.py +++ b/lms/www/utils.py @@ -61,89 +61,6 @@ def get_current_lesson_details(lesson_number, context, is_edit=False): return lesson_info -def get_assessments(batch, member=None): - if not member: - member = frappe.session.user - - assessments = frappe.get_all( - "LMS Assessment", - {"parent": batch}, - ["name", "assessment_type", "assessment_name"], - ) - - for assessment in assessments: - if assessment.assessment_type == "LMS Assignment": - assessment = get_assignment_details(assessment, member) - - elif assessment.assessment_type == "LMS Quiz": - assessment = get_quiz_details(assessment, member) - - return assessments - - -def get_assignment_details(assessment, member): - assessment.title = frappe.db.get_value( - "LMS Assignment", assessment.assessment_name, "title" - ) - - existing_submission = frappe.db.exists( - { - "doctype": "LMS Assignment Submission", - "member": member, - "assignment": assessment.assessment_name, - } - ) - assessment.completed = False - if existing_submission: - assessment.submission = frappe.db.get_value( - "LMS Assignment Submission", - existing_submission, - ["name", "status", "comments"], - as_dict=True, - ) - assessment.completed = True - - assessment.edit_url = f"/assignments/{assessment.assessment_name}" - submission_name = existing_submission if existing_submission else "new-submission" - assessment.url = ( - f"/assignment-submission/{assessment.assessment_name}/{submission_name}" - ) - - return assessment - - -def get_quiz_details(assessment, member): - assessment_details = frappe.db.get_value( - "LMS Quiz", assessment.assessment_name, ["title", "passing_percentage"], as_dict=1 - ) - assessment.title = assessment_details.title - - existing_submission = frappe.get_all( - "LMS Quiz Submission", - { - "member": member, - "quiz": assessment.assessment_name, - }, - ["name", "score", "percentage"], - order_by="percentage desc", - ) - - if len(existing_submission): - assessment.submission = existing_submission[0] - - assessment.completed = False - if assessment.submission: - assessment.completed = True - - assessment.edit_url = f"/quizzes/{assessment.assessment_name}" - submission_name = ( - existing_submission[0].name if len(existing_submission) else "new-submission" - ) - assessment.url = f"/quiz-submission/{assessment.assessment_name}/{submission_name}" - - return assessment - - def is_student(batch, member=None): if not member: member = frappe.session.user diff --git a/package.json b/package.json index efae27f8..01084562 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,17 @@ "name": "frappe_lms", "version": "1.0.0", "description": "Easy to use, open-source, Learning Management System", + "workspaces1": [ + "frappe-ui", + "frontend" + ], "scripts": { - "test-local": "cypress open --e2e --browser chrome" + "test-local": "cypress open --e2e --browser chrome", + "postinstall": "cd frontend && yarn install --check-files", + "dev": "cd frontend && yarn dev", + "build": "cd frontend && yarn build" }, + "private": true, "repository": { "type": "git", "url": "git+https://github.com/frappe/lms.git" @@ -14,5 +22,9 @@ "bugs": { "url": "https://github.com/frappe/lms/issues" }, - "homepage": "https://github.com/frappe/lms#readme" + "homepage": "https://github.com/frappe/lms#readme", + "devDependencies": { + "cypress": "^13.9.0", + "cypress-file-upload": "^5.0.8" + } } diff --git a/pyproject.toml b/pyproject.toml index e63b6091..0449e77e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,8 @@ dependencies = [ "beautifulsoup4~=4.12.2", "lxml~=4.9.3", "cairocffi~=1.6.1", - "razorpay~=1.4.1" + "razorpay~=1.4.1", + "fuzzywuzzy~=0.18.0", ] [build-system] diff --git a/lms/www/classes/__init__.py b/yarn-error.log similarity index 100% rename from lms/www/classes/__init__.py rename to yarn-error.log diff --git a/yarn.lock b/yarn.lock index fb57ccd1..8256ff13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,3 +2,1188 @@ # yarn lockfile v1 +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cypress/request@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "6.10.4" + safe-buffer "^5.1.2" + tough-cookie "^4.1.3" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@types/node@*": + version "20.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" + integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== + dependencies: + undici-types "~5.26.4" + +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" + integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +cachedir@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@~0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cypress-file-upload@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz#d8824cbeaab798e44be8009769f9a6c9daa1b4a1" + integrity sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g== + +cypress@^13.9.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.9.0.tgz#b529cfa8f8c39ba163ed0501a25bb5b09c143652" + integrity sha512-atNjmYfHsvTuCaxTxLZr9xGoHz53LLui3266WWxXJHY7+N6OdwJdg/feEa3T+buez9dmUXHT1izCOklqG82uCQ== + dependencies: + "@cypress/request" "^3.0.0" + "@cypress/xvfb" "^1.2.4" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.7.1" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^6.2.1" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.4" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.1" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.8" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + process "^0.11.10" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.5.3" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +dayjs@^1.10.4: + version "1.11.11" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" + integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.5.3: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sshpk@^1.14.1: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +throttleit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@~0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +tough-cookie@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0"--- {{ _("Statistics") }} -- {% set published_courses = True %} - {% set total_signups = True %} - {% set enrollment_count = True %} - {% set course_completion = True %} - {% set lesson_completion = True %} - {% set quiz_completion = True %} - -- {% include "lms/templates/statistics.html" %} - -- --- -- --- ----- --- --