Compare commits

...

55 Commits

Author SHA1 Message Date
Frappe PR Bot
fb3d8e4f7d chore(release): Bumped to Version 2.11.0 2024-11-13 06:14:53 +00:00
Jannat Patel
0c6029cbe8 Merge pull request #1118 from pateljannat/issues-49
fix: misc issues
2024-11-12 12:12:24 +05:30
Jannat Patel
a643e9ae83 Merge pull request #1102 from iamejaaz/make-tab-sticky
feat: add required attribute and make tab sticky in batches
2024-11-12 12:03:47 +05:30
Jannat Patel
08ac3948c3 Merge pull request #1112 from iamejaaz/bio-rich-text
feat: rich text editor in bio
2024-11-12 11:57:10 +05:30
Jannat Patel
78d289b9c0 Merge pull request #1117 from frappe/l10n_develop2
chore: sync translations from crowdin
2024-11-12 11:56:40 +05:30
Jannat Patel
3473bdb527 fix: misc issues 2024-11-12 11:51:02 +05:30
Jannat Patel
a7f8835222 chore: Esperanto translations 2024-11-11 20:53:46 +05:30
Jannat Patel
d6441955fc chore: Bosnian translations 2024-11-11 20:53:45 +05:30
Jannat Patel
67d265e864 chore: Persian translations 2024-11-11 20:53:43 +05:30
Jannat Patel
17031f1df0 chore: Chinese Simplified translations 2024-11-11 20:53:42 +05:30
Jannat Patel
234a24baa2 chore: Turkish translations 2024-11-11 20:53:40 +05:30
Jannat Patel
9a58f4688b chore: Swedish translations 2024-11-11 20:53:39 +05:30
Jannat Patel
87c1c928ba chore: Russian translations 2024-11-11 20:53:37 +05:30
Jannat Patel
493b8297ea chore: Polish translations 2024-11-11 20:53:36 +05:30
Jannat Patel
4d16602190 chore: Hungarian translations 2024-11-11 20:53:35 +05:30
Jannat Patel
89222b23c3 chore: German translations 2024-11-11 20:53:33 +05:30
Jannat Patel
89a181c7d5 chore: Arabic translations 2024-11-11 20:53:32 +05:30
Jannat Patel
c0aecf30c1 chore: Spanish translations 2024-11-11 20:53:30 +05:30
Jannat Patel
fc8ef21802 chore: French translations 2024-11-11 20:53:29 +05:30
Jannat Patel
c45da4313e Merge pull request #1106 from frappe/pot_develop_2024-11-08
chore: update POT file
2024-11-11 09:52:20 +05:30
Jannat Patel
3a1a843747 Merge pull request #1110 from iamejaaz/error-on-branding-api
fix: 500 error on get_branding api call
2024-11-11 09:52:03 +05:30
Ejaaz Khan
c51e7b0037 feat: rich text editor in bio 2024-11-10 19:49:10 +05:30
Ejaaz Khan
000d9dbcef fix: 500 error on get_branding api call 2024-11-10 15:40:51 +05:30
Ejaaz Khan
0dcfd7e482 feat: add a required indicator to subject field 2024-11-09 00:18:10 +05:30
Ejaaz Khan
e933012a34 Merge branch 'develop' into make-tab-sticky 2024-11-09 00:08:23 +05:30
frappe-pr-bot
71db3ae6da chore: update POT file 2024-11-08 16:04:38 +00:00
Jannat Patel
c5f091fae8 Merge pull request #1105 from pateljannat/issues-48
fix: show only courses with evaluator for batch evaluation
2024-11-08 15:04:42 +05:30
Jannat Patel
4e61d569ac fix: ignore user type for instructor field in course and batch form 2024-11-08 14:57:11 +05:30
Jannat Patel
2d5c76e106 fix: show only courses with evaluator for batch evaluation 2024-11-08 14:52:10 +05:30
Ejaaz Khan
2e0abad61c feat: add required and make tab sticky in batches 2024-11-07 10:55:10 +05:30
Jannat Patel
3ea52a4e41 Merge pull request #1101 from frappe/l10n_develop2
chore: sync translations from crowdin
2024-11-07 09:55:40 +05:30
Jannat Patel
c05e253b8d chore: Spanish translations 2024-11-06 20:25:41 +05:30
Jannat Patel
08b2063e45 Merge pull request #1100 from pateljannat/issues-47
fix: misc issues
2024-11-06 20:00:22 +05:30
Jannat Patel
4a8c8185c2 fix: condition to recalculate percentage 2024-11-06 19:46:35 +05:30
Jannat Patel
74ed7b3160 style: fixed formatting 2024-11-06 19:25:17 +05:30
Jannat Patel
38e6e4345f fix: misc issues 2024-11-06 19:22:20 +05:30
Jannat Patel
8004982e2e Merge pull request #1098 from FahidLatheef/develop
fix: removed unnecessary condition which resets show_answers to False
2024-11-06 15:30:24 +05:30
Jannat Patel
e6a532a870 Merge pull request #1096 from frappe/l10n_develop2
chore: sync translations from crowdin
2024-11-06 15:18:53 +05:30
Jannat Patel
f90465210e Merge pull request #1092 from 0xflotus/patch-1
chore: added some german translations
2024-11-06 15:12:18 +05:30
Fahid Latheef Alungal
619262aa97 fix: removed unnecessary condition which resets show_answers to False 2024-11-06 03:20:30 +05:30
Jannat Patel
693d2942aa chore: Esperanto translations 2024-11-05 20:04:12 +05:30
Jannat Patel
b4cf62920c chore: Bosnian translations 2024-11-05 20:04:10 +05:30
Jannat Patel
03636d6930 chore: Persian translations 2024-11-05 20:04:08 +05:30
Jannat Patel
7c1e1c86c7 chore: Chinese Simplified translations 2024-11-05 20:04:07 +05:30
Jannat Patel
8a5eceaf05 chore: Turkish translations 2024-11-05 20:04:06 +05:30
Jannat Patel
720425d1fb chore: Swedish translations 2024-11-05 20:04:04 +05:30
Jannat Patel
1f105b9ae5 chore: Russian translations 2024-11-05 20:04:02 +05:30
Jannat Patel
d43442be5c chore: Polish translations 2024-11-05 20:04:00 +05:30
Jannat Patel
3360b114b4 chore: Hungarian translations 2024-11-05 20:03:59 +05:30
Jannat Patel
94835b4117 chore: German translations 2024-11-05 20:03:57 +05:30
Jannat Patel
e6ed0b21e5 chore: Arabic translations 2024-11-05 20:03:56 +05:30
Jannat Patel
37db021682 chore: Spanish translations 2024-11-05 20:03:54 +05:30
Jannat Patel
6014a5ccce chore: French translations 2024-11-05 20:03:53 +05:30
0xflotus
c07207b564 Merge branch 'develop' into patch-1 2024-11-05 15:18:12 +01:00
0xflotus
da71fb2c23 chore: added some german translations 2024-10-31 11:21:42 +01:00
54 changed files with 3446 additions and 2614 deletions

View File

@@ -2,6 +2,7 @@
<div class="space-y-1.5"> <div class="space-y-1.5">
<label class="block" :class="labelClasses" v-if="attrs.label"> <label class="block" :class="labelClasses" v-if="attrs.label">
{{ attrs.label }} {{ attrs.label }}
<span class="text-red-500" v-if="attrs.required">*</span>
</label> </label>
<Autocomplete <Autocomplete
ref="autocomplete" ref="autocomplete"

View File

@@ -10,13 +10,13 @@
:style="{ backgroundImage: 'url(\'' + encodeURI(course.image) + '\')' }" :style="{ backgroundImage: 'url(\'' + encodeURI(course.image) + '\')' }"
> >
<div <div
class="flex items-center flex-wrap space-y-1 space-x-1 relative top-4 px-2 w-fit" class="flex items-center flex-wrap space-x-1 relative top-4 px-2 w-fit"
> >
<Badge v-if="course.featured" variant="subtle" theme="green" size="md"> <Badge v-if="course.featured" variant="subtle" theme="green" size="md">
{{ __('Featured') }} {{ __('Featured') }}
</Badge> </Badge>
<Badge <Badge
variant="outline" variant="subtle"
theme="gray" theme="gray"
size="md" size="md"
v-for="tag in course.tags" v-for="tag in course.tags"

View File

@@ -46,6 +46,7 @@
{{ __('Start') }} {{ __('Start') }}
</a> </a>
<a <a
v-if="cls.date <= dayjs().format('YYYY-MM-DD')"
:href="cls.join_url" :href="cls.join_url"
target="_blank" target="_blank"
class="w-full cursor-pointer inline-flex items-center justify-center gap-2 transition-colors focus:outline-none text-gray-800 bg-gray-100 hover:bg-gray-200 active:bg-gray-300 focus-visible:ring focus-visible:ring-gray-400 h-7 text-base px-2 rounded" class="w-full cursor-pointer inline-flex items-center justify-center gap-2 transition-colors focus:outline-none text-gray-800 bg-gray-100 hover:bg-gray-200 active:bg-gray-300 focus-visible:ring focus-visible:ring-gray-400 h-7 text-base px-2 rounded"

View File

@@ -18,6 +18,7 @@
<div class=""> <div class="">
<div class="mb-1.5 text-sm text-gray-600"> <div class="mb-1.5 text-sm text-gray-600">
{{ __('Subject') }} {{ __('Subject') }}
<span class="text-red-500">*</span>
</div> </div>
<Input type="text" v-model="announcement.subject" /> <Input type="text" v-model="announcement.subject" />
</div> </div>

View File

@@ -14,7 +14,12 @@
}" }"
> >
<template #body-content> <template #body-content>
<Link doctype="LMS Course" v-model="course" :label="__('Course')" /> <Link
doctype="LMS Course"
v-model="course"
:label="__('Course')"
:required="true"
/>
<Link <Link
doctype="Course Evaluator" doctype="Course Evaluator"
v-model="evaluator" v-model="evaluator"

View File

@@ -20,6 +20,7 @@
label="Title" label="Title"
v-model="chapter.title" v-model="chapter.title"
class="mb-4" class="mb-4"
:required="true"
/> />
</template> </template>
</Dialog> </Dialog>

View File

@@ -69,7 +69,18 @@
:label="__('Headline')" :label="__('Headline')"
class="mb-4" class="mb-4"
/> />
<FormControl type="textarea" v-model="profile.bio" :label="__('Bio')" />
<div class="mb-4">
<div class="mb-1.5 text-sm text-gray-600">
{{ __('Bio') }}
</div>
<TextEditor
:fixedMenu="true"
@change="(val) => (profile.bio = val)"
:content="profile.bio"
editorClass="prose-sm py-2 px-2 min-h-[200px] border-gray-300 hover:border-gray-400 rounded-md bg-gray-200"
/>
</div>
</div> </div>
</template> </template>
</Dialog> </Dialog>
@@ -81,6 +92,7 @@ import {
FileUploader, FileUploader,
Button, Button,
createResource, createResource,
TextEditor,
} from 'frappe-ui' } from 'frappe-ui'
import { reactive, watch, defineModel } from 'vue' import { reactive, watch, defineModel } from 'vue'
import { FileText, X } from 'lucide-vue-next' import { FileText, X } from 'lucide-vue-next'

View File

@@ -154,10 +154,12 @@ function submitEvaluation(close) {
const getCourses = () => { const getCourses = () => {
let courses = [] let courses = []
for (const course of props.courses) { for (const course of props.courses) {
courses.push({ if (course.evaluator) {
label: course.title, courses.push({
value: course.course, label: course.title,
}) value: course.course,
})
}
} }
return courses return courses
} }

View File

@@ -22,6 +22,7 @@
v-model="liveClass.title" v-model="liveClass.title"
:label="__('Title')" :label="__('Title')"
class="mb-4" class="mb-4"
:required="true"
/> />
<Tooltip <Tooltip
:text=" :text="
@@ -35,6 +36,7 @@
type="time" type="time"
:label="__('Time')" :label="__('Time')"
class="mb-4" class="mb-4"
:required="true"
/> />
</Tooltip> </Tooltip>
<FormControl <FormControl
@@ -42,6 +44,7 @@
type="select" type="select"
:options="getTimezoneOptions()" :options="getTimezoneOptions()"
:label="__('Timezone')" :label="__('Timezone')"
:required="true"
/> />
</div> </div>
<div> <div>
@@ -50,6 +53,7 @@
type="date" type="date"
class="mb-4" class="mb-4"
:label="__('Date')" :label="__('Date')"
:required="true"
/> />
<Tooltip :text="__('Duration of the live class in minutes')"> <Tooltip :text="__('Duration of the live class in minutes')">
<FormControl <FormControl
@@ -57,6 +61,7 @@
v-model="liveClass.duration" v-model="liveClass.duration"
:label="__('Duration')" :label="__('Duration')"
class="mb-4" class="mb-4"
:required="true"
/> />
</Tooltip> </Tooltip>
<FormControl <FormControl

View File

@@ -4,6 +4,7 @@
@timeupdate="updateTime" @timeupdate="updateTime"
@ended="videoEnded" @ended="videoEnded"
@click="togglePlay" @click="togglePlay"
oncontextmenu="return false"
class="rounded-lg border border-gray-100 group cursor-pointer" class="rounded-lg border border-gray-100 group cursor-pointer"
ref="videoRef" ref="videoRef"
> >

View File

@@ -15,7 +15,11 @@
</header> </header>
<div v-if="batch.data" class="grid grid-cols-[70%,30%] h-screen"> <div v-if="batch.data" class="grid grid-cols-[70%,30%] h-screen">
<div class="border-r-2"> <div class="border-r-2">
<Tabs v-model="tabIndex" :tabs="tabs" tablistClass="overflow-y-hidden"> <Tabs
v-model="tabIndex"
:tabs="tabs"
tablistClass="overflow-y-hidden sticky top-11 bg-white z-10"
>
<template #tab="{ tab, selected }" class="overflow-x-hidden"> <template #tab="{ tab, selected }" class="overflow-x-hidden">
<div> <div>
<button <button

View File

@@ -15,7 +15,11 @@
</div> </div>
<div class="grid grid-cols-2 gap-10 mb-4 space-y-2"> <div class="grid grid-cols-2 gap-10 mb-4 space-y-2">
<div> <div>
<FormControl v-model="batch.title" :label="__('Title')" /> <FormControl
v-model="batch.title"
:label="__('Title')"
:required="true"
/>
</div> </div>
<div class="flex flex-col space-y-2"> <div class="flex flex-col space-y-2">
<FormControl <FormControl
@@ -83,6 +87,8 @@
v-model="instructors" v-model="instructors"
doctype="User" doctype="User"
:label="__('Instructors')" :label="__('Instructors')"
:required="true"
:filters="{ ignore_user_type: 1 }"
/> />
<div class="mb-4"> <div class="mb-4">
<FormControl <FormControl
@@ -91,10 +97,12 @@
type="textarea" type="textarea"
class="my-4" class="my-4"
:placeholder="__('Short description of the batch')" :placeholder="__('Short description of the batch')"
:required="true"
/> />
<div> <div>
<label class="block text-sm text-gray-600 mb-1"> <label class="block text-sm text-gray-600 mb-1">
{{ __('Batch Details') }} {{ __('Batch Details') }}
<span class="text-red-500">*</span>
</label> </label>
<TextEditor <TextEditor
:content="batch.batch_details" :content="batch.batch_details"
@@ -116,12 +124,14 @@
:label="__('Start Date')" :label="__('Start Date')"
type="date" type="date"
class="mb-4" class="mb-4"
:required="true"
/> />
<FormControl <FormControl
v-model="batch.end_date" v-model="batch.end_date"
:label="__('End Date')" :label="__('End Date')"
type="date" type="date"
class="mb-4" class="mb-4"
:required="true"
/> />
</div> </div>
<div> <div>
@@ -130,12 +140,14 @@
:label="__('Start Time')" :label="__('Start Time')"
type="time" type="time"
class="mb-4" class="mb-4"
:required="true"
/> />
<FormControl <FormControl
v-model="batch.end_time" v-model="batch.end_time"
:label="__('End Time')" :label="__('End Time')"
type="time" type="time"
class="mb-4" class="mb-4"
:required="true"
/> />
<FormControl <FormControl
v-model="batch.timezone" v-model="batch.timezone"
@@ -143,6 +155,7 @@
type="text" type="text"
:placeholder="__('Example: IST (+5:30)')" :placeholder="__('Example: IST (+5:30)')"
class="mb-4" class="mb-4"
:required="true"
/> />
</div> </div>
</div> </div>

View File

@@ -67,7 +67,7 @@
<CourseCardOverlay :course="course" class="md:hidden mb-4" /> <CourseCardOverlay :course="course" class="md:hidden mb-4" />
<div <div
v-html="course.data.description" v-html="course.data.description"
class="course-description" class="ProseMirror prose prose-table:table-fixed prose-td:p-2 prose-th:p-2 prose-td:border prose-th:border prose-td:border-gray-300 prose-th:border-gray-300 prose-td:relative prose-th:relative prose-th:bg-gray-100 prose-sm max-w-none !whitespace-normal"
></div> ></div>
<div class="mt-10"> <div class="mt-10">
<CourseOutline :courseName="course.data.name" :showOutline="true" /> <CourseOutline :courseName="course.data.name" :showOutline="true" />
@@ -131,26 +131,6 @@ const pageMeta = computed(() => {
updateDocumentTitle(pageMeta) updateDocumentTitle(pageMeta)
</script> </script>
<style> <style>
.course-description p {
margin-bottom: 1rem;
line-height: 1.7;
}
.course-description li {
line-height: 1.7;
}
.course-description ol {
list-style: auto;
margin: revert;
padding: revert;
}
.course-description ul {
list-style: disc;
margin: revert;
padding: revert;
}
.avatar-group { .avatar-group {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;

View File

@@ -7,6 +7,14 @@
> >
<Breadcrumbs class="h-7" :items="breadcrumbs" /> <Breadcrumbs class="h-7" :items="breadcrumbs" />
<div class="flex items-center mt-3 md:mt-0"> <div class="flex items-center mt-3 md:mt-0">
<Button v-if="courseResource.data?.name" @click="trashCourse()">
<template #prefix>
<Trash2 class="w-4 h-4 stroke-1.5" />
</template>
<span>
{{ __('Delete') }}
</span>
</Button>
<Button variant="solid" @click="submitCourse()" class="ml-2"> <Button variant="solid" @click="submitCourse()" class="ml-2">
<span> <span>
{{ __('Save') }} {{ __('Save') }}
@@ -144,6 +152,7 @@
v-model="instructors" v-model="instructors"
doctype="User" doctype="User"
:label="__('Instructors')" :label="__('Instructors')"
:filters="{ ignore_user_type: 1 }"
:required="true" :required="true"
/> />
</div> </div>
@@ -247,10 +256,11 @@ import {
ref, ref,
reactive, reactive,
watch, watch,
getCurrentInstance,
} from 'vue' } from 'vue'
import { convertToTitleCase, showToast, updateDocumentTitle } from '@/utils' import { showToast, updateDocumentTitle } from '@/utils'
import Link from '@/components/Controls/Link.vue' import Link from '@/components/Controls/Link.vue'
import { FileText, Image, X } from 'lucide-vue-next' import { Image, Trash2, X } from 'lucide-vue-next'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import CourseOutline from '@/components/CourseOutline.vue' import CourseOutline from '@/components/CourseOutline.vue'
import MultiSelect from '@/components/Controls/MultiSelect.vue' import MultiSelect from '@/components/Controls/MultiSelect.vue'
@@ -262,6 +272,8 @@ const newTag = ref('')
const router = useRouter() const router = useRouter()
const instructors = ref([]) const instructors = ref([])
const settingsStore = useSettings() const settingsStore = useSettings()
const app = getCurrentInstance()
const { $dialog } = app.appContext.config.globalProperties
const props = defineProps({ const props = defineProps({
courseName: { courseName: {
@@ -434,23 +446,37 @@ const submitCourse = () => {
} }
} }
const validateMandatoryFields = () => { const deleteCourse = createResource({
const mandatory_fields = [ url: 'lms.lms.api.delete_course',
'title', makeParams(values) {
'short_introduction', return {
'description', course: props.courseName,
'video_link',
'course_image',
]
for (const field of mandatory_fields) {
if (!course[field]) {
let fieldLabel = convertToTitleCase(field.split('_').join(' '))
return `${fieldLabel} is mandatory`
} }
} },
if (course.paid_course && (!course.course_price || !course.currency)) { onSuccess() {
return __('Course price and currency are mandatory for paid courses') showToast(__('Success'), __('Course deleted successfully'), 'check')
} router.push({ name: 'Courses' })
},
})
const trashCourse = () => {
$dialog({
title: __('Delete Course'),
message: __(
'Deleting the course will also delete all its chapters and lessons. Are you sure you want to delete this course?'
),
actions: [
{
label: __('Delete'),
theme: 'red',
variant: 'solid',
onClick(close) {
deleteCourse.submit()
close()
},
},
],
})
} }
watch( watch(

View File

@@ -145,7 +145,7 @@
<div class="text-xl font-medium"> <div class="text-xl font-medium">
{{ __('No courses found') }} {{ __('No courses found') }}
</div> </div>
<div> <div class="leading-5">
{{ {{
__( __(
'There are no courses available at the moment. Keep an eye out, fresh learning experiences are on the way soon!' 'There are no courses available at the moment. Keep an eye out, fresh learning experiences are on the way soon!'

View File

@@ -239,6 +239,10 @@ const lesson = createResource({
}, },
auto: true, auto: true,
onSuccess(data) { onSuccess(data) {
if (Object.keys(data).length === 0) {
router.push({ name: 'Courses' })
return
}
lessonProgress.value = data.membership?.progress lessonProgress.value = data.membership?.progress
if (data.content) editor.value = renderEditor('editor', data.content) if (data.content) editor.value = renderEditor('editor', data.content)
if ( if (

View File

@@ -12,7 +12,12 @@
</header> </header>
<div class="py-5"> <div class="py-5">
<div class="w-5/6 mx-auto"> <div class="w-5/6 mx-auto">
<FormControl v-model="lesson.title" label="Title" class="mb-4" /> <FormControl
v-model="lesson.title"
label="Title"
class="mb-4"
:required="true"
/>
<FormControl <FormControl
v-model="lesson.include_in_preview" v-model="lesson.include_in_preview"
type="checkbox" type="checkbox"

View File

@@ -47,6 +47,22 @@
</ListRows> </ListRows>
</ListView> </ListView>
</div> </div>
<div
v-else
class="text-center p-5 text-gray-600 mt-52 w-3/4 md:w-1/2 mx-auto space-y-2"
>
<BookOpen class="size-10 mx-auto stroke-1 text-gray-500" />
<div class="text-xl font-medium">
{{ __('No quizzes found') }}
</div>
<div class="leading-5">
{{
__(
'You have not created any quizzes yet. To create a new quiz, click on the "New Quiz" button above.'
)
}}
</div>
</div>
</template> </template>
<script setup> <script setup>
import { import {
@@ -61,7 +77,7 @@ import {
} from 'frappe-ui' } from 'frappe-ui'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { computed, inject, onMounted } from 'vue' import { computed, inject, onMounted } from 'vue'
import { Plus } from 'lucide-vue-next' import { BookOpen, Plus } from 'lucide-vue-next'
import { updateDocumentTitle } from '@/utils' import { updateDocumentTitle } from '@/utils'
const user = inject('$user') const user = inject('$user')

View File

@@ -1 +1 @@
__version__ = "2.10.0" __version__ = "2.11.0"

View File

@@ -1,10 +1,12 @@
import frappe import frappe
from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
from lms.lms.api import give_dicussions_permission
def after_install(): def after_install():
add_pages_to_nav() add_pages_to_nav()
create_batch_source() create_batch_source()
give_dicussions_permission()
def after_sync(): def after_sync():

View File

@@ -1,6 +1,7 @@
"""API methods for the LMS. """API methods for the LMS.
""" """
import json
import frappe import frappe
from frappe.translate import get_all_translations from frappe.translate import get_all_translations
from frappe import _ from frappe import _
@@ -295,7 +296,8 @@ def get_branding():
for field in image_fields: for field in image_fields:
if website_settings.get(field): if website_settings.get(field):
website_settings.update({field: get_file_info(website_settings.get(field))}) file_info = get_file_info(website_settings.get(field))
website_settings.update({field: json.loads(json.dumps(file_info))})
else: else:
website_settings.update({field: None}) website_settings.update({field: None})
@@ -490,7 +492,15 @@ def delete_sidebar_item(webpage):
@frappe.whitelist() @frappe.whitelist()
def delete_lesson(lesson, chapter): def delete_lesson(lesson, chapter):
frappe.db.delete("Lesson Reference", {"parent": chapter, "lesson": lesson}) # Delete Reference
chapter = frappe.get_doc("Course Chapter", chapter)
chapter.lessons = [row for row in chapter.lessons if row.lesson != lesson]
chapter.save()
# Delete progress
frappe.db.delete("LMS Course Progress", {"lesson": lesson})
# Delete Lesson
frappe.db.delete("Course Lesson", lesson) frappe.db.delete("Course Lesson", lesson)
@@ -802,3 +812,67 @@ def get_announcements(batch):
], ],
order_by="communication_date desc", order_by="communication_date desc",
) )
@frappe.whitelist()
def delete_course(course):
chapters = frappe.get_all("Course Chapter", {"course": course}, pluck="name")
chapter_references = frappe.get_all(
"Chapter Reference", {"parent": course}, pluck="name"
)
for chapter in chapters:
lessons = frappe.get_all("Course Lesson", {"chapter": chapter}, pluck="name")
lesson_references = frappe.get_all(
"Lesson Reference", {"parent": chapter}, pluck="name"
)
for lesson in lesson_references:
frappe.delete_doc("Lesson Reference", lesson)
for lesson in lessons:
frappe.db.delete("LMS Course Progress", {"lesson": lesson})
topics = frappe.get_all(
"Discussion Topic",
{"reference_doctype": "Course Lesson", "reference_docname": lesson},
pluck="name",
)
for topic in topics:
frappe.db.delete("Discussion Reply", {"topic": topic})
frappe.db.delete("Discussion Topic", topic)
frappe.delete_doc("Course Lesson", lesson)
for chapter in chapter_references:
frappe.delete_doc("Chapter Reference", chapter)
for chapter in chapters:
frappe.delete_doc("Course Chapter", chapter)
frappe.db.delete("LMS Enrollment", {"course": course})
frappe.delete_doc("LMS Course", course)
def give_dicussions_permission():
doctypes = ["Discussion Topic", "Discussion Reply"]
roles = ["LMS Student", "Course Creator", "Moderator", "Batch Evaluator"]
for doctype in doctypes:
for role in roles:
if not frappe.db.exists("Custom DocPerm", {"parent": doctype, "role": role}):
frappe.get_doc(
{
"doctype": "Custom DocPerm",
"parent": doctype,
"role": role,
"read": 1,
"write": 1,
"create": 1,
"delete": 1,
}
).save(ignore_permissions=True)

View File

@@ -1,10 +1,27 @@
# Copyright (c) 2021, FOSS United and contributors # Copyright (c) 2021, FOSS United and contributors
# For license information, please see license.txt # For license information, please see license.txt
# import frappe import frappe
from frappe.model.document import Document from frappe.model.document import Document
from frappe.utils.telemetry import capture from lms.lms.utils import get_course_progress
from lms.lms.api import update_course_statistics
class CourseChapter(Document): class CourseChapter(Document):
pass def on_update(self):
self.recalculate_course_progress()
update_course_statistics()
def recalculate_course_progress(self):
previous_lessons = (
self.get_doc_before_save() and self.get_doc_before_save().as_dict().lessons
)
current_lessons = self.lessons
if previous_lessons and previous_lessons != current_lessons:
enrolled_members = frappe.get_all(
"LMS Enrollment", {"course": self.course}, ["member", "name"]
)
for enrollment in enrolled_members:
new_progress = get_course_progress(self.course, enrollment.member)
frappe.db.set_value("LMS Enrollment", enrollment.name, "progress", new_progress)

View File

@@ -132,9 +132,10 @@
"read_only": 1 "read_only": 1
} }
], ],
"in_create": 1,
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
"modified": "2024-10-31 15:41:35.540856", "modified": "2024-11-11 18:59:26.396111",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "LMS", "module": "LMS",
"name": "LMS Live Class", "name": "LMS Live Class",

View File

@@ -57,14 +57,15 @@ class LMSQuiz(Document):
types = [question.type for question in self.questions] types = [question.type for question in self.questions]
types = set(types) types = set(types)
if "Open Ended" in types and len(types) > 1: if "Open Ended" in types:
frappe.throw( if len(types) > 1:
_( frappe.throw(
"If you want open ended questions then make sure each question in the quiz is of open ended type." _(
"If you want open ended questions then make sure each question in the quiz is of open ended type."
)
) )
) else:
else: self.show_answers = 0
self.show_answers = 0
def autoname(self): def autoname(self):
if not self.name: if not self.name:

View File

@@ -503,11 +503,6 @@ def first_lesson_exists(course):
return True return True
def redirect_to_courses_list():
frappe.local.flags.redirect_location = "/lms/courses"
raise frappe.Redirect
def has_course_instructor_role(member=None): def has_course_instructor_role(member=None):
return frappe.db.get_value( return frappe.db.get_value(
"Has Role", "Has Role",
@@ -1108,7 +1103,7 @@ def get_categorized_courses(courses):
categories = [live, enrolled, created] categories = [live, enrolled, created]
for category in categories: for category in categories:
category.sort(key=lambda x: x.enrollments, reverse=True) category.sort(key=lambda x: cint(x.enrollments), reverse=True)
live.sort(key=lambda x: x.featured, reverse=True) live.sort(key=lambda x: x.featured, reverse=True)
@@ -1153,6 +1148,9 @@ def get_lesson(course, chapter, lesson):
lesson_details = frappe.db.get_value( lesson_details = frappe.db.get_value(
"Course Lesson", lesson_name, ["include_in_preview", "title"], as_dict=1 "Course Lesson", lesson_name, ["include_in_preview", "title"], as_dict=1
) )
if not lesson_details:
return {}
membership = get_membership(course) membership = get_membership(course)
course_title = frappe.db.get_value("LMS Course", course, "title") course_title = frappe.db.get_value("LMS Course", course, "title")
if ( if (
@@ -1267,7 +1265,7 @@ def get_batch_details(batch):
batch_details.instructors = get_instructors(batch) batch_details.instructors = get_instructors(batch)
batch_details.courses = frappe.get_all( batch_details.courses = frappe.get_all(
"Batch Course", filters={"parent": batch}, fields=["course", "title"] "Batch Course", filters={"parent": batch}, fields=["course", "title", "evaluator"]
) )
batch_details.students = frappe.get_all( batch_details.students = frappe.get_all(
"Batch Student", {"parent": batch}, pluck="student" "Batch Student", {"parent": batch}, pluck="student"

View File

@@ -1,49 +0,0 @@
frappe.ready(function () {
frappe.web_form.after_save = () => {
let data = frappe.web_form.get_values();
let slug = new URLSearchParams(window.location.search).get("slug");
frappe.msgprint({
message: __("Batch {0} has been successfully created!", [
data.title,
]),
clear: true,
});
setTimeout(function () {
window.location.href = `courses/${slug}`;
}, 2000);
};
frappe.web_form.validate = () => {
let sysdefaults = frappe.boot.sysdefaults;
let time_format =
sysdefaults && sysdefaults.time_format
? sysdefaults.time_format
: "HH:mm:ss";
let data = frappe.web_form.get_values();
data.start_time = moment(data.start_time, time_format).format(
time_format
);
data.end_time = moment(data.end_time, time_format).format(time_format);
if (data.start_date < frappe.datetime.nowdate()) {
frappe.msgprint(__("Start date cannot be a past date."));
return false;
}
if (
!frappe.datetime.validate(data.start_time) ||
!frappe.datetime.validate(data.end_time)
) {
frappe.msgprint(__("Invalid Start or End Time."));
return false;
}
if (data.start_time > data.end_time) {
frappe.msgprint(__("Start Time should be less than End Time."));
return false;
}
return true;
};
});

View File

@@ -1,114 +0,0 @@
{
"accept_payment": 0,
"allow_comments": 0,
"allow_delete": 0,
"allow_edit": 0,
"allow_incomplete": 0,
"allow_multiple": 0,
"allow_print": 0,
"amount": 0.0,
"amount_based_on_field": 0,
"apply_document_permissions": 0,
"button_label": "Save",
"creation": "2021-04-20 11:37:49.135114",
"custom_css": ".datepicker.active {\n background-color: white;\n}\n\n[data-doctype=\"Web Form\"] {\n max-width: 720px;\n margin: 6rem auto;\n}",
"doc_type": "LMS Batch Old",
"docstatus": 0,
"doctype": "Web Form",
"idx": 0,
"is_standard": 1,
"login_required": 1,
"max_attachment_size": 0,
"modified": "2021-06-15 18:49:50.530002",
"modified_by": "Administrator",
"module": "LMS",
"name": "add-a-new-batch",
"owner": "Administrator",
"payment_button_label": "Buy Now",
"published": 1,
"route": "add-a-new-batch",
"route_to_success_link": 0,
"show_attachments": 0,
"show_in_grid": 0,
"show_sidebar": 0,
"sidebar_items": [],
"success_url": "/add-a-new-batch",
"title": "Add a new batch",
"web_form_fields": [
{
"allow_read_on_all_link_options": 0,
"fieldname": "course",
"fieldtype": "Data",
"hidden": 1,
"label": "Course",
"max_length": 0,
"max_value": 0,
"options": "LMS Course",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "title",
"fieldtype": "Data",
"hidden": 0,
"label": "Title",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "start_date",
"fieldtype": "Date",
"hidden": 0,
"label": "Start Date",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"description": "",
"fieldname": "sessions_on",
"fieldtype": "Data",
"hidden": 0,
"label": "Sessions On Days",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "start_time",
"fieldtype": "Data",
"hidden": 0,
"label": "Start Time",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "end_time",
"fieldtype": "Data",
"hidden": 0,
"label": "End Time",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
}
]
}

View File

@@ -1,6 +0,0 @@
import frappe
def get_context(context):
# do your magic here
pass

View File

@@ -1,10 +0,0 @@
frappe.ready(function () {
frappe.web_form.after_save = () => {
let data = frappe.web_form.get_values();
if (data.class) {
setTimeout(() => {
window.location.href = `/batches/${data.class}`;
}, 2000);
}
};
});

View File

@@ -1,189 +0,0 @@
{
"accept_payment": 0,
"allow_comments": 0,
"allow_delete": 0,
"allow_edit": 0,
"allow_incomplete": 0,
"allow_multiple": 1,
"allow_print": 0,
"amount": 0.0,
"amount_based_on_field": 0,
"anonymous": 0,
"apply_document_permissions": 0,
"button_label": "Save",
"creation": "2022-11-23 11:59:33.533053",
"doc_type": "LMS Certificate Evaluation",
"docstatus": 0,
"doctype": "Web Form",
"idx": 1,
"introduction_text": "",
"is_standard": 1,
"list_columns": [],
"login_required": 1,
"max_attachment_size": 0,
"modified": "2023-08-23 14:37:03.086305",
"modified_by": "Administrator",
"module": "LMS",
"name": "evaluation",
"owner": "Administrator",
"payment_button_label": "Buy Now",
"published": 1,
"route": "evaluation",
"show_attachments": 0,
"show_list": 1,
"show_sidebar": 0,
"title": "Evaluation",
"web_form_fields": [
{
"allow_read_on_all_link_options": 1,
"fieldname": "member",
"fieldtype": "Link",
"hidden": 0,
"label": "Member",
"max_length": 0,
"max_value": 0,
"options": "User",
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 1,
"fieldname": "course",
"fieldtype": "Link",
"hidden": 0,
"label": "Course",
"max_length": 0,
"max_value": 0,
"options": "LMS Course",
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "batch_name",
"fieldtype": "Link",
"hidden": 0,
"label": "Batch Name",
"max_length": 0,
"max_value": 0,
"options": "LMS Batch",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "",
"fieldtype": "Column Break",
"hidden": 0,
"label": "",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "date",
"fieldtype": "Date",
"hidden": 0,
"label": "Date",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "start_time",
"fieldtype": "Time",
"hidden": 0,
"label": "Start Time",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "end_time",
"fieldtype": "Time",
"hidden": 0,
"label": "End Time",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "",
"fieldtype": "Section Break",
"hidden": 0,
"label": "Evaluation Details",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "rating",
"fieldtype": "Rating",
"hidden": 0,
"label": "Rating",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "status",
"fieldtype": "Select",
"hidden": 0,
"label": "Status",
"max_length": 0,
"max_value": 0,
"options": "Pass\nFail",
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "",
"fieldtype": "Column Break",
"hidden": 0,
"label": "",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "summary",
"fieldtype": "Small Text",
"hidden": 0,
"label": "Summary",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
}
]
}

View File

@@ -1,6 +0,0 @@
import frappe
from frappe import _
def get_context(context):
pass

View File

@@ -1,98 +0,0 @@
frappe.ready(function () {
frappe.web_form.after_load = () => {
redirect_to_user_profile_form();
add_listener_for_current_company();
add_listener_for_certificate_expiry();
add_listener_for_skill_add_rows();
add_listener_for_functions_add_rows();
add_listener_for_industries_add_rows();
};
frappe.web_form.validate = () => {
let information_missing;
const data = frappe.web_form.get_values();
if (data && data.work_experience && data.work_experience.length) {
data.work_experience.forEach((exp) => {
if (!exp.current && !exp.to_date) {
information_missing = true;
frappe.msgprint(
__("To Date is mandatory in Work Experience.")
);
}
});
}
if (information_missing) return false;
return true;
};
frappe.web_form.after_save = () => {
setTimeout(() => {
window.location.href = `/profile_/${frappe.web_form.get_value([
"username",
])}`;
});
};
});
const redirect_to_user_profile_form = () => {
if (!frappe.utils.get_url_arg("name")) {
window.location.href = `/edit-profile?name=${frappe.session.user}`;
}
};
const add_listener_for_current_company = () => {
$(document).on("click", "input[data-fieldname='current']", (e) => {
if ($(e.currentTarget).prop("checked"))
$("div[data-fieldname='to_date']").addClass("hide");
else $("div[data-fieldname='to_date']").removeClass("hide");
});
};
const add_listener_for_certificate_expiry = () => {
$(document).on("click", "input[data-fieldname='expire']", (e) => {
if ($(e.currentTarget).prop("checked"))
$("div[data-fieldname='expiration_date']").addClass("hide");
else $("div[data-fieldname='expiration_date']").removeClass("hide");
});
};
const add_listener_for_skill_add_rows = () => {
$('[data-fieldname="skill"]')
.find(".grid-add-row")
.click((e) => {
if ($('[data-fieldname="skill"]').find(".grid-row").length > 5) {
$('[data-fieldname="skill"]').find(".grid-add-row").hide();
}
});
};
const add_listener_for_functions_add_rows = () => {
$('[data-fieldname="preferred_functions"]')
.find(".grid-add-row")
.click((e) => {
if (
$('[data-fieldname="preferred_functions"]').find(".grid-row")
.length > 3
) {
$('[data-fieldname="preferred_functions"]')
.find(".grid-add-row")
.hide();
}
});
};
const add_listener_for_industries_add_rows = () => {
$('[data-fieldname="preferred_industries"]')
.find(".grid-add-row")
.click((e) => {
if (
$('[data-fieldname="preferred_industries"]').find(".grid-row")
.length > 3
) {
$('[data-fieldname="preferred_industries"]')
.find(".grid-add-row")
.hide();
}
});
};

View File

@@ -1,341 +0,0 @@
{
"accept_payment": 0,
"allow_comments": 0,
"allow_delete": 0,
"allow_edit": 1,
"allow_incomplete": 0,
"allow_multiple": 0,
"allow_print": 0,
"amount": 0.0,
"amount_based_on_field": 0,
"apply_document_permissions": 0,
"breadcrumbs": "",
"button_label": "Save",
"client_script": "",
"creation": "2021-06-30 13:48:13.682851",
"custom_css": "",
"doc_type": "User",
"docstatus": 0,
"doctype": "Web Form",
"idx": 0,
"is_standard": 1,
"list_columns": [],
"login_required": 1,
"max_attachment_size": 0,
"modified": "2023-01-09 15:45:11.411692",
"modified_by": "Administrator",
"module": "LMS",
"name": "profile",
"owner": "Administrator",
"payment_button_label": "Buy Now",
"published": 1,
"route": "edit-profile",
"show_attachments": 0,
"show_list": 0,
"show_sidebar": 0,
"success_url": "/profile",
"title": "Profile",
"web_form_fields": [
{
"allow_read_on_all_link_options": 0,
"fieldname": "first_name",
"fieldtype": "Data",
"hidden": 0,
"label": "First Name",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "last_name",
"fieldtype": "Data",
"hidden": 0,
"label": "Last Name",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "username",
"fieldtype": "Data",
"hidden": 0,
"label": "Username",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"description": "Get your globally recognized avatar from Gravatar.com",
"fieldname": "user_image",
"fieldtype": "Attach Image",
"hidden": 0,
"label": "User Image",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"description": "",
"fieldname": "cover_image",
"fieldtype": "Attach Image",
"hidden": 0,
"label": "Cover Image",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "city",
"fieldtype": "Data",
"hidden": 0,
"label": "City",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "mobile_no",
"fieldtype": "Data",
"hidden": 0,
"label": "Mobile No",
"max_length": 0,
"max_value": 0,
"options": "Phone",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "",
"fieldtype": "Column Break",
"hidden": 0,
"label": "",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "headline",
"fieldtype": "Data",
"hidden": 0,
"label": "Headline",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "linkedin",
"fieldtype": "Data",
"hidden": 0,
"label": "LinkedIn ID",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "github",
"fieldtype": "Data",
"hidden": 0,
"label": "Github ID",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "medium",
"fieldtype": "Data",
"hidden": 0,
"label": "Medium ID",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "looking_for_job",
"fieldtype": "Check",
"hidden": 0,
"label": "I am looking for a job",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "bio",
"fieldtype": "Small Text",
"hidden": 0,
"label": "Bio",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "",
"fieldtype": "Page Break",
"hidden": 0,
"label": "",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "",
"fieldtype": "Section Break",
"hidden": 0,
"label": "",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "education",
"fieldtype": "Table",
"hidden": 0,
"label": "Education",
"max_length": 0,
"max_value": 0,
"options": "Education Detail",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "work_experience_details",
"fieldtype": "Section Break",
"hidden": 0,
"label": "Work Experience",
"max_length": 0,
"max_value": 0,
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "work_experience",
"fieldtype": "Table",
"hidden": 0,
"label": "Work Experience",
"max_length": 0,
"max_value": 0,
"options": "Work Experience",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "internship",
"fieldtype": "Table",
"hidden": 0,
"label": "Volunteering or Internship",
"max_length": 0,
"max_value": 0,
"options": "Work Experience",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "certification_details",
"fieldtype": "Section Break",
"hidden": 0,
"label": "Certification Details",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "certification",
"fieldtype": "Table",
"hidden": 0,
"label": "Certification",
"max_length": 0,
"max_value": 0,
"options": "Certification",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "skill_details",
"fieldtype": "Section Break",
"hidden": 0,
"label": "Skill Details",
"max_length": 0,
"max_value": 0,
"options": "",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "skill",
"fieldtype": "Table",
"hidden": 0,
"label": "Skill",
"max_length": 0,
"max_value": 0,
"options": "Skills",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
}
]
}

View File

@@ -1,6 +0,0 @@
import frappe
def get_context(context):
# do your magic here
pass

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Frappe LMS VERSION\n" "Project-Id-Version: Frappe LMS VERSION\n"
"Report-Msgid-Bugs-To: jannat@frappe.io\n" "Report-Msgid-Bugs-To: jannat@frappe.io\n"
"POT-Creation-Date: 2024-11-01 16:04+0000\n" "POT-Creation-Date: 2024-11-08 16:04+0000\n"
"PO-Revision-Date: 2024-11-01 16:04+0000\n" "PO-Revision-Date: 2024-11-08 16:04+0000\n"
"Last-Translator: jannat@frappe.io\n" "Last-Translator: jannat@frappe.io\n"
"Language-Team: jannat@frappe.io\n" "Language-Team: jannat@frappe.io\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -60,7 +60,7 @@ msgstr ""
msgid "<span style=\"font-size: 18px;\"><b>Statistics</b></span>" msgid "<span style=\"font-size: 18px;\"><b>Statistics</b></span>"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:32 #: frontend/src/pages/CourseForm.vue:40
msgid "A one line introduction to the course that appears on the course card" msgid "A one line introduction to the course that appears on the course card"
msgstr "" msgstr ""
@@ -226,7 +226,7 @@ msgstr ""
#. Label of the amount (Currency) field in DocType 'Web Form' #. Label of the amount (Currency) field in DocType 'Web Form'
#. Label of the amount (Currency) field in DocType 'LMS Batch' #. Label of the amount (Currency) field in DocType 'LMS Batch'
#. Label of the amount (Currency) field in DocType 'LMS Payment' #. Label of the amount (Currency) field in DocType 'LMS Payment'
#: frontend/src/pages/BatchForm.vue:208 lms/fixtures/custom_field.json #: frontend/src/pages/BatchForm.vue:209 lms/fixtures/custom_field.json
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/lms/doctype/lms_payment/lms_payment.json #: lms/lms/doctype/lms_payment/lms_payment.json
#: lms/public/js/common_functions.js:379 #: lms/public/js/common_functions.js:379
@@ -260,6 +260,10 @@ msgstr ""
msgid "Announcement" msgid "Announcement"
msgstr "" msgstr ""
#: frontend/src/components/Modals/AnnouncementModal.vue:99
msgid "Announcement has been sent successfully"
msgstr ""
#. Label of the answer (Text Editor) field in DocType 'LMS Assignment' #. Label of the answer (Text Editor) field in DocType 'LMS Assignment'
#. Label of the answer (Text Editor) field in DocType 'LMS Assignment #. Label of the answer (Text Editor) field in DocType 'LMS Assignment
#. Submission' #. Submission'
@@ -270,7 +274,7 @@ msgstr ""
msgid "Answer" msgid "Answer"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:76 frontend/src/pages/CourseForm.vue:94 #: frontend/src/pages/CourseForm.vue:84 frontend/src/pages/CourseForm.vue:102
msgid "Appears on the course card in the course list" msgid "Appears on the course card in the course list"
msgstr "" msgstr ""
@@ -344,7 +348,7 @@ msgstr ""
msgid "Assessment added successfully" msgid "Assessment added successfully"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:74 #: lms/lms/doctype/lms_batch/lms_batch.py:75
msgid "Assessment {0} has already been added to this batch." msgid "Assessment {0} has already been added to this batch."
msgstr "" msgstr ""
@@ -424,7 +428,7 @@ msgstr ""
msgid "Average Rating" msgid "Average Rating"
msgstr "" msgstr ""
#: frontend/src/pages/Lesson.vue:101 #: frontend/src/pages/Lesson.vue:96
msgid "Back to Course" msgid "Back to Course"
msgstr "" msgstr ""
@@ -476,7 +480,7 @@ msgid "Batch Description"
msgstr "" msgstr ""
#. Label of the batch_details (Text Editor) field in DocType 'LMS Batch' #. Label of the batch_details (Text Editor) field in DocType 'LMS Batch'
#: frontend/src/pages/BatchForm.vue:97 lms/lms/doctype/lms_batch/lms_batch.json #: frontend/src/pages/BatchForm.vue:98 lms/lms/doctype/lms_batch/lms_batch.json
#: lms/public/js/common_functions.js:349 #: lms/public/js/common_functions.js:349
#: lms/templates/emails/batch_confirmation.html:30 #: lms/templates/emails/batch_confirmation.html:30
msgid "Batch Details" msgid "Batch Details"
@@ -537,7 +541,7 @@ msgstr ""
msgid "Batch Updated" msgid "Batch Updated"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:39 #: lms/lms/doctype/lms_batch/lms_batch.py:40
msgid "Batch end date cannot be before the batch start date" msgid "Batch end date cannot be before the batch start date"
msgstr "" msgstr ""
@@ -643,8 +647,8 @@ msgstr ""
#. Label of the category (Link) field in DocType 'LMS Batch' #. Label of the category (Link) field in DocType 'LMS Batch'
#. Label of the category (Data) field in DocType 'LMS Category' #. Label of the category (Data) field in DocType 'LMS Category'
#. Label of the category (Link) field in DocType 'LMS Course' #. Label of the category (Link) field in DocType 'LMS Course'
#: frontend/src/pages/BatchForm.vue:189 frontend/src/pages/Batches.vue:16 #: frontend/src/pages/BatchForm.vue:190 frontend/src/pages/Batches.vue:16
#: frontend/src/pages/CourseForm.vue:139 frontend/src/pages/Courses.vue:17 #: frontend/src/pages/CourseForm.vue:147 frontend/src/pages/Courses.vue:17
#: frontend/src/pages/JobDetail.vue:102 #: frontend/src/pages/JobDetail.vue:102
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/lms/doctype/lms_category/lms_category.json #: lms/lms/doctype/lms_category/lms_category.json
@@ -945,7 +949,7 @@ msgstr ""
msgid "Completed" msgid "Completed"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:192 #: frontend/src/pages/CourseForm.vue:201
msgid "Completion Certificate" msgid "Completion Certificate"
msgstr "" msgstr ""
@@ -1116,7 +1120,7 @@ msgstr ""
msgid "Course Data" msgid "Course Data"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:41 #: frontend/src/pages/CourseForm.vue:49
msgid "Course Description" msgid "Course Description"
msgstr "" msgstr ""
@@ -1125,7 +1129,7 @@ msgstr ""
msgid "Course Evaluator" msgid "Course Evaluator"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:54 #: frontend/src/pages/CourseForm.vue:62
msgid "Course Image" msgid "Course Image"
msgstr "" msgstr ""
@@ -1148,7 +1152,7 @@ msgid "Course Name"
msgstr "" msgstr ""
#. Label of the course_price (Currency) field in DocType 'LMS Course' #. Label of the course_price (Currency) field in DocType 'LMS Course'
#: frontend/src/pages/CourseForm.vue:210 #: frontend/src/pages/CourseForm.vue:219
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
msgid "Course Price" msgid "Course Price"
msgstr "" msgstr ""
@@ -1177,15 +1181,15 @@ msgstr ""
msgid "Course Title" msgid "Course Title"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:318 #: lms/lms/doctype/lms_batch/lms_batch.py:340
msgid "Course already added to the batch." msgid "Course already added to the batch."
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:457 #: frontend/src/pages/CourseForm.vue:457
msgid "Course price and currency are mandatory for paid courses" msgid "Course deleted successfully"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:57 #: lms/lms/doctype/lms_batch/lms_batch.py:58
msgid "Course {0} has already been added to this batch." msgid "Course {0} has already been added to this batch."
msgstr "" msgstr ""
@@ -1251,7 +1255,7 @@ msgstr ""
#. Label of the currency (Link) field in DocType 'LMS Batch' #. Label of the currency (Link) field in DocType 'LMS Batch'
#. Label of the currency (Link) field in DocType 'LMS Course' #. Label of the currency (Link) field in DocType 'LMS Course'
#. Label of the currency (Link) field in DocType 'LMS Payment' #. Label of the currency (Link) field in DocType 'LMS Payment'
#: frontend/src/pages/BatchForm.vue:216 frontend/src/pages/CourseForm.vue:217 #: frontend/src/pages/BatchForm.vue:217 frontend/src/pages/CourseForm.vue:226
#: lms/fixtures/custom_field.json lms/lms/doctype/lms_batch/lms_batch.json #: lms/fixtures/custom_field.json lms/lms/doctype/lms_batch/lms_batch.json
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
#: lms/lms/doctype/lms_payment/lms_payment.json #: lms/lms/doctype/lms_payment/lms_payment.json
@@ -1309,7 +1313,7 @@ msgstr ""
#. Label of the section_break_glxh (Section Break) field in DocType 'LMS Live #. Label of the section_break_glxh (Section Break) field in DocType 'LMS Live
#. Class' #. Class'
#: frontend/src/pages/BatchForm.vue:110 #: frontend/src/pages/BatchForm.vue:111
#: lms/lms/doctype/lms_live_class/lms_live_class.json #: lms/lms/doctype/lms_live_class/lms_live_class.json
msgid "Date and Time" msgid "Date and Time"
msgstr "" msgstr ""
@@ -1345,13 +1349,22 @@ msgid "Degree Type"
msgstr "" msgstr ""
#: frontend/src/components/CourseOutline.vue:212 #: frontend/src/components/CourseOutline.vue:212
#: frontend/src/pages/CourseForm.vue:15 frontend/src/pages/CourseForm.vue:470
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:464
msgid "Delete Course"
msgstr ""
#: frontend/src/components/CourseOutline.vue:208 #: frontend/src/components/CourseOutline.vue:208
msgid "Delete Lesson" msgid "Delete Lesson"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:465
msgid "Deleting the course will also delete all its chapters and lessons. Are you sure you want to delete this course?"
msgstr ""
#. Label of the description (Text Editor) field in DocType 'Job Opportunity' #. Label of the description (Text Editor) field in DocType 'Job Opportunity'
#. Label of the description (Small Text) field in DocType 'Certification' #. Label of the description (Small Text) field in DocType 'Certification'
#. Label of the description (Markdown Editor) field in DocType 'Cohort' #. Label of the description (Markdown Editor) field in DocType 'Cohort'
@@ -1365,7 +1378,7 @@ msgstr ""
#. Label of the description (Text) field in DocType 'LMS Live Class' #. Label of the description (Text) field in DocType 'LMS Live Class'
#. Label of the description (Small Text) field in DocType 'Work Experience' #. Label of the description (Small Text) field in DocType 'Work Experience'
#: frontend/src/components/Modals/LiveClassModal.vue:73 #: frontend/src/components/Modals/LiveClassModal.vue:73
#: frontend/src/pages/BatchForm.vue:90 frontend/src/pages/JobCreation.vue:43 #: frontend/src/pages/BatchForm.vue:91 frontend/src/pages/JobCreation.vue:43
#: lms/job/doctype/job_opportunity/job_opportunity.json #: lms/job/doctype/job_opportunity/job_opportunity.json
#: lms/lms/doctype/certification/certification.json #: lms/lms/doctype/certification/certification.json
#: lms/lms/doctype/cohort/cohort.json #: lms/lms/doctype/cohort/cohort.json
@@ -1386,12 +1399,12 @@ msgid "Desk"
msgstr "" msgstr ""
#: frontend/src/components/Modals/DiscussionModal.vue:22 #: frontend/src/components/Modals/DiscussionModal.vue:22
#: frontend/src/pages/BatchForm.vue:14 frontend/src/pages/CourseForm.vue:20 #: frontend/src/pages/BatchForm.vue:14 frontend/src/pages/CourseForm.vue:28
#: frontend/src/pages/QuizForm.vue:42 #: frontend/src/pages/QuizForm.vue:42
msgid "Details" msgid "Details"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:187 #: frontend/src/pages/CourseForm.vue:196
msgid "Disable Self Enrollment" msgid "Disable Self Enrollment"
msgstr "" msgstr ""
@@ -1467,7 +1480,7 @@ msgstr ""
#: frontend/src/components/BatchOverlay.vue:93 #: frontend/src/components/BatchOverlay.vue:93
#: frontend/src/components/CourseCardOverlay.vue:86 #: frontend/src/components/CourseCardOverlay.vue:86
#: frontend/src/components/Modals/ChapterModal.vue:9 #: frontend/src/components/Modals/ChapterModal.vue:9
#: frontend/src/pages/JobDetail.vue:31 frontend/src/pages/Lesson.vue:70 #: frontend/src/pages/JobDetail.vue:31 frontend/src/pages/Lesson.vue:65
#: frontend/src/pages/Profile.vue:32 #: frontend/src/pages/Profile.vue:32
msgid "Edit" msgid "Edit"
msgstr "" msgstr ""
@@ -1549,7 +1562,7 @@ msgstr ""
#. Label of the end_date (Date) field in DocType 'Cohort' #. Label of the end_date (Date) field in DocType 'Cohort'
#. Label of the end_date (Date) field in DocType 'LMS Batch' #. Label of the end_date (Date) field in DocType 'LMS Batch'
#: frontend/src/pages/BatchForm.vue:122 lms/lms/doctype/cohort/cohort.json #: frontend/src/pages/BatchForm.vue:123 lms/lms/doctype/cohort/cohort.json
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/public/js/common_functions.js:282 #: lms/public/js/common_functions.js:282
msgid "End Date" msgid "End Date"
@@ -1567,7 +1580,7 @@ msgstr ""
#. Label of the end_time (Time) field in DocType 'LMS Certificate Evaluation' #. Label of the end_time (Time) field in DocType 'LMS Certificate Evaluation'
#. Label of the end_time (Time) field in DocType 'LMS Certificate Request' #. Label of the end_time (Time) field in DocType 'LMS Certificate Request'
#. Label of the end_time (Time) field in DocType 'Scheduled Flow' #. Label of the end_time (Time) field in DocType 'Scheduled Flow'
#: frontend/src/pages/BatchForm.vue:136 #: frontend/src/pages/BatchForm.vue:137
#: frontend/src/pages/ProfileEvaluator.vue:18 #: frontend/src/pages/ProfileEvaluator.vue:18
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json #: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
@@ -1594,7 +1607,7 @@ msgstr ""
msgid "Enrolled successfully" msgid "Enrolled successfully"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:97 #: lms/lms/doctype/lms_batch/lms_batch.py:98
msgid "Enrollment Confirmation for the Next Training Batch" msgid "Enrollment Confirmation for the Next Training Batch"
msgstr "" msgstr ""
@@ -1603,7 +1616,7 @@ msgstr ""
msgid "Enrollment Count" msgid "Enrollment Count"
msgstr "" msgstr ""
#: lms/lms/utils.py:1692 #: lms/lms/utils.py:1690
msgid "Enrollment Failed" msgid "Enrollment Failed"
msgstr "" msgstr ""
@@ -1631,6 +1644,7 @@ msgstr ""
msgid "Enter the correct answer" msgid "Enter the correct answer"
msgstr "" msgstr ""
#: frontend/src/components/Modals/AnnouncementModal.vue:104
#: frontend/src/components/Modals/Question.vue:246 #: frontend/src/components/Modals/Question.vue:246
#: frontend/src/components/Modals/Question.vue:266 #: frontend/src/components/Modals/Question.vue:266
#: frontend/src/components/Modals/Question.vue:323 #: frontend/src/components/Modals/Question.vue:323
@@ -1653,7 +1667,7 @@ msgid "Evaluation Details"
msgstr "" msgstr ""
#. Label of the evaluation_end_date (Date) field in DocType 'LMS Batch' #. Label of the evaluation_end_date (Date) field in DocType 'LMS Batch'
#: frontend/src/pages/BatchForm.vue:165 #: frontend/src/pages/BatchForm.vue:166
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/public/js/common_functions.js:333 #: lms/public/js/common_functions.js:333
msgid "Evaluation End Date" msgid "Evaluation End Date"
@@ -1664,7 +1678,7 @@ msgstr ""
msgid "Evaluation Request" msgid "Evaluation Request"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:81 #: lms/lms/doctype/lms_batch/lms_batch.py:82
msgid "Evaluation end date cannot be less than the batch end date." msgid "Evaluation end date cannot be less than the batch end date."
msgstr "" msgstr ""
@@ -1711,11 +1725,13 @@ msgid "Evaluator is Unavailable"
msgstr "" msgstr ""
#. Label of the event (Select) field in DocType 'LMS Badge' #. Label of the event (Select) field in DocType 'LMS Badge'
#. Label of the event (Link) field in DocType 'LMS Live Class'
#: lms/lms/doctype/lms_badge/lms_badge.json #: lms/lms/doctype/lms_badge/lms_badge.json
#: lms/lms/doctype/lms_live_class/lms_live_class.json
msgid "Event" msgid "Event"
msgstr "" msgstr ""
#: frontend/src/pages/BatchForm.vue:144 #: frontend/src/pages/BatchForm.vue:145
msgid "Example: IST (+5:30)" msgid "Example: IST (+5:30)"
msgstr "" msgstr ""
@@ -1789,7 +1805,7 @@ msgstr ""
#. Label of the featured (Check) field in DocType 'LMS Course' #. Label of the featured (Check) field in DocType 'LMS Course'
#: frontend/src/components/CourseCard.vue:16 #: frontend/src/components/CourseCard.vue:16
#: frontend/src/pages/CourseForm.vue:180 #: frontend/src/pages/CourseForm.vue:189
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
msgid "Featured" msgid "Featured"
msgstr "" msgstr ""
@@ -2076,7 +2092,7 @@ msgstr ""
msgid "If you set an amount here, then the USD equivalent setting will not get applied." msgid "If you set an amount here, then the USD equivalent setting will not get applied."
msgstr "" msgstr ""
#: lms/lms/doctype/lms_quiz/lms_quiz.py:62 #: lms/lms/doctype/lms_quiz/lms_quiz.py:63
msgid "If you want open ended questions then make sure each question in the quiz is of open ended type." msgid "If you want open ended questions then make sure each question in the quiz is of open ended type."
msgstr "" msgstr ""
@@ -2102,7 +2118,7 @@ msgstr ""
msgid "Image search powered by" msgid "Image search powered by"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_quiz/lms_quiz.py:221 #: lms/lms/doctype/lms_quiz/lms_quiz.py:222
msgid "Image: Corrupted Data Stream" msgid "Image: Corrupted Data Stream"
msgstr "" msgstr ""
@@ -2185,14 +2201,14 @@ msgstr ""
#. Label of the instructor_notes (Markdown Editor) field in DocType 'Course #. Label of the instructor_notes (Markdown Editor) field in DocType 'Course
#. Lesson' #. Lesson'
#: frontend/src/pages/Lesson.vue:130 frontend/src/pages/LessonForm.vue:33 #: frontend/src/pages/Lesson.vue:125 frontend/src/pages/LessonForm.vue:33
#: lms/lms/doctype/course_lesson/course_lesson.json #: lms/lms/doctype/course_lesson/course_lesson.json
msgid "Instructor Notes" msgid "Instructor Notes"
msgstr "" msgstr ""
#. Label of the instructors (Table MultiSelect) field in DocType 'LMS Batch' #. Label of the instructors (Table MultiSelect) field in DocType 'LMS Batch'
#. Label of the instructors (Table MultiSelect) field in DocType 'LMS Course' #. Label of the instructors (Table MultiSelect) field in DocType 'LMS Course'
#: frontend/src/pages/BatchForm.vue:85 frontend/src/pages/CourseForm.vue:146 #: frontend/src/pages/BatchForm.vue:85 frontend/src/pages/CourseForm.vue:154
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
msgid "Instructors" msgid "Instructors"
@@ -2351,7 +2367,7 @@ msgstr ""
msgid "Join URL" msgid "Join URL"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:128 #: frontend/src/pages/CourseForm.vue:136
msgid "Keywords for the course" msgid "Keywords for the course"
msgstr "" msgstr ""
@@ -2655,7 +2671,7 @@ msgstr ""
msgid "Links" msgid "Links"
msgstr "" msgstr ""
#: frontend/src/pages/Quizzes.vue:131 #: frontend/src/pages/Quizzes.vue:147
msgid "List of quizzes" msgid "List of quizzes"
msgstr "" msgstr ""
@@ -2705,7 +2721,7 @@ msgstr ""
#: frontend/src/components/NoPermission.vue:28 #: frontend/src/components/NoPermission.vue:28
#: frontend/src/components/QuizBlock.vue:9 frontend/src/pages/Batch.vue:163 #: frontend/src/components/QuizBlock.vue:9 frontend/src/pages/Batch.vue:163
#: frontend/src/pages/Lesson.vue:29 #: frontend/src/pages/Lesson.vue:24
msgid "Login" msgid "Login"
msgstr "" msgstr ""
@@ -2785,7 +2801,7 @@ msgid "Maximun Attempts"
msgstr "" msgstr ""
#. Label of the medium (Select) field in DocType 'LMS Batch' #. Label of the medium (Select) field in DocType 'LMS Batch'
#: frontend/src/pages/BatchForm.vue:184 #: frontend/src/pages/BatchForm.vue:185
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/public/js/common_functions.js:309 #: lms/public/js/common_functions.js:309
msgid "Medium" msgid "Medium"
@@ -3040,11 +3056,11 @@ msgstr ""
msgid "New Sign Up" msgid "New Sign Up"
msgstr "" msgstr ""
#: lms/lms/utils.py:632 #: lms/lms/utils.py:627
msgid "New comment in batch {0}" msgid "New comment in batch {0}"
msgstr "" msgstr ""
#: lms/lms/utils.py:625 #: lms/lms/utils.py:620
msgid "New reply on the topic {0} in course {1}" msgid "New reply on the topic {0} in course {1}"
msgstr "" msgstr ""
@@ -3053,7 +3069,7 @@ msgstr ""
msgid "New {0}" msgid "New {0}"
msgstr "" msgstr ""
#: frontend/src/components/Quiz.vue:209 frontend/src/pages/Lesson.vue:89 #: frontend/src/components/Quiz.vue:209 frontend/src/pages/Lesson.vue:84
msgid "Next" msgid "Next"
msgstr "" msgstr ""
@@ -3114,6 +3130,10 @@ msgstr ""
msgid "No live classes scheduled" msgid "No live classes scheduled"
msgstr "" msgstr ""
#: frontend/src/pages/Quizzes.vue:56
msgid "No quizzes found"
msgstr ""
#: frontend/src/components/Modals/EvaluationModal.vue:53 #: frontend/src/components/Modals/EvaluationModal.vue:53
msgid "No slots available for this date." msgid "No slots available for this date."
msgstr "" msgstr ""
@@ -3186,7 +3206,7 @@ msgstr ""
msgid "Notify me when available" msgid "Notify me when available"
msgstr "" msgstr ""
#: frontend/src/pages/BatchForm.vue:161 #: frontend/src/pages/BatchForm.vue:162
msgid "Number of seats available" msgid "Number of seats available"
msgstr "" msgstr ""
@@ -3222,7 +3242,7 @@ msgstr ""
msgid "Only files of type {0} will be accepted." msgid "Only files of type {0} will be accepted."
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:473 frontend/src/utils/index.js:518 #: frontend/src/pages/CourseForm.vue:494 frontend/src/utils/index.js:518
msgid "Only image file is allowed." msgid "Only image file is allowed."
msgstr "" msgstr ""
@@ -3330,14 +3350,14 @@ msgid "Pages"
msgstr "" msgstr ""
#. Label of the paid_batch (Check) field in DocType 'LMS Batch' #. Label of the paid_batch (Check) field in DocType 'LMS Batch'
#: frontend/src/pages/BatchForm.vue:204 #: frontend/src/pages/BatchForm.vue:205
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/public/js/common_functions.js:373 #: lms/public/js/common_functions.js:373
msgid "Paid Batch" msgid "Paid Batch"
msgstr "" msgstr ""
#. Label of the paid_course (Check) field in DocType 'LMS Course' #. Label of the paid_course (Check) field in DocType 'LMS Course'
#: frontend/src/pages/CourseForm.vue:205 #: frontend/src/pages/CourseForm.vue:214
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
msgid "Paid Course" msgid "Paid Course"
msgstr "" msgstr ""
@@ -3368,7 +3388,7 @@ msgstr ""
#. Label of the passing_percentage (Int) field in DocType 'LMS Quiz' #. Label of the passing_percentage (Int) field in DocType 'LMS Quiz'
#. Label of the passing_percentage (Int) field in DocType 'LMS Quiz Submission' #. Label of the passing_percentage (Int) field in DocType 'LMS Quiz Submission'
#: frontend/src/pages/QuizForm.vue:71 frontend/src/pages/Quizzes.vue:109 #: frontend/src/pages/QuizForm.vue:71 frontend/src/pages/Quizzes.vue:125
#: lms/lms/doctype/lms_quiz/lms_quiz.json #: lms/lms/doctype/lms_quiz/lms_quiz.json
#: lms/lms/doctype/lms_quiz_submission/lms_quiz_submission.json #: lms/lms/doctype/lms_quiz_submission/lms_quiz_submission.json
msgid "Passing Percentage" msgid "Passing Percentage"
@@ -3379,13 +3399,13 @@ msgstr ""
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:104 #: frontend/src/pages/CourseForm.vue:112
msgid "Paste the youtube link of a short video introducing the course" msgid "Paste the youtube link of a short video introducing the course"
msgstr "" msgstr ""
#. Label of the payment (Link) field in DocType 'Batch Student' #. Label of the payment (Link) field in DocType 'Batch Student'
#. Label of the payment (Link) field in DocType 'LMS Enrollment' #. Label of the payment (Link) field in DocType 'LMS Enrollment'
#: frontend/src/pages/BatchForm.vue:198 #: frontend/src/pages/BatchForm.vue:199
#: lms/lms/doctype/batch_student/batch_student.json #: lms/lms/doctype/batch_student/batch_student.json
#: lms/lms/doctype/lms_enrollment/lms_enrollment.json #: lms/lms/doctype/lms_enrollment/lms_enrollment.json
msgid "Payment" msgid "Payment"
@@ -3497,7 +3517,7 @@ msgstr ""
msgid "Please click on the following button to set your new password" msgid "Please click on the following button to set your new password"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:229 #: lms/lms/doctype/lms_batch/lms_batch.py:251
msgid "Please enable Zoom Settings to use this feature." msgid "Please enable Zoom Settings to use this feature."
msgstr "" msgstr ""
@@ -3518,7 +3538,7 @@ msgstr ""
msgid "Please enter your answer" msgid "Please enter your answer"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:64 #: lms/lms/doctype/lms_batch/lms_batch.py:65
msgid "Please install the Payments app to create a paid batches." msgid "Please install the Payments app to create a paid batches."
msgstr "" msgstr ""
@@ -3628,17 +3648,17 @@ msgstr ""
msgid "Preview Image" msgid "Preview Image"
msgstr "" msgstr ""
#: frontend/src/pages/CourseForm.vue:102 #: frontend/src/pages/CourseForm.vue:110
msgid "Preview Video" msgid "Preview Video"
msgstr "" msgstr ""
#: frontend/src/pages/Lesson.vue:54 #: frontend/src/pages/Lesson.vue:49
msgid "Previous" msgid "Previous"
msgstr "" msgstr ""
#. Label of the pricing_tab (Tab Break) field in DocType 'LMS Batch' #. Label of the pricing_tab (Tab Break) field in DocType 'LMS Batch'
#. Label of the pricing_tab (Tab Break) field in DocType 'LMS Course' #. Label of the pricing_tab (Tab Break) field in DocType 'LMS Course'
#: frontend/src/pages/CourseForm.vue:199 #: frontend/src/pages/CourseForm.vue:208
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
#: lms/public/js/common_functions.js:368 #: lms/public/js/common_functions.js:368
@@ -3708,7 +3728,7 @@ msgstr ""
#. Label of the published (Check) field in DocType 'LMS Batch' #. Label of the published (Check) field in DocType 'LMS Batch'
#. Label of the published (Check) field in DocType 'LMS Course' #. Label of the published (Check) field in DocType 'LMS Course'
#: frontend/src/components/Modals/Event.vue:108 #: frontend/src/components/Modals/Event.vue:108
#: frontend/src/pages/BatchForm.vue:24 frontend/src/pages/CourseForm.vue:162 #: frontend/src/pages/BatchForm.vue:24 frontend/src/pages/CourseForm.vue:171
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
#: lms/public/js/common_functions.js:266 #: lms/public/js/common_functions.js:266
@@ -3721,7 +3741,7 @@ msgid "Published Courses"
msgstr "" msgstr ""
#. Label of the published_on (Date) field in DocType 'LMS Course' #. Label of the published_on (Date) field in DocType 'LMS Course'
#: frontend/src/pages/CourseForm.vue:166 #: frontend/src/pages/CourseForm.vue:175
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
msgid "Published On" msgid "Published On"
msgstr "" msgstr ""
@@ -3836,8 +3856,8 @@ msgstr ""
msgid "Quiz will appear at the bottom of the lesson." msgid "Quiz will appear at the bottom of the lesson."
msgstr "" msgstr ""
#: frontend/src/pages/QuizForm.vue:441 frontend/src/pages/Quizzes.vue:120 #: frontend/src/pages/QuizForm.vue:441 frontend/src/pages/Quizzes.vue:136
#: frontend/src/pages/Quizzes.vue:130 #: frontend/src/pages/Quizzes.vue:146
msgid "Quizzes" msgid "Quizzes"
msgstr "" msgstr ""
@@ -3919,7 +3939,7 @@ msgstr ""
msgid "Related Courses" msgid "Related Courses"
msgstr "" msgstr ""
#: frontend/src/pages/BatchForm.vue:69 frontend/src/pages/CourseForm.vue:91 #: frontend/src/pages/BatchForm.vue:69 frontend/src/pages/CourseForm.vue:99
msgid "Remove" msgid "Remove"
msgstr "" msgstr ""
@@ -3993,19 +4013,19 @@ msgstr ""
msgid "Route" msgid "Route"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:172 #: lms/lms/doctype/lms_batch/lms_batch.py:194
msgid "Row #{0} Date cannot be outside the batch duration." msgid "Row #{0} Date cannot be outside the batch duration."
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:167 #: lms/lms/doctype/lms_batch/lms_batch.py:189
msgid "Row #{0} End time cannot be outside the batch duration." msgid "Row #{0} End time cannot be outside the batch duration."
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:149 #: lms/lms/doctype/lms_batch/lms_batch.py:171
msgid "Row #{0} Start time cannot be greater than or equal to end time." msgid "Row #{0} Start time cannot be greater than or equal to end time."
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:158 #: lms/lms/doctype/lms_batch/lms_batch.py:180
msgid "Row #{0} Start time cannot be outside the batch duration." msgid "Row #{0} Start time cannot be outside the batch duration."
msgstr "" msgstr ""
@@ -4029,7 +4049,7 @@ msgstr ""
#: frontend/src/components/Modals/Event.vue:129 #: frontend/src/components/Modals/Event.vue:129
#: frontend/src/components/QuizPlugin.vue:23 #: frontend/src/components/QuizPlugin.vue:23
#: frontend/src/pages/AssignmentSubmission.vue:7 #: frontend/src/pages/AssignmentSubmission.vue:7
#: frontend/src/pages/BatchForm.vue:8 frontend/src/pages/CourseForm.vue:12 #: frontend/src/pages/BatchForm.vue:8 frontend/src/pages/CourseForm.vue:20
#: frontend/src/pages/JobCreation.vue:8 frontend/src/pages/LessonForm.vue:10 #: frontend/src/pages/JobCreation.vue:8 frontend/src/pages/LessonForm.vue:10
#: frontend/src/pages/QuizForm.vue:34 frontend/src/pages/QuizSubmission.vue:14 #: frontend/src/pages/QuizForm.vue:34 frontend/src/pages/QuizSubmission.vue:14
#: lms/public/js/common_functions.js:405 #: lms/public/js/common_functions.js:405
@@ -4078,7 +4098,7 @@ msgid "Search for an icon"
msgstr "" msgstr ""
#. Label of the seat_count (Int) field in DocType 'LMS Batch' #. Label of the seat_count (Int) field in DocType 'LMS Batch'
#: frontend/src/pages/BatchForm.vue:158 #: frontend/src/pages/BatchForm.vue:159
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/public/js/common_functions.js:327 #: lms/public/js/common_functions.js:327
msgid "Seat Count" msgid "Seat Count"
@@ -4122,7 +4142,7 @@ msgid "Set your Password"
msgstr "" msgstr ""
#: frontend/src/components/Modals/Settings.vue:7 #: frontend/src/components/Modals/Settings.vue:7
#: frontend/src/pages/BatchForm.vue:152 frontend/src/pages/CourseForm.vue:152 #: frontend/src/pages/BatchForm.vue:153 frontend/src/pages/CourseForm.vue:161
#: frontend/src/pages/ProfileRoles.vue:4 frontend/src/pages/QuizForm.vue:78 #: frontend/src/pages/ProfileRoles.vue:4 frontend/src/pages/QuizForm.vue:78
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
@@ -4132,12 +4152,12 @@ msgid "Share on"
msgstr "" msgstr ""
#. Label of the short_introduction (Small Text) field in DocType 'LMS Course' #. Label of the short_introduction (Small Text) field in DocType 'LMS Course'
#: frontend/src/pages/CourseForm.vue:30 #: frontend/src/pages/CourseForm.vue:38
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
msgid "Short Introduction" msgid "Short Introduction"
msgstr "" msgstr ""
#: frontend/src/pages/BatchForm.vue:93 #: frontend/src/pages/BatchForm.vue:94
msgid "Short description of the batch" msgid "Short description of the batch"
msgstr "" msgstr ""
@@ -4301,7 +4321,7 @@ msgstr ""
#. Label of the start_date (Date) field in DocType 'Education Detail' #. Label of the start_date (Date) field in DocType 'Education Detail'
#. Label of the start_date (Date) field in DocType 'LMS Batch' #. Label of the start_date (Date) field in DocType 'LMS Batch'
#. Label of the start_date (Date) field in DocType 'LMS Batch Old' #. Label of the start_date (Date) field in DocType 'LMS Batch Old'
#: frontend/src/pages/BatchForm.vue:116 #: frontend/src/pages/BatchForm.vue:117
#: lms/lms/doctype/education_detail/education_detail.json #: lms/lms/doctype/education_detail/education_detail.json
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/lms/doctype/lms_batch_old/lms_batch_old.json #: lms/lms/doctype/lms_batch_old/lms_batch_old.json
@@ -4310,7 +4330,7 @@ msgid "Start Date"
msgstr "" msgstr ""
#: frontend/src/components/CourseCardOverlay.vue:63 #: frontend/src/components/CourseCardOverlay.vue:63
#: frontend/src/pages/Lesson.vue:25 #: frontend/src/pages/Lesson.vue:21
#: lms/templates/emails/lms_course_interest.html:9 #: lms/templates/emails/lms_course_interest.html:9
msgid "Start Learning" msgid "Start Learning"
msgstr "" msgstr ""
@@ -4322,7 +4342,7 @@ msgstr ""
#. Label of the start_time (Time) field in DocType 'LMS Certificate Evaluation' #. Label of the start_time (Time) field in DocType 'LMS Certificate Evaluation'
#. Label of the start_time (Time) field in DocType 'LMS Certificate Request' #. Label of the start_time (Time) field in DocType 'LMS Certificate Request'
#. Label of the start_time (Time) field in DocType 'Scheduled Flow' #. Label of the start_time (Time) field in DocType 'Scheduled Flow'
#: frontend/src/pages/BatchForm.vue:130 #: frontend/src/pages/BatchForm.vue:131
#: frontend/src/pages/ProfileEvaluator.vue:15 #: frontend/src/pages/ProfileEvaluator.vue:15
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json #: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
@@ -4428,7 +4448,7 @@ msgstr ""
msgid "Student Reviews" msgid "Student Reviews"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:46 #: lms/lms/doctype/lms_batch/lms_batch.py:47
msgid "Student {0} has already been added to this batch." msgid "Student {0} has already been added to this batch."
msgstr "" msgstr ""
@@ -4494,13 +4514,14 @@ msgstr ""
#: frontend/src/components/BatchOverlay.vue:135 #: frontend/src/components/BatchOverlay.vue:135
#: frontend/src/components/BatchStudents.vue:157 #: frontend/src/components/BatchStudents.vue:157
#: frontend/src/components/CourseCardOverlay.vue:161 #: frontend/src/components/CourseCardOverlay.vue:161
#: frontend/src/components/Modals/AnnouncementModal.vue:98
#: frontend/src/components/Modals/AssessmentModal.vue:73 #: frontend/src/components/Modals/AssessmentModal.vue:73
#: frontend/src/components/Modals/Event.vue:255 #: frontend/src/components/Modals/Event.vue:255
#: frontend/src/components/Modals/Event.vue:310 #: frontend/src/components/Modals/Event.vue:310
#: frontend/src/components/Modals/Question.vue:261 #: frontend/src/components/Modals/Question.vue:261
#: frontend/src/components/Modals/Question.vue:312 #: frontend/src/components/Modals/Question.vue:312
#: frontend/src/pages/QuizForm.vue:342 frontend/src/pages/QuizForm.vue:361 #: frontend/src/pages/CourseForm.vue:457 frontend/src/pages/QuizForm.vue:342
#: frontend/src/pages/QuizForm.vue:430 #: frontend/src/pages/QuizForm.vue:361 frontend/src/pages/QuizForm.vue:430
msgid "Success" msgid "Success"
msgstr "" msgstr ""
@@ -4567,7 +4588,7 @@ msgid "System Manager"
msgstr "" msgstr ""
#. Label of the tags (Data) field in DocType 'LMS Course' #. Label of the tags (Data) field in DocType 'LMS Course'
#: frontend/src/pages/CourseForm.vue:112 #: frontend/src/pages/CourseForm.vue:120
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
msgid "Tags" msgid "Tags"
msgstr "" msgstr ""
@@ -4659,7 +4680,7 @@ msgstr ""
msgid "There are no courses available at the moment. Keep an eye out, fresh learning experiences are on the way soon!" msgid "There are no courses available at the moment. Keep an eye out, fresh learning experiences are on the way soon!"
msgstr "" msgstr ""
#: lms/lms/doctype/lms_batch/lms_batch.py:140 #: lms/lms/doctype/lms_batch/lms_batch.py:141
msgid "There are no seats available in this batch." msgid "There are no seats available in this batch."
msgstr "" msgstr ""
@@ -4690,7 +4711,7 @@ msgstr ""
msgid "This course has:" msgid "This course has:"
msgstr "" msgstr ""
#: lms/lms/utils.py:1572 #: lms/lms/utils.py:1570
msgid "This course is free." msgid "This course is free."
msgstr "" msgstr ""
@@ -4759,7 +4780,7 @@ msgstr ""
#. Label of the timezone (Data) field in DocType 'LMS Certificate Request' #. Label of the timezone (Data) field in DocType 'LMS Certificate Request'
#. Label of the timezone (Data) field in DocType 'LMS Live Class' #. Label of the timezone (Data) field in DocType 'LMS Live Class'
#: frontend/src/components/Modals/LiveClassModal.vue:44 #: frontend/src/components/Modals/LiveClassModal.vue:44
#: frontend/src/pages/BatchForm.vue:142 #: frontend/src/pages/BatchForm.vue:143
#: lms/lms/doctype/lms_batch/lms_batch.json #: lms/lms/doctype/lms_batch/lms_batch.json
#: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json #: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
#: lms/lms/doctype/lms_live_class/lms_live_class.json #: lms/lms/doctype/lms_live_class/lms_live_class.json
@@ -4788,9 +4809,9 @@ msgstr ""
#. Label of the title (Data) field in DocType 'Work Experience' #. Label of the title (Data) field in DocType 'Work Experience'
#: frontend/src/components/Modals/DiscussionModal.vue:18 #: frontend/src/components/Modals/DiscussionModal.vue:18
#: frontend/src/components/Modals/LiveClassModal.vue:23 #: frontend/src/components/Modals/LiveClassModal.vue:23
#: frontend/src/pages/BatchForm.vue:18 frontend/src/pages/CourseForm.vue:24 #: frontend/src/pages/BatchForm.vue:18 frontend/src/pages/CourseForm.vue:32
#: frontend/src/pages/JobCreation.vue:20 frontend/src/pages/QuizForm.vue:48 #: frontend/src/pages/JobCreation.vue:20 frontend/src/pages/QuizForm.vue:48
#: frontend/src/pages/Quizzes.vue:98 lms/lms/doctype/cohort/cohort.json #: frontend/src/pages/Quizzes.vue:114 lms/lms/doctype/cohort/cohort.json
#: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json #: lms/lms/doctype/cohort_subgroup/cohort_subgroup.json
#: lms/lms/doctype/cohort_web_page/cohort_web_page.json #: lms/lms/doctype/cohort_web_page/cohort_web_page.json
#: lms/lms/doctype/course_chapter/course_chapter.json #: lms/lms/doctype/course_chapter/course_chapter.json
@@ -4825,7 +4846,7 @@ msgstr ""
msgid "To Date is mandatory in Work Experience." msgid "To Date is mandatory in Work Experience."
msgstr "" msgstr ""
#: lms/lms/utils.py:1583 #: lms/lms/utils.py:1581
msgid "To join this batch, please contact the Administrator." msgid "To join this batch, please contact the Administrator."
msgstr "" msgstr ""
@@ -4842,7 +4863,7 @@ msgid "Total"
msgstr "" msgstr ""
#. Label of the total_marks (Int) field in DocType 'LMS Quiz' #. Label of the total_marks (Int) field in DocType 'LMS Quiz'
#: frontend/src/pages/QuizForm.vue:66 frontend/src/pages/Quizzes.vue:103 #: frontend/src/pages/QuizForm.vue:66 frontend/src/pages/Quizzes.vue:119
#: lms/lms/doctype/lms_quiz/lms_quiz.json #: lms/lms/doctype/lms_quiz/lms_quiz.json
msgid "Total Marks" msgid "Total Marks"
msgstr "" msgstr ""
@@ -4942,7 +4963,7 @@ msgstr ""
#. Option for the 'Status' (Select) field in DocType 'Cohort' #. Option for the 'Status' (Select) field in DocType 'Cohort'
#. Label of the upcoming (Check) field in DocType 'LMS Course' #. Label of the upcoming (Check) field in DocType 'LMS Course'
#: frontend/src/pages/CourseForm.vue:175 lms/lms/doctype/cohort/cohort.json #: frontend/src/pages/CourseForm.vue:184 lms/lms/doctype/cohort/cohort.json
#: lms/lms/doctype/lms_course/lms_course.json #: lms/lms/doctype/lms_course/lms_course.json
msgid "Upcoming" msgid "Upcoming"
msgstr "" msgstr ""
@@ -4966,7 +4987,7 @@ msgstr ""
msgid "Update Password" msgid "Update Password"
msgstr "" msgstr ""
#: frontend/src/pages/BatchForm.vue:51 frontend/src/pages/CourseForm.vue:72 #: frontend/src/pages/BatchForm.vue:51 frontend/src/pages/CourseForm.vue:80
msgid "Upload" msgid "Upload"
msgstr "" msgstr ""
@@ -5235,6 +5256,10 @@ msgstr ""
msgid "You have been enrolled in this course" msgid "You have been enrolled in this course"
msgstr "" msgstr ""
#: frontend/src/pages/Quizzes.vue:60
msgid "You have not created any quizzes yet. To create a new quiz, click on the \"New Quiz\" button above."
msgstr ""
#: lms/lms/widgets/NoPreviewModal.html:12 lms/public/js/common_functions.js:126 #: lms/lms/widgets/NoPreviewModal.html:12 lms/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." msgid "You have opted to be notified for this course. You will receive an email when the course becomes available."
msgstr "" msgstr ""
@@ -5313,7 +5338,7 @@ msgstr ""
msgid "cancel your application" msgid "cancel your application"
msgstr "" msgstr ""
#: frontend/src/pages/Lesson.vue:175 #: frontend/src/pages/Lesson.vue:170
msgid "completed" msgid "completed"
msgstr "" msgstr ""
@@ -5361,7 +5386,7 @@ msgstr ""
msgid "you can" msgid "you can"
msgstr "" msgstr ""
#: lms/lms/api.py:732 lms/lms/api.py:740 #: lms/lms/api.py:740 lms/lms/api.py:748
msgid "{0} Settings not found" msgid "{0} Settings not found"
msgstr "" msgstr ""
@@ -5397,7 +5422,7 @@ msgstr ""
msgid "{0} is your evaluator" msgid "{0} is your evaluator"
msgstr "" msgstr ""
#: lms/lms/utils.py:709 #: lms/lms/utils.py:704
msgid "{0} mentioned you in a comment" msgid "{0} mentioned you in a comment"
msgstr "" msgstr ""
@@ -5405,7 +5430,7 @@ msgstr ""
msgid "{0} mentioned you in a comment in your batch." msgid "{0} mentioned you in a comment in your batch."
msgstr "" msgstr ""
#: lms/lms/utils.py:662 lms/lms/utils.py:668 #: lms/lms/utils.py:657 lms/lms/utils.py:663
msgid "{0} mentioned you in a comment in {1}" msgid "{0} mentioned you in a comment in {1}"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -91,4 +91,6 @@ lms.patches.v2_0.fix_progress_percentage
lms.patches.v2_0.add_discussion_topic_titles lms.patches.v2_0.add_discussion_topic_titles
lms.patches.v2_0.sidebar_settings lms.patches.v2_0.sidebar_settings
lms.patches.v2_0.delete_certificate_request_notification #18-09-2024 lms.patches.v2_0.delete_certificate_request_notification #18-09-2024
lms.patches.v2_0.add_course_statistics #21-10-2024 lms.patches.v2_0.add_course_statistics #21-10-2024
lms.patches.v2_0.give_discussions_permissions
lms.patches.v2_0.delete_web_forms

View File

@@ -0,0 +1,5 @@
import frappe
def execute():
frappe.db.delete("Web Form", {"module": "LMS"})

View File

@@ -0,0 +1,6 @@
import frappe
from lms.lms.api import give_dicussions_permission
def execute():
give_dicussions_permission()