Merge pull request #30875 from deepeshgarg007/supply_type_einvoice
fix(India): Supply type for overseas invoices with payment of tax
diff --git a/erpnext/accounts/deferred_revenue.py b/erpnext/accounts/deferred_revenue.py
index a8776fa..f319003 100644
--- a/erpnext/accounts/deferred_revenue.py
+++ b/erpnext/accounts/deferred_revenue.py
@@ -539,19 +539,11 @@
frappe.db.commit()
except Exception as e:
if frappe.flags.in_test:
- traceback = frappe.get_traceback()
- frappe.log_error(
- title=_("Error while processing deferred accounting for Invoice {0}").format(doc.name),
- message=traceback,
- )
+ doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}")
raise e
else:
frappe.db.rollback()
- traceback = frappe.get_traceback()
- frappe.log_error(
- title=_("Error while processing deferred accounting for Invoice {0}").format(doc.name),
- message=traceback,
- )
+ doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}")
frappe.flags.deferred_accounting_error = True
@@ -632,12 +624,7 @@
frappe.db.commit()
except Exception:
frappe.db.rollback()
- traceback = frappe.get_traceback()
- frappe.log_error(
- title=_("Error while processing deferred accounting for Invoice {0}").format(doc.name),
- message=traceback,
- )
-
+ doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}")
frappe.flags.deferred_accounting_error = True
diff --git a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
index 3540f0b..3f5c064 100644
--- a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
+++ b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
@@ -136,7 +136,7 @@
except Exception:
frappe.db.rollback()
data_import.db_set("status", "Error")
- frappe.log_error(title=data_import.name)
+ data_import.log_error("Bank Statement Import failed")
finally:
frappe.flags.in_import = False
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py
index 9f2731d..372c53d 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py
@@ -56,7 +56,7 @@
bank_transaction.submit()
success += 1
except Exception:
- frappe.log_error(frappe.get_traceback())
+ bank_transaction.log_error("Bank entry creation failed")
errors += 1
return {"success": success, "errors": errors}
diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
index c1e2975..18e5a1a 100644
--- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
+++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
@@ -62,7 +62,7 @@
)
except Exception:
frappe.db.rollback()
- frappe.log_error(title=ledger_merge.name)
+ ledger_merge.log_error("Ledger merge failed")
finally:
if successful_merges == total:
ledger_merge.db_set("status", "Success")
diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
index 2d9ae93..9937742 100644
--- a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
+++ b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
@@ -2,9 +2,6 @@
# For license information, please see license.txt
-import traceback
-from json import dumps
-
import frappe
from frappe import _, scrub
from frappe.model.document import Document
@@ -247,11 +244,7 @@
except Exception:
errors += 1
frappe.db.rollback()
- message = "\n".join(
- ["Data:", dumps(d, default=str, indent=4), "--" * 50, "\nException:", traceback.format_exc()]
- )
- frappe.log_error(title="Error while creating Opening Invoice", message=message)
- frappe.db.commit()
+ doc.log_error("Opening invoice creation failed")
if errors:
frappe.msgprint(
_("You had {} errors while creating opening invoices. Check {} for more details").format(
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js
index 403e2bd..d7fae6d 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.js
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js
@@ -112,8 +112,6 @@
var doctypes = ["Purchase Order", "Purchase Invoice", "Journal Entry"];
} else if (frm.doc.party_type == "Employee") {
var doctypes = ["Expense Claim", "Journal Entry"];
- } else if (frm.doc.party_type == "Student") {
- var doctypes = ["Fees"];
} else {
var doctypes = ["Journal Entry"];
}
@@ -755,8 +753,7 @@
if(
(frm.doc.payment_type=="Receive" && frm.doc.party_type=="Customer") ||
(frm.doc.payment_type=="Pay" && frm.doc.party_type=="Supplier") ||
- (frm.doc.payment_type=="Pay" && frm.doc.party_type=="Employee") ||
- (frm.doc.payment_type=="Receive" && frm.doc.party_type=="Student")
+ (frm.doc.payment_type=="Pay" && frm.doc.party_type=="Employee")
) {
if(total_positive_outstanding > total_negative_outstanding)
if (!frm.doc.paid_amount)
@@ -798,8 +795,7 @@
if (
(frm.doc.payment_type=="Receive" && frm.doc.party_type=="Customer") ||
(frm.doc.payment_type=="Pay" && frm.doc.party_type=="Supplier") ||
- (frm.doc.payment_type=="Pay" && frm.doc.party_type=="Employee") ||
- (frm.doc.payment_type=="Receive" && frm.doc.party_type=="Student")
+ (frm.doc.payment_type=="Pay" && frm.doc.party_type=="Employee")
) {
if(total_positive_outstanding_including_order > paid_amount) {
var remaining_outstanding = total_positive_outstanding_including_order - paid_amount;
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index e6a554c..7257e6d 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -183,9 +183,7 @@
if not self.party:
frappe.throw(_("Party is mandatory"))
- _party_name = (
- "title" if self.party_type in ("Student", "Shareholder") else self.party_type.lower() + "_name"
- )
+ _party_name = "title" if self.party_type == "Shareholder" else self.party_type.lower() + "_name"
self.party_name = frappe.db.get_value(self.party_type, self.party, _party_name)
if self.party:
@@ -298,9 +296,7 @@
frappe.throw(_("{0} is mandatory").format(self.meta.get_label(field)))
def validate_reference_documents(self):
- if self.party_type == "Student":
- valid_reference_doctypes = "Fees"
- elif self.party_type == "Customer":
+ if self.party_type == "Customer":
valid_reference_doctypes = ("Sales Order", "Sales Invoice", "Journal Entry", "Dunning")
elif self.party_type == "Supplier":
valid_reference_doctypes = ("Purchase Order", "Purchase Invoice", "Journal Entry")
@@ -338,8 +334,6 @@
ref_party_account = (
get_party_account_based_on_invoice_discounting(d.reference_name) or ref_doc.debit_to
)
- elif self.party_type == "Student":
- ref_party_account = ref_doc.receivable_account
elif self.party_type == "Supplier":
ref_party_account = ref_doc.credit_to
elif self.party_type == "Employee":
@@ -1259,20 +1253,19 @@
# Get all SO / PO which are not fully billed or against which full advance not paid
orders_to_be_billed = []
- if args.get("party_type") != "Student":
- orders_to_be_billed = get_orders_to_be_billed(
- args.get("posting_date"),
- args.get("party_type"),
- args.get("party"),
- args.get("company"),
- party_account_currency,
- company_currency,
- filters=args,
- )
+ orders_to_be_billed = get_orders_to_be_billed(
+ args.get("posting_date"),
+ args.get("party_type"),
+ args.get("party"),
+ args.get("company"),
+ party_account_currency,
+ company_currency,
+ filters=args,
+ )
# Get negative outstanding sales /purchase invoices
negative_outstanding_invoices = []
- if args.get("party_type") not in ["Student", "Employee"] and not args.get("voucher_no"):
+ if args.get("party_type") != "Employee" and not args.get("voucher_no"):
negative_outstanding_invoices = get_negative_outstanding_invoices(
args.get("party_type"),
args.get("party"),
@@ -1496,9 +1489,7 @@
account_currency = get_account_currency(party_account)
account_balance = get_balance_on(party_account, date, cost_center=cost_center)
- _party_name = (
- "title" if party_type in ("Student", "Shareholder") else party_type.lower() + "_name"
- )
+ _party_name = "title" if party_type == "Shareholder" else party_type.lower() + "_name"
party_name = frappe.db.get_value(party_type, party, _party_name)
party_balance = get_balance_on(party_type=party_type, party=party, cost_center=cost_center)
if party_type in ["Customer", "Supplier"]:
@@ -1560,7 +1551,7 @@
def get_outstanding_on_journal_entry(name):
res = frappe.db.sql(
"SELECT "
- 'CASE WHEN party_type IN ("Customer", "Student") '
+ 'CASE WHEN party_type IN ("Customer") '
"THEN ifnull(sum(debit_in_account_currency - credit_in_account_currency), 0) "
"ELSE ifnull(sum(credit_in_account_currency - debit_in_account_currency), 0) "
"END as outstanding_amount "
@@ -1917,8 +1908,6 @@
party_type = "Supplier"
elif dt in ("Expense Claim", "Employee Advance", "Gratuity"):
party_type = "Employee"
- elif dt == "Fees":
- party_type = "Student"
return party_type
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
index ad5a840..0b334ae 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
@@ -38,6 +38,15 @@
]
};
});
+
+ this.frm.set_query("cost_center", () => {
+ return {
+ "filters": {
+ "company": this.frm.doc.company,
+ "is_group": 0
+ }
+ }
+ });
}
refresh() {
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json
index eb0c20f..18d3485 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json
@@ -24,6 +24,7 @@
"invoice_limit",
"payment_limit",
"bank_cash_account",
+ "cost_center",
"sec_break1",
"invoices",
"column_break_15",
@@ -178,13 +179,19 @@
{
"fieldname": "column_break_11",
"fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "cost_center",
+ "fieldtype": "Link",
+ "label": "Cost Center",
+ "options": "Cost Center"
}
],
"hide_toolbar": 1,
"icon": "icon-resize-horizontal",
"issingle": 1,
"links": [],
- "modified": "2021-10-04 20:27:11.114194",
+ "modified": "2022-04-29 15:37:10.246831",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Reconciliation",
@@ -209,5 +216,6 @@
],
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"track_changes": 1
}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
index b596df9..e5b942f 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
@@ -332,6 +332,9 @@
def get_conditions(self, get_invoices=False, get_payments=False, get_return_invoices=False):
condition = " and company = '{0}' ".format(self.company)
+ if self.get("cost_center") and (get_invoices or get_payments or get_return_invoices):
+ condition = " and cost_center = '{0}' ".format(self.cost_center)
+
if get_invoices:
condition += (
" and posting_date >= {0}".format(frappe.db.escape(self.from_invoice_date))
diff --git a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py
index 2271f48..d2374b7 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py
+++ b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py
@@ -1,9 +1,96 @@
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
-# import frappe
import unittest
+import frappe
+from frappe.utils import add_days, getdate
+
+from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
+
class TestPaymentReconciliation(unittest.TestCase):
- pass
+ @classmethod
+ def setUpClass(cls):
+ make_customer()
+ make_invoice_and_payment()
+
+ def test_payment_reconciliation(self):
+ payment_reco = frappe.get_doc("Payment Reconciliation")
+ payment_reco.company = "_Test Company"
+ payment_reco.party_type = "Customer"
+ payment_reco.party = "_Test Payment Reco Customer"
+ payment_reco.receivable_payable_account = "Debtors - _TC"
+ payment_reco.from_invoice_date = add_days(getdate(), -1)
+ payment_reco.to_invoice_date = getdate()
+ payment_reco.from_payment_date = add_days(getdate(), -1)
+ payment_reco.to_payment_date = getdate()
+ payment_reco.maximum_invoice_amount = 1000
+ payment_reco.maximum_payment_amount = 1000
+ payment_reco.invoice_limit = 10
+ payment_reco.payment_limit = 10
+ payment_reco.bank_cash_account = "_Test Bank - _TC"
+ payment_reco.cost_center = "_Test Cost Center - _TC"
+ payment_reco.get_unreconciled_entries()
+
+ self.assertEqual(len(payment_reco.get("invoices")), 1)
+ self.assertEqual(len(payment_reco.get("payments")), 1)
+
+ payment_entry = payment_reco.get("payments")[0].reference_name
+ invoice = payment_reco.get("invoices")[0].invoice_number
+
+ payment_reco.allocate_entries(
+ {
+ "payments": [payment_reco.get("payments")[0].as_dict()],
+ "invoices": [payment_reco.get("invoices")[0].as_dict()],
+ }
+ )
+ payment_reco.reconcile()
+
+ payment_entry_doc = frappe.get_doc("Payment Entry", payment_entry)
+ self.assertEqual(payment_entry_doc.get("references")[0].reference_name, invoice)
+
+
+def make_customer():
+ if not frappe.db.get_value("Customer", "_Test Payment Reco Customer"):
+ frappe.get_doc(
+ {
+ "doctype": "Customer",
+ "customer_name": "_Test Payment Reco Customer",
+ "customer_type": "Individual",
+ "customer_group": "_Test Customer Group",
+ "territory": "_Test Territory",
+ }
+ ).insert()
+
+
+def make_invoice_and_payment():
+ si = create_sales_invoice(
+ customer="_Test Payment Reco Customer", qty=1, rate=690, do_not_save=True
+ )
+ si.cost_center = "_Test Cost Center - _TC"
+ si.save()
+ si.submit()
+
+ pe = frappe.get_doc(
+ {
+ "doctype": "Payment Entry",
+ "payment_type": "Receive",
+ "party_type": "Customer",
+ "party": "_Test Payment Reco Customer",
+ "company": "_Test Company",
+ "paid_from_account_currency": "INR",
+ "paid_to_account_currency": "INR",
+ "source_exchange_rate": 1,
+ "target_exchange_rate": 1,
+ "reference_no": "1",
+ "reference_date": getdate(),
+ "received_amount": 690,
+ "paid_amount": 690,
+ "paid_from": "Debtors - _TC",
+ "paid_to": "_Test Bank - _TC",
+ "cost_center": "_Test Cost Center - _TC",
+ }
+ )
+ pe.insert()
+ pe.submit()
diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py
index f6dd86a..2243b19 100644
--- a/erpnext/accounts/doctype/subscription/subscription.py
+++ b/erpnext/accounts/doctype/subscription/subscription.py
@@ -722,9 +722,7 @@
frappe.db.commit()
except frappe.ValidationError:
frappe.db.rollback()
- frappe.db.begin()
- frappe.log_error(frappe.get_traceback())
- frappe.db.commit()
+ subscription.log_error("Subscription failed")
@frappe.whitelist()
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index 636d624..0cbdf37 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -133,7 +133,7 @@
else:
account_currency = (
None
- if filters.party_type in ["Employee", "Student", "Shareholder", "Member"]
+ if filters.party_type in ["Employee", "Shareholder", "Member"]
else frappe.db.get_value(filters.party_type, filters.party[0], "default_currency")
)
diff --git a/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py b/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
index 869f6aa..5fcfdff 100644
--- a/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
+++ b/erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py
@@ -23,8 +23,6 @@
def get_data(filters, show_party_name):
if filters.get("party_type") in ("Customer", "Supplier", "Employee", "Member"):
party_name_field = "{0}_name".format(frappe.scrub(filters.get("party_type")))
- elif filters.get("party_type") == "Student":
- party_name_field = "first_name"
elif filters.get("party_type") == "Shareholder":
party_name_field = "title"
else:
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index 9a1f9d1..b365a83 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -23,6 +23,10 @@
"order_confirmation_no",
"order_confirmation_date",
"amended_from",
+ "accounting_dimensions_section",
+ "cost_center",
+ "dimension_col_break",
+ "project",
"drop_ship",
"customer",
"customer_name",
@@ -1137,16 +1141,39 @@
"fieldtype": "Link",
"label": "Tax Withholding Category",
"options": "Tax Withholding Category"
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "accounting_dimensions_section",
+ "fieldtype": "Section Break",
+ "label": "Accounting Dimensions "
+ },
+ {
+ "fieldname": "cost_center",
+ "fieldtype": "Link",
+ "label": "Cost Center",
+ "options": "Cost Center"
+ },
+ {
+ "fieldname": "dimension_col_break",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "project",
+ "fieldtype": "Link",
+ "label": "Project",
+ "options": "Project"
}
],
"icon": "fa fa-file-text",
"idx": 105,
"is_submittable": 1,
"links": [],
- "modified": "2021-09-28 13:10:47.955401",
+ "modified": "2022-04-26 12:16:38.694276",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",
+ "naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
{
@@ -1193,6 +1220,7 @@
"show_name_in_global_search": 1,
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"timeline_field": "supplier",
"title_field": "supplier_name",
"track_changes": 1
diff --git a/erpnext/config/education.py b/erpnext/config/education.py
deleted file mode 100644
index c37cf2b..0000000
--- a/erpnext/config/education.py
+++ /dev/null
@@ -1,192 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return [
- {
- "label": _("Student"),
- "items": [
- {
- "type": "doctype",
- "name": "Student",
- "onboard": 1,
- },
- {"type": "doctype", "name": "Guardian"},
- {"type": "doctype", "name": "Student Log"},
- {"type": "doctype", "name": "Student Group"},
- ],
- },
- {
- "label": _("Admission"),
- "items": [
- {"type": "doctype", "name": "Student Applicant"},
- {"type": "doctype", "name": "Web Academy Applicant"},
- {"type": "doctype", "name": "Student Admission"},
- {"type": "doctype", "name": "Program Enrollment"},
- ],
- },
- {
- "label": _("Attendance"),
- "items": [
- {"type": "doctype", "name": "Student Attendance"},
- {"type": "doctype", "name": "Student Leave Application"},
- {
- "type": "report",
- "is_query_report": True,
- "name": "Absent Student Report",
- "doctype": "Student Attendance",
- },
- {
- "type": "report",
- "is_query_report": True,
- "name": "Student Batch-Wise Attendance",
- "doctype": "Student Attendance",
- },
- ],
- },
- {
- "label": _("Tools"),
- "items": [
- {"type": "doctype", "name": "Student Attendance Tool"},
- {"type": "doctype", "name": "Assessment Result Tool"},
- {"type": "doctype", "name": "Student Group Creation Tool"},
- {"type": "doctype", "name": "Program Enrollment Tool"},
- {"type": "doctype", "name": "Course Scheduling Tool"},
- ],
- },
- {
- "label": _("Assessment"),
- "items": [
- {"type": "doctype", "name": "Assessment Plan"},
- {
- "type": "doctype",
- "name": "Assessment Group",
- "link": "Tree/Assessment Group",
- },
- {"type": "doctype", "name": "Assessment Result"},
- {"type": "doctype", "name": "Assessment Criteria"},
- ],
- },
- {
- "label": _("Assessment Reports"),
- "items": [
- {
- "type": "report",
- "is_query_report": True,
- "name": "Course wise Assessment Report",
- "doctype": "Assessment Result",
- },
- {
- "type": "report",
- "is_query_report": True,
- "name": "Final Assessment Grades",
- "doctype": "Assessment Result",
- },
- {
- "type": "report",
- "is_query_report": True,
- "name": "Assessment Plan Status",
- "doctype": "Assessment Plan",
- },
- {"type": "doctype", "name": "Student Report Generation Tool"},
- ],
- },
- {
- "label": _("Fees"),
- "items": [
- {"type": "doctype", "name": "Fees"},
- {"type": "doctype", "name": "Fee Schedule"},
- {"type": "doctype", "name": "Fee Structure"},
- {"type": "doctype", "name": "Fee Category"},
- ],
- },
- {
- "label": _("Schedule"),
- "items": [
- {"type": "doctype", "name": "Course Schedule", "route": "/app/List/Course Schedule/Calendar"},
- {"type": "doctype", "name": "Course Scheduling Tool"},
- ],
- },
- {
- "label": _("Masters"),
- "items": [
- {
- "type": "doctype",
- "name": "Program",
- },
- {
- "type": "doctype",
- "name": "Course",
- "onboard": 1,
- },
- {
- "type": "doctype",
- "name": "Topic",
- },
- {
- "type": "doctype",
- "name": "Instructor",
- "onboard": 1,
- },
- {
- "type": "doctype",
- "name": "Room",
- "onboard": 1,
- },
- ],
- },
- {
- "label": _("Content Masters"),
- "items": [
- {"type": "doctype", "name": "Article"},
- {"type": "doctype", "name": "Video"},
- {"type": "doctype", "name": "Quiz"},
- ],
- },
- {
- "label": _("LMS Activity"),
- "items": [
- {"type": "doctype", "name": "Course Enrollment"},
- {"type": "doctype", "name": "Course Activity"},
- {"type": "doctype", "name": "Quiz Activity"},
- ],
- },
- {
- "label": _("Settings"),
- "items": [
- {"type": "doctype", "name": "Student Category"},
- {"type": "doctype", "name": "Student Batch Name"},
- {
- "type": "doctype",
- "name": "Grading Scale",
- "onboard": 1,
- },
- {"type": "doctype", "name": "Academic Term"},
- {"type": "doctype", "name": "Academic Year"},
- {"type": "doctype", "name": "Education Settings"},
- ],
- },
- {
- "label": _("Other Reports"),
- "items": [
- {
- "type": "report",
- "is_query_report": True,
- "name": "Student and Guardian Contact Details",
- "doctype": "Program Enrollment",
- },
- {
- "type": "report",
- "is_query_report": True,
- "name": "Student Monthly Attendance Sheet",
- "doctype": "Student Attendance",
- },
- {
- "type": "report",
- "name": "Student Fee Collection",
- "doctype": "Fees",
- "is_query_report": True,
- },
- ],
- },
- ]
diff --git a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py
index b4657a2..64b3a01 100644
--- a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py
+++ b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py
@@ -72,7 +72,7 @@
if media_id:
return self.post_text(text, title, media_id=media_id)
else:
- frappe.log_error("Failed to upload media.", "LinkedIn Upload Error")
+ self.log_error("LinkedIn: Failed to upload media")
def upload_image(self, media):
media = get_file_path(media)
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post.py b/erpnext/crm/doctype/social_media_post/social_media_post.py
index 2fd003e..55db29a 100644
--- a/erpnext/crm/doctype/social_media_post/social_media_post.py
+++ b/erpnext/crm/doctype/social_media_post/social_media_post.py
@@ -70,8 +70,7 @@
except Exception:
self.db_set("post_status", "Error")
- title = _("Error while POSTING {0}").format(self.name)
- frappe.log_error(message=frappe.get_traceback(), title=title)
+ self.log_error("Social posting failed")
def process_scheduled_social_media_posts():
diff --git a/erpnext/domains/education.py b/erpnext/domains/education.py
deleted file mode 100644
index 23b8258..0000000
--- a/erpnext/domains/education.py
+++ /dev/null
@@ -1,19 +0,0 @@
-data = {
- "desktop_icons": [
- "Student",
- "Program",
- "Course",
- "Student Group",
- "Instructor",
- "Fees",
- "Task",
- "ToDo",
- "Education",
- "Student Attendance Tool",
- "Student Applicant",
- ],
- "default_portal_role": "Student",
- "restricted_roles": ["Student", "Instructor", "Academics User", "Education Manager"],
- "modules": ["Education"],
- "on_setup": "erpnext.education.setup.setup_education",
-}
diff --git a/erpnext/e_commerce/api.py b/erpnext/e_commerce/api.py
index 179829c..bfada0f 100644
--- a/erpnext/e_commerce/api.py
+++ b/erpnext/e_commerce/api.py
@@ -56,8 +56,7 @@
attribute_filters, field_filters, search_term=search, start=start, item_group=item_group
)
except Exception:
- traceback = frappe.get_traceback()
- frappe.log_error(traceback, frappe._("Product Engine Error"))
+ frappe.log_error("Product query with filter failed")
return {"exc": "Something went wrong!"}
# discount filter data
diff --git a/erpnext/e_commerce/redisearch_utils.py b/erpnext/e_commerce/redisearch_utils.py
index f2dd796..61b4b9e 100644
--- a/erpnext/e_commerce/redisearch_utils.py
+++ b/erpnext/e_commerce/redisearch_utils.py
@@ -245,8 +245,7 @@
def raise_redisearch_error():
"Create an Error Log and raise error."
- traceback = frappe.get_traceback()
- log = frappe.log_error(traceback, frappe._("Redisearch Error"))
+ log = frappe.log_error("Redisearch Error")
log_link = frappe.utils.get_link_to_form("Error Log", log.name)
frappe.throw(
diff --git a/erpnext/education/__init__.py b/erpnext/education/__init__.py
deleted file mode 100644
index f6f84b3..0000000
--- a/erpnext/education/__init__.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import frappe
-from frappe import _
-
-
-class StudentNotInGroupError(frappe.ValidationError):
- pass
-
-
-def validate_student_belongs_to_group(student, student_group):
- groups = frappe.db.get_all("Student Group Student", ["parent"], dict(student=student, active=1))
- if not student_group in [d.parent for d in groups]:
- frappe.throw(
- _("Student {0} does not belong to group {1}").format(
- frappe.bold(student), frappe.bold(student_group)
- ),
- StudentNotInGroupError,
- )
diff --git a/erpnext/education/api.py b/erpnext/education/api.py
deleted file mode 100644
index 8fd1725..0000000
--- a/erpnext/education/api.py
+++ /dev/null
@@ -1,444 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import json
-
-import frappe
-from frappe import _
-from frappe.email.doctype.email_group.email_group import add_subscribers
-from frappe.model.mapper import get_mapped_doc
-from frappe.utils import cstr, flt, getdate
-
-
-def get_course(program):
- """Return list of courses for a particular program
- :param program: Program
- """
- courses = frappe.db.sql(
- """select course, course_name from `tabProgram Course` where parent=%s""", (program), as_dict=1
- )
- return courses
-
-
-@frappe.whitelist()
-def enroll_student(source_name):
- """Creates a Student Record and returns a Program Enrollment.
-
- :param source_name: Student Applicant.
- """
- frappe.publish_realtime("enroll_student_progress", {"progress": [1, 4]}, user=frappe.session.user)
- student = get_mapped_doc(
- "Student Applicant",
- source_name,
- {"Student Applicant": {"doctype": "Student", "field_map": {"name": "student_applicant"}}},
- ignore_permissions=True,
- )
- student.save()
-
- student_applicant = frappe.db.get_value(
- "Student Applicant", source_name, ["student_category", "program"], as_dict=True
- )
- program_enrollment = frappe.new_doc("Program Enrollment")
- program_enrollment.student = student.name
- program_enrollment.student_category = student_applicant.student_category
- program_enrollment.student_name = student.title
- program_enrollment.program = student_applicant.program
- frappe.publish_realtime("enroll_student_progress", {"progress": [2, 4]}, user=frappe.session.user)
- return program_enrollment
-
-
-@frappe.whitelist()
-def check_attendance_records_exist(course_schedule=None, student_group=None, date=None):
- """Check if Attendance Records are made against the specified Course Schedule or Student Group for given date.
-
- :param course_schedule: Course Schedule.
- :param student_group: Student Group.
- :param date: Date.
- """
- if course_schedule:
- return frappe.get_list("Student Attendance", filters={"course_schedule": course_schedule})
- else:
- return frappe.get_list(
- "Student Attendance", filters={"student_group": student_group, "date": date}
- )
-
-
-@frappe.whitelist()
-def mark_attendance(
- students_present, students_absent, course_schedule=None, student_group=None, date=None
-):
- """Creates Multiple Attendance Records.
-
- :param students_present: Students Present JSON.
- :param students_absent: Students Absent JSON.
- :param course_schedule: Course Schedule.
- :param student_group: Student Group.
- :param date: Date.
- """
-
- if student_group:
- academic_year = frappe.db.get_value("Student Group", student_group, "academic_year")
- if academic_year:
- year_start_date, year_end_date = frappe.db.get_value(
- "Academic Year", academic_year, ["year_start_date", "year_end_date"]
- )
- if getdate(date) < getdate(year_start_date) or getdate(date) > getdate(year_end_date):
- frappe.throw(
- _("Attendance cannot be marked outside of Academic Year {0}").format(academic_year)
- )
-
- present = json.loads(students_present)
- absent = json.loads(students_absent)
-
- for d in present:
- make_attendance_records(
- d["student"], d["student_name"], "Present", course_schedule, student_group, date
- )
-
- for d in absent:
- make_attendance_records(
- d["student"], d["student_name"], "Absent", course_schedule, student_group, date
- )
-
- frappe.db.commit()
- frappe.msgprint(_("Attendance has been marked successfully."))
-
-
-def make_attendance_records(
- student, student_name, status, course_schedule=None, student_group=None, date=None
-):
- """Creates/Update Attendance Record.
-
- :param student: Student.
- :param student_name: Student Name.
- :param course_schedule: Course Schedule.
- :param status: Status (Present/Absent)
- """
- student_attendance = frappe.get_doc(
- {
- "doctype": "Student Attendance",
- "student": student,
- "course_schedule": course_schedule,
- "student_group": student_group,
- "date": date,
- }
- )
- if not student_attendance:
- student_attendance = frappe.new_doc("Student Attendance")
- student_attendance.student = student
- student_attendance.student_name = student_name
- student_attendance.course_schedule = course_schedule
- student_attendance.student_group = student_group
- student_attendance.date = date
- student_attendance.status = status
- student_attendance.save()
- student_attendance.submit()
-
-
-@frappe.whitelist()
-def get_student_guardians(student):
- """Returns List of Guardians of a Student.
-
- :param student: Student.
- """
- guardians = frappe.get_all("Student Guardian", fields=["guardian"], filters={"parent": student})
- return guardians
-
-
-@frappe.whitelist()
-def get_student_group_students(student_group, include_inactive=0):
- """Returns List of student, student_name in Student Group.
-
- :param student_group: Student Group.
- """
- if include_inactive:
- students = frappe.get_all(
- "Student Group Student",
- fields=["student", "student_name"],
- filters={"parent": student_group},
- order_by="group_roll_number",
- )
- else:
- students = frappe.get_all(
- "Student Group Student",
- fields=["student", "student_name"],
- filters={"parent": student_group, "active": 1},
- order_by="group_roll_number",
- )
- return students
-
-
-@frappe.whitelist()
-def get_fee_structure(program, academic_term=None):
- """Returns Fee Structure.
-
- :param program: Program.
- :param academic_term: Academic Term.
- """
- fee_structure = frappe.db.get_values(
- "Fee Structure", {"program": program, "academic_term": academic_term}, "name", as_dict=True
- )
- return fee_structure[0].name if fee_structure else None
-
-
-@frappe.whitelist()
-def get_fee_components(fee_structure):
- """Returns Fee Components.
-
- :param fee_structure: Fee Structure.
- """
- if fee_structure:
- fs = frappe.get_all(
- "Fee Component",
- fields=["fees_category", "description", "amount"],
- filters={"parent": fee_structure},
- order_by="idx",
- )
- return fs
-
-
-@frappe.whitelist()
-def get_fee_schedule(program, student_category=None):
- """Returns Fee Schedule.
-
- :param program: Program.
- :param student_category: Student Category
- """
- fs = frappe.get_all(
- "Program Fee",
- fields=["academic_term", "fee_structure", "due_date", "amount"],
- filters={"parent": program, "student_category": student_category},
- order_by="idx",
- )
- return fs
-
-
-@frappe.whitelist()
-def collect_fees(fees, amt):
- paid_amount = flt(amt) + flt(frappe.db.get_value("Fees", fees, "paid_amount"))
- total_amount = flt(frappe.db.get_value("Fees", fees, "total_amount"))
- frappe.db.set_value("Fees", fees, "paid_amount", paid_amount)
- frappe.db.set_value("Fees", fees, "outstanding_amount", (total_amount - paid_amount))
- return paid_amount
-
-
-@frappe.whitelist()
-def get_course_schedule_events(start, end, filters=None):
- """Returns events for Course Schedule Calendar view rendering.
-
- :param start: Start date-time.
- :param end: End date-time.
- :param filters: Filters (JSON).
- """
- from frappe.desk.calendar import get_event_conditions
-
- conditions = get_event_conditions("Course Schedule", filters)
-
- data = frappe.db.sql(
- """select name, course, color,
- timestamp(schedule_date, from_time) as from_time,
- timestamp(schedule_date, to_time) as to_time,
- room, student_group, 0 as 'allDay'
- from `tabCourse Schedule`
- where ( schedule_date between %(start)s and %(end)s )
- {conditions}""".format(
- conditions=conditions
- ),
- {"start": start, "end": end},
- as_dict=True,
- update={"allDay": 0},
- )
-
- return data
-
-
-@frappe.whitelist()
-def get_assessment_criteria(course):
- """Returns Assessmemt Criteria and their Weightage from Course Master.
-
- :param Course: Course
- """
- return frappe.get_all(
- "Course Assessment Criteria",
- fields=["assessment_criteria", "weightage"],
- filters={"parent": course},
- order_by="idx",
- )
-
-
-@frappe.whitelist()
-def get_assessment_students(assessment_plan, student_group):
- student_list = get_student_group_students(student_group)
- for i, student in enumerate(student_list):
- result = get_result(student.student, assessment_plan)
- if result:
- student_result = {}
- for d in result.details:
- student_result.update({d.assessment_criteria: [cstr(d.score), d.grade]})
- student_result.update(
- {"total_score": [cstr(result.total_score), result.grade], "comment": result.comment}
- )
- student.update(
- {"assessment_details": student_result, "docstatus": result.docstatus, "name": result.name}
- )
- else:
- student.update({"assessment_details": None})
- return student_list
-
-
-@frappe.whitelist()
-def get_assessment_details(assessment_plan):
- """Returns Assessment Criteria and Maximum Score from Assessment Plan Master.
-
- :param Assessment Plan: Assessment Plan
- """
- return frappe.get_all(
- "Assessment Plan Criteria",
- fields=["assessment_criteria", "maximum_score", "docstatus"],
- filters={"parent": assessment_plan},
- order_by="idx",
- )
-
-
-@frappe.whitelist()
-def get_result(student, assessment_plan):
- """Returns Submitted Result of given student for specified Assessment Plan
-
- :param Student: Student
- :param Assessment Plan: Assessment Plan
- """
- results = frappe.get_all(
- "Assessment Result",
- filters={"student": student, "assessment_plan": assessment_plan, "docstatus": ("!=", 2)},
- )
- if results:
- return frappe.get_doc("Assessment Result", results[0])
- else:
- return None
-
-
-@frappe.whitelist()
-def get_grade(grading_scale, percentage):
- """Returns Grade based on the Grading Scale and Score.
-
- :param Grading Scale: Grading Scale
- :param Percentage: Score Percentage Percentage
- """
- grading_scale_intervals = {}
- if not hasattr(frappe.local, "grading_scale"):
- grading_scale = frappe.get_all(
- "Grading Scale Interval", fields=["grade_code", "threshold"], filters={"parent": grading_scale}
- )
- frappe.local.grading_scale = grading_scale
- for d in frappe.local.grading_scale:
- grading_scale_intervals.update({d.threshold: d.grade_code})
- intervals = sorted(grading_scale_intervals.keys(), key=float, reverse=True)
- for interval in intervals:
- if flt(percentage) >= interval:
- grade = grading_scale_intervals.get(interval)
- break
- else:
- grade = ""
- return grade
-
-
-@frappe.whitelist()
-def mark_assessment_result(assessment_plan, scores):
- student_score = json.loads(scores)
- assessment_details = []
- for criteria in student_score.get("assessment_details"):
- assessment_details.append(
- {"assessment_criteria": criteria, "score": flt(student_score["assessment_details"][criteria])}
- )
- assessment_result = get_assessment_result_doc(student_score["student"], assessment_plan)
- assessment_result.update(
- {
- "student": student_score.get("student"),
- "assessment_plan": assessment_plan,
- "comment": student_score.get("comment"),
- "total_score": student_score.get("total_score"),
- "details": assessment_details,
- }
- )
- assessment_result.save()
- details = {}
- for d in assessment_result.details:
- details.update({d.assessment_criteria: d.grade})
- assessment_result_dict = {
- "name": assessment_result.name,
- "student": assessment_result.student,
- "total_score": assessment_result.total_score,
- "grade": assessment_result.grade,
- "details": details,
- }
- return assessment_result_dict
-
-
-@frappe.whitelist()
-def submit_assessment_results(assessment_plan, student_group):
- total_result = 0
- student_list = get_student_group_students(student_group)
- for i, student in enumerate(student_list):
- doc = get_result(student.student, assessment_plan)
- if doc and doc.docstatus == 0:
- total_result += 1
- doc.submit()
- return total_result
-
-
-def get_assessment_result_doc(student, assessment_plan):
- assessment_result = frappe.get_all(
- "Assessment Result",
- filters={"student": student, "assessment_plan": assessment_plan, "docstatus": ("!=", 2)},
- )
- if assessment_result:
- doc = frappe.get_doc("Assessment Result", assessment_result[0])
- if doc.docstatus == 0:
- return doc
- elif doc.docstatus == 1:
- frappe.msgprint(_("Result already Submitted"))
- return None
- else:
- return frappe.new_doc("Assessment Result")
-
-
-@frappe.whitelist()
-def update_email_group(doctype, name):
- if not frappe.db.exists("Email Group", name):
- email_group = frappe.new_doc("Email Group")
- email_group.title = name
- email_group.save()
- email_list = []
- students = []
- if doctype == "Student Group":
- students = get_student_group_students(name)
- for stud in students:
- for guard in get_student_guardians(stud.student):
- email = frappe.db.get_value("Guardian", guard.guardian, "email_address")
- if email:
- email_list.append(email)
- add_subscribers(name, email_list)
-
-
-@frappe.whitelist()
-def get_current_enrollment(student, academic_year=None):
- current_academic_year = academic_year or frappe.defaults.get_defaults().academic_year
- program_enrollment_list = frappe.db.sql(
- """
- select
- name as program_enrollment, student_name, program, student_batch_name as student_batch,
- student_category, academic_term, academic_year
- from
- `tabProgram Enrollment`
- where
- student = %s and academic_year = %s
- order by creation""",
- (student, current_academic_year),
- as_dict=1,
- )
-
- if program_enrollment_list:
- return program_enrollment_list[0]
- else:
- return None
diff --git a/erpnext/education/dashboard_chart/course_wise_enrollment/course_wise_enrollment.json b/erpnext/education/dashboard_chart/course_wise_enrollment/course_wise_enrollment.json
deleted file mode 100644
index 9c5f784..0000000
--- a/erpnext/education/dashboard_chart/course_wise_enrollment/course_wise_enrollment.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "based_on": "",
- "chart_name": "Course wise Enrollment",
- "chart_type": "Group By",
- "creation": "2020-07-23 18:24:38.214220",
- "docstatus": 0,
- "doctype": "Dashboard Chart",
- "document_type": "Course Enrollment",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Course Enrollment\",\"enrollment_date\",\"Timespan\",\"this year\",false]]",
- "group_by_based_on": "course",
- "group_by_type": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "last_synced_on": "2020-07-27 17:50:32.490587",
- "modified": "2020-07-27 17:54:09.829206",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course wise Enrollment",
- "number_of_groups": 0,
- "owner": "Administrator",
- "source": "",
- "time_interval": "Yearly",
- "timeseries": 0,
- "timespan": "Last Year",
- "type": "Percentage",
- "use_report_chart": 0,
- "value_based_on": "",
- "y_axis": []
-}
\ No newline at end of file
diff --git a/erpnext/education/dashboard_chart/course_wise_student_count/course_wise_student_count.json b/erpnext/education/dashboard_chart/course_wise_student_count/course_wise_student_count.json
deleted file mode 100644
index 5441518..0000000
--- a/erpnext/education/dashboard_chart/course_wise_student_count/course_wise_student_count.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "based_on": "",
- "chart_name": "Course wise Student Count",
- "chart_type": "Group By",
- "creation": "2020-07-27 17:24:39.136163",
- "docstatus": 0,
- "doctype": "Dashboard Chart",
- "document_type": "Course Enrollment",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Course Enrollment\",\"enrollment_date\",\"Timespan\",\"this year\",false]]",
- "group_by_based_on": "course",
- "group_by_type": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "last_synced_on": "2020-07-27 17:24:56.184236",
- "modified": "2020-07-27 17:25:46.232846",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course wise Student Count",
- "number_of_groups": 0,
- "owner": "Administrator",
- "source": "",
- "time_interval": "Yearly",
- "timeseries": 0,
- "timespan": "Last Year",
- "type": "Donut",
- "use_report_chart": 0,
- "value_based_on": "",
- "y_axis": []
-}
\ No newline at end of file
diff --git a/erpnext/education/dashboard_chart/instructor_gender_diversity_ratio/instructor_gender_diversity_ratio.json b/erpnext/education/dashboard_chart/instructor_gender_diversity_ratio/instructor_gender_diversity_ratio.json
deleted file mode 100644
index b7ee509..0000000
--- a/erpnext/education/dashboard_chart/instructor_gender_diversity_ratio/instructor_gender_diversity_ratio.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "based_on": "",
- "chart_name": "Instructor Gender Diversity Ratio",
- "chart_type": "Group By",
- "creation": "2020-07-23 18:35:02.544019",
- "docstatus": 0,
- "doctype": "Dashboard Chart",
- "document_type": "Instructor",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Instructor\",\"status\",\"=\",\"Active\",false]]",
- "group_by_based_on": "gender",
- "group_by_type": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "last_synced_on": "2020-07-27 17:50:32.783820",
- "modified": "2020-07-27 17:55:41.595260",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Instructor Gender Diversity Ratio",
- "number_of_groups": 0,
- "owner": "Administrator",
- "source": "",
- "time_interval": "Yearly",
- "timeseries": 0,
- "timespan": "Last Year",
- "type": "Donut",
- "use_report_chart": 0,
- "value_based_on": "",
- "y_axis": []
-}
\ No newline at end of file
diff --git a/erpnext/education/dashboard_chart/program_enrollments/program_enrollments.json b/erpnext/education/dashboard_chart/program_enrollments/program_enrollments.json
deleted file mode 100644
index 2a4a4a3..0000000
--- a/erpnext/education/dashboard_chart/program_enrollments/program_enrollments.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "based_on": "enrollment_date",
- "chart_name": "Program Enrollments",
- "chart_type": "Count",
- "creation": "2020-07-23 18:27:53.641616",
- "docstatus": 0,
- "doctype": "Dashboard Chart",
- "document_type": "Program Enrollment",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Program Enrollment\",\"docstatus\",\"=\",\"1\",false]]",
- "group_by_type": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "last_synced_on": "2020-07-27 17:50:32.203069",
- "modified": "2020-07-27 17:51:59.022909",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Enrollments",
- "number_of_groups": 0,
- "owner": "Administrator",
- "source": "",
- "time_interval": "Daily",
- "timeseries": 1,
- "timespan": "Last Month",
- "type": "Line",
- "use_report_chart": 0,
- "value_based_on": "",
- "y_axis": []
-}
\ No newline at end of file
diff --git a/erpnext/education/dashboard_chart/program_wise_enrollment/program_wise_enrollment.json b/erpnext/education/dashboard_chart/program_wise_enrollment/program_wise_enrollment.json
deleted file mode 100644
index 2ba138e..0000000
--- a/erpnext/education/dashboard_chart/program_wise_enrollment/program_wise_enrollment.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "based_on": "",
- "chart_name": "Program wise Enrollment",
- "chart_type": "Group By",
- "creation": "2020-07-23 18:23:45.192748",
- "docstatus": 0,
- "doctype": "Dashboard Chart",
- "document_type": "Program Enrollment",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Program Enrollment\",\"docstatus\",\"=\",\"1\",false],[\"Program Enrollment\",\"enrollment_date\",\"Timespan\",\"this year\",false]]",
- "group_by_based_on": "program",
- "group_by_type": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "last_synced_on": "2020-07-27 17:50:32.629321",
- "modified": "2020-07-27 17:53:36.269098",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program wise Enrollment",
- "number_of_groups": 0,
- "owner": "Administrator",
- "source": "",
- "time_interval": "Yearly",
- "timeseries": 0,
- "timespan": "Last Year",
- "type": "Percentage",
- "use_report_chart": 0,
- "value_based_on": "",
- "y_axis": []
-}
\ No newline at end of file
diff --git a/erpnext/education/dashboard_chart/program_wise_fee_collection/program_wise_fee_collection.json b/erpnext/education/dashboard_chart/program_wise_fee_collection/program_wise_fee_collection.json
deleted file mode 100644
index 38c1b6d..0000000
--- a/erpnext/education/dashboard_chart/program_wise_fee_collection/program_wise_fee_collection.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "chart_name": "Program wise Fee Collection",
- "chart_type": "Report",
- "creation": "2020-08-05 16:19:53.398335",
- "custom_options": "",
- "docstatus": 0,
- "doctype": "Dashboard Chart",
- "dynamic_filters_json": "{\"from_date\":\"frappe.datetime.add_months(frappe.datetime.get_today(), -1)\",\"to_date\":\"frappe.datetime.nowdate()\"}",
- "filters_json": "{}",
- "group_by_type": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "modified": "2020-08-05 16:20:47.436847",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program wise Fee Collection",
- "number_of_groups": 0,
- "owner": "Administrator",
- "report_name": "Program wise Fee Collection",
- "time_interval": "Yearly",
- "timeseries": 0,
- "timespan": "Last Year",
- "type": "Bar",
- "use_report_chart": 1,
- "x_field": "",
- "y_axis": []
-}
\ No newline at end of file
diff --git a/erpnext/education/dashboard_chart/student_category_wise_program_enrollments/student_category_wise_program_enrollments.json b/erpnext/education/dashboard_chart/student_category_wise_program_enrollments/student_category_wise_program_enrollments.json
deleted file mode 100644
index 8887145..0000000
--- a/erpnext/education/dashboard_chart/student_category_wise_program_enrollments/student_category_wise_program_enrollments.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "based_on": "",
- "chart_name": "Student Category wise Program Enrollments",
- "chart_type": "Group By",
- "creation": "2020-07-27 17:37:47.116446",
- "docstatus": 0,
- "doctype": "Dashboard Chart",
- "document_type": "Program Enrollment",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Program Enrollment\",\"enrollment_date\",\"Timespan\",\"this year\",false],[\"Program Enrollment\",\"docstatus\",\"=\",\"1\",false]]",
- "group_by_based_on": "student_category",
- "group_by_type": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "last_synced_on": "2020-07-27 17:46:54.901911",
- "modified": "2020-07-27 17:47:21.370866",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Category wise Program Enrollments",
- "number_of_groups": 0,
- "owner": "Administrator",
- "source": "",
- "time_interval": "Yearly",
- "timeseries": 0,
- "timespan": "Last Year",
- "type": "Donut",
- "use_report_chart": 0,
- "value_based_on": "",
- "y_axis": []
-}
\ No newline at end of file
diff --git a/erpnext/education/dashboard_chart/student_gender_diversity_ratio/student_gender_diversity_ratio.json b/erpnext/education/dashboard_chart/student_gender_diversity_ratio/student_gender_diversity_ratio.json
deleted file mode 100644
index ce602d2..0000000
--- a/erpnext/education/dashboard_chart/student_gender_diversity_ratio/student_gender_diversity_ratio.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "based_on": "",
- "chart_name": "Student Gender Diversity Ratio",
- "chart_type": "Group By",
- "creation": "2020-07-23 18:12:15.972123",
- "docstatus": 0,
- "doctype": "Dashboard Chart",
- "document_type": "Student",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Student\",\"enabled\",\"=\",1,false]]",
- "group_by_based_on": "gender",
- "group_by_type": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "modified": "2020-07-23 18:12:21.606772",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Gender Diversity Ratio",
- "number_of_groups": 0,
- "owner": "Administrator",
- "source": "",
- "time_interval": "Yearly",
- "timeseries": 0,
- "timespan": "Last Year",
- "type": "Donut",
- "use_report_chart": 0,
- "value_based_on": "",
- "y_axis": []
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/__init__.py b/erpnext/education/doctype/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/academic_term/__init__.py b/erpnext/education/doctype/academic_term/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/academic_term/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/academic_term/academic_term.js b/erpnext/education/doctype/academic_term/academic_term.js
deleted file mode 100644
index 26d66f0..0000000
--- a/erpnext/education/doctype/academic_term/academic_term.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Academic Term', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/academic_term/academic_term.json b/erpnext/education/doctype/academic_term/academic_term.json
deleted file mode 100644
index 06c5b1a..0000000
--- a/erpnext/education/doctype/academic_term/academic_term.json
+++ /dev/null
@@ -1,216 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:title",
- "beta": 0,
- "creation": "2015-09-08 17:19:19.158228",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 0,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 1,
- "label": "Academic Year",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Year",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "term_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Term Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "term_start_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Term Start Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 1,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "term_end_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Term End Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 1,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "title",
- "fieldtype": "Data",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Title",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-11-10 19:05:58.567627",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Academic Term",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "name",
- "sort_order": "DESC",
- "title_field": "title",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/academic_term/academic_term.py b/erpnext/education/doctype/academic_term/academic_term.py
deleted file mode 100644
index b44fe99..0000000
--- a/erpnext/education/doctype/academic_term/academic_term.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import getdate
-
-
-class AcademicTerm(Document):
- def autoname(self):
- self.name = self.academic_year + " ({})".format(self.term_name) if self.term_name else ""
-
- def validate(self):
- # Check if entry with same academic_year and the term_name already exists
- validate_duplication(self)
- self.title = self.academic_year + " ({})".format(self.term_name) if self.term_name else ""
-
- # Check that start of academic year is earlier than end of academic year
- if (
- self.term_start_date
- and self.term_end_date
- and getdate(self.term_start_date) > getdate(self.term_end_date)
- ):
- frappe.throw(
- _(
- "The Term End Date cannot be earlier than the Term Start Date. Please correct the dates and try again."
- )
- )
-
- # Check that the start of the term is not before the start of the academic year
- # and end of term is not after the end of the academic year"""
-
- year = frappe.get_doc("Academic Year", self.academic_year)
- if (
- self.term_start_date
- and getdate(year.year_start_date)
- and (getdate(self.term_start_date) < getdate(year.year_start_date))
- ):
- frappe.throw(
- _(
- "The Term Start Date cannot be earlier than the Year Start Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again."
- ).format(self.academic_year)
- )
-
- if (
- self.term_end_date
- and getdate(year.year_end_date)
- and (getdate(self.term_end_date) > getdate(year.year_end_date))
- ):
- frappe.throw(
- _(
- "The Term End Date cannot be later than the Year End Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again."
- ).format(self.academic_year)
- )
-
-
-def validate_duplication(self):
- term = frappe.db.sql(
- """select name from `tabAcademic Term` where academic_year= %s and term_name= %s
- and docstatus<2 and name != %s""",
- (self.academic_year, self.term_name, self.name),
- )
- if term:
- frappe.throw(
- _(
- "An academic term with this 'Academic Year' {0} and 'Term Name' {1} already exists. Please modify these entries and try again."
- ).format(self.academic_year, self.term_name)
- )
diff --git a/erpnext/education/doctype/academic_term/academic_term_dashboard.py b/erpnext/education/doctype/academic_term/academic_term_dashboard.py
deleted file mode 100644
index 348c04d..0000000
--- a/erpnext/education/doctype/academic_term/academic_term_dashboard.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "academic_term",
- "transactions": [
- {"label": _("Student"), "items": ["Student Applicant", "Student Group", "Student Log"]},
- {"label": _("Fee"), "items": ["Fees", "Fee Schedule", "Fee Structure"]},
- {"label": _("Program"), "items": ["Program Enrollment"]},
- {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
- ],
- }
diff --git a/erpnext/education/doctype/academic_term/test_academic_term.py b/erpnext/education/doctype/academic_term/test_academic_term.py
deleted file mode 100644
index b4516b3..0000000
--- a/erpnext/education/doctype/academic_term/test_academic_term.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Academic Term')
-
-
-class TestAcademicTerm(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/academic_term/test_records.json b/erpnext/education/doctype/academic_term/test_records.json
deleted file mode 100644
index 6bd3655..0000000
--- a/erpnext/education/doctype/academic_term/test_records.json
+++ /dev/null
@@ -1,27 +0,0 @@
-[
- {
- "doctype": "Academic Term",
- "academic_year": "2014-2015",
- "term_name": "_Test Academic Term"
- },
- {
- "doctype": "Academic Term",
- "academic_year": "2014-2015",
- "term_name": "_Test Academic Term 1"
- },
- {
- "doctype": "Academic Term",
- "academic_year": "2014-2015",
- "term_name": "_Test Academic Term 2"
- },
- {
- "doctype": "Academic Term",
- "academic_year": "2017-2018",
- "term_name": "_Test AT1"
- },
- {
- "doctype": "Academic Term",
- "academic_year": "2017-2018",
- "term_name": "_Test AT2"
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/academic_year/__init__.py b/erpnext/education/doctype/academic_year/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/academic_year/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/academic_year/academic_year.js b/erpnext/education/doctype/academic_year/academic_year.js
deleted file mode 100644
index 20e2528..0000000
--- a/erpnext/education/doctype/academic_year/academic_year.js
+++ /dev/null
@@ -1,2 +0,0 @@
-frappe.ui.form.on("Academic Year", {
-});
diff --git a/erpnext/education/doctype/academic_year/academic_year.json b/erpnext/education/doctype/academic_year/academic_year.json
deleted file mode 100644
index 5df89a7..0000000
--- a/erpnext/education/doctype/academic_year/academic_year.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 0,
- "autoname": "field:academic_year_name",
- "beta": 0,
- "creation": "2015-09-07 12:49:51.303026",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 0,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_year_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Academic Year Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "year_start_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Year Start Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "year_end_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Year End Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-11-10 19:06:08.123090",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Academic Year",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/academic_year/academic_year.py b/erpnext/education/doctype/academic_year/academic_year.py
deleted file mode 100644
index 2a0438b..0000000
--- a/erpnext/education/doctype/academic_year/academic_year.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class AcademicYear(Document):
- def validate(self):
- # Check that start of academic year is earlier than end of academic year
- if self.year_start_date and self.year_end_date and self.year_start_date > self.year_end_date:
- frappe.throw(
- _(
- "The Year End Date cannot be earlier than the Year Start Date. Please correct the dates and try again."
- )
- )
diff --git a/erpnext/education/doctype/academic_year/academic_year_dashboard.py b/erpnext/education/doctype/academic_year/academic_year_dashboard.py
deleted file mode 100644
index c69c970..0000000
--- a/erpnext/education/doctype/academic_year/academic_year_dashboard.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "academic_year",
- "transactions": [
- {
- "label": _("Student"),
- "items": ["Student Admission", "Student Applicant", "Student Group", "Student Log"],
- },
- {"label": _("Fee"), "items": ["Fees", "Fee Schedule", "Fee Structure"]},
- {"label": _("Academic Term and Program"), "items": ["Academic Term", "Program Enrollment"]},
- {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
- ],
- }
diff --git a/erpnext/education/doctype/academic_year/test_academic_year.py b/erpnext/education/doctype/academic_year/test_academic_year.py
deleted file mode 100644
index e51cd0e..0000000
--- a/erpnext/education/doctype/academic_year/test_academic_year.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Academic Year')
-
-
-class TestAcademicYear(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/academic_year/test_records.json b/erpnext/education/doctype/academic_year/test_records.json
deleted file mode 100644
index 5eb5e2e..0000000
--- a/erpnext/education/doctype/academic_year/test_records.json
+++ /dev/null
@@ -1,18 +0,0 @@
-[
- {
- "doctype": "Academic Year",
- "academic_year_name": "2014-2015"
- },
- {
- "doctype": "Academic Year",
- "academic_year_name": "2015-2016"
- },
- {
- "doctype": "Academic Year",
- "academic_year_name": "2016-2017"
- },
- {
- "doctype": "Academic Year",
- "academic_year_name": "2017-2018"
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/article/__init__.py b/erpnext/education/doctype/article/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/article/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/article/article.js b/erpnext/education/doctype/article/article.js
deleted file mode 100644
index 85b387f..0000000
--- a/erpnext/education/doctype/article/article.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Article', {
- refresh: function(frm) {
- if (!frm.doc.__islocal) {
- frm.add_custom_button(__('Add to Topics'), function() {
- frm.trigger('add_article_to_topics');
- }, __('Action'));
- }
- },
-
- add_article_to_topics: function(frm) {
- get_topics_without_article(frm.doc.name).then(r => {
- if (r.message.length) {
- frappe.prompt([
- {
- fieldname: 'topics',
- label: __('Topics'),
- fieldtype: 'MultiSelectPills',
- get_data: function() {
- return r.message;
- }
- }
- ],
- function(data) {
- frappe.call({
- method: 'erpnext.education.doctype.topic.topic.add_content_to_topics',
- args: {
- 'content_type': 'Article',
- 'content': frm.doc.name,
- 'topics': data.topics,
- },
- callback: function(r) {
- if (!r.exc) {
- frm.reload_doc();
- }
- },
- freeze: true,
- freeze_message: __('...Adding Article to Topics')
- });
- }, __('Add Article to Topics'), __('Add'));
- } else {
- frappe.msgprint(__('This article is already added to the existing topics'));
- }
- });
- }
-});
-
-let get_topics_without_article = function(article) {
- return frappe.call({
- type: 'GET',
- method: 'erpnext.education.doctype.article.article.get_topics_without_article',
- args: {'article': article}
- });
-};
diff --git a/erpnext/education/doctype/article/article.json b/erpnext/education/doctype/article/article.json
deleted file mode 100644
index 2fad5af..0000000
--- a/erpnext/education/doctype/article/article.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:title",
- "creation": "2018-10-17 05:45:38.471670",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "title",
- "author",
- "content",
- "publish_date"
- ],
- "fields": [
- {
- "fieldname": "title",
- "fieldtype": "Data",
- "label": "Title",
- "unique": 1
- },
- {
- "fieldname": "author",
- "fieldtype": "Data",
- "label": "Author"
- },
- {
- "fieldname": "content",
- "fieldtype": "Text Editor",
- "label": "Content"
- },
- {
- "fieldname": "publish_date",
- "fieldtype": "Date",
- "label": "Publish Date"
- }
- ],
- "modified": "2019-06-12 12:36:58.740340",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Article",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "share": 1,
- "write": 1
- },
- {
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "LMS User",
- "share": 1
- }
- ],
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/article/article.py b/erpnext/education/doctype/article/article.py
deleted file mode 100644
index 12b6618..0000000
--- a/erpnext/education/doctype/article/article.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe.model.document import Document
-
-
-class Article(Document):
- def get_article(self):
- pass
-
-
-@frappe.whitelist()
-def get_topics_without_article(article):
- data = []
- for entry in frappe.db.get_all("Topic"):
- topic = frappe.get_doc("Topic", entry.name)
- topic_contents = [tc.content for tc in topic.topic_content]
- if not topic_contents or article not in topic_contents:
- data.append(topic.name)
- return data
diff --git a/erpnext/education/doctype/article/test_article.py b/erpnext/education/doctype/article/test_article.py
deleted file mode 100644
index 2ea5c82..0000000
--- a/erpnext/education/doctype/article/test_article.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestArticle(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/assessment_criteria/__init__.py b/erpnext/education/doctype/assessment_criteria/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/assessment_criteria/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/assessment_criteria/assessment_criteria.js b/erpnext/education/doctype/assessment_criteria/assessment_criteria.js
deleted file mode 100644
index 44b9ca3..0000000
--- a/erpnext/education/doctype/assessment_criteria/assessment_criteria.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Assessment Criteria', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/assessment_criteria/assessment_criteria.json b/erpnext/education/doctype/assessment_criteria/assessment_criteria.json
deleted file mode 100644
index 9e228fd..0000000
--- a/erpnext/education/doctype/assessment_criteria/assessment_criteria.json
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 0,
- "autoname": "field:assessment_criteria",
- "beta": 0,
- "creation": "2016-12-14 16:40:15.144115",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "assessment_criteria",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Assessment Criteria",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 1,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "assessment_criteria_group",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Assessment Criteria Group",
- "length": 0,
- "no_copy": 0,
- "options": "Assessment Criteria Group",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-11-10 19:08:11.311304",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Criteria",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_criteria/assessment_criteria.py b/erpnext/education/doctype/assessment_criteria/assessment_criteria.py
deleted file mode 100644
index ef9692a..0000000
--- a/erpnext/education/doctype/assessment_criteria/assessment_criteria.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-STD_CRITERIA = ["total", "total score", "total grade", "maximum score", "score", "grade"]
-
-
-class AssessmentCriteria(Document):
- def validate(self):
- if self.assessment_criteria.lower() in STD_CRITERIA:
- frappe.throw(_("Can't create standard criteria. Please rename the criteria"))
diff --git a/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py b/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py
deleted file mode 100644
index 90ff575..0000000
--- a/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Assessment Criteria')
-
-
-class TestAssessmentCriteria(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/assessment_criteria/test_records.json b/erpnext/education/doctype/assessment_criteria/test_records.json
deleted file mode 100644
index 7af63b3..0000000
--- a/erpnext/education/doctype/assessment_criteria/test_records.json
+++ /dev/null
@@ -1,8 +0,0 @@
-[
- {
- "assessment_criteria": "_Test Assessment Criteria"
- },
- {
- "assessment_criteria": "_Test Assessment Criteria 1"
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_criteria_group/__init__.py b/erpnext/education/doctype/assessment_criteria_group/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/assessment_criteria_group/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.js b/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.js
deleted file mode 100644
index 89358d2..0000000
--- a/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Assessment Criteria Group', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.json b/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.json
deleted file mode 100644
index 5765b4b..0000000
--- a/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:assessment_criteria_group",
- "beta": 0,
- "creation": "2017-01-27 15:17:38.855910",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "assessment_criteria_group",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Assessment Criteria Group",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-11-10 19:11:45.334917",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Criteria Group",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.py b/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.py
deleted file mode 100644
index d284db5..0000000
--- a/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class AssessmentCriteriaGroup(Document):
- pass
diff --git a/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py b/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py
deleted file mode 100644
index b52aef8..0000000
--- a/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Assessment Criteria Group')
-
-
-class TestAssessmentCriteriaGroup(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/assessment_group/__init__.py b/erpnext/education/doctype/assessment_group/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/assessment_group/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/assessment_group/assessment_group.js b/erpnext/education/doctype/assessment_group/assessment_group.js
deleted file mode 100644
index 6be5102..0000000
--- a/erpnext/education/doctype/assessment_group/assessment_group.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Assessment Group', {
- onload: function(frm) {
- frm.list_route = "Tree/Assessment Group";
- }
-});
diff --git a/erpnext/education/doctype/assessment_group/assessment_group.json b/erpnext/education/doctype/assessment_group/assessment_group.json
deleted file mode 100644
index a8ffaf4..0000000
--- a/erpnext/education/doctype/assessment_group/assessment_group.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:assessment_group_name",
- "creation": "2016-08-04 04:42:48.319388",
- "doctype": "DocType",
- "editable_grid": 1,
- "field_order": [
- "assessment_group_name",
- "is_group",
- "section_break_2",
- "parent_assessment_group",
- "lft",
- "rgt",
- "old_parent"
- ],
- "fields": [
- {
- "fieldname": "assessment_group_name",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Assessment Group Name",
- "reqd": 1,
- "unique": 1
- },
- {
- "default": "0",
- "fieldname": "is_group",
- "fieldtype": "Check",
- "label": "Is Group"
- },
- {
- "fieldname": "section_break_2",
- "fieldtype": "Section Break",
- "hidden": 1
- },
- {
- "fieldname": "parent_assessment_group",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Parent Assessment Group",
- "options": "Assessment Group",
- "reqd": 1
- },
- {
- "fieldname": "lft",
- "fieldtype": "Int",
- "label": "lft"
- },
- {
- "fieldname": "rgt",
- "fieldtype": "Int",
- "label": "rgt"
- },
- {
- "fieldname": "old_parent",
- "fieldtype": "Link",
- "ignore_user_permissions": 1,
- "label": "old_parent",
- "options": "Assessment Group"
- }
- ],
- "is_tree": 1,
- "links": [],
- "modified": "2020-03-18 18:01:14.710416",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Group",
- "nsm_parent_field": "parent_assessment_group",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_group/assessment_group.py b/erpnext/education/doctype/assessment_group/assessment_group.py
deleted file mode 100644
index d606ffb..0000000
--- a/erpnext/education/doctype/assessment_group/assessment_group.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class AssessmentGroup(Document):
- pass
diff --git a/erpnext/education/doctype/assessment_group/assessment_group_dashboard.py b/erpnext/education/doctype/assessment_group/assessment_group_dashboard.py
deleted file mode 100644
index 7c75100..0000000
--- a/erpnext/education/doctype/assessment_group/assessment_group_dashboard.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "assessment_group",
- "transactions": [{"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]}],
- }
diff --git a/erpnext/education/doctype/assessment_group/assessment_group_tree.js b/erpnext/education/doctype/assessment_group/assessment_group_tree.js
deleted file mode 100644
index e0dfaa3..0000000
--- a/erpnext/education/doctype/assessment_group/assessment_group_tree.js
+++ /dev/null
@@ -1,3 +0,0 @@
-frappe.treeview_settings["Assessment Group"] = {
-
-}
diff --git a/erpnext/education/doctype/assessment_group/test_assessment_group.py b/erpnext/education/doctype/assessment_group/test_assessment_group.py
deleted file mode 100644
index 6f05caa..0000000
--- a/erpnext/education/doctype/assessment_group/test_assessment_group.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Assessment Group')
-
-
-class TestAssessmentGroup(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/assessment_plan/__init__.py b/erpnext/education/doctype/assessment_plan/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/assessment_plan/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/assessment_plan/assessment_plan.js b/erpnext/education/doctype/assessment_plan/assessment_plan.js
deleted file mode 100644
index cf545c4..0000000
--- a/erpnext/education/doctype/assessment_plan/assessment_plan.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-
-frappe.ui.form.on('Assessment Plan', {
- onload: function(frm) {
- frm.set_query('assessment_group', function(doc, cdt, cdn) {
- return{
- filters: {
- 'is_group': 0
- }
- };
- });
- frm.set_query('grading_scale', function(){
- return {
- filters: {
- docstatus: 1
- }
- };
- });
- },
-
- refresh: function(frm) {
- if (frm.doc.docstatus == 1) {
- frm.add_custom_button(__('Assessment Result Tool'), function() {
- frappe.route_options = {
- assessment_plan: frm.doc.name,
- student_group: frm.doc.student_group
- }
- frappe.set_route('Form', 'Assessment Result Tool');
- }, __('Tools'));
- }
-
- frm.set_query('course', function() {
- return {
- query: 'erpnext.education.doctype.program_enrollment.program_enrollment.get_program_courses',
- filters: {
- 'program': frm.doc.program
- }
- };
- });
-
- frm.set_query('academic_term', function() {
- return {
- filters: {
- 'academic_year': frm.doc.academic_year
- }
- };
- });
- },
-
- course: function(frm) {
- if (frm.doc.course && frm.doc.maximum_assessment_score) {
- frappe.call({
- method: 'erpnext.education.api.get_assessment_criteria',
- args: {
- course: frm.doc.course
- },
- callback: function(r) {
- if (r.message) {
- frm.doc.assessment_criteria = [];
- $.each(r.message, function(i, d) {
- var row = frappe.model.add_child(frm.doc, 'Assessment Plan Criteria', 'assessment_criteria');
- row.assessment_criteria = d.assessment_criteria;
- row.maximum_score = d.weightage / 100 * frm.doc.maximum_assessment_score;
- });
- }
- refresh_field('assessment_criteria');
-
- }
- });
- }
- },
-
- maximum_assessment_score: function(frm) {
- frm.trigger('course');
- }
-});
diff --git a/erpnext/education/doctype/assessment_plan/assessment_plan.json b/erpnext/education/doctype/assessment_plan/assessment_plan.json
deleted file mode 100644
index 5066fdf..0000000
--- a/erpnext/education/doctype/assessment_plan/assessment_plan.json
+++ /dev/null
@@ -1,227 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "EDU-ASP-.YYYY.-.#####",
- "creation": "2015-11-12 16:34:34.658092",
- "doctype": "DocType",
- "document_type": "Setup",
- "engine": "InnoDB",
- "field_order": [
- "student_group",
- "assessment_name",
- "assessment_group",
- "grading_scale",
- "column_break_2",
- "program",
- "course",
- "academic_year",
- "academic_term",
- "section_break_5",
- "schedule_date",
- "room",
- "examiner",
- "examiner_name",
- "column_break_4",
- "from_time",
- "to_time",
- "supervisor",
- "supervisor_name",
- "section_break_20",
- "maximum_assessment_score",
- "assessment_criteria",
- "amended_from"
- ],
- "fields": [
- {
- "fieldname": "student_group",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Student Group",
- "options": "Student Group",
- "reqd": 1
- },
- {
- "fieldname": "assessment_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Assessment Name"
- },
- {
- "fieldname": "assessment_group",
- "fieldtype": "Link",
- "in_standard_filter": 1,
- "label": "Assessment Group",
- "options": "Assessment Group",
- "reqd": 1
- },
- {
- "fetch_from": "course.default_grading_scale",
- "fetch_if_empty": 1,
- "fieldname": "grading_scale",
- "fieldtype": "Link",
- "in_standard_filter": 1,
- "label": "Grading Scale",
- "options": "Grading Scale",
- "reqd": 1
- },
- {
- "fieldname": "column_break_2",
- "fieldtype": "Column Break"
- },
- {
- "fetch_from": "student_group.course",
- "fetch_if_empty": 1,
- "fieldname": "course",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_standard_filter": 1,
- "label": "Course",
- "options": "Course",
- "reqd": 1
- },
- {
- "fetch_from": "student_group.program",
- "fieldname": "program",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Program",
- "options": "Program"
- },
- {
- "fetch_from": "student_group.academic_year",
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "label": "Academic Year",
- "options": "Academic Year"
- },
- {
- "fetch_from": "student_group.academic_term",
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "label": "Academic Term",
- "options": "Academic Term"
- },
- {
- "fieldname": "section_break_5",
- "fieldtype": "Section Break",
- "label": "Schedule"
- },
- {
- "default": "Today",
- "fieldname": "schedule_date",
- "fieldtype": "Date",
- "in_list_view": 1,
- "label": "Schedule Date",
- "no_copy": 1,
- "reqd": 1
- },
- {
- "fieldname": "room",
- "fieldtype": "Link",
- "label": "Room",
- "options": "Room"
- },
- {
- "fieldname": "examiner",
- "fieldtype": "Link",
- "label": "Examiner",
- "options": "Instructor"
- },
- {
- "fetch_from": "examiner.instructor_name",
- "fieldname": "examiner_name",
- "fieldtype": "Data",
- "label": "Examiner Name",
- "read_only": 1
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "from_time",
- "fieldtype": "Time",
- "label": "From Time",
- "no_copy": 1,
- "reqd": 1
- },
- {
- "fieldname": "to_time",
- "fieldtype": "Time",
- "label": "To Time",
- "no_copy": 1,
- "reqd": 1
- },
- {
- "fieldname": "supervisor",
- "fieldtype": "Link",
- "label": "Supervisor",
- "options": "Instructor"
- },
- {
- "fetch_from": "supervisor.instructor_name",
- "fieldname": "supervisor_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Supervisor Name",
- "read_only": 1
- },
- {
- "fieldname": "section_break_20",
- "fieldtype": "Section Break",
- "label": "Evaluate"
- },
- {
- "fieldname": "maximum_assessment_score",
- "fieldtype": "Float",
- "label": "Maximum Assessment Score",
- "reqd": 1
- },
- {
- "fieldname": "assessment_criteria",
- "fieldtype": "Table",
- "label": "Assessment Criteria",
- "options": "Assessment Plan Criteria",
- "reqd": 1
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Assessment Plan",
- "print_hide": 1,
- "read_only": 1
- }
- ],
- "is_submittable": 1,
- "links": [],
- "modified": "2020-10-23 15:55:35.076251",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Plan",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "assessment_name"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_plan/assessment_plan.py b/erpnext/education/doctype/assessment_plan/assessment_plan.py
deleted file mode 100644
index e1265b4..0000000
--- a/erpnext/education/doctype/assessment_plan/assessment_plan.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class AssessmentPlan(Document):
- def validate(self):
- self.validate_overlap()
- self.validate_max_score()
- self.validate_assessment_criteria()
-
- def validate_overlap(self):
- """Validates overlap for Student Group, Instructor, Room"""
-
- from erpnext.education.utils import validate_overlap_for
-
- # Validate overlapping course schedules.
- if self.student_group:
- validate_overlap_for(self, "Course Schedule", "student_group")
-
- validate_overlap_for(self, "Course Schedule", "instructor")
- validate_overlap_for(self, "Course Schedule", "room")
-
- # validate overlapping assessment schedules.
- if self.student_group:
- validate_overlap_for(self, "Assessment Plan", "student_group")
-
- validate_overlap_for(self, "Assessment Plan", "room")
- validate_overlap_for(self, "Assessment Plan", "supervisor", self.supervisor)
-
- def validate_max_score(self):
- max_score = 0
- for d in self.assessment_criteria:
- max_score += d.maximum_score
- if self.maximum_assessment_score != max_score:
- frappe.throw(
- _("Sum of Scores of Assessment Criteria needs to be {0}.").format(
- self.maximum_assessment_score
- )
- )
-
- def validate_assessment_criteria(self):
- assessment_criteria_list = frappe.db.sql_list(
- """ select apc.assessment_criteria
- from `tabAssessment Plan` ap , `tabAssessment Plan Criteria` apc
- where ap.name = apc.parent and ap.course=%s and ap.student_group=%s and ap.assessment_group=%s
- and ap.name != %s and ap.docstatus=1""",
- (self.course, self.student_group, self.assessment_group, self.name),
- )
- for d in self.assessment_criteria:
- if d.assessment_criteria in assessment_criteria_list:
- frappe.throw(
- _("You have already assessed for the assessment criteria {}.").format(
- frappe.bold(d.assessment_criteria)
- )
- )
diff --git a/erpnext/education/doctype/assessment_plan/assessment_plan_dashboard.py b/erpnext/education/doctype/assessment_plan/assessment_plan_dashboard.py
deleted file mode 100644
index f9c583a..0000000
--- a/erpnext/education/doctype/assessment_plan/assessment_plan_dashboard.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "assessment_plan",
- "transactions": [{"label": _("Assessment"), "items": ["Assessment Result"]}],
- "reports": [{"label": _("Report"), "items": ["Assessment Plan Status"]}],
- }
diff --git a/erpnext/education/doctype/assessment_plan/test_assessment_plan.py b/erpnext/education/doctype/assessment_plan/test_assessment_plan.py
deleted file mode 100644
index e294c50..0000000
--- a/erpnext/education/doctype/assessment_plan/test_assessment_plan.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Assessment Plan')
-
-
-class TestAssessmentPlan(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/assessment_plan_criteria/__init__.py b/erpnext/education/doctype/assessment_plan_criteria/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/assessment_plan_criteria/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.json b/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.json
deleted file mode 100644
index d9ad0cb..0000000
--- a/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "",
- "beta": 0,
- "creation": "2016-12-14 17:20:27.738226",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "assessment_criteria",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Assessment Criteria",
- "length": 0,
- "no_copy": 0,
- "options": "Assessment Criteria",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "maximum_score",
- "fieldtype": "Float",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Maximum Score",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2017-11-10 19:10:50.560006",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Plan Criteria",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.py b/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.py
deleted file mode 100644
index 2cd17d6..0000000
--- a/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class AssessmentPlanCriteria(Document):
- pass
diff --git a/erpnext/education/doctype/assessment_result/__init__.py b/erpnext/education/doctype/assessment_result/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/assessment_result/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/assessment_result/assessment_result.js b/erpnext/education/doctype/assessment_result/assessment_result.js
deleted file mode 100644
index b6d2881..0000000
--- a/erpnext/education/doctype/assessment_result/assessment_result.js
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Assessment Result', {
- refresh: function(frm) {
- if (!frm.doc.__islocal) {
- frm.trigger('setup_chart');
- }
-
- frm.get_field('details').grid.cannot_add_rows = true;
-
- frm.set_query('course', function() {
- return {
- query: 'erpnext.education.doctype.program_enrollment.program_enrollment.get_program_courses',
- filters: {
- 'program': frm.doc.program
- }
- };
- });
-
- frm.set_query('academic_term', function() {
- return {
- filters: {
- 'academic_year': frm.doc.academic_year
- }
- };
- });
- },
-
- onload: function(frm) {
- frm.set_query('assessment_plan', function() {
- return {
- filters: {
- docstatus: 1
- }
- };
- });
- },
-
- assessment_plan: function(frm) {
- if (frm.doc.assessment_plan) {
- frappe.call({
- method: 'erpnext.education.api.get_assessment_details',
- args: {
- assessment_plan: frm.doc.assessment_plan
- },
- callback: function(r) {
- if (r.message) {
- frappe.model.clear_table(frm.doc, 'details');
- $.each(r.message, function(i, d) {
- var row = frm.add_child('details');
- row.assessment_criteria = d.assessment_criteria;
- row.maximum_score = d.maximum_score;
- });
- frm.refresh_field('details');
- }
- }
- });
- }
- },
-
- setup_chart: function(frm) {
- let labels = [];
- let maximum_scores = [];
- let scores = [];
- $.each(frm.doc.details, function(_i, e) {
- labels.push(e.assessment_criteria);
- maximum_scores.push(e.maximum_score);
- scores.push(e.score);
- });
-
- if (labels.length && maximum_scores.length && scores.length) {
- frm.dashboard.chart_area.empty().removeClass('hidden');
- new frappe.Chart('.form-graph', {
- title: 'Assessment Results',
- data: {
- labels: labels,
- datasets: [
- {
- name: 'Maximum Score',
- chartType: 'bar',
- values: maximum_scores,
- },
- {
- name: 'Score Obtained',
- chartType: 'bar',
- values: scores,
- }
- ]
- },
- colors: ['#4CA746', '#98D85B'],
- type: 'bar'
- });
- }
- }
-});
-
-frappe.ui.form.on('Assessment Result Detail', {
- score: function(frm, cdt, cdn) {
- var d = locals[cdt][cdn];
-
- if (!d.maximum_score || !frm.doc.grading_scale) {
- d.score = '';
- frappe.throw(__('Please fill in all the details to generate Assessment Result.'));
- }
-
- if (d.score > d.maximum_score) {
- frappe.throw(__('Score cannot be greater than Maximum Score'));
- }
- else {
- frappe.call({
- method: 'erpnext.education.api.get_grade',
- args: {
- grading_scale: frm.doc.grading_scale,
- percentage: ((d.score/d.maximum_score) * 100)
- },
- callback: function(r) {
- if (r.message) {
- frappe.model.set_value(cdt, cdn, 'grade', r.message);
- }
- }
- });
- }
- }
-});
diff --git a/erpnext/education/doctype/assessment_result/assessment_result.json b/erpnext/education/doctype/assessment_result/assessment_result.json
deleted file mode 100644
index 7a893aa..0000000
--- a/erpnext/education/doctype/assessment_result/assessment_result.json
+++ /dev/null
@@ -1,203 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "EDU-RES-.YYYY.-.#####",
- "creation": "2015-11-13 17:18:06.468332",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "assessment_plan",
- "program",
- "course",
- "academic_year",
- "academic_term",
- "column_break_3",
- "student",
- "student_name",
- "student_group",
- "assessment_group",
- "grading_scale",
- "section_break_5",
- "details",
- "section_break_8",
- "maximum_score",
- "column_break_11",
- "total_score",
- "grade",
- "section_break_13",
- "comment",
- "amended_from"
- ],
- "fields": [
- {
- "fieldname": "assessment_plan",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Assessment Plan",
- "options": "Assessment Plan",
- "reqd": 1
- },
- {
- "fetch_from": "assessment_plan.program",
- "fieldname": "program",
- "fieldtype": "Link",
- "label": "Program",
- "options": "Program"
- },
- {
- "fetch_from": "assessment_plan.course",
- "fieldname": "course",
- "fieldtype": "Link",
- "label": "Course",
- "options": "Course"
- },
- {
- "fetch_from": "assessment_plan.academic_year",
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "label": "Academic Year",
- "options": "Academic Year"
- },
- {
- "fetch_from": "assessment_plan.academic_term",
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "label": "Academic Term",
- "options": "Academic Term"
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "student",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Student",
- "options": "Student",
- "reqd": 1
- },
- {
- "fetch_from": "student.title",
- "fieldname": "student_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "in_list_view": 1,
- "label": "Student Name",
- "read_only": 1
- },
- {
- "fetch_from": "assessment_plan.student_group",
- "fieldname": "student_group",
- "fieldtype": "Link",
- "label": "Student Group",
- "options": "Student Group"
- },
- {
- "fetch_from": "assessment_plan.assessment_group",
- "fieldname": "assessment_group",
- "fieldtype": "Link",
- "label": "Assessment Group",
- "options": "Assessment Group"
- },
- {
- "fetch_from": "assessment_plan.grading_scale",
- "fieldname": "grading_scale",
- "fieldtype": "Link",
- "label": "Grading Scale",
- "options": "Grading Scale",
- "read_only": 1
- },
- {
- "fieldname": "section_break_5",
- "fieldtype": "Section Break",
- "label": "Result"
- },
- {
- "fieldname": "details",
- "fieldtype": "Table",
- "label": "Details",
- "options": "Assessment Result Detail",
- "reqd": 1
- },
- {
- "fieldname": "section_break_8",
- "fieldtype": "Section Break"
- },
- {
- "fetch_from": "assessment_plan.maximum_assessment_score",
- "fieldname": "maximum_score",
- "fieldtype": "Float",
- "label": "Maximum Score",
- "read_only": 1
- },
- {
- "fetch_from": "assessment_plan.maximum_assessment_score",
- "fieldname": "column_break_11",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "total_score",
- "fieldtype": "Float",
- "in_list_view": 1,
- "label": "Total Score",
- "read_only": 1
- },
- {
- "fieldname": "grade",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Grade",
- "read_only": 1
- },
- {
- "fieldname": "section_break_13",
- "fieldtype": "Section Break",
- "label": "Summary"
- },
- {
- "fieldname": "comment",
- "fieldtype": "Small Text",
- "label": "Comment"
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Assessment Result",
- "print_hide": 1,
- "read_only": 1
- }
- ],
- "is_submittable": 1,
- "links": [],
- "modified": "2020-08-03 11:47:54.119486",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Result",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "student_name"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_result/assessment_result.py b/erpnext/education/doctype/assessment_result/assessment_result.py
deleted file mode 100644
index 1d485c1..0000000
--- a/erpnext/education/doctype/assessment_result/assessment_result.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import flt
-from frappe.utils.csvutils import getlink
-
-import erpnext.education
-from erpnext.education.api import get_assessment_details, get_grade
-
-
-class AssessmentResult(Document):
- def validate(self):
- erpnext.education.validate_student_belongs_to_group(self.student, self.student_group)
- self.validate_maximum_score()
- self.validate_grade()
- self.validate_duplicate()
-
- def validate_maximum_score(self):
- assessment_details = get_assessment_details(self.assessment_plan)
- max_scores = {}
- for d in assessment_details:
- max_scores.update({d.assessment_criteria: d.maximum_score})
-
- for d in self.details:
- d.maximum_score = max_scores.get(d.assessment_criteria)
- if d.score > d.maximum_score:
- frappe.throw(_("Score cannot be greater than Maximum Score"))
-
- def validate_grade(self):
- self.total_score = 0.0
- for d in self.details:
- d.grade = get_grade(self.grading_scale, (flt(d.score) / d.maximum_score) * 100)
- self.total_score += d.score
- self.grade = get_grade(self.grading_scale, (self.total_score / self.maximum_score) * 100)
-
- def validate_duplicate(self):
- assessment_result = frappe.get_list(
- "Assessment Result",
- filters={
- "name": ("not in", [self.name]),
- "student": self.student,
- "assessment_plan": self.assessment_plan,
- "docstatus": ("!=", 2),
- },
- )
- if assessment_result:
- frappe.throw(
- _("Assessment Result record {0} already exists.").format(
- getlink("Assessment Result", assessment_result[0].name)
- )
- )
diff --git a/erpnext/education/doctype/assessment_result/assessment_result_dashboard.py b/erpnext/education/doctype/assessment_result/assessment_result_dashboard.py
deleted file mode 100644
index 5501f92..0000000
--- a/erpnext/education/doctype/assessment_result/assessment_result_dashboard.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "reports": [
- {"label": _("Reports"), "items": ["Final Assessment Grades", "Course wise Assessment Report"]}
- ]
- }
diff --git a/erpnext/education/doctype/assessment_result/test_assessment_result.py b/erpnext/education/doctype/assessment_result/test_assessment_result.py
deleted file mode 100644
index 4872f48..0000000
--- a/erpnext/education/doctype/assessment_result/test_assessment_result.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-from erpnext.education.api import get_grade
-
-# test_records = frappe.get_test_records('Assessment Result')
-
-
-class TestAssessmentResult(unittest.TestCase):
- def test_grade(self):
- grade = get_grade("_Test Grading Scale", 80)
- self.assertEqual("A", grade)
-
- grade = get_grade("_Test Grading Scale", 70)
- self.assertEqual("B", grade)
diff --git a/erpnext/education/doctype/assessment_result_detail/__init__.py b/erpnext/education/doctype/assessment_result_detail/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/assessment_result_detail/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.json b/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.json
deleted file mode 100644
index 450f41c..0000000
--- a/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "actions": [],
- "creation": "2016-12-14 17:44:35.583123",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "assessment_criteria",
- "maximum_score",
- "column_break_2",
- "score",
- "grade"
- ],
- "fields": [
- {
- "columns": 4,
- "fieldname": "assessment_criteria",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Assessment Criteria",
- "options": "Assessment Criteria",
- "read_only": 1,
- "reqd": 1
- },
- {
- "columns": 2,
- "fieldname": "maximum_score",
- "fieldtype": "Float",
- "in_list_view": 1,
- "label": "Maximum Score",
- "read_only": 1
- },
- {
- "fieldname": "column_break_2",
- "fieldtype": "Column Break"
- },
- {
- "columns": 2,
- "fieldname": "score",
- "fieldtype": "Float",
- "in_list_view": 1,
- "label": "Score",
- "reqd": 1
- },
- {
- "columns": 2,
- "fieldname": "grade",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Grade",
- "read_only": 1
- }
- ],
- "istable": 1,
- "links": [],
- "modified": "2020-07-31 13:27:17.699022",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Result Detail",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.py b/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.py
deleted file mode 100644
index 5ef1129..0000000
--- a/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class AssessmentResultDetail(Document):
- pass
diff --git a/erpnext/education/doctype/assessment_result_tool/__init__.py b/erpnext/education/doctype/assessment_result_tool/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/assessment_result_tool/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.js b/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.js
deleted file mode 100644
index 053f0c2..0000000
--- a/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.js
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-
-frappe.ui.form.on('Assessment Result Tool', {
- setup: function(frm) {
- frm.add_fetch("assessment_plan", "student_group", "student_group");
- },
-
- refresh: function(frm) {
- if (frappe.route_options) {
- frm.set_value("student_group", frappe.route_options.student_group);
- frm.set_value("assessment_plan", frappe.route_options.assessment_plan);
- frappe.route_options = null;
- } else {
- frm.trigger("assessment_plan");
- }
- frm.disable_save();
- frm.page.clear_indicator();
- },
-
- assessment_plan: function(frm) {
- frm.doc.show_submit = false;
- if(frm.doc.assessment_plan) {
- if (!frm.doc.student_group)
- return
- frappe.call({
- method: "erpnext.education.api.get_assessment_students",
- args: {
- "assessment_plan": frm.doc.assessment_plan,
- "student_group": frm.doc.student_group
- },
- callback: function(r) {
- if (r.message) {
- frm.doc.students = r.message;
- frm.events.render_table(frm);
- for (let value of r.message) {
- if (!value.docstatus) {
- frm.doc.show_submit = true;
- break;
- }
- }
- frm.events.submit_result(frm);
- }
- }
- });
- }
- },
-
- render_table: function(frm) {
- $(frm.fields_dict.result_html.wrapper).empty();
- let assessment_plan = frm.doc.assessment_plan;
- frappe.call({
- method: "erpnext.education.api.get_assessment_details",
- args: {
- assessment_plan: assessment_plan
- },
- callback: function(r) {
- frm.events.get_marks(frm, r.message);
- }
- });
- },
-
- get_marks: function(frm, criteria_list) {
- let max_total_score = 0;
- criteria_list.forEach(function(c) {
- max_total_score += c.maximum_score
- });
- var result_table = $(frappe.render_template('assessment_result_tool', {
- frm: frm,
- students: frm.doc.students,
- criteria: criteria_list,
- max_total_score: max_total_score
- }));
- result_table.appendTo(frm.fields_dict.result_html.wrapper);
-
- result_table.on('change', 'input', function(e) {
- let $input = $(e.target);
- let student = $input.data().student;
- let max_score = $input.data().maxScore;
- let value = $input.val();
- if(value < 0) {
- $input.val(0);
- } else if(value > max_score) {
- $input.val(max_score);
- }
- let total_score = 0;
- let student_scores = {};
- student_scores["assessment_details"] = {}
- result_table.find(`input[data-student=${student}].student-result-data`)
- .each(function(el, input) {
- let $input = $(input);
- let criteria = $input.data().criteria;
- let value = parseFloat($input.val());
- if (!Number.isNaN(value)) {
- student_scores["assessment_details"][criteria] = value;
- }
- total_score += value;
- });
- if(!Number.isNaN(total_score)) {
- result_table.find(`span[data-student=${student}].total-score`).html(total_score);
- }
- if (Object.keys(student_scores["assessment_details"]).length === criteria_list.length) {
- student_scores["student"] = student;
- student_scores["total_score"] = total_score;
- result_table.find(`[data-student=${student}].result-comment`)
- .each(function(el, input){
- student_scores["comment"] = $(input).val();
- });
- frappe.call({
- method: "erpnext.education.api.mark_assessment_result",
- args: {
- "assessment_plan": frm.doc.assessment_plan,
- "scores": student_scores
- },
- callback: function(r) {
- let assessment_result = r.message;
- if (!frm.doc.show_submit) {
- frm.doc.show_submit = true;
- frm.events.submit_result;
- }
- for (var criteria of Object.keys(assessment_result.details)) {
- result_table.find(`[data-criteria=${criteria}][data-student=${assessment_result
- .student}].student-result-grade`).each(function(e1, input) {
- $(input).html(assessment_result.details[criteria]);
- });
- }
- result_table.find(`span[data-student=${assessment_result.student}].total-score-grade`).html(assessment_result.grade);
- let link_span = result_table.find(`span[data-student=${assessment_result.student}].total-result-link`);
- $(link_span).css("display", "block");
- $(link_span).find("a").attr("href", "/app/assessment-result/"+assessment_result.name);
- }
- });
- }
- });
- },
-
- submit_result: function(frm) {
- if (frm.doc.show_submit) {
- frm.page.set_primary_action(__("Submit"), function() {
- frappe.call({
- method: "erpnext.education.api.submit_assessment_results",
- args: {
- "assessment_plan": frm.doc.assessment_plan,
- "student_group": frm.doc.student_group
- },
- callback: function(r) {
- if (r.message) {
- frappe.msgprint(__("{0} Result submittted", [r.message]));
- } else {
- frappe.msgprint(__("No Result to submit"));
- }
- frm.events.assessment_plan(frm);
- }
- });
- });
- }
- else {
- frm.page.clear_primary_action();
- }
- }
-});
diff --git a/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.json b/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.json
deleted file mode 100644
index ddef100..0000000
--- a/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.json
+++ /dev/null
@@ -1,235 +0,0 @@
-{
- "allow_copy": 1,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2017-01-05 12:27:48.951036",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "",
- "fieldname": "assessment_plan",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Assessment Plan",
- "length": 0,
- "no_copy": 0,
- "options": "Assessment Plan",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_group",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student Group",
- "length": 0,
- "no_copy": 0,
- "options": "Student Group",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "assessment_plan",
- "fieldname": "section_break_5",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "result_html",
- "fieldtype": "HTML",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Result HTML",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 1,
- "hide_toolbar": 1,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 1,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-12-27 09:36:37.155890",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Result Tool",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 0,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 0,
- "role": "Instructor",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.py b/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.py
deleted file mode 100644
index 4b953be..0000000
--- a/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class AssessmentResultTool(Document):
- pass
diff --git a/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.py b/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.py
deleted file mode 100644
index 49e0be0..0000000
--- a/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestAssessmentResultTool(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/content_activity/__init__.py b/erpnext/education/doctype/content_activity/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/content_activity/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/content_activity/content_activity.json b/erpnext/education/doctype/content_activity/content_activity.json
deleted file mode 100644
index b4c95da..0000000
--- a/erpnext/education/doctype/content_activity/content_activity.json
+++ /dev/null
@@ -1,141 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2018-10-16 03:55:53.283893",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "content",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Content",
- "length": 0,
- "no_copy": 0,
- "options": "Content",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "content.content_type",
- "fieldname": "content_type",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Content Type",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "last_activity",
- "fieldtype": "Datetime",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Last Activity ",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-10-16 03:55:58.202436",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Content Activity",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/content_activity/content_activity.py b/erpnext/education/doctype/content_activity/content_activity.py
deleted file mode 100644
index f30cb87..0000000
--- a/erpnext/education/doctype/content_activity/content_activity.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class ContentActivity(Document):
- pass
diff --git a/erpnext/education/doctype/content_question/__init__.py b/erpnext/education/doctype/content_question/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/content_question/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/content_question/content_question.js b/erpnext/education/doctype/content_question/content_question.js
deleted file mode 100644
index 7615f5e..0000000
--- a/erpnext/education/doctype/content_question/content_question.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Content Question', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/content_question/content_question.json b/erpnext/education/doctype/content_question/content_question.json
deleted file mode 100644
index d390e8e..0000000
--- a/erpnext/education/doctype/content_question/content_question.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2018-10-15 14:35:40.728454",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "question_link",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Question Link",
- "length": 0,
- "no_copy": 0,
- "options": "Question",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-10-15 14:41:31.729083",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Content Question",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/content_question/content_question.py b/erpnext/education/doctype/content_question/content_question.py
deleted file mode 100644
index f52f0c8..0000000
--- a/erpnext/education/doctype/content_question/content_question.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class ContentQuestion(Document):
- pass
diff --git a/erpnext/education/doctype/content_question/test_content_question.py b/erpnext/education/doctype/content_question/test_content_question.py
deleted file mode 100644
index 63a5a96..0000000
--- a/erpnext/education/doctype/content_question/test_content_question.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestContentQuestion(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/course/__init__.py b/erpnext/education/doctype/course/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/course/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/course/course.js b/erpnext/education/doctype/course/course.js
deleted file mode 100644
index bd8d62c..0000000
--- a/erpnext/education/doctype/course/course.js
+++ /dev/null
@@ -1,79 +0,0 @@
-frappe.ui.form.on('Course', {
- refresh: function(frm) {
- if (!cur_frm.doc.__islocal) {
- frm.add_custom_button(__('Add to Programs'), function() {
- frm.trigger('add_course_to_programs')
- }, __('Action'));
- }
-
- frm.set_query('default_grading_scale', function(){
- return {
- filters: {
- docstatus: 1
- }
- }
- });
- },
-
- add_course_to_programs: function(frm) {
- get_programs_without_course(frm.doc.name).then(r => {
- if (r.message.length) {
- frappe.prompt([
- {
- fieldname: 'programs',
- label: __('Programs'),
- fieldtype: 'MultiSelectPills',
- get_data: function() {
- return r.message;
- }
- },
- {
- fieldtype: 'Check',
- label: __('Is Mandatory'),
- fieldname: 'mandatory',
- }
- ],
- function(data) {
- frappe.call({
- method: 'erpnext.education.doctype.course.course.add_course_to_programs',
- args: {
- 'course': frm.doc.name,
- 'programs': data.programs,
- 'mandatory': data.mandatory
- },
- callback: function(r) {
- if (!r.exc) {
- frm.reload_doc();
- }
- },
- freeze: true,
- freeze_message: __('...Adding Course to Programs')
- })
- }, __('Add Course to Programs'), __('Add'));
- } else {
- frappe.msgprint(__('This course is already added to the existing programs'));
- }
- });
- }
-});
-
-frappe.ui.form.on('Course Topic', {
- topics_add: function(frm){
- frm.fields_dict['topics'].grid.get_field('topic').get_query = function(doc){
- var topics_list = [];
- if(!doc.__islocal) topics_list.push(doc.name);
- $.each(doc.topics, function(idx, val){
- if (val.topic) topics_list.push(val.topic);
- });
- return { filters: [['Topic', 'name', 'not in', topics_list]] };
- };
- }
-});
-
-let get_programs_without_course = function(course) {
- return frappe.call({
- type: 'GET',
- method: 'erpnext.education.doctype.course.course.get_programs_without_course',
- args: {'course': course}
- });
-}
diff --git a/erpnext/education/doctype/course/course.json b/erpnext/education/doctype/course/course.json
deleted file mode 100644
index da10db1..0000000
--- a/erpnext/education/doctype/course/course.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:course_name",
- "creation": "2015-09-07 12:39:55.181893",
- "doctype": "DocType",
- "engine": "InnoDB",
- "field_order": [
- "course_name",
- "department",
- "section_break_6",
- "topics",
- "description",
- "hero_image",
- "assessment",
- "default_grading_scale",
- "assessment_criteria"
- ],
- "fields": [
- {
- "fieldname": "course_name",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Course Name",
- "reqd": 1,
- "unique": 1
- },
- {
- "fieldname": "department",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Department",
- "options": "Department"
- },
- {
- "fieldname": "section_break_6",
- "fieldtype": "Section Break",
- "label": "Portal Settings"
- },
- {
- "fieldname": "topics",
- "fieldtype": "Table",
- "label": "Topics",
- "options": "Course Topic"
- },
- {
- "fieldname": "hero_image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "label": "Hero Image"
- },
- {
- "fieldname": "assessment",
- "fieldtype": "Section Break",
- "label": "Assessment"
- },
- {
- "fieldname": "default_grading_scale",
- "fieldtype": "Link",
- "label": "Default Grading Scale",
- "options": "Grading Scale"
- },
- {
- "fieldname": "assessment_criteria",
- "fieldtype": "Table",
- "label": "Assessment Criteria",
- "options": "Course Assessment Criteria"
- },
- {
- "fieldname": "description",
- "fieldtype": "Small Text",
- "label": "Description"
- }
- ],
- "image_field": "hero_image",
- "modified": "2020-03-29 12:50:27.677589",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Administrator",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Education Manager",
- "share": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "search_fields": "course_name",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/course/course.py b/erpnext/education/doctype/course/course.py
deleted file mode 100644
index baf72e8..0000000
--- a/erpnext/education/doctype/course/course.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import json
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class Course(Document):
- def validate(self):
- self.validate_assessment_criteria()
-
- def validate_assessment_criteria(self):
- if self.assessment_criteria:
- total_weightage = 0
- for criteria in self.assessment_criteria:
- total_weightage += criteria.weightage or 0
- if total_weightage != 100:
- frappe.throw(_("Total Weightage of all Assessment Criteria must be 100%"))
-
- def get_topics(self):
- topic_data = []
- for topic in self.topics:
- topic_doc = frappe.get_doc("Topic", topic.topic)
- if topic_doc.topic_content:
- topic_data.append(topic_doc)
- return topic_data
-
-
-@frappe.whitelist()
-def add_course_to_programs(course, programs, mandatory=False):
- programs = json.loads(programs)
- for entry in programs:
- program = frappe.get_doc("Program", entry)
- program.append("courses", {"course": course, "course_name": course, "mandatory": mandatory})
- program.flags.ignore_mandatory = True
- program.save()
- frappe.db.commit()
- frappe.msgprint(
- _("Course {0} has been added to all the selected programs successfully.").format(
- frappe.bold(course)
- ),
- title=_("Programs updated"),
- indicator="green",
- )
-
-
-@frappe.whitelist()
-def get_programs_without_course(course):
- data = []
- for entry in frappe.db.get_all("Program"):
- program = frappe.get_doc("Program", entry.name)
- courses = [c.course for c in program.courses]
- if not courses or course not in courses:
- data.append(program.name)
- return data
diff --git a/erpnext/education/doctype/course/course_dashboard.py b/erpnext/education/doctype/course/course_dashboard.py
deleted file mode 100644
index 6ba4475..0000000
--- a/erpnext/education/doctype/course/course_dashboard.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "course",
- "transactions": [
- {
- "label": _("Program and Course"),
- "items": ["Program", "Course Enrollment", "Course Schedule"],
- },
- {"label": _("Student"), "items": ["Student Group"]},
- {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
- ],
- }
diff --git a/erpnext/education/doctype/course/test_course.py b/erpnext/education/doctype/course/test_course.py
deleted file mode 100644
index caddefe..0000000
--- a/erpnext/education/doctype/course/test_course.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-
-from erpnext.education.doctype.topic.test_topic import make_topic, make_topic_and_linked_content
-
-# test_records = frappe.get_test_records('Course')
-
-
-class TestCourse(unittest.TestCase):
- def setUp(self):
- make_topic_and_linked_content("_Test Topic 1", [{"type": "Article", "name": "_Test Article 1"}])
- make_topic_and_linked_content("_Test Topic 2", [{"type": "Article", "name": "_Test Article 2"}])
- make_course_and_linked_topic("_Test Course 1", ["_Test Topic 1", "_Test Topic 2"])
-
- def test_get_topics(self):
- course = frappe.get_doc("Course", "_Test Course 1")
- topics = course.get_topics()
- self.assertEqual(topics[0].name, "_Test Topic 1")
- self.assertEqual(topics[1].name, "_Test Topic 2")
- frappe.db.rollback()
-
-
-def make_course(name):
- try:
- course = frappe.get_doc("Course", name)
- except frappe.DoesNotExistError:
- course = frappe.get_doc({"doctype": "Course", "course_name": name, "course_code": name}).insert()
- return course.name
-
-
-def make_course_and_linked_topic(course_name, topic_name_list):
- try:
- course = frappe.get_doc("Course", course_name)
- except frappe.DoesNotExistError:
- make_course(course_name)
- course = frappe.get_doc("Course", course_name)
- topic_list = [make_topic(topic_name) for topic_name in topic_name_list]
- for topic in topic_list:
- course.append("topics", {"topic": topic})
- course.save()
- return course
diff --git a/erpnext/education/doctype/course/test_records.json b/erpnext/education/doctype/course/test_records.json
deleted file mode 100644
index 1e7467a..0000000
--- a/erpnext/education/doctype/course/test_records.json
+++ /dev/null
@@ -1,14 +0,0 @@
-[
- {
- "course_name": "TC100",
- "course_abbreviation": "TC"
- },
- {
- "course_name": "TC101",
- "course_abbreviation": "TC1"
- },
- {
- "course_name": "TC102",
- "course_abbreviation": "TC2"
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/course_activity/__init__.py b/erpnext/education/doctype/course_activity/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/course_activity/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/course_activity/course_activity.js b/erpnext/education/doctype/course_activity/course_activity.js
deleted file mode 100644
index 5115fc4..0000000
--- a/erpnext/education/doctype/course_activity/course_activity.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Course Activity', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/course_activity/course_activity.json b/erpnext/education/doctype/course_activity/course_activity.json
deleted file mode 100644
index 3e23c90..0000000
--- a/erpnext/education/doctype/course_activity/course_activity.json
+++ /dev/null
@@ -1,301 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "format:EDU-CA-{YYYY}-{#####}",
- "beta": 1,
- "creation": "2018-10-01 17:35:54.391413",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "enrollment",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Course Enrollment",
- "length": 0,
- "no_copy": 0,
- "options": "Course Enrollment",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "enrollment.course",
- "fieldname": "course",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Course",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "enrollment.student",
- "fieldname": "student",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Student",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "content_type",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Content Type",
- "length": 0,
- "no_copy": 0,
- "options": "\nArticle\nVideo",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "content",
- "fieldtype": "Dynamic Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Content",
- "length": 0,
- "no_copy": 0,
- "options": "content_type",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "activity_date",
- "fieldtype": "Datetime",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Activity Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-12-06 11:53:08.006123",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course Activity",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 1,
- "if_owner": 1,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "LMS User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 0
- },
- {
- "amend": 0,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 0
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
diff --git a/erpnext/education/doctype/course_activity/course_activity.py b/erpnext/education/doctype/course_activity/course_activity.py
deleted file mode 100644
index 784260d..0000000
--- a/erpnext/education/doctype/course_activity/course_activity.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class CourseActivity(Document):
- def validate(self):
- self.check_if_enrolled()
-
- def check_if_enrolled(self):
- if frappe.db.exists("Course Enrollment", self.enrollment):
- return True
- else:
- frappe.throw(_("Course Enrollment {0} does not exists").format(self.enrollment))
diff --git a/erpnext/education/doctype/course_activity/test_course_activity.py b/erpnext/education/doctype/course_activity/test_course_activity.py
deleted file mode 100644
index 677b60a..0000000
--- a/erpnext/education/doctype/course_activity/test_course_activity.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-
-
-class TestCourseActivity(unittest.TestCase):
- pass
-
-
-def make_course_activity(enrollment, content_type, content):
- activity = frappe.get_all(
- "Course Activity",
- filters={"enrollment": enrollment, "content_type": content_type, "content": content},
- )
- try:
- activity = frappe.get_doc("Course Activity", activity[0]["name"])
- except (IndexError, frappe.DoesNotExistError):
- activity = frappe.get_doc(
- {
- "doctype": "Course Activity",
- "enrollment": enrollment,
- "content_type": content_type,
- "content": content,
- "activity_date": frappe.utils.datetime.datetime.now(),
- }
- ).insert()
- return activity
diff --git a/erpnext/education/doctype/course_assessment_criteria/__init__.py b/erpnext/education/doctype/course_assessment_criteria/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/course_assessment_criteria/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.json b/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.json
deleted file mode 100644
index 2d8c0b3..0000000
--- a/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "",
- "beta": 0,
- "creation": "2016-12-14 16:46:46.786353",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "assessment_criteria",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Assessment Criteria",
- "length": 0,
- "no_copy": 0,
- "options": "Assessment Criteria",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "weightage",
- "fieldtype": "Percent",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Weightage",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2017-11-10 19:10:44.710837",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course Assessment Criteria",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.py b/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.py
deleted file mode 100644
index 4223741..0000000
--- a/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class CourseAssessmentCriteria(Document):
- pass
diff --git a/erpnext/education/doctype/course_content/__init__.py b/erpnext/education/doctype/course_content/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/course_content/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/course_content/course_content.js b/erpnext/education/doctype/course_content/course_content.js
deleted file mode 100644
index b9faf99..0000000
--- a/erpnext/education/doctype/course_content/course_content.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Course Content', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/course_content/course_content.json b/erpnext/education/doctype/course_content/course_content.json
deleted file mode 100644
index 378e560..0000000
--- a/erpnext/education/doctype/course_content/course_content.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2018-10-01 13:04:09.313771",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "",
- "fieldname": "content_type",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Content Type",
- "length": 0,
- "no_copy": 0,
- "options": "\nArticle\nVideo\nQuiz",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "content",
- "fieldtype": "Dynamic Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Content",
- "length": 0,
- "no_copy": 0,
- "options": "content_type",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-10-17 07:36:04.029818",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course Content",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/course_content/course_content.py b/erpnext/education/doctype/course_content/course_content.py
deleted file mode 100644
index abc370e..0000000
--- a/erpnext/education/doctype/course_content/course_content.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class CourseContent(Document):
- pass
diff --git a/erpnext/education/doctype/course_content/test_course_content.py b/erpnext/education/doctype/course_content/test_course_content.py
deleted file mode 100644
index 49f042e..0000000
--- a/erpnext/education/doctype/course_content/test_course_content.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestCourseContent(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/course_enrollment/__init__.py b/erpnext/education/doctype/course_enrollment/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/course_enrollment/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment.js b/erpnext/education/doctype/course_enrollment/course_enrollment.js
deleted file mode 100644
index b5d3cc5..0000000
--- a/erpnext/education/doctype/course_enrollment/course_enrollment.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Course Enrollment', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment.json b/erpnext/education/doctype/course_enrollment/course_enrollment.json
deleted file mode 100644
index 6286ec1..0000000
--- a/erpnext/education/doctype/course_enrollment/course_enrollment.json
+++ /dev/null
@@ -1,233 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "format:EDU-CE-{YYYY}-{#####}",
- "beta": 1,
- "creation": "2018-10-15 15:35:39.375161",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "program_enrollment",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Program Enrollment",
- "length": 0,
- "no_copy": 0,
- "options": "Program Enrollment",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 1,
- "label": "Student",
- "length": 0,
- "no_copy": 0,
- "options": "Student",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "course",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Course",
- "length": 0,
- "no_copy": 0,
- "options": "Course",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "enrollment_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Enrollment Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-11-25 18:59:01.742377",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course Enrollment",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "LMS User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 0
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment.py b/erpnext/education/doctype/course_enrollment/course_enrollment.py
deleted file mode 100644
index 18639b1..0000000
--- a/erpnext/education/doctype/course_enrollment/course_enrollment.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from functools import reduce
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import get_link_to_form
-
-
-class CourseEnrollment(Document):
- def validate(self):
- self.validate_duplication()
-
- def get_progress(self, student):
- """
- Returns Progress of given student for a particular course enrollment
-
- :param self: Course Enrollment Object
- :param student: Student Object
- """
- course = frappe.get_doc("Course", self.course)
- topics = course.get_topics()
- progress = []
- for topic in topics:
- progress.append(student.get_topic_progress(self.name, topic))
- if progress:
- return reduce(lambda x, y: x + y, progress) # Flatten out the List
- else:
- return []
-
- def validate_duplication(self):
- enrollment = frappe.db.exists(
- "Course Enrollment",
- {
- "student": self.student,
- "course": self.course,
- "program_enrollment": self.program_enrollment,
- "name": ("!=", self.name),
- },
- )
- if enrollment:
- frappe.throw(
- _("Student is already enrolled via Course Enrollment {0}").format(
- get_link_to_form("Course Enrollment", enrollment)
- ),
- title=_("Duplicate Entry"),
- )
-
- def add_quiz_activity(self, quiz_name, quiz_response, answers, score, status, time_taken):
- result = {k: ("Correct" if v else "Wrong") for k, v in answers.items()}
- result_data = []
- for key in answers:
- item = {}
- item["question"] = key
- item["quiz_result"] = result[key]
- try:
- if not quiz_response[key]:
- item["selected_option"] = "Unattempted"
- elif isinstance(quiz_response[key], list):
- item["selected_option"] = ", ".join(
- frappe.get_value("Options", res, "option") for res in quiz_response[key]
- )
- else:
- item["selected_option"] = frappe.get_value("Options", quiz_response[key], "option")
- except KeyError:
- item["selected_option"] = "Unattempted"
- result_data.append(item)
-
- quiz_activity = frappe.get_doc(
- {
- "doctype": "Quiz Activity",
- "enrollment": self.name,
- "quiz": quiz_name,
- "activity_date": frappe.utils.datetime.datetime.now(),
- "result": result_data,
- "score": score,
- "status": status,
- "time_taken": time_taken,
- }
- ).insert(ignore_permissions=True)
-
- def add_activity(self, content_type, content):
- activity = check_activity_exists(self.name, content_type, content)
- if activity:
- return activity
- else:
- activity = frappe.get_doc(
- {
- "doctype": "Course Activity",
- "enrollment": self.name,
- "content_type": content_type,
- "content": content,
- "activity_date": frappe.utils.datetime.datetime.now(),
- }
- )
-
- activity.insert(ignore_permissions=True)
- return activity.name
-
-
-def check_activity_exists(enrollment, content_type, content):
- activity = frappe.get_all(
- "Course Activity",
- filters={"enrollment": enrollment, "content_type": content_type, "content": content},
- )
- if activity:
- return activity[0].name
- else:
- return None
diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment_dashboard.py b/erpnext/education/doctype/course_enrollment/course_enrollment_dashboard.py
deleted file mode 100644
index 31a90fd..0000000
--- a/erpnext/education/doctype/course_enrollment/course_enrollment_dashboard.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "enrollment",
- "transactions": [{"label": _("Activity"), "items": ["Course Activity", "Quiz Activity"]}],
- }
diff --git a/erpnext/education/doctype/course_enrollment/test_course_enrollment.py b/erpnext/education/doctype/course_enrollment/test_course_enrollment.py
deleted file mode 100644
index 6862e05..0000000
--- a/erpnext/education/doctype/course_enrollment/test_course_enrollment.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-
-from erpnext.education.doctype.course_activity.test_course_activity import make_course_activity
-from erpnext.education.doctype.program.test_program import setup_program
-from erpnext.education.doctype.student.test_student import create_student, get_student
-
-
-class TestCourseEnrollment(unittest.TestCase):
- def setUp(self):
- setup_program()
- student = create_student(
- {"first_name": "_Test First", "last_name": "_Test Last", "email": "_test_student_1@example.com"}
- )
- program_enrollment = student.enroll_in_program("_Test Program")
- course_enrollment = frappe.db.get_value(
- "Course Enrollment",
- {
- "course": "_Test Course 1",
- "student": student.name,
- "program_enrollment": program_enrollment.name,
- },
- "name",
- )
- make_course_activity(course_enrollment, "Article", "_Test Article 1-1")
-
- def test_get_progress(self):
- student = get_student("_test_student_1@example.com")
- program_enrollment_name = frappe.get_list(
- "Program Enrollment", filters={"student": student.name, "Program": "_Test Program"}
- )[0].name
- course_enrollment_name = frappe.get_list(
- "Course Enrollment",
- filters={
- "student": student.name,
- "course": "_Test Course 1",
- "program_enrollment": program_enrollment_name,
- },
- )[0].name
- course_enrollment = frappe.get_doc("Course Enrollment", course_enrollment_name)
- progress = course_enrollment.get_progress(student)
- finished = {"content": "_Test Article 1-1", "content_type": "Article", "is_complete": True}
- self.assertTrue(finished in progress)
- frappe.db.rollback()
-
- def tearDown(self):
- for entry in frappe.db.get_all("Course Enrollment"):
- frappe.delete_doc("Course Enrollment", entry.name)
-
- for entry in frappe.db.get_all("Program Enrollment"):
- doc = frappe.get_doc("Program Enrollment", entry.name)
- doc.cancel()
- doc.delete()
diff --git a/erpnext/education/doctype/course_schedule/__init__.py b/erpnext/education/doctype/course_schedule/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/course_schedule/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/course_schedule/course_schedule.js b/erpnext/education/doctype/course_schedule/course_schedule.js
deleted file mode 100644
index 366bbd8..0000000
--- a/erpnext/education/doctype/course_schedule/course_schedule.js
+++ /dev/null
@@ -1,16 +0,0 @@
-frappe.provide("education");
-
-cur_frm.add_fetch("student_group", "course", "course")
-frappe.ui.form.on("Course Schedule", {
- refresh: function(frm) {
- if (!frm.doc.__islocal) {
- frm.add_custom_button(__("Mark Attendance"), function() {
- frappe.route_options = {
- based_on: "Course Schedule",
- course_schedule: frm.doc.name
- }
- frappe.set_route("Form", "Student Attendance Tool");
- }).addClass("btn-primary");
- }
- }
-});
diff --git a/erpnext/education/doctype/course_schedule/course_schedule.json b/erpnext/education/doctype/course_schedule/course_schedule.json
deleted file mode 100644
index 38d9b50..0000000
--- a/erpnext/education/doctype/course_schedule/course_schedule.json
+++ /dev/null
@@ -1,143 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "naming_series:",
- "creation": "2015-09-09 16:34:04.960369",
- "doctype": "DocType",
- "document_type": "Document",
- "engine": "InnoDB",
- "field_order": [
- "student_group",
- "instructor",
- "instructor_name",
- "column_break_2",
- "naming_series",
- "course",
- "color",
- "section_break_6",
- "schedule_date",
- "room",
- "column_break_9",
- "from_time",
- "to_time",
- "title"
- ],
- "fields": [
- {
- "fieldname": "student_group",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_standard_filter": 1,
- "label": "Student Group",
- "options": "Student Group",
- "reqd": 1
- },
- {
- "fieldname": "instructor",
- "fieldtype": "Link",
- "in_standard_filter": 1,
- "label": "Instructor",
- "options": "Instructor",
- "reqd": 1
- },
- {
- "fetch_from": "instructor.instructor_name",
- "fieldname": "instructor_name",
- "fieldtype": "Read Only",
- "in_global_search": 1,
- "label": "Instructor Name",
- "read_only": 1
- },
- {
- "fieldname": "column_break_2",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Naming Series",
- "options": "EDU-CSH-.YYYY.-",
- "set_only_once": 1
- },
- {
- "fieldname": "course",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Course",
- "options": "Course",
- "reqd": 1
- },
- {
- "fieldname": "color",
- "fieldtype": "Color",
- "label": "Color",
- "print_hide": 1
- },
- {
- "fieldname": "section_break_6",
- "fieldtype": "Section Break"
- },
- {
- "default": "Today",
- "fieldname": "schedule_date",
- "fieldtype": "Date",
- "label": "Schedule Date"
- },
- {
- "fieldname": "room",
- "fieldtype": "Link",
- "label": "Room",
- "options": "Room",
- "reqd": 1
- },
- {
- "fieldname": "column_break_9",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "from_time",
- "fieldtype": "Time",
- "in_list_view": 1,
- "label": "From Time",
- "reqd": 1
- },
- {
- "fieldname": "to_time",
- "fieldtype": "Time",
- "in_list_view": 1,
- "label": "To Time",
- "reqd": 1
- },
- {
- "fieldname": "title",
- "fieldtype": "Data",
- "hidden": 1,
- "label": "Title"
- }
- ],
- "links": [],
- "modified": "2021-11-24 11:57:08.164449",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course Schedule",
- "naming_rule": "By \"Naming Series\" field",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "sort_field": "schedule_date",
- "sort_order": "DESC",
- "title_field": "title"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/course_schedule/course_schedule.py b/erpnext/education/doctype/course_schedule/course_schedule.py
deleted file mode 100644
index d2b31f4..0000000
--- a/erpnext/education/doctype/course_schedule/course_schedule.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-from datetime import datetime
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class CourseSchedule(Document):
- def validate(self):
- self.instructor_name = frappe.db.get_value("Instructor", self.instructor, "instructor_name")
- self.set_title()
- self.validate_course()
- self.validate_date()
- self.validate_overlap()
-
- def set_title(self):
- """Set document Title"""
- self.title = (
- self.course + " by " + (self.instructor_name if self.instructor_name else self.instructor)
- )
-
- def validate_course(self):
- group_based_on, course = frappe.db.get_value(
- "Student Group", self.student_group, ["group_based_on", "course"]
- )
- if group_based_on == "Course":
- self.course = course
-
- def validate_date(self):
- """Validates if from_time is greater than to_time"""
- if self.from_time > self.to_time:
- frappe.throw(_("From Time cannot be greater than To Time."))
-
- """Handles specicfic case to update schedule date in calendar """
- if isinstance(self.from_time, str):
- try:
- datetime_obj = datetime.strptime(self.from_time, "%Y-%m-%d %H:%M:%S")
- self.schedule_date = datetime_obj
- except ValueError:
- pass
-
- def validate_overlap(self):
- """Validates overlap for Student Group, Instructor, Room"""
-
- from erpnext.education.utils import validate_overlap_for
-
- # Validate overlapping course schedules.
- if self.student_group:
- validate_overlap_for(self, "Course Schedule", "student_group")
-
- validate_overlap_for(self, "Course Schedule", "instructor")
- validate_overlap_for(self, "Course Schedule", "room")
-
- # validate overlapping assessment schedules.
- if self.student_group:
- validate_overlap_for(self, "Assessment Plan", "student_group")
-
- validate_overlap_for(self, "Assessment Plan", "room")
- validate_overlap_for(self, "Assessment Plan", "supervisor", self.instructor)
diff --git a/erpnext/education/doctype/course_schedule/course_schedule_calendar.js b/erpnext/education/doctype/course_schedule/course_schedule_calendar.js
deleted file mode 100644
index cacd539..0000000
--- a/erpnext/education/doctype/course_schedule/course_schedule_calendar.js
+++ /dev/null
@@ -1,38 +0,0 @@
-frappe.views.calendar["Course Schedule"] = {
- field_map: {
- "start": "from_time",
- "end": "to_time",
- "id": "name",
- "title": "course",
- "allDay": "allDay",
- },
- gantt: false,
- order_by: "schedule_date",
- filters: [
- {
- "fieldtype": "Link",
- "fieldname": "student_group",
- "options": "Student Group",
- "label": __("Student Group")
- },
- {
- "fieldtype": "Link",
- "fieldname": "course",
- "options": "Course",
- "label": __("Course")
- },
- {
- "fieldtype": "Link",
- "fieldname": "instructor",
- "options": "Instructor",
- "label": __("Instructor")
- },
- {
- "fieldtype": "Link",
- "fieldname": "room",
- "options": "Room",
- "label": __("Room")
- }
- ],
- get_events_method: "erpnext.education.api.get_course_schedule_events"
-}
diff --git a/erpnext/education/doctype/course_schedule/course_schedule_dashboard.py b/erpnext/education/doctype/course_schedule/course_schedule_dashboard.py
deleted file mode 100644
index 76a3f04..0000000
--- a/erpnext/education/doctype/course_schedule/course_schedule_dashboard.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "course_schedule",
- "transactions": [{"label": _("Attendance"), "items": ["Student Attendance"]}],
- }
diff --git a/erpnext/education/doctype/course_schedule/test_course_schedule.py b/erpnext/education/doctype/course_schedule/test_course_schedule.py
deleted file mode 100644
index ac09464..0000000
--- a/erpnext/education/doctype/course_schedule/test_course_schedule.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import datetime
-import unittest
-
-import frappe
-from frappe.utils import to_timedelta, today
-from frappe.utils.data import add_to_date
-
-from erpnext.education.utils import OverlapError
-
-# test_records = frappe.get_test_records('Course Schedule')
-
-
-class TestCourseSchedule(unittest.TestCase):
- def test_student_group_conflict(self):
- cs1 = make_course_schedule_test_record(simulate=True)
-
- cs2 = make_course_schedule_test_record(
- schedule_date=cs1.schedule_date,
- from_time=cs1.from_time,
- to_time=cs1.to_time,
- instructor="_Test Instructor 2",
- room=frappe.get_all("Room")[1].name,
- do_not_save=1,
- )
- self.assertRaises(OverlapError, cs2.save)
-
- def test_instructor_conflict(self):
- cs1 = make_course_schedule_test_record(simulate=True)
-
- cs2 = make_course_schedule_test_record(
- from_time=cs1.from_time,
- to_time=cs1.to_time,
- student_group="Course-TC101-2014-2015 (_Test Academic Term)",
- room=frappe.get_all("Room")[1].name,
- do_not_save=1,
- )
- self.assertRaises(OverlapError, cs2.save)
-
- def test_room_conflict(self):
- cs1 = make_course_schedule_test_record(simulate=True)
-
- cs2 = make_course_schedule_test_record(
- from_time=cs1.from_time,
- to_time=cs1.to_time,
- student_group="Course-TC101-2014-2015 (_Test Academic Term)",
- instructor="_Test Instructor 2",
- do_not_save=1,
- )
- self.assertRaises(OverlapError, cs2.save)
-
- def test_no_conflict(self):
- cs1 = make_course_schedule_test_record(simulate=True)
-
- make_course_schedule_test_record(
- from_time=cs1.from_time,
- to_time=cs1.to_time,
- student_group="Course-TC102-2014-2015 (_Test Academic Term)",
- instructor="_Test Instructor 2",
- room=frappe.get_all("Room")[1].name,
- )
-
- def test_update_schedule_date(self):
- doc = make_course_schedule_test_record(schedule_date=add_to_date(today(), days=1))
- doc.schedule_date = add_to_date(doc.schedule_date, days=1)
- doc.save()
-
-
-def make_course_schedule_test_record(**args):
- args = frappe._dict(args)
-
- course_schedule = frappe.new_doc("Course Schedule")
- course_schedule.student_group = (
- args.student_group or "Course-TC101-2014-2015 (_Test Academic Term)"
- )
- course_schedule.course = args.course or "TC101"
- course_schedule.instructor = args.instructor or "_Test Instructor"
- course_schedule.room = args.room or frappe.get_all("Room")[0].name
-
- course_schedule.schedule_date = args.schedule_date or today()
- course_schedule.from_time = args.from_time or to_timedelta("01:00:00")
- course_schedule.to_time = args.to_time or course_schedule.from_time + datetime.timedelta(hours=1)
-
- if not args.do_not_save:
- if args.simulate:
- while True:
- try:
- course_schedule.save()
- break
- except OverlapError:
- course_schedule.from_time = course_schedule.from_time + datetime.timedelta(minutes=10)
- course_schedule.to_time = course_schedule.from_time + datetime.timedelta(hours=1)
- else:
- course_schedule.save()
-
- return course_schedule
diff --git a/erpnext/education/doctype/course_scheduling_tool/__init__.py b/erpnext/education/doctype/course_scheduling_tool/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/course_scheduling_tool/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.js b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.js
deleted file mode 100644
index 7b0e4ab..0000000
--- a/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.js
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-
-frappe.ui.form.on('Course Scheduling Tool', {
- setup(frm) {
- frm.add_fetch('student_group', 'program', 'program');
- frm.add_fetch('student_group', 'course', 'course');
- frm.add_fetch('student_group', 'academic_year', 'academic_year');
- frm.add_fetch('student_group', 'academic_term', 'academic_term');
- },
- refresh(frm) {
- frm.disable_save();
- frm.page.set_primary_action(__('Schedule Course'), () => {
- frm.call('schedule_course')
- .then(r => {
- if (!r.message) {
- frappe.throw(__('There were errors creating Course Schedule'));
- }
- const { course_schedules } = r.message;
- if (course_schedules) {
- const course_schedules_html = course_schedules.map(c => `
- <tr>
- <td><a href="/app/course-schedule/${c.name}">${c.name}</a></td>
- <td>${c.schedule_date}</td>
- </tr>
- `).join('');
-
- const html = `
- <table class="table table-bordered">
- <caption>${__('Following course schedules were created')}</caption>
- <thead><tr><th>${__("Course")}</th><th>${__("Date")}</th></tr></thead>
- <tbody>
- ${course_schedules_html}
- </tbody>
- </table>
- `;
-
- frappe.msgprint(html);
- }
- });
- });
- }
-});
diff --git a/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.json b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.json
deleted file mode 100644
index 13dfe38..0000000
--- a/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.json
+++ /dev/null
@@ -1,168 +0,0 @@
-{
- "actions": [],
- "allow_copy": 1,
- "creation": "2015-09-23 15:37:38.108475",
- "doctype": "DocType",
- "document_type": "Setup",
- "engine": "InnoDB",
- "field_order": [
- "student_group",
- "course",
- "program",
- "column_break_3",
- "academic_year",
- "academic_term",
- "section_break_6",
- "instructor",
- "instructor_name",
- "column_break_9",
- "room",
- "section_break_7",
- "course_start_date",
- "course_end_date",
- "day",
- "reschedule",
- "column_break_15",
- "from_time",
- "to_time"
- ],
- "fields": [
- {
- "fieldname": "student_group",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Student Group",
- "options": "Student Group",
- "reqd": 1
- },
- {
- "fieldname": "course",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Course",
- "options": "Course",
- "reqd": 1
- },
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "label": "Program",
- "options": "Program",
- "read_only": 1
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "label": "Academic Year",
- "options": "Academic Year",
- "read_only": 1
- },
- {
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "label": "Academic Term",
- "options": "Academic Term",
- "read_only": 1
- },
- {
- "fieldname": "section_break_6",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "instructor",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Instructor",
- "options": "Instructor",
- "reqd": 1
- },
- {
- "fetch_from": "instructor.instructor_name",
- "fieldname": "instructor_name",
- "fieldtype": "Read Only",
- "label": "Instructor Name",
- "read_only": 1
- },
- {
- "fieldname": "column_break_9",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "room",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Room",
- "options": "Room",
- "reqd": 1
- },
- {
- "fieldname": "section_break_7",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "from_time",
- "fieldtype": "Time",
- "label": "From Time",
- "reqd": 1
- },
- {
- "fieldname": "course_start_date",
- "fieldtype": "Date",
- "label": "Course Start Date",
- "reqd": 1
- },
- {
- "fieldname": "day",
- "fieldtype": "Select",
- "label": "Day",
- "options": "\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday",
- "reqd": 1
- },
- {
- "default": "0",
- "fieldname": "reschedule",
- "fieldtype": "Check",
- "label": "Reschedule"
- },
- {
- "fieldname": "column_break_15",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "to_time",
- "fieldtype": "Time",
- "label": "To TIme",
- "reqd": 1
- },
- {
- "fieldname": "course_end_date",
- "fieldtype": "Date",
- "label": "Course End Date",
- "reqd": 1
- }
- ],
- "hide_toolbar": 1,
- "issingle": 1,
- "links": [],
- "modified": "2021-11-11 09:33:18.874445",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course Scheduling Tool",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "read": 1,
- "role": "Academics User",
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py
deleted file mode 100644
index b3072c2..0000000
--- a/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import calendar
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import add_days, getdate
-
-from erpnext.education.utils import OverlapError
-
-
-class CourseSchedulingTool(Document):
- @frappe.whitelist()
- def schedule_course(self):
- """Creates course schedules as per specified parameters"""
-
- course_schedules = []
- course_schedules_errors = []
- rescheduled = []
- reschedule_errors = []
-
- self.validate_mandatory()
- self.validate_date()
- self.instructor_name = frappe.db.get_value("Instructor", self.instructor, "instructor_name")
-
- group_based_on, course = frappe.db.get_value(
- "Student Group", self.student_group, ["group_based_on", "course"]
- )
-
- if group_based_on == "Course":
- self.course = course
-
- if self.reschedule:
- rescheduled, reschedule_errors = self.delete_course_schedule(rescheduled, reschedule_errors)
-
- date = self.course_start_date
- while date < self.course_end_date:
- if self.day == calendar.day_name[getdate(date).weekday()]:
- course_schedule = self.make_course_schedule(date)
- try:
- course_schedule.save()
- except OverlapError:
- course_schedules_errors.append(date)
- else:
- course_schedules.append(course_schedule)
-
- date = add_days(date, 7)
- else:
- date = add_days(date, 1)
-
- return dict(
- course_schedules=course_schedules,
- course_schedules_errors=course_schedules_errors,
- rescheduled=rescheduled,
- reschedule_errors=reschedule_errors,
- )
-
- def validate_mandatory(self):
- """Validates all mandatory fields"""
-
- fields = [
- "course",
- "room",
- "instructor",
- "from_time",
- "to_time",
- "course_start_date",
- "course_end_date",
- "day",
- ]
- for d in fields:
- if not self.get(d):
- frappe.throw(_("{0} is mandatory").format(self.meta.get_label(d)))
-
- def validate_date(self):
- """Validates if Course Start Date is greater than Course End Date"""
- if self.course_start_date > self.course_end_date:
- frappe.throw(_("Course Start Date cannot be greater than Course End Date."))
-
- def delete_course_schedule(self, rescheduled, reschedule_errors):
- """Delete all course schedule within the Date range and specified filters"""
-
- schedules = frappe.get_list(
- "Course Schedule",
- fields=["name", "schedule_date"],
- filters=[
- ["student_group", "=", self.student_group],
- ["course", "=", self.course],
- ["schedule_date", ">=", self.course_start_date],
- ["schedule_date", "<=", self.course_end_date],
- ],
- )
-
- for d in schedules:
- try:
- if self.day == calendar.day_name[getdate(d.schedule_date).weekday()]:
- frappe.delete_doc("Course Schedule", d.name)
- rescheduled.append(d.name)
- except Exception:
- reschedule_errors.append(d.name)
- return rescheduled, reschedule_errors
-
- def make_course_schedule(self, date):
- """Makes a new Course Schedule.
- :param date: Date on which Course Schedule will be created."""
-
- course_schedule = frappe.new_doc("Course Schedule")
- course_schedule.student_group = self.student_group
- course_schedule.course = self.course
- course_schedule.instructor = self.instructor
- course_schedule.instructor_name = self.instructor_name
- course_schedule.room = self.room
- course_schedule.schedule_date = date
- course_schedule.from_time = self.from_time
- course_schedule.to_time = self.to_time
- return course_schedule
diff --git a/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.py b/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.py
deleted file mode 100644
index 559214b..0000000
--- a/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestCourseSchedulingTool(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/course_topic/__init__.py b/erpnext/education/doctype/course_topic/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/course_topic/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/course_topic/course_topic.js b/erpnext/education/doctype/course_topic/course_topic.js
deleted file mode 100644
index 7d03ba3..0000000
--- a/erpnext/education/doctype/course_topic/course_topic.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Course Topic', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/course_topic/course_topic.json b/erpnext/education/doctype/course_topic/course_topic.json
deleted file mode 100644
index 3fcddc1..0000000
--- a/erpnext/education/doctype/course_topic/course_topic.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2018-12-12 11:51:25.952740",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "topic",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Topic",
- "length": 0,
- "no_copy": 0,
- "options": "Topic",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "topic.topic_name",
- "fieldname": "topic_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Topic Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-12-12 13:01:58.960425",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course Topic",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/course_topic/course_topic.py b/erpnext/education/doctype/course_topic/course_topic.py
deleted file mode 100644
index 3c1cabf..0000000
--- a/erpnext/education/doctype/course_topic/course_topic.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class CourseTopic(Document):
- pass
diff --git a/erpnext/education/doctype/course_topic/test_course_topic.py b/erpnext/education/doctype/course_topic/test_course_topic.py
deleted file mode 100644
index a4d370c..0000000
--- a/erpnext/education/doctype/course_topic/test_course_topic.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestCourseTopic(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/education_settings/__init__.py b/erpnext/education/doctype/education_settings/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/education_settings/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/education_settings/education_settings.js b/erpnext/education/doctype/education_settings/education_settings.js
deleted file mode 100644
index 764d8b4..0000000
--- a/erpnext/education/doctype/education_settings/education_settings.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Education Settings', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/education_settings/education_settings.json b/erpnext/education/doctype/education_settings/education_settings.json
deleted file mode 100644
index 0e548db..0000000
--- a/erpnext/education/doctype/education_settings/education_settings.json
+++ /dev/null
@@ -1,149 +0,0 @@
-{
- "actions": [],
- "creation": "2017-04-05 13:33:04.519313",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "current_academic_year",
- "current_academic_term",
- "attendance_freeze_date",
- "column_break_4",
- "validate_batch",
- "validate_course",
- "academic_term_reqd",
- "user_creation_skip",
- "section_break_7",
- "instructor_created_by",
- "web_academy_settings_section",
- "enable_lms",
- "portal_title",
- "description"
- ],
- "fields": [
- {
- "fieldname": "current_academic_year",
- "fieldtype": "Link",
- "label": "Current Academic Year",
- "options": "Academic Year"
- },
- {
- "fieldname": "current_academic_term",
- "fieldtype": "Link",
- "label": "Current Academic Term",
- "options": "Academic Term"
- },
- {
- "fieldname": "attendance_freeze_date",
- "fieldtype": "Date",
- "label": "Attendance Freeze Date"
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "default": "0",
- "description": "For Batch based Student Group, the Student Batch will be validated for every Student from the Program Enrollment.",
- "fieldname": "validate_batch",
- "fieldtype": "Check",
- "label": "Validate Batch for Students in Student Group"
- },
- {
- "default": "0",
- "description": "For Course based Student Group, the Course will be validated for every Student from the enrolled Courses in Program Enrollment.",
- "fieldname": "validate_course",
- "fieldtype": "Check",
- "label": "Validate Enrolled Course for Students in Student Group"
- },
- {
- "default": "0",
- "description": "If enabled, field Academic Term will be Mandatory in Program Enrollment Tool.",
- "fieldname": "academic_term_reqd",
- "fieldtype": "Check",
- "label": "Make Academic Term Mandatory"
- },
- {
- "fieldname": "section_break_7",
- "fieldtype": "Section Break"
- },
- {
- "default": "Full Name",
- "fieldname": "instructor_created_by",
- "fieldtype": "Select",
- "label": "Instructor Records to be created by",
- "options": "Full Name\nNaming Series\nEmployee Number"
- },
- {
- "fieldname": "web_academy_settings_section",
- "fieldtype": "Section Break",
- "label": "Learning Management System Settings"
- },
- {
- "depends_on": "eval: doc.enable_lms",
- "fieldname": "portal_title",
- "fieldtype": "Data",
- "label": "Learning Management System Title"
- },
- {
- "depends_on": "eval: doc.enable_lms",
- "fieldname": "description",
- "fieldtype": "Small Text",
- "label": "Description"
- },
- {
- "default": "0",
- "fieldname": "enable_lms",
- "fieldtype": "Check",
- "label": "Enable Learning Management System"
- },
- {
- "default": "0",
- "description": "By default, a new User is created for every new Student. If enabled, no new User will be created when a new Student is created.",
- "fieldname": "user_creation_skip",
- "fieldtype": "Check",
- "label": "Skip User creation for new Student"
- }
- ],
- "issingle": 1,
- "links": [],
- "modified": "2020-05-07 19:18:10.639356",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Education Settings",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "print": 1,
- "read": 1,
- "role": "System Manager",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "print": 1,
- "read": 1,
- "role": "Education Manager",
- "share": 1,
- "write": 1
- },
- {
- "email": 1,
- "print": 1,
- "read": 1,
- "role": "Guest",
- "share": 1
- }
- ],
- "quick_entry": 1,
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/education_settings/education_settings.py b/erpnext/education/doctype/education_settings/education_settings.py
deleted file mode 100644
index 295aa3a..0000000
--- a/erpnext/education/doctype/education_settings/education_settings.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-import frappe.defaults
-from frappe.model.document import Document
-
-education_keydict = {
- # "key in defaults": "key in Global Defaults"
- "academic_year": "current_academic_year",
- "academic_term": "current_academic_term",
- "validate_batch": "validate_batch",
- "validate_course": "validate_course",
-}
-
-
-class EducationSettings(Document):
- def on_update(self):
- """update defaults"""
- for key in education_keydict:
- frappe.db.set_default(key, self.get(education_keydict[key], ""))
-
- # clear cache
- frappe.clear_cache()
-
- def get_defaults(self):
- return frappe.defaults.get_defaults()
-
- def validate(self):
- from frappe.custom.doctype.property_setter.property_setter import make_property_setter
-
- if self.get("instructor_created_by") == "Naming Series":
- make_property_setter(
- "Instructor", "naming_series", "hidden", 0, "Check", validate_fields_for_doctype=False
- )
- else:
- make_property_setter(
- "Instructor", "naming_series", "hidden", 1, "Check", validate_fields_for_doctype=False
- )
-
-
-def update_website_context(context):
- context["lms_enabled"] = frappe.get_cached_doc("Education Settings").enable_lms
diff --git a/erpnext/education/doctype/education_settings/test_education_settings.py b/erpnext/education/doctype/education_settings/test_education_settings.py
deleted file mode 100644
index 223e838..0000000
--- a/erpnext/education/doctype/education_settings/test_education_settings.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestEducationSettings(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/fee_category/__init__.py b/erpnext/education/doctype/fee_category/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/fee_category/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/fee_category/fee_category.js b/erpnext/education/doctype/fee_category/fee_category.js
deleted file mode 100644
index 96fd915..0000000
--- a/erpnext/education/doctype/fee_category/fee_category.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Fee Category', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/fee_category/fee_category.json b/erpnext/education/doctype/fee_category/fee_category.json
deleted file mode 100644
index c1bfa8e..0000000
--- a/erpnext/education/doctype/fee_category/fee_category.json
+++ /dev/null
@@ -1,171 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:category_name",
- "beta": 0,
- "creation": "2015-09-16 13:01:10.448734",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 0,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "category_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Name",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "earning_name",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "description",
- "fieldtype": "Small Text",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Description",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "description",
- "oldfieldtype": "Small Text",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0,
- "width": "300px"
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "icon": "fa fa-flag",
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "menu_index": 0,
- "modified": "2017-11-10 18:56:33.824534",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Fee Category",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- },
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "search_fields": "description",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/fee_category/fee_category.py b/erpnext/education/doctype/fee_category/fee_category.py
deleted file mode 100644
index 1faa0c5..0000000
--- a/erpnext/education/doctype/fee_category/fee_category.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class FeeCategory(Document):
- pass
diff --git a/erpnext/education/doctype/fee_category/test_fee_category.py b/erpnext/education/doctype/fee_category/test_fee_category.py
deleted file mode 100644
index 93565a9..0000000
--- a/erpnext/education/doctype/fee_category/test_fee_category.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Fee Category')
-
-
-class TestFeeCategory(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/fee_category/test_records.json b/erpnext/education/doctype/fee_category/test_records.json
deleted file mode 100644
index 598c1ed..0000000
--- a/erpnext/education/doctype/fee_category/test_records.json
+++ /dev/null
@@ -1,11 +0,0 @@
-[
- {
- "category_name": "Admission Fee"
- },
- {
- "category_name": "Tuition Fee"
- },
- {
- "category_name": "Transportation Fee"
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/fee_component/__init__.py b/erpnext/education/doctype/fee_component/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/fee_component/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/fee_component/fee_component.json b/erpnext/education/doctype/fee_component/fee_component.json
deleted file mode 100644
index f6e13c4..0000000
--- a/erpnext/education/doctype/fee_component/fee_component.json
+++ /dev/null
@@ -1,169 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 1,
- "autoname": "",
- "beta": 0,
- "creation": "2015-09-16 13:07:27.675453",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 1,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "fees_category",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Fees Category",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "earning_name",
- "oldfieldtype": "Data",
- "options": "Fee Category",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "description",
- "fieldtype": "Small Text",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Description",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "amount",
- "fieldtype": "Currency",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Amount",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "description",
- "oldfieldtype": "Small Text",
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0,
- "width": "300px"
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "icon": "fa fa-flag",
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2017-11-10 18:58:10.254407",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Fee Component",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/fee_component/fee_component.py b/erpnext/education/doctype/fee_component/fee_component.py
deleted file mode 100644
index c5cf7d9..0000000
--- a/erpnext/education/doctype/fee_component/fee_component.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class FeeComponent(Document):
- pass
diff --git a/erpnext/education/doctype/fee_schedule/__init__.py b/erpnext/education/doctype/fee_schedule/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/fee_schedule/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.js b/erpnext/education/doctype/fee_schedule/fee_schedule.js
deleted file mode 100644
index 97691a5..0000000
--- a/erpnext/education/doctype/fee_schedule/fee_schedule.js
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.provide("erpnext.accounts.dimensions");
-frappe.ui.form.on('Fee Schedule', {
- setup: function(frm) {
- frm.add_fetch('fee_structure', 'receivable_account', 'receivable_account');
- frm.add_fetch('fee_structure', 'income_account', 'income_account');
- frm.add_fetch('fee_structure', 'cost_center', 'cost_center');
- },
-
- company: function(frm) {
- erpnext.accounts.dimensions.update_dimension(frm, frm.doctype);
- },
-
- onload: function(frm) {
- frm.set_query('receivable_account', function(doc) {
- return {
- filters: {
- 'account_type': 'Receivable',
- 'is_group': 0,
- 'company': doc.company
- }
- };
- });
-
- frm.set_query('income_account', function(doc) {
- return {
- filters: {
- 'account_type': 'Income Account',
- 'is_group': 0,
- 'company': doc.company
- }
- };
- });
-
- frm.set_query('student_group', 'student_groups', function() {
- return {
- 'program': frm.doc.program,
- 'academic_term': frm.doc.academic_term,
- 'academic_year': frm.doc.academic_year,
- 'disabled': 0
- };
- });
-
- frappe.realtime.on('fee_schedule_progress', function(data) {
- if (data.reload && data.reload === 1) {
- frm.reload_doc();
- }
- if (data.progress) {
- let progress_bar = $(cur_frm.dashboard.progress_area.body).find('.progress-bar');
- if (progress_bar) {
- $(progress_bar).removeClass('progress-bar-danger').addClass('progress-bar-success progress-bar-striped');
- $(progress_bar).css('width', data.progress+'%');
- }
- }
- });
-
- erpnext.accounts.dimensions.setup_dimension_filters(frm, frm.doctype);
- },
-
- refresh: function(frm) {
- if (!frm.doc.__islocal && frm.doc.__onload && frm.doc.__onload.dashboard_info &&
- frm.doc.fee_creation_status === 'Successful') {
- var info = frm.doc.__onload.dashboard_info;
- frm.dashboard.add_indicator(__('Total Collected: {0}', [format_currency(info.total_paid,
- info.currency)]), 'blue');
- frm.dashboard.add_indicator(__('Total Outstanding: {0}', [format_currency(info.total_unpaid,
- info.currency)]), info.total_unpaid ? 'orange' : 'green');
- }
- if (frm.doc.fee_creation_status === 'In Process') {
- frm.dashboard.add_progress('Fee Creation Status', '0');
- }
- if (frm.doc.docstatus === 1 && !frm.doc.fee_creation_status || frm.doc.fee_creation_status === 'Failed') {
- frm.add_custom_button(__('Create Fees'), function() {
- frappe.call({
- method: 'create_fees',
- doc: frm.doc,
- callback: function() {
- frm.refresh();
- }
- });
- }).addClass('btn-primary');;
- }
- if (frm.doc.fee_creation_status === 'Successful') {
- frm.add_custom_button(__('View Fees Records'), function() {
- frappe.route_options = {
- fee_schedule: frm.doc.name
- };
- frappe.set_route('List', 'Fees');
- });
- }
-
- },
-
- fee_structure: function(frm) {
- if (frm.doc.fee_structure) {
- frappe.call({
- method: 'erpnext.education.doctype.fee_schedule.fee_schedule.get_fee_structure',
- args: {
- 'target_doc': frm.doc.name,
- 'source_name': frm.doc.fee_structure
- },
- callback: function(r) {
- var doc = frappe.model.sync(r.message);
- frappe.set_route('Form', doc[0].doctype, doc[0].name);
- }
- });
- }
- }
-});
-
-frappe.ui.form.on('Fee Schedule Student Group', {
- student_group: function(frm, cdt, cdn) {
- var row = locals[cdt][cdn];
- if (row.student_group && frm.doc.academic_year) {
- frappe.call({
- method: 'erpnext.education.doctype.fee_schedule.fee_schedule.get_total_students',
- args: {
- 'student_group': row.student_group,
- 'academic_year': frm.doc.academic_year,
- 'academic_term': frm.doc.academic_term,
- 'student_category': frm.doc.student_category
- },
- callback: function(r) {
- if (!r.exc) {
- frappe.model.set_value(cdt, cdn, 'total_students', r.message);
- }
- }
- });
- }
- }
-})
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.json b/erpnext/education/doctype/fee_schedule/fee_schedule.json
deleted file mode 100644
index 23b3212..0000000
--- a/erpnext/education/doctype/fee_schedule/fee_schedule.json
+++ /dev/null
@@ -1,327 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "naming_series:",
- "creation": "2017-07-18 15:21:21.527136",
- "doctype": "DocType",
- "document_type": "Document",
- "engine": "InnoDB",
- "field_order": [
- "fee_structure",
- "posting_date",
- "due_date",
- "naming_series",
- "fee_creation_status",
- "send_email",
- "column_break_4",
- "student_category",
- "program",
- "academic_year",
- "academic_term",
- "section_break_10",
- "currency",
- "student_groups",
- "section_break_14",
- "components",
- "section_break_16",
- "column_break_18",
- "total_amount",
- "grand_total",
- "grand_total_in_words",
- "edit_printing_settings",
- "letter_head",
- "column_break_32",
- "select_print_heading",
- "account",
- "receivable_account",
- "income_account",
- "column_break_39",
- "company",
- "amended_from",
- "accounting_dimensions_section",
- "cost_center",
- "dimension_col_break",
- "section_break_31",
- "error_log"
- ],
- "fields": [
- {
- "fieldname": "fee_structure",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_list_view": 1,
- "label": "Fee Structure",
- "options": "Fee Structure",
- "reqd": 1
- },
- {
- "fieldname": "due_date",
- "fieldtype": "Date",
- "label": "Due Date",
- "reqd": 1
- },
- {
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Naming Series",
- "no_copy": 1,
- "options": "EDU-FSH-.YYYY.-"
- },
- {
- "fieldname": "fee_creation_status",
- "fieldtype": "Select",
- "label": "Fee Creation Status",
- "no_copy": 1,
- "options": "\nIn Process\nFailed\nSuccessful",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "default": "0",
- "fieldname": "send_email",
- "fieldtype": "Check",
- "label": "Send Payment Request Email"
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "student_category",
- "fieldtype": "Link",
- "label": "Student Category",
- "options": "Student Category",
- "read_only": 1
- },
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "label": "Program",
- "options": "Program",
- "read_only": 1
- },
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "label": "Academic Year",
- "options": "Academic Year",
- "reqd": 1
- },
- {
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "label": "Academic Term",
- "options": "Academic Term"
- },
- {
- "fieldname": "section_break_10",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "currency",
- "fieldtype": "Link",
- "hidden": 1,
- "label": "Currency",
- "options": "Currency",
- "read_only": 1
- },
- {
- "fieldname": "student_groups",
- "fieldtype": "Table",
- "options": "Fee Schedule Student Group",
- "reqd": 1
- },
- {
- "fieldname": "section_break_14",
- "fieldtype": "Section Break",
- "label": "Fee Breakup for each student",
- "read_only": 1
- },
- {
- "fieldname": "components",
- "fieldtype": "Table",
- "options": "Fee Component",
- "read_only": 1
- },
- {
- "fieldname": "section_break_16",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "column_break_18",
- "fieldtype": "Column Break"
- },
- {
- "default": "0",
- "fieldname": "total_amount",
- "fieldtype": "Currency",
- "label": "Total Amount per Student",
- "read_only": 1
- },
- {
- "fieldname": "grand_total",
- "fieldtype": "Currency",
- "label": "Grand Total",
- "read_only": 1
- },
- {
- "fieldname": "grand_total_in_words",
- "fieldtype": "Data",
- "label": "In Words",
- "length": 240,
- "read_only": 1
- },
- {
- "collapsible": 1,
- "fieldname": "edit_printing_settings",
- "fieldtype": "Section Break",
- "label": "Printing Settings"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "letter_head",
- "fieldtype": "Link",
- "label": "Letter Head",
- "options": "Letter Head",
- "print_hide": 1
- },
- {
- "fieldname": "column_break_32",
- "fieldtype": "Column Break"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "select_print_heading",
- "fieldtype": "Link",
- "label": "Print Heading",
- "no_copy": 1,
- "options": "Print Heading",
- "print_hide": 1,
- "report_hide": 1
- },
- {
- "collapsible": 1,
- "fieldname": "account",
- "fieldtype": "Section Break",
- "label": "Accounting"
- },
- {
- "fieldname": "receivable_account",
- "fieldtype": "Link",
- "label": "Receivable Account",
- "options": "Account"
- },
- {
- "fieldname": "income_account",
- "fieldtype": "Link",
- "label": "Income Account",
- "options": "Account"
- },
- {
- "fieldname": "column_break_39",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "cost_center",
- "fieldtype": "Link",
- "label": "Cost Center",
- "options": "Cost Center"
- },
- {
- "fieldname": "company",
- "fieldtype": "Link",
- "label": "Institution",
- "options": "Company"
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Fee Schedule",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "collapsible": 1,
- "depends_on": "error_log",
- "fieldname": "section_break_31",
- "fieldtype": "Section Break",
- "label": "Error Log"
- },
- {
- "fieldname": "error_log",
- "fieldtype": "Read Only",
- "label": "Error Log"
- },
- {
- "fieldname": "accounting_dimensions_section",
- "fieldtype": "Section Break",
- "label": "Accounting Dimensions"
- },
- {
- "fieldname": "dimension_col_break",
- "fieldtype": "Column Break"
- },
- {
- "default": "Today",
- "fieldname": "posting_date",
- "fieldtype": "Date",
- "label": "Posting Date",
- "reqd": 1
- }
- ],
- "is_submittable": 1,
- "links": [],
- "modified": "2020-07-18 05:11:49.905457",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Fee Schedule",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "import": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts User",
- "share": 1,
- "submit": 1,
- "write": 1
- },
- {
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts Manager",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.py b/erpnext/education/doctype/fee_schedule/fee_schedule.py
deleted file mode 100644
index 9ae5582..0000000
--- a/erpnext/education/doctype/fee_schedule/fee_schedule.py
+++ /dev/null
@@ -1,173 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.model.mapper import get_mapped_doc
-from frappe.utils import cint, cstr, flt, money_in_words
-from frappe.utils.background_jobs import enqueue
-
-import erpnext
-
-
-class FeeSchedule(Document):
- def onload(self):
- info = self.get_dashboard_info()
- self.set_onload("dashboard_info", info)
-
- def get_dashboard_info(self):
- info = {
- "total_paid": 0,
- "total_unpaid": 0,
- "currency": erpnext.get_company_currency(self.company),
- }
-
- fees_amount = frappe.db.sql(
- """select sum(grand_total), sum(outstanding_amount) from tabFees
- where fee_schedule=%s and docstatus=1""",
- (self.name),
- )
-
- if fees_amount:
- info["total_paid"] = flt(fees_amount[0][0]) - flt(fees_amount[0][1])
- info["total_unpaid"] = flt(fees_amount[0][1])
-
- return info
-
- def validate(self):
- self.calculate_total_and_program()
-
- def calculate_total_and_program(self):
- no_of_students = 0
- for d in self.student_groups:
- # if not d.total_students:
- d.total_students = get_total_students(
- d.student_group, self.academic_year, self.academic_term, self.student_category
- )
- no_of_students += cint(d.total_students)
-
- # validate the program of fee structure and student groups
- student_group_program = frappe.db.get_value("Student Group", d.student_group, "program")
- if self.program and student_group_program and self.program != student_group_program:
- frappe.msgprint(
- _("Program in the Fee Structure and Student Group {0} are different.").format(d.student_group)
- )
- self.grand_total = no_of_students * self.total_amount
- self.grand_total_in_words = money_in_words(self.grand_total)
-
- @frappe.whitelist()
- def create_fees(self):
- self.db_set("fee_creation_status", "In Process")
- frappe.publish_realtime(
- "fee_schedule_progress", {"progress": "0", "reload": 1}, user=frappe.session.user
- )
-
- total_records = sum([int(d.total_students) for d in self.student_groups])
- if total_records > 10:
- frappe.msgprint(
- _(
- """Fee records will be created in the background.
- In case of any error the error message will be updated in the Schedule."""
- )
- )
- enqueue(
- generate_fee, queue="default", timeout=6000, event="generate_fee", fee_schedule=self.name
- )
- else:
- generate_fee(self.name)
-
-
-def generate_fee(fee_schedule):
- doc = frappe.get_doc("Fee Schedule", fee_schedule)
- error = False
- total_records = sum([int(d.total_students) for d in doc.student_groups])
- created_records = 0
-
- if not total_records:
- frappe.throw(_("Please setup Students under Student Groups"))
-
- for d in doc.student_groups:
- students = get_students(
- d.student_group, doc.academic_year, doc.academic_term, doc.student_category
- )
- for student in students:
- try:
- fees_doc = get_mapped_doc(
- "Fee Schedule",
- fee_schedule,
- {"Fee Schedule": {"doctype": "Fees", "field_map": {"name": "Fee Schedule"}}},
- )
- fees_doc.posting_date = doc.posting_date
- fees_doc.student = student.student
- fees_doc.student_name = student.student_name
- fees_doc.program = student.program
- fees_doc.student_batch = student.student_batch_name
- fees_doc.send_payment_request = doc.send_email
- fees_doc.save()
- fees_doc.submit()
- created_records += 1
- frappe.publish_realtime(
- "fee_schedule_progress",
- {"progress": str(int(created_records * 100 / total_records))},
- user=frappe.session.user,
- )
-
- except Exception as e:
- error = True
- err_msg = frappe.local.message_log and "\n\n".join(frappe.local.message_log) or cstr(e)
-
- if error:
- frappe.db.rollback()
- frappe.db.set_value("Fee Schedule", fee_schedule, "fee_creation_status", "Failed")
- frappe.db.set_value("Fee Schedule", fee_schedule, "error_log", err_msg)
-
- else:
- frappe.db.set_value("Fee Schedule", fee_schedule, "fee_creation_status", "Successful")
- frappe.db.set_value("Fee Schedule", fee_schedule, "error_log", None)
-
- frappe.publish_realtime(
- "fee_schedule_progress", {"progress": "100", "reload": 1}, user=frappe.session.user
- )
-
-
-def get_students(student_group, academic_year, academic_term=None, student_category=None):
- conditions = ""
- if student_category:
- conditions = " and pe.student_category={}".format(frappe.db.escape(student_category))
- if academic_term:
- conditions = " and pe.academic_term={}".format(frappe.db.escape(academic_term))
-
- students = frappe.db.sql(
- """
- select pe.student, pe.student_name, pe.program, pe.student_batch_name
- from `tabStudent Group Student` sgs, `tabProgram Enrollment` pe
- where
- pe.student = sgs.student and pe.academic_year = %s
- and sgs.parent = %s and sgs.active = 1
- {conditions}
- """.format(
- conditions=conditions
- ),
- (academic_year, student_group),
- as_dict=1,
- )
- return students
-
-
-@frappe.whitelist()
-def get_total_students(student_group, academic_year, academic_term=None, student_category=None):
- total_students = get_students(student_group, academic_year, academic_term, student_category)
- return len(total_students)
-
-
-@frappe.whitelist()
-def get_fee_structure(source_name, target_doc=None):
- fee_request = get_mapped_doc(
- "Fee Structure",
- source_name,
- {"Fee Structure": {"doctype": "Fee Schedule"}},
- ignore_permissions=True,
- )
- return fee_request
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule_dashboard.py b/erpnext/education/doctype/fee_schedule/fee_schedule_dashboard.py
deleted file mode 100644
index 4b99d27..0000000
--- a/erpnext/education/doctype/fee_schedule/fee_schedule_dashboard.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-
-def get_data():
- return {"fieldname": "fee_schedule", "transactions": [{"items": ["Fees"]}]}
diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule_list.js b/erpnext/education/doctype/fee_schedule/fee_schedule_list.js
deleted file mode 100644
index 3039c51..0000000
--- a/erpnext/education/doctype/fee_schedule/fee_schedule_list.js
+++ /dev/null
@@ -1,14 +0,0 @@
-frappe.listview_settings['Fee Schedule'] = {
- add_fields: ["fee_creation_status", "due_date", "grand_total"],
- get_indicator: function(doc) {
- if (doc.fee_creation_status=="Successful") {
- return [__("Fee Created"), "blue", "fee_creation_status,=,Successful"];
- } else if(doc.fee_creation_status == "In Process") {
- return [__("Creating Fees"), "orange", "fee_creation_status,=,In Process"];
- } else if(doc.fee_creation_status == "Failed") {
- return [__("Fee Creation Failed"), "red", "fee_creation_status,=,Failed"];
- } else {
- return [__("Fee Creation Pending"), "green", "fee_creation_status,=,"];
- }
- }
-};
diff --git a/erpnext/education/doctype/fee_schedule/test_fee_schedule.py b/erpnext/education/doctype/fee_schedule/test_fee_schedule.py
deleted file mode 100644
index c291aed..0000000
--- a/erpnext/education/doctype/fee_schedule/test_fee_schedule.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestFeeSchedule(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/fee_schedule_program/__init__.py b/erpnext/education/doctype/fee_schedule_program/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/fee_schedule_program/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.json b/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.json
deleted file mode 100644
index f644dc2..0000000
--- a/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2017-03-23 17:46:55.712169",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "program",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Program",
- "length": 0,
- "no_copy": 0,
- "options": "Program",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_batch",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student Batch",
- "length": 0,
- "no_copy": 0,
- "options": "Student Batch Name",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "total_students",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Total Students",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-11-04 03:37:57.763134",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Fee Schedule Program",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.py b/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.py
deleted file mode 100644
index ad7af3a..0000000
--- a/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class FeeScheduleProgram(Document):
- pass
diff --git a/erpnext/education/doctype/fee_schedule_student_group/__init__.py b/erpnext/education/doctype/fee_schedule_student_group/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/fee_schedule_student_group/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.json b/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.json
deleted file mode 100644
index d4e0acb..0000000
--- a/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2017-03-23 17:55:52.476822",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_group",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student Group",
- "length": 0,
- "no_copy": 0,
- "options": "Student Group",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "total_students",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Total Students",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-11-04 03:38:06.535706",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Fee Schedule Student Group",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.py b/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.py
deleted file mode 100644
index 24e5404..0000000
--- a/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class FeeScheduleStudentGroup(Document):
- pass
diff --git a/erpnext/education/doctype/fee_structure/__init__.py b/erpnext/education/doctype/fee_structure/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/fee_structure/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/fee_structure/fee_structure.js b/erpnext/education/doctype/fee_structure/fee_structure.js
deleted file mode 100644
index d9ab99f..0000000
--- a/erpnext/education/doctype/fee_structure/fee_structure.js
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.provide("erpnext.accounts.dimensions");
-
-frappe.ui.form.on('Fee Structure', {
- setup: function(frm) {
- frm.add_fetch('company', 'default_receivable_account', 'receivable_account');
- frm.add_fetch('company', 'default_income_account', 'income_account');
- frm.add_fetch('company', 'cost_center', 'cost_center');
- },
-
- company: function(frm) {
- erpnext.accounts.dimensions.update_dimension(frm, frm.doctype);
- },
-
- onload: function(frm) {
- frm.set_query('academic_term', function() {
- return {
- 'filters': {
- 'academic_year': frm.doc.academic_year
- }
- };
- });
-
- frm.set_query('receivable_account', function(doc) {
- return {
- filters: {
- 'account_type': 'Receivable',
- 'is_group': 0,
- 'company': doc.company
- }
- };
- });
- frm.set_query('income_account', function(doc) {
- return {
- filters: {
- 'account_type': 'Income Account',
- 'is_group': 0,
- 'company': doc.company
- }
- };
- });
-
- erpnext.accounts.dimensions.setup_dimension_filters(frm, frm.doctype);
- },
-
- refresh: function(frm) {
- if (frm.doc.docstatus === 1) {
- frm.add_custom_button(__('Create Fee Schedule'), function() {
- frm.events.make_fee_schedule(frm);
- }).addClass('btn-primary');
- }
- },
-
- make_fee_schedule: function(frm) {
- frappe.model.open_mapped_doc({
- method: 'erpnext.education.doctype.fee_structure.fee_structure.make_fee_schedule',
- frm: frm
- });
- }
-});
-
-frappe.ui.form.on('Fee Component', {
- amount: function(frm) {
- var total_amount = 0;
- for (var i=0;i<frm.doc.components.length;i++) {
- total_amount += frm.doc.components[i].amount;
- }
- frm.set_value('total_amount', total_amount);
- }
-});
diff --git a/erpnext/education/doctype/fee_structure/fee_structure.json b/erpnext/education/doctype/fee_structure/fee_structure.json
deleted file mode 100644
index 67e4637..0000000
--- a/erpnext/education/doctype/fee_structure/fee_structure.json
+++ /dev/null
@@ -1,215 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "naming_series:",
- "creation": "2015-09-16 13:03:20.430704",
- "doctype": "DocType",
- "document_type": "Setup",
- "engine": "InnoDB",
- "field_order": [
- "naming_series",
- "program",
- "student_category",
- "column_break_2",
- "academic_year",
- "academic_term",
- "section_break_4",
- "components",
- "section_break_6",
- "column_break_11",
- "total_amount",
- "accounts",
- "receivable_account",
- "income_account",
- "column_break_16",
- "company",
- "amended_from",
- "accounting_dimensions_section",
- "cost_center",
- "dimension_col_break"
- ],
- "fields": [
- {
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Naming Series",
- "options": "EDU-FST-.YYYY.-",
- "set_only_once": 1
- },
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Program",
- "oldfieldname": "earning_name",
- "oldfieldtype": "Data",
- "options": "Program",
- "search_index": 1
- },
- {
- "fieldname": "student_category",
- "fieldtype": "Link",
- "label": "Student Category",
- "options": "Student Category"
- },
- {
- "fieldname": "column_break_2",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Academic Term",
- "oldfieldname": "description",
- "oldfieldtype": "Small Text",
- "options": "Academic Term",
- "search_index": 1,
- "width": "300px"
- },
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "label": "Academic Year",
- "options": "Academic Year"
- },
- {
- "fieldname": "section_break_4",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "components",
- "fieldtype": "Table",
- "label": "Components",
- "options": "Fee Component",
- "reqd": 1
- },
- {
- "fieldname": "section_break_6",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "column_break_11",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "total_amount",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Total Amount",
- "read_only": 1
- },
- {
- "fieldname": "accounts",
- "fieldtype": "Section Break",
- "label": "Accounts"
- },
- {
- "fieldname": "receivable_account",
- "fieldtype": "Link",
- "label": "Receivable Account",
- "options": "Account",
- "reqd": 1
- },
- {
- "fieldname": "income_account",
- "fieldtype": "Link",
- "label": "Income Account",
- "options": "Account"
- },
- {
- "fieldname": "column_break_16",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "cost_center",
- "fieldtype": "Link",
- "label": "Cost Center",
- "options": "Cost Center"
- },
- {
- "fieldname": "company",
- "fieldtype": "Link",
- "label": "Company",
- "options": "Company"
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Fee Structure",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "fieldname": "accounting_dimensions_section",
- "fieldtype": "Section Break",
- "label": "Accounting Dimensions"
- },
- {
- "fieldname": "dimension_col_break",
- "fieldtype": "Column Break"
- }
- ],
- "icon": "fa fa-flag",
- "is_submittable": 1,
- "links": [],
- "modified": "2020-06-16 15:34:57.295010",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Fee Structure",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "import": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts User",
- "share": 1,
- "submit": 1,
- "write": 1
- },
- {
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts Manager",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "search_fields": "program, student_category, academic_year",
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "program"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/fee_structure/fee_structure.py b/erpnext/education/doctype/fee_structure/fee_structure.py
deleted file mode 100644
index f1b7bb7..0000000
--- a/erpnext/education/doctype/fee_structure/fee_structure.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe.model.document import Document
-from frappe.model.mapper import get_mapped_doc
-
-
-class FeeStructure(Document):
- def validate(self):
- self.calculate_total()
-
- def calculate_total(self):
- """Calculates total amount."""
- self.total_amount = 0
- for d in self.components:
- self.total_amount += d.amount
-
-
-@frappe.whitelist()
-def make_fee_schedule(source_name, target_doc=None):
- return get_mapped_doc(
- "Fee Structure",
- source_name,
- {
- "Fee Structure": {
- "doctype": "Fee Schedule",
- "validation": {
- "docstatus": ["=", 1],
- },
- },
- "Fee Component": {"doctype": "Fee Component"},
- },
- target_doc,
- )
diff --git a/erpnext/education/doctype/fee_structure/fee_structure_dashboard.py b/erpnext/education/doctype/fee_structure/fee_structure_dashboard.py
deleted file mode 100644
index 0ae3032..0000000
--- a/erpnext/education/doctype/fee_structure/fee_structure_dashboard.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "fee_structure",
- "transactions": [{"label": _("Fee"), "items": ["Fees", "Fee Schedule"]}],
- }
diff --git a/erpnext/education/doctype/fee_structure/test_fee_structure.py b/erpnext/education/doctype/fee_structure/test_fee_structure.py
deleted file mode 100644
index ebe0fea..0000000
--- a/erpnext/education/doctype/fee_structure/test_fee_structure.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Fee Structure')
-
-
-class TestFeeStructure(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/fee_structure/test_records.json b/erpnext/education/doctype/fee_structure/test_records.json
deleted file mode 100644
index cdd00be..0000000
--- a/erpnext/education/doctype/fee_structure/test_records.json
+++ /dev/null
@@ -1,42 +0,0 @@
-[
- {
- "doctype": "Fee Structure",
- "academic_year": "2017-2018",
- "academic_term": "2017-2018 (_Test AT1)",
- "components": [
- {
- "fees_category": "Tuition Fee",
- "amount": 40000
- },
- {
- "fees_category": "Transportation Fee",
- "amount": 10000
- }
- ],
- "total_amount": 50000,
- "receivable_account": "_Test Receivable - _TC",
- "income_account": "Sales - _TC",
- "cost_center": "_Test Cost Center - _TC",
- "company": "_Test Company"
- },
- {
- "doctype": "Fee Structure",
- "academic_year": "2017-2018",
- "academic_term": "2017-2018 (_Test AT2)",
- "components": [
- {
- "fees_category": "Tuition Fee",
- "amount": 40000
- },
- {
- "fees_category": "Transportation Fee",
- "amount": 10000
- }
- ],
- "total_amount": 50000,
- "receivable_account": "_Test Receivable - _TC",
- "income_account": "Sales - _TC",
- "cost_center": "_Test Cost Center - _TC",
- "company": "_Test Company"
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/fees/__init__.py b/erpnext/education/doctype/fees/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/fees/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/fees/fees.js b/erpnext/education/doctype/fees/fees.js
deleted file mode 100644
index ac66acd..0000000
--- a/erpnext/education/doctype/fees/fees.js
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.provide("erpnext.accounts.dimensions");
-
-frappe.ui.form.on("Fees", {
- setup: function(frm) {
- frm.add_fetch("fee_structure", "receivable_account", "receivable_account");
- frm.add_fetch("fee_structure", "income_account", "income_account");
- frm.add_fetch("fee_structure", "cost_center", "cost_center");
- },
-
- company: function(frm) {
- erpnext.accounts.dimensions.update_dimension(frm, frm.doctype);
- },
-
- onload: function(frm) {
- frm.set_query("academic_term", function() {
- return{
- "filters": {
- "academic_year": (frm.doc.academic_year)
- }
- };
- });
- frm.set_query("fee_structure", function() {
- return{
- "filters":{
- "academic_year": (frm.doc.academic_year)
- }
- };
- });
- frm.set_query("receivable_account", function(doc) {
- return {
- filters: {
- 'account_type': 'Receivable',
- 'is_group': 0,
- 'company': doc.company
- }
- };
- });
- frm.set_query("income_account", function(doc) {
- return {
- filters: {
- 'account_type': 'Income Account',
- 'is_group': 0,
- 'company': doc.company
- }
- };
- });
- if (!frm.doc.posting_date) {
- frm.doc.posting_date = frappe.datetime.get_today();
- }
-
- erpnext.accounts.dimensions.setup_dimension_filters(frm, frm.doctype);
- },
-
- refresh: function(frm) {
- if(frm.doc.docstatus == 0 && frm.doc.set_posting_time) {
- frm.set_df_property('posting_date', 'read_only', 0);
- frm.set_df_property('posting_time', 'read_only', 0);
- } else {
- frm.set_df_property('posting_date', 'read_only', 1);
- frm.set_df_property('posting_time', 'read_only', 1);
- }
- if(frm.doc.docstatus > 0) {
- frm.add_custom_button(__('Accounting Ledger'), function() {
- frappe.route_options = {
- voucher_no: frm.doc.name,
- from_date: frm.doc.posting_date,
- to_date: moment(frm.doc.modified).format('YYYY-MM-DD'),
- company: frm.doc.company,
- group_by: '',
- show_cancelled_entries: frm.doc.docstatus === 2
- };
- frappe.set_route("query-report", "General Ledger");
- }, __("View"));
- frm.add_custom_button(__("Payments"), function() {
- frappe.set_route("List", "Payment Entry", {"Payment Entry Reference.reference_name": frm.doc.name});
- }, __("View"));
- }
- if(frm.doc.docstatus===1 && frm.doc.outstanding_amount>0) {
- frm.add_custom_button(__("Payment Request"), function() {
- frm.events.make_payment_request(frm);
- }, __('Create'));
- frm.page.set_inner_btn_group_as_primary(__('Create'));
- }
- if(frm.doc.docstatus===1 && frm.doc.outstanding_amount!=0) {
- frm.add_custom_button(__("Payment"), function() {
- frm.events.make_payment_entry(frm);
- }, __('Create'));
- frm.page.set_inner_btn_group_as_primary(__('Create'));
- }
- },
-
- student: function(frm) {
- if (frm.doc.student) {
- frappe.call({
- method:"erpnext.education.api.get_current_enrollment",
- args: {
- "student": frm.doc.student,
- "academic_year": frm.doc.academic_year
- },
- callback: function(r) {
- if(r){
- $.each(r.message, function(i, d) {
- frm.set_value(i,d);
- });
- }
- }
- });
- }
- },
-
- make_payment_request: function(frm) {
- if (!frm.doc.student_email) {
- frappe.msgprint(__("Please set the Email ID for the Student to send the Payment Request"));
- } else {
- frappe.call({
- method:"erpnext.accounts.doctype.payment_request.payment_request.make_payment_request",
- args: {
- "dt": frm.doc.doctype,
- "dn": frm.doc.name,
- "party_type": "Student",
- "party": frm.doc.student,
- "recipient_id": frm.doc.student_email
- },
- callback: function(r) {
- if(!r.exc){
- var doc = frappe.model.sync(r.message);
- frappe.set_route("Form", doc[0].doctype, doc[0].name);
- }
- }
- });
- }
- },
-
- make_payment_entry: function(frm) {
- return frappe.call({
- method: "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry",
- args: {
- "dt": frm.doc.doctype,
- "dn": frm.doc.name
- },
- callback: function(r) {
- var doc = frappe.model.sync(r.message);
- frappe.set_route("Form", doc[0].doctype, doc[0].name);
- }
- });
- },
-
- set_posting_time: function(frm) {
- frm.refresh();
- },
-
- academic_term: function() {
- frappe.ui.form.trigger("Fees", "program");
- },
-
- fee_structure: function(frm) {
- frm.set_value("components" ,"");
- if (frm.doc.fee_structure) {
- frappe.call({
- method: "erpnext.education.api.get_fee_components",
- args: {
- "fee_structure": frm.doc.fee_structure
- },
- callback: function(r) {
- if (r.message) {
- $.each(r.message, function(i, d) {
- var row = frappe.model.add_child(frm.doc, "Fee Component", "components");
- row.fees_category = d.fees_category;
- row.description = d.description;
- row.amount = d.amount;
- });
- }
- refresh_field("components");
- frm.trigger("calculate_total_amount");
- }
- });
- }
- },
-
- calculate_total_amount: function(frm) {
- var grand_total = 0;
- for(var i=0;i<frm.doc.components.length;i++) {
- grand_total += frm.doc.components[i].amount;
- }
- frm.set_value("grand_total", grand_total);
- }
-});
-
-
-frappe.ui.form.on("Fee Component", {
- amount: function(frm) {
- frm.trigger("calculate_total_amount");
- }
-});
diff --git a/erpnext/education/doctype/fees/fees.json b/erpnext/education/doctype/fees/fees.json
deleted file mode 100644
index 0fb7672..0000000
--- a/erpnext/education/doctype/fees/fees.json
+++ /dev/null
@@ -1,395 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "naming_series:",
- "creation": "2015-09-22 16:57:22.143710",
- "doctype": "DocType",
- "document_type": "Document",
- "engine": "InnoDB",
- "field_order": [
- "naming_series",
- "student",
- "student_name",
- "fee_schedule",
- "include_payment",
- "send_payment_request",
- "column_break_4",
- "company",
- "posting_date",
- "posting_time",
- "set_posting_time",
- "due_date",
- "student_details",
- "program_enrollment",
- "program",
- "student_batch",
- "student_email",
- "column_break_16",
- "student_category",
- "academic_term",
- "academic_year",
- "section_break_7",
- "currency",
- "fee_structure",
- "components",
- "section_break_10",
- "amended_from",
- "column_break_11",
- "grand_total",
- "grand_total_in_words",
- "outstanding_amount",
- "edit_printing_settings",
- "letter_head",
- "column_break_32",
- "select_print_heading",
- "account",
- "receivable_account",
- "column_break_39",
- "income_account",
- "accounting_dimensions_section",
- "cost_center",
- "dimension_col_break"
- ],
- "fields": [
- {
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Naming Series",
- "options": "EDU-FEE-.YYYY.-",
- "print_hide": 1,
- "set_only_once": 1
- },
- {
- "fieldname": "student",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Student",
- "options": "Student",
- "reqd": 1
- },
- {
- "fetch_from": "student.title",
- "fieldname": "student_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Student Name",
- "read_only": 1
- },
- {
- "fieldname": "fee_schedule",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Fee Schedule",
- "options": "Fee Schedule",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "default": "0",
- "fieldname": "include_payment",
- "fieldtype": "Check",
- "hidden": 1,
- "label": "Include Payment",
- "print_hide": 1
- },
- {
- "default": "0",
- "fieldname": "send_payment_request",
- "fieldtype": "Check",
- "label": "Send Payment Request",
- "no_copy": 1,
- "print_hide": 1
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "company",
- "fieldtype": "Link",
- "label": "Institution",
- "options": "Company",
- "remember_last_selected_value": 1,
- "reqd": 1
- },
- {
- "bold": 1,
- "default": "Today",
- "fieldname": "posting_date",
- "fieldtype": "Date",
- "label": "Date",
- "no_copy": 1,
- "reqd": 1,
- "search_index": 1
- },
- {
- "fieldname": "posting_time",
- "fieldtype": "Time",
- "label": "Posting Time",
- "no_copy": 1
- },
- {
- "default": "0",
- "depends_on": "eval:doc.docstatus==0",
- "fieldname": "set_posting_time",
- "fieldtype": "Check",
- "label": "Edit Posting Date and Time",
- "print_hide": 1
- },
- {
- "fieldname": "due_date",
- "fieldtype": "Date",
- "label": "Due Date",
- "reqd": 1
- },
- {
- "collapsible": 1,
- "fieldname": "student_details",
- "fieldtype": "Section Break",
- "label": "Student Details"
- },
- {
- "fieldname": "program_enrollment",
- "fieldtype": "Link",
- "label": "Program Enrollment",
- "options": "Program Enrollment"
- },
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Program",
- "options": "Program",
- "reqd": 1
- },
- {
- "fieldname": "student_batch",
- "fieldtype": "Link",
- "label": "Student Batch",
- "options": "Student Batch Name",
- "print_hide": 1
- },
- {
- "allow_on_submit": 1,
- "fieldname": "student_email",
- "fieldtype": "Data",
- "label": "Student Email",
- "options": "Email",
- "print_hide": 1
- },
- {
- "fieldname": "column_break_16",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "student_category",
- "fieldtype": "Link",
- "label": "Student Category",
- "options": "Student Category"
- },
- {
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "label": "Academic Term",
- "options": "Academic Term"
- },
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "label": "Academic Year",
- "options": "Academic Year"
- },
- {
- "fieldname": "section_break_7",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "currency",
- "fieldtype": "Link",
- "hidden": 1,
- "label": "Currency",
- "options": "Currency",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "fieldname": "fee_structure",
- "fieldtype": "Link",
- "label": "Fee Structure",
- "options": "Fee Structure",
- "print_hide": 1
- },
- {
- "fieldname": "components",
- "fieldtype": "Table",
- "label": "Components",
- "options": "Fee Component",
- "reqd": 1
- },
- {
- "fieldname": "section_break_10",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Fees",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "fieldname": "column_break_11",
- "fieldtype": "Column Break"
- },
- {
- "default": "0",
- "fieldname": "grand_total",
- "fieldtype": "Currency",
- "label": "Grand Total",
- "read_only": 1
- },
- {
- "fieldname": "grand_total_in_words",
- "fieldtype": "Data",
- "label": "In Words",
- "length": 240,
- "read_only": 1
- },
- {
- "default": "0",
- "fieldname": "outstanding_amount",
- "fieldtype": "Currency",
- "label": "Outstanding Amount",
- "no_copy": 1,
- "read_only": 1
- },
- {
- "collapsible": 1,
- "fieldname": "edit_printing_settings",
- "fieldtype": "Section Break",
- "label": "Printing Settings",
- "print_hide": 1
- },
- {
- "allow_on_submit": 1,
- "fieldname": "letter_head",
- "fieldtype": "Link",
- "label": "Letter Head",
- "options": "Letter Head",
- "print_hide": 1
- },
- {
- "fieldname": "column_break_32",
- "fieldtype": "Column Break"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "select_print_heading",
- "fieldtype": "Link",
- "label": "Print Heading",
- "no_copy": 1,
- "options": "Print Heading",
- "print_hide": 1,
- "report_hide": 1
- },
- {
- "fieldname": "account",
- "fieldtype": "Section Break",
- "label": "Accounting",
- "print_hide": 1
- },
- {
- "fieldname": "receivable_account",
- "fieldtype": "Link",
- "label": "Receivable Account",
- "options": "Account",
- "print_hide": 1,
- "reqd": 1
- },
- {
- "fieldname": "income_account",
- "fieldtype": "Link",
- "label": "Income Account",
- "options": "Account",
- "print_hide": 1
- },
- {
- "fieldname": "column_break_39",
- "fieldtype": "Column Break",
- "print_hide": 1
- },
- {
- "fieldname": "cost_center",
- "fieldtype": "Link",
- "label": "Cost Center",
- "options": "Cost Center",
- "print_hide": 1
- },
- {
- "fieldname": "accounting_dimensions_section",
- "fieldtype": "Section Break",
- "label": "Accounting Dimensions"
- },
- {
- "fieldname": "dimension_col_break",
- "fieldtype": "Column Break"
- }
- ],
- "is_submittable": 1,
- "links": [],
- "modified": "2020-08-05 14:05:47.728409",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Fees",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts User",
- "share": 1,
- "submit": 1,
- "write": 1
- },
- {
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts Manager",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "search_fields": "student, student_name",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "student_name"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/fees/fees.py b/erpnext/education/doctype/fees/fees.py
deleted file mode 100644
index be608bf..0000000
--- a/erpnext/education/doctype/fees/fees.py
+++ /dev/null
@@ -1,162 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.utils import money_in_words
-from frappe.utils.csvutils import getlink
-
-import erpnext
-from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request
-from erpnext.accounts.general_ledger import make_reverse_gl_entries
-from erpnext.controllers.accounts_controller import AccountsController
-
-
-class Fees(AccountsController):
- def set_indicator(self):
- """Set indicator for portal"""
- if self.outstanding_amount > 0:
- self.indicator_color = "orange"
- self.indicator_title = _("Unpaid")
- else:
- self.indicator_color = "green"
- self.indicator_title = _("Paid")
-
- def validate(self):
- self.calculate_total()
- self.set_missing_accounts_and_fields()
-
- def set_missing_accounts_and_fields(self):
- if not self.company:
- self.company = frappe.defaults.get_defaults().company
- if not self.currency:
- self.currency = erpnext.get_company_currency(self.company)
- if not (self.receivable_account and self.income_account and self.cost_center):
- accounts_details = frappe.get_all(
- "Company",
- fields=["default_receivable_account", "default_income_account", "cost_center"],
- filters={"name": self.company},
- )[0]
- if not self.receivable_account:
- self.receivable_account = accounts_details.default_receivable_account
- if not self.income_account:
- self.income_account = accounts_details.default_income_account
- if not self.cost_center:
- self.cost_center = accounts_details.cost_center
- if not self.student_email:
- self.student_email = self.get_student_emails()
-
- def get_student_emails(self):
- student_emails = frappe.db.sql_list(
- """
- select g.email_address
- from `tabGuardian` g, `tabStudent Guardian` sg
- where g.name = sg.guardian and sg.parent = %s and sg.parenttype = 'Student'
- and ifnull(g.email_address, '')!=''
- """,
- self.student,
- )
-
- student_email_id = frappe.db.get_value("Student", self.student, "student_email_id")
- if student_email_id:
- student_emails.append(student_email_id)
- if student_emails:
- return ", ".join(list(set(student_emails)))
- else:
- return None
-
- def calculate_total(self):
- """Calculates total amount."""
- self.grand_total = 0
- for d in self.components:
- self.grand_total += d.amount
- self.outstanding_amount = self.grand_total
- self.grand_total_in_words = money_in_words(self.grand_total)
-
- def on_submit(self):
-
- self.make_gl_entries()
-
- if self.send_payment_request and self.student_email:
- pr = make_payment_request(
- party_type="Student",
- party=self.student,
- dt="Fees",
- dn=self.name,
- recipient_id=self.student_email,
- submit_doc=True,
- use_dummy_message=True,
- )
- frappe.msgprint(_("Payment request {0} created").format(getlink("Payment Request", pr.name)))
-
- def on_cancel(self):
- self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
- make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
- # frappe.db.set(self, 'status', 'Cancelled')
-
- def make_gl_entries(self):
- if not self.grand_total:
- return
- student_gl_entries = self.get_gl_dict(
- {
- "account": self.receivable_account,
- "party_type": "Student",
- "party": self.student,
- "against": self.income_account,
- "debit": self.grand_total,
- "debit_in_account_currency": self.grand_total,
- "against_voucher": self.name,
- "against_voucher_type": self.doctype,
- },
- item=self,
- )
-
- fee_gl_entry = self.get_gl_dict(
- {
- "account": self.income_account,
- "against": self.student,
- "credit": self.grand_total,
- "credit_in_account_currency": self.grand_total,
- "cost_center": self.cost_center,
- },
- item=self,
- )
-
- from erpnext.accounts.general_ledger import make_gl_entries
-
- make_gl_entries(
- [student_gl_entries, fee_gl_entry],
- cancel=(self.docstatus == 2),
- update_outstanding="Yes",
- merge_entries=False,
- )
-
-
-def get_fee_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"):
- user = frappe.session.user
- student = frappe.db.sql("select name from `tabStudent` where student_email_id= %s", user)
- if student:
- return frappe.db.sql(
- """
- select name, program, due_date, grand_total - outstanding_amount as paid_amount,
- outstanding_amount, grand_total, currency
- from `tabFees`
- where student= %s and docstatus=1
- order by due_date asc limit {0} , {1}""".format(
- limit_start, limit_page_length
- ),
- student,
- as_dict=True,
- )
-
-
-def get_list_context(context=None):
- return {
- "show_sidebar": True,
- "show_search": True,
- "no_breadcrumbs": True,
- "title": _("Fees"),
- "get_list": get_fee_list,
- "row_template": "templates/includes/fee/fee_row.html",
- }
diff --git a/erpnext/education/doctype/fees/fees_list.js b/erpnext/education/doctype/fees/fees_list.js
deleted file mode 100644
index ee8e1e3..0000000
--- a/erpnext/education/doctype/fees/fees_list.js
+++ /dev/null
@@ -1,12 +0,0 @@
-frappe.listview_settings['Fees'] = {
- add_fields: ["grand_total", "outstanding_amount", "due_date"],
- get_indicator: function(doc) {
- if(flt(doc.outstanding_amount)==0) {
- return [__("Paid"), "green", "outstanding_amount,=,0"];
- } else if (flt(doc.outstanding_amount) > 0 && doc.due_date >= frappe.datetime.get_today()) {
- return [__("Unpaid"), "orange", "outstanding_amount,>,0|due_date,>,Today"];
- } else if (flt(doc.outstanding_amount) > 0 && doc.due_date < frappe.datetime.get_today()) {
- return [__("Overdue"), "red", "outstanding_amount,>,0|due_date,<=,Today"];
- }
- }
-};
diff --git a/erpnext/education/doctype/fees/test_fees.py b/erpnext/education/doctype/fees/test_fees.py
deleted file mode 100644
index f0f7e67..0000000
--- a/erpnext/education/doctype/fees/test_fees.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-from frappe.utils import nowdate
-from frappe.utils.make_random import get_random
-
-from erpnext.education.doctype.program.test_program import make_program_and_linked_courses
-
-test_dependencies = ["Company"]
-
-
-class TestFees(unittest.TestCase):
- def test_fees(self):
- student = get_random("Student")
- program = make_program_and_linked_courses(
- "_Test Program 1", ["_Test Course 1", "_Test Course 2"]
- )
- fee = frappe.new_doc("Fees")
- fee.posting_date = nowdate()
- fee.due_date = nowdate()
- fee.student = student
- fee.receivable_account = "_Test Receivable - _TC"
- fee.income_account = "Sales - _TC"
- fee.cost_center = "_Test Cost Center - _TC"
- fee.company = "_Test Company"
- fee.program = program.name
-
- fee.extend(
- "components",
- [
- {"fees_category": "Tuition Fee", "amount": 40000},
- {"fees_category": "Transportation Fee", "amount": 10000},
- ],
- )
- fee.save()
- fee.submit()
-
- gl_entries = frappe.db.sql(
- """
- select account, posting_date, party_type, party, cost_center, fiscal_year, voucher_type,
- voucher_no, against_voucher_type, against_voucher, cost_center, company, credit, debit
- from `tabGL Entry` where voucher_type=%s and voucher_no=%s""",
- ("Fees", fee.name),
- as_dict=True,
- )
-
- if gl_entries[0].account == "_Test Receivable - _TC":
- self.assertEqual(gl_entries[0].debit, 50000)
- self.assertEqual(gl_entries[0].credit, 0)
- self.assertEqual(gl_entries[1].debit, 0)
- self.assertEqual(gl_entries[1].credit, 50000)
- else:
- self.assertEqual(gl_entries[0].credit, 50000)
- self.assertEqual(gl_entries[0].debit, 0)
- self.assertEqual(gl_entries[1].credit, 0)
- self.assertEqual(gl_entries[1].debit, 50000)
diff --git a/erpnext/education/doctype/grading_scale/__init__.py b/erpnext/education/doctype/grading_scale/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/grading_scale/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/grading_scale/grading_scale.js b/erpnext/education/doctype/grading_scale/grading_scale.js
deleted file mode 100644
index 622388c..0000000
--- a/erpnext/education/doctype/grading_scale/grading_scale.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Grading Scale', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/grading_scale/grading_scale.json b/erpnext/education/doctype/grading_scale/grading_scale.json
deleted file mode 100644
index fb1e2c7..0000000
--- a/erpnext/education/doctype/grading_scale/grading_scale.json
+++ /dev/null
@@ -1,226 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 1,
- "autoname": "field:grading_scale_name",
- "beta": 0,
- "creation": "2016-08-26 03:06:53.922972",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "grading_scale_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Grading Scale Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 1
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "grading_intervals_section",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Grading Scale Intervals",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "intervals",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Intervals",
- "length": 0,
- "no_copy": 0,
- "options": "Grading Scale Interval",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Amended From",
- "length": 0,
- "no_copy": 1,
- "options": "Grading Scale",
- "permlevel": 0,
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "description",
- "fieldtype": "Small Text",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Description",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 1,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-08-30 00:34:03.368432",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Grading Scale",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/grading_scale/grading_scale.py b/erpnext/education/doctype/grading_scale/grading_scale.py
deleted file mode 100644
index c4bd158..0000000
--- a/erpnext/education/doctype/grading_scale/grading_scale.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import cint
-
-
-class GradingScale(Document):
- def validate(self):
- thresholds = []
- for d in self.intervals:
- if d.threshold in thresholds:
- frappe.throw(_("Treshold {0}% appears more than once").format(d.threshold))
- else:
- thresholds.append(cint(d.threshold))
- if 0 not in thresholds:
- frappe.throw(_("Please define grade for Threshold 0%"))
diff --git a/erpnext/education/doctype/grading_scale/grading_scale_dashboard.py b/erpnext/education/doctype/grading_scale/grading_scale_dashboard.py
deleted file mode 100644
index 6995666..0000000
--- a/erpnext/education/doctype/grading_scale/grading_scale_dashboard.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "grading_scale",
- "non_standard_fieldnames": {"Course": "default_grading_scale"},
- "transactions": [
- {"label": _("Course"), "items": ["Course"]},
- {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
- ],
- }
diff --git a/erpnext/education/doctype/grading_scale/test_grading_scale.py b/erpnext/education/doctype/grading_scale/test_grading_scale.py
deleted file mode 100644
index 09a092c..0000000
--- a/erpnext/education/doctype/grading_scale/test_grading_scale.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Grading Scale')
-
-
-class TestGradingScale(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/grading_scale/test_records.json b/erpnext/education/doctype/grading_scale/test_records.json
deleted file mode 100644
index 72b6954..0000000
--- a/erpnext/education/doctype/grading_scale/test_records.json
+++ /dev/null
@@ -1,19 +0,0 @@
-[
- {
- "grading_scale_name": "_Test Grading Scale",
- "intervals": [
- {
- "grade_code": "A",
- "threshold": 75
- },
- {
- "grade_code": "B",
- "threshold": 50
- },
- {
- "grade_code": "C",
- "threshold": 0
- }
- ]
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/grading_scale_interval/__init__.py b/erpnext/education/doctype/grading_scale_interval/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/grading_scale_interval/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.json b/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.json
deleted file mode 100644
index 5574e1d..0000000
--- a/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.json
+++ /dev/null
@@ -1,133 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-08-26 03:11:09.591049",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "grade_code",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Grade Code",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "fieldname": "threshold",
- "fieldtype": "Percent",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Threshold",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "1",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "grade_description",
- "fieldtype": "Small Text",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Grade Description",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2017-11-10 19:08:48.083084",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Grading Scale Interval",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.py b/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.py
deleted file mode 100644
index b4101bd..0000000
--- a/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class GradingScaleInterval(Document):
- pass
diff --git a/erpnext/education/doctype/guardian/__init__.py b/erpnext/education/doctype/guardian/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/guardian/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/guardian/guardian.js b/erpnext/education/doctype/guardian/guardian.js
deleted file mode 100644
index b7c2f0a..0000000
--- a/erpnext/education/doctype/guardian/guardian.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Guardian', {
- refresh: function(frm) {
- if(!frm.doc.user && !frm.is_new()) {
- frm.add_custom_button(__("Invite as User"), function() {
- return frappe.call({
- method: "erpnext.education.doctype.guardian.guardian.invite_guardian",
- args: {
- guardian: frm.doc.name
- },
- callback: function(r) {
- frm.set_value("user", r.message);
- }
- });
- });
- }
- }
-});
diff --git a/erpnext/education/doctype/guardian/guardian.json b/erpnext/education/doctype/guardian/guardian.json
deleted file mode 100644
index 7b8168e..0000000
--- a/erpnext/education/doctype/guardian/guardian.json
+++ /dev/null
@@ -1,580 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "EDU-GRD-.YYYY.-.#####",
- "beta": 0,
- "creation": "2016-07-21 15:32:51.163292",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "guardian_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Guardian Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "email_address",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Email Address",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "mobile_number",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Mobile Number",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "alternate_number",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Alternate Number",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "date_of_birth",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Date of Birth",
- "length": 0,
- "no_copy": 1,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "user",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "User Id",
- "length": 0,
- "no_copy": 0,
- "options": "User",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_3",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "education",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Education",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "occupation",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Occupation",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "designation",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Designation",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "work_address",
- "fieldtype": "Text",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Work Address",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Image",
- "length": 0,
- "no_copy": 1,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_13",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Guardian Of ",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "students",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Students",
- "length": 0,
- "no_copy": 0,
- "options": "Guardian Student",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_8",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Guardian Interests",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "interests",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Interests",
- "length": 0,
- "no_copy": 0,
- "options": "Guardian Interest",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_field": "image",
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-08-21 16:15:54.050317",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Guardian",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "guardian_name",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/guardian/guardian.py b/erpnext/education/doctype/guardian/guardian.py
deleted file mode 100644
index a456e08..0000000
--- a/erpnext/education/doctype/guardian/guardian.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils.csvutils import getlink
-
-
-class Guardian(Document):
- def __setup__(self):
- self.onload()
-
- def onload(self):
- """Load Students for quick view"""
- self.load_students()
-
- def load_students(self):
- """Load `students` from the database"""
- self.students = []
- students = frappe.get_all("Student Guardian", filters={"guardian": self.name}, fields=["parent"])
- for student in students:
- self.append(
- "students",
- {
- "student": student.parent,
- "student_name": frappe.db.get_value("Student", student.parent, "title"),
- },
- )
-
- def validate(self):
- self.students = []
-
-
-@frappe.whitelist()
-def invite_guardian(guardian):
- guardian_doc = frappe.get_doc("Guardian", guardian)
- if not guardian_doc.email_address:
- frappe.throw(_("Please set Email Address"))
- else:
- guardian_as_user = frappe.get_value("User", dict(email=guardian_doc.email_address))
- if guardian_as_user:
- frappe.msgprint(_("User {0} already exists").format(getlink("User", guardian_as_user)))
- return guardian_as_user
- else:
- user = frappe.get_doc(
- {
- "doctype": "User",
- "first_name": guardian_doc.guardian_name,
- "email": guardian_doc.email_address,
- "user_type": "Website User",
- "send_welcome_email": 1,
- }
- ).insert(ignore_permissions=True)
- frappe.msgprint(_("User {0} created").format(getlink("User", user.name)))
- return user.name
diff --git a/erpnext/education/doctype/guardian/test_guardian.py b/erpnext/education/doctype/guardian/test_guardian.py
deleted file mode 100644
index de3638c..0000000
--- a/erpnext/education/doctype/guardian/test_guardian.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Guardian')
-
-
-class TestGuardian(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/guardian_interest/__init__.py b/erpnext/education/doctype/guardian_interest/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/guardian_interest/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/guardian_interest/guardian_interest.json b/erpnext/education/doctype/guardian_interest/guardian_interest.json
deleted file mode 100644
index 1995c55..0000000
--- a/erpnext/education/doctype/guardian_interest/guardian_interest.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-07-25 07:19:55.113871",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "interest",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Interest",
- "length": 0,
- "no_copy": 0,
- "options": "Interest",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2017-11-10 19:10:22.333454",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Guardian Interest",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/guardian_interest/guardian_interest.py b/erpnext/education/doctype/guardian_interest/guardian_interest.py
deleted file mode 100644
index 6cd1e55..0000000
--- a/erpnext/education/doctype/guardian_interest/guardian_interest.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class GuardianInterest(Document):
- pass
diff --git a/erpnext/education/doctype/guardian_student/__init__.py b/erpnext/education/doctype/guardian_student/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/guardian_student/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/guardian_student/guardian_student.json b/erpnext/education/doctype/guardian_student/guardian_student.json
deleted file mode 100644
index 2519a54..0000000
--- a/erpnext/education/doctype/guardian_student/guardian_student.json
+++ /dev/null
@@ -1,132 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2017-01-31 11:53:21.580099",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student",
- "length": 0,
- "no_copy": 0,
- "options": "Student",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2017-11-10 19:10:15.786362",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Guardian Student",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/guardian_student/guardian_student.py b/erpnext/education/doctype/guardian_student/guardian_student.py
deleted file mode 100644
index 4c29575..0000000
--- a/erpnext/education/doctype/guardian_student/guardian_student.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class GuardianStudent(Document):
- pass
diff --git a/erpnext/education/doctype/instructor/__init__.py b/erpnext/education/doctype/instructor/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/instructor/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/instructor/instructor.js b/erpnext/education/doctype/instructor/instructor.js
deleted file mode 100644
index 034b0aa..0000000
--- a/erpnext/education/doctype/instructor/instructor.js
+++ /dev/null
@@ -1,64 +0,0 @@
-cur_frm.add_fetch("employee", "department", "department");
-cur_frm.add_fetch("employee", "image", "image");
-
-frappe.ui.form.on("Instructor", {
- employee: function(frm) {
- if (!frm.doc.employee) return;
- frappe.db.get_value("Employee", {name: frm.doc.employee}, "company", (d) => {
- frm.set_query("department", function() {
- return {
- "filters": {
- "company": d.company,
- }
- };
- });
- frm.set_query("department", "instructor_log", function() {
- return {
- "filters": {
- "company": d.company,
- }
- };
- });
- });
- },
- refresh: function(frm) {
- if (!frm.doc.__islocal) {
- frm.add_custom_button(__("As Examiner"), function() {
- frappe.new_doc("Assessment Plan", {
- examiner: frm.doc.name
- });
- }, __("Assessment Plan"));
- frm.add_custom_button(__("As Supervisor"), function() {
- frappe.new_doc("Assessment Plan", {
- supervisor: frm.doc.name
- });
- }, __("Assessment Plan"));
- }
- frm.set_query("employee", function(doc) {
- return {
- "filters": {
- "department": doc.department,
- }
- };
- });
-
- frm.set_query("academic_term", "instructor_log", function(_doc, cdt, cdn) {
- let d = locals[cdt][cdn];
- return {
- filters: {
- "academic_year": d.academic_year
- }
- };
- });
-
- frm.set_query("course", "instructor_log", function(_doc, cdt, cdn) {
- let d = locals[cdt][cdn];
- return {
- query: "erpnext.education.doctype.program_enrollment.program_enrollment.get_program_courses",
- filters: {
- "program": d.program
- }
- };
- });
- }
-});
diff --git a/erpnext/education/doctype/instructor/instructor.json b/erpnext/education/doctype/instructor/instructor.json
deleted file mode 100644
index a417391..0000000
--- a/erpnext/education/doctype/instructor/instructor.json
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "naming_series:",
- "creation": "2015-11-04 15:56:30.004034",
- "doctype": "DocType",
- "document_type": "Other",
- "engine": "InnoDB",
- "field_order": [
- "instructor_name",
- "employee",
- "gender",
- "column_break_5",
- "status",
- "naming_series",
- "department",
- "image",
- "log_details",
- "instructor_log"
- ],
- "fields": [
- {
- "fieldname": "instructor_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Instructor Name",
- "reqd": 1
- },
- {
- "fieldname": "employee",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Employee",
- "options": "Employee"
- },
- {
- "fieldname": "column_break_5",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Naming Series",
- "options": "EDU-INS-.YYYY.-",
- "set_only_once": 1
- },
- {
- "fetch_from": "employee.department",
- "fieldname": "department",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Department",
- "options": "Department"
- },
- {
- "fieldname": "image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "label": "Image"
- },
- {
- "fieldname": "log_details",
- "fieldtype": "Section Break",
- "label": "Instructor Log"
- },
- {
- "fieldname": "instructor_log",
- "fieldtype": "Table",
- "label": "Instructor Log",
- "options": "Instructor Log"
- },
- {
- "default": "Active",
- "fieldname": "status",
- "fieldtype": "Select",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Status",
- "options": "Active\nLeft"
- },
- {
- "fetch_from": "employee.gender",
- "fieldname": "gender",
- "fieldtype": "Link",
- "label": "Gender",
- "options": "Gender",
- "read_only_depends_on": "employee"
- }
- ],
- "image_field": "image",
- "links": [],
- "modified": "2020-07-23 18:33:57.904398",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Instructor",
- "owner": "Administrator",
- "permissions": [
- {
- "email": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor"
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Education Manager",
- "set_user_permissions": 1,
- "share": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "instructor_name"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/instructor/instructor.py b/erpnext/education/doctype/instructor/instructor.py
deleted file mode 100644
index 24e0607..0000000
--- a/erpnext/education/doctype/instructor/instructor.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.model.naming import set_name_by_naming_series
-
-
-class Instructor(Document):
- def autoname(self):
- naming_method = frappe.db.get_value("Education Settings", None, "instructor_created_by")
- if not naming_method:
- frappe.throw(_("Please setup Instructor Naming System in Education > Education Settings"))
- else:
- if naming_method == "Naming Series":
- set_name_by_naming_series(self)
- elif naming_method == "Employee Number":
- if not self.employee:
- frappe.throw(_("Please select Employee"))
- self.name = self.employee
- elif naming_method == "Full Name":
- self.name = self.instructor_name
-
- def validate(self):
- self.validate_duplicate_employee()
-
- def validate_duplicate_employee(self):
- if self.employee and frappe.db.get_value(
- "Instructor", {"employee": self.employee, "name": ["!=", self.name]}, "name"
- ):
- frappe.throw(_("Employee ID is linked with another instructor"))
-
-
-def get_timeline_data(doctype, name):
- """Return timeline for course schedule"""
- return dict(
- frappe.db.sql(
- """
- SELECT unix_timestamp(`schedule_date`), count(*)
- FROM `tabCourse Schedule`
- WHERE
- instructor=%s and
- `schedule_date` > date_sub(curdate(), interval 1 year)
- GROUP BY schedule_date
- """,
- name,
- )
- )
diff --git a/erpnext/education/doctype/instructor/instructor_dashboard.py b/erpnext/education/doctype/instructor/instructor_dashboard.py
deleted file mode 100644
index ead10ca..0000000
--- a/erpnext/education/doctype/instructor/instructor_dashboard.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "heatmap": True,
- "heatmap_message": _("This is based on the course schedules of this Instructor"),
- "fieldname": "instructor",
- "non_standard_fieldnames": {"Assessment Plan": "supervisor"},
- "transactions": [
- {"label": _("Course and Assessment"), "items": ["Course Schedule", "Assessment Plan"]},
- {"label": _("Students"), "items": ["Student Group"]},
- ],
- }
diff --git a/erpnext/education/doctype/instructor/test_instructor.py b/erpnext/education/doctype/instructor/test_instructor.py
deleted file mode 100644
index ee1e81d..0000000
--- a/erpnext/education/doctype/instructor/test_instructor.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Instructor')
-
-
-class TestInstructor(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/instructor/test_records.json b/erpnext/education/doctype/instructor/test_records.json
deleted file mode 100644
index 220d84e..0000000
--- a/erpnext/education/doctype/instructor/test_records.json
+++ /dev/null
@@ -1,12 +0,0 @@
-[
- {
- "naming_series": "_T-Instructor-",
- "employee": "_T-Employee-00001",
- "instructor_name": "_Test Instructor"
- },
- {
- "naming_series": "_T-Instructor-",
- "employee": "_T-Employee-00002",
- "instructor_name": "_Test Instructor 2"
- }
-]
diff --git a/erpnext/education/doctype/instructor_log/__init__.py b/erpnext/education/doctype/instructor_log/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/instructor_log/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/instructor_log/instructor_log.json b/erpnext/education/doctype/instructor_log/instructor_log.json
deleted file mode 100644
index 5b9e1f9..0000000
--- a/erpnext/education/doctype/instructor_log/instructor_log.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
- "actions": [],
- "creation": "2017-12-27 08:55:52.680284",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "academic_year",
- "academic_term",
- "department",
- "column_break_3",
- "program",
- "course",
- "student_group",
- "section_break_8",
- "other_details"
- ],
- "fields": [
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Academic Year",
- "options": "Academic Year",
- "reqd": 1
- },
- {
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Academic Term",
- "options": "Academic Term"
- },
- {
- "fieldname": "department",
- "fieldtype": "Link",
- "label": "Department",
- "options": "Department"
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Program",
- "options": "Program",
- "reqd": 1
- },
- {
- "fieldname": "course",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Course",
- "options": "Course"
- },
- {
- "fieldname": "student_group",
- "fieldtype": "Link",
- "label": "Student Group",
- "options": "Student Group"
- },
- {
- "fieldname": "section_break_8",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "other_details",
- "fieldtype": "Small Text",
- "label": "Other details"
- }
- ],
- "istable": 1,
- "links": [],
- "modified": "2020-10-23 15:15:50.759657",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Instructor Log",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/instructor_log/instructor_log.py b/erpnext/education/doctype/instructor_log/instructor_log.py
deleted file mode 100644
index 12d11ba..0000000
--- a/erpnext/education/doctype/instructor_log/instructor_log.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class InstructorLog(Document):
- pass
diff --git a/erpnext/education/doctype/options/__init__.py b/erpnext/education/doctype/options/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/options/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/options/options.json b/erpnext/education/doctype/options/options.json
deleted file mode 100644
index 59deab7..0000000
--- a/erpnext/education/doctype/options/options.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2018-10-15 14:05:28.601274",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "option",
- "fieldtype": "Small Text",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Option",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "is_correct",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Is Correct",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-10-15 14:16:18.303156",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Options",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/options/options.py b/erpnext/education/doctype/options/options.py
deleted file mode 100644
index 968a772..0000000
--- a/erpnext/education/doctype/options/options.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class Options(Document):
- pass
diff --git a/erpnext/education/doctype/program/__init__.py b/erpnext/education/doctype/program/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/program/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/program/program.js b/erpnext/education/doctype/program/program.js
deleted file mode 100644
index 2d89351..0000000
--- a/erpnext/education/doctype/program/program.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies and contributors
-// For license information, please see license.txt
-
-cur_frm.add_fetch('fee_structure', 'total_amount', 'amount');
-
-frappe.ui.form.on("Program", "refresh", function(frm) {
-
-});
diff --git a/erpnext/education/doctype/program/program.json b/erpnext/education/doctype/program/program.json
deleted file mode 100644
index 2dfe50b..0000000
--- a/erpnext/education/doctype/program/program.json
+++ /dev/null
@@ -1,177 +0,0 @@
-{
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:program_name",
- "creation": "2015-09-07 12:54:03.609282",
- "doctype": "DocType",
- "engine": "InnoDB",
- "field_order": [
- "program_name",
- "department",
- "column_break_3",
- "program_abbreviation",
- "section_break_courses",
- "courses",
- "section_break_5",
- "is_published",
- "allow_self_enroll",
- "is_featured",
- "column_break_11",
- "intro_video",
- "hero_image",
- "description"
- ],
- "fields": [
- {
- "fieldname": "program_name",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Program Name",
- "reqd": 1,
- "unique": 1
- },
- {
- "fieldname": "department",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Department",
- "options": "Department"
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "program_abbreviation",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Program Abbreviation"
- },
- {
- "fieldname": "section_break_5",
- "fieldtype": "Section Break",
- "label": "Portal Settings"
- },
- {
- "fieldname": "courses",
- "fieldtype": "Table",
- "label": "Courses",
- "options": "Program Course"
- },
- {
- "depends_on": "is_published",
- "fieldname": "description",
- "fieldtype": "Small Text",
- "label": "Description"
- },
- {
- "depends_on": "is_published",
- "fieldname": "intro_video",
- "fieldtype": "Data",
- "label": "Intro Video"
- },
- {
- "fieldname": "hero_image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "label": "Hero Image"
- },
- {
- "default": "0",
- "fieldname": "is_published",
- "fieldtype": "Check",
- "label": "Is Published"
- },
- {
- "default": "0",
- "depends_on": "eval: doc.is_published == 1",
- "fieldname": "is_featured",
- "fieldtype": "Check",
- "label": "Is Featured"
- },
- {
- "default": "0",
- "depends_on": "eval: doc.is_published == 1",
- "fieldname": "allow_self_enroll",
- "fieldtype": "Check",
- "label": "Allow Self Enroll"
- },
- {
- "fieldname": "section_break_courses",
- "fieldtype": "Section Break",
- "label": "Courses"
- },
- {
- "fieldname": "column_break_11",
- "fieldtype": "Column Break"
- }
- ],
- "image_field": "hero_image",
- "modified": "2019-06-12 12:31:14.999346",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "share": 1,
- "write": 1
- },
- {
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Guest",
- "share": 1
- },
- {
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Student",
- "share": 1
- }
- ],
- "restrict_to_domain": "Education",
- "search_fields": "program_name",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/program/program.py b/erpnext/education/doctype/program/program.py
deleted file mode 100644
index 5250f8c..0000000
--- a/erpnext/education/doctype/program/program.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe.model.document import Document
-
-
-class Program(Document):
- def get_course_list(self):
- program_course_list = self.courses
- course_list = [
- frappe.get_doc("Course", program_course.course) for program_course in program_course_list
- ]
- return course_list
diff --git a/erpnext/education/doctype/program/program_dashboard.py b/erpnext/education/doctype/program/program_dashboard.py
deleted file mode 100644
index 2182061..0000000
--- a/erpnext/education/doctype/program/program_dashboard.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "program",
- "transactions": [
- {"label": _("Admission and Enrollment"), "items": ["Student Applicant", "Program Enrollment"]},
- {"label": _("Student Activity"), "items": ["Student Group", "Student Log"]},
- {"label": _("Fee"), "items": ["Fees", "Fee Structure", "Fee Schedule"]},
- {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
- ],
- }
diff --git a/erpnext/education/doctype/program/test_program.py b/erpnext/education/doctype/program/test_program.py
deleted file mode 100644
index c3dbad2..0000000
--- a/erpnext/education/doctype/program/test_program.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-
-from erpnext.education.doctype.course.test_course import make_course, make_course_and_linked_topic
-from erpnext.education.doctype.topic.test_topic import make_topic_and_linked_content
-
-test_data = {
- "program_name": "_Test Program",
- "description": "_Test Program",
- "course": [
- {
- "course_name": "_Test Course 1",
- "topic": [
- {
- "topic_name": "_Test Topic 1-1",
- "content": [
- {"type": "Article", "name": "_Test Article 1-1"},
- {"type": "Article", "name": "_Test Article 1-2"},
- ],
- },
- {
- "topic_name": "_Test Topic 1-2",
- "content": [
- {"type": "Article", "name": "_Test Article 1-3"},
- {"type": "Article", "name": "_Test Article 1-4"},
- ],
- },
- ],
- }
- ],
-}
-
-
-class TestProgram(unittest.TestCase):
- def setUp(self):
- make_program_and_linked_courses("_Test Program 1", ["_Test Course 1", "_Test Course 2"])
-
- def test_get_course_list(self):
- program = frappe.get_doc("Program", "_Test Program 1")
- course = program.get_course_list()
- self.assertEqual(course[0].name, "_Test Course 1")
- self.assertEqual(course[1].name, "_Test Course 2")
- frappe.db.rollback()
-
- def tearDown(self):
- for dt in ["Program", "Course", "Topic", "Article"]:
- for entry in frappe.get_all(dt):
- frappe.delete_doc(dt, entry.program)
-
-
-def make_program(name):
- program = frappe.get_doc(
- {
- "doctype": "Program",
- "program_name": name,
- "program_code": name,
- "description": "_test description",
- "is_published": True,
- "is_featured": True,
- }
- ).insert()
- return program.name
-
-
-def make_program_and_linked_courses(program_name, course_name_list):
- try:
- program = frappe.get_doc("Program", program_name)
- except frappe.DoesNotExistError:
- make_program(program_name)
- program = frappe.get_doc("Program", program_name)
- course_list = [make_course(course_name) for course_name in course_name_list]
- for course in course_list:
- program.append("courses", {"course": course, "required": 1})
- program.save()
- return program
-
-
-def setup_program():
- topic_list = [course["topic"] for course in test_data["course"]]
- for topic in topic_list[0]:
- make_topic_and_linked_content(topic["topic_name"], topic["content"])
-
- all_courses_list = [
- {"course": course["course_name"], "topic": [topic["topic_name"] for topic in course["topic"]]}
- for course in test_data["course"]
- ] # returns [{'course': 'Applied Math', 'topic': ['Trignometry', 'Geometry']}]
- for course in all_courses_list:
- make_course_and_linked_topic(course["course"], course["topic"])
-
- course_list = [course["course_name"] for course in test_data["course"]]
- program = make_program_and_linked_courses(test_data["program_name"], course_list)
- return program
diff --git a/erpnext/education/doctype/program/test_records.json b/erpnext/education/doctype/program/test_records.json
deleted file mode 100644
index 4013695..0000000
--- a/erpnext/education/doctype/program/test_records.json
+++ /dev/null
@@ -1,12 +0,0 @@
-[
- {
- "program_name": "_TP1",
- "description": "Test Description",
- "program_abbreviation": "TP1"
- },
- {
- "program_name": "_TP2",
- "description": "Test Description",
- "program_abbreviation": "TP2"
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/program_course/__init__.py b/erpnext/education/doctype/program_course/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/program_course/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/program_course/program_course.json b/erpnext/education/doctype/program_course/program_course.json
deleted file mode 100644
index dc6b3fc..0000000
--- a/erpnext/education/doctype/program_course/program_course.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "actions": [],
- "creation": "2015-09-07 14:37:01.886859",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "course",
- "course_name",
- "required"
- ],
- "fields": [
- {
- "fieldname": "course",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_list_view": 1,
- "label": "Course",
- "options": "Course",
- "reqd": 1
- },
- {
- "fetch_from": "course.course_name",
- "fieldname": "course_name",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Course Name",
- "read_only": 1
- },
- {
- "default": "1",
- "fieldname": "required",
- "fieldtype": "Check",
- "in_list_view": 1,
- "label": "Mandatory"
- }
- ],
- "istable": 1,
- "links": [],
- "modified": "2020-09-15 18:14:22.816795",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Course",
- "owner": "Administrator",
- "permissions": [],
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/program_course/program_course.py b/erpnext/education/doctype/program_course/program_course.py
deleted file mode 100644
index dec392c..0000000
--- a/erpnext/education/doctype/program_course/program_course.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class ProgramCourse(Document):
- pass
diff --git a/erpnext/education/doctype/program_enrollment/__init__.py b/erpnext/education/doctype/program_enrollment/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/program_enrollment/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.js b/erpnext/education/doctype/program_enrollment/program_enrollment.js
deleted file mode 100644
index e92d063..0000000
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.js
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (c) 2016, Frappe and contributors
-// For license information, please see license.txt
-
-
-frappe.ui.form.on('Program Enrollment', {
- setup: function(frm) {
- frm.add_fetch('fee_structure', 'total_amount', 'amount');
- },
-
- onload: function(frm) {
- frm.set_query('academic_term', function() {
- return {
- 'filters':{
- 'academic_year': frm.doc.academic_year
- }
- };
- });
-
- frm.set_query('academic_term', 'fees', function() {
- return {
- 'filters':{
- 'academic_year': frm.doc.academic_year
- }
- };
- });
-
- frm.fields_dict['fees'].grid.get_field('fee_structure').get_query = function(doc, cdt, cdn) {
- var d = locals[cdt][cdn];
- return {
- filters: {'academic_term': d.academic_term}
- }
- };
-
- if (frm.doc.program) {
- frm.set_query('course', 'courses', function() {
- return {
- query: 'erpnext.education.doctype.program_enrollment.program_enrollment.get_program_courses',
- filters: {
- 'program': frm.doc.program
- }
- }
- });
- }
-
- frm.set_query('student', function() {
- return{
- query: 'erpnext.education.doctype.program_enrollment.program_enrollment.get_students',
- filters: {
- 'academic_year': frm.doc.academic_year,
- 'academic_term': frm.doc.academic_term
- }
- }
- });
- },
-
- program: function(frm) {
- frm.events.get_courses(frm);
- if (frm.doc.program) {
- frappe.call({
- method: 'erpnext.education.api.get_fee_schedule',
- args: {
- 'program': frm.doc.program,
- 'student_category': frm.doc.student_category
- },
- callback: function(r) {
- if (r.message) {
- frm.set_value('fees' ,r.message);
- frm.events.get_courses(frm);
- }
- }
- });
- }
- },
-
- student_category: function() {
- frappe.ui.form.trigger('Program Enrollment', 'program');
- },
-
- get_courses: function(frm) {
- frm.set_value('courses',[]);
- frappe.call({
- method: 'get_courses',
- doc:frm.doc,
- callback: function(r) {
- if (r.message) {
- frm.set_value('courses', r.message);
- }
- }
- })
- }
-});
-
-frappe.ui.form.on('Program Enrollment Course', {
- courses_add: function(frm){
- frm.fields_dict['courses'].grid.get_field('course').get_query = function(doc) {
- var course_list = [];
- if(!doc.__islocal) course_list.push(doc.name);
- $.each(doc.courses, function(_idx, val) {
- if (val.course) course_list.push(val.course);
- });
- return { filters: [['Course', 'name', 'not in', course_list]] };
- };
- }
-});
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.json b/erpnext/education/doctype/program_enrollment/program_enrollment.json
deleted file mode 100644
index 4a00fd0..0000000
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.json
+++ /dev/null
@@ -1,218 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "EDU-ENR-.YYYY.-.#####",
- "creation": "2015-12-02 12:58:32.916080",
- "doctype": "DocType",
- "document_type": "Document",
- "engine": "InnoDB",
- "field_order": [
- "student",
- "student_name",
- "student_category",
- "student_batch_name",
- "school_house",
- "column_break_4",
- "program",
- "academic_year",
- "academic_term",
- "enrollment_date",
- "boarding_student",
- "enrolled_courses",
- "courses",
- "transportation",
- "mode_of_transportation",
- "column_break_13",
- "vehicle_no",
- "section_break_7",
- "fees",
- "amended_from",
- "image"
- ],
- "fields": [
- {
- "fieldname": "student",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Student",
- "options": "Student",
- "reqd": 1
- },
- {
- "fetch_from": "student.title",
- "fieldname": "student_name",
- "fieldtype": "Read Only",
- "in_global_search": 1,
- "label": "Student Name",
- "read_only": 1
- },
- {
- "fieldname": "student_category",
- "fieldtype": "Link",
- "label": "Student Category",
- "options": "Student Category"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "student_batch_name",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Student Batch",
- "options": "Student Batch Name"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "school_house",
- "fieldtype": "Link",
- "label": "School House",
- "options": "School House"
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Program",
- "options": "Program",
- "reqd": 1
- },
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Academic Year",
- "options": "Academic Year",
- "reqd": 1
- },
- {
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "label": "Academic Term",
- "options": "Academic Term"
- },
- {
- "default": "Today",
- "fieldname": "enrollment_date",
- "fieldtype": "Date",
- "label": "Enrollment Date",
- "reqd": 1
- },
- {
- "default": "0",
- "description": "Check this if the Student is residing at the Institute's Hostel.",
- "fieldname": "boarding_student",
- "fieldtype": "Check",
- "label": "Boarding Student"
- },
- {
- "collapsible": 1,
- "collapsible_depends_on": "vehicle_no",
- "fieldname": "transportation",
- "fieldtype": "Section Break",
- "label": "Transportation"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "mode_of_transportation",
- "fieldtype": "Select",
- "label": "Mode of Transportation",
- "options": "\nWalking\nInstitute's Bus\nPublic Transport\nSelf-Driving Vehicle\nPick/Drop by Guardian"
- },
- {
- "fieldname": "column_break_13",
- "fieldtype": "Column Break"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "vehicle_no",
- "fieldtype": "Data",
- "label": "Vehicle/Bus Number"
- },
- {
- "fieldname": "enrolled_courses",
- "fieldtype": "Section Break",
- "label": "Enrolled courses"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "courses",
- "fieldtype": "Table",
- "label": "Courses",
- "options": "Program Enrollment Course"
- },
- {
- "collapsible": 1,
- "fieldname": "section_break_7",
- "fieldtype": "Section Break",
- "label": "Fees"
- },
- {
- "fieldname": "fees",
- "fieldtype": "Table",
- "label": "Fees",
- "options": "Program Fee"
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Program Enrollment",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "fieldname": "image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "label": "Image"
- }
- ],
- "image_field": "image",
- "is_submittable": 1,
- "links": [],
- "modified": "2020-09-15 18:12:11.988565",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Enrollment",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "submit": 1,
- "write": 1
- },
- {
- "create": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "LMS User",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "student_name"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py
deleted file mode 100644
index 69d281b..0000000
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.py
+++ /dev/null
@@ -1,220 +0,0 @@
-# Copyright (c) 2015, Frappe and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _, msgprint
-from frappe.desk.reportview import get_match_cond
-from frappe.model.document import Document
-from frappe.query_builder.functions import Min
-from frappe.utils import comma_and, get_link_to_form, getdate
-
-
-class ProgramEnrollment(Document):
- def validate(self):
- self.validate_duplication()
- self.validate_academic_year()
- if self.academic_term:
- self.validate_academic_term()
- if not self.student_name:
- self.student_name = frappe.db.get_value("Student", self.student, "title")
- if not self.courses:
- self.extend("courses", self.get_courses())
-
- def on_submit(self):
- self.update_student_joining_date()
- self.make_fee_records()
- self.create_course_enrollments()
-
- def validate_academic_year(self):
- start_date, end_date = frappe.db.get_value(
- "Academic Year", self.academic_year, ["year_start_date", "year_end_date"]
- )
- if self.enrollment_date:
- if start_date and getdate(self.enrollment_date) < getdate(start_date):
- frappe.throw(
- _("Enrollment Date cannot be before the Start Date of the Academic Year {0}").format(
- get_link_to_form("Academic Year", self.academic_year)
- )
- )
-
- if end_date and getdate(self.enrollment_date) > getdate(end_date):
- frappe.throw(
- _("Enrollment Date cannot be after the End Date of the Academic Term {0}").format(
- get_link_to_form("Academic Year", self.academic_year)
- )
- )
-
- def validate_academic_term(self):
- start_date, end_date = frappe.db.get_value(
- "Academic Term", self.academic_term, ["term_start_date", "term_end_date"]
- )
- if self.enrollment_date:
- if start_date and getdate(self.enrollment_date) < getdate(start_date):
- frappe.throw(
- _("Enrollment Date cannot be before the Start Date of the Academic Term {0}").format(
- get_link_to_form("Academic Term", self.academic_term)
- )
- )
-
- if end_date and getdate(self.enrollment_date) > getdate(end_date):
- frappe.throw(
- _("Enrollment Date cannot be after the End Date of the Academic Term {0}").format(
- get_link_to_form("Academic Term", self.academic_term)
- )
- )
-
- def validate_duplication(self):
- enrollment = frappe.get_all(
- "Program Enrollment",
- filters={
- "student": self.student,
- "program": self.program,
- "academic_year": self.academic_year,
- "academic_term": self.academic_term,
- "docstatus": ("<", 2),
- "name": ("!=", self.name),
- },
- )
- if enrollment:
- frappe.throw(_("Student is already enrolled."))
-
- def update_student_joining_date(self):
- table = frappe.qb.DocType("Program Enrollment")
- date = (
- frappe.qb.from_(table)
- .select(Min(table.enrollment_date).as_("enrollment_date"))
- .where(table.student == self.student)
- ).run(as_dict=True)
-
- if date:
- frappe.db.set_value("Student", self.student, "joining_date", date[0].enrollment_date)
-
- def make_fee_records(self):
- from erpnext.education.api import get_fee_components
-
- fee_list = []
- for d in self.fees:
- fee_components = get_fee_components(d.fee_structure)
- if fee_components:
- fees = frappe.new_doc("Fees")
- fees.update(
- {
- "student": self.student,
- "academic_year": self.academic_year,
- "academic_term": d.academic_term,
- "fee_structure": d.fee_structure,
- "program": self.program,
- "due_date": d.due_date,
- "student_name": self.student_name,
- "program_enrollment": self.name,
- "components": fee_components,
- }
- )
-
- fees.save()
- fees.submit()
- fee_list.append(fees.name)
- if fee_list:
- fee_list = [
- """<a href="/app/Form/Fees/%s" target="_blank">%s</a>""" % (fee, fee) for fee in fee_list
- ]
- msgprint(_("Fee Records Created - {0}").format(comma_and(fee_list)))
-
- @frappe.whitelist()
- def get_courses(self):
- return frappe.db.sql(
- """select course from `tabProgram Course` where parent = %s and required = 1""",
- (self.program),
- as_dict=1,
- )
-
- def create_course_enrollments(self):
- student = frappe.get_doc("Student", self.student)
- course_list = [course.course for course in self.courses]
- for course_name in course_list:
- student.enroll_in_course(
- course_name=course_name, program_enrollment=self.name, enrollment_date=self.enrollment_date
- )
-
- def get_all_course_enrollments(self):
- course_enrollment_names = frappe.get_list(
- "Course Enrollment", filters={"program_enrollment": self.name}
- )
- return [
- frappe.get_doc("Course Enrollment", course_enrollment.name)
- for course_enrollment in course_enrollment_names
- ]
-
- def get_quiz_progress(self):
- student = frappe.get_doc("Student", self.student)
- quiz_progress = frappe._dict()
- progress_list = []
- for course_enrollment in self.get_all_course_enrollments():
- course_progress = course_enrollment.get_progress(student)
- for progress_item in course_progress:
- if progress_item["content_type"] == "Quiz":
- progress_item["course"] = course_enrollment.course
- progress_list.append(progress_item)
- if not progress_list:
- return None
- quiz_progress.quiz_attempt = progress_list
- quiz_progress.name = self.program
- quiz_progress.program = self.program
- return quiz_progress
-
-
-@frappe.whitelist()
-@frappe.validate_and_sanitize_search_inputs
-def get_program_courses(doctype, txt, searchfield, start, page_len, filters):
- if not filters.get("program"):
- frappe.msgprint(_("Please select a Program first."))
- return []
-
- return frappe.db.sql(
- """select course, course_name from `tabProgram Course`
- where parent = %(program)s and course like %(txt)s {match_cond}
- order by
- if(locate(%(_txt)s, course), locate(%(_txt)s, course), 99999),
- idx desc,
- `tabProgram Course`.course asc
- limit {start}, {page_len}""".format(
- match_cond=get_match_cond(doctype), start=start, page_len=page_len
- ),
- {"txt": "%{0}%".format(txt), "_txt": txt.replace("%", ""), "program": filters["program"]},
- )
-
-
-@frappe.whitelist()
-@frappe.validate_and_sanitize_search_inputs
-def get_students(doctype, txt, searchfield, start, page_len, filters):
- if not filters.get("academic_term"):
- filters["academic_term"] = frappe.defaults.get_defaults().academic_term
-
- if not filters.get("academic_year"):
- filters["academic_year"] = frappe.defaults.get_defaults().academic_year
-
- enrolled_students = frappe.get_list(
- "Program Enrollment",
- filters={
- "academic_term": filters.get("academic_term"),
- "academic_year": filters.get("academic_year"),
- },
- fields=["student"],
- )
-
- students = [d.student for d in enrolled_students] if enrolled_students else [""]
-
- return frappe.db.sql(
- """select
- name, title from tabStudent
- where
- name not in (%s)
- and
- `%s` LIKE %s
- order by
- idx desc, name
- limit %s, %s"""
- % (", ".join(["%s"] * len(students)), searchfield, "%s", "%s", "%s"),
- tuple(students + ["%%%s%%" % txt, start, page_len]),
- )
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment_dashboard.py b/erpnext/education/doctype/program_enrollment/program_enrollment_dashboard.py
deleted file mode 100644
index c308961..0000000
--- a/erpnext/education/doctype/program_enrollment/program_enrollment_dashboard.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "program_enrollment",
- "transactions": [{"label": _("Course and Fee"), "items": ["Course Enrollment", "Fees"]}],
- "reports": [{"label": _("Report"), "items": ["Student and Guardian Contact Details"]}],
- }
diff --git a/erpnext/education/doctype/program_enrollment/test_program_enrollment.py b/erpnext/education/doctype/program_enrollment/test_program_enrollment.py
deleted file mode 100644
index 4d43175..0000000
--- a/erpnext/education/doctype/program_enrollment/test_program_enrollment.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright (c) 2015, Frappe and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-
-from erpnext.education.doctype.program.test_program import make_program_and_linked_courses
-from erpnext.education.doctype.student.test_student import create_student, get_student
-
-
-class TestProgramEnrollment(unittest.TestCase):
- def setUp(self):
- create_student(
- {
- "first_name": "_Test Name",
- "last_name": "_Test Last Name",
- "email": "_test_student@example.com",
- }
- )
- make_program_and_linked_courses("_Test Program 1", ["_Test Course 1", "_Test Course 2"])
-
- def test_create_course_enrollments(self):
- student = get_student("_test_student@example.com")
- enrollment = student.enroll_in_program("_Test Program 1")
- course_enrollments = student.get_all_course_enrollments()
- self.assertTrue("_Test Course 1" in course_enrollments.keys())
- self.assertTrue("_Test Course 2" in course_enrollments.keys())
- frappe.db.rollback()
-
- def tearDown(self):
- for entry in frappe.db.get_all("Course Enrollment"):
- frappe.delete_doc("Course Enrollment", entry.name)
-
- for entry in frappe.db.get_all("Program Enrollment"):
- doc = frappe.get_doc("Program Enrollment", entry.name)
- doc.cancel()
- doc.delete()
diff --git a/erpnext/education/doctype/program_enrollment_course/__init__.py b/erpnext/education/doctype/program_enrollment_course/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/program_enrollment_course/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.json b/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.json
deleted file mode 100644
index 502a401..0000000
--- a/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2017-04-10 19:28:19.616308",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "course",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Course",
- "length": 0,
- "no_copy": 0,
- "options": "Course",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "course.course_name",
- "fieldname": "course_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Course Name",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-05-16 22:42:39.136276",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Enrollment Course",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.py b/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.py
deleted file mode 100644
index 8b2d82c..0000000
--- a/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class ProgramEnrollmentCourse(Document):
- pass
diff --git a/erpnext/education/doctype/program_enrollment_fee/__init__.py b/erpnext/education/doctype/program_enrollment_fee/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/program_enrollment_fee/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.json b/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.json
deleted file mode 100644
index 0af2815..0000000
--- a/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.json
+++ /dev/null
@@ -1,192 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-05-19 05:52:56.322125",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Academic Term",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Term",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "fee_structure",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Fee Structure",
- "length": 0,
- "no_copy": 0,
- "options": "Fee Structure",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_3",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "due_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Due Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "amount",
- "fieldtype": "Currency",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Amount",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2017-11-10 19:11:07.516632",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Enrollment Fee",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.py b/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.py
deleted file mode 100644
index 17d410f..0000000
--- a/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class ProgramEnrollmentFee(Document):
- pass
diff --git a/erpnext/education/doctype/program_enrollment_tool/__init__.py b/erpnext/education/doctype/program_enrollment_tool/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/program_enrollment_tool/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js
deleted file mode 100644
index 06d7598..0000000
--- a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2016, Frappe and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on("Program Enrollment Tool", {
- setup: function(frm) {
- frm.add_fetch("student", "title", "student_name");
- frm.add_fetch("student_applicant", "title", "student_name");
- if(frm.doc.__onload && frm.doc.__onload.academic_term_reqd) {
- frm.toggle_reqd("academic_term", true);
- }
- },
-
- "refresh": function(frm) {
- frm.disable_save();
- frm.fields_dict.enroll_students.$input.addClass(' btn btn-primary');
- frappe.realtime.on("program_enrollment_tool", function(data) {
- frappe.hide_msgprint(true);
- frappe.show_progress(__("Enrolling students"), data.progress[0], data.progress[1]);
- });
- },
-
- get_students_from: function(frm) {
- if (frm.doc.get_students_from == "Student Applicant") {
- frm.dashboard.add_comment(__('Only the Student Applicant with the status "Approved" will be selected in the table below.'));
- }
- },
-
- "get_students": function(frm) {
- frm.set_value("students",[]);
- frappe.call({
- method: "get_students",
- doc:frm.doc,
- callback: function(r) {
- if(r.message) {
- frm.set_value("students", r.message);
- }
- }
- });
- },
-
- "enroll_students": function(frm) {
- frappe.call({
- method: "enroll_students",
- doc:frm.doc,
- callback: function(r) {
- frm.set_value("students", []);
- frappe.hide_msgprint(true);
- }
- });
- }
-});
diff --git a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json
deleted file mode 100644
index 35ad98d..0000000
--- a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json
+++ /dev/null
@@ -1,553 +0,0 @@
-{
- "allow_copy": 1,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-06-10 03:01:05.178956",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 0,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "get_students_from",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Get Students From",
- "length": 0,
- "no_copy": 0,
- "options": "\nStudent Applicant\nProgram Enrollment",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "program",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Program",
- "length": 0,
- "no_copy": 0,
- "options": "Program",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.get_students_from==\"Program Enrollment\"",
- "fieldname": "student_batch",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Student Batch",
- "length": 0,
- "no_copy": 0,
- "options": "Student Batch Name",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_3",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Academic Year",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Year",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Academic Term",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Term",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_5",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "get_students",
- "fieldtype": "Button",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Get Students",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "students",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Students",
- "length": 0,
- "no_copy": 0,
- "options": "Program Enrollment Tool Student",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_7",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Enrollment Details",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.get_students_from==\"Program Enrollment\"",
- "fieldname": "new_program",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "New Program",
- "length": 0,
- "no_copy": 0,
- "options": "Program",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "new_student_batch",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "New Student Batch",
- "length": 0,
- "no_copy": 0,
- "options": "Student Batch Name",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "enroll_students",
- "fieldtype": "Button",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Enroll Students",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_12",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.get_students_from==\"Program Enrollment\"",
- "fieldname": "new_academic_year",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "New Academic Year",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Year",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.get_students_from==\"Program Enrollment\"",
- "fieldname": "new_academic_term",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "New Academic Term",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Term",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 1,
- "hide_toolbar": 1,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 1,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-07-26 04:44:13.232146",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Enrollment Tool",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 0,
- "role": "Education Manager",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py
deleted file mode 100644
index 9e72876..0000000
--- a/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# Copyright (c) 2015, Frappe and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import cint
-
-from erpnext.education.api import enroll_student
-
-
-class ProgramEnrollmentTool(Document):
- def onload(self):
- academic_term_reqd = cint(frappe.db.get_single_value("Education Settings", "academic_term_reqd"))
- self.set_onload("academic_term_reqd", academic_term_reqd)
-
- @frappe.whitelist()
- def get_students(self):
- students = []
- if not self.get_students_from:
- frappe.throw(_("Mandatory field - Get Students From"))
- elif not self.program:
- frappe.throw(_("Mandatory field - Program"))
- elif not self.academic_year:
- frappe.throw(_("Mandatory field - Academic Year"))
- else:
- condition = "and academic_term=%(academic_term)s" if self.academic_term else " "
- if self.get_students_from == "Student Applicant":
- students = frappe.db.sql(
- """select name as student_applicant, title as student_name from `tabStudent Applicant`
- where application_status="Approved" and program=%(program)s and academic_year=%(academic_year)s {0}""".format(
- condition
- ),
- self.as_dict(),
- as_dict=1,
- )
- elif self.get_students_from == "Program Enrollment":
- condition2 = "and student_batch_name=%(student_batch)s" if self.student_batch else " "
- students = frappe.db.sql(
- """select student, student_name, student_batch_name, student_category from `tabProgram Enrollment`
- where program=%(program)s and academic_year=%(academic_year)s {0} {1} and docstatus != 2""".format(
- condition, condition2
- ),
- self.as_dict(),
- as_dict=1,
- )
-
- student_list = [d.student for d in students]
- if student_list:
- inactive_students = frappe.db.sql(
- """
- select name as student, title as student_name from `tabStudent` where name in (%s) and enabled = 0"""
- % ", ".join(["%s"] * len(student_list)),
- tuple(student_list),
- as_dict=1,
- )
-
- for student in students:
- if student.student in [d.student for d in inactive_students]:
- students.remove(student)
-
- if students:
- return students
- else:
- frappe.throw(_("No students Found"))
-
- @frappe.whitelist()
- def enroll_students(self):
- total = len(self.students)
- for i, stud in enumerate(self.students):
- frappe.publish_realtime(
- "program_enrollment_tool", dict(progress=[i + 1, total]), user=frappe.session.user
- )
- if stud.student:
- prog_enrollment = frappe.new_doc("Program Enrollment")
- prog_enrollment.student = stud.student
- prog_enrollment.student_name = stud.student_name
- prog_enrollment.student_category = stud.student_category
- prog_enrollment.program = self.new_program
- prog_enrollment.academic_year = self.new_academic_year
- prog_enrollment.academic_term = self.new_academic_term
- prog_enrollment.student_batch_name = (
- stud.student_batch_name if stud.student_batch_name else self.new_student_batch
- )
- prog_enrollment.save()
- elif stud.student_applicant:
- prog_enrollment = enroll_student(stud.student_applicant)
- prog_enrollment.academic_year = self.academic_year
- prog_enrollment.academic_term = self.academic_term
- prog_enrollment.student_batch_name = (
- stud.student_batch_name if stud.student_batch_name else self.new_student_batch
- )
- prog_enrollment.save()
- frappe.msgprint(_("{0} Students have been enrolled").format(total))
diff --git a/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.py b/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.py
deleted file mode 100644
index e806792..0000000
--- a/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestProgramEnrollmentTool(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/program_enrollment_tool_student/__init__.py b/erpnext/education/doctype/program_enrollment_tool_student/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/program_enrollment_tool_student/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json b/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json
deleted file mode 100644
index 1d74973..0000000
--- a/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "actions": [],
- "creation": "2016-06-10 03:29:02.539914",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "student_applicant",
- "student",
- "student_name",
- "column_break_3",
- "student_batch_name",
- "student_category"
- ],
- "fields": [
- {
- "fieldname": "student_applicant",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Student Applicant",
- "options": "Student Applicant"
- },
- {
- "fieldname": "student",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Student",
- "options": "Student"
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "student_name",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Student Name",
- "read_only": 1
- },
- {
- "fieldname": "student_batch_name",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Student Batch Name",
- "options": "Student Batch Name"
- },
- {
- "fieldname": "student_category",
- "fieldtype": "Link",
- "label": "Student Category",
- "options": "Student Category",
- "read_only": 1
- }
- ],
- "istable": 1,
- "links": [],
- "modified": "2021-07-29 18:19:54.471594",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Enrollment Tool Student",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py b/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py
deleted file mode 100644
index b37e5d3..0000000
--- a/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class ProgramEnrollmentToolStudent(Document):
- pass
diff --git a/erpnext/education/doctype/program_fee/__init__.py b/erpnext/education/doctype/program_fee/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/program_fee/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/program_fee/program_fee.json b/erpnext/education/doctype/program_fee/program_fee.json
deleted file mode 100644
index d45e4bd..0000000
--- a/erpnext/education/doctype/program_fee/program_fee.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-05-19 05:52:56.322125",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Academic Term",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Term",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "fee_structure",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Fee Structure",
- "length": 0,
- "no_copy": 0,
- "options": "Fee Structure",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_category",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student Category",
- "length": 0,
- "no_copy": 0,
- "options": "Student Category",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_3",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "due_date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Due Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "amount",
- "fieldtype": "Currency",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Amount",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2017-11-10 19:07:10.426335",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Fee",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/program_fee/program_fee.py b/erpnext/education/doctype/program_fee/program_fee.py
deleted file mode 100644
index e9a0be1..0000000
--- a/erpnext/education/doctype/program_fee/program_fee.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class ProgramFee(Document):
- pass
diff --git a/erpnext/education/doctype/question/__init__.py b/erpnext/education/doctype/question/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/question/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/question/question.js b/erpnext/education/doctype/question/question.js
deleted file mode 100644
index 01b3091..0000000
--- a/erpnext/education/doctype/question/question.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Question', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/question/question.json b/erpnext/education/doctype/question/question.json
deleted file mode 100644
index e396760..0000000
--- a/erpnext/education/doctype/question/question.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
- "allow_import": 1,
- "autoname": "format:QUESTION-{#####}",
- "creation": "2018-10-01 15:58:00.696815",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "question",
- "options",
- "question_type"
- ],
- "fields": [
- {
- "fieldname": "question",
- "fieldtype": "Text Editor",
- "in_list_view": 1,
- "label": "Question",
- "reqd": 1
- },
- {
- "fieldname": "options",
- "fieldtype": "Table",
- "label": "Options",
- "options": "Options",
- "reqd": 1
- },
- {
- "fieldname": "question_type",
- "fieldtype": "Select",
- "in_standard_filter": 1,
- "label": "Type",
- "options": "\nSingle Correct Answer\nMultiple Correct Answer",
- "read_only": 1
- }
- ],
- "modified": "2020-09-24 18:39:21.880974",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Question",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "share": 1,
- "write": 1
- },
- {
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "LMS User",
- "share": 1
- }
- ],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC"
-}
diff --git a/erpnext/education/doctype/question/question.py b/erpnext/education/doctype/question/question.py
deleted file mode 100644
index 99910b3..0000000
--- a/erpnext/education/doctype/question/question.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class Question(Document):
- def validate(self):
- self.check_at_least_one_option()
- self.check_minimum_one_correct_answer()
- self.set_question_type()
-
- def check_at_least_one_option(self):
- if len(self.options) <= 1:
- frappe.throw(_("A question must have more than one options"))
- else:
- pass
-
- def check_minimum_one_correct_answer(self):
- correct_options = [option.is_correct for option in self.options]
- if bool(sum(correct_options)):
- pass
- else:
- frappe.throw(_("A qustion must have at least one correct options"))
-
- def set_question_type(self):
- correct_options = [option for option in self.options if option.is_correct]
- if len(correct_options) > 1:
- self.question_type = "Multiple Correct Answer"
- else:
- self.question_type = "Single Correct Answer"
-
- def get_answer(self):
- options = self.options
- answers = [item.name for item in options if item.is_correct == True]
- if len(answers) == 0:
- frappe.throw(_("No correct answer is set for {0}").format(self.name))
- return None
- elif len(answers) == 1:
- return answers[0]
- else:
- return answers
diff --git a/erpnext/education/doctype/question/test_question.py b/erpnext/education/doctype/question/test_question.py
deleted file mode 100644
index 7506d84..0000000
--- a/erpnext/education/doctype/question/test_question.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestQuestion(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/quiz/__init__.py b/erpnext/education/doctype/quiz/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/quiz/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/quiz/quiz.js b/erpnext/education/doctype/quiz/quiz.js
deleted file mode 100644
index 320869b..0000000
--- a/erpnext/education/doctype/quiz/quiz.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Quiz', {
- refresh: function(frm) {
- if (!frm.doc.__islocal) {
- frm.add_custom_button(__('Add to Topics'), function() {
- frm.trigger('add_quiz_to_topics');
- }, __('Action'));
- }
- },
-
- validate: function(frm){
- frm.events.check_duplicate_question(frm.doc.question);
- },
-
- check_duplicate_question: function(questions_data){
- var questions = [];
- questions_data.forEach(function(q){
- questions.push(q.question_link);
- });
- var questions_set = new Set(questions);
- if (questions.length != questions_set.size) {
- frappe.throw(__('The question cannot be duplicate'));
- }
- },
-
- add_quiz_to_topics: function(frm) {
- get_topics_without_quiz(frm.doc.name).then(r => {
- if (r.message.length) {
- frappe.prompt([
- {
- fieldname: 'topics',
- label: __('Topics'),
- fieldtype: 'MultiSelectPills',
- get_data: function() {
- return r.message;
- }
- }
- ],
- function(data) {
- frappe.call({
- method: 'erpnext.education.doctype.topic.topic.add_content_to_topics',
- args: {
- 'content_type': 'Quiz',
- 'content': frm.doc.name,
- 'topics': data.topics,
- },
- callback: function(r) {
- if (!r.exc) {
- frm.reload_doc();
- }
- },
- freeze: true,
- freeze_message: __('...Adding Quiz to Topics')
- });
- }, __('Add Quiz to Topics'), __('Add'));
- } else {
- frappe.msgprint(__('This quiz is already added to the existing topics'));
- }
- });
- }
-});
-
-let get_topics_without_quiz = function(quiz) {
- return frappe.call({
- type: 'GET',
- method: 'erpnext.education.doctype.quiz.quiz.get_topics_without_quiz',
- args: {'quiz': quiz}
- });
-};
diff --git a/erpnext/education/doctype/quiz/quiz.json b/erpnext/education/doctype/quiz/quiz.json
deleted file mode 100644
index 16d7d7e..0000000
--- a/erpnext/education/doctype/quiz/quiz.json
+++ /dev/null
@@ -1,128 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:title",
- "creation": "2018-10-17 05:52:50.149904",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "title",
- "question",
- "quiz_configuration_section",
- "passing_score",
- "max_attempts",
- "grading_basis",
- "column_break_7",
- "is_time_bound",
- "duration"
- ],
- "fields": [
- {
- "fieldname": "title",
- "fieldtype": "Data",
- "label": "Title",
- "reqd": 1,
- "unique": 1
- },
- {
- "fieldname": "question",
- "fieldtype": "Table",
- "label": "Question",
- "options": "Quiz Question",
- "reqd": 1
- },
- {
- "fieldname": "quiz_configuration_section",
- "fieldtype": "Section Break",
- "label": "Quiz Configuration"
- },
- {
- "default": "75",
- "description": "Score out of 100",
- "fieldname": "passing_score",
- "fieldtype": "Float",
- "in_list_view": 1,
- "label": "Passing Score",
- "reqd": 1
- },
- {
- "default": "1",
- "description": "Enter 0 to waive limit",
- "fieldname": "max_attempts",
- "fieldtype": "Int",
- "in_list_view": 1,
- "label": "Max Attempts",
- "reqd": 1
- },
- {
- "default": "Latest Highest Score",
- "fieldname": "grading_basis",
- "fieldtype": "Select",
- "label": "Grading Basis",
- "options": "Latest Highest Score\nLatest Attempt"
- },
- {
- "default": "0",
- "fieldname": "is_time_bound",
- "fieldtype": "Check",
- "label": "Is Time-Bound"
- },
- {
- "depends_on": "is_time_bound",
- "fieldname": "duration",
- "fieldtype": "Duration",
- "label": "Duration"
- },
- {
- "fieldname": "column_break_7",
- "fieldtype": "Column Break"
- }
- ],
- "links": [],
- "modified": "2020-12-24 15:41:35.043262",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Quiz",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "LMS User",
- "share": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "share": 1,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/quiz/quiz.py b/erpnext/education/doctype/quiz/quiz.py
deleted file mode 100644
index 7a9cdf3..0000000
--- a/erpnext/education/doctype/quiz/quiz.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class Quiz(Document):
- def validate(self):
- if self.passing_score > 100:
- frappe.throw(_("Passing Score value should be between 0 and 100"))
-
- def allowed_attempt(self, enrollment, quiz_name):
- if self.max_attempts == 0:
- return True
-
- try:
- if (
- len(frappe.get_all("Quiz Activity", {"enrollment": enrollment.name, "quiz": quiz_name}))
- >= self.max_attempts
- ):
- frappe.msgprint(_("Maximum attempts for this quiz reached!"))
- return False
- else:
- return True
- except Exception as e:
- return False
-
- def evaluate(self, response_dict, quiz_name):
- questions = [frappe.get_doc("Question", question.question_link) for question in self.question]
- answers = {q.name: q.get_answer() for q in questions}
- result = {}
- for key in answers:
- try:
- if isinstance(response_dict[key], list):
- is_correct = compare_list_elementwise(response_dict[key], answers[key])
- else:
- is_correct = response_dict[key] == answers[key]
- except Exception as e:
- is_correct = False
- result[key] = is_correct
- score = (sum(result.values()) * 100) / len(answers)
- if score >= self.passing_score:
- status = "Pass"
- else:
- status = "Fail"
- return result, score, status
-
- def get_questions(self):
- return [frappe.get_doc("Question", question.question_link) for question in self.question]
-
-
-def compare_list_elementwise(*args):
- try:
- if all(len(args[0]) == len(_arg) for _arg in args[1:]):
- return all(all([element in (item) for element in args[0]]) for item in args[1:])
- else:
- return False
- except TypeError:
- frappe.throw(_("Compare List function takes on list arguments"))
-
-
-@frappe.whitelist()
-def get_topics_without_quiz(quiz):
- data = []
- for entry in frappe.db.get_all("Topic"):
- topic = frappe.get_doc("Topic", entry.name)
- topic_contents = [tc.content for tc in topic.topic_content]
- if not topic_contents or quiz not in topic_contents:
- data.append(topic.name)
- return data
diff --git a/erpnext/education/doctype/quiz/test_quiz.py b/erpnext/education/doctype/quiz/test_quiz.py
deleted file mode 100644
index a69a0c1..0000000
--- a/erpnext/education/doctype/quiz/test_quiz.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestQuiz(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/quiz_activity/__init__.py b/erpnext/education/doctype/quiz_activity/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/quiz_activity/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/quiz_activity/quiz_activity.js b/erpnext/education/doctype/quiz_activity/quiz_activity.js
deleted file mode 100644
index f6ba12c..0000000
--- a/erpnext/education/doctype/quiz_activity/quiz_activity.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Quiz Activity', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/quiz_activity/quiz_activity.json b/erpnext/education/doctype/quiz_activity/quiz_activity.json
deleted file mode 100644
index 742c887..0000000
--- a/erpnext/education/doctype/quiz_activity/quiz_activity.json
+++ /dev/null
@@ -1,163 +0,0 @@
-{
- "actions": [],
- "autoname": "format:EDU-QA-{YYYY}-{#####}",
- "beta": 1,
- "creation": "2018-10-15 15:48:40.482821",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "enrollment",
- "student",
- "column_break_3",
- "course",
- "section_break_5",
- "quiz",
- "column_break_7",
- "status",
- "section_break_9",
- "result",
- "section_break_11",
- "activity_date",
- "score",
- "column_break_14",
- "time_taken"
- ],
- "fields": [
- {
- "fieldname": "enrollment",
- "fieldtype": "Link",
- "label": "Enrollment",
- "options": "Course Enrollment",
- "set_only_once": 1
- },
- {
- "fetch_from": "enrollment.student",
- "fieldname": "student",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Student",
- "options": "Student",
- "read_only": 1
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fetch_from": "enrollment.course",
- "fieldname": "course",
- "fieldtype": "Link",
- "label": "Course",
- "options": "Course",
- "read_only": 1,
- "set_only_once": 1
- },
- {
- "fieldname": "section_break_5",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "quiz",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Quiz",
- "options": "Quiz",
- "set_only_once": 1
- },
- {
- "fieldname": "column_break_7",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "status",
- "fieldtype": "Select",
- "label": "Status",
- "options": "\nPass\nFail",
- "read_only": 1
- },
- {
- "fieldname": "section_break_9",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "result",
- "fieldtype": "Table",
- "label": "Result",
- "options": "Quiz Result",
- "set_only_once": 1
- },
- {
- "fieldname": "activity_date",
- "fieldtype": "Data",
- "label": "Activity Date",
- "set_only_once": 1
- },
- {
- "fieldname": "score",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Score",
- "set_only_once": 1
- },
- {
- "fieldname": "time_taken",
- "fieldtype": "Duration",
- "label": "Time Taken",
- "set_only_once": 1
- },
- {
- "fieldname": "section_break_11",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "column_break_14",
- "fieldtype": "Column Break"
- }
- ],
- "links": [],
- "modified": "2020-12-24 15:41:20.085380",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Quiz Activity",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "LMS User",
- "share": 1,
- "write": 1
- },
- {
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "share": 1
- }
- ],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/quiz_activity/quiz_activity.py b/erpnext/education/doctype/quiz_activity/quiz_activity.py
deleted file mode 100644
index a67f82f..0000000
--- a/erpnext/education/doctype/quiz_activity/quiz_activity.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class QuizActivity(Document):
- pass
diff --git a/erpnext/education/doctype/quiz_activity/test_quiz_activity.py b/erpnext/education/doctype/quiz_activity/test_quiz_activity.py
deleted file mode 100644
index 1040c1a..0000000
--- a/erpnext/education/doctype/quiz_activity/test_quiz_activity.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestQuizActivity(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/quiz_question/__init__.py b/erpnext/education/doctype/quiz_question/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/quiz_question/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/quiz_question/quiz_question.json b/erpnext/education/doctype/quiz_question/quiz_question.json
deleted file mode 100644
index aab07a3..0000000
--- a/erpnext/education/doctype/quiz_question/quiz_question.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "allow_rename": 1,
- "creation": "2018-10-17 06:13:00.098883",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "question_link",
- "question"
- ],
- "fields": [
- {
- "fieldname": "question_link",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Question Link",
- "options": "Question",
- "reqd": 1
- },
- {
- "fetch_from": "question_link.question",
- "fieldname": "question",
- "fieldtype": "Text Editor",
- "in_list_view": 1,
- "label": "Question",
- "read_only": 1
- }
- ],
- "istable": 1,
- "modified": "2020-09-24 12:24:02.312577",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Quiz Question",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
diff --git a/erpnext/education/doctype/quiz_question/quiz_question.py b/erpnext/education/doctype/quiz_question/quiz_question.py
deleted file mode 100644
index 91641eb..0000000
--- a/erpnext/education/doctype/quiz_question/quiz_question.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class QuizQuestion(Document):
- pass
diff --git a/erpnext/education/doctype/quiz_result/__init__.py b/erpnext/education/doctype/quiz_result/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/quiz_result/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/quiz_result/quiz_result.js b/erpnext/education/doctype/quiz_result/quiz_result.js
deleted file mode 100644
index a018749..0000000
--- a/erpnext/education/doctype/quiz_result/quiz_result.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Quiz Result', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/quiz_result/quiz_result.json b/erpnext/education/doctype/quiz_result/quiz_result.json
deleted file mode 100644
index 67c7e2d..0000000
--- a/erpnext/education/doctype/quiz_result/quiz_result.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "creation": "2018-10-15 15:52:25.766374",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "question",
- "selected_option",
- "quiz_result"
- ],
- "fields": [
- {
- "fieldname": "question",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Question",
- "options": "Question",
- "read_only": 1,
- "reqd": 1,
- "set_only_once": 1
- },
- {
- "fieldname": "selected_option",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Selected Option",
- "read_only": 1,
- "set_only_once": 1
- },
- {
- "fieldname": "quiz_result",
- "fieldtype": "Select",
- "in_list_view": 1,
- "label": "Result",
- "options": "\nCorrect\nWrong",
- "read_only": 1,
- "reqd": 1,
- "set_only_once": 1
- }
- ],
- "istable": 1,
- "modified": "2019-06-03 12:52:32.267392",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Quiz Result",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/quiz_result/quiz_result.py b/erpnext/education/doctype/quiz_result/quiz_result.py
deleted file mode 100644
index 615281b..0000000
--- a/erpnext/education/doctype/quiz_result/quiz_result.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class QuizResult(Document):
- pass
diff --git a/erpnext/education/doctype/quiz_result/test_quiz_result.py b/erpnext/education/doctype/quiz_result/test_quiz_result.py
deleted file mode 100644
index 12098a7..0000000
--- a/erpnext/education/doctype/quiz_result/test_quiz_result.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestQuizResult(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/room/__init__.py b/erpnext/education/doctype/room/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/room/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/room/room.js b/erpnext/education/doctype/room/room.js
deleted file mode 100644
index 1263b60..0000000
--- a/erpnext/education/doctype/room/room.js
+++ /dev/null
@@ -1,2 +0,0 @@
-frappe.ui.form.on("Room", {
-});
diff --git a/erpnext/education/doctype/room/room.json b/erpnext/education/doctype/room/room.json
deleted file mode 100644
index 888a0fa..0000000
--- a/erpnext/education/doctype/room/room.json
+++ /dev/null
@@ -1,161 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 0,
- "autoname": "HTL-ROOM-.YYYY.-.#####",
- "beta": 0,
- "creation": "2015-09-09 16:20:14.613061",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 0,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "room_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Room Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "room_number",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Room Number",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "seating_capacity",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Seating Capacity",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "menu_index": 0,
- "modified": "2018-08-21 16:15:46.096492",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Room",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "room_name",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/room/room.py b/erpnext/education/doctype/room/room.py
deleted file mode 100644
index a2a8980..0000000
--- a/erpnext/education/doctype/room/room.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class Room(Document):
- pass
diff --git a/erpnext/education/doctype/room/room_dashboard.py b/erpnext/education/doctype/room/room_dashboard.py
deleted file mode 100644
index dfc295c..0000000
--- a/erpnext/education/doctype/room/room_dashboard.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "room",
- "transactions": [
- {"label": _("Course"), "items": ["Course Schedule"]},
- {"label": _("Assessment"), "items": ["Assessment Plan"]},
- ],
- }
diff --git a/erpnext/education/doctype/room/test_records.json b/erpnext/education/doctype/room/test_records.json
deleted file mode 100644
index 6edf076..0000000
--- a/erpnext/education/doctype/room/test_records.json
+++ /dev/null
@@ -1,17 +0,0 @@
-[
- {
- "room_name": "_Test Room",
- "room_number": "1001",
- "seating_capacity": 100
- },
- {
- "room_name": "_Test Room 1",
- "room_number": "1002",
- "seating_capacity": 100
- },
- {
- "room_name": "_Test Room 2",
- "room_number": "1003",
- "seating_capacity": 100
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/room/test_room.py b/erpnext/education/doctype/room/test_room.py
deleted file mode 100644
index ea0baf2..0000000
--- a/erpnext/education/doctype/room/test_room.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Room')
-
-
-class TestRoom(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/school_house/__init__.py b/erpnext/education/doctype/school_house/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/school_house/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/school_house/school_house.js b/erpnext/education/doctype/school_house/school_house.js
deleted file mode 100644
index cf1dcd4..0000000
--- a/erpnext/education/doctype/school_house/school_house.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('School House', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/school_house/school_house.json b/erpnext/education/doctype/school_house/school_house.json
deleted file mode 100644
index 8a653a9..0000000
--- a/erpnext/education/doctype/school_house/school_house.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "field:house_name",
- "beta": 0,
- "creation": "2017-03-27 15:19:54.672995",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "house_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "House Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-11-10 19:05:06.419022",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "School House",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/school_house/school_house.py b/erpnext/education/doctype/school_house/school_house.py
deleted file mode 100644
index 52e0508..0000000
--- a/erpnext/education/doctype/school_house/school_house.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class SchoolHouse(Document):
- pass
diff --git a/erpnext/education/doctype/school_house/test_school_house.py b/erpnext/education/doctype/school_house/test_school_house.py
deleted file mode 100644
index 7fe12d7..0000000
--- a/erpnext/education/doctype/school_house/test_school_house.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestSchoolHouse(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student/__init__.py b/erpnext/education/doctype/student/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student/student.js b/erpnext/education/doctype/student/student.js
deleted file mode 100644
index aead556..0000000
--- a/erpnext/education/doctype/student/student.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Student', {
- setup: function(frm) {
- frm.add_fetch('guardian', 'guardian_name', 'guardian_name');
- frm.add_fetch('student', 'title', 'full_name');
- frm.add_fetch('student', 'gender', 'gender');
- frm.add_fetch('student', 'date_of_birth', 'date_of_birth');
-
- frm.set_query('student', 'siblings', function(doc) {
- return {
- 'filters': {
- 'name': ['!=', doc.name]
- }
- };
- })
- },
- refresh: function(frm) {
- if(!frm.is_new()) {
-
- // custom buttons
- frm.add_custom_button(__('Accounting Ledger'), function() {
- frappe.set_route('query-report', 'General Ledger',
- {party_type:'Student', party:frm.doc.name});
- });
- }
-
- frappe.db.get_value('Education Settings', {name: 'Education Settings'}, 'user_creation_skip', (r) => {
- if (cint(r.user_creation_skip) !== 1) {
- frm.set_df_property('student_email_id', 'reqd', 1);
- }
- });
- }
-});
-
-frappe.ui.form.on('Student Guardian', {
- guardians_add: function(frm){
- frm.fields_dict['guardians'].grid.get_field('guardian').get_query = function(doc){
- let guardian_list = [];
- if(!doc.__islocal) guardian_list.push(doc.guardian);
- $.each(doc.guardians, function(idx, val){
- if (val.guardian) guardian_list.push(val.guardian);
- });
- return { filters: [['Guardian', 'name', 'not in', guardian_list]] };
- };
- }
-});
-
-
-frappe.ui.form.on('Student Sibling', {
- siblings_add: function(frm){
- frm.fields_dict['siblings'].grid.get_field('student').get_query = function(doc){
- let sibling_list = [frm.doc.name];
- $.each(doc.siblings, function(idx, val){
- if (val.student && val.studying_in_same_institute == 'YES') {
- sibling_list.push(val.student);
- }
- });
- return { filters: [['Student', 'name', 'not in', sibling_list]] };
- };
- }
-});
diff --git a/erpnext/education/doctype/student/student.json b/erpnext/education/doctype/student/student.json
deleted file mode 100644
index 8ba9a7f..0000000
--- a/erpnext/education/doctype/student/student.json
+++ /dev/null
@@ -1,304 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "naming_series:",
- "creation": "2015-09-07 13:00:55.938280",
- "doctype": "DocType",
- "document_type": "Document",
- "engine": "InnoDB",
- "field_order": [
- "section_break_1",
- "enabled",
- "section_break_3",
- "first_name",
- "middle_name",
- "last_name",
- "user",
- "column_break_4",
- "naming_series",
- "student_email_id",
- "student_mobile_number",
- "joining_date",
- "image",
- "section_break_7",
- "date_of_birth",
- "blood_group",
- "column_break_3",
- "gender",
- "nationality",
- "student_applicant",
- "section_break_22",
- "address_line_1",
- "address_line_2",
- "pincode",
- "column_break_20",
- "city",
- "state",
- "section_break_18",
- "guardians",
- "section_break_20",
- "siblings",
- "exit",
- "date_of_leaving",
- "leaving_certificate_number",
- "column_break_31",
- "reason_for_leaving",
- "title"
- ],
- "fields": [
- {
- "fieldname": "section_break_1",
- "fieldtype": "Section Break"
- },
- {
- "default": "1",
- "fieldname": "enabled",
- "fieldtype": "Check",
- "label": "Enabled"
- },
- {
- "fieldname": "section_break_3",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "first_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "First Name",
- "reqd": 1
- },
- {
- "fieldname": "middle_name",
- "fieldtype": "Data",
- "label": "Middle Name"
- },
- {
- "fieldname": "last_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Last Name"
- },
- {
- "fieldname": "user",
- "fieldtype": "Link",
- "label": "User ID",
- "options": "User"
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Naming Series",
- "no_copy": 1,
- "options": "EDU-STU-.YYYY.-",
- "set_only_once": 1
- },
- {
- "fieldname": "student_email_id",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Student Email Address",
- "unique": 1
- },
- {
- "fieldname": "student_mobile_number",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Student Mobile Number"
- },
- {
- "default": "Today",
- "fieldname": "joining_date",
- "fieldtype": "Date",
- "in_list_view": 1,
- "label": "Joining Date"
- },
- {
- "fieldname": "image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "label": "Image",
- "width": "10"
- },
- {
- "fieldname": "section_break_7",
- "fieldtype": "Section Break",
- "label": "Personal Details"
- },
- {
- "fieldname": "date_of_birth",
- "fieldtype": "Date",
- "label": "Date of Birth"
- },
- {
- "fieldname": "blood_group",
- "fieldtype": "Select",
- "label": "Blood Group",
- "options": "\nA+\nA-\nB+\nB-\nO+\nO-\nAB+\nAB-"
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "gender",
- "fieldtype": "Link",
- "label": "Gender",
- "options": "Gender"
- },
- {
- "fieldname": "nationality",
- "fieldtype": "Data",
- "label": "Nationality"
- },
- {
- "fieldname": "student_applicant",
- "fieldtype": "Link",
- "label": "Student Applicant",
- "options": "Student Applicant",
- "read_only": 1
- },
- {
- "fieldname": "section_break_22",
- "fieldtype": "Section Break",
- "label": "Home Address"
- },
- {
- "fieldname": "address_line_1",
- "fieldtype": "Data",
- "label": "Address Line 1"
- },
- {
- "fieldname": "address_line_2",
- "fieldtype": "Data",
- "label": "Address Line 2"
- },
- {
- "fieldname": "pincode",
- "fieldtype": "Data",
- "label": "Pincode"
- },
- {
- "fieldname": "column_break_20",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "city",
- "fieldtype": "Data",
- "label": "City"
- },
- {
- "fieldname": "state",
- "fieldtype": "Data",
- "label": "State"
- },
- {
- "fieldname": "section_break_18",
- "fieldtype": "Section Break",
- "label": "Guardian Details"
- },
- {
- "fieldname": "guardians",
- "fieldtype": "Table",
- "label": "Guardians",
- "options": "Student Guardian"
- },
- {
- "collapsible": 1,
- "fieldname": "section_break_20",
- "fieldtype": "Section Break",
- "label": "Sibling Details",
- "options": "Country"
- },
- {
- "fieldname": "siblings",
- "fieldtype": "Table",
- "label": "Siblings",
- "options": "Student Sibling"
- },
- {
- "collapsible": 1,
- "fieldname": "exit",
- "fieldtype": "Section Break",
- "label": "Exit"
- },
- {
- "fieldname": "date_of_leaving",
- "fieldtype": "Date",
- "label": "Date of Leaving"
- },
- {
- "fieldname": "leaving_certificate_number",
- "fieldtype": "Data",
- "label": "Leaving Certificate Number"
- },
- {
- "fieldname": "column_break_31",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "reason_for_leaving",
- "fieldtype": "Text",
- "label": "Reason For Leaving"
- },
- {
- "fieldname": "title",
- "fieldtype": "Data",
- "hidden": 1,
- "label": "Title"
- }
- ],
- "image_field": "image",
- "links": [],
- "modified": "2020-09-07 19:28:08.914568",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student",
- "owner": "Administrator",
- "permissions": [
- {
- "read": 1,
- "role": "Instructor"
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "import": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- },
- {
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Student",
- "share": 1
- },
- {
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "LMS User",
- "share": 1
- }
- ],
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "title"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student/student.py b/erpnext/education/doctype/student/student.py
deleted file mode 100644
index 712d742..0000000
--- a/erpnext/education/doctype/student/student.py
+++ /dev/null
@@ -1,223 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.desk.form.linked_with import get_linked_doctypes
-from frappe.model.document import Document
-from frappe.utils import getdate, today
-
-from erpnext.education.utils import check_content_completion, check_quiz_completion
-
-
-class Student(Document):
- def validate(self):
- self.title = " ".join(filter(None, [self.first_name, self.middle_name, self.last_name]))
- self.validate_dates()
-
- if self.student_applicant:
- self.check_unique()
- self.update_applicant_status()
-
- if frappe.get_value("Student", self.name, "title") != self.title:
- self.update_student_name_in_linked_doctype()
-
- def validate_dates(self):
- for sibling in self.siblings:
- if sibling.date_of_birth and getdate(sibling.date_of_birth) > getdate():
- frappe.throw(
- _("Row {0}:Sibling Date of Birth cannot be greater than today.").format(sibling.idx)
- )
-
- if self.date_of_birth and getdate(self.date_of_birth) >= getdate(today()):
- frappe.throw(_("Date of Birth cannot be greater than today."))
-
- if self.date_of_birth and getdate(self.date_of_birth) >= getdate(self.joining_date):
- frappe.throw(_("Date of Birth cannot be greater than Joining Date."))
-
- if (
- self.joining_date
- and self.date_of_leaving
- and getdate(self.joining_date) > getdate(self.date_of_leaving)
- ):
- frappe.throw(_("Joining Date can not be greater than Leaving Date"))
-
- def update_student_name_in_linked_doctype(self):
- linked_doctypes = get_linked_doctypes("Student")
- for d in linked_doctypes:
- meta = frappe.get_meta(d)
- if not meta.issingle:
- if "student_name" in [f.fieldname for f in meta.fields]:
- frappe.db.sql(
- """UPDATE `tab{0}` set student_name = %s where {1} = %s""".format(
- d, linked_doctypes[d]["fieldname"][0]
- ),
- (self.title, self.name),
- )
-
- if "child_doctype" in linked_doctypes[d].keys() and "student_name" in [
- f.fieldname for f in frappe.get_meta(linked_doctypes[d]["child_doctype"]).fields
- ]:
- frappe.db.sql(
- """UPDATE `tab{0}` set student_name = %s where {1} = %s""".format(
- linked_doctypes[d]["child_doctype"], linked_doctypes[d]["fieldname"][0]
- ),
- (self.title, self.name),
- )
-
- def check_unique(self):
- """Validates if the Student Applicant is Unique"""
- student = frappe.db.sql(
- "select name from `tabStudent` where student_applicant=%s and name!=%s",
- (self.student_applicant, self.name),
- )
- if student:
- frappe.throw(
- _("Student {0} exist against student applicant {1}").format(
- student[0][0], self.student_applicant
- )
- )
-
- def after_insert(self):
- if not frappe.get_single("Education Settings").get("user_creation_skip"):
- self.create_student_user()
-
- def create_student_user(self):
- """Create a website user for student creation if not already exists"""
- if not frappe.db.exists("User", self.student_email_id):
- student_user = frappe.get_doc(
- {
- "doctype": "User",
- "first_name": self.first_name,
- "last_name": self.last_name,
- "email": self.student_email_id,
- "gender": self.gender,
- "send_welcome_email": 1,
- "user_type": "Website User",
- }
- )
- student_user.flags.ignore_permissions = True
- student_user.add_roles("Student")
- student_user.save()
-
- def update_applicant_status(self):
- """Updates Student Applicant status to Admitted"""
- if self.student_applicant:
- frappe.db.set_value(
- "Student Applicant", self.student_applicant, "application_status", "Admitted"
- )
-
- def get_all_course_enrollments(self):
- """Returns a list of course enrollments linked with the current student"""
- course_enrollments = frappe.get_all(
- "Course Enrollment", filters={"student": self.name}, fields=["course", "name"]
- )
- if not course_enrollments:
- return None
- else:
- enrollments = {item["course"]: item["name"] for item in course_enrollments}
- return enrollments
-
- def get_program_enrollments(self):
- """Returns a list of course enrollments linked with the current student"""
- program_enrollments = frappe.get_all(
- "Program Enrollment", filters={"student": self.name}, fields=["program"]
- )
- if not program_enrollments:
- return None
- else:
- enrollments = [item["program"] for item in program_enrollments]
- return enrollments
-
- def get_topic_progress(self, course_enrollment_name, topic):
- """
- Get Progress Dictionary of a student for a particular topic
- :param self: Student Object
- :param course_enrollment_name: Name of the Course Enrollment
- :param topic: Topic DocType Object
- """
- contents = topic.get_contents()
- progress = []
- if contents:
- for content in contents:
- if content.doctype in ("Article", "Video"):
- status = check_content_completion(content.name, content.doctype, course_enrollment_name)
- progress.append(
- {"content": content.name, "content_type": content.doctype, "is_complete": status}
- )
- elif content.doctype == "Quiz":
- status, score, result, time_taken = check_quiz_completion(content, course_enrollment_name)
- progress.append(
- {
- "content": content.name,
- "content_type": content.doctype,
- "is_complete": status,
- "score": score,
- "result": result,
- }
- )
- return progress
-
- def enroll_in_program(self, program_name):
- try:
- enrollment = frappe.get_doc(
- {
- "doctype": "Program Enrollment",
- "student": self.name,
- "academic_year": frappe.get_last_doc("Academic Year").name,
- "program": program_name,
- "enrollment_date": frappe.utils.datetime.datetime.now(),
- }
- )
- enrollment.save(ignore_permissions=True)
- except frappe.exceptions.ValidationError:
- enrollment_name = frappe.get_list(
- "Program Enrollment", filters={"student": self.name, "Program": program_name}
- )[0].name
- return frappe.get_doc("Program Enrollment", enrollment_name)
- else:
- enrollment.submit()
- return enrollment
-
- def enroll_in_course(self, course_name, program_enrollment, enrollment_date=None):
- if enrollment_date is None:
- enrollment_date = frappe.utils.datetime.datetime.now()
- try:
- enrollment = frappe.get_doc(
- {
- "doctype": "Course Enrollment",
- "student": self.name,
- "course": course_name,
- "program_enrollment": program_enrollment,
- "enrollment_date": enrollment_date,
- }
- )
- enrollment.save(ignore_permissions=True)
- except frappe.exceptions.ValidationError:
- enrollment_name = frappe.get_list(
- "Course Enrollment",
- filters={
- "student": self.name,
- "course": course_name,
- "program_enrollment": program_enrollment,
- },
- )[0].name
- return frappe.get_doc("Course Enrollment", enrollment_name)
- else:
- return enrollment
-
-
-def get_timeline_data(doctype, name):
- """Return timeline for attendance"""
- return dict(
- frappe.db.sql(
- """select unix_timestamp(`date`), count(*)
- from `tabStudent Attendance` where
- student=%s
- and `date` > date_sub(curdate(), interval 1 year)
- and docstatus = 1 and status = 'Present'
- group by date""",
- name,
- )
- )
diff --git a/erpnext/education/doctype/student/student_dashboard.py b/erpnext/education/doctype/student/student_dashboard.py
deleted file mode 100644
index bcc8521..0000000
--- a/erpnext/education/doctype/student/student_dashboard.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return {
- "heatmap": True,
- "heatmap_message": _("This is based on the attendance of this Student"),
- "fieldname": "student",
- "non_standard_fieldnames": {"Bank Account": "party"},
- "transactions": [
- {"label": _("Admission"), "items": ["Program Enrollment", "Course Enrollment"]},
- {
- "label": _("Student Activity"),
- "items": [
- "Student Log",
- "Student Group",
- ],
- },
- {"label": _("Assessment"), "items": ["Assessment Result"]},
- {"label": _("Student LMS Activity"), "items": ["Course Activity", "Quiz Activity"]},
- {"label": _("Attendance"), "items": ["Student Attendance", "Student Leave Application"]},
- {"label": _("Fee"), "items": ["Fees", "Bank Account"]},
- ],
- }
diff --git a/erpnext/education/doctype/student/student_list.js b/erpnext/education/doctype/student/student_list.js
deleted file mode 100644
index c1bce24..0000000
--- a/erpnext/education/doctype/student/student_list.js
+++ /dev/null
@@ -1,3 +0,0 @@
-frappe.listview_settings['Student'] = {
- add_fields: [ "image"]
-}
diff --git a/erpnext/education/doctype/student/test_records.json b/erpnext/education/doctype/student/test_records.json
deleted file mode 100644
index 8ad3afa..0000000
--- a/erpnext/education/doctype/student/test_records.json
+++ /dev/null
@@ -1,35 +0,0 @@
-[
- {
- "first_name": "_Test",
- "middle_name": "Student",
- "last_name": "Name",
- "program": "TC101",
- "date_of_birth": "2000-01-01",
- "gender": "Male",
- "student_email_id": "_test_student@example.com",
- "blood_group": "A+"
-
- },
- {
- "first_name": "_Test",
- "middle_name": "Student",
- "last_name": "Name 1",
- "program": "TC101",
- "date_of_birth": "2000-01-01",
- "gender": "Male",
- "student_email_id": "_test_student_1@example.com",
- "blood_group": "A+"
-
- },
- {
- "first_name": "_Test",
- "middle_name": "Student",
- "last_name": "Name 2",
- "program": "TC101",
- "date_of_birth": "2000-01-01",
- "gender": "Female",
- "student_email_id": "_test_student_2@example.com",
- "blood_group": "A+"
-
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/student/test_student.py b/erpnext/education/doctype/student/test_student.py
deleted file mode 100644
index 89449b0..0000000
--- a/erpnext/education/doctype/student/test_student.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-
-from erpnext.education.doctype.program.test_program import make_program_and_linked_courses
-
-test_records = frappe.get_test_records("Student")
-
-
-class TestStudent(unittest.TestCase):
- def setUp(self):
- create_student(
- {
- "first_name": "_Test Name",
- "last_name": "_Test Last Name",
- "email": "_test_student@example.com",
- }
- )
- make_program_and_linked_courses("_Test Program 1", ["_Test Course 1", "_Test Course 2"])
-
- def test_create_student_user(self):
- self.assertTrue(bool(frappe.db.exists("User", "_test_student@example.com")))
- frappe.db.rollback()
-
- def test_enroll_in_program(self):
- student = get_student("_test_student@example.com")
- enrollment = student.enroll_in_program("_Test Program 1")
- test_enrollment = frappe.get_all(
- "Program Enrollment", filters={"student": student.name, "Program": "_Test Program 1"}
- )
- self.assertTrue(len(test_enrollment))
- self.assertEqual(test_enrollment[0]["name"], enrollment.name)
- frappe.db.rollback()
-
- def test_get_program_enrollments(self):
- student = get_student("_test_student@example.com")
- enrollment = student.enroll_in_program("_Test Program 1")
- program_enrollments = student.get_program_enrollments()
- self.assertTrue("_Test Program 1" in program_enrollments)
- frappe.db.rollback()
-
- def test_get_all_course_enrollments(self):
- student = get_student("_test_student@example.com")
- enrollment = student.enroll_in_program("_Test Program 1")
- course_enrollments = student.get_all_course_enrollments()
- self.assertTrue("_Test Course 1" in course_enrollments.keys())
- self.assertTrue("_Test Course 2" in course_enrollments.keys())
- frappe.db.rollback()
-
- def tearDown(self):
- for entry in frappe.db.get_all("Course Enrollment"):
- frappe.delete_doc("Course Enrollment", entry.name)
-
- for entry in frappe.db.get_all("Program Enrollment"):
- doc = frappe.get_doc("Program Enrollment", entry.name)
- doc.cancel()
- doc.delete()
-
-
-def create_student(student_dict):
- student = get_student(student_dict["email"])
- if not student:
- student = frappe.get_doc(
- {
- "doctype": "Student",
- "first_name": student_dict["first_name"],
- "last_name": student_dict["last_name"],
- "student_email_id": student_dict["email"],
- }
- ).insert()
- return student
-
-
-def get_student(email):
- try:
- student_id = frappe.get_all("Student", {"student_email_id": email}, ["name"])[0].name
- return frappe.get_doc("Student", student_id)
- except IndexError:
- return None
diff --git a/erpnext/education/doctype/student_admission/__init__.py b/erpnext/education/doctype/student_admission/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_admission/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_admission/student_admission.js b/erpnext/education/doctype/student_admission/student_admission.js
deleted file mode 100644
index 2b62967..0000000
--- a/erpnext/education/doctype/student_admission/student_admission.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Student Admission', {
- program: function(frm) {
- if (frm.doc.academic_year && frm.doc.program) {
- frm.doc.route = frappe.model.scrub(frm.doc.program) + "-" + frappe.model.scrub(frm.doc.academic_year)
- frm.refresh_field("route");
- }
- },
-
- academic_year: function(frm) {
- frm.trigger("program");
- },
-
- admission_end_date: function(frm) {
- if(frm.doc.admission_end_date && frm.doc.admission_end_date <= frm.doc.admission_start_date){
- frm.set_value("admission_end_date", "");
- frappe.throw(__("Admission End Date should be greater than Admission Start Date."));
- }
- }
-});
diff --git a/erpnext/education/doctype/student_admission/student_admission.json b/erpnext/education/doctype/student_admission/student_admission.json
deleted file mode 100644
index 75f2162..0000000
--- a/erpnext/education/doctype/student_admission/student_admission.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "actions": [],
- "allow_guest_to_view": 1,
- "allow_rename": 1,
- "creation": "2016-09-13 03:05:27.154713",
- "doctype": "DocType",
- "document_type": "Document",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "title",
- "route",
- "column_break_3",
- "academic_year",
- "admission_start_date",
- "admission_end_date",
- "published",
- "enable_admission_application",
- "section_break_5",
- "program_details",
- "introduction"
- ],
- "fields": [
- {
- "fieldname": "title",
- "fieldtype": "Data",
- "label": "Title"
- },
- {
- "fieldname": "route",
- "fieldtype": "Data",
- "label": "Route",
- "no_copy": 1,
- "unique": 1
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Academic Year",
- "no_copy": 1,
- "options": "Academic Year",
- "reqd": 1
- },
- {
- "fieldname": "admission_start_date",
- "fieldtype": "Date",
- "label": "Admission Start Date",
- "mandatory_depends_on": "enable_admission_application",
- "no_copy": 1
- },
- {
- "fieldname": "admission_end_date",
- "fieldtype": "Date",
- "label": "Admission End Date",
- "mandatory_depends_on": "enable_admission_application",
- "no_copy": 1
- },
- {
- "default": "0",
- "fieldname": "published",
- "fieldtype": "Check",
- "label": "Publish on website"
- },
- {
- "fieldname": "section_break_5",
- "fieldtype": "Section Break",
- "label": "Eligibility and Details"
- },
- {
- "fieldname": "program_details",
- "fieldtype": "Table",
- "label": "Eligibility and Details",
- "options": "Student Admission Program"
- },
- {
- "fieldname": "introduction",
- "fieldtype": "Text Editor",
- "label": "Introduction"
- },
- {
- "default": "0",
- "depends_on": "published",
- "fieldname": "enable_admission_application",
- "fieldtype": "Check",
- "label": "Enable Admission Application"
- }
- ],
- "has_web_view": 1,
- "is_published_field": "published",
- "links": [],
- "modified": "2020-09-18 00:14:54.615321",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Admission",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "route": "admissions",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "title"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_admission/student_admission.py b/erpnext/education/doctype/student_admission/student_admission.py
deleted file mode 100644
index 6c775f0df..0000000
--- a/erpnext/education/doctype/student_admission/student_admission.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.utils import nowdate
-from frappe.website.website_generator import WebsiteGenerator
-
-
-class StudentAdmission(WebsiteGenerator):
- def autoname(self):
- if not self.title:
- self.title = self.get_title()
- self.name = self.title
-
- def validate(self):
- if not self.route: # pylint: disable=E0203
- self.route = "admissions/" + "-".join(self.title.split(" "))
-
- if self.enable_admission_application and not self.program_details:
- frappe.throw(_("Please add programs to enable admission application."))
-
- def get_context(self, context):
- context.no_cache = 1
- context.show_sidebar = True
- context.title = self.title
- context.parents = [
- {"name": "admissions", "title": _("All Student Admissions"), "route": "admissions"}
- ]
-
- def get_title(self):
- return _("Admissions for {0}").format(self.academic_year)
-
-
-def get_list_context(context=None):
- context.update(
- {
- "show_sidebar": True,
- "title": _("Student Admissions"),
- "get_list": get_admission_list,
- "row_template": "education/doctype/student_admission/templates/student_admission_row.html",
- }
- )
-
-
-def get_admission_list(
- doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"
-):
- return frappe.db.sql(
- """select name, title, academic_year, modified, admission_start_date, route,
- admission_end_date from `tabStudent Admission` where published=1 and admission_end_date >= %s
- order by admission_end_date asc limit {0}, {1}
- """.format(
- limit_start, limit_page_length
- ),
- [nowdate()],
- as_dict=1,
- )
diff --git a/erpnext/education/doctype/student_admission/templates/student_admission.html b/erpnext/education/doctype/student_admission/templates/student_admission.html
deleted file mode 100644
index f9ddac0..0000000
--- a/erpnext/education/doctype/student_admission/templates/student_admission.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-{% extends "templates/web.html" %}
-
-{% block breadcrumbs %}
- {% include "templates/includes/breadcrumbs.html" %}
-{% endblock %}
-
-{% block header %}
-<h1>{{ title }}</h1>
-{% endblock %}
-
-{% block page_content %}
- {% set today = frappe.utils.getdate(frappe.utils.nowdate()) %}
- <div class="row transaction-subheading">
- <div class="col-xs-6">
- <span class="indicator
- {% if frappe.utils.getdate(doc.admission_end_date) == today %}
- red"> Application will be closed soon
- {% elif frappe.utils.getdate(doc.admission_end_date) > today >= frappe.utils.getdate(doc.admission_start_date)%}
- green"> Application open
- {% elif frappe.utils.getdate(doc.admission_start_date) > today %}
- blue"> Application will open
- {% else %}
- gray
- {% endif %}
- </span>
- </div>
- <div class="col-xs-6 text-muted text-right small">
- {{ _("Start on") }}: {{ frappe.format_date(admission_start_date) }}<br>
- {{ _("End on") }}: {{ frappe.format_date(admission_end_date) }}
- </div>
- </div><br>
-
- {%- if introduction -%}
- <div>{{ introduction }}</div>
- {% endif %}
-
- {% if program_details %}
- <br>
- <div class="table-responsive">
- <h3 class="bold">Eligibility and Other Details:</h3>
- <table class="table table-bordered table-hover">
- <thead>
- <tr class="active">
- <th style="width: 90px">Program/Std.</th>
- <th style="width: 180px">Description</th>
- <th style="width: 100px">Minumum Age</th>
- <th style="width: 100px">Maximum Age</th>
- <th style="width: 100px">Application Fee</th>
- {%- if doc.enable_admission_application and frappe.utils.getdate(doc.admission_start_date) <= today -%}
- <th style="width: 120px"></th>
- {% endif %}
- </tr>
- </thead>
- <tbody>
- {% for row in program_details %}
- <tr>
- <td>{{ row.program }}</td>
- <td><div class="text-muted">{{ row.description if row.description else '' }}</div></td>
- <td>{{ row.min_age }}</td>
- <td>{{ row.max_age }}</td>
- <td>{{ row.application_fee }}</td>
- {%- if doc.enable_admission_application and frappe.utils.getdate(doc.admission_start_date) <= today -%}
- <td>
- <a class='btn btn-sm btn-primary' href='/student-applicant?new=1&student_admission={{doc.name}}&program={{row.program}}&academic_year={{academic_year}}'>
- {{ _("Apply Now") }}
- </a>
- </td>
- {% endif %}
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- {% endif %}
-
-{% endblock %}
diff --git a/erpnext/education/doctype/student_admission/templates/student_admission_row.html b/erpnext/education/doctype/student_admission/templates/student_admission_row.html
deleted file mode 100644
index dc4587b..0000000
--- a/erpnext/education/doctype/student_admission/templates/student_admission_row.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<div class="web-list-item transaction-list-item">
- {% set today = frappe.utils.getdate(frappe.utils.nowdate()) %}
- <a href = "{{ doc.route }}" class="no-underline">
- <div class="row">
- <div class="col-sm-4 bold">
- <span class="indicator
- {% if frappe.utils.getdate(doc.admission_end_date) == today %}
- red
- {% elif frappe.utils.getdate(doc.admission_end_date) > today >= frappe.utils.getdate(doc.admission_start_date)%}
- green
- {% elif frappe.utils.getdate(doc.admission_start_date) > today %}
- blue
- {% else %}
- gray
- {% endif %}
- ">{{ doc.title }}</span>
- </div>
- <div class="col-sm-2 small">
- <span class="text-muted">
- Academic Year
- </span>
- <div class="text-muted bold">
- {{ doc.academic_year }}
- </div>
- </div>
- <div class="col-sm-3 small">
- <span class="text-muted">
- Starts on
- </span>
- <div class="text-muted bold">
- {{ frappe.format_date(doc.admission_start_date) }}
- </div>
- </div>
- <div class="col-sm-3 small">
- <span class="text-muted">
- Ends on
- </span>
- <div class=" text-muted bold">
- {{ frappe.format_date(doc.admission_end_date) }}
- </div>
- </div>
- </div>
- </a>
-</div>
diff --git a/erpnext/education/doctype/student_admission/test_student_admission.py b/erpnext/education/doctype/student_admission/test_student_admission.py
deleted file mode 100644
index 82c720a..0000000
--- a/erpnext/education/doctype/student_admission/test_student_admission.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Student Admission')
-
-
-class TestStudentAdmission(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_admission_program/__init__.py b/erpnext/education/doctype/student_admission_program/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_admission_program/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_admission_program/student_admission_program.json b/erpnext/education/doctype/student_admission_program/student_admission_program.json
deleted file mode 100644
index d14b9a4..0000000
--- a/erpnext/education/doctype/student_admission_program/student_admission_program.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "actions": [],
- "creation": "2017-09-15 12:59:43.207923",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "program",
- "min_age",
- "max_age",
- "description",
- "column_break_4",
- "application_fee",
- "applicant_naming_series"
- ],
- "fields": [
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Program",
- "options": "Program"
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "application_fee",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Application Fee"
- },
- {
- "fieldname": "applicant_naming_series",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Naming Series (for Student Applicant)"
- },
- {
- "fieldname": "min_age",
- "fieldtype": "Int",
- "in_list_view": 1,
- "label": "Minimum Age"
- },
- {
- "fieldname": "max_age",
- "fieldtype": "Int",
- "in_list_view": 1,
- "label": "Maximum Age"
- },
- {
- "fetch_from": "program.description",
- "fetch_if_empty": 1,
- "fieldname": "description",
- "fieldtype": "Small Text",
- "label": "Description"
- }
- ],
- "istable": 1,
- "links": [],
- "modified": "2020-10-05 13:03:42.005985",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Admission Program",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_admission_program/student_admission_program.py b/erpnext/education/doctype/student_admission_program/student_admission_program.py
deleted file mode 100644
index eba2239..0000000
--- a/erpnext/education/doctype/student_admission_program/student_admission_program.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentAdmissionProgram(Document):
- pass
diff --git a/erpnext/education/doctype/student_applicant/__init__.py b/erpnext/education/doctype/student_applicant/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_applicant/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_applicant/student_applicant.js b/erpnext/education/doctype/student_applicant/student_applicant.js
deleted file mode 100644
index 7b41a72..0000000
--- a/erpnext/education/doctype/student_applicant/student_applicant.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on("Student Applicant", {
- setup: function(frm) {
- frm.add_fetch("guardian", "guardian_name", "guardian_name");
- },
-
- refresh: function(frm) {
- if (frm.doc.application_status==="Applied" && frm.doc.docstatus===1 ) {
- frm.add_custom_button(__("Approve"), function() {
- frm.set_value("application_status", "Approved");
- frm.save_or_update();
-
- }, 'Actions');
-
- frm.add_custom_button(__("Reject"), function() {
- frm.set_value("application_status", "Rejected");
- frm.save_or_update();
- }, 'Actions');
- }
-
- if (frm.doc.application_status === "Approved" && frm.doc.docstatus === 1) {
- frm.add_custom_button(__("Enroll"), function() {
- frm.events.enroll(frm)
- }).addClass("btn-primary");
-
- frm.add_custom_button(__("Reject"), function() {
- frm.set_value("application_status", "Rejected");
- frm.save_or_update();
- }, 'Actions');
- }
-
- frappe.realtime.on("enroll_student_progress", function(data) {
- if(data.progress) {
- frappe.hide_msgprint(true);
- frappe.show_progress(__("Enrolling student"), data.progress[0],data.progress[1]);
- }
- });
-
- frappe.db.get_value("Education Settings", {name: "Education Settings"}, "user_creation_skip", (r) => {
- if (cint(r.user_creation_skip) !== 1) {
- frm.set_df_property("student_email_id", "reqd", 1);
- }
- });
- },
-
- enroll: function(frm) {
- frappe.model.open_mapped_doc({
- method: "erpnext.education.api.enroll_student",
- frm: frm
- })
- }
-});
-
-frappe.ui.form.on('Student Sibling', {
- setup: function(frm) {
- frm.add_fetch("student", "title", "full_name");
- frm.add_fetch("student", "gender", "gender");
- frm.add_fetch("student", "date_of_birth", "date_of_birth");
- }
-});
diff --git a/erpnext/education/doctype/student_applicant/student_applicant.json b/erpnext/education/doctype/student_applicant/student_applicant.json
deleted file mode 100644
index 95f9224..0000000
--- a/erpnext/education/doctype/student_applicant/student_applicant.json
+++ /dev/null
@@ -1,300 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "naming_series:",
- "creation": "2015-09-11 11:50:09.740807",
- "doctype": "DocType",
- "document_type": "Document",
- "engine": "InnoDB",
- "field_order": [
- "first_name",
- "middle_name",
- "last_name",
- "program",
- "student_category",
- "lms_only",
- "paid",
- "column_break_8",
- "naming_series",
- "application_status",
- "application_date",
- "academic_year",
- "academic_term",
- "student_admission",
- "image",
- "section_break_4",
- "date_of_birth",
- "gender",
- "blood_group",
- "column_break_12",
- "student_email_id",
- "student_mobile_number",
- "nationality",
- "home_address",
- "address_line_1",
- "address_line_2",
- "pincode",
- "column_break_23",
- "city",
- "state",
- "section_break_20",
- "guardians",
- "section_break_21",
- "siblings",
- "section_break_23",
- "title",
- "amended_from"
- ],
- "fields": [
- {
- "fieldname": "first_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "First Name",
- "reqd": 1
- },
- {
- "fieldname": "middle_name",
- "fieldtype": "Data",
- "label": "Middle Name"
- },
- {
- "fieldname": "last_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Last Name"
- },
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "in_filter": 1,
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Program",
- "options": "Program",
- "reqd": 1
- },
- {
- "default": "0",
- "fieldname": "lms_only",
- "fieldtype": "Check",
- "label": "LMS Only"
- },
- {
- "default": "0",
- "fieldname": "paid",
- "fieldtype": "Check",
- "label": "Paid"
- },
- {
- "fieldname": "column_break_8",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Naming Series",
- "no_copy": 1,
- "options": "EDU-APP-.YYYY.-",
- "set_only_once": 1
- },
- {
- "allow_on_submit": 1,
- "depends_on": "eval:doc.docstatus != 0",
- "fieldname": "application_status",
- "fieldtype": "Select",
- "in_filter": 1,
- "label": "Application Status",
- "no_copy": 1,
- "options": "Applied\nApproved\nRejected\nAdmitted"
- },
- {
- "default": "Today",
- "fieldname": "application_date",
- "fieldtype": "Date",
- "label": "Application Date"
- },
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "label": "Academic Year",
- "options": "Academic Year"
- },
- {
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "label": "Academic Term",
- "options": "Academic Term"
- },
- {
- "fieldname": "student_admission",
- "fieldtype": "Link",
- "label": "Student Admission",
- "options": "Student Admission"
- },
- {
- "fieldname": "image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "label": "Image"
- },
- {
- "fieldname": "section_break_4",
- "fieldtype": "Section Break",
- "label": "Personal Details"
- },
- {
- "fieldname": "date_of_birth",
- "fieldtype": "Date",
- "label": "Date of Birth"
- },
- {
- "fieldname": "gender",
- "fieldtype": "Select",
- "label": "Gender",
- "options": "\nMale\nFemale"
- },
- {
- "fieldname": "blood_group",
- "fieldtype": "Select",
- "label": "Blood Group",
- "options": "\nA+\nA-\nB+\nB-\nO+\nO-\nAB+\nAB-"
- },
- {
- "fieldname": "column_break_12",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "student_email_id",
- "fieldtype": "Data",
- "label": "Student Email Address",
- "options": "Email",
- "unique": 1
- },
- {
- "fieldname": "student_mobile_number",
- "fieldtype": "Data",
- "label": "Student Mobile Number"
- },
- {
- "fieldname": "nationality",
- "fieldtype": "Data",
- "label": "Nationality"
- },
- {
- "fieldname": "home_address",
- "fieldtype": "Section Break",
- "label": "Home Address"
- },
- {
- "fieldname": "address_line_1",
- "fieldtype": "Data",
- "label": "Address Line 1"
- },
- {
- "fieldname": "address_line_2",
- "fieldtype": "Data",
- "label": "Address Line 2"
- },
- {
- "fieldname": "pincode",
- "fieldtype": "Data",
- "label": "Pincode"
- },
- {
- "fieldname": "column_break_23",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "city",
- "fieldtype": "Data",
- "label": "City"
- },
- {
- "fieldname": "state",
- "fieldtype": "Data",
- "label": "State"
- },
- {
- "collapsible": 1,
- "fieldname": "section_break_20",
- "fieldtype": "Section Break",
- "label": "Guardian Details"
- },
- {
- "fieldname": "guardians",
- "fieldtype": "Table",
- "label": "Guardians",
- "options": "Student Guardian"
- },
- {
- "collapsible": 1,
- "fieldname": "section_break_21",
- "fieldtype": "Section Break",
- "label": "Sibling Details"
- },
- {
- "fieldname": "siblings",
- "fieldtype": "Table",
- "label": "Siblings",
- "options": "Student Sibling"
- },
- {
- "fieldname": "section_break_23",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "title",
- "fieldtype": "Data",
- "hidden": 1,
- "label": "Title"
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Student Applicant",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "fieldname": "student_category",
- "fieldtype": "Link",
- "label": "Student Category",
- "options": "Student Category"
- }
- ],
- "image_field": "image",
- "is_submittable": 1,
- "links": [],
- "modified": "2021-03-01 23:00:25.119241",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Applicant",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "import": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "title"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_applicant/student_applicant.py b/erpnext/education/doctype/student_applicant/student_applicant.py
deleted file mode 100644
index f04ebb0..0000000
--- a/erpnext/education/doctype/student_applicant/student_applicant.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import add_years, date_diff, getdate, nowdate
-
-
-class StudentApplicant(Document):
- def autoname(self):
- from frappe.model.naming import set_name_by_naming_series
-
- if self.student_admission:
- naming_series = None
- if self.program:
- # set the naming series from the student admission if provided.
- student_admission = get_student_admission_data(self.student_admission, self.program)
- if student_admission:
- naming_series = student_admission.get("applicant_naming_series")
- else:
- naming_series = None
- else:
- frappe.throw(_("Select the program first"))
-
- if naming_series:
- self.naming_series = naming_series
-
- set_name_by_naming_series(self)
-
- def validate(self):
- self.validate_dates()
- self.title = " ".join(filter(None, [self.first_name, self.middle_name, self.last_name]))
-
- if self.student_admission and self.program and self.date_of_birth:
- self.validation_from_student_admission()
-
- def validate_dates(self):
- if self.date_of_birth and getdate(self.date_of_birth) >= getdate():
- frappe.throw(_("Date of Birth cannot be greater than today."))
-
- def on_update_after_submit(self):
- student = frappe.get_list("Student", filters={"student_applicant": self.name})
- if student:
- frappe.throw(
- _("Cannot change status as student {0} is linked with student application {1}").format(
- student[0].name, self.name
- )
- )
-
- def on_submit(self):
- if self.paid and not self.student_admission:
- frappe.throw(
- _("Please select Student Admission which is mandatory for the paid student applicant")
- )
-
- def validation_from_student_admission(self):
-
- student_admission = get_student_admission_data(self.student_admission, self.program)
-
- if (
- student_admission
- and student_admission.min_age
- and date_diff(nowdate(), add_years(getdate(self.date_of_birth), student_admission.min_age)) < 0
- ):
- frappe.throw(_("Not eligible for the admission in this program as per Date Of Birth"))
-
- if (
- student_admission
- and student_admission.max_age
- and date_diff(nowdate(), add_years(getdate(self.date_of_birth), student_admission.max_age)) > 0
- ):
- frappe.throw(_("Not eligible for the admission in this program as per Date Of Birth"))
-
- def on_payment_authorized(self, *args, **kwargs):
- self.db_set("paid", 1)
-
-
-def get_student_admission_data(student_admission, program):
-
- student_admission = frappe.db.sql(
- """select sa.admission_start_date, sa.admission_end_date,
- sap.program, sap.min_age, sap.max_age, sap.applicant_naming_series
- from `tabStudent Admission` sa, `tabStudent Admission Program` sap
- where sa.name = sap.parent and sa.name = %s and sap.program = %s""",
- (student_admission, program),
- as_dict=1,
- )
-
- if student_admission:
- return student_admission[0]
- else:
- return None
diff --git a/erpnext/education/doctype/student_applicant/student_applicant_list.js b/erpnext/education/doctype/student_applicant/student_applicant_list.js
deleted file mode 100644
index c39d46e..0000000
--- a/erpnext/education/doctype/student_applicant/student_applicant_list.js
+++ /dev/null
@@ -1,21 +0,0 @@
-frappe.listview_settings['Student Applicant'] = {
- add_fields: [ "application_status", 'paid'],
- has_indicator_for_draft: 1,
- get_indicator: function(doc) {
- if (doc.paid) {
- return [__("Paid"), "green", "paid,=,Yes"];
- }
- else if (doc.application_status=="Applied") {
- return [__("Applied"), "orange", "application_status,=,Applied"];
- }
- else if (doc.application_status=="Approved") {
- return [__("Approved"), "green", "application_status,=,Approved"];
- }
- else if (doc.application_status=="Rejected") {
- return [__("Rejected"), "red", "application_status,=,Rejected"];
- }
- else if (doc.application_status=="Admitted") {
- return [__("Admitted"), "blue", "application_status,=,Admitted"];
- }
- }
-};
diff --git a/erpnext/education/doctype/student_applicant/test_student_applicant.py b/erpnext/education/doctype/student_applicant/test_student_applicant.py
deleted file mode 100644
index bd0e360..0000000
--- a/erpnext/education/doctype/student_applicant/test_student_applicant.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Student Applicant')
-
-
-class TestStudentApplicant(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_attendance/__init__.py b/erpnext/education/doctype/student_attendance/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_attendance/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_attendance/student_attendance.js b/erpnext/education/doctype/student_attendance/student_attendance.js
deleted file mode 100644
index 2bbecb9..0000000
--- a/erpnext/education/doctype/student_attendance/student_attendance.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-cur_frm.add_fetch("course_schedule", "schedule_date", "date");
-cur_frm.add_fetch("course_schedule", "student_group", "student_group")
diff --git a/erpnext/education/doctype/student_attendance/student_attendance.json b/erpnext/education/doctype/student_attendance/student_attendance.json
deleted file mode 100644
index e6e46d1..0000000
--- a/erpnext/education/doctype/student_attendance/student_attendance.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "actions": [],
- "allow_import": 1,
- "autoname": "naming_series:",
- "creation": "2015-11-05 15:20:23.045996",
- "doctype": "DocType",
- "document_type": "Document",
- "engine": "InnoDB",
- "field_order": [
- "naming_series",
- "student",
- "student_name",
- "student_mobile_number",
- "course_schedule",
- "student_group",
- "column_break_3",
- "date",
- "status",
- "leave_application",
- "amended_from"
- ],
- "fields": [
- {
- "fieldname": "student",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_standard_filter": 1,
- "label": "Student",
- "options": "Student",
- "reqd": 1,
- "search_index": 1
- },
- {
- "fieldname": "course_schedule",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Course Schedule",
- "options": "Course Schedule"
- },
- {
- "fieldname": "date",
- "fieldtype": "Date",
- "label": "Date",
- "reqd": 1,
- "search_index": 1
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fetch_from": "student.title",
- "fieldname": "student_name",
- "fieldtype": "Read Only",
- "in_global_search": 1,
- "label": "Student Name"
- },
- {
- "fieldname": "student_group",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_standard_filter": 1,
- "label": "Student Group",
- "options": "Student Group"
- },
- {
- "default": "Present",
- "fieldname": "status",
- "fieldtype": "Select",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Status",
- "options": "Present\nAbsent",
- "reqd": 1
- },
- {
- "fieldname": "leave_application",
- "fieldtype": "Link",
- "label": "Leave Application",
- "options": "Student Leave Application",
- "read_only": 1
- },
- {
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Series",
- "options": "EDU-ATT-.YYYY.-"
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Student Attendance",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "fetch_from": "student.student_mobile_number",
- "fieldname": "student_mobile_number",
- "fieldtype": "Read Only",
- "label": "Student Mobile Number",
- "options": "Phone"
- }
- ],
- "index_web_pages_for_search": 1,
- "is_submittable": 1,
- "links": [],
- "modified": "2021-03-24 00:02:11.005895",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Attendance",
- "owner": "Administrator",
- "permissions": [
- {
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "student_name"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_attendance/student_attendance.py b/erpnext/education/doctype/student_attendance/student_attendance.py
deleted file mode 100644
index 20f8fb7..0000000
--- a/erpnext/education/doctype/student_attendance/student_attendance.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import formatdate, get_link_to_form, getdate
-
-from erpnext import get_default_company
-from erpnext.education.api import get_student_group_students
-from erpnext.hr.doctype.holiday_list.holiday_list import is_holiday
-
-
-class StudentAttendance(Document):
- def validate(self):
- self.validate_mandatory()
- self.validate_date()
- self.set_date()
- self.set_student_group()
- self.validate_student()
- self.validate_duplication()
- self.validate_is_holiday()
-
- def set_date(self):
- if self.course_schedule:
- self.date = frappe.db.get_value("Course Schedule", self.course_schedule, "schedule_date")
-
- def validate_mandatory(self):
- if not (self.student_group or self.course_schedule):
- frappe.throw(
- _("{0} or {1} is mandatory").format(
- frappe.bold("Student Group"), frappe.bold("Course Schedule")
- ),
- title=_("Mandatory Fields"),
- )
-
- def validate_date(self):
- if not self.leave_application and getdate(self.date) > getdate():
- frappe.throw(_("Attendance cannot be marked for future dates."))
-
- if self.student_group:
- academic_year = frappe.db.get_value("Student Group", self.student_group, "academic_year")
- if academic_year:
- year_start_date, year_end_date = frappe.db.get_value(
- "Academic Year", academic_year, ["year_start_date", "year_end_date"]
- )
- if year_start_date and year_end_date:
- if getdate(self.date) < getdate(year_start_date) or getdate(self.date) > getdate(
- year_end_date
- ):
- frappe.throw(
- _("Attendance cannot be marked outside of Academic Year {0}").format(academic_year)
- )
-
- def set_student_group(self):
- if self.course_schedule:
- self.student_group = frappe.db.get_value(
- "Course Schedule", self.course_schedule, "student_group"
- )
-
- def validate_student(self):
- if self.course_schedule:
- student_group = frappe.db.get_value("Course Schedule", self.course_schedule, "student_group")
- else:
- student_group = self.student_group
- student_group_students = [d.student for d in get_student_group_students(student_group)]
- if student_group and self.student not in student_group_students:
- student_group_doc = get_link_to_form("Student Group", student_group)
- frappe.throw(
- _("Student {0}: {1} does not belong to Student Group {2}").format(
- frappe.bold(self.student), self.student_name, frappe.bold(student_group_doc)
- )
- )
-
- def validate_duplication(self):
- """Check if the Attendance Record is Unique"""
- attendance_record = None
- if self.course_schedule:
- attendance_record = frappe.db.exists(
- "Student Attendance",
- {
- "student": self.student,
- "course_schedule": self.course_schedule,
- "docstatus": ("!=", 2),
- "name": ("!=", self.name),
- },
- )
- else:
- attendance_record = frappe.db.exists(
- "Student Attendance",
- {
- "student": self.student,
- "student_group": self.student_group,
- "date": self.date,
- "docstatus": ("!=", 2),
- "name": ("!=", self.name),
- "course_schedule": "",
- },
- )
-
- if attendance_record:
- record = get_link_to_form("Student Attendance", attendance_record)
- frappe.throw(
- _("Student Attendance record {0} already exists against the Student {1}").format(
- record, frappe.bold(self.student)
- ),
- title=_("Duplicate Entry"),
- )
-
- def validate_is_holiday(self):
- holiday_list = get_holiday_list()
- if is_holiday(holiday_list, self.date):
- frappe.throw(
- _("Attendance cannot be marked for {0} as it is a holiday.").format(
- frappe.bold(formatdate(self.date))
- )
- )
-
-
-def get_holiday_list(company=None):
- if not company:
- company = get_default_company() or frappe.get_all("Company")[0].name
-
- holiday_list = frappe.get_cached_value("Company", company, "default_holiday_list")
- if not holiday_list:
- frappe.throw(
- _("Please set a default Holiday List for Company {0}").format(
- frappe.bold(get_default_company())
- )
- )
- return holiday_list
diff --git a/erpnext/education/doctype/student_attendance/student_attendance_dashboard.py b/erpnext/education/doctype/student_attendance/student_attendance_dashboard.py
deleted file mode 100644
index 34132af..0000000
--- a/erpnext/education/doctype/student_attendance/student_attendance_dashboard.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return {
- "reports": [
- {
- "label": _("Reports"),
- "items": ["Student Monthly Attendance Sheet", "Student Batch-Wise Attendance"],
- }
- ]
- }
diff --git a/erpnext/education/doctype/student_attendance/student_attendance_list.js b/erpnext/education/doctype/student_attendance/student_attendance_list.js
deleted file mode 100644
index e89b76c..0000000
--- a/erpnext/education/doctype/student_attendance/student_attendance_list.js
+++ /dev/null
@@ -1,11 +0,0 @@
-frappe.listview_settings['Student Attendance'] = {
- add_fields: [ "status"],
- get_indicator: function(doc) {
- if (doc.status=="Absent") {
- return [__("Absent"), "orange", "status,=,Absent"];
- }
- else if (doc.status=="Present") {
- return [__("Present"), "green", "status,=,Present"];
- }
- }
-};
diff --git a/erpnext/education/doctype/student_attendance/test_student_attendance.py b/erpnext/education/doctype/student_attendance/test_student_attendance.py
deleted file mode 100644
index e5b1841..0000000
--- a/erpnext/education/doctype/student_attendance/test_student_attendance.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Student Attendance')
-
-
-class TestStudentAttendance(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_attendance_tool/__init__.py b/erpnext/education/doctype/student_attendance_tool/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_attendance_tool/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js
deleted file mode 100644
index 4526585..0000000
--- a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-frappe.provide("education");
-
-frappe.ui.form.on('Student Attendance Tool', {
- setup: (frm) => {
- frm.students_area = $('<div>')
- .appendTo(frm.fields_dict.students_html.wrapper);
- },
- onload: function(frm) {
- frm.set_query("student_group", function() {
- return {
- "filters": {
- "group_based_on": frm.doc.group_based_on,
- "disabled": 0
- }
- };
- });
- },
-
- refresh: function(frm) {
- if (frappe.route_options) {
- frm.set_value("based_on", frappe.route_options.based_on);
- frm.set_value("student_group", frappe.route_options.student_group);
- frm.set_value("course_schedule", frappe.route_options.course_schedule);
- frappe.route_options = null;
- }
- frm.disable_save();
- },
-
- based_on: function(frm) {
- if (frm.doc.based_on == "Student Group") {
- frm.set_value("course_schedule", "");
- } else {
- frm.set_value("student_group", "");
- }
- },
-
- student_group: function(frm) {
- if ((frm.doc.student_group && frm.doc.date) || frm.doc.course_schedule) {
- frm.students_area.find('.student-attendance-checks').html(`<div style='padding: 2rem 0'>Fetching...</div>`);
- var method = "erpnext.education.doctype.student_attendance_tool.student_attendance_tool.get_student_attendance_records";
-
- frappe.call({
- method: method,
- args: {
- based_on: frm.doc.based_on,
- student_group: frm.doc.student_group,
- date: frm.doc.date,
- course_schedule: frm.doc.course_schedule
- },
- callback: function(r) {
- frm.events.get_students(frm, r.message);
- }
- })
- }
- },
-
- date: function(frm) {
- if (frm.doc.date > frappe.datetime.get_today())
- frappe.throw(__("Cannot mark attendance for future dates."));
- frm.trigger("student_group");
- },
-
- course_schedule: function(frm) {
- frm.trigger("student_group");
- },
-
- get_students: function(frm, students) {
- students = students || [];
- frm.students_editor = new education.StudentsEditor(frm, frm.students_area, students);
- }
-});
-
-
-education.StudentsEditor = class StudentsEditor {
- constructor(frm, wrapper, students) {
- this.wrapper = wrapper;
- this.frm = frm;
- if(students.length > 0) {
- this.make(frm, students);
- } else {
- this.show_empty_state();
- }
- }
- make(frm, students) {
- var me = this;
-
- $(this.wrapper).empty();
- var student_toolbar = $('<p>\
- <button class="btn btn-default btn-add btn-xs" style="margin-right: 5px;"></button>\
- <button class="btn btn-xs btn-default btn-remove" style="margin-right: 5px;"></button>\
- <button class="btn btn-default btn-primary btn-mark-att btn-xs"></button></p>').appendTo($(this.wrapper));
-
- student_toolbar.find(".btn-add")
- .html(__('Check all'))
- .on("click", function() {
- $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) {
- if (!$(check).prop("disabled")) {
- check.checked = true;
- }
- });
- });
-
- student_toolbar.find(".btn-remove")
- .html(__('Uncheck all'))
- .on("click", function() {
- $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) {
- if (!$(check).prop("disabled")) {
- check.checked = false;
- }
- });
- });
-
- student_toolbar.find(".btn-mark-att")
- .html(__('Mark Attendance'))
- .on("click", function() {
- $(me.wrapper.find(".btn-mark-att")).attr("disabled", true);
- var studs = [];
- $(me.wrapper.find('input[type="checkbox"]')).each(function(i, check) {
- var $check = $(check);
- studs.push({
- student: $check.data().student,
- student_name: $check.data().studentName,
- group_roll_number: $check.data().group_roll_number,
- disabled: $check.prop("disabled"),
- checked: $check.is(":checked")
- });
- });
-
- var students_present = studs.filter(function(stud) {
- return !stud.disabled && stud.checked;
- });
-
- var students_absent = studs.filter(function(stud) {
- return !stud.disabled && !stud.checked;
- });
-
- frappe.confirm(__("Do you want to update attendance? <br> Present: {0} <br> Absent: {1}",
- [students_present.length, students_absent.length]),
- function() { //ifyes
- if(!frappe.request.ajax_count) {
- frappe.call({
- method: "erpnext.education.api.mark_attendance",
- freeze: true,
- freeze_message: __("Marking attendance"),
- args: {
- "students_present": students_present,
- "students_absent": students_absent,
- "student_group": frm.doc.student_group,
- "course_schedule": frm.doc.course_schedule,
- "date": frm.doc.date
- },
- callback: function(r) {
- $(me.wrapper.find(".btn-mark-att")).attr("disabled", false);
- frm.trigger("student_group");
- }
- });
- }
- },
- function() { //ifno
- $(me.wrapper.find(".btn-mark-att")).attr("disabled", false);
- }
- );
- });
-
- // make html grid of students
- let student_html = '';
- for (let student of students) {
- student_html += `<div class="col-sm-3">
- <div class="checkbox">
- <label>
- <input
- type="checkbox"
- data-group_roll_number="${student.group_roll_number}"
- data-student="${student.student}"
- data-student-name="${student.student_name}"
- class="students-check"
- ${student.status==='Present' ? 'checked' : ''}>
- ${student.group_roll_number} - ${student.student_name}
- </label>
- </div>
- </div>`;
- }
-
- $(`<div class='student-attendance-checks'>${student_html}</div>`).appendTo(me.wrapper);
- }
-
- show_empty_state() {
- $(this.wrapper).html(
- `<div class="text-center text-muted" style="line-height: 100px;">
- ${__("No Students in")} ${this.frm.doc.student_group}
- </div>`
- );
- }
-};
diff --git a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.json b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.json
deleted file mode 100644
index ee8f484..0000000
--- a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.json
+++ /dev/null
@@ -1,118 +0,0 @@
-{
- "actions": [],
- "allow_copy": 1,
- "creation": "2016-11-16 17:12:46.437539",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "based_on",
- "group_based_on",
- "column_break_2",
- "student_group",
- "academic_year",
- "academic_term",
- "course_schedule",
- "date",
- "attendance",
- "students_html"
- ],
- "fields": [
- {
- "fieldname": "based_on",
- "fieldtype": "Select",
- "label": "Based On",
- "options": "Student Group\nCourse Schedule"
- },
- {
- "default": "Batch",
- "depends_on": "eval:doc.based_on == \"Student Group\"",
- "fieldname": "group_based_on",
- "fieldtype": "Select",
- "label": "Group Based On",
- "options": "Batch\nCourse\nActivity"
- },
- {
- "fieldname": "column_break_2",
- "fieldtype": "Column Break"
- },
- {
- "depends_on": "eval:doc.based_on ==\"Student Group\"",
- "fieldname": "student_group",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Student Group",
- "options": "Student Group",
- "reqd": 1
- },
- {
- "depends_on": "eval:doc.based_on ==\"Course Schedule\"",
- "fieldname": "course_schedule",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Course Schedule",
- "options": "Course Schedule",
- "reqd": 1
- },
- {
- "depends_on": "eval:doc.based_on ==\"Student Group\"",
- "fieldname": "date",
- "fieldtype": "Date",
- "in_list_view": 1,
- "label": "Date",
- "reqd": 1
- },
- {
- "depends_on": "eval: (doc.course_schedule \n|| (doc.student_group && doc.date))",
- "fieldname": "attendance",
- "fieldtype": "Section Break",
- "label": "Attendance"
- },
- {
- "fieldname": "students_html",
- "fieldtype": "HTML",
- "label": "Students HTML"
- },
- {
- "fetch_from": "student_group.academic_year",
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "label": "Academic Year",
- "options": "Academic Year",
- "read_only": 1
- },
- {
- "fetch_from": "student_group.academic_term",
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "label": "Academic Term",
- "options": "Academic Term",
- "read_only": 1
- }
- ],
- "hide_toolbar": 1,
- "issingle": 1,
- "links": [],
- "modified": "2020-10-23 17:52:28.078971",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Attendance Tool",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "read": 1,
- "role": "Instructor",
- "write": 1
- },
- {
- "create": 1,
- "read": 1,
- "role": "Academics User",
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "sort_field": "modified",
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py
deleted file mode 100644
index c626a0f..0000000
--- a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe.model.document import Document
-
-
-class StudentAttendanceTool(Document):
- pass
-
-
-@frappe.whitelist()
-def get_student_attendance_records(based_on, date=None, student_group=None, course_schedule=None):
- student_list = []
- student_attendance_list = []
-
- if based_on == "Course Schedule":
- student_group = frappe.db.get_value("Course Schedule", course_schedule, "student_group")
- if student_group:
- student_list = frappe.get_all(
- "Student Group Student",
- fields=["student", "student_name", "group_roll_number"],
- filters={"parent": student_group, "active": 1},
- order_by="group_roll_number",
- )
-
- if not student_list:
- student_list = frappe.get_all(
- "Student Group Student",
- fields=["student", "student_name", "group_roll_number"],
- filters={"parent": student_group, "active": 1},
- order_by="group_roll_number",
- )
-
- StudentAttendance = frappe.qb.DocType("Student Attendance")
-
- if course_schedule:
- student_attendance_list = (
- frappe.qb.from_(StudentAttendance)
- .select(StudentAttendance.student, StudentAttendance.status)
- .where((StudentAttendance.course_schedule == course_schedule))
- ).run(as_dict=True)
- else:
- student_attendance_list = (
- frappe.qb.from_(StudentAttendance)
- .select(StudentAttendance.student, StudentAttendance.status)
- .where(
- (StudentAttendance.student_group == student_group)
- & (StudentAttendance.date == date)
- & ((StudentAttendance.course_schedule == "") | (StudentAttendance.course_schedule.isnull()))
- )
- ).run(as_dict=True)
-
- for attendance in student_attendance_list:
- for student in student_list:
- if student.student == attendance.student:
- student.status = attendance.status
-
- return student_list
diff --git a/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.py b/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.py
deleted file mode 100644
index c15036f..0000000
--- a/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestStudentAttendanceTool(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_batch_name/__init__.py b/erpnext/education/doctype/student_batch_name/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_batch_name/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_batch_name/student_batch_name.js b/erpnext/education/doctype/student_batch_name/student_batch_name.js
deleted file mode 100644
index 7ed3021..0000000
--- a/erpnext/education/doctype/student_batch_name/student_batch_name.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Student Batch Name', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/student_batch_name/student_batch_name.json b/erpnext/education/doctype/student_batch_name/student_batch_name.json
deleted file mode 100644
index abb6436..0000000
--- a/erpnext/education/doctype/student_batch_name/student_batch_name.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "field:batch_name",
- "beta": 0,
- "creation": "2016-11-17 18:45:57.965091",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "batch_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Batch Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-11-10 19:08:17.980349",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Batch Name",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_batch_name/student_batch_name.py b/erpnext/education/doctype/student_batch_name/student_batch_name.py
deleted file mode 100644
index ae59291..0000000
--- a/erpnext/education/doctype/student_batch_name/student_batch_name.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentBatchName(Document):
- pass
diff --git a/erpnext/education/doctype/student_batch_name/test_records.json b/erpnext/education/doctype/student_batch_name/test_records.json
deleted file mode 100644
index bf365c6..0000000
--- a/erpnext/education/doctype/student_batch_name/test_records.json
+++ /dev/null
@@ -1,8 +0,0 @@
-[
- {
- "batch_name": "_Batch 1"
- },
- {
- "batch_name": "_Batch 2"
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_batch_name/test_student_batch_name.py b/erpnext/education/doctype/student_batch_name/test_student_batch_name.py
deleted file mode 100644
index bf9639b..0000000
--- a/erpnext/education/doctype/student_batch_name/test_student_batch_name.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Student Batch Name')
-
-
-class TestStudentBatchName(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_category/__init__.py b/erpnext/education/doctype/student_category/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_category/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_category/student_category.js b/erpnext/education/doctype/student_category/student_category.js
deleted file mode 100644
index 3a264d1..0000000
--- a/erpnext/education/doctype/student_category/student_category.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Student Category', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/student_category/student_category.json b/erpnext/education/doctype/student_category/student_category.json
deleted file mode 100644
index d7d4444..0000000
--- a/erpnext/education/doctype/student_category/student_category.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "field:category",
- "beta": 0,
- "creation": "2016-09-05 06:28:33.679415",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "category",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Category",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-11-10 19:09:45.783401",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Category",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_category/student_category.py b/erpnext/education/doctype/student_category/student_category.py
deleted file mode 100644
index 0d71859..0000000
--- a/erpnext/education/doctype/student_category/student_category.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentCategory(Document):
- pass
diff --git a/erpnext/education/doctype/student_category/student_category_dashboard.py b/erpnext/education/doctype/student_category/student_category_dashboard.py
deleted file mode 100644
index d7a332c..0000000
--- a/erpnext/education/doctype/student_category/student_category_dashboard.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "student_category",
- "transactions": [{"label": _("Fee"), "items": ["Fee Structure", "Fee Schedule", "Fees"]}],
- }
diff --git a/erpnext/education/doctype/student_category/test_student_category.py b/erpnext/education/doctype/student_category/test_student_category.py
deleted file mode 100644
index 5671e9f..0000000
--- a/erpnext/education/doctype/student_category/test_student_category.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Student Category')
-
-
-class TestStudentCategory(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_group/__init__.py b/erpnext/education/doctype/student_group/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_group/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_group/student_group.js b/erpnext/education/doctype/student_group/student_group.js
deleted file mode 100644
index 39ee9ce..0000000
--- a/erpnext/education/doctype/student_group/student_group.js
+++ /dev/null
@@ -1,145 +0,0 @@
-cur_frm.add_fetch('student', 'title', 'student_name');
-
-frappe.ui.form.on('Student Group', {
- onload: function(frm) {
- frm.set_query('academic_term', function() {
- return {
- filters: {
- 'academic_year': (frm.doc.academic_year)
- }
- };
- });
- if (!frm.__islocal) {
- frm.set_query('student', 'students', function() {
- return{
- query: 'erpnext.education.doctype.student_group.student_group.fetch_students',
- filters: {
- 'academic_year': frm.doc.academic_year,
- 'group_based_on': frm.doc.group_based_on,
- 'academic_term': frm.doc.academic_term,
- 'program': frm.doc.program,
- 'batch': frm.doc.batch,
- 'student_category': frm.doc.student_category,
- 'course': frm.doc.course,
- 'student_group': frm.doc.name
- }
- }
- });
- }
- },
-
- refresh: function(frm) {
- if (!frm.doc.__islocal) {
-
- frm.add_custom_button(__('Add Guardians to Email Group'), function() {
- frappe.call({
- method: 'erpnext.education.api.update_email_group',
- args: {
- 'doctype': 'Student Group',
- 'name': frm.doc.name
- }
- });
- }, __('Actions'));
-
- frm.add_custom_button(__('Student Attendance Tool'), function() {
- frappe.route_options = {
- based_on: 'Student Group',
- student_group: frm.doc.name
- }
- frappe.set_route('Form', 'Student Attendance Tool', 'Student Attendance Tool');
- }, __('Tools'));
-
- frm.add_custom_button(__('Course Scheduling Tool'), function() {
- frappe.route_options = {
- student_group: frm.doc.name
- }
- frappe.set_route('Form', 'Course Scheduling Tool', 'Course Scheduling Tool');
- }, __('Tools'));
-
- frm.add_custom_button(__('Newsletter'), function() {
- frappe.route_options = {
- 'Newsletter Email Group.email_group': frm.doc.name
- }
- frappe.set_route('List', 'Newsletter');
- }, __('View'));
-
- }
- },
-
- group_based_on: function(frm) {
- if (frm.doc.group_based_on == 'Batch') {
- frm.doc.course = null;
- frm.set_df_property('program', 'reqd', 1);
- frm.set_df_property('course', 'reqd', 0);
- }
- else if (frm.doc.group_based_on == 'Course') {
- frm.set_df_property('program', 'reqd', 0);
- frm.set_df_property('course', 'reqd', 1);
- }
- else if (frm.doc.group_based_on == 'Activity') {
- frm.set_df_property('program', 'reqd', 0);
- frm.set_df_property('course', 'reqd', 0);
- }
- },
-
- get_students: function(frm) {
- if (frm.doc.group_based_on == 'Batch' || frm.doc.group_based_on == 'Course') {
- var student_list = [];
- var max_roll_no = 0;
- $.each(frm.doc.students, function(_i,d) {
- student_list.push(d.student);
- if (d.group_roll_number>max_roll_no) {
- max_roll_no = d.group_roll_number;
- }
- });
-
- if (frm.doc.academic_year) {
- frappe.call({
- method: 'erpnext.education.doctype.student_group.student_group.get_students',
- args: {
- 'academic_year': frm.doc.academic_year,
- 'academic_term': frm.doc.academic_term,
- 'group_based_on': frm.doc.group_based_on,
- 'program': frm.doc.program,
- 'batch' : frm.doc.batch,
- 'student_category' : frm.doc.student_category,
- 'course': frm.doc.course
- },
- callback: function(r) {
- if (r.message) {
- $.each(r.message, function(i, d) {
- if(!in_list(student_list, d.student)) {
- var s = frm.add_child('students');
- s.student = d.student;
- s.student_name = d.student_name;
- if (d.active === 0) {
- s.active = 0;
- }
- s.group_roll_number = ++max_roll_no;
- }
- });
- refresh_field('students');
- frm.save();
- } else {
- frappe.msgprint(__('Student Group is already updated.'))
- }
- }
- })
- }
- } else {
- frappe.msgprint(__('Select students manually for the Activity based Group'));
- }
- }
-});
-
-frappe.ui.form.on('Student Group Instructor', {
- instructors_add: function(frm){
- frm.fields_dict['instructors'].grid.get_field('instructor').get_query = function(doc){
- let instructor_list = [];
- $.each(doc.instructors, function(idx, val){
- instructor_list.push(val.instructor);
- });
- return { filters: [['Instructor', 'name', 'not in', instructor_list]] };
- };
- }
-});
diff --git a/erpnext/education/doctype/student_group/student_group.json b/erpnext/education/doctype/student_group/student_group.json
deleted file mode 100644
index 44b38b1..0000000
--- a/erpnext/education/doctype/student_group/student_group.json
+++ /dev/null
@@ -1,161 +0,0 @@
-{
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:student_group_name",
- "creation": "2015-09-07 12:55:52.072792",
- "doctype": "DocType",
- "document_type": "Document",
- "engine": "InnoDB",
- "field_order": [
- "academic_year",
- "group_based_on",
- "student_group_name",
- "max_strength",
- "column_break_3",
- "academic_term",
- "program",
- "batch",
- "student_category",
- "course",
- "disabled",
- "section_break_6",
- "get_students",
- "students",
- "section_break_12",
- "instructors"
- ],
- "fields": [
- {
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "in_standard_filter": 1,
- "label": "Academic Year",
- "options": "Academic Year",
- "set_only_once": 1
- },
- {
- "fieldname": "group_based_on",
- "fieldtype": "Select",
- "in_list_view": 1,
- "label": "Group Based on",
- "options": "\nBatch\nCourse\nActivity",
- "reqd": 1
- },
- {
- "fieldname": "student_group_name",
- "fieldtype": "Data",
- "label": "Student Group Name",
- "reqd": 1,
- "unique": 1
- },
- {
- "description": "Set 0 for no limit",
- "fieldname": "max_strength",
- "fieldtype": "Int",
- "label": "Max Strength"
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Academic Term",
- "options": "Academic Term"
- },
- {
- "fieldname": "program",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Program",
- "options": "Program"
- },
- {
- "fieldname": "batch",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Batch",
- "options": "Student Batch Name"
- },
- {
- "depends_on": "eval:doc.group_based_on == 'Course'",
- "fieldname": "course",
- "fieldtype": "Link",
- "in_global_search": 1,
- "in_standard_filter": 1,
- "label": "Course",
- "options": "Course"
- },
- {
- "default": "0",
- "fieldname": "disabled",
- "fieldtype": "Check",
- "label": "Disabled"
- },
- {
- "depends_on": "eval:!doc.__islocal",
- "fieldname": "section_break_6",
- "fieldtype": "Section Break",
- "label": "Students"
- },
- {
- "fieldname": "get_students",
- "fieldtype": "Button",
- "label": "Get Students"
- },
- {
- "allow_on_submit": 1,
- "fieldname": "students",
- "fieldtype": "Table",
- "label": "Students",
- "options": "Student Group Student"
- },
- {
- "fieldname": "section_break_12",
- "fieldtype": "Section Break",
- "label": "Instructors"
- },
- {
- "fieldname": "instructors",
- "fieldtype": "Table",
- "label": "Instructors",
- "options": "Student Group Instructor"
- },
- {
- "fieldname": "student_category",
- "fieldtype": "Link",
- "label": "Student Category",
- "options": "Student Category"
- }
- ],
- "modified": "2019-04-26 10:52:57.303951",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Group",
- "owner": "Administrator",
- "permissions": [
- {
- "read": 1,
- "role": "Instructor"
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "write": 1
- }
- ],
- "restrict_to_domain": "Education",
- "search_fields": "program, batch, course",
- "sort_field": "modified",
- "sort_order": "DESC"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_group/student_group.py b/erpnext/education/doctype/student_group/student_group.py
deleted file mode 100644
index a94489b..0000000
--- a/erpnext/education/doctype/student_group/student_group.py
+++ /dev/null
@@ -1,200 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import cint
-
-from erpnext.education.utils import validate_duplicate_student
-
-
-class StudentGroup(Document):
- def validate(self):
- self.validate_mandatory_fields()
- self.validate_strength()
- self.validate_students()
- self.validate_and_set_child_table_fields()
- validate_duplicate_student(self.students)
-
- def validate_mandatory_fields(self):
- if self.group_based_on == "Course" and not self.course:
- frappe.throw(_("Please select Course"))
- if self.group_based_on == "Course" and (not self.program and self.batch):
- frappe.throw(_("Please select Program"))
- if self.group_based_on == "Batch" and not self.program:
- frappe.throw(_("Please select Program"))
-
- def validate_strength(self):
- if cint(self.max_strength) < 0:
- frappe.throw(_("""Max strength cannot be less than zero."""))
- if self.max_strength and len(self.students) > self.max_strength:
- frappe.throw(
- _("""Cannot enroll more than {0} students for this student group.""").format(self.max_strength)
- )
-
- def validate_students(self):
- program_enrollment = get_program_enrollment(
- self.academic_year,
- self.academic_term,
- self.program,
- self.batch,
- self.student_category,
- self.course,
- )
- students = [d.student for d in program_enrollment] if program_enrollment else []
- for d in self.students:
- if not frappe.db.get_value("Student", d.student, "enabled") and d.active and not self.disabled:
- frappe.throw(_("{0} - {1} is inactive student").format(d.group_roll_number, d.student_name))
-
- if (
- (self.group_based_on == "Batch")
- and cint(frappe.defaults.get_defaults().validate_batch)
- and d.student not in students
- ):
- frappe.throw(
- _("{0} - {1} is not enrolled in the Batch {2}").format(
- d.group_roll_number, d.student_name, self.batch
- )
- )
-
- if (
- (self.group_based_on == "Course")
- and cint(frappe.defaults.get_defaults().validate_course)
- and (d.student not in students)
- ):
- frappe.throw(
- _("{0} - {1} is not enrolled in the Course {2}").format(
- d.group_roll_number, d.student_name, self.course
- )
- )
-
- def validate_and_set_child_table_fields(self):
- roll_numbers = [d.group_roll_number for d in self.students if d.group_roll_number]
- max_roll_no = max(roll_numbers) if roll_numbers else 0
- roll_no_list = []
- for d in self.students:
- if not d.student_name:
- d.student_name = frappe.db.get_value("Student", d.student, "title")
- if not d.group_roll_number:
- max_roll_no += 1
- d.group_roll_number = max_roll_no
- if d.group_roll_number in roll_no_list:
- frappe.throw(_("Duplicate roll number for student {0}").format(d.student_name))
- else:
- roll_no_list.append(d.group_roll_number)
-
-
-@frappe.whitelist()
-def get_students(
- academic_year,
- group_based_on,
- academic_term=None,
- program=None,
- batch=None,
- student_category=None,
- course=None,
-):
- enrolled_students = get_program_enrollment(
- academic_year, academic_term, program, batch, student_category, course
- )
-
- if enrolled_students:
- student_list = []
- for s in enrolled_students:
- if frappe.db.get_value("Student", s.student, "enabled"):
- s.update({"active": 1})
- else:
- s.update({"active": 0})
- student_list.append(s)
- return student_list
- else:
- frappe.msgprint(_("No students found"))
- return []
-
-
-def get_program_enrollment(
- academic_year, academic_term=None, program=None, batch=None, student_category=None, course=None
-):
-
- condition1 = " "
- condition2 = " "
- if academic_term:
- condition1 += " and pe.academic_term = %(academic_term)s"
- if program:
- condition1 += " and pe.program = %(program)s"
- if batch:
- condition1 += " and pe.student_batch_name = %(batch)s"
- if student_category:
- condition1 += " and pe.student_category = %(student_category)s"
- if course:
- condition1 += " and pe.name = pec.parent and pec.course = %(course)s"
- condition2 = ", `tabProgram Enrollment Course` pec"
-
- return frappe.db.sql(
- """
- select
- pe.student, pe.student_name
- from
- `tabProgram Enrollment` pe {condition2}
- where
- pe.academic_year = %(academic_year)s {condition1}
- order by
- pe.student_name asc
- """.format(
- condition1=condition1, condition2=condition2
- ),
- (
- {
- "academic_year": academic_year,
- "academic_term": academic_term,
- "program": program,
- "batch": batch,
- "student_category": student_category,
- "course": course,
- }
- ),
- as_dict=1,
- )
-
-
-@frappe.whitelist()
-@frappe.validate_and_sanitize_search_inputs
-def fetch_students(doctype, txt, searchfield, start, page_len, filters):
- if filters.get("group_based_on") != "Activity":
- enrolled_students = get_program_enrollment(
- filters.get("academic_year"),
- filters.get("academic_term"),
- filters.get("program"),
- filters.get("batch"),
- filters.get("student_category"),
- )
- student_group_student = frappe.db.sql_list(
- """select student from `tabStudent Group Student` where parent=%s""",
- (filters.get("student_group")),
- )
- students = (
- [d.student for d in enrolled_students if d.student not in student_group_student]
- if enrolled_students
- else [""]
- ) or [""]
- return frappe.db.sql(
- """select name, title from tabStudent
- where name in ({0}) and (`{1}` LIKE %s or title LIKE %s)
- order by idx desc, name
- limit %s, %s""".format(
- ", ".join(["%s"] * len(students)), searchfield
- ),
- tuple(students + ["%%%s%%" % txt, "%%%s%%" % txt, start, page_len]),
- )
- else:
- return frappe.db.sql(
- """select name, title from tabStudent
- where `{0}` LIKE %s or title LIKE %s
- order by idx desc, name
- limit %s, %s""".format(
- searchfield
- ),
- tuple(["%%%s%%" % txt, "%%%s%%" % txt, start, page_len]),
- )
diff --git a/erpnext/education/doctype/student_group/student_group_dashboard.py b/erpnext/education/doctype/student_group/student_group_dashboard.py
deleted file mode 100644
index 094b5a0..0000000
--- a/erpnext/education/doctype/student_group/student_group_dashboard.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from frappe import _
-
-
-def get_data():
- return {
- "fieldname": "student_group",
- "transactions": [
- {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]},
- {"label": _("Course"), "items": ["Course Schedule"]},
- ],
- }
diff --git a/erpnext/education/doctype/student_group/test_records.json b/erpnext/education/doctype/student_group/test_records.json
deleted file mode 100644
index 4c4e042..0000000
--- a/erpnext/education/doctype/student_group/test_records.json
+++ /dev/null
@@ -1,34 +0,0 @@
-[
- {
- "student_group_name": "Batch-_TP1-_Batch 1-2014-2015 (_Test Academic Term)",
- "group_based_on": "Batch",
- "program": "_TP1",
- "batch": "_Batch 1",
- "academic_year": "2014-2015",
- "academic_term": "2014-2015 (_Test Academic Term)",
- "max_strength": 0
- },
- {
- "student_group_name": "Course-TC101-2014-2015 (_Test Academic Term)",
- "group_based_on": "Course",
- "course": "TC101",
- "academic_year": "2014-2015",
- "academic_term": "2014-2015 (_Test Academic Term)",
- "max_strength": 0
- },
- {
- "student_group_name": "Course-TC102-2014-2015 (_Test Academic Term)",
- "group_based_on": "Course",
- "course": "TC102",
- "academic_year": "2014-2015",
- "academic_term": "2014-2015 (_Test Academic Term)",
- "max_strength": 0
- },
- {
- "student_group_name": "Activity-2014-2015 (_Test Academic Term)",
- "group_based_on": "Activity",
- "academic_year": "2014-2015",
- "academic_term": "2014-2015 (_Test Academic Term)",
- "max_strength": 0
- }
-]
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_group/test_student_group.py b/erpnext/education/doctype/student_group/test_student_group.py
deleted file mode 100644
index 84b4930..0000000
--- a/erpnext/education/doctype/student_group/test_student_group.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-
-import erpnext.education
-
-
-def get_random_group():
- doc = frappe.get_doc(
- {
- "doctype": "Student Group",
- "student_group_name": "_Test Student Group-" + frappe.generate_hash(length=5),
- "group_based_on": "Activity",
- }
- ).insert()
-
- student_list = frappe.get_all("Student", limit=5)
-
- doc.extend("students", [{"student": d.name, "active": 1} for d in student_list])
- doc.save()
-
- return doc
-
-
-class TestStudentGroup(unittest.TestCase):
- def test_student_roll_no(self):
- doc = get_random_group()
- self.assertEqual(max([d.group_roll_number for d in doc.students]), len(doc.students))
-
- def test_in_group(self):
- doc = get_random_group()
-
- last_student = doc.students[-1].student
-
- # remove last student
- doc.students = doc.students[:-1]
- doc.save()
-
- self.assertRaises(
- erpnext.education.StudentNotInGroupError,
- erpnext.education.validate_student_belongs_to_group,
- last_student,
- doc.name,
- )
-
- # safe, don't throw validation
- erpnext.education.validate_student_belongs_to_group(doc.students[0].student, doc.name)
diff --git a/erpnext/education/doctype/student_group_creation_tool/__init__.py b/erpnext/education/doctype/student_group_creation_tool/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_group_creation_tool/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.js b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.js
deleted file mode 100644
index c189e27..0000000
--- a/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.js
+++ /dev/null
@@ -1,40 +0,0 @@
-frappe.ui.form.on("Student Group Creation Tool", "refresh", function(frm) {
- frm.disable_save();
- frm.page.set_primary_action(__("Create Student Groups"), function() {
- frappe.call({
- method: "create_student_groups",
- doc:frm.doc
- })
- });
- frappe.realtime.on("student_group_creation_progress", function(data) {
- if(data.progress) {
- frappe.hide_msgprint(true);
- frappe.show_progress(__("Creating student groups"), data.progress[0],data.progress[1]);
- }
- });
-});
-
-frappe.ui.form.on("Student Group Creation Tool", "get_courses", function(frm) {
- frm.set_value("courses",[]);
- if (frm.doc.academic_year && frm.doc.program) {
- frappe.call({
- method: "get_courses",
- doc:frm.doc,
- callback: function(r) {
- if(r.message) {
- frm.set_value("courses", r.message);
- }
- }
- })
- }
-});
-
-frappe.ui.form.on("Student Group Creation Tool", "onload", function(frm){
- cur_frm.set_query("academic_term",function(){
- return{
- "filters":{
- "academic_year": (frm.doc.academic_year)
- }
- };
- });
-});
diff --git a/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.json b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.json
deleted file mode 100644
index fe7cbdb..0000000
--- a/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.json
+++ /dev/null
@@ -1,309 +0,0 @@
-{
- "allow_copy": 1,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-01-04 14:45:36.576933",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 0,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Academic Year",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Year",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "Leave blank if you make students groups per year",
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Academic Term",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Term",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "get_courses",
- "fieldtype": "Button",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Get Courses",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_4",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "",
- "fieldname": "program",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Program",
- "length": 0,
- "no_copy": 0,
- "options": "Program",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "Leave unchecked if you don't want to consider batch while making course based groups. ",
- "fieldname": "separate_groups",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Separate course based Group for every Batch",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_4",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "courses",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Courses",
- "length": 0,
- "no_copy": 0,
- "options": "Student Group Creation Tool Course",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 1,
- "hide_toolbar": 1,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 1,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-12-27 09:35:30.211254",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Group Creation Tool",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 0,
- "role": "Education Manager",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py
deleted file mode 100644
index bbeb654..0000000
--- a/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright (c) 2015, Frappe and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-from erpnext.education.doctype.student_group.student_group import get_students
-
-
-class StudentGroupCreationTool(Document):
- @frappe.whitelist()
- def get_courses(self):
- group_list = []
-
- batches = frappe.db.sql("""select name as batch from `tabStudent Batch Name`""", as_dict=1)
- for batch in batches:
- group_list.append({"group_based_on": "Batch", "batch": batch.batch})
-
- courses = frappe.db.sql(
- """select course, course_name from `tabProgram Course` where parent=%s""",
- (self.program),
- as_dict=1,
- )
- if self.separate_groups:
- from itertools import product
-
- course_list = product(courses, batches)
- for course in course_list:
- temp_dict = {}
- temp_dict.update({"group_based_on": "Course"})
- temp_dict.update(course[0])
- temp_dict.update(course[1])
- group_list.append(temp_dict)
- else:
- for course in courses:
- course.update({"group_based_on": "Course"})
- group_list.append(course)
-
- for group in group_list:
- if group.get("group_based_on") == "Batch":
- student_group_name = (
- self.program
- + "/"
- + group.get("batch")
- + "/"
- + (self.academic_term if self.academic_term else self.academic_year)
- )
- group.update({"student_group_name": student_group_name})
- elif group.get("group_based_on") == "Course":
- student_group_name = (
- group.get("course")
- + "/"
- + self.program
- + ("/" + group.get("batch") if group.get("batch") else "")
- + "/"
- + (self.academic_term if self.academic_term else self.academic_year)
- )
- group.update({"student_group_name": student_group_name})
-
- return group_list
-
- @frappe.whitelist()
- def create_student_groups(self):
- if not self.courses:
- frappe.throw(_("""No Student Groups created."""))
-
- l = len(self.courses)
- for d in self.courses:
- if not d.student_group_name:
- frappe.throw(_("Student Group Name is mandatory in row {0}").format(d.idx))
-
- if d.group_based_on == "Course" and not d.course:
- frappe.throw(_("Course is mandatory in row {0}").format(d.idx))
-
- if d.group_based_on == "Batch" and not d.batch:
- frappe.throw(_("Batch is mandatory in row {0}").format(d.idx))
-
- frappe.publish_realtime(
- "student_group_creation_progress", {"progress": [d.idx, l]}, user=frappe.session.user
- )
-
- student_group = frappe.new_doc("Student Group")
- student_group.student_group_name = d.student_group_name
- student_group.group_based_on = d.group_based_on
- student_group.program = self.program
- student_group.course = d.course
- student_group.batch = d.batch
- student_group.max_strength = d.max_strength
- student_group.academic_term = self.academic_term
- student_group.academic_year = self.academic_year
- student_list = get_students(
- self.academic_year, d.group_based_on, self.academic_term, self.program, d.batch, d.course
- )
-
- for student in student_list:
- student_group.append("students", student)
- student_group.save()
-
- frappe.msgprint(_("{0} Student Groups created.").format(l))
diff --git a/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.py b/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.py
deleted file mode 100644
index 8722f97..0000000
--- a/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestStudentGroupCreationTool(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_group_creation_tool_course/__init__.py b/erpnext/education/doctype/student_group_creation_tool_course/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_group_creation_tool_course/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json b/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json
deleted file mode 100644
index 9f691a1..0000000
--- a/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json
+++ /dev/null
@@ -1,272 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-01-04 15:03:57.940079",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "group_based_on",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Group Based On",
- "length": 0,
- "no_copy": 0,
- "options": "\nBatch\nCourse",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "course",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Course",
- "length": 0,
- "no_copy": 0,
- "options": "Course",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "batch",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Batch",
- "length": 0,
- "no_copy": 0,
- "options": "Student Batch Name",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_3",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_group_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student Group Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "course.course_name",
- "fieldname": "course_code",
- "fieldtype": "Read Only",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Course Code",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "max_strength",
- "fieldtype": "Int",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Max Strength",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-11-04 03:38:52.525155",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Group Creation Tool Course",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py b/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py
deleted file mode 100644
index 78e4541..0000000
--- a/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentGroupCreationToolCourse(Document):
- pass
diff --git a/erpnext/education/doctype/student_group_instructor/__init__.py b/erpnext/education/doctype/student_group_instructor/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_group_instructor/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_group_instructor/student_group_instructor.json b/erpnext/education/doctype/student_group_instructor/student_group_instructor.json
deleted file mode 100644
index cb4e527..0000000
--- a/erpnext/education/doctype/student_group_instructor/student_group_instructor.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2017-04-17 16:06:01.406768",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "instructor",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Instructor",
- "length": 0,
- "no_copy": 0,
- "options": "Instructor",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "instructor.instructor_name",
- "fieldname": "instructor_name",
- "fieldtype": "Read Only",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Instructor Name",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-11-04 03:39:02.413082",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Group Instructor",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_group_instructor/student_group_instructor.py b/erpnext/education/doctype/student_group_instructor/student_group_instructor.py
deleted file mode 100644
index 05ef6fc..0000000
--- a/erpnext/education/doctype/student_group_instructor/student_group_instructor.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentGroupInstructor(Document):
- pass
diff --git a/erpnext/education/doctype/student_group_student/__init__.py b/erpnext/education/doctype/student_group_student/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_group_student/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_group_student/student_group_student.json b/erpnext/education/doctype/student_group_student/student_group_student.json
deleted file mode 100644
index d55db34..0000000
--- a/erpnext/education/doctype/student_group_student/student_group_student.json
+++ /dev/null
@@ -1,204 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2015-09-11 15:14:58.501830",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student",
- "length": 0,
- "no_copy": 0,
- "options": "Student",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Student Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "group_roll_number",
- "fieldtype": "Int",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Group Roll Number",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "1",
- "fieldname": "active",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Active",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-11-04 03:38:22.896203",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Group Student",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_group_student/student_group_student.py b/erpnext/education/doctype/student_group_student/student_group_student.py
deleted file mode 100644
index f9d00ab..0000000
--- a/erpnext/education/doctype/student_group_student/student_group_student.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentGroupStudent(Document):
- pass
diff --git a/erpnext/education/doctype/student_guardian/__init__.py b/erpnext/education/doctype/student_guardian/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_guardian/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_guardian/student_guardian.json b/erpnext/education/doctype/student_guardian/student_guardian.json
deleted file mode 100644
index 3f03a3d..0000000
--- a/erpnext/education/doctype/student_guardian/student_guardian.json
+++ /dev/null
@@ -1,141 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-09-01 14:28:39.174471",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "guardian",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Guardian",
- "length": 0,
- "no_copy": 0,
- "options": "Guardian",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "guardian_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Guardian Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "relation",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Relation",
- "length": 0,
- "no_copy": 0,
- "options": "\nMother\nFather\nOthers",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-11-04 03:38:14.211238",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Guardian",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_guardian/student_guardian.py b/erpnext/education/doctype/student_guardian/student_guardian.py
deleted file mode 100644
index 0843acf..0000000
--- a/erpnext/education/doctype/student_guardian/student_guardian.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentGuardian(Document):
- pass
diff --git a/erpnext/education/doctype/student_language/__init__.py b/erpnext/education/doctype/student_language/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_language/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_language/student_language.js b/erpnext/education/doctype/student_language/student_language.js
deleted file mode 100644
index 6239ed1..0000000
--- a/erpnext/education/doctype/student_language/student_language.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Student Language', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/student_language/student_language.json b/erpnext/education/doctype/student_language/student_language.json
deleted file mode 100644
index fc53cd1..0000000
--- a/erpnext/education/doctype/student_language/student_language.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "field:language_name",
- "beta": 0,
- "creation": "2017-02-21 01:55:00.366273",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "language_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Language Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 1
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-11-04 03:37:34.712397",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Language",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_language/student_language.py b/erpnext/education/doctype/student_language/student_language.py
deleted file mode 100644
index d578c9a..0000000
--- a/erpnext/education/doctype/student_language/student_language.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentLanguage(Document):
- pass
diff --git a/erpnext/education/doctype/student_language/test_student_language.py b/erpnext/education/doctype/student_language/test_student_language.py
deleted file mode 100644
index d1a8b6d..0000000
--- a/erpnext/education/doctype/student_language/test_student_language.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Student Language')
-
-
-class TestStudentLanguage(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_leave_application/__init__.py b/erpnext/education/doctype/student_leave_application/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_leave_application/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_leave_application/student_leave_application.js b/erpnext/education/doctype/student_leave_application/student_leave_application.js
deleted file mode 100644
index 4746148..0000000
--- a/erpnext/education/doctype/student_leave_application/student_leave_application.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Student Leave Application', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/student_leave_application/student_leave_application.json b/erpnext/education/doctype/student_leave_application/student_leave_application.json
deleted file mode 100644
index 31b3da2..0000000
--- a/erpnext/education/doctype/student_leave_application/student_leave_application.json
+++ /dev/null
@@ -1,165 +0,0 @@
-{
- "actions": [],
- "autoname": "EDU-SLA-.YYYY.-.#####",
- "creation": "2016-11-28 15:38:54.793854",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "student",
- "student_name",
- "column_break_3",
- "from_date",
- "to_date",
- "total_leave_days",
- "section_break_5",
- "attendance_based_on",
- "student_group",
- "course_schedule",
- "mark_as_present",
- "column_break_11",
- "reason",
- "amended_from"
- ],
- "fields": [
- {
- "fieldname": "student",
- "fieldtype": "Link",
- "in_global_search": 1,
- "label": "Student",
- "options": "Student",
- "reqd": 1
- },
- {
- "fetch_from": "student.title",
- "fieldname": "student_name",
- "fieldtype": "Read Only",
- "in_global_search": 1,
- "label": "Student Name",
- "read_only": 1
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "from_date",
- "fieldtype": "Date",
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "From Date",
- "reqd": 1
- },
- {
- "fieldname": "to_date",
- "fieldtype": "Date",
- "in_list_view": 1,
- "label": "To Date",
- "reqd": 1
- },
- {
- "default": "0",
- "description": "Check this to mark the student as present in case the student is not attending the institute to participate or represent the institute in any event.\n\n",
- "fieldname": "mark_as_present",
- "fieldtype": "Check",
- "label": "Mark as Present"
- },
- {
- "fieldname": "section_break_5",
- "fieldtype": "Section Break"
- },
- {
- "fieldname": "reason",
- "fieldtype": "Text",
- "label": "Reason"
- },
- {
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "label": "Amended From",
- "no_copy": 1,
- "options": "Student Leave Application",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "allow_in_quick_entry": 1,
- "default": "Student Group",
- "fieldname": "attendance_based_on",
- "fieldtype": "Select",
- "label": "Attendance Based On",
- "options": "Student Group\nCourse Schedule"
- },
- {
- "allow_in_quick_entry": 1,
- "depends_on": "eval:doc.attendance_based_on === \"Student Group\";",
- "fieldname": "student_group",
- "fieldtype": "Link",
- "label": "Student Group",
- "mandatory_depends_on": "eval:doc.attendance_based_on === \"Student Group\";",
- "options": "Student Group"
- },
- {
- "allow_in_quick_entry": 1,
- "depends_on": "eval:doc.attendance_based_on === \"Course Schedule\";",
- "fieldname": "course_schedule",
- "fieldtype": "Link",
- "label": "Course Schedule",
- "mandatory_depends_on": "eval:doc.attendance_based_on === \"Course Schedule\";",
- "options": "Course Schedule"
- },
- {
- "fieldname": "column_break_11",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "total_leave_days",
- "fieldtype": "Float",
- "label": "Total Leave Days",
- "read_only": 1
- }
- ],
- "is_submittable": 1,
- "links": [],
- "modified": "2020-09-21 18:10:24.440669",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Leave Application",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "submit": 1,
- "write": 1
- },
- {
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "share": 1,
- "submit": 1,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "student_name"
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_leave_application/student_leave_application.py b/erpnext/education/doctype/student_leave_application/student_leave_application.py
deleted file mode 100644
index c3645cf..0000000
--- a/erpnext/education/doctype/student_leave_application/student_leave_application.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from datetime import timedelta
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import date_diff, flt, get_link_to_form, getdate
-
-from erpnext.education.doctype.student_attendance.student_attendance import get_holiday_list
-from erpnext.hr.doctype.holiday_list.holiday_list import is_holiday
-
-
-class StudentLeaveApplication(Document):
- def validate(self):
- self.validate_holiday_list()
- self.validate_duplicate()
- self.validate_from_to_dates("from_date", "to_date")
-
- def on_submit(self):
- self.update_attendance()
-
- def on_cancel(self):
- self.cancel_attendance()
-
- def validate_duplicate(self):
- data = frappe.db.sql(
- """select name from `tabStudent Leave Application`
- where
- ((%(from_date)s > from_date and %(from_date)s < to_date) or
- (%(to_date)s > from_date and %(to_date)s < to_date) or
- (%(from_date)s <= from_date and %(to_date)s >= to_date)) and
- name != %(name)s and student = %(student)s and docstatus < 2
- """,
- {
- "from_date": self.from_date,
- "to_date": self.to_date,
- "student": self.student,
- "name": self.name,
- },
- as_dict=1,
- )
-
- if data:
- link = get_link_to_form("Student Leave Application", data[0].name)
- frappe.throw(
- _("Leave application {0} already exists against the student {1}").format(
- link, frappe.bold(self.student)
- ),
- title=_("Duplicate Entry"),
- )
-
- def validate_holiday_list(self):
- holiday_list = get_holiday_list()
- self.total_leave_days = get_number_of_leave_days(self.from_date, self.to_date, holiday_list)
-
- def update_attendance(self):
- holiday_list = get_holiday_list()
-
- for dt in daterange(getdate(self.from_date), getdate(self.to_date)):
- date = dt.strftime("%Y-%m-%d")
-
- if is_holiday(holiday_list, date):
- continue
-
- attendance = frappe.db.exists(
- "Student Attendance", {"student": self.student, "date": date, "docstatus": ("!=", 2)}
- )
-
- status = "Present" if self.mark_as_present else "Absent"
- if attendance:
- # update existing attendance record
- values = dict()
- values["status"] = status
- values["leave_application"] = self.name
- frappe.db.set_value("Student Attendance", attendance, values)
- else:
- # make a new attendance record
- doc = frappe.new_doc("Student Attendance")
- doc.student = self.student
- doc.student_name = self.student_name
- doc.date = date
- doc.leave_application = self.name
- doc.status = status
- if self.attendance_based_on == "Student Group":
- doc.student_group = self.student_group
- else:
- doc.course_schedule = self.course_schedule
- doc.insert(ignore_permissions=True, ignore_mandatory=True)
- doc.submit()
-
- def cancel_attendance(self):
- if self.docstatus == 2:
- attendance = frappe.db.sql(
- """
- SELECT name
- FROM `tabStudent Attendance`
- WHERE
- student = %s and
- (date between %s and %s) and
- docstatus < 2
- """,
- (self.student, self.from_date, self.to_date),
- as_dict=1,
- )
-
- for name in attendance:
- frappe.db.set_value("Student Attendance", name, "docstatus", 2)
-
-
-def daterange(start_date, end_date):
- for n in range(int((end_date - start_date).days) + 1):
- yield start_date + timedelta(n)
-
-
-def get_number_of_leave_days(from_date, to_date, holiday_list):
- number_of_days = date_diff(to_date, from_date) + 1
-
- holidays = frappe.db.sql(
- """
- SELECT
- COUNT(DISTINCT holiday_date)
- FROM `tabHoliday` h1,`tabHoliday List` h2
- WHERE
- h1.parent = h2.name and
- h1.holiday_date between %s and %s and
- h2.name = %s""",
- (from_date, to_date, holiday_list),
- )[0][0]
-
- number_of_days = flt(number_of_days) - flt(holidays)
-
- return number_of_days
diff --git a/erpnext/education/doctype/student_leave_application/student_leave_application_dashboard.py b/erpnext/education/doctype/student_leave_application/student_leave_application_dashboard.py
deleted file mode 100644
index 8819c3b..0000000
--- a/erpnext/education/doctype/student_leave_application/student_leave_application_dashboard.py
+++ /dev/null
@@ -1,2 +0,0 @@
-def get_data():
- return {"fieldname": "leave_application", "transactions": [{"items": ["Student Attendance"]}]}
diff --git a/erpnext/education/doctype/student_leave_application/test_student_leave_application.py b/erpnext/education/doctype/student_leave_application/test_student_leave_application.py
deleted file mode 100644
index 7146fc2..0000000
--- a/erpnext/education/doctype/student_leave_application/test_student_leave_application.py
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-from frappe.utils import add_days, add_months, getdate
-
-from erpnext import get_default_company
-from erpnext.education.doctype.student.test_student import create_student
-from erpnext.education.doctype.student_group.test_student_group import get_random_group
-
-
-class TestStudentLeaveApplication(unittest.TestCase):
- def setUp(self):
- frappe.db.sql("""delete from `tabStudent Leave Application`""")
- create_holiday_list()
-
- def test_attendance_record_creation(self):
- leave_application = create_leave_application()
- attendance_record = frappe.db.exists(
- "Student Attendance", {"leave_application": leave_application.name, "status": "Absent"}
- )
- self.assertTrue(attendance_record)
-
- # mark as present
- date = add_days(getdate(), -1)
- leave_application = create_leave_application(date, date, 1)
- attendance_record = frappe.db.exists(
- "Student Attendance", {"leave_application": leave_application.name, "status": "Present"}
- )
- self.assertTrue(attendance_record)
-
- def test_attendance_record_updated(self):
- attendance = create_student_attendance()
- create_leave_application()
- self.assertEqual(frappe.db.get_value("Student Attendance", attendance.name, "status"), "Absent")
-
- def test_attendance_record_cancellation(self):
- leave_application = create_leave_application()
- leave_application.cancel()
- attendance_status = frappe.db.get_value(
- "Student Attendance", {"leave_application": leave_application.name}, "docstatus"
- )
- self.assertTrue(attendance_status, 2)
-
- def test_holiday(self):
- today = getdate()
- leave_application = create_leave_application(
- from_date=today, to_date=add_days(today, 1), submit=0
- )
-
- # holiday list validation
- company = get_default_company() or frappe.get_all("Company")[0].name
- frappe.db.set_value("Company", company, "default_holiday_list", "")
- self.assertRaises(frappe.ValidationError, leave_application.save)
-
- frappe.db.set_value("Company", company, "default_holiday_list", "Test Holiday List for Student")
- leave_application.save()
-
- leave_application.reload()
- self.assertEqual(leave_application.total_leave_days, 1)
-
- # check no attendance record created for a holiday
- leave_application.submit()
- self.assertIsNone(
- frappe.db.exists(
- "Student Attendance", {"leave_application": leave_application.name, "date": add_days(today, 1)}
- )
- )
-
- def tearDown(self):
- company = get_default_company() or frappe.get_all("Company")[0].name
- frappe.db.set_value("Company", company, "default_holiday_list", "_Test Holiday List")
-
-
-def create_leave_application(from_date=None, to_date=None, mark_as_present=0, submit=1):
- student = get_student()
-
- leave_application = frappe.new_doc("Student Leave Application")
- leave_application.student = student.name
- leave_application.attendance_based_on = "Student Group"
- leave_application.student_group = get_random_group().name
- leave_application.from_date = from_date if from_date else getdate()
- leave_application.to_date = from_date if from_date else getdate()
- leave_application.mark_as_present = mark_as_present
-
- if submit:
- leave_application.insert()
- leave_application.submit()
-
- return leave_application
-
-
-def create_student_attendance(date=None, status=None):
- student = get_student()
- attendance = frappe.get_doc(
- {
- "doctype": "Student Attendance",
- "student": student.name,
- "status": status if status else "Present",
- "date": date if date else getdate(),
- "student_group": get_random_group().name,
- }
- ).insert()
- return attendance
-
-
-def get_student():
- return create_student(
- dict(email="test_student@gmail.com", first_name="Test", last_name="Student")
- )
-
-
-def create_holiday_list():
- holiday_list = "Test Holiday List for Student"
- today = getdate()
- if not frappe.db.exists("Holiday List", holiday_list):
- frappe.get_doc(
- dict(
- doctype="Holiday List",
- holiday_list_name=holiday_list,
- from_date=add_months(today, -6),
- to_date=add_months(today, 6),
- holidays=[dict(holiday_date=add_days(today, 1), description="Test")],
- )
- ).insert()
-
- company = get_default_company() or frappe.get_all("Company")[0].name
- frappe.db.set_value("Company", company, "default_holiday_list", holiday_list)
- return holiday_list
diff --git a/erpnext/education/doctype/student_log/__init__.py b/erpnext/education/doctype/student_log/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_log/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_log/student_log.js b/erpnext/education/doctype/student_log/student_log.js
deleted file mode 100644
index 40e63e9..0000000
--- a/erpnext/education/doctype/student_log/student_log.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Student Log', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/student_log/student_log.json b/erpnext/education/doctype/student_log/student_log.json
deleted file mode 100644
index cdd6aaa..0000000
--- a/erpnext/education/doctype/student_log/student_log.json
+++ /dev/null
@@ -1,423 +0,0 @@
-{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "EDU-SLOG-.YYYY.-.#####",
- "beta": 0,
- "creation": "2016-07-29 03:27:22.451772",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 1,
- "label": "Student",
- "length": 0,
- "no_copy": 0,
- "options": "Student",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_from": "student.title",
- "fieldname": "student_name",
- "fieldtype": "Read Only",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Student Name",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "type",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Type",
- "length": 0,
- "no_copy": 0,
- "options": "General\nAcademic\nMedical\nAchievement",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "date",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_3",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Academic Year",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Year",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Academic Term",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Term",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "program",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Program",
- "length": 0,
- "no_copy": 0,
- "options": "Program",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_batch",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Student Batch",
- "length": 0,
- "no_copy": 0,
- "options": "Student Batch Name",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_5",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "log",
- "fieldtype": "Text Editor",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Log",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-08-21 16:15:47.027645",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Log",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Academics User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "student_name",
- "track_changes": 0,
- "track_seen": 1,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_log/student_log.py b/erpnext/education/doctype/student_log/student_log.py
deleted file mode 100644
index b95f34e..0000000
--- a/erpnext/education/doctype/student_log/student_log.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentLog(Document):
- pass
diff --git a/erpnext/education/doctype/student_log/test_student_log.py b/erpnext/education/doctype/student_log/test_student_log.py
deleted file mode 100644
index fef1ab5..0000000
--- a/erpnext/education/doctype/student_log/test_student_log.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-# test_records = frappe.get_test_records('Student Log')
-
-
-class TestStudentLog(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_report_generation_tool/__init__.py b/erpnext/education/doctype/student_report_generation_tool/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_report_generation_tool/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.html b/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.html
deleted file mode 100644
index a9e84e6..0000000
--- a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.html
+++ /dev/null
@@ -1,371 +0,0 @@
-<style>
- @media screen {
- .print-format-gutter {
- background-color: #ddd;
- padding: 15px 0px;
- }
- .print-format {
- background-color: white;
- box-shadow: 0px 0px 9px rgba(0,0,0,0.5);
- max-width: 8.3in;
- min-height: 11.69in;
- padding: 0.75in;
- margin: auto;
- }
-
- .print-format.landscape {
- max-width: 11.69in;
- padding: 0.2in;
- }
-
- .page-break {
- padding: 30px 0px;
- border-bottom: 1px dashed #888;
- }
-
- .page-break:first-child {
- padding-top: 0px;
- }
-
- .page-break:last-child {
- border-bottom: 0px;
- }
-
- /* mozilla hack for images in table */
- body:last-child .print-format td img {
- width: 100% !important;
- }
-
- @media(max-width: 767px) {
- .print-format {
- padding: 0.2in;
- }
- }
- }
-
- @media print {
- .print-format p {
- margin-left: 1px;
- margin-right: 1px;
- }
- }
-
- .data-field {
- margin-top: 5px;
- margin-bottom: 5px;
- }
-
- .data-field .value {
- word-wrap: break-word;
- }
-
- .important .value {
- font-size: 120%;
- font-weight: bold;
- }
-
- .important label {
- line-height: 1.8;
- margin: 0px;
- }
-
- .table {
- margin: 20px 0px;
- }
-
- .square-image {
- width: 100%;
- height: 0;
- padding: 50% 0;
- background-size: contain;
- /*background-size: cover;*/
- background-repeat: no-repeat !important;
- background-position: center center;
- border-radius: 4px;
- }
-
- .print-item-image {
- object-fit: contain;
- }
-
- .pdf-variables,
- .pdf-variable,
- .visible-pdf {
- display: none !important;
- }
-
- .print-format {
- font-size: 9pt;
- font-family: "Helvetica Neue", Helvetica, Arial, "Open Sans", sans-serif;
- -webkit-print-color-adjust:exact;
- }
-
- .page-break {
- page-break-after: always;
- }
-
- .print-heading {
- border-bottom: 1px solid #aaa;
- margin-bottom: 10px;
- }
-
- .print-heading h2 {
- margin: 0px;
- }
- .print-heading h4 {
- margin-top: 5px;
- }
-
- table.no-border, table.no-border td {
- border: 0px;
- }
-
- .print-format label {
- /* wkhtmltopdf breaks label into multiple lines when it is inline-block */
- display: block;
- }
-
- .print-format img {
- max-width: 100%;
- }
-
- .print-format table td > .primary:first-child {
- font-weight: bold;
- }
-
- .print-format td, .print-format th {
- vertical-align: top !important;
- padding: 6px !important;
- }
-
- .print-format p {
- margin: 3px 0px 3px;
- }
-
- table td div {
-
- /* needed to avoid partial cutting of text between page break in wkhtmltopdf */
- page-break-inside: avoid !important;
-
- }
-
- /* hack for webkit specific browser */
- @media (-webkit-min-device-pixel-ratio:0) {
- thead, tfoot { display: table-row-group; }
- }
-
- [document-status] {
- margin-bottom: 5mm;
- }
-
- .signature-img {
- background: #fff;
- border-radius: 3px;
- margin-top: 5px;
- max-height: 150px;
- }
-
- .print-heading {
- text-align: right;
- text-transform: uppercase;
- color: #666;
- padding-bottom: 20px;
- margin-bottom: 20px;
- border-bottom: 1px solid #d1d8dd;
- }
-
- .print-heading h2 {
- font-size: 24px;
- }
-
- .print-format th {
- background-color: #eee !important;
- border-bottom: 0px !important;
- }
-
- /* modern format: for-test */
-
- .pbi_avoid {
- page-break-inside: avoid !important;
- }
- .pb_before {
- page-break-before: always !important;
- }
-</style>
-
-
-
-<div class="page-break">
-
- <div id="header-html" class="hidden-pdf">
-
- {% if letterhead and add_letterhead %}
- <div class="">{{ letterhead }}</div>
- {% endif %}
- <div class="print-heading">
- <h2>{{ _("Student Report Card") }}<br>
- <small>{{ doc.student_name }}</small>
- </h2>
- </div>
- </div>
-
- <div class="row section-break">
- <div class="col-xs-6 column-break">
- <div class="row data-field">
- <div class="col-xs-5">
- <label>{{ _("Student ID: ") }}</label>
- </div>
- <div class="col-xs-7">
- {{ doc.students[0] }}
- </div>
- </div>
-
- <div class="row data-field">
- <div class="col-xs-5">
- <label>{{ _("Student Name: ") }}</label>
- </div>
- <div class="col-xs-7">
- {{ doc.student_name }}
- </div>
- </div>
-
- <div class="row data-field">
- <div class="col-xs-5">
- <label>{{ _("Program: ") }}</label>
- </div>
- <div class="col-xs-7">
- {{ doc.program }}
- </div>
- </div>
-
- <div class="row data-field">
- <div class="col-xs-5">
- <label>{{ _("Batch: ") }}</label>
- </div>
- <div class="col-xs-7">
- {{ doc.student_batch }}
- </div>
- </div>
- </div>
-
- <div class="col-xs-6 column-break">
- <div class="row data-field">
- <div class="col-xs-5">
- <label>{{ _("Academic Year: ") }}</label>
- </div>
- <div class="col-xs-7">
- {{ doc.academic_year }}
- </div>
- </div>
-
- {% if doc.academic_term %}
- <div class="row data-field">
- <div class="col-xs-5">
- <label>{{ _("Academic Term: ") }}</label>
- </div>
- <div class="col-xs-7">
- {{ doc.academic_term }}
- </div>
- </div>
- {% endif %}
-
- <div class="row data-field">
- <div class="col-xs-5">
- <label>{{ _("Assessment Group: ") }}</label>
- </div>
- <div class="col-xs-7">
- {{ doc.assessment_group }}
- </div>
- </div>
- </div>
- </div>
-
-
-{% if doc.show_marks | int %}
- {% set result_data = 'score' %}
-{% else %}
- {% set result_data = 'grade' %}
-{% endif %}
-
-
-{% for course in courses %}
-
-<div class="row section-break pbi_avoid">
- <div class="col-xs-12 column-break">
-
- <div>
- <table class="table table-bordered table-condensed">
- <caption>
- <div class="row">
- <div class="col-xs-1">
- <label>{{ _("Course: ") }}</label>
- </div>
- <div class="col-xs-11">
- {{ course }} ({{ frappe.db.get_value("Course", course, "course_name") }})
- </div>
- </div>
- </caption>
- <thead>
- <tr>
- <th style="width: {{ 650//(assessment_groups|length + 1) }}px">{{ _("Assessment Criteria") }}</th>
- {% for assessment_group in assessment_groups %}
- <th> {{ assessment_group }}</th>
- {% endfor %}
- </tr>
- </thead>
-
- <tbody>
- {% for criteria in course_criteria[course] %}
- <tr>
- <td>{{ criteria }}</td>
- {% for assessment_group in assessment_groups %}
- {% if (assessment_result.get(course) and assessment_result.get(course).get(assessment_group) and assessment_result.get(course).get(assessment_group).get(criteria)) %}
- <td>
- {{ assessment_result.get(course).get(assessment_group).get(criteria).get(result_data) }}
- {% if result_data == 'score' %}
- ({{ assessment_result.get(course).get(assessment_group).get(criteria).get('maximum_score') }})
- {% endif %}
- </td>
- {% else %}
- <td></td>
- {% endif %}
- {% endfor %}
- </tr>
- {% endfor %}
- </tbody>
-
- </table>
- </div>
- </div>
-</div>
-
-{% endfor %}
-
-<br>
-
-<div class="row section-break pbi_avoid">
- <div class="col-xs-6 column-break">
- <h4>{{ _("Student Attendance")}}</h4> <br>
- <div>
- Present {{ doc.attendance.get("Present") if doc.attendance.get("Present") != None else '0' }} days
- out of {{ doc.attendance.get("Present") + doc.attendance.get("Absent") }}
- </div>
- </div>
-
- <div class="col-xs-6 column-break">
- <h4>{{ _("Parents Teacher Meeting Attendance")}}</h4> <br>
- <div>
- Present {{ doc.parents_attendance if doc.parents_attendance != None else '0' }}
- out of {{ doc.parents_meeting if doc.parents_meeting != None else '0' }}
- </div>
- </div>
-</div>
-
-{% if doc.assessment_terms %}
-<div class="row section-break pb_before">
- <div class="col-xs-12">
- <p> {{ doc.assessment_terms }} </p>
- </div>
-</div>
-{% endif %}
-</div>
diff --git a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.js b/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.js
deleted file mode 100644
index 565074d..0000000
--- a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.js
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Student Report Generation Tool', {
- onload: function(frm) {
- frm.set_query("academic_term",function(){
- return{
- "filters":{
- "academic_year": frm.doc.academic_year
- }
- };
- });
- frm.set_query("assessment_group", function() {
- return{
- filters: {
- "is_group": 1
- }
- };
- });
- },
-
- refresh: function(frm) {
- frm.disable_save();
- frm.page.clear_indicator();
- frm.page.set_primary_action(__('Print Report Card'), () => {
- let url = "/api/method/erpnext.education.doctype.student_report_generation_tool.student_report_generation_tool.preview_report_card";
- open_url_post(url, {"doc": frm.doc}, true);
- });
- },
-
- student: function(frm) {
- if (frm.doc.student) {
- frappe.call({
- method:"erpnext.education.api.get_current_enrollment",
- args: {
- "student": frm.doc.student,
- "academic_year": frm.doc.academic_year
- },
- callback: function(r) {
- if(r){
- $.each(r.message, function(i, d) {
- if (frm.fields_dict.hasOwnProperty(i)) {
- frm.set_value(i, d);
- }
- });
- }
- }
- });
- }
- },
-
- terms: function(frm) {
- if(frm.doc.terms) {
- return frappe.call({
- method: 'erpnext.setup.doctype.terms_and_conditions.terms_and_conditions.get_terms_and_conditions',
- args: {
- template_name: frm.doc.terms,
- doc: frm.doc
- },
- callback: function(r) {
- frm.set_value("assessment_terms", r.message);
- }
- });
- }
- }
-});
diff --git a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.json b/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.json
deleted file mode 100644
index a328299..0000000
--- a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.json
+++ /dev/null
@@ -1,618 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2018-01-15 15:36:32.830069",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Student",
- "length": 0,
- "no_copy": 0,
- "options": "Student",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_name",
- "fieldtype": "Read Only",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Student Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "program",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Program",
- "length": 0,
- "no_copy": 0,
- "options": "Program",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "student_batch",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Batch",
- "length": 0,
- "no_copy": 0,
- "options": "Student Batch Name",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "include_all_assessment",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Include All Assessment Group",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "show_marks",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Show Marks",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "1",
- "fieldname": "add_letterhead",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Add letterhead",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_3",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "assessment_group",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Assessment Group",
- "length": 0,
- "no_copy": 0,
- "options": "Assessment Group",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Academic Year",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Year",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Academic Term",
- "length": 0,
- "no_copy": 0,
- "options": "Academic Term",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "add_letterhead",
- "fieldname": "letter_head",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Letter Head",
- "length": 0,
- "no_copy": 0,
- "options": "Letter Head",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_5",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Print Section",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "parents_meeting",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Total Parents Teacher Meeting",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "parents_attendance",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Attended by Parents",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "terms",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Terms",
- "length": 0,
- "no_copy": 0,
- "options": "Terms and Conditions",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "assessment_terms",
- "fieldtype": "Text Editor",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Assessment Terms",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 1,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 1,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-11-04 03:38:42.970869",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Report Generation Tool",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 0,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.py b/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.py
deleted file mode 100644
index ae3c140..0000000
--- a/erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import json
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils.pdf import get_pdf
-
-from erpnext.education.report.course_wise_assessment_report.course_wise_assessment_report import (
- get_child_assessment_groups,
- get_formatted_result,
-)
-
-
-class StudentReportGenerationTool(Document):
- pass
-
-
-@frappe.whitelist()
-def preview_report_card(doc):
- doc = frappe._dict(json.loads(doc))
- doc.students = [doc.student]
- if not (doc.student_name and doc.student_batch):
- program_enrollment = frappe.get_all(
- "Program Enrollment",
- fields=["student_batch_name", "student_name"],
- filters={"student": doc.student, "docstatus": ("!=", 2), "academic_year": doc.academic_year},
- )
- if program_enrollment:
- doc.batch = program_enrollment[0].student_batch_name
- doc.student_name = program_enrollment[0].student_name
-
- # get the assessment result of the selected student
- values = get_formatted_result(
- doc, get_course=True, get_all_assessment_groups=doc.include_all_assessment
- )
- assessment_result = values.get("assessment_result").get(doc.student)
- courses = values.get("course_dict")
- course_criteria = get_courses_criteria(courses)
-
- # get the assessment group as per the user selection
- if doc.include_all_assessment:
- assessment_groups = get_child_assessment_groups(doc.assessment_group)
- else:
- assessment_groups = [doc.assessment_group]
-
- # get the attendance of the student for that peroid of time.
- doc.attendance = get_attendance_count(doc.students[0], doc.academic_year, doc.academic_term)
-
- template = (
- "erpnext/education/doctype/student_report_generation_tool/student_report_generation_tool.html"
- )
- base_template_path = "frappe/www/printview.html"
-
- from frappe.www.printview import get_letter_head
-
- letterhead = get_letter_head(
- frappe._dict({"letter_head": doc.letterhead}), not doc.add_letterhead
- )
-
- html = frappe.render_template(
- template,
- {
- "doc": doc,
- "assessment_result": assessment_result,
- "courses": courses,
- "assessment_groups": assessment_groups,
- "course_criteria": course_criteria,
- "letterhead": letterhead and letterhead.get("content", None),
- "add_letterhead": doc.add_letterhead if doc.add_letterhead else 0,
- },
- )
- final_template = frappe.render_template(
- base_template_path, {"body": html, "title": "Report Card"}
- )
-
- frappe.response.filename = "Report Card " + doc.students[0] + ".pdf"
- frappe.response.filecontent = get_pdf(final_template)
- frappe.response.type = "download"
-
-
-def get_courses_criteria(courses):
- course_criteria = frappe._dict()
- for course in courses:
- course_criteria[course] = [
- d.assessment_criteria
- for d in frappe.get_all(
- "Course Assessment Criteria", fields=["assessment_criteria"], filters={"parent": course}
- )
- ]
- return course_criteria
-
-
-def get_attendance_count(student, academic_year, academic_term=None):
- if academic_year:
- from_date, to_date = frappe.db.get_value(
- "Academic Year", academic_year, ["year_start_date", "year_end_date"]
- )
- elif academic_term:
- from_date, to_date = frappe.db.get_value(
- "Academic Term", academic_term, ["term_start_date", "term_end_date"]
- )
- if from_date and to_date:
- attendance = dict(
- frappe.db.sql(
- """select status, count(student) as no_of_days
- from `tabStudent Attendance` where student = %s and docstatus = 1
- and date between %s and %s group by status""",
- (student, from_date, to_date),
- )
- )
- if "Absent" not in attendance.keys():
- attendance["Absent"] = 0
- if "Present" not in attendance.keys():
- attendance["Present"] = 0
- return attendance
- else:
- frappe.throw(_("Provide the academic year and set the starting and ending date."))
diff --git a/erpnext/education/doctype/student_report_generation_tool/test_student_report_generation_tool.py b/erpnext/education/doctype/student_report_generation_tool/test_student_report_generation_tool.py
deleted file mode 100644
index e37881f..0000000
--- a/erpnext/education/doctype/student_report_generation_tool/test_student_report_generation_tool.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestStudentReportGenerationTool(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/student_sibling/__init__.py b/erpnext/education/doctype/student_sibling/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_sibling/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_sibling/student_sibling.json b/erpnext/education/doctype/student_sibling/student_sibling.json
deleted file mode 100644
index f67fe79..0000000
--- a/erpnext/education/doctype/student_sibling/student_sibling.json
+++ /dev/null
@@ -1,306 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-09-01 14:41:23.824083",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 0,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "studying_in_same_institute",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Studying in Same Institute",
- "length": 0,
- "no_copy": 0,
- "options": "NO\nYES",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 3,
- "fieldname": "full_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Full Name",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 1,
- "fieldname": "gender",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Gender",
- "length": 0,
- "no_copy": 0,
- "options": "\nMale\nFemale",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "print_width": "",
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_4",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.studying_in_same_institute == \"YES\"",
- "fieldname": "student",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Student ID",
- "length": 0,
- "no_copy": 0,
- "options": "Student",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 2,
- "depends_on": "eval:doc.studying_in_same_institute == \"NO\"",
- "fieldname": "institution",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Institution",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 2,
- "fieldname": "program",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Program",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 2,
- "fieldname": "date_of_birth",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Date of Birth",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-11-04 03:37:25.881487",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Sibling",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_sibling/student_sibling.py b/erpnext/education/doctype/student_sibling/student_sibling.py
deleted file mode 100644
index 9ee0667..0000000
--- a/erpnext/education/doctype/student_sibling/student_sibling.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentSibling(Document):
- pass
diff --git a/erpnext/education/doctype/student_siblings/__init__.py b/erpnext/education/doctype/student_siblings/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/student_siblings/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/student_siblings/student_siblings.json b/erpnext/education/doctype/student_siblings/student_siblings.json
deleted file mode 100644
index 9d91ad2..0000000
--- a/erpnext/education/doctype/student_siblings/student_siblings.json
+++ /dev/null
@@ -1,141 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2016-09-01 14:41:23.824083",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "name1",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Name",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "gender",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Gender",
- "length": 0,
- "no_copy": 0,
- "options": "\nMale\nFemale",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "date_of_birth",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Date of Birth",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 1,
- "max_attachments": 0,
- "modified": "2018-11-04 03:37:46.485218",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Siblings",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "restrict_to_domain": "Education",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/student_siblings/student_siblings.py b/erpnext/education/doctype/student_siblings/student_siblings.py
deleted file mode 100644
index ee89f4f..0000000
--- a/erpnext/education/doctype/student_siblings/student_siblings.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class StudentSiblings(Document):
- pass
diff --git a/erpnext/education/doctype/topic/__init__.py b/erpnext/education/doctype/topic/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/topic/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/topic/test_topic.py b/erpnext/education/doctype/topic/test_topic.py
deleted file mode 100644
index c11204a..0000000
--- a/erpnext/education/doctype/topic/test_topic.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-import frappe
-
-
-class TestTopic(unittest.TestCase):
- def setUp(self):
- make_topic_and_linked_content("_Test Topic 1", [{"type": "Article", "name": "_Test Article 1"}])
-
- def test_get_contents(self):
- topic = frappe.get_doc("Topic", "_Test Topic 1")
- contents = topic.get_contents()
- self.assertEqual(contents[0].doctype, "Article")
- self.assertEqual(contents[0].name, "_Test Article 1")
- frappe.db.rollback()
-
-
-def make_topic(name):
- try:
- topic = frappe.get_doc("Topic", name)
- except frappe.DoesNotExistError:
- topic = frappe.get_doc(
- {
- "doctype": "Topic",
- "topic_name": name,
- "topic_code": name,
- }
- ).insert()
- return topic.name
-
-
-def make_topic_and_linked_content(topic_name, content_dict_list):
- try:
- topic = frappe.get_doc("Topic", topic_name)
- except frappe.DoesNotExistError:
- make_topic(topic_name)
- topic = frappe.get_doc("Topic", topic_name)
- content_list = [make_content(content["type"], content["name"]) for content in content_dict_list]
- for content in content_list:
- topic.append("topic_content", {"content": content.title, "content_type": content.doctype})
- topic.save()
- return topic
-
-
-def make_content(type, name):
- try:
- content = frappe.get_doc(type, name)
- except frappe.DoesNotExistError:
- content = frappe.get_doc({"doctype": type, "title": name}).insert()
- return content
diff --git a/erpnext/education/doctype/topic/topic.js b/erpnext/education/doctype/topic/topic.js
deleted file mode 100644
index 0c903c5..0000000
--- a/erpnext/education/doctype/topic/topic.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Topic', {
- refresh: function(frm) {
- if (!cur_frm.doc.__islocal) {
- frm.add_custom_button(__('Add to Courses'), function() {
- frm.trigger('add_topic_to_courses');
- }, __('Action'));
- }
- },
-
- add_topic_to_courses: function(frm) {
- get_courses_without_topic(frm.doc.name).then(r => {
- if (r.message.length) {
- frappe.prompt([
- {
- fieldname: 'courses',
- label: __('Courses'),
- fieldtype: 'MultiSelectPills',
- get_data: function() {
- return r.message;
- }
- }
- ],
- function(data) {
- frappe.call({
- method: 'erpnext.education.doctype.topic.topic.add_topic_to_courses',
- args: {
- 'topic': frm.doc.name,
- 'courses': data.courses
- },
- callback: function(r) {
- if (!r.exc) {
- frm.reload_doc();
- }
- },
- freeze: true,
- freeze_message: __('...Adding Topic to Courses')
- });
- }, __('Add Topic to Courses'), __('Add'));
- } else {
- frappe.msgprint(__('This topic is already added to the existing courses'));
- }
- });
- }
-});
-
-let get_courses_without_topic = function(topic) {
- return frappe.call({
- type: 'GET',
- method: 'erpnext.education.doctype.topic.topic.get_courses_without_topic',
- args: {'topic': topic}
- });
-};
diff --git a/erpnext/education/doctype/topic/topic.json b/erpnext/education/doctype/topic/topic.json
deleted file mode 100644
index 305458b..0000000
--- a/erpnext/education/doctype/topic/topic.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:topic_name",
- "creation": "2018-12-12 11:37:39.917760",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "topic_name",
- "topic_content",
- "description",
- "hero_image"
- ],
- "fields": [
- {
- "fieldname": "topic_name",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Name",
- "reqd": 1,
- "unique": 1
- },
- {
- "fieldname": "topic_content",
- "fieldtype": "Table",
- "label": "Topic Content",
- "options": "Topic Content"
- },
- {
- "fieldname": "hero_image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "label": "Hero Image"
- },
- {
- "fieldname": "description",
- "fieldtype": "Small Text",
- "label": "Description"
- }
- ],
- "image_field": "hero_image",
- "modified": "2019-06-12 12:34:49.911300",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Topic",
- "owner": "Administrator",
- "permissions": [
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Administrator",
- "share": 1,
- "write": 1
- },
- {
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Instructor",
- "share": 1,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/topic/topic.py b/erpnext/education/doctype/topic/topic.py
deleted file mode 100644
index 6dd9655..0000000
--- a/erpnext/education/doctype/topic/topic.py
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import json
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class Topic(Document):
- def get_contents(self):
- try:
- topic_content_list = self.topic_content
- content_data = [
- frappe.get_doc(topic_content.content_type, topic_content.content)
- for topic_content in topic_content_list
- ]
- except Exception as e:
- frappe.log_error(frappe.get_traceback())
- return None
- return content_data
-
-
-@frappe.whitelist()
-def get_courses_without_topic(topic):
- data = []
- for entry in frappe.db.get_all("Course"):
- course = frappe.get_doc("Course", entry.name)
- topics = [t.topic for t in course.topics]
- if not topics or topic not in topics:
- data.append(course.name)
- return data
-
-
-@frappe.whitelist()
-def add_topic_to_courses(topic, courses, mandatory=False):
- courses = json.loads(courses)
- for entry in courses:
- course = frappe.get_doc("Course", entry)
- course.append("topics", {"topic": topic, "topic_name": topic})
- course.flags.ignore_mandatory = True
- course.save()
- frappe.db.commit()
- frappe.msgprint(
- _("Topic {0} has been added to all the selected courses successfully.").format(
- frappe.bold(topic)
- ),
- title=_("Courses updated"),
- indicator="green",
- )
-
-
-@frappe.whitelist()
-def add_content_to_topics(content_type, content, topics):
- topics = json.loads(topics)
- for entry in topics:
- topic = frappe.get_doc("Topic", entry)
- topic.append(
- "topic_content",
- {
- "content_type": content_type,
- "content": content,
- },
- )
- topic.flags.ignore_mandatory = True
- topic.save()
- frappe.db.commit()
- frappe.msgprint(
- _("{0} {1} has been added to all the selected topics successfully.").format(
- content_type, frappe.bold(content)
- ),
- title=_("Topics updated"),
- indicator="green",
- )
diff --git a/erpnext/education/doctype/topic_content/__init__.py b/erpnext/education/doctype/topic_content/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/doctype/topic_content/__init__.py
+++ /dev/null
diff --git a/erpnext/education/doctype/topic_content/test_topic_content.py b/erpnext/education/doctype/topic_content/test_topic_content.py
deleted file mode 100644
index 56bb409..0000000
--- a/erpnext/education/doctype/topic_content/test_topic_content.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-import unittest
-
-
-class TestTopicContent(unittest.TestCase):
- pass
diff --git a/erpnext/education/doctype/topic_content/topic_content.js b/erpnext/education/doctype/topic_content/topic_content.js
deleted file mode 100644
index 9cda0ca..0000000
--- a/erpnext/education/doctype/topic_content/topic_content.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('Topic Content', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/education/doctype/topic_content/topic_content.json b/erpnext/education/doctype/topic_content/topic_content.json
deleted file mode 100644
index 444fd1d..0000000
--- a/erpnext/education/doctype/topic_content/topic_content.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "creation": "2018-12-12 11:42:57.987434",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "content_type",
- "column_break_2",
- "content"
- ],
- "fields": [
- {
- "fieldname": "content_type",
- "fieldtype": "Select",
- "in_list_view": 1,
- "label": "Content Type",
- "options": "\nArticle\nVideo\nQuiz",
- "reqd": 1
- },
- {
- "fieldname": "column_break_2",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "content",
- "fieldtype": "Dynamic Link",
- "in_list_view": 1,
- "label": "Content",
- "options": "content_type",
- "reqd": 1
- }
- ],
- "istable": 1,
- "modified": "2019-05-14 11:12:49.153771",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Topic Content",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/doctype/topic_content/topic_content.py b/erpnext/education/doctype/topic_content/topic_content.py
deleted file mode 100644
index 88d0eee..0000000
--- a/erpnext/education/doctype/topic_content/topic_content.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from frappe.model.document import Document
-
-
-class TopicContent(Document):
- pass
diff --git a/erpnext/education/education_dashboard/education/education.json b/erpnext/education/education_dashboard/education/education.json
deleted file mode 100644
index 41d3375..0000000
--- a/erpnext/education/education_dashboard/education/education.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "cards": [
- {
- "card": "Total Students"
- },
- {
- "card": "Total Instructors"
- },
- {
- "card": "Program Enrollments"
- },
- {
- "card": "Student Applicants to Review"
- }
- ],
- "charts": [
- {
- "chart": "Program Enrollments",
- "width": "Full"
- },
- {
- "chart": "Program wise Enrollment",
- "width": "Half"
- },
- {
- "chart": "Course wise Enrollment",
- "width": "Half"
- },
- {
- "chart": "Course wise Student Count",
- "width": "Half"
- },
- {
- "chart": "Student Category wise Program Enrollments",
- "width": "Half"
- },
- {
- "chart": "Student Gender Diversity Ratio",
- "width": "Half"
- },
- {
- "chart": "Instructor Gender Diversity Ratio",
- "width": "Half"
- },
- {
- "chart": "Program wise Fee Collection",
- "width": "Full"
- }
- ],
- "creation": "2020-07-22 18:51:02.195762",
- "dashboard_name": "Education",
- "docstatus": 0,
- "doctype": "Dashboard",
- "idx": 0,
- "is_default": 0,
- "is_standard": 1,
- "modified": "2020-08-05 16:22:17.428101",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Education",
- "owner": "Administrator"
-}
\ No newline at end of file
diff --git a/erpnext/education/module_onboarding/education/education.json b/erpnext/education/module_onboarding/education/education.json
deleted file mode 100644
index e5f0fec..0000000
--- a/erpnext/education/module_onboarding/education/education.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "allow_roles": [
- {
- "role": "Education Manager"
- }
- ],
- "creation": "2020-07-27 19:02:49.561391",
- "docstatus": 0,
- "doctype": "Module Onboarding",
- "documentation_url": "https://docs.erpnext.com/docs/user/manual/en/education",
- "idx": 0,
- "is_complete": 0,
- "modified": "2020-07-27 21:10:46.722961",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Education",
- "owner": "Administrator",
- "steps": [
- {
- "step": "Create a Student"
- },
- {
- "step": "Create an Instructor"
- },
- {
- "step": "Introduction to Program and Courses"
- },
- {
- "step": "Create a Topic"
- },
- {
- "step": "Create a Course"
- },
- {
- "step": "Create a Program"
- },
- {
- "step": "Enroll a Student in a Program"
- },
- {
- "step": "Introduction to Student Group"
- },
- {
- "step": "Introduction to Student Attendance"
- }
- ],
- "subtitle": "Students, Instructors, Programs and more.",
- "success_message": "The Education Module is all set up!",
- "title": "Let's Set Up the Education Module."
-}
diff --git a/erpnext/education/number_card/program_enrollments/program_enrollments.json b/erpnext/education/number_card/program_enrollments/program_enrollments.json
deleted file mode 100644
index 5847679..0000000
--- a/erpnext/education/number_card/program_enrollments/program_enrollments.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "aggregate_function_based_on": "",
- "creation": "2020-07-27 18:26:27.005186",
- "docstatus": 0,
- "doctype": "Number Card",
- "document_type": "Program Enrollment",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Program Enrollment\",\"docstatus\",\"=\",\"1\",false],[\"Program Enrollment\",\"enrollment_date\",\"Timespan\",\"this year\",false]]",
- "function": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "label": "Program Enrollments",
- "modified": "2020-07-27 18:26:32.512624",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program Enrollments",
- "owner": "Administrator",
- "report_function": "Sum",
- "show_percentage_stats": 1,
- "stats_time_interval": "Yearly",
- "type": "Document Type"
-}
\ No newline at end of file
diff --git a/erpnext/education/number_card/student_applicants_to_review/student_applicants_to_review.json b/erpnext/education/number_card/student_applicants_to_review/student_applicants_to_review.json
deleted file mode 100644
index 258667a..0000000
--- a/erpnext/education/number_card/student_applicants_to_review/student_applicants_to_review.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "aggregate_function_based_on": "",
- "creation": "2020-07-27 18:42:33.366862",
- "docstatus": 0,
- "doctype": "Number Card",
- "document_type": "Student Applicant",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Student Applicant\",\"application_status\",\"=\",\"Applied\",false]]",
- "function": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "label": "Student Applicants to Review",
- "modified": "2020-07-27 18:42:42.739710",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Applicants to Review",
- "owner": "Administrator",
- "report_function": "Sum",
- "show_percentage_stats": 1,
- "stats_time_interval": "Monthly",
- "type": "Document Type"
-}
\ No newline at end of file
diff --git a/erpnext/education/number_card/total_instructors/total_instructors.json b/erpnext/education/number_card/total_instructors/total_instructors.json
deleted file mode 100644
index b8d3cc0..0000000
--- a/erpnext/education/number_card/total_instructors/total_instructors.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "aggregate_function_based_on": "",
- "creation": "2020-07-23 14:19:38.423190",
- "docstatus": 0,
- "doctype": "Number Card",
- "document_type": "Instructor",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Instructor\",\"status\",\"=\",\"Active\",false]]",
- "function": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "label": "Total Instructors",
- "modified": "2020-07-23 14:19:47.623306",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Total Instructors",
- "owner": "Administrator",
- "report_function": "Sum",
- "show_percentage_stats": 1,
- "stats_time_interval": "Monthly",
- "type": "Document Type"
-}
\ No newline at end of file
diff --git a/erpnext/education/number_card/total_students/total_students.json b/erpnext/education/number_card/total_students/total_students.json
deleted file mode 100644
index 109c3d8..0000000
--- a/erpnext/education/number_card/total_students/total_students.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "aggregate_function_based_on": "",
- "creation": "2020-07-23 14:18:07.732298",
- "docstatus": 0,
- "doctype": "Number Card",
- "document_type": "Student",
- "dynamic_filters_json": "[]",
- "filters_json": "[[\"Student\",\"enabled\",\"=\",1,false]]",
- "function": "Count",
- "idx": 0,
- "is_public": 1,
- "is_standard": 1,
- "label": "Total Students",
- "modified": "2020-07-23 14:18:40.603947",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Total Students",
- "owner": "Administrator",
- "report_function": "Sum",
- "show_percentage_stats": 1,
- "stats_time_interval": "Monthly",
- "type": "Document Type"
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/create_a_course/create_a_course.json b/erpnext/education/onboarding_step/create_a_course/create_a_course.json
deleted file mode 100644
index 02eee14..0000000
--- a/erpnext/education/onboarding_step/create_a_course/create_a_course.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "action": "Create Entry",
- "creation": "2020-07-27 19:09:04.493932",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 0,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 19:09:04.493932",
- "modified_by": "Administrator",
- "name": "Create a Course",
- "owner": "Administrator",
- "reference_document": "Course",
- "show_full_form": 1,
- "title": "Create a Course",
- "validate_action": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/create_a_program/create_a_program.json b/erpnext/education/onboarding_step/create_a_program/create_a_program.json
deleted file mode 100644
index 6172630..0000000
--- a/erpnext/education/onboarding_step/create_a_program/create_a_program.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "action": "Create Entry",
- "creation": "2020-07-27 19:09:35.451945",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 0,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 19:09:35.451945",
- "modified_by": "Administrator",
- "name": "Create a Program",
- "owner": "Administrator",
- "reference_document": "Program",
- "show_full_form": 1,
- "title": "Create a Program",
- "validate_action": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/create_a_student/create_a_student.json b/erpnext/education/onboarding_step/create_a_student/create_a_student.json
deleted file mode 100644
index 07c3f73..0000000
--- a/erpnext/education/onboarding_step/create_a_student/create_a_student.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "action": "Create Entry",
- "creation": "2020-07-27 19:17:20.326837",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 1,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 19:49:47.724289",
- "modified_by": "Administrator",
- "name": "Create a Student",
- "owner": "Administrator",
- "reference_document": "Student",
- "show_full_form": 1,
- "title": "Create a Student",
- "validate_action": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/create_a_topic/create_a_topic.json b/erpnext/education/onboarding_step/create_a_topic/create_a_topic.json
deleted file mode 100644
index 96a5364..0000000
--- a/erpnext/education/onboarding_step/create_a_topic/create_a_topic.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "action": "Create Entry",
- "creation": "2020-07-27 19:08:40.754534",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 0,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 19:09:13.231995",
- "modified_by": "Administrator",
- "name": "Create a Topic",
- "owner": "Administrator",
- "reference_document": "Topic",
- "show_full_form": 1,
- "title": "Create a Topic",
- "validate_action": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/create_an_instructor/create_an_instructor.json b/erpnext/education/onboarding_step/create_an_instructor/create_an_instructor.json
deleted file mode 100644
index 419d6e0..0000000
--- a/erpnext/education/onboarding_step/create_an_instructor/create_an_instructor.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "action": "Create Entry",
- "creation": "2020-07-27 19:17:39.158037",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 1,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 19:49:47.723494",
- "modified_by": "Administrator",
- "name": "Create an Instructor",
- "owner": "Administrator",
- "reference_document": "Instructor",
- "show_full_form": 1,
- "title": "Create an Instructor",
- "validate_action": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/enroll_a_student_in_a_program/enroll_a_student_in_a_program.json b/erpnext/education/onboarding_step/enroll_a_student_in_a_program/enroll_a_student_in_a_program.json
deleted file mode 100644
index 61e48cd..0000000
--- a/erpnext/education/onboarding_step/enroll_a_student_in_a_program/enroll_a_student_in_a_program.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "action": "Create Entry",
- "creation": "2020-07-27 19:10:28.530226",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 0,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 19:10:28.530226",
- "modified_by": "Administrator",
- "name": "Enroll a Student in a Program",
- "owner": "Administrator",
- "reference_document": "Program Enrollment",
- "show_full_form": 0,
- "title": "Enroll a Student in a Program",
- "validate_action": 1
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/introduction_to_program_and_courses/introduction_to_program_and_courses.json b/erpnext/education/onboarding_step/introduction_to_program_and_courses/introduction_to_program_and_courses.json
deleted file mode 100644
index a9ddfc0..0000000
--- a/erpnext/education/onboarding_step/introduction_to_program_and_courses/introduction_to_program_and_courses.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "action": "Watch Video",
- "creation": "2020-07-27 19:05:12.663987",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 0,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 20:18:11.831789",
- "modified_by": "Administrator",
- "name": "Introduction to Program and Courses",
- "owner": "Administrator",
- "show_full_form": 0,
- "title": "Introduction to Program and Courses",
- "validate_action": 1,
- "video_url": "https://www.youtube.com/watch?v=1ueE4seFTp8"
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/introduction_to_student_attendance/introduction_to_student_attendance.json b/erpnext/education/onboarding_step/introduction_to_student_attendance/introduction_to_student_attendance.json
deleted file mode 100644
index 3de9972..0000000
--- a/erpnext/education/onboarding_step/introduction_to_student_attendance/introduction_to_student_attendance.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "action": "Watch Video",
- "creation": "2020-07-27 19:14:57.176131",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 0,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 19:55:55.411032",
- "modified_by": "Administrator",
- "name": "Introduction to Student Attendance",
- "owner": "Administrator",
- "show_full_form": 0,
- "title": "Introduction to Student Attendance",
- "validate_action": 1,
- "video_url": "https://youtu.be/j9pgkPuyiaI"
-}
\ No newline at end of file
diff --git a/erpnext/education/onboarding_step/introduction_to_student_group/introduction_to_student_group.json b/erpnext/education/onboarding_step/introduction_to_student_group/introduction_to_student_group.json
deleted file mode 100644
index 74bdcd1..0000000
--- a/erpnext/education/onboarding_step/introduction_to_student_group/introduction_to_student_group.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "action": "Watch Video",
- "creation": "2020-07-27 19:12:05.046465",
- "docstatus": 0,
- "doctype": "Onboarding Step",
- "idx": 0,
- "is_complete": 0,
- "is_mandatory": 0,
- "is_single": 0,
- "is_skipped": 0,
- "modified": "2020-07-27 19:42:47.286441",
- "modified_by": "Administrator",
- "name": "Introduction to Student Group",
- "owner": "Administrator",
- "reference_document": "Student Group",
- "show_full_form": 0,
- "title": "Introduction to Student Group",
- "validate_action": 1,
- "video_url": "https://youtu.be/5K_smeeE1Q4"
-}
\ No newline at end of file
diff --git a/erpnext/education/report/__init__.py b/erpnext/education/report/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/absent_student_report/__init__.py b/erpnext/education/report/absent_student_report/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/absent_student_report/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/absent_student_report/absent_student_report.js b/erpnext/education/report/absent_student_report/absent_student_report.js
deleted file mode 100644
index bf2d10d..0000000
--- a/erpnext/education/report/absent_student_report/absent_student_report.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-
-frappe.query_reports["Absent Student Report"] = {
- "filters": [
- {
- "fieldname":"date",
- "label": __("Date"),
- "fieldtype": "Date",
- "default": frappe.datetime.get_today(),
- "reqd": 1
- }
- ]
-}
diff --git a/erpnext/education/report/absent_student_report/absent_student_report.json b/erpnext/education/report/absent_student_report/absent_student_report.json
deleted file mode 100644
index 92ad860..0000000
--- a/erpnext/education/report/absent_student_report/absent_student_report.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "add_total_row": 0,
- "creation": "2013-05-13 14:04:03",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 3,
- "is_standard": "Yes",
- "modified": "2020-06-24 17:16:40.251116",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Absent Student Report",
- "owner": "Administrator",
- "prepared_report": 0,
- "ref_doctype": "Student Attendance",
- "report_name": "Absent Student Report",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "Academics User"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/report/absent_student_report/absent_student_report.py b/erpnext/education/report/absent_student_report/absent_student_report.py
deleted file mode 100644
index ac27f71..0000000
--- a/erpnext/education/report/absent_student_report/absent_student_report.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-
-import frappe
-from frappe import _, msgprint
-from frappe.utils import formatdate
-
-from erpnext.education.doctype.student_attendance.student_attendance import get_holiday_list
-from erpnext.hr.doctype.holiday_list.holiday_list import is_holiday
-
-
-def execute(filters=None):
- if not filters:
- filters = {}
-
- if not filters.get("date"):
- msgprint(_("Please select date"), raise_exception=1)
-
- columns = get_columns(filters)
- date = filters.get("date")
-
- holiday_list = get_holiday_list()
- if is_holiday(holiday_list, filters.get("date")):
- msgprint(
- _("No attendance has been marked for {0} as it is a Holiday").format(
- frappe.bold(formatdate(filters.get("date")))
- )
- )
-
- absent_students = get_absent_students(date)
- leave_applicants = get_leave_applications(date)
- if absent_students:
- student_list = [d["student"] for d in absent_students]
- transportation_details = get_transportation_details(date, student_list)
-
- data = []
- for student in absent_students:
- if not student.student in leave_applicants:
- row = [student.student, student.student_name, student.student_group]
- stud_details = frappe.db.get_value(
- "Student", student.student, ["student_email_id", "student_mobile_number"], as_dict=True
- )
-
- if stud_details.student_email_id:
- row += [stud_details.student_email_id]
- else:
- row += [""]
-
- if stud_details.student_mobile_number:
- row += [stud_details.student_mobile_number]
- else:
- row += [""]
- if transportation_details.get(student.student):
- row += transportation_details.get(student.student)
-
- data.append(row)
-
- return columns, data
-
-
-def get_columns(filters):
- columns = [
- _("Student") + ":Link/Student:90",
- _("Student Name") + "::150",
- _("Student Group") + "::180",
- _("Student Email Address") + "::180",
- _("Student Mobile No.") + "::150",
- _("Mode of Transportation") + "::150",
- _("Vehicle/Bus Number") + "::150",
- ]
- return columns
-
-
-def get_absent_students(date):
- absent_students = frappe.db.sql(
- """
- SELECT student, student_name, student_group
- FROM `tabStudent Attendance`
- WHERE
- status='Absent' and docstatus=1 and date = %s
- ORDER BY
- student_group, student_name""",
- date,
- as_dict=1,
- )
- return absent_students
-
-
-def get_leave_applications(date):
- leave_applicants = []
- leave_applications = frappe.db.sql(
- """
- SELECT student
- FROM
- `tabStudent Leave Application`
- WHERE
- docstatus = 1 and mark_as_present = 1 and
- from_date <= %s and to_date >= %s
- """,
- (date, date),
- )
- for student in leave_applications:
- leave_applicants.append(student[0])
-
- return leave_applicants
-
-
-def get_transportation_details(date, student_list):
- academic_year = frappe.get_all(
- "Academic Year", filters=[["year_start_date", "<=", date], ["year_end_date", ">=", date]]
- )
- if academic_year:
- academic_year = academic_year[0].name
- elif frappe.defaults.get_defaults().academic_year:
- academic_year = frappe.defaults.get_defaults().academic_year
- else:
- return {}
-
- transportation_details = frappe.get_all(
- "Program Enrollment",
- fields=["student", "mode_of_transportation", "vehicle_no"],
- filters={
- "student": ("in", student_list),
- "academic_year": academic_year,
- "docstatus": ("not in", ["2"]),
- },
- )
- transportation_map = {}
- for d in transportation_details:
- transportation_map[d.student] = [d.mode_of_transportation, d.vehicle_no]
- return transportation_map
diff --git a/erpnext/education/report/assessment_plan_status/__init__.py b/erpnext/education/report/assessment_plan_status/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/assessment_plan_status/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/assessment_plan_status/assessment_plan_status.js b/erpnext/education/report/assessment_plan_status/assessment_plan_status.js
deleted file mode 100644
index 2d1eb09..0000000
--- a/erpnext/education/report/assessment_plan_status/assessment_plan_status.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-/* eslint-disable */
-
-frappe.query_reports["Assessment Plan Status"] = {
- "filters": [
- {
- "fieldname":"assessment_group",
- "label": __("Assessment Group"),
- "fieldtype": "Link",
- "options": "Assessment Group",
- "get_query": function() {
- return{
- filters: {
- 'is_group': 0
- }
- };
- }
- },
- {
- "fieldname":"schedule_date",
- "label": __("Scheduled Upto"),
- "fieldtype": "Date",
- "options": ""
- }
-
- ]
-}
diff --git a/erpnext/education/report/assessment_plan_status/assessment_plan_status.json b/erpnext/education/report/assessment_plan_status/assessment_plan_status.json
deleted file mode 100644
index cbca648..0000000
--- a/erpnext/education/report/assessment_plan_status/assessment_plan_status.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "add_total_row": 0,
- "creation": "2017-11-09 15:07:30.404428",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 0,
- "is_standard": "Yes",
- "modified": "2020-06-24 17:16:02.027410",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Assessment Plan Status",
- "owner": "Administrator",
- "prepared_report": 0,
- "ref_doctype": "Assessment Plan",
- "report_name": "Assessment Plan Status",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "Academics User"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/report/assessment_plan_status/assessment_plan_status.py b/erpnext/education/report/assessment_plan_status/assessment_plan_status.py
deleted file mode 100644
index 7cf5b30..0000000
--- a/erpnext/education/report/assessment_plan_status/assessment_plan_status.py
+++ /dev/null
@@ -1,187 +0,0 @@
-# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from itertools import groupby
-
-import frappe
-from frappe import _
-from frappe.utils import cint
-
-DOCSTATUS = {
- 0: "saved",
- 1: "submitted",
-}
-
-
-def execute(filters=None):
- columns, data = [], []
-
- args = frappe._dict()
- args["assessment_group"] = filters.get("assessment_group")
- args["schedule_date"] = filters.get("schedule_date")
-
- columns = get_column()
-
- data, chart = get_assessment_data(args)
-
- return columns, data, None, chart
-
-
-def get_assessment_data(args=None):
-
- # [total, saved, submitted, remaining]
- chart_data = [0, 0, 0, 0]
-
- condition = ""
- if args["assessment_group"]:
- condition += "and assessment_group = %(assessment_group)s"
- if args["schedule_date"]:
- condition += "and schedule_date <= %(schedule_date)s"
-
- assessment_plan = frappe.db.sql(
- """
- SELECT
- ap.name as assessment_plan,
- ap.assessment_name,
- ap.student_group,
- ap.schedule_date,
- (select count(*) from `tabStudent Group Student` sgs where sgs.parent=ap.student_group)
- as student_group_strength
- FROM
- `tabAssessment Plan` ap
- WHERE
- ap.docstatus = 1 {condition}
- ORDER BY
- ap.modified desc
- """.format(
- condition=condition
- ),
- (args),
- as_dict=1,
- )
-
- assessment_plan_list = [d.assessment_plan for d in assessment_plan] if assessment_plan else [""]
- assessment_result = get_assessment_result(assessment_plan_list)
-
- for d in assessment_plan:
-
- assessment_plan_details = assessment_result.get(d.assessment_plan)
- assessment_plan_details = (
- frappe._dict() if not assessment_plan_details else frappe._dict(assessment_plan_details)
- )
- if "saved" not in assessment_plan_details:
- assessment_plan_details.update({"saved": 0})
- if "submitted" not in assessment_plan_details:
- assessment_plan_details.update({"submitted": 0})
-
- # remaining students whose marks not entered
- remaining_students = (
- cint(d.student_group_strength)
- - cint(assessment_plan_details.saved)
- - cint(assessment_plan_details.submitted)
- )
- assessment_plan_details.update({"remaining": remaining_students})
- d.update(assessment_plan_details)
-
- chart_data[0] += cint(d.student_group_strength)
- chart_data[1] += assessment_plan_details.saved
- chart_data[2] += assessment_plan_details.submitted
- chart_data[3] += assessment_plan_details.remaining
-
- chart = get_chart(chart_data[1:])
-
- return assessment_plan, chart
-
-
-def get_assessment_result(assessment_plan_list):
- assessment_result_dict = frappe._dict()
-
- assessment_result = frappe.db.sql(
- """
- SELECT
- assessment_plan, docstatus, count(*) as count
- FROM
- `tabAssessment Result`
- WHERE
- assessment_plan in (%s)
- GROUP BY
- assessment_plan, docstatus
- ORDER BY
- assessment_plan
- """
- % ", ".join(["%s"] * len(assessment_plan_list)),
- tuple(assessment_plan_list),
- as_dict=1,
- )
-
- for key, group in groupby(assessment_result, lambda ap: ap["assessment_plan"]):
- tmp = {}
- for d in group:
- if d.docstatus in [0, 1]:
- tmp.update({DOCSTATUS[d.docstatus]: d.count})
- assessment_result_dict[key] = tmp
-
- return assessment_result_dict
-
-
-def get_chart(chart_data):
- return {
- "data": {"labels": ["Saved", "Submitted", "Remaining"], "datasets": [{"values": chart_data}]},
- "type": "percentage",
- }
-
-
-def get_column():
- return [
- {
- "fieldname": "assessment_plan",
- "label": _("Assessment Plan"),
- "fieldtype": "Link",
- "options": "Assessment Plan",
- "width": 120,
- },
- {
- "fieldname": "assessment_name",
- "label": _("Assessment Plan Name"),
- "fieldtype": "Data",
- "options": "",
- "width": 200,
- },
- {
- "fieldname": "schedule_date",
- "label": _("Schedule Date"),
- "fieldtype": "Date",
- "options": "",
- "width": 100,
- },
- {
- "fieldname": "student_group",
- "label": _("Student Group"),
- "fieldtype": "Link",
- "options": "Student Group",
- "width": 200,
- },
- {
- "fieldname": "student_group_strength",
- "label": _("Total Student"),
- "fieldtype": "Data",
- "options": "",
- "width": 100,
- },
- {
- "fieldname": "submitted",
- "label": _("Submitted"),
- "fieldtype": "Data",
- "options": "",
- "width": 100,
- },
- {"fieldname": "saved", "label": _("Saved"), "fieldtype": "Data", "options": "", "width": 100},
- {
- "fieldname": "remaining",
- "label": _("Remaining"),
- "fieldtype": "Data",
- "options": "",
- "width": 100,
- },
- ]
diff --git a/erpnext/education/report/course_wise_assessment_report/__init__.py b/erpnext/education/report/course_wise_assessment_report/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/course_wise_assessment_report/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.html b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.html
deleted file mode 100644
index 33e725f..0000000
--- a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.html
+++ /dev/null
@@ -1,50 +0,0 @@
-{%
- var letterhead = filters.letter_head || (frappe.get_doc(":Company", filters.company) && frappe.get_doc(":Company", filters.company).default_letter_head) || frappe.defaults.get_default("letter_head");
- var report_columns = report.get_columns_for_print();
-%}
-{% if(letterhead) { %}
-<div style="margin-bottom: 7px;" class="text-center">
- {%= frappe.boot.letter_heads[letterhead].header %}
-</div>
-{% } %}
-<h4 class="text-center">{%= __("Assessment Report") %}</h4>
-<hr>
-<h5 class="text-center">{%= __("Academic Year: ") %} {%= filters.academic_year %} </h5>
-{% if (filters.academic_term){ %}
-<h5 class="text-center">{%= __("Academic Term: ") %} {%= filters.academic_term %} </h5>
-{% } %}
-<h5 class="text-center">{%= __("Course Code: ") %} {%= filters.course %}</h5>
-<h5 class="text-center">{%= __("Assessment Group: ") %} {%= filters.assessment_group %}</h5>
-{% if (filters.student_group){ %}
-<h5 class="text-center">{%= __("Student Group: ") %} {%= filters.student_group %} </h5>
-{% } %}
-<hr>
-
-<table class="table table-bordered">
- <thead>
- <tr>
- {% for(var i=1, l=report_columns.length; i<l; i++) { %}
- <th style="text-transform: uppercase; max-width: 100px">{%= report_columns[i].label %}</th>
- {% } %}
- </tr>
- </thead>
- <tbody>
- {% for(var j=0, k=data.length; j<k; j++) { %}
- {%
- var row = data[j];
- %}
- <tr>
- {% for(var i=1, l=report_columns.length; i<l; i++) { %}
- <td class="text-center">
- {% var fieldname = report_columns[i].fieldname; %}
- {% if (!is_null(row[fieldname])) { %}
- {%= row[fieldname] %}
- {% } %}
- </td>
- {% } %}
- </tr>
- {% } %}
- </tbody>
-</table>
-
-<p class="text-right text-muted">Printed On {%= frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) %}</p>
diff --git a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.js b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.js
deleted file mode 100644
index 8c42d48..0000000
--- a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.query_reports["Course wise Assessment Report"] = {
- "filters": [
- {
- "fieldname":"academic_year",
- "label": __("Academic Year"),
- "fieldtype": "Link",
- "options": "Academic Year",
- "reqd": 1
- },
- {
- "fieldname":"academic_term",
- "label": __("Academic Term"),
- "fieldtype": "Link",
- "options": "Academic Term"
- },
- {
- "fieldname":"course",
- "label": __("Course"),
- "fieldtype": "Link",
- "options": "Course",
- "reqd": 1
- },
- {
- "fieldname":"student_group",
- "label": __("Student Group"),
- "fieldtype": "Link",
- "options": "Student Group"
- },
- {
- "fieldname":"assessment_group",
- "label": __("Assessment Group"),
- "fieldtype": "Link",
- "options": "Assessment Group",
- "reqd": 1
- }
- ]
-};
diff --git a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.json b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.json
deleted file mode 100644
index 416db9d..0000000
--- a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "add_total_row": 0,
- "creation": "2017-05-05 14:46:13.776133",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 0,
- "is_standard": "Yes",
- "modified": "2020-06-24 17:15:15.477530",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Course wise Assessment Report",
- "owner": "Administrator",
- "prepared_report": 0,
- "query": "",
- "ref_doctype": "Assessment Result",
- "report_name": "Course wise Assessment Report",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "Instructor"
- },
- {
- "role": "Education Manager"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py
deleted file mode 100644
index 0930882..0000000
--- a/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py
+++ /dev/null
@@ -1,303 +0,0 @@
-# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from collections import OrderedDict, defaultdict
-
-import frappe
-from frappe import _
-
-from erpnext.education.api import get_grade
-
-
-def execute(filters=None):
- data, chart, grades = [], [], []
- args = frappe._dict()
- grade_wise_analysis = defaultdict(dict)
-
- args["academic_year"] = filters.get("academic_year")
- args["course"] = filters.get("course")
- args["assessment_group"] = filters.get("assessment_group")
-
- args["academic_term"] = filters.get("academic_term")
- args["student_group"] = filters.get("student_group")
-
- if args["assessment_group"] == "All Assessment Groups":
- frappe.throw(_("Please select the assessment group other than 'All Assessment Groups'"))
-
- returned_values = get_formatted_result(args, get_assessment_criteria=True)
- student_dict = returned_values["student_details"]
- result_dict = returned_values["assessment_result"]
- assessment_criteria_dict = returned_values["assessment_criteria"]
-
- for student in result_dict:
- student_row = {}
- student_row["student"] = student
- student_row["student_name"] = student_dict[student]
- for criteria in assessment_criteria_dict:
- scrub_criteria = frappe.scrub(criteria)
- if criteria in result_dict[student][args.course][args.assessment_group]:
- student_row[scrub_criteria] = result_dict[student][args.course][args.assessment_group][
- criteria
- ]["grade"]
- student_row[scrub_criteria + "_score"] = result_dict[student][args.course][
- args.assessment_group
- ][criteria]["score"]
-
- # create the list of possible grades
- if student_row[scrub_criteria] not in grades:
- grades.append(student_row[scrub_criteria])
-
- # create the dict of for gradewise analysis
- if student_row[scrub_criteria] not in grade_wise_analysis[criteria]:
- grade_wise_analysis[criteria][student_row[scrub_criteria]] = 1
- else:
- grade_wise_analysis[criteria][student_row[scrub_criteria]] += 1
- else:
- student_row[frappe.scrub(criteria)] = ""
- student_row[frappe.scrub(criteria) + "_score"] = ""
- data.append(student_row)
-
- assessment_criteria_list = [d for d in assessment_criteria_dict]
- columns = get_column(assessment_criteria_dict)
- chart = get_chart_data(grades, assessment_criteria_list, grade_wise_analysis)
-
- return columns, data, None, chart
-
-
-def get_formatted_result(
- args, get_assessment_criteria=False, get_course=False, get_all_assessment_groups=False
-):
- cond, cond1, cond2, cond3, cond4 = " ", " ", " ", " ", " "
- args_list = [args.academic_year]
-
- if args.course:
- cond = " and ar.course=%s"
- args_list.append(args.course)
-
- if args.academic_term:
- cond1 = " and ar.academic_term=%s"
- args_list.append(args.academic_term)
-
- if args.student_group:
- cond2 = " and ar.student_group=%s"
- args_list.append(args.student_group)
-
- create_total_dict = False
-
- assessment_groups = get_child_assessment_groups(args.assessment_group)
- cond3 = " and ar.assessment_group in (%s)" % (", ".join(["%s"] * len(assessment_groups)))
- args_list += assessment_groups
-
- if args.students:
- cond4 = " and ar.student in (%s)" % (", ".join(["%s"] * len(args.students)))
- args_list += args.students
-
- assessment_result = frappe.db.sql(
- """
- SELECT
- ar.student, ar.student_name, ar.academic_year, ar.academic_term, ar.program, ar.course,
- ar.assessment_plan, ar.grading_scale, ar.assessment_group, ar.student_group,
- ard.assessment_criteria, ard.maximum_score, ard.grade, ard.score
- FROM
- `tabAssessment Result` ar, `tabAssessment Result Detail` ard
- WHERE
- ar.name=ard.parent and ar.docstatus=1 and ar.academic_year=%s {0} {1} {2} {3} {4}
- ORDER BY
- ard.assessment_criteria""".format(
- cond, cond1, cond2, cond3, cond4
- ),
- tuple(args_list),
- as_dict=1,
- )
-
- # create the nested dictionary structure as given below:
- # <variable_name>.<student_name>.<course>.<assessment_group>.<assessment_criteria>.<grade/score/max_score>
- # "Final Grade" -> assessment criteria used for totaling and args.assessment_group -> for totaling all the assesments
-
- student_details = {}
- formatted_assessment_result = defaultdict(dict)
- assessment_criteria_dict = OrderedDict()
- course_dict = OrderedDict()
- total_maximum_score = None
- if not (len(assessment_groups) == 1 and assessment_groups[0] == args.assessment_group):
- create_total_dict = True
-
- # add the score for a given score and recalculate the grades
- def add_score_and_recalculate_grade(result, assessment_group, assessment_criteria):
- formatted_assessment_result[result.student][result.course][assessment_group][
- assessment_criteria
- ]["maximum_score"] += result.maximum_score
- formatted_assessment_result[result.student][result.course][assessment_group][
- assessment_criteria
- ]["score"] += result.score
- tmp_grade = get_grade(
- result.grading_scale,
- (
- (
- formatted_assessment_result[result.student][result.course][assessment_group][
- assessment_criteria
- ]["score"]
- )
- / (
- formatted_assessment_result[result.student][result.course][assessment_group][
- assessment_criteria
- ]["maximum_score"]
- )
- )
- * 100,
- )
- formatted_assessment_result[result.student][result.course][assessment_group][
- assessment_criteria
- ]["grade"] = tmp_grade
-
- # create the assessment criteria "Final Grade" with the sum of all the scores of the assessment criteria in a given assessment group
- def add_total_score(result, assessment_group):
- if (
- "Final Grade"
- not in formatted_assessment_result[result.student][result.course][assessment_group]
- ):
- formatted_assessment_result[result.student][result.course][assessment_group][
- "Final Grade"
- ] = frappe._dict(
- {
- "assessment_criteria": "Final Grade",
- "maximum_score": result.maximum_score,
- "score": result.score,
- "grade": result.grade,
- }
- )
- else:
- add_score_and_recalculate_grade(result, assessment_group, "Final Grade")
-
- for result in assessment_result:
- if result.student not in student_details:
- student_details[result.student] = result.student_name
-
- assessment_criteria_details = frappe._dict(
- {
- "assessment_criteria": result.assessment_criteria,
- "maximum_score": result.maximum_score,
- "score": result.score,
- "grade": result.grade,
- }
- )
-
- if not formatted_assessment_result[result.student]:
- formatted_assessment_result[result.student] = defaultdict(dict)
- if not formatted_assessment_result[result.student][result.course]:
- formatted_assessment_result[result.student][result.course] = defaultdict(dict)
-
- if not create_total_dict:
- formatted_assessment_result[result.student][result.course][result.assessment_group][
- result.assessment_criteria
- ] = assessment_criteria_details
- add_total_score(result, result.assessment_group)
-
- # create the total of all the assessment groups criteria-wise
- elif create_total_dict:
- if get_all_assessment_groups:
- formatted_assessment_result[result.student][result.course][result.assessment_group][
- result.assessment_criteria
- ] = assessment_criteria_details
- if not formatted_assessment_result[result.student][result.course][args.assessment_group]:
- formatted_assessment_result[result.student][result.course][
- args.assessment_group
- ] = defaultdict(dict)
- formatted_assessment_result[result.student][result.course][args.assessment_group][
- result.assessment_criteria
- ] = assessment_criteria_details
- elif (
- result.assessment_criteria
- not in formatted_assessment_result[result.student][result.course][args.assessment_group]
- ):
- formatted_assessment_result[result.student][result.course][args.assessment_group][
- result.assessment_criteria
- ] = assessment_criteria_details
- elif (
- result.assessment_criteria
- in formatted_assessment_result[result.student][result.course][args.assessment_group]
- ):
- add_score_and_recalculate_grade(result, args.assessment_group, result.assessment_criteria)
-
- add_total_score(result, args.assessment_group)
-
- total_maximum_score = formatted_assessment_result[result.student][result.course][
- args.assessment_group
- ]["Final Grade"]["maximum_score"]
- if get_assessment_criteria:
- assessment_criteria_dict[result.assessment_criteria] = formatted_assessment_result[
- result.student
- ][result.course][args.assessment_group][result.assessment_criteria]["maximum_score"]
- if get_course:
- course_dict[result.course] = total_maximum_score
-
- if get_assessment_criteria and total_maximum_score:
- assessment_criteria_dict["Final Grade"] = total_maximum_score
-
- return {
- "student_details": student_details,
- "assessment_result": formatted_assessment_result,
- "assessment_criteria": assessment_criteria_dict,
- "course_dict": course_dict,
- }
-
-
-def get_column(assessment_criteria):
- columns = [
- {
- "fieldname": "student",
- "label": _("Student ID"),
- "fieldtype": "Link",
- "options": "Student",
- "width": 90,
- },
- {"fieldname": "student_name", "label": _("Student Name"), "fieldtype": "Data", "width": 160},
- ]
- for d in assessment_criteria:
- columns.append({"fieldname": frappe.scrub(d), "label": d, "fieldtype": "Data", "width": 110})
- columns.append(
- {
- "fieldname": frappe.scrub(d) + "_score",
- "label": "Score(" + str(int(assessment_criteria[d])) + ")",
- "fieldtype": "Float",
- "width": 100,
- }
- )
-
- return columns
-
-
-def get_chart_data(grades, criteria_list, kounter):
- grades = sorted(grades)
- datasets = []
-
- for grade in grades:
- tmp = frappe._dict({"name": grade, "values": []})
- for criteria in criteria_list:
- if grade in kounter[criteria]:
- tmp["values"].append(kounter[criteria][grade])
- else:
- tmp["values"].append(0)
- datasets.append(tmp)
-
- return {
- "data": {"labels": criteria_list, "datasets": datasets},
- "type": "bar",
- }
-
-
-def get_child_assessment_groups(assessment_group):
- assessment_groups = []
- group_type = frappe.get_value("Assessment Group", assessment_group, "is_group")
- if group_type:
- from frappe.desk.treeview import get_children
-
- assessment_groups = [
- d.get("value")
- for d in get_children("Assessment Group", assessment_group)
- if d.get("value") and not d.get("expandable")
- ]
- else:
- assessment_groups = [assessment_group]
- return assessment_groups
diff --git a/erpnext/education/report/final_assessment_grades/__init__.py b/erpnext/education/report/final_assessment_grades/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/final_assessment_grades/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/final_assessment_grades/final_assessment_grades.js b/erpnext/education/report/final_assessment_grades/final_assessment_grades.js
deleted file mode 100644
index ddff8a8..0000000
--- a/erpnext/education/report/final_assessment_grades/final_assessment_grades.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-/* eslint-disable */
-
-frappe.query_reports["Final Assessment Grades"] = {
- "filters": [
- {
- "fieldname":"academic_year",
- "label": __("Academic Year"),
- "fieldtype": "Link",
- "options": "Academic Year",
- "reqd": 1
- },
- {
- "fieldname":"student_group",
- "label": __("Student Group"),
- "fieldtype": "Link",
- "options": "Student Group",
- "reqd": 1,
- "get_query": function() {
- return{
- filters: {
- "group_based_on": "Batch",
- "academic_year": frappe.query_report.get_filter_value('academic_year')
- }
- };
- }
- },
- {
- "fieldname":"assessment_group",
- "label": __("Assessment Group"),
- "fieldtype": "Link",
- "options": "Assessment Group",
- "reqd": 1
- }
-
- ]
-}
diff --git a/erpnext/education/report/final_assessment_grades/final_assessment_grades.json b/erpnext/education/report/final_assessment_grades/final_assessment_grades.json
deleted file mode 100644
index 6a23494..0000000
--- a/erpnext/education/report/final_assessment_grades/final_assessment_grades.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "add_total_row": 0,
- "creation": "2018-01-22 17:04:43.412054",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 0,
- "is_standard": "Yes",
- "modified": "2020-06-24 17:13:35.373756",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Final Assessment Grades",
- "owner": "Administrator",
- "prepared_report": 0,
- "ref_doctype": "Assessment Result",
- "report_name": "Final Assessment Grades",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "Instructor"
- },
- {
- "role": "Education Manager"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/report/final_assessment_grades/final_assessment_grades.py b/erpnext/education/report/final_assessment_grades/final_assessment_grades.py
deleted file mode 100644
index 8d5acc6..0000000
--- a/erpnext/education/report/final_assessment_grades/final_assessment_grades.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from collections import defaultdict
-
-import frappe
-from frappe import _
-
-from erpnext.education.report.course_wise_assessment_report.course_wise_assessment_report import (
- get_chart_data,
- get_formatted_result,
-)
-
-
-def execute(filters=None):
- columns, data, grades = [], [], []
- args = frappe._dict()
- course_wise_analysis = defaultdict(dict)
-
- args["academic_year"] = filters.get("academic_year")
- assessment_group = args["assessment_group"] = filters.get("assessment_group")
-
- student_group = filters.get("student_group")
- args.students = frappe.db.sql_list(
- "select student from `tabStudent Group Student` where parent=%s", (student_group)
- )
-
- values = get_formatted_result(args, get_course=True)
- student_details = values.get("student_details")
- assessment_result = values.get("assessment_result")
- course_dict = values.get("course_dict")
-
- for student in args.students:
- if student_details.get(student):
- student_row = {}
- student_row["student"] = student
- student_row["student_name"] = student_details[student]
- for course in course_dict:
- scrub_course = frappe.scrub(course)
- if assessment_group in assessment_result[student][course]:
- student_row["grade_" + scrub_course] = assessment_result[student][course][assessment_group][
- "Total Score"
- ]["grade"]
- student_row["score_" + scrub_course] = assessment_result[student][course][assessment_group][
- "Total Score"
- ]["score"]
-
- # create the list of possible grades
- if student_row["grade_" + scrub_course] not in grades:
- grades.append(student_row["grade_" + scrub_course])
-
- # create the dict of for gradewise analysis
- if student_row["grade_" + scrub_course] not in course_wise_analysis[course]:
- course_wise_analysis[course][student_row["grade_" + scrub_course]] = 1
- else:
- course_wise_analysis[course][student_row["grade_" + scrub_course]] += 1
-
- data.append(student_row)
-
- course_list = [d for d in course_dict]
- columns = get_column(course_dict)
- chart = get_chart_data(grades, course_list, course_wise_analysis)
- return columns, data, None, chart
-
-
-def get_column(course_dict):
- columns = [
- {
- "fieldname": "student",
- "label": _("Student ID"),
- "fieldtype": "Link",
- "options": "Student",
- "width": 90,
- },
- {"fieldname": "student_name", "label": _("Student Name"), "fieldtype": "Data", "width": 160},
- ]
- for course in course_dict:
- columns.append(
- {
- "fieldname": "grade_" + frappe.scrub(course),
- "label": course,
- "fieldtype": "Data",
- "width": 110,
- }
- )
- columns.append(
- {
- "fieldname": "score_" + frappe.scrub(course),
- "label": "Score(" + str(course_dict[course]) + ")",
- "fieldtype": "Float",
- "width": 100,
- }
- )
-
- return columns
diff --git a/erpnext/education/report/program_wise_fee_collection/__init__.py b/erpnext/education/report/program_wise_fee_collection/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/program_wise_fee_collection/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.js b/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.js
deleted file mode 100644
index 72e8f12..0000000
--- a/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-/* eslint-disable */
-
-frappe.query_reports["Program wise Fee Collection"] = {
- "filters": [
- {
- "fieldname": "from_date",
- "label": __("From Date"),
- "fieldtype": "Date",
- "default": frappe.datetime.add_months(frappe.datetime.get_today(), -1),
- "reqd": 1
- },
- {
- "fieldname": "to_date",
- "label": __("To Date"),
- "fieldtype": "Date",
- "default": frappe.datetime.get_today(),
- "reqd": 1
- }
- ]
-};
diff --git a/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.json b/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.json
deleted file mode 100644
index ee5c0de..0000000
--- a/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "add_total_row": 1,
- "creation": "2020-07-27 16:05:33.263539",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 0,
- "is_standard": "Yes",
- "json": "{}",
- "modified": "2020-08-05 14:14:12.410515",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Program wise Fee Collection",
- "owner": "Administrator",
- "prepared_report": 0,
- "query": "SELECT \n FeesCollected.program AS \"Program:Link/Program:200\",\n FeesCollected.paid_amount AS \"Fees Collected:Currency:150\",\n FeesCollected.outstanding_amount AS \"Outstanding Amount:Currency:150\",\n FeesCollected.grand_total \"Grand Total:Currency:150\"\nFROM (\n SELECT \n sum(grand_total) - sum(outstanding_amount) AS paid_amount, program,\n sum(outstanding_amount) AS outstanding_amount,\n sum(grand_total) AS grand_total\n FROM `tabFees`\n WHERE docstatus = 1\n GROUP BY program\n) AS FeesCollected\nORDER BY FeesCollected.paid_amount DESC",
- "ref_doctype": "Fees",
- "report_name": "Program wise Fee Collection",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "Academics User"
- },
- {
- "role": "Accounts User"
- },
- {
- "role": "Accounts Manager"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.py b/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.py
deleted file mode 100644
index e5591f9..0000000
--- a/erpnext/education/report/program_wise_fee_collection/program_wise_fee_collection.py
+++ /dev/null
@@ -1,122 +0,0 @@
-# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-
-
-def execute(filters=None):
- if not filters:
- filters = {}
-
- columns = get_columns(filters)
- data = get_data(filters)
- chart = get_chart_data(data)
-
- return columns, data, None, chart
-
-
-def get_columns(filters=None):
- return [
- {
- "label": _("Program"),
- "fieldname": "program",
- "fieldtype": "Link",
- "options": "Program",
- "width": 300,
- },
- {
- "label": _("Fees Collected"),
- "fieldname": "fees_collected",
- "fieldtype": "Currency",
- "width": 200,
- },
- {
- "label": _("Outstanding Amount"),
- "fieldname": "outstanding_amount",
- "fieldtype": "Currency",
- "width": 200,
- },
- {"label": _("Grand Total"), "fieldname": "grand_total", "fieldtype": "Currency", "width": 200},
- ]
-
-
-def get_data(filters=None):
- data = []
-
- conditions = get_filter_conditions(filters)
-
- fee_details = frappe.db.sql(
- """
- SELECT
- FeesCollected.program,
- FeesCollected.paid_amount,
- FeesCollected.outstanding_amount,
- FeesCollected.grand_total
- FROM (
- SELECT
- sum(grand_total) - sum(outstanding_amount) AS paid_amount, program,
- sum(outstanding_amount) AS outstanding_amount,
- sum(grand_total) AS grand_total
- FROM `tabFees`
- WHERE
- docstatus = 1 and
- program IS NOT NULL
- %s
- GROUP BY program
- ) AS FeesCollected
- ORDER BY FeesCollected.paid_amount DESC
- """
- % (conditions),
- as_dict=1,
- )
-
- for entry in fee_details:
- data.append(
- {
- "program": entry.program,
- "fees_collected": entry.paid_amount,
- "outstanding_amount": entry.outstanding_amount,
- "grand_total": entry.grand_total,
- }
- )
-
- return data
-
-
-def get_filter_conditions(filters):
- conditions = ""
-
- if filters.get("from_date") and filters.get("to_date"):
- conditions += " and posting_date BETWEEN '%s' and '%s'" % (
- filters.get("from_date"),
- filters.get("to_date"),
- )
-
- return conditions
-
-
-def get_chart_data(data):
- if not data:
- return
-
- labels = []
- fees_collected = []
- outstanding_amount = []
-
- for entry in data:
- labels.append(entry.get("program"))
- fees_collected.append(entry.get("fees_collected"))
- outstanding_amount.append(entry.get("outstanding_amount"))
-
- return {
- "data": {
- "labels": labels,
- "datasets": [
- {"name": _("Fees Collected"), "values": fees_collected},
- {"name": _("Outstanding Amt"), "values": outstanding_amount},
- ],
- },
- "type": "bar",
- }
diff --git a/erpnext/education/report/student_and_guardian_contact_details/__init__.py b/erpnext/education/report/student_and_guardian_contact_details/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/student_and_guardian_contact_details/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js
deleted file mode 100644
index 2734b53..0000000
--- a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.query_reports["Student and Guardian Contact Details"] = {
- "filters": [
- {
- "fieldname":"academic_year",
- "label": __("Academic Year"),
- "fieldtype": "Link",
- "options": "Academic Year",
- "reqd": 1,
- },
- {
- "fieldname":"program",
- "label": __("Program"),
- "fieldtype": "Link",
- "options": "Program",
- "reqd": 1
- },
- {
- "fieldname":"student_batch_name",
- "label": __("Batch Name"),
- "fieldtype": "Link",
- "options": "Student Batch Name",
- "reqd": 1
- },
-
- ]
-}
diff --git a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json
deleted file mode 100644
index fa9be65..0000000
--- a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "add_total_row": 0,
- "creation": "2017-03-27 17:47:16.831433",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 0,
- "is_standard": "Yes",
- "modified": "2020-06-24 17:16:50.639488",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student and Guardian Contact Details",
- "owner": "Administrator",
- "prepared_report": 0,
- "ref_doctype": "Program Enrollment",
- "report_name": "Student and Guardian Contact Details",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "Instructor"
- },
- {
- "role": "Academics User"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py
deleted file mode 100644
index 6f871d7..0000000
--- a/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py
+++ /dev/null
@@ -1,151 +0,0 @@
-# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-from frappe import _
-
-
-def execute(filters=None):
- columns, data = [], []
-
- academic_year = filters.get("academic_year")
- program = filters.get("program")
- student_batch_name = filters.get("student_batch_name")
-
- columns = get_columns()
-
- program_enrollments = frappe.get_list(
- "Program Enrollment",
- fields=["student", "student_name"],
- filters={
- "academic_year": academic_year,
- "program": program,
- "student_batch_name": student_batch_name,
- },
- )
-
- student_list = [d.student for d in program_enrollments]
- if not student_list:
- return columns, []
-
- group_roll_no_map = get_student_roll_no(academic_year, program, student_batch_name)
- student_map = get_student_details(student_list)
- guardian_map = get_guardian_map(student_list)
-
- for d in program_enrollments:
- student_details = student_map.get(d.student)
- row = [
- group_roll_no_map.get(d.student),
- d.student,
- d.student_name,
- student_details.get("student_mobile_number"),
- student_details.get("student_email_id"),
- student_details.get("address"),
- ]
-
- student_guardians = guardian_map.get(d.student)
-
- if student_guardians:
- for i in range(2):
- if i < len(student_guardians):
- g = student_guardians[i]
- row += [g.guardian_name, g.relation, g.mobile_number, g.email_address]
-
- data.append(row)
-
- return columns, data
-
-
-def get_columns():
- columns = [
- _("Group Roll No") + "::60",
- _("Student ID") + ":Link/Student:90",
- _("Student Name") + "::150",
- _("Student Mobile No.") + "::110",
- _("Student Email ID") + "::125",
- _("Student Address") + "::175",
- _("Guardian1 Name") + "::150",
- _("Relation with Guardian1") + "::80",
- _("Guardian1 Mobile No") + "::125",
- _("Guardian1 Email ID") + "::125",
- _("Guardian2 Name") + "::150",
- _("Relation with Guardian2") + "::80",
- _("Guardian2 Mobile No") + "::125",
- _("Guardian2 Email ID") + "::125",
- ]
- return columns
-
-
-def get_student_details(student_list):
- student_map = frappe._dict()
- student_details = frappe.db.sql(
- """
- select name, student_mobile_number, student_email_id, address_line_1, address_line_2, city, state from `tabStudent` where name in (%s)"""
- % ", ".join(["%s"] * len(student_list)),
- tuple(student_list),
- as_dict=1,
- )
- for s in student_details:
- student = frappe._dict()
- student["student_mobile_number"] = s.student_mobile_number
- student["student_email_id"] = s.student_email_id
- student["address"] = ", ".join(
- [d for d in [s.address_line_1, s.address_line_2, s.city, s.state] if d]
- )
- student_map[s.name] = student
- return student_map
-
-
-def get_guardian_map(student_list):
- guardian_map = frappe._dict()
- guardian_details = frappe.db.sql(
- """
- select parent, guardian, guardian_name, relation from `tabStudent Guardian` where parent in (%s)"""
- % ", ".join(["%s"] * len(student_list)),
- tuple(student_list),
- as_dict=1,
- )
-
- guardian_list = list(set([g.guardian for g in guardian_details])) or [""]
-
- guardian_mobile_no = dict(
- frappe.db.sql(
- """select name, mobile_number from `tabGuardian`
- where name in (%s)"""
- % ", ".join(["%s"] * len(guardian_list)),
- tuple(guardian_list),
- )
- )
-
- guardian_email_id = dict(
- frappe.db.sql(
- """select name, email_address from `tabGuardian`
- where name in (%s)"""
- % ", ".join(["%s"] * len(guardian_list)),
- tuple(guardian_list),
- )
- )
-
- for guardian in guardian_details:
- guardian["mobile_number"] = guardian_mobile_no.get(guardian.guardian)
- guardian["email_address"] = guardian_email_id.get(guardian.guardian)
- guardian_map.setdefault(guardian.parent, []).append(guardian)
-
- return guardian_map
-
-
-def get_student_roll_no(academic_year, program, batch):
- student_group = frappe.get_all(
- "Student Group",
- filters={"academic_year": academic_year, "program": program, "batch": batch, "disabled": 0},
- )
- if student_group:
- roll_no_dict = dict(
- frappe.db.sql(
- """select student, group_roll_number from `tabStudent Group Student` where parent=%s""",
- (student_group[0].name),
- )
- )
- return roll_no_dict
- return {}
diff --git a/erpnext/education/report/student_batch_wise_attendance/__init__.py b/erpnext/education/report/student_batch_wise_attendance/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/student_batch_wise_attendance/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.js b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.js
deleted file mode 100644
index 9f1fcbc..0000000
--- a/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.js
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.query_reports["Student Batch-Wise Attendance"] = {
- "filters": [{
- "fieldname": "date",
- "label": __("Date"),
- "fieldtype": "Date",
- "default": frappe.datetime.get_today(),
- "reqd": 1
- }]
-}
diff --git a/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.json b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.json
deleted file mode 100644
index 8baf8f9..0000000
--- a/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "add_total_row": 0,
- "creation": "2016-11-28 22:07:03.859124",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 2,
- "is_standard": "Yes",
- "modified": "2020-06-24 17:16:59.823709",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Batch-Wise Attendance",
- "owner": "Administrator",
- "prepared_report": 0,
- "ref_doctype": "Student Attendance",
- "report_name": "Student Batch-Wise Attendance",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "Academics User"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py
deleted file mode 100644
index 282f5c9..0000000
--- a/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-
-import frappe
-from frappe import _, msgprint
-from frappe.utils import formatdate
-
-from erpnext.education.doctype.student_attendance.student_attendance import get_holiday_list
-from erpnext.hr.doctype.holiday_list.holiday_list import is_holiday
-
-
-def execute(filters=None):
- if not filters:
- filters = {}
-
- if not filters.get("date"):
- msgprint(_("Please select date"), raise_exception=1)
-
- holiday_list = get_holiday_list()
- if is_holiday(holiday_list, filters.get("date")):
- msgprint(
- _("No attendance has been marked for {0} as it is a Holiday").format(
- frappe.bold(formatdate(filters.get("date")))
- )
- )
-
- columns = get_columns(filters)
-
- active_student_group = get_active_student_group()
-
- data = []
- for student_group in active_student_group:
- row = [student_group.name]
- present_students = 0
- absent_students = 0
- student_group_strength = get_student_group_strength(student_group.name)
- student_attendance = get_student_attendance(student_group.name, filters.get("date"))
- if student_attendance:
- for attendance in student_attendance:
- if attendance.status == "Present":
- present_students = attendance.count
- elif attendance.status == "Absent":
- absent_students = attendance.count
-
- unmarked_students = student_group_strength - (present_students + absent_students)
- row += [student_group_strength, present_students, absent_students, unmarked_students]
- data.append(row)
-
- return columns, data
-
-
-def get_columns(filters):
- columns = [
- _("Student Group") + ":Link/Student Group:250",
- _("Student Group Strength") + "::170",
- _("Present") + "::90",
- _("Absent") + "::90",
- _("Not Marked") + "::90",
- ]
- return columns
-
-
-def get_active_student_group():
- active_student_groups = frappe.db.sql(
- """select name from `tabStudent Group` where group_based_on = "Batch"
- and academic_year=%s order by name""",
- (frappe.defaults.get_defaults().academic_year),
- as_dict=1,
- )
- return active_student_groups
-
-
-def get_student_group_strength(student_group):
- student_group_strength = frappe.db.sql(
- """select count(*) from `tabStudent Group Student`
- where parent = %s and active=1""",
- student_group,
- )[0][0]
- return student_group_strength
-
-
-def get_student_attendance(student_group, date):
- student_attendance = frappe.db.sql(
- """select count(*) as count, status from `tabStudent Attendance` where
- student_group= %s and date= %s and docstatus = 1 and
- (course_schedule is Null or course_schedule='') group by status""",
- (student_group, date),
- as_dict=1,
- )
- return student_attendance
diff --git a/erpnext/education/report/student_fee_collection/__init__.py b/erpnext/education/report/student_fee_collection/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/student_fee_collection/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/student_fee_collection/student_fee_collection.json b/erpnext/education/report/student_fee_collection/student_fee_collection.json
deleted file mode 100644
index c0229a2..0000000
--- a/erpnext/education/report/student_fee_collection/student_fee_collection.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "add_total_row": 1,
- "creation": "2016-06-22 02:58:41.024538",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 3,
- "is_standard": "Yes",
- "modified": "2020-06-24 17:14:39.452551",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Fee Collection",
- "owner": "Administrator",
- "prepared_report": 0,
- "query": "SELECT\n student as \"Student:Link/Student:200\",\n student_name as \"Student Name::200\",\n sum(grand_total) - sum(outstanding_amount) as \"Paid Amount:Currency:150\",\n sum(outstanding_amount) as \"Outstanding Amount:Currency:150\",\n sum(grand_total) as \"Grand Total:Currency:150\"\nFROM\n `tabFees` \nWHERE\n docstatus=1 \nGROUP BY\n student",
- "ref_doctype": "Fees",
- "report_name": "Student Fee Collection",
- "report_type": "Query Report",
- "roles": [
- {
- "role": "Academics User"
- }
- ]
-}
diff --git a/erpnext/education/report/student_monthly_attendance_sheet/__init__.py b/erpnext/education/report/student_monthly_attendance_sheet/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/report/student_monthly_attendance_sheet/__init__.py
+++ /dev/null
diff --git a/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js
deleted file mode 100644
index 62c9455..0000000
--- a/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-
-frappe.query_reports["Student Monthly Attendance Sheet"] = {
- "filters": [{
- "fieldname": "month",
- "label": __("Month"),
- "fieldtype": "Select",
- "options": "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug\nSep\nOct\nNov\nDec",
- "default": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov",
- "Dec"
- ][frappe.datetime.str_to_obj(frappe.datetime.get_today()).getMonth()],
- },
- {
- "fieldname": "year",
- "label": __("Year"),
- "fieldtype": "Select",
- "reqd": 1
- },
- {
- "fieldname": "student_group",
- "label": __("Student Group"),
- "fieldtype": "Link",
- "options": "Student Group",
- "reqd": 1
- }
- ],
-
- "onload": function() {
- return frappe.call({
- method: "erpnext.education.report.student_monthly_attendance_sheet.student_monthly_attendance_sheet.get_attendance_years",
- callback: function(r) {
- var year_filter = frappe.query_report.get_filter('year');
- year_filter.df.options = r.message;
- year_filter.df.default = r.message.split("\n")[0];
- year_filter.refresh();
- year_filter.set_input(year_filter.df.default);
- }
- });
- }
-}
diff --git a/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json
deleted file mode 100644
index 1423d4f..0000000
--- a/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "add_total_row": 0,
- "creation": "2013-05-13 14:04:03",
- "disable_prepared_report": 0,
- "disabled": 0,
- "docstatus": 0,
- "doctype": "Report",
- "idx": 3,
- "is_standard": "Yes",
- "modified": "2020-06-24 17:16:13.307053",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Student Monthly Attendance Sheet",
- "owner": "Administrator",
- "prepared_report": 0,
- "ref_doctype": "Student Attendance",
- "report_name": "Student Monthly Attendance Sheet",
- "report_type": "Script Report",
- "roles": [
- {
- "role": "Academics User"
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py
deleted file mode 100644
index 9312e2b..0000000
--- a/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-
-import frappe
-from frappe import _
-from frappe.utils import add_days, cstr, date_diff, get_first_day, get_last_day, getdate
-
-from erpnext.education.api import get_student_group_students
-from erpnext.education.doctype.student_attendance.student_attendance import get_holiday_list
-from erpnext.support.doctype.issue.issue import get_holidays
-
-
-def execute(filters=None):
- if not filters:
- filters = {}
-
- from_date = get_first_day(filters["month"] + "-" + filters["year"])
- to_date = get_last_day(filters["month"] + "-" + filters["year"])
- total_days_in_month = date_diff(to_date, from_date) + 1
- columns = get_columns(total_days_in_month)
- students = get_student_group_students(filters.get("student_group"), 1)
- students_list = get_students_list(students)
- att_map = get_attendance_list(from_date, to_date, filters.get("student_group"), students_list)
- data = []
-
- for stud in students:
- row = [stud.student, stud.student_name]
- student_status = frappe.db.get_value("Student", stud.student, "enabled")
- date = from_date
- total_p = total_a = 0.0
-
- for day in range(total_days_in_month):
- status = "None"
-
- if att_map.get(stud.student):
- status = att_map.get(stud.student).get(date, "None")
- elif not student_status:
- status = "Inactive"
- else:
- status = "None"
-
- status_map = {"Present": "P", "Absent": "A", "None": "", "Inactive": "-", "Holiday": "H"}
- row.append(status_map[status])
-
- if status == "Present":
- total_p += 1
- elif status == "Absent":
- total_a += 1
- date = add_days(date, 1)
-
- row += [total_p, total_a]
- data.append(row)
- return columns, data
-
-
-def get_columns(days_in_month):
- columns = [_("Student") + ":Link/Student:90", _("Student Name") + "::150"]
- for day in range(days_in_month):
- columns.append(cstr(day + 1) + "::20")
- columns += [_("Total Present") + ":Int:95", _("Total Absent") + ":Int:90"]
- return columns
-
-
-def get_students_list(students):
- student_list = []
- for stud in students:
- student_list.append(stud.student)
- return student_list
-
-
-def get_attendance_list(from_date, to_date, student_group, students_list):
- attendance_list = frappe.db.sql(
- """select student, date, status
- from `tabStudent Attendance` where student_group = %s
- and docstatus = 1
- and date between %s and %s
- order by student, date""",
- (student_group, from_date, to_date),
- as_dict=1,
- )
-
- att_map = {}
- students_with_leave_application = get_students_with_leave_application(
- from_date, to_date, students_list
- )
- for d in attendance_list:
- att_map.setdefault(d.student, frappe._dict()).setdefault(d.date, "")
-
- if students_with_leave_application.get(
- d.date
- ) and d.student in students_with_leave_application.get(d.date):
- att_map[d.student][d.date] = "Present"
- else:
- att_map[d.student][d.date] = d.status
-
- att_map = mark_holidays(att_map, from_date, to_date, students_list)
-
- return att_map
-
-
-def get_students_with_leave_application(from_date, to_date, students_list):
- if not students_list:
- return
- leave_applications = frappe.db.sql(
- """
- select student, from_date, to_date
- from `tabStudent Leave Application`
- where
- mark_as_present = 1 and docstatus = 1
- and student in %(students)s
- and (
- from_date between %(from_date)s and %(to_date)s
- or to_date between %(from_date)s and %(to_date)s
- or (%(from_date)s between from_date and to_date and %(to_date)s between from_date and to_date)
- )
- """,
- {"students": students_list, "from_date": from_date, "to_date": to_date},
- as_dict=True,
- )
- students_with_leaves = {}
- for application in leave_applications:
- for date in daterange(application.from_date, application.to_date):
- students_with_leaves.setdefault(date, []).append(application.student)
-
- return students_with_leaves
-
-
-def daterange(d1, d2):
- import datetime
-
- return (d1 + datetime.timedelta(days=i) for i in range((d2 - d1).days + 1))
-
-
-@frappe.whitelist()
-def get_attendance_years():
- year_list = frappe.db.sql_list(
- """select distinct YEAR(date) from `tabStudent Attendance` ORDER BY YEAR(date) DESC"""
- )
- if not year_list:
- year_list = [getdate().year]
- return "\n".join(str(year) for year in year_list)
-
-
-def mark_holidays(att_map, from_date, to_date, students_list):
- holiday_list = get_holiday_list()
- holidays = get_holidays(holiday_list)
-
- for dt in daterange(getdate(from_date), getdate(to_date)):
- if dt in holidays:
- for student in students_list:
- att_map.setdefault(student, frappe._dict()).setdefault(dt, "Holiday")
-
- return att_map
diff --git a/erpnext/education/setup.py b/erpnext/education/setup.py
deleted file mode 100644
index 2b82da5..0000000
--- a/erpnext/education/setup.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import frappe
-
-
-def setup_education():
- disable_desk_access_for_student_role()
- if frappe.db.exists("Academic Year", "2015-16"):
- # already setup
- return
- create_academic_sessions()
-
-
-def insert_record(records):
- for r in records:
- doc = frappe.new_doc(r.get("doctype"))
- doc.update(r)
- try:
- doc.insert(ignore_permissions=True)
- except frappe.DuplicateEntryError as e:
- # pass DuplicateEntryError and continue
- if e.args and e.args[0] == doc.doctype and e.args[1] == doc.name:
- # make sure DuplicateEntryError is for the exact same doc and not a related doc
- pass
- else:
- raise
-
-
-def create_academic_sessions():
- data = [
- {"doctype": "Academic Year", "academic_year_name": "2015-16"},
- {"doctype": "Academic Year", "academic_year_name": "2016-17"},
- {"doctype": "Academic Year", "academic_year_name": "2017-18"},
- {"doctype": "Academic Year", "academic_year_name": "2018-19"},
- {"doctype": "Academic Term", "academic_year": "2016-17", "term_name": "Semester 1"},
- {"doctype": "Academic Term", "academic_year": "2016-17", "term_name": "Semester 2"},
- {"doctype": "Academic Term", "academic_year": "2017-18", "term_name": "Semester 1"},
- {"doctype": "Academic Term", "academic_year": "2017-18", "term_name": "Semester 2"},
- ]
- insert_record(data)
-
-
-def disable_desk_access_for_student_role():
- try:
- student_role = frappe.get_doc("Role", "Student")
- except frappe.DoesNotExistError:
- create_student_role()
- return
-
- student_role.desk_access = 0
- student_role.save()
-
-
-def create_student_role():
- student_role = frappe.get_doc(
- {"doctype": "Role", "role_name": "Student", "desk_access": 0, "restrict_to_domain": "Education"}
- )
- student_role.insert()
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
deleted file mode 100644
index e6eb1c9..0000000
--- a/erpnext/education/utils.py
+++ /dev/null
@@ -1,449 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies and contributors
-
-import frappe
-from frappe import _
-
-
-class OverlapError(frappe.ValidationError):
- pass
-
-
-def validate_overlap_for(doc, doctype, fieldname, value=None):
- """Checks overlap for specified field.
-
- :param fieldname: Checks Overlap for this field
- """
-
- existing = get_overlap_for(doc, doctype, fieldname, value)
- if existing:
- frappe.throw(
- _("This {0} conflicts with {1} for {2} {3}").format(
- doc.doctype,
- existing.name,
- doc.meta.get_label(fieldname) if not value else fieldname,
- value or doc.get(fieldname),
- ),
- OverlapError,
- )
-
-
-def get_overlap_for(doc, doctype, fieldname, value=None):
- """Returns overlaping document for specified field.
-
- :param fieldname: Checks Overlap for this field
- """
-
- existing = frappe.db.sql(
- """select name, from_time, to_time from `tab{0}`
- where `{1}`=%(val)s and schedule_date = %(schedule_date)s and
- (
- (from_time > %(from_time)s and from_time < %(to_time)s) or
- (to_time > %(from_time)s and to_time < %(to_time)s) or
- (%(from_time)s > from_time and %(from_time)s < to_time) or
- (%(from_time)s = from_time and %(to_time)s = to_time))
- and name!=%(name)s and docstatus!=2""".format(
- doctype, fieldname
- ),
- {
- "schedule_date": doc.schedule_date,
- "val": value or doc.get(fieldname),
- "from_time": doc.from_time,
- "to_time": doc.to_time,
- "name": doc.name or "No Name",
- },
- as_dict=True,
- )
-
- return existing[0] if existing else None
-
-
-def validate_duplicate_student(students):
- unique_students = []
- for stud in students:
- if stud.student in unique_students:
- frappe.throw(
- _("Student {0} - {1} appears Multiple times in row {2} & {3}").format(
- stud.student, stud.student_name, unique_students.index(stud.student) + 1, stud.idx
- )
- )
- else:
- unique_students.append(stud.student)
-
- return None
-
-
-# LMS Utils
-def get_current_student():
- """Returns current student from frappe.session.user
-
- Returns:
- object: Student Document
- """
- email = frappe.session.user
- if email in ("Administrator", "Guest"):
- return None
- try:
- student_id = frappe.get_all("Student", {"student_email_id": email}, ["name"])[0].name
- return frappe.get_doc("Student", student_id)
- except (IndexError, frappe.DoesNotExistError):
- return None
-
-
-def get_portal_programs():
- """Returns a list of all program to be displayed on the portal
- Programs are returned based on the following logic
- is_published and (student_is_enrolled or student_can_self_enroll)
-
- Returns:
- list of dictionary: List of all programs and to be displayed on the portal along with access rights
- """
- published_programs = frappe.get_all("Program", filters={"is_published": True})
- if not published_programs:
- return None
-
- program_list = [frappe.get_doc("Program", program) for program in published_programs]
- portal_programs = [
- {"program": program, "has_access": allowed_program_access(program.name)}
- for program in program_list
- if allowed_program_access(program.name) or program.allow_self_enroll
- ]
-
- return portal_programs
-
-
-def allowed_program_access(program, student=None):
- """Returns enrollment status for current student
-
- Args:
- program (string): Name of the program
- student (object): instance of Student document
-
- Returns:
- bool: Is current user enrolled or not
- """
- if has_super_access():
- return True
- if not student:
- student = get_current_student()
- if student and get_enrollment("program", program, student.name):
- return True
- else:
- return False
-
-
-def get_enrollment(master, document, student):
- """Gets enrollment for course or program
-
- Args:
- master (string): can either be program or course
- document (string): program or course name
- student (string): Student ID
-
- Returns:
- string: Enrollment Name if exists else returns empty string
- """
- if master == "program":
- enrollments = frappe.get_all(
- "Program Enrollment", filters={"student": student, "program": document, "docstatus": 1}
- )
- if master == "course":
- enrollments = frappe.get_all(
- "Course Enrollment", filters={"student": student, "course": document}
- )
-
- if enrollments:
- return enrollments[0].name
- else:
- return None
-
-
-@frappe.whitelist()
-def enroll_in_program(program_name, student=None):
- """Enroll student in program
-
- Args:
- program_name (string): Name of the program to be enrolled into
- student (string, optional): name of student who has to be enrolled, if not
- provided, a student will be created from the current user
-
- Returns:
- string: name of the program enrollment document
- """
- if has_super_access():
- return
-
- if not student == None:
- student = frappe.get_doc("Student", student)
- else:
- # Check if self enrollment in allowed
- program = frappe.get_doc("Program", program_name)
- if not program.allow_self_enroll:
- return frappe.throw(_("You are not allowed to enroll for this course"))
-
- student = get_current_student()
- if not student:
- student = create_student_from_current_user()
-
- # Check if student is already enrolled in program
- enrollment = get_enrollment("program", program_name, student.name)
- if enrollment:
- return enrollment
-
- # Check if self enrollment in allowed
- program = frappe.get_doc("Program", program_name)
- if not program.allow_self_enroll:
- return frappe.throw(_("You are not allowed to enroll for this course"))
-
- # Enroll in program
- program_enrollment = student.enroll_in_program(program_name)
- return program_enrollment.name
-
-
-def has_super_access():
- """Check if user has a role that allows full access to LMS
-
- Returns:
- bool: true if user has access to all lms content
- """
- current_user = frappe.get_doc("User", frappe.session.user)
- roles = set([role.role for role in current_user.roles])
- return bool(
- roles & {"Administrator", "Instructor", "Education Manager", "System Manager", "Academic User"}
- )
-
-
-@frappe.whitelist()
-def add_activity(course, content_type, content, program):
- if has_super_access():
- return None
-
- student = get_current_student()
- if not student:
- return frappe.throw(
- _("Student with email {0} does not exist").format(frappe.session.user), frappe.DoesNotExistError
- )
-
- enrollment = get_or_create_course_enrollment(course, program)
- if content_type == "Quiz":
- return
- else:
- return enrollment.add_activity(content_type, content)
-
-
-@frappe.whitelist()
-def evaluate_quiz(quiz_response, quiz_name, course, program, time_taken):
- import json
-
- student = get_current_student()
-
- quiz_response = json.loads(quiz_response)
- quiz = frappe.get_doc("Quiz", quiz_name)
- result, score, status = quiz.evaluate(quiz_response, quiz_name)
-
- if has_super_access():
- return {"result": result, "score": score, "status": status}
-
- if student:
- enrollment = get_or_create_course_enrollment(course, program)
- if quiz.allowed_attempt(enrollment, quiz_name):
- enrollment.add_quiz_activity(quiz_name, quiz_response, result, score, status, time_taken)
- return {"result": result, "score": score, "status": status}
- else:
- return None
-
-
-@frappe.whitelist()
-def get_quiz(quiz_name, course):
- try:
- quiz = frappe.get_doc("Quiz", quiz_name)
- questions = quiz.get_questions()
- except Exception:
- frappe.throw(_("Quiz {0} does not exist").format(quiz_name), frappe.DoesNotExistError)
- return None
-
- questions = [
- {
- "name": question.name,
- "question": question.question,
- "type": question.question_type,
- "options": [{"name": option.name, "option": option.option} for option in question.options],
- }
- for question in questions
- ]
-
- if has_super_access():
- return {
- "questions": questions,
- "activity": None,
- "is_time_bound": quiz.is_time_bound,
- "duration": quiz.duration,
- }
-
- student = get_current_student()
- course_enrollment = get_enrollment("course", course, student.name)
- status, score, result, time_taken = check_quiz_completion(quiz, course_enrollment)
- return {
- "questions": questions,
- "activity": {"is_complete": status, "score": score, "result": result, "time_taken": time_taken},
- "is_time_bound": quiz.is_time_bound,
- "duration": quiz.duration,
- }
-
-
-def get_topic_progress(topic, course_name, program):
- """
- Return the porgress of a course in a program as well as the content to continue from.
- :param topic_name:
- :param course_name:
- """
- student = get_current_student()
- if not student:
- return None
- course_enrollment = get_or_create_course_enrollment(course_name, program)
- progress = student.get_topic_progress(course_enrollment.name, topic)
- if not progress:
- return None
- count = sum([activity["is_complete"] for activity in progress])
- if count == 0:
- return {"completed": False, "started": False}
- elif count == len(progress):
- return {"completed": True, "started": True}
- elif count < len(progress):
- return {"completed": False, "started": True}
-
-
-def get_course_progress(course, program):
- """
- Return the porgress of a course in a program as well as the content to continue from.
- :param topic_name:
- :param course_name:
- """
- course_progress = []
- for course_topic in course.topics:
- topic = frappe.get_doc("Topic", course_topic.topic)
- progress = get_topic_progress(topic, course.name, program)
- if progress:
- course_progress.append(progress)
- if course_progress:
- number_of_completed_topics = sum([activity["completed"] for activity in course_progress])
- total_topics = len(course_progress)
- if total_topics == 1:
- return course_progress[0]
- if number_of_completed_topics == 0:
- return {"completed": False, "started": False}
- if number_of_completed_topics == total_topics:
- return {"completed": True, "started": True}
- if number_of_completed_topics < total_topics:
- return {"completed": False, "started": True}
-
- return None
-
-
-def get_program_progress(program):
- program_progress = []
- if not program.courses:
- return None
- for program_course in program.courses:
- course = frappe.get_doc("Course", program_course.course)
- progress = get_course_progress(course, program.name)
- if progress:
- progress["name"] = course.name
- progress["course"] = course.course_name
- program_progress.append(progress)
-
- if program_progress:
- return program_progress
-
- return None
-
-
-def get_program_completion(program):
- topics = frappe.db.sql(
- """select `tabCourse Topic`.topic, `tabCourse Topic`.parent
- from `tabCourse Topic`,
- `tabProgram Course`
- where `tabCourse Topic`.parent = `tabProgram Course`.course
- and `tabProgram Course`.parent = %s""",
- program.name,
- )
-
- progress = []
- for topic in topics:
- topic_doc = frappe.get_doc("Topic", topic[0])
- topic_progress = get_topic_progress(topic_doc, topic[1], program.name)
- if topic_progress:
- progress.append(topic_progress)
-
- if progress:
- number_of_completed_topics = sum([activity["completed"] for activity in progress if activity])
- total_topics = len(progress)
- try:
- return int((float(number_of_completed_topics) / total_topics) * 100)
- except ZeroDivisionError:
- return 0
-
- return 0
-
-
-def create_student_from_current_user():
- user = frappe.get_doc("User", frappe.session.user)
-
- student = frappe.get_doc(
- {
- "doctype": "Student",
- "first_name": user.first_name,
- "last_name": user.last_name,
- "student_email_id": user.email,
- "user": frappe.session.user,
- }
- )
-
- student.save(ignore_permissions=True)
- return student
-
-
-def get_or_create_course_enrollment(course, program):
- student = get_current_student()
- course_enrollment = get_enrollment("course", course, student.name)
- if not course_enrollment:
- program_enrollment = get_enrollment("program", program.name, student.name)
- if not program_enrollment:
- frappe.throw(_("You are not enrolled in program {0}").format(program))
- return
- return student.enroll_in_course(
- course_name=course, program_enrollment=get_enrollment("program", program.name, student.name)
- )
- else:
- return frappe.get_doc("Course Enrollment", course_enrollment)
-
-
-def check_content_completion(content_name, content_type, enrollment_name):
- activity = frappe.get_all(
- "Course Activity",
- filters={"enrollment": enrollment_name, "content_type": content_type, "content": content_name},
- )
- if activity:
- return True
- else:
- return False
-
-
-def check_quiz_completion(quiz, enrollment_name):
- attempts = frappe.get_all(
- "Quiz Activity",
- filters={"enrollment": enrollment_name, "quiz": quiz.name},
- fields=["name", "activity_date", "score", "status", "time_taken"],
- )
- status = False if quiz.max_attempts == 0 else bool(len(attempts) >= quiz.max_attempts)
- score = None
- result = None
- time_taken = None
- if attempts:
- if quiz.grading_basis == "Last Highest Score":
- attempts = sorted(attempts, key=lambda i: int(i.score), reverse=True)
- score = attempts[0]["score"]
- result = attempts[0]["status"]
- time_taken = attempts[0]["time_taken"]
- if result == "Pass":
- status = True
- return status, score, result, time_taken
diff --git a/erpnext/education/web_form/__init__.py b/erpnext/education/web_form/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/web_form/__init__.py
+++ /dev/null
diff --git a/erpnext/education/web_form/student_applicant/__init__.py b/erpnext/education/web_form/student_applicant/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/education/web_form/student_applicant/__init__.py
+++ /dev/null
diff --git a/erpnext/education/web_form/student_applicant/student_applicant.js b/erpnext/education/web_form/student_applicant/student_applicant.js
deleted file mode 100644
index ffc5e98..0000000
--- a/erpnext/education/web_form/student_applicant/student_applicant.js
+++ /dev/null
@@ -1,3 +0,0 @@
-frappe.ready(function() {
- // bind events here
-})
diff --git a/erpnext/education/web_form/student_applicant/student_applicant.json b/erpnext/education/web_form/student_applicant/student_applicant.json
deleted file mode 100644
index 7b4eaa1..0000000
--- a/erpnext/education/web_form/student_applicant/student_applicant.json
+++ /dev/null
@@ -1,250 +0,0 @@
-{
- "accept_payment": 0,
- "allow_comments": 0,
- "allow_delete": 0,
- "allow_edit": 1,
- "allow_incomplete": 0,
- "allow_multiple": 1,
- "allow_print": 0,
- "amount": 0.0,
- "amount_based_on_field": 0,
- "apply_document_permissions": 0,
- "creation": "2016-09-22 13:10:10.792735",
- "doc_type": "Student Applicant",
- "docstatus": 0,
- "doctype": "Web Form",
- "idx": 0,
- "is_standard": 1,
- "login_required": 1,
- "max_attachment_size": 0,
- "modified": "2020-10-07 23:13:07.814941",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "student-applicant",
- "owner": "Administrator",
- "payment_button_label": "Buy Now",
- "published": 1,
- "route": "student-applicant",
- "route_to_success_link": 0,
- "show_attachments": 0,
- "show_in_grid": 0,
- "show_sidebar": 1,
- "sidebar_items": [],
- "success_url": "/student-applicant",
- "title": "Student Applicant",
- "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": "middle_name",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "Middle Name",
- "max_length": 0,
- "max_value": 0,
- "read_only": 0,
- "reqd": 0,
- "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": 1,
- "fieldname": "program",
- "fieldtype": "Link",
- "hidden": 0,
- "label": "Program",
- "max_length": 0,
- "max_value": 0,
- "options": "Program",
- "read_only": 0,
- "reqd": 1,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 1,
- "fieldname": "academic_year",
- "fieldtype": "Link",
- "hidden": 0,
- "label": "Academic Year",
- "max_length": 0,
- "max_value": 0,
- "options": "Academic Year",
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 1,
- "fieldname": "academic_term",
- "fieldtype": "Link",
- "hidden": 0,
- "label": "Academic Term",
- "max_length": 0,
- "max_value": 0,
- "options": "Academic Term",
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "date_of_birth",
- "fieldtype": "Date",
- "hidden": 0,
- "label": "Date of Birth",
- "max_length": 0,
- "max_value": 0,
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 1,
- "fieldname": "gender",
- "fieldtype": "Link",
- "hidden": 0,
- "label": "Gender",
- "max_length": 0,
- "max_value": 0,
- "options": "Gender",
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "blood_group",
- "fieldtype": "Select",
- "hidden": 0,
- "label": "Blood Group",
- "max_length": 0,
- "max_value": 0,
- "options": "\nA+\nA-\nB+\nB-\nO+\nO-\nAB+\nAB-",
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "student_email_id",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "Student Email ID",
- "max_length": 0,
- "max_value": 0,
- "read_only": 0,
- "reqd": 1,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "student_mobile_number",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "Student Mobile Number",
- "max_length": 0,
- "max_value": 0,
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "default": "",
- "fieldname": "nationality",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "Nationality",
- "max_length": 0,
- "max_value": 0,
- "options": "",
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "address_line_1",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "Address Line 1",
- "max_length": 0,
- "max_value": 0,
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "address_line_2",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "Address Line 2",
- "max_length": 0,
- "max_value": 0,
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "pincode",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "Pincode",
- "max_length": 0,
- "max_value": 0,
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "siblings",
- "fieldtype": "Table",
- "hidden": 0,
- "label": "Siblings",
- "max_length": 0,
- "max_value": 0,
- "options": "Student Sibling",
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- },
- {
- "allow_read_on_all_link_options": 0,
- "fieldname": "student_admission",
- "fieldtype": "Link",
- "hidden": 0,
- "label": "Student Admission",
- "max_length": 0,
- "max_value": 0,
- "options": "Student Admission",
- "read_only": 0,
- "reqd": 0,
- "show_in_filter": 0
- }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/education/web_form/student_applicant/student_applicant.py b/erpnext/education/web_form/student_applicant/student_applicant.py
deleted file mode 100644
index 02e3e93..0000000
--- a/erpnext/education/web_form/student_applicant/student_applicant.py
+++ /dev/null
@@ -1,3 +0,0 @@
-def get_context(context):
- # do your magic here
- pass
diff --git a/erpnext/education/workspace/education/education.json b/erpnext/education/workspace/education/education.json
deleted file mode 100644
index 0c7f198..0000000
--- a/erpnext/education/workspace/education/education.json
+++ /dev/null
@@ -1,765 +0,0 @@
-{
- "charts": [
- {
- "chart_name": "Program Enrollments",
- "label": "Program Enrollments"
- }
- ],
- "content": "[{\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Education\",\"col\":12}},{\"type\":\"chart\",\"data\":{\"chart_name\":\"Program Enrollments\",\"col\":12}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Your Shortcuts</b></span>\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Student\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Instructor\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Program\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Course\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Fees\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Student Monthly Attendance Sheet\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Course Scheduling Tool\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Student Attendance Tool\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Reports & Masters</b></span>\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Student and Instructor\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Masters\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Content Masters\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Admission\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Fees\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Schedule\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Attendance\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"LMS Activity\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Assessment\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Assessment Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Tools\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Other Reports\",\"col\":4}}]",
- "creation": "2020-03-02 17:22:57.066401",
- "docstatus": 0,
- "doctype": "Workspace",
- "for_user": "",
- "hide_custom": 0,
- "icon": "education",
- "idx": 0,
- "label": "Education",
- "links": [
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student and Instructor",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student",
- "link_count": 0,
- "link_to": "Student",
- "link_type": "DocType",
- "onboard": 1,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Instructor",
- "link_count": 0,
- "link_to": "Instructor",
- "link_type": "DocType",
- "onboard": 1,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Guardian",
- "link_count": 0,
- "link_to": "Guardian",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Group",
- "link_count": 0,
- "link_to": "Student Group",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Log",
- "link_count": 0,
- "link_to": "Student Log",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Masters",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Program",
- "link_count": 0,
- "link_to": "Program",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Course",
- "link_count": 0,
- "link_to": "Course",
- "link_type": "DocType",
- "onboard": 1,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Topic",
- "link_count": 0,
- "link_to": "Topic",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Room",
- "link_count": 0,
- "link_to": "Room",
- "link_type": "DocType",
- "onboard": 1,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Content Masters",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Article",
- "link_count": 0,
- "link_to": "Article",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Video",
- "link_count": 0,
- "link_to": "Video",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Quiz",
- "link_count": 0,
- "link_to": "Quiz",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Settings",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Education Settings",
- "link_count": 0,
- "link_to": "Education Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Category",
- "link_count": 0,
- "link_to": "Student Category",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Batch Name",
- "link_count": 0,
- "link_to": "Student Batch Name",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Grading Scale",
- "link_count": 0,
- "link_to": "Grading Scale",
- "link_type": "DocType",
- "onboard": 1,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Academic Term",
- "link_count": 0,
- "link_to": "Academic Term",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Academic Year",
- "link_count": 0,
- "link_to": "Academic Year",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Admission",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Applicant",
- "link_count": 0,
- "link_to": "Student Applicant",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Admission",
- "link_count": 0,
- "link_to": "Student Admission",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Program Enrollment",
- "link_count": 0,
- "link_to": "Program Enrollment",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Course Enrollment",
- "link_count": 0,
- "link_to": "Course Enrollment",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Fees",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Fee Structure",
- "link_count": 0,
- "link_to": "Fee Structure",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Fee Category",
- "link_count": 0,
- "link_to": "Fee Category",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Fee Schedule",
- "link_count": 0,
- "link_to": "Fee Schedule",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Fees",
- "link_count": 0,
- "link_to": "Fees",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "Fees",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Student Fee Collection Report",
- "link_count": 0,
- "link_to": "Student Fee Collection",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "Fees",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Program wise Fee Collection Report",
- "link_count": 0,
- "link_to": "Program wise Fee Collection",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Schedule",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Course Schedule",
- "link_count": 0,
- "link_to": "Course Schedule",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Course Scheduling Tool",
- "link_count": 0,
- "link_to": "Course Scheduling Tool",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Attendance",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Attendance",
- "link_count": 0,
- "link_to": "Student Attendance",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Leave Application",
- "link_count": 0,
- "link_to": "Student Leave Application",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "Student Attendance",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Student Monthly Attendance Sheet",
- "link_count": 0,
- "link_to": "Student Monthly Attendance Sheet",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "Student Attendance",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Absent Student Report",
- "link_count": 0,
- "link_to": "Absent Student Report",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "Student Attendance",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Student Batch-Wise Attendance",
- "link_count": 0,
- "link_to": "Student Batch-Wise Attendance",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "LMS Activity",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Course Enrollment",
- "link_count": 0,
- "link_to": "Course Enrollment",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Course Activity",
- "link_count": 0,
- "link_to": "Course Activity",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Quiz Activity",
- "link_count": 0,
- "link_to": "Quiz Activity",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Assessment",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Assessment Plan",
- "link_count": 0,
- "link_to": "Assessment Plan",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Assessment Group",
- "link_count": 0,
- "link_to": "Assessment Group",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Assessment Result",
- "link_count": 0,
- "link_to": "Assessment Result",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Assessment Criteria",
- "link_count": 0,
- "link_to": "Assessment Criteria",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Assessment Reports",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "Assessment Result",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Course wise Assessment Report",
- "link_count": 0,
- "link_to": "Course wise Assessment Report",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "Assessment Result",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Final Assessment Grades",
- "link_count": 0,
- "link_to": "Final Assessment Grades",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "Assessment Plan",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Assessment Plan Status",
- "link_count": 0,
- "link_to": "Assessment Plan Status",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Report Generation Tool",
- "link_count": 0,
- "link_to": "Student Report Generation Tool",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Tools",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Attendance Tool",
- "link_count": 0,
- "link_to": "Student Attendance Tool",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Assessment Result Tool",
- "link_count": 0,
- "link_to": "Assessment Result Tool",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Student Group Creation Tool",
- "link_count": 0,
- "link_to": "Student Group Creation Tool",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Program Enrollment Tool",
- "link_count": 0,
- "link_to": "Program Enrollment Tool",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Course Scheduling Tool",
- "link_count": 0,
- "link_to": "Course Scheduling Tool",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Other Reports",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "Program Enrollment",
- "hidden": 0,
- "is_query_report": 1,
- "label": "Student and Guardian Contact Details",
- "link_count": 0,
- "link_to": "Student and Guardian Contact Details",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- }
- ],
- "modified": "2022-01-13 17:29:13.676542",
- "modified_by": "Administrator",
- "module": "Education",
- "name": "Education",
- "owner": "Administrator",
- "parent_page": "",
- "public": 1,
- "restrict_to_domain": "Education",
- "roles": [],
- "sequence_id": 9.0,
- "shortcuts": [
- {
- "color": "Grey",
- "format": "{} Active",
- "label": "Student",
- "link_to": "Student",
- "stats_filter": "{\n \"enabled\": 1\n}",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "format": "{} Active",
- "label": "Instructor",
- "link_to": "Instructor",
- "stats_filter": "{\n \"status\": \"Active\"\n}",
- "type": "DocType"
- },
- {
- "color": "",
- "format": "",
- "label": "Program",
- "link_to": "Program",
- "stats_filter": "",
- "type": "DocType"
- },
- {
- "label": "Course",
- "link_to": "Course",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "format": "{} Unpaid",
- "label": "Fees",
- "link_to": "Fees",
- "stats_filter": "{\n \"outstanding_amount\": [\"!=\", 0.0]\n}",
- "type": "DocType"
- },
- {
- "label": "Student Monthly Attendance Sheet",
- "link_to": "Student Monthly Attendance Sheet",
- "type": "Report"
- },
- {
- "label": "Course Scheduling Tool",
- "link_to": "Course Scheduling Tool",
- "type": "DocType"
- },
- {
- "label": "Student Attendance Tool",
- "link_to": "Student Attendance Tool",
- "type": "DocType"
- },
- {
- "label": "Dashboard",
- "link_to": "Education",
- "type": "Dashboard"
- }
- ],
- "title": "Education"
-}
\ No newline at end of file
diff --git a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py
index 46a4d3c..6d977e0 100644
--- a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py
+++ b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py
@@ -32,7 +32,7 @@
error_message = (
frappe.get_traceback() + "\n\n Request Data: \n" + json.loads(frappe.request.data).__str__()
)
- frappe.log_error(error_message, "WooCommerce Error")
+ frappe.log_error("WooCommerce Error", error_message)
raise
diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py
index e1972ae..55517e4 100644
--- a/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py
+++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py
@@ -107,7 +107,7 @@
return self.create_charge_on_gocardless()
except Exception:
- frappe.log_error(frappe.get_traceback())
+ frappe.log_error("Gocardless payment reqeust failed")
return {
"redirect_to": frappe.redirect_to_message(
_("Server Error"),
@@ -163,21 +163,15 @@
or payment.status == "charged_back"
):
self.integration_request.db_set("status", "Cancelled", update_modified=False)
- frappe.log_error(
- _("Payment Cancelled. Please check your GoCardless Account for more details"),
- "GoCardless Payment Error",
- )
+ frappe.log_error("Gocardless payment cancelled")
self.integration_request.db_set("error", payment.status, update_modified=False)
else:
self.integration_request.db_set("status", "Failed", update_modified=False)
- frappe.log_error(
- _("Payment Failed. Please check your GoCardless Account for more details"),
- "GoCardless Payment Error",
- )
+ frappe.log_error("Gocardless payment failed")
self.integration_request.db_set("error", payment.status, update_modified=False)
except Exception as e:
- frappe.log_error(e, "GoCardless Payment Error")
+ frappe.log_error("GoCardless Payment Error")
if self.flags.status_changed_to == "Completed":
status = "Completed"
@@ -188,7 +182,7 @@
self.data.get("reference_doctype"), self.data.get("reference_docname")
).run_method("on_payment_authorized", self.flags.status_changed_to)
except Exception:
- frappe.log_error(frappe.get_traceback())
+ frappe.log_error("Gocardless redirect failed")
if custom_redirect_to:
redirect_to = custom_redirect_to
diff --git a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_settings.py b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_settings.py
index 78a598c..e389980 100644
--- a/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_settings.py
+++ b/erpnext/erpnext_integrations/doctype/mpesa_settings/mpesa_settings.py
@@ -152,7 +152,7 @@
return response
except Exception:
- frappe.log_error(title=_("Mpesa Express Transaction Error"))
+ frappe.log_error("Mpesa Express Transaction Error")
frappe.throw(
_("Issue detected with Mpesa configuration, check the error logs for more details"),
title=_("Mpesa Express Error"),
@@ -203,7 +203,7 @@
integration_request.handle_success(transaction_response)
except Exception:
integration_request.handle_failure(transaction_response)
- frappe.log_error(frappe.get_traceback())
+ frappe.log_error("Mpesa: Failed to verify transaction")
else:
integration_request.handle_failure(transaction_response)
@@ -275,7 +275,7 @@
)
return response
except Exception:
- frappe.log_error(title=_("Account Balance Processing Error"))
+ frappe.log_error("Mpesa: Failed to get account balance")
frappe.throw(_("Please check your configuration and try again"), title=_("Error"))
@@ -315,7 +315,7 @@
except Exception:
request.handle_failure(account_balance_response)
frappe.log_error(
- title=_("Mpesa Account Balance Processing Error"), message=account_balance_response
+ title="Mpesa Account Balance Processing Error", message=account_balance_response
)
else:
request.handle_failure(account_balance_response)
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
index 625dd31..38d6993 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
@@ -23,7 +23,7 @@
def get_access_token(self, public_token):
if public_token is None:
- frappe.log_error(_("Public token is missing for this bank"), _("Plaid public token error"))
+ frappe.log_error("Plaid: Public token is missing")
response = self.client.Item.public_token.exchange(public_token)
access_token = response["access_token"]
return access_token
@@ -61,10 +61,10 @@
try:
response = self.client.LinkToken.create(token_request)
except InvalidRequestError:
- frappe.log_error(frappe.get_traceback(), _("Plaid invalid request error"))
+ frappe.log_error("Plaid: Invalid request error")
frappe.msgprint(_("Please check your Plaid client ID and secret values"))
except APIError as e:
- frappe.log_error(frappe.get_traceback(), _("Plaid authentication error"))
+ frappe.log_error("Plaid: Authentication error")
frappe.throw(_(str(e)), title=_("Authentication Failed"))
else:
return response["link_token"]
@@ -81,7 +81,7 @@
except requests.Timeout:
pass
except Exception as e:
- frappe.log_error(frappe.get_traceback(), _("Plaid authentication error"))
+ frappe.log_error("Plaid: Authentication error")
frappe.throw(_(str(e)), title=_("Authentication Failed"))
def get_transactions(self, start_date, end_date, account_id=None):
@@ -102,4 +102,4 @@
except ItemError as e:
raise e
except Exception:
- frappe.log_error(frappe.get_traceback(), _("Plaid transactions sync error"))
+ frappe.log_error("Plaid: Transactions sync error")
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
index ce65f6c..62ea85f 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
@@ -54,7 +54,7 @@
)
bank.insert()
except Exception:
- frappe.log_error(frappe.get_traceback(), title=_("Plaid Link Error"))
+ frappe.log_error("Plaid Link Error")
else:
bank = frappe.get_doc("Bank", response["institution"]["name"])
bank.plaid_access_token = access_token
@@ -113,7 +113,7 @@
_("Bank account {0} already exists and could not be created again").format(account["name"])
)
except Exception:
- frappe.log_error(frappe.get_traceback(), title=_("Plaid Link Error"))
+ frappe.log_error("Plaid Link Error")
frappe.throw(
_("There was an error creating Bank Account while linking with Plaid."),
title=_("Plaid Link Failed"),
@@ -135,7 +135,7 @@
existing_account.save()
result.append(existing_bank_account)
except Exception:
- frappe.log_error(frappe.get_traceback(), title=_("Plaid Link Error"))
+ frappe.log_error("Plaid Link Error")
frappe.throw(
_("There was an error updating Bank Account {} while linking with Plaid.").format(
existing_bank_account
diff --git a/erpnext/erpnext_integrations/exotel_integration.py b/erpnext/erpnext_integrations/exotel_integration.py
index 522de9e..fd9f74e 100644
--- a/erpnext/erpnext_integrations/exotel_integration.py
+++ b/erpnext/erpnext_integrations/exotel_integration.py
@@ -1,6 +1,5 @@
import frappe
import requests
-from frappe import _
# api/method/erpnext.erpnext_integrations.exotel_integration.handle_incoming_call
# api/method/erpnext.erpnext_integrations.exotel_integration.handle_end_call
@@ -26,8 +25,7 @@
update_call_log(call_payload, call_log=call_log)
except Exception as e:
frappe.db.rollback()
- frappe.log_error(title=_("Error in Exotel incoming call"))
- frappe.db.commit()
+ exotel_settings.log_error("Error in Exotel incoming call")
@frappe.whitelist(allow_guest=True)
diff --git a/erpnext/erpnext_integrations/stripe_integration.py b/erpnext/erpnext_integrations/stripe_integration.py
index b12adc1..2d7e8a5 100644
--- a/erpnext/erpnext_integrations/stripe_integration.py
+++ b/erpnext/erpnext_integrations/stripe_integration.py
@@ -22,7 +22,7 @@
return create_subscription_on_stripe(stripe_settings)
except Exception:
- frappe.log_error(frappe.get_traceback())
+ stripe_settings.log_error("Unable to create Stripe subscription")
return {
"redirect_to": frappe.redirect_to_message(
_("Server Error"),
@@ -55,9 +55,9 @@
else:
stripe_settings.integration_request.db_set("status", "Failed", update_modified=False)
- frappe.log_error("Subscription N°: " + subscription.id, "Stripe Payment not completed")
+ frappe.log_error(f"Stripe Subscription ID {subscription.id}: Payment failed")
except Exception:
stripe_settings.integration_request.db_set("status", "Failed", update_modified=False)
- frappe.log_error(frappe.get_traceback())
+ stripe_settings.log_error("Unable to create Stripe subscription")
return stripe_settings.finalize_request()
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index fe0a89a..5f0e5f7 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -62,14 +62,12 @@
"Supplier Group",
"Sales Person",
"Territory",
- "Assessment Group",
"Department",
]
# website
update_website_context = [
"erpnext.e_commerce.shopping_cart.utils.update_website_context",
- "erpnext.education.doctype.education_settings.education_settings.update_website_context",
]
my_account_context = "erpnext.e_commerce.shopping_cart.utils.update_my_account_context"
webform_list_context = "erpnext.controllers.website_list_for_contact.get_webform_list_context"
@@ -80,25 +78,16 @@
"Leave Application",
"Sales Order",
"Holiday List",
- "Course Schedule",
]
domains = {
"Distribution": "erpnext.domains.distribution",
- "Education": "erpnext.domains.education",
"Manufacturing": "erpnext.domains.manufacturing",
"Retail": "erpnext.domains.retail",
"Services": "erpnext.domains.services",
}
-website_generators = [
- "Item Group",
- "Website Item",
- "BOM",
- "Sales Partner",
- "Job Opening",
- "Student Admission",
-]
+website_generators = ["Item Group", "Website Item", "BOM", "Sales Partner", "Job Opening"]
website_context = {
"favicon": "/assets/erpnext/images/erpnext-favicon.svg",
@@ -182,7 +171,6 @@
"defaults": {"doctype": "Address", "parents": [{"label": _("Addresses"), "route": "addresses"}]},
},
{"from_route": "/jobs", "to_route": "Job Opening"},
- {"from_route": "/admissions", "to_route": "Student Admission"},
{"from_route": "/boms", "to_route": "BOM"},
{"from_route": "/timesheets", "to_route": "Timesheet"},
{"from_route": "/material-requests", "to_route": "Material Request"},
@@ -255,15 +243,8 @@
"reference_doctype": "Timesheet",
"role": "Customer",
},
- {"title": _("Fees"), "route": "/fees", "reference_doctype": "Fees", "role": "Student"},
{"title": _("Newsletter"), "route": "/newsletters", "reference_doctype": "Newsletter"},
{
- "title": _("Admission"),
- "route": "/admissions",
- "reference_doctype": "Student Admission",
- "role": "Student",
- },
- {
"title": _("Material Request"),
"route": "/material-requests",
"reference_doctype": "Material Request",
@@ -275,7 +256,6 @@
default_roles = [
{"role": "Customer", "doctype": "Contact", "email_field": "email_id"},
{"role": "Supplier", "doctype": "Contact", "email_field": "email_id"},
- {"role": "Student", "doctype": "Student", "email_field": "student_email_id"},
]
sounds = [
@@ -539,11 +519,8 @@
"Landed Cost Item",
"Asset Value Adjustment",
"Loyalty Program",
- "Fee Schedule",
- "Fee Structure",
"Stock Reconciliation",
"Travel Request",
- "Fees",
"POS Profile",
"Opening Invoice Creation Tool",
"Opening Invoice Creation Tool Item",
@@ -551,6 +528,9 @@
"Subscription Plan",
"POS Invoice",
"POS Invoice Item",
+ "Purchase Order",
+ "Purchase Receipt",
+ "Sales Order",
]
regional_overrides = {
@@ -646,48 +626,6 @@
{"doctype": "Maintenance Visit", "index": 46},
{"doctype": "Warranty Claim", "index": 47},
],
- "Education": [
- {"doctype": "Article", "index": 1},
- {"doctype": "Video", "index": 2},
- {"doctype": "Topic", "index": 3},
- {"doctype": "Course", "index": 4},
- {"doctype": "Program", "index": 5},
- {"doctype": "Quiz", "index": 6},
- {"doctype": "Question", "index": 7},
- {"doctype": "Fee Schedule", "index": 8},
- {"doctype": "Fee Structure", "index": 9},
- {"doctype": "Fees", "index": 10},
- {"doctype": "Student Group", "index": 11},
- {"doctype": "Student", "index": 12},
- {"doctype": "Instructor", "index": 13},
- {"doctype": "Course Activity", "index": 14},
- {"doctype": "Quiz Activity", "index": 15},
- {"doctype": "Course Enrollment", "index": 16},
- {"doctype": "Program Enrollment", "index": 17},
- {"doctype": "Student Language", "index": 18},
- {"doctype": "Student Applicant", "index": 19},
- {"doctype": "Assessment Result", "index": 20},
- {"doctype": "Assessment Plan", "index": 21},
- {"doctype": "Grading Scale", "index": 22},
- {"doctype": "Guardian", "index": 23},
- {"doctype": "Student Leave Application", "index": 24},
- {"doctype": "Student Log", "index": 25},
- {"doctype": "Room", "index": 26},
- {"doctype": "Course Schedule", "index": 27},
- {"doctype": "Student Attendance", "index": 28},
- {"doctype": "Announcement", "index": 29},
- {"doctype": "Student Category", "index": 30},
- {"doctype": "Assessment Group", "index": 31},
- {"doctype": "Student Batch Name", "index": 32},
- {"doctype": "Assessment Criteria", "index": 33},
- {"doctype": "Academic Year", "index": 34},
- {"doctype": "Academic Term", "index": 35},
- {"doctype": "School House", "index": 36},
- {"doctype": "Student Admission", "index": 37},
- {"doctype": "Fee Category", "index": 38},
- {"doctype": "Assessment Code", "index": 39},
- {"doctype": "Discussion", "index": 40},
- ],
}
additional_timeline_content = {
diff --git a/erpnext/hr/doctype/training_event/training_event.json b/erpnext/hr/doctype/training_event/training_event.json
index fcf845a..42e02ca 100644
--- a/erpnext/hr/doctype/training_event/training_event.json
+++ b/erpnext/hr/doctype/training_event/training_event.json
@@ -1,850 +1,231 @@
{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:event_name",
- "beta": 0,
- "creation": "2016-08-08 04:53:58.355206",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
+ "actions": [],
+ "allow_import": 1,
+ "allow_rename": 1,
+ "autoname": "field:event_name",
+ "creation": "2016-08-08 04:53:58.355206",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "event_name",
+ "training_program",
+ "event_status",
+ "has_certificate",
+ "column_break_2",
+ "type",
+ "level",
+ "company",
+ "section_break_4",
+ "trainer_name",
+ "trainer_email",
+ "column_break_7",
+ "supplier",
+ "contact_number",
+ "section_break_9",
+ "course",
+ "location",
+ "column_break_12",
+ "start_time",
+ "end_time",
+ "section_break_15",
+ "introduction",
+ "section_break_18",
+ "employees",
+ "amended_from",
+ "employee_emails"
+ ],
"fields": [
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "event_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Event Name",
- "length": 0,
- "no_copy": 1,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "event_name",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Event Name",
+ "no_copy": 1,
+ "reqd": 1,
+ "unique": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "training_program",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Training Program",
- "length": 0,
- "no_copy": 0,
- "options": "Training Program",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "training_program",
+ "fieldtype": "Link",
+ "label": "Training Program",
+ "options": "Training Program"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 1,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "event_status",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Event Status",
- "length": 0,
- "no_copy": 0,
- "options": "Scheduled\nCompleted\nCancelled",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "allow_on_submit": 1,
+ "fieldname": "event_status",
+ "fieldtype": "Select",
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "Event Status",
+ "options": "Scheduled\nCompleted\nCancelled",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.type == 'Seminar' || doc.type == 'Workshop' || doc.type == 'Conference' || doc.type == 'Exam'",
- "fieldname": "has_certificate",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Has Certificate",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "default": "0",
+ "depends_on": "eval:doc.type == 'Seminar' || doc.type == 'Workshop' || doc.type == 'Conference' || doc.type == 'Exam'",
+ "fieldname": "has_certificate",
+ "fieldtype": "Check",
+ "label": "Has Certificate"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_2",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "column_break_2",
+ "fieldtype": "Column Break"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "type",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Type",
- "length": 0,
- "no_copy": 0,
- "options": "Seminar\nTheory\nWorkshop\nConference\nExam\nInternet\nSelf-Study",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "type",
+ "fieldtype": "Select",
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "Type",
+ "options": "Seminar\nTheory\nWorkshop\nConference\nExam\nInternet\nSelf-Study",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.type == 'Seminar' || doc.type == 'Workshop' || doc.type == 'Exam'",
- "fieldname": "level",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Level",
- "length": 0,
- "no_copy": 0,
- "options": "\nBeginner\nIntermediate\nAdvance",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "depends_on": "eval:doc.type == 'Seminar' || doc.type == 'Workshop' || doc.type == 'Exam'",
+ "fieldname": "level",
+ "fieldtype": "Select",
+ "label": "Level",
+ "options": "\nBeginner\nIntermediate\nAdvance"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "company",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Company",
- "length": 0,
- "no_copy": 0,
- "options": "Company",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "label": "Company",
+ "options": "Company"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_4",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "section_break_4",
+ "fieldtype": "Section Break"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "trainer_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Trainer Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "trainer_name",
+ "fieldtype": "Data",
+ "label": "Trainer Name"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "trainer_email",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Trainer Email",
- "length": 0,
- "no_copy": 0,
- "options": "",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "trainer_email",
+ "fieldtype": "Data",
+ "label": "Trainer Email"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_7",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "column_break_7",
+ "fieldtype": "Column Break"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "supplier",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Supplier",
- "length": 0,
- "no_copy": 0,
- "options": "Supplier",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "supplier",
+ "fieldtype": "Link",
+ "label": "Supplier",
+ "options": "Supplier"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "contact_number",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Contact Number",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "contact_number",
+ "fieldtype": "Data",
+ "label": "Contact Number"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_9",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "section_break_9",
+ "fieldtype": "Section Break"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "course",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 1,
- "label": "Course",
- "length": 0,
- "no_copy": 0,
- "options": "Course",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "course",
+ "fieldtype": "Data",
+ "in_standard_filter": 1,
+ "label": "Course"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "location",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Location",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "location",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "Location",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_12",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "column_break_12",
+ "fieldtype": "Column Break"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "start_time",
- "fieldtype": "Datetime",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Start Time",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "start_time",
+ "fieldtype": "Datetime",
+ "label": "Start Time",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "end_time",
- "fieldtype": "Datetime",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "End Time",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "end_time",
+ "fieldtype": "Datetime",
+ "label": "End Time",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_15",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "section_break_15",
+ "fieldtype": "Section Break"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "introduction",
- "fieldtype": "Text Editor",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Introduction",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "introduction",
+ "fieldtype": "Text Editor",
+ "label": "Introduction",
+ "reqd": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "section_break_18",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Attendees",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "section_break_18",
+ "fieldtype": "Section Break",
+ "label": "Attendees"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 1,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "employees",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Employees",
- "length": 0,
- "no_copy": 0,
- "options": "Training Event Employee",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "allow_on_submit": 1,
+ "fieldname": "employees",
+ "fieldtype": "Table",
+ "label": "Employees",
+ "options": "Training Event Employee"
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Amended From",
- "length": 0,
- "no_copy": 1,
- "options": "Training Event",
- "permlevel": 0,
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "fieldname": "amended_from",
+ "fieldtype": "Link",
+ "label": "Amended From",
+ "no_copy": 1,
+ "options": "Training Event",
+ "print_hide": 1,
+ "read_only": 1
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "employee_emails",
- "fieldtype": "Small Text",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Employee Emails",
- "length": 0,
- "no_copy": 0,
- "options": "Email",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
+ "fieldname": "employee_emails",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Employee Emails",
+ "options": "Email"
}
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 1,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2019-03-12 10:56:29.065781",
- "modified_by": "Administrator",
- "module": "HR",
- "name": "Training Event",
- "name_case": "",
- "owner": "Administrator",
+ ],
+ "is_submittable": 1,
+ "links": [],
+ "modified": "2022-04-28 13:29:35.139497",
+ "modified_by": "Administrator",
+ "module": "HR",
+ "name": "Training Event",
+ "naming_rule": "By fieldname",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 1,
- "apply_user_permissions": 0,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "HR Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 1,
+ "amend": 1,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "import": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "HR Manager",
+ "share": 1,
+ "submit": 1,
"write": 1
}
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "search_fields": "event_name",
- "show_name_in_global_search": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "title_field": "event_name",
- "track_changes": 0,
- "track_seen": 0
-}
+ ],
+ "search_fields": "event_name",
+ "show_name_in_global_search": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "states": [],
+ "title_field": "event_name"
+}
\ No newline at end of file
diff --git a/erpnext/hr/doctype/training_feedback/training_feedback.json b/erpnext/hr/doctype/training_feedback/training_feedback.json
index ebf5a50..e968911 100644
--- a/erpnext/hr/doctype/training_feedback/training_feedback.json
+++ b/erpnext/hr/doctype/training_feedback/training_feedback.json
@@ -1,7 +1,7 @@
{
"actions": [],
"autoname": "HR-TRF-.YYYY.-.#####",
- "creation": "2016-08-08 06:35:34.158568",
+ "creation": "2022-01-27 13:14:35.935580",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
@@ -46,9 +46,8 @@
{
"fetch_from": "training_event.course",
"fieldname": "course",
- "fieldtype": "Link",
+ "fieldtype": "Data",
"label": "Course",
- "options": "Course",
"read_only": 1
},
{
@@ -101,7 +100,7 @@
],
"is_submittable": 1,
"links": [],
- "modified": "2022-01-18 19:32:20.805277",
+ "modified": "2022-04-28 13:32:29.261421",
"modified_by": "Administrator",
"module": "HR",
"name": "Training Feedback",
diff --git a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
index 139dcbc..c0770fa 100644
--- a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
+++ b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
@@ -154,7 +154,7 @@
except Exception:
frappe.db.rollback()
- error_log = frappe.log_error(message=frappe.get_traceback(), title=_("BOM Update Tool Error"))
+ error_log = doc.log_error("BOM Update Tool Error")
doc.db_set("status", "Failed")
doc.db_set("error_log", error_log.name)
diff --git a/erpnext/modules.txt b/erpnext/modules.txt
index c6b3159..869166b 100644
--- a/erpnext/modules.txt
+++ b/erpnext/modules.txt
@@ -12,7 +12,6 @@
Assets
Portal
Maintenance
-Education
Regional
ERPNext Integrations
Quality Management
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index d6c44cb..d5b1592 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -333,6 +333,7 @@
erpnext.patches.v13_0.enable_provisional_accounting
erpnext.patches.v13_0.non_profit_deprecation_warning
erpnext.patches.v13_0.enable_ksa_vat_docs #1
+erpnext.patches.v14_0.delete_education_doctypes
[post_model_sync]
erpnext.patches.v14_0.rename_ongoing_status_in_sla_documents
@@ -365,5 +366,7 @@
erpnext.patches.v13_0.update_expense_claim_status_for_paid_advances
erpnext.patches.v13_0.create_gst_custom_fields_in_quotation
erpnext.patches.v13_0.copy_custom_field_filters_to_website_item
+erpnext.patches.v13_0.change_default_item_manufacturer_fieldtype
erpnext.patches.v14_0.discount_accounting_separation
erpnext.patches.v14_0.delete_employee_transfer_property_doctype
+erpnext.patches.v13_0.create_accounting_dimensions_in_orders
\ No newline at end of file
diff --git a/erpnext/patches/v11_0/refactor_autoname_naming.py b/erpnext/patches/v11_0/refactor_autoname_naming.py
index de453cc..fa8f4eb 100644
--- a/erpnext/patches/v11_0/refactor_autoname_naming.py
+++ b/erpnext/patches/v11_0/refactor_autoname_naming.py
@@ -69,8 +69,6 @@
"Soil Analysis": "AG-ANA-.YY.-.MM.-.#####",
"Soil Texture": "AG-TEX-.YYYY.-.#####",
"Stock Ledger Entry": "MAT-SLE-.YYYY.-.#####",
- "Student Leave Application": "EDU-SLA-.YYYY.-.#####",
- "Student Log": "EDU-SLOG-.YYYY.-.#####",
"Subscription": "ACC-SUB-.YYYY.-.#####",
"Task": "TASK-.YYYY.-.#####",
"Tax Rule": "ACC-TAX-RULE-.YYYY.-.#####",
diff --git a/erpnext/patches/v11_0/refactor_naming_series.py b/erpnext/patches/v11_0/refactor_naming_series.py
index 4945860..cdc92fe 100644
--- a/erpnext/patches/v11_0/refactor_naming_series.py
+++ b/erpnext/patches/v11_0/refactor_naming_series.py
@@ -55,8 +55,6 @@
"Shareholder": "ACC-SH-.YYYY.-",
"Stock Entry": "MAT-STE-.YYYY.-",
"Stock Reconciliation": "MAT-RECO-.YYYY.-",
- "Student": "EDU-STU-.YYYY.-",
- "Student Applicant": "EDU-APP-.YYYY.-",
"Supplier": "SUP-.YYYY.-",
"Supplier Quotation": "PUR-SQTN-.YYYY.-",
"Supplier Scorecard Period": "PU-SSP-.YYYY.-",
diff --git a/erpnext/patches/v11_0/set_department_for_doctypes.py b/erpnext/patches/v11_0/set_department_for_doctypes.py
index 1e14b9c..4900458 100644
--- a/erpnext/patches/v11_0/set_department_for_doctypes.py
+++ b/erpnext/patches/v11_0/set_department_for_doctypes.py
@@ -19,7 +19,6 @@
"Training Event Employee",
"Payroll Employee Detail",
],
- "education": ["Instructor"],
"projects": ["Activity Cost", "Timesheet"],
"setup": ["Sales Person"],
}
diff --git a/erpnext/patches/v11_0/update_account_type_in_party_type.py b/erpnext/patches/v11_0/update_account_type_in_party_type.py
index e55f9f2..47252eb 100644
--- a/erpnext/patches/v11_0/update_account_type_in_party_type.py
+++ b/erpnext/patches/v11_0/update_account_type_in_party_type.py
@@ -13,7 +13,6 @@
"Employee": "Payable",
"Member": "Receivable",
"Shareholder": "Payable",
- "Student": "Receivable",
}
for party_type, account_type in party_types.items():
diff --git a/erpnext/patches/v12_0/move_bank_account_swift_number_to_bank.py b/erpnext/patches/v12_0/move_bank_account_swift_number_to_bank.py
index c069c24..671dfd1 100644
--- a/erpnext/patches/v12_0/move_bank_account_swift_number_to_bank.py
+++ b/erpnext/patches/v12_0/move_bank_account_swift_number_to_bank.py
@@ -17,7 +17,7 @@
"""
)
except Exception as e:
- frappe.log_error(e, title="Patch Migration Failed")
+ frappe.log_error("Bank to Bank Account patch migration failed")
frappe.reload_doc("accounts", "doctype", "bank_account")
frappe.reload_doc("accounts", "doctype", "payment_request")
diff --git a/erpnext/patches/v13_0/add_missing_fg_item_for_stock_entry.py b/erpnext/patches/v13_0/add_missing_fg_item_for_stock_entry.py
index 517a14a..ddbb7fd 100644
--- a/erpnext/patches/v13_0/add_missing_fg_item_for_stock_entry.py
+++ b/erpnext/patches/v13_0/add_missing_fg_item_for_stock_entry.py
@@ -96,8 +96,7 @@
make_sl_entries(sl_entries, True)
except Exception:
print(f"SLE entries not posted for the stock entry {doc.name}")
- traceback = frappe.get_traceback()
- frappe.log_error(traceback)
+ doc.log_error("Stock respost failed")
def get_sle_for_target_warehouse(doc, sl_entries, finished_item_row):
diff --git a/erpnext/patches/v13_0/change_default_item_manufacturer_fieldtype.py b/erpnext/patches/v13_0/change_default_item_manufacturer_fieldtype.py
new file mode 100644
index 0000000..0b00188
--- /dev/null
+++ b/erpnext/patches/v13_0/change_default_item_manufacturer_fieldtype.py
@@ -0,0 +1,16 @@
+import frappe
+
+
+def execute():
+
+ # Erase all default item manufacturers that dont exist.
+ item = frappe.qb.DocType("Item")
+ manufacturer = frappe.qb.DocType("Manufacturer")
+
+ (
+ frappe.qb.update(item)
+ .set(item.default_item_manufacturer, None)
+ .left_join(manufacturer)
+ .on(item.default_item_manufacturer == manufacturer.name)
+ .where(manufacturer.name.isnull() & item.default_item_manufacturer.isnotnull())
+ ).run()
diff --git a/erpnext/patches/v13_0/convert_to_website_item_in_item_card_group_template.py b/erpnext/patches/v13_0/convert_to_website_item_in_item_card_group_template.py
index 020521d..1bac0fd 100644
--- a/erpnext/patches/v13_0/convert_to_website_item_in_item_card_group_template.py
+++ b/erpnext/patches/v13_0/convert_to_website_item_in_item_card_group_template.py
@@ -56,8 +56,5 @@
web_item = make_website_item(doc) # returns [website_item.name, item_name]
return web_item[0]
except Exception:
- title = f"{item}: Error while converting to Website Item "
- frappe.log_error(
- title + "for Item Card Group Template" + "\n\n" + frappe.get_traceback(), title=title
- )
+ doc.log_error("Website Item creation failed")
return None
diff --git a/erpnext/patches/v13_0/create_accounting_dimensions_in_orders.py b/erpnext/patches/v13_0/create_accounting_dimensions_in_orders.py
new file mode 100644
index 0000000..8a3f1d0
--- /dev/null
+++ b/erpnext/patches/v13_0/create_accounting_dimensions_in_orders.py
@@ -0,0 +1,39 @@
+import frappe
+from frappe.custom.doctype.custom_field.custom_field import create_custom_field
+
+
+def execute():
+ accounting_dimensions = frappe.db.get_all(
+ "Accounting Dimension", fields=["fieldname", "label", "document_type", "disabled"]
+ )
+
+ if not accounting_dimensions:
+ return
+
+ count = 1
+ for d in accounting_dimensions:
+
+ if count % 2 == 0:
+ insert_after_field = "dimension_col_break"
+ else:
+ insert_after_field = "accounting_dimensions_section"
+
+ for doctype in ["Purchase Order", "Purchase Receipt", "Sales Order"]:
+
+ field = frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": d.fieldname})
+
+ if field:
+ continue
+
+ df = {
+ "fieldname": d.fieldname,
+ "label": d.label,
+ "fieldtype": "Link",
+ "options": d.document_type,
+ "insert_after": insert_after_field,
+ }
+
+ create_custom_field(doctype, df, ignore_validate=False)
+ frappe.clear_cache(doctype=doctype)
+
+ count += 1
diff --git a/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py b/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
index 492e040..6c64ef6 100644
--- a/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
+++ b/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
@@ -40,7 +40,10 @@
)
if purchase_invoices + sales_invoices:
- frappe.log_error(json.dumps(purchase_invoices + sales_invoices, indent=2), title="Patch Log")
+ frappe.log_error(
+ "Fix invalid gain / loss patch log",
+ message=json.dumps(purchase_invoices + sales_invoices, indent=2),
+ )
acc_frozen_upto = frappe.db.get_value("Accounts Settings", None, "acc_frozen_upto")
if acc_frozen_upto:
diff --git a/erpnext/patches/v14_0/delete_education_doctypes.py b/erpnext/patches/v14_0/delete_education_doctypes.py
new file mode 100644
index 0000000..76b2300
--- /dev/null
+++ b/erpnext/patches/v14_0/delete_education_doctypes.py
@@ -0,0 +1,55 @@
+import click
+import frappe
+
+
+def execute():
+ if "education" in frappe.get_installed_apps():
+ return
+
+ frappe.delete_doc("Workspace", "Education", ignore_missing=True, force=True)
+
+ pages = frappe.get_all("Page", {"module": "education"}, pluck="name")
+ for page in pages:
+ frappe.delete_doc("Page", page, ignore_missing=True, force=True)
+
+ reports = frappe.get_all("Report", {"module": "education", "is_standard": "Yes"}, pluck="name")
+ for report in reports:
+ frappe.delete_doc("Report", report, ignore_missing=True, force=True)
+
+ print_formats = frappe.get_all(
+ "Print Format", {"module": "education", "standard": "Yes"}, pluck="name"
+ )
+ for print_format in print_formats:
+ frappe.delete_doc("Print Format", print_format, ignore_missing=True, force=True)
+
+ frappe.reload_doc("website", "doctype", "website_settings")
+ forms = frappe.get_all("Web Form", {"module": "education", "is_standard": 1}, pluck="name")
+ for form in forms:
+ frappe.delete_doc("Web Form", form, ignore_missing=True, force=True)
+
+ dashboards = frappe.get_all("Dashboard", {"module": "education", "is_standard": 1}, pluck="name")
+ for dashboard in dashboards:
+ frappe.delete_doc("Dashboard", dashboard, ignore_missing=True, force=True)
+
+ dashboards = frappe.get_all(
+ "Dashboard Chart", {"module": "education", "is_standard": 1}, pluck="name"
+ )
+ for dashboard in dashboards:
+ frappe.delete_doc("Dashboard Chart", dashboard, ignore_missing=True, force=True)
+
+ frappe.reload_doc("desk", "doctype", "number_card")
+ cards = frappe.get_all("Number Card", {"module": "education", "is_standard": 1}, pluck="name")
+ for card in cards:
+ frappe.delete_doc("Number Card", card, ignore_missing=True, force=True)
+
+ doctypes = frappe.get_all("DocType", {"module": "education", "custom": 0}, pluck="name")
+ for doctype in doctypes:
+ frappe.delete_doc("DocType", doctype, ignore_missing=True)
+
+ frappe.delete_doc("Module Def", "Education", ignore_missing=True, force=True)
+
+ click.secho(
+ "Education Module is moved to a separate app"
+ "Please install the app to continue using the module: https://github.com/frappe/education",
+ fg="yellow",
+ )
diff --git a/erpnext/patches/v14_0/discount_accounting_separation.py b/erpnext/patches/v14_0/discount_accounting_separation.py
index 8157982..0d1349a 100644
--- a/erpnext/patches/v14_0/discount_accounting_separation.py
+++ b/erpnext/patches/v14_0/discount_accounting_separation.py
@@ -5,7 +5,7 @@
data = frappe.db.sql(
'select value from tabSingles where doctype="Accounts Settings" and field="enable_discount_accounting"'
)
- discount_account = data and data[0][0] or 0
+ discount_account = data and int(data[0][0]) or 0
if discount_account:
for doctype in ["Buying Settings", "Selling Settings"]:
frappe.db.set_value(doctype, doctype, "enable_discount_accounting", 1, update_modified=False)
diff --git a/erpnext/patches/v14_0/rename_ongoing_status_in_sla_documents.py b/erpnext/patches/v14_0/rename_ongoing_status_in_sla_documents.py
index 2eb6bec..8ea96ab 100644
--- a/erpnext/patches/v14_0/rename_ongoing_status_in_sla_documents.py
+++ b/erpnext/patches/v14_0/rename_ongoing_status_in_sla_documents.py
@@ -18,4 +18,4 @@
).run()
except Exception:
- frappe.log_error(title="Failed to Patch SLA Status")
+ frappe.log_error("Failed to Patch SLA Status")
diff --git a/erpnext/portal/utils.py b/erpnext/portal/utils.py
index 09d1007..7be8c5d 100644
--- a/erpnext/portal/utils.py
+++ b/erpnext/portal/utils.py
@@ -23,10 +23,6 @@
doc.add_roles("Customer")
elif link.link_doctype == "Supplier" and "Supplier" not in roles:
doc.add_roles("Supplier")
- elif frappe.get_value("Student", dict(student_email_id=doc.email)) and "Student" not in roles:
- doc.add_roles("Student")
- elif frappe.get_value("Guardian", dict(email_address=doc.email)) and "Guardian" not in roles:
- doc.add_roles("Guardian")
def create_customer_or_supplier():
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 29f1ce4..8a8e1d1 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -9,9 +9,9 @@
from frappe.model.document import Document
from frappe.utils import add_days, flt, get_datetime, get_time, get_url, nowtime, today
+from erpnext import get_default_company
from erpnext.controllers.employee_boarding_controller import update_employee_boarding_status
from erpnext.controllers.queries import get_filters_cond
-from erpnext.education.doctype.student_attendance.student_attendance import get_holiday_list
from erpnext.hr.doctype.daily_work_summary.daily_work_summary import get_users_email
from erpnext.hr.doctype.holiday_list.holiday_list import is_holiday
@@ -86,6 +86,7 @@
type=task_details.type,
issue=task_details.issue,
is_group=task_details.is_group,
+ color=task_details.color,
)
).insert()
@@ -665,3 +666,17 @@
project.status = status
project.save()
+
+
+def get_holiday_list(company=None):
+ if not company:
+ company = get_default_company() or frappe.get_all("Company")[0].name
+
+ holiday_list = frappe.get_cached_value("Company", company, "default_holiday_list")
+ if not holiday_list:
+ frappe.throw(
+ _("Please set a default Holiday List for Company {0}").format(
+ frappe.bold(get_default_company())
+ )
+ )
+ return holiday_list
diff --git a/erpnext/public/js/education/assessment_result_tool.html b/erpnext/public/js/education/assessment_result_tool.html
deleted file mode 100644
index f7d1ab3..0000000
--- a/erpnext/public/js/education/assessment_result_tool.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<table class="table table-bordered assessment-result-tool">
- <thead>
- <tr>
- <th style="width: 90px" rowspan="2">Student</th>
- <th style="width: 170px" rowspan="2">Student Name</th>
- {% for c in criteria %}
- <th class="score" style="width: 100px">{{ c.assessment_criteria }}</th>
- {% endfor %}
- <th class="score" style="width: 170px" rowspan="2">Comments</th>
- <th class="score" style="width: 100px">Total Marks</th>
- <!--criteria-->
- </tr>
- <tr>
- {% for c in criteria %}
- <th class="score" style="width: 100px">Score ({{ c.maximum_score }})</th>
- {% endfor %}
- <th class="score" style="width: 100px">Score ({{max_total_score}})</th>
- </tr>
- </thead>
- <tbody>
- {% for s in students %}
- <tr
- {% if(s.assessment_details && s.docstatus && s.docstatus == 1) { %} class="text-muted" {% } %}
- data-student="{{s.student}}">
-
- <td>{{ s.student }}</td>
- <td>{{ s.student_name }}</td>
- {% for c in criteria %}
- <td>
- <span data-student="{{s.student}}" data-criteria="{{c.assessment_criteria}}" class="student-result-grade badge" >
- {% if(s.assessment_details) { %}
- {{s.assessment_details[c.assessment_criteria][1]}}
- {% } %}
- </span>
- <input type="number" class="student-result-data" style="width:70%; float:right;"
- data-max-score="{{c.maximum_score}}"
- data-criteria="{{c.assessment_criteria}}"
- data-student="{{s.student}}"
- {% if(s.assessment_details && s.docstatus && s.docstatus == 1) { %} disabled {% } %}
- {% if(s.assessment_details) { %}
- value="{{s.assessment_details[c.assessment_criteria][0]}}"
- {% } %}/>
- </td>
- {% endfor %}
- <td>
- <input type="text" class="result-comment" data-student="{{s.student}}"
- {% if(s.assessment_details && s.docstatus && s.docstatus == 1) { %} disabled {% } %}
- {% if(s.assessment_details) { %}
- value="{{s.assessment_details.comment}}"
- {% } %}
- </td>
- <td>
- <span data-student="{{s.student}}" class="total-score-grade badge" style="width:30%; float:left;">
- {% if(s.assessment_details) { %}
- {{s.assessment_details.total_score[1]}}
- {% } %}
- </span>
- <span data-student="{{s.student}}" class="total-score" style="width:60%; float:center;">
- {% if(s.assessment_details) { %}
- {{s.assessment_details.total_score[0]}}
- {% } %}
- </span>
- <span data-student="{{s.student}}" class="total-result-link" style="width: 10%; display:{% if(!s.assessment_details) { %}None{% } %}; float:right;">
- <a class="btn-open no-decoration" title="Open Link" href="/app/Form/Assessment Result/{% if(s.assessment_details) { %}{{s.name}}{% } %}">
- <i class="octicon octicon-arrow-right"></i>
- </a>
- </span>
- </td>
- </tr>
- {% endfor %}
- </tbody>
-</table>
diff --git a/erpnext/public/js/education/lms/quiz.js b/erpnext/public/js/education/lms/quiz.js
deleted file mode 100644
index 66160a7..0000000
--- a/erpnext/public/js/education/lms/quiz.js
+++ /dev/null
@@ -1,238 +0,0 @@
-class Quiz {
- constructor(wrapper, options) {
- this.wrapper = wrapper;
- Object.assign(this, options);
- this.questions = []
- this.refresh();
- }
-
- refresh() {
- this.get_quiz();
- }
-
- get_quiz() {
- frappe.call('erpnext.education.utils.get_quiz', {
- quiz_name: this.name,
- course: this.course
- }).then(res => {
- this.make(res.message)
- });
- }
-
- make(data) {
- if (data.is_time_bound) {
- $(".lms-timer").removeClass("hide");
- if (!data.activity || (data.activity && !data.activity.is_complete)) {
- this.initialiseTimer(data.duration);
- this.is_time_bound = true;
- this.time_taken = 0;
- }
- }
- data.questions.forEach(question_data => {
- let question_wrapper = document.createElement('div');
- let question = new Question({
- wrapper: question_wrapper,
- ...question_data
- });
- this.questions.push(question)
- this.wrapper.appendChild(question_wrapper);
- })
- if (data.activity && data.activity.is_complete) {
- this.disable()
- let indicator = 'red'
- let message = 'Your are not allowed to attempt the quiz again.'
- if (data.activity.result == 'Pass') {
- indicator = 'green'
- message = 'You have already cleared the quiz.'
- }
- if (data.activity.time_taken) {
- this.calculate_and_display_time(data.activity.time_taken, "Time Taken - ");
- }
- this.set_quiz_footer(message, indicator, data.activity.score)
- }
- else {
- this.make_actions();
- }
- window.addEventListener('beforeunload', (event) => {
- event.preventDefault();
- event.returnValue = '';
- });
- }
-
- initialiseTimer(duration) {
- this.time_left = duration;
- var self = this;
- var old_diff;
- this.calculate_and_display_time(this.time_left, "Time Left - ");
- this.start_time = new Date().getTime();
- this.timer = setInterval(function () {
- var diff = (new Date().getTime() - self.start_time)/1000;
- var variation = old_diff ? diff - old_diff : diff;
- old_diff = diff;
- self.time_left -= variation;
- self.time_taken += variation;
- self.calculate_and_display_time(self.time_left, "Time Left - ");
- if (self.time_left <= 0) {
- clearInterval(self.timer);
- self.time_taken -= 1;
- self.submit();
- }
- }, 1000);
- }
-
- calculate_and_display_time(second, text) {
- var timer_display = document.getElementsByClassName("lms-timer")[0];
- var hours = this.append_zero(Math.floor(second / 3600));
- var minutes = this.append_zero(Math.floor(second % 3600 / 60));
- var seconds = this.append_zero(Math.ceil(second % 3600 % 60));
- timer_display.innerText = text + hours + ":" + minutes + ":" + seconds;
- }
-
- append_zero(time) {
- return time > 9 ? time : "0" + time;
- }
-
- make_actions() {
- const button = document.createElement("button");
- button.classList.add("btn", "btn-primary", "mt-5", "mr-2");
-
- button.id = 'submit-button';
- button.innerText = 'Submit';
- button.onclick = () => this.submit();
- this.submit_btn = button
- this.wrapper.appendChild(button);
- }
-
- submit() {
- if (this.is_time_bound) {
- clearInterval(this.timer);
- $(".lms-timer").text("");
- }
- this.submit_btn.innerText = 'Evaluating..'
- this.submit_btn.disabled = true
- this.disable()
- frappe.call('erpnext.education.utils.evaluate_quiz', {
- quiz_name: this.name,
- quiz_response: this.get_selected(),
- course: this.course,
- program: this.program,
- time_taken: this.is_time_bound ? this.time_taken : 0
- }).then(res => {
- this.submit_btn.remove()
- if (!res.message) {
- frappe.throw(__("Something went wrong while evaluating the quiz."))
- }
-
- let indicator = 'red'
- let message = 'Fail'
- if (res.message.status == 'Pass') {
- indicator = 'green'
- message = 'Congratulations, you cleared the quiz.'
- }
-
- this.set_quiz_footer(message, indicator, res.message.score)
- });
- }
-
- set_quiz_footer(message, indicator, score) {
- const div = document.createElement("div");
- div.classList.add("mt-5");
- div.innerHTML = `<div class="row">
- <div class="col-md-8">
- <h4>${message}</h4>
- <h5 class="text-muted"><span class="indicator ${indicator}">Score: ${score}/100</span></h5>
- </div>
- <div class="col-md-4">
- <a href="${this.next_url}" class="btn btn-primary pull-right">${this.quiz_exit_button}</a>
- </div>
- </div>`
-
- this.wrapper.appendChild(div)
- }
-
- disable() {
- this.questions.forEach(que => que.disable())
- }
-
- get_selected() {
- let que = {}
- this.questions.forEach(question => {
- que[question.name] = question.get_selected()
- })
- return que
- }
-}
-
-class Question {
- constructor(opts) {
- Object.assign(this, opts);
- this.make();
- }
-
- make() {
- this.make_question()
- this.make_options()
- }
-
- get_selected() {
- let selected = this.options.filter(opt => opt.input.checked)
- if (this.type == 'Single Correct Answer') {
- if (selected[0]) return selected[0].name
- }
- if (this.type == 'Multiple Correct Answer') {
- return selected.map(opt => opt.name)
- }
- return null
- }
-
- disable() {
- let selected = this.options.forEach(opt => opt.input.disabled = true)
- }
-
- make_question() {
- let question_wrapper = document.createElement('h5');
- question_wrapper.classList.add('mt-3');
- question_wrapper.innerHTML = this.question;
- this.wrapper.appendChild(question_wrapper);
- }
-
- make_options() {
- let make_input = (name, value) => {
- let input = document.createElement('input');
- input.id = name;
- input.name = this.name;
- input.value = value;
- input.type = 'radio';
- if (this.type == 'Multiple Correct Answer')
- input.type = 'checkbox';
- input.classList.add('form-check-input');
- return input;
- }
-
- let make_label = function (name, value) {
- let label = document.createElement('label');
- label.classList.add('form-check-label');
- label.htmlFor = name;
- label.innerText = value;
- return label
- }
-
- let make_option = function (wrapper, option) {
- let option_div = document.createElement('div');
- option_div.classList.add('form-check', 'pb-1');
- let input = make_input(option.name, option.option);
- let label = make_label(option.name, option.option);
- option_div.appendChild(input);
- option_div.appendChild(label);
- wrapper.appendChild(option_div);
- return { input: input, ...option };
- }
-
- let options_wrapper = document.createElement('div')
- options_wrapper.classList.add('ml-2')
- let option_list = []
- this.options.forEach(opt => option_list.push(make_option(options_wrapper, opt)))
- this.options = option_list
- this.wrapper.appendChild(options_wrapper)
- }
-}
diff --git a/erpnext/public/js/erpnext.bundle.js b/erpnext/public/js/erpnext.bundle.js
index 3baf667..3dae6d4 100644
--- a/erpnext/public/js/erpnext.bundle.js
+++ b/erpnext/public/js/erpnext.bundle.js
@@ -16,7 +16,6 @@
import "./utils/item_quick_entry";
import "./utils/customer_quick_entry";
import "./utils/supplier_quick_entry";
-import "./education/assessment_result_tool.html";
import "./call_popup/call_popup";
import "./utils/dimension_tree_filter";
import "./utils/barcode_scanner";
diff --git a/erpnext/public/js/setup_wizard.js b/erpnext/public/js/setup_wizard.js
index 83b69ae..2173c2d 100644
--- a/erpnext/public/js/setup_wizard.js
+++ b/erpnext/public/js/setup_wizard.js
@@ -23,7 +23,6 @@
fieldtype: 'MultiCheck',
options: [
{ "label": __("Distribution"), "value": "Distribution" },
- { "label": __("Education"), "value": "Education" },
{ "label": __("Manufacturing"), "value": "Manufacturing" },
{ "label": __("Retail"), "value": "Retail" },
{ "label": __("Services"), "value": "Services" },
@@ -59,15 +58,13 @@
},
{
fieldname: 'company_name',
- label: frappe.setup.domains.includes('Education') ?
- __('Institute Name') : __('Company Name'),
+ label: __('Company Name'),
fieldtype: 'Data',
reqd: 1
},
{
fieldname: 'company_abbr',
- label: frappe.setup.domains.includes('Education') ?
- __('Institute Abbreviation') : __('Company Abbreviation'),
+ label: __('Company Abbreviation'),
fieldtype: 'Data'
}
],
@@ -107,17 +104,12 @@
name: 'organisation',
title: __("Your Organization"),
icon: "fa fa-building",
- // help: frappe.setup.domains.includes('Education') ?
- // __('The name of the institute for which you are setting up this system.') :
- // __('The name of your company for which you are setting up this system.')),
fields: [
{
fieldname: 'company_tagline',
label: __('What does it do?'),
fieldtype: 'Data',
- placeholder: frappe.setup.domains.includes('Education') ?
- __('e.g. "Primary School" or "University"') :
- __('e.g. "Build tools for builders"'),
+ placeholder: __('e.g. "Build tools for builders"'),
reqd: 1
},
{ fieldname: 'bank_account', label: __('Bank Name'), fieldtype: 'Data', reqd: 1 },
diff --git a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
index 77c4d7c..34701c1 100644
--- a/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
+++ b/erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
@@ -160,7 +160,7 @@
try:
content = encoded_content.decode("utf-16")
except UnicodeDecodeError as e:
- frappe.log_error(message=e, title="UTF-16 encoding error for File Name: " + file_name)
+ frappe.log_error("UTF-16 encoding error for File Name: " + file_name)
return content
@@ -390,9 +390,7 @@
return pi.name
except Exception as e:
frappe.db.set_value("Import Supplier Invoice", name, "status", "Error")
- frappe.log_error(
- message=e, title="Create Purchase Invoice: " + args.get("bill_no") + "File Name: " + file_name
- )
+ pi.log_error("Unable to create Puchase Invoice")
return None
diff --git a/erpnext/regional/report/vat_audit_report/vat_audit_report.py b/erpnext/regional/report/vat_audit_report/vat_audit_report.py
index 6e59824..70f2c0a 100644
--- a/erpnext/regional/report/vat_audit_report/vat_audit_report.py
+++ b/erpnext/regional/report/vat_audit_report/vat_audit_report.py
@@ -95,10 +95,9 @@
as_dict=1,
)
for d in items:
- if d.item_code not in self.invoice_items.get(d.parent, {}):
- self.invoice_items.setdefault(d.parent, {}).setdefault(d.item_code, {"net_amount": 0.0})
- self.invoice_items[d.parent][d.item_code]["net_amount"] += d.get("base_net_amount", 0)
- self.invoice_items[d.parent][d.item_code]["is_zero_rated"] = d.is_zero_rated
+ self.invoice_items.setdefault(d.parent, {}).setdefault(d.item_code, {"net_amount": 0.0})
+ self.invoice_items[d.parent][d.item_code]["net_amount"] += d.get("base_net_amount", 0)
+ self.invoice_items[d.parent][d.item_code]["is_zero_rated"] = d.is_zero_rated
def get_items_based_on_tax_rate(self, doctype):
self.items_based_on_tax_rate = frappe._dict()
@@ -110,7 +109,7 @@
self.tax_details = frappe.db.sql(
"""
SELECT
- parent, account_head, item_wise_tax_detail, base_tax_amount_after_discount_amount
+ parent, account_head, item_wise_tax_detail
FROM
`tab%s`
WHERE
@@ -123,7 +122,7 @@
tuple([doctype] + list(self.invoices.keys())),
)
- for parent, account, item_wise_tax_detail, tax_amount in self.tax_details:
+ for parent, account, item_wise_tax_detail in self.tax_details:
if item_wise_tax_detail:
try:
if account in self.sa_vat_accounts:
@@ -135,7 +134,7 @@
# to skip items with non-zero tax rate in multiple rows
if taxes[0] == 0 and not is_zero_rated:
continue
- tax_rate, item_amount_map = self.get_item_amount_map(parent, item_code, taxes)
+ tax_rate = self.get_item_amount_map(parent, item_code, taxes)
if tax_rate is not None:
rate_based_dict = self.items_based_on_tax_rate.setdefault(parent, {}).setdefault(
@@ -151,16 +150,22 @@
tax_rate = taxes[0]
tax_amount = taxes[1]
gross_amount = net_amount + tax_amount
- item_amount_map = self.item_tax_rate.setdefault(parent, {}).setdefault(item_code, [])
- amount_dict = {
- "tax_rate": tax_rate,
- "gross_amount": gross_amount,
- "tax_amount": tax_amount,
- "net_amount": net_amount,
- }
- item_amount_map.append(amount_dict)
- return tax_rate, item_amount_map
+ self.item_tax_rate.setdefault(parent, {}).setdefault(
+ item_code,
+ {
+ "tax_rate": tax_rate,
+ "gross_amount": 0.0,
+ "tax_amount": 0.0,
+ "net_amount": 0.0,
+ },
+ )
+
+ self.item_tax_rate[parent][item_code]["net_amount"] += net_amount
+ self.item_tax_rate[parent][item_code]["tax_amount"] += tax_amount
+ self.item_tax_rate[parent][item_code]["gross_amount"] += gross_amount
+
+ return tax_rate
def get_conditions(self):
conditions = ""
@@ -205,9 +210,10 @@
for inv, inv_data in self.invoices.items():
if self.items_based_on_tax_rate.get(inv):
for rate, items in self.items_based_on_tax_rate.get(inv).items():
+ row = {"tax_amount": 0.0, "gross_amount": 0.0, "net_amount": 0.0}
+
consolidated_data_map.setdefault(rate, {"data": []})
for item in items:
- row = {}
item_details = self.item_tax_rate.get(inv).get(item)
row["account"] = inv_data.get("account")
row["posting_date"] = formatdate(inv_data.get("posting_date"), "dd-mm-yyyy")
@@ -216,10 +222,11 @@
row["party_type"] = "Customer" if doctype == "Sales Invoice" else "Supplier"
row["party"] = inv_data.get("party")
row["remarks"] = inv_data.get("remarks")
- row["gross_amount"] = item_details[0].get("gross_amount")
- row["tax_amount"] = item_details[0].get("tax_amount")
- row["net_amount"] = item_details[0].get("net_amount")
- consolidated_data_map[rate]["data"].append(row)
+ row["gross_amount"] += item_details.get("gross_amount")
+ row["tax_amount"] += item_details.get("tax_amount")
+ row["net_amount"] += item_details.get("net_amount")
+
+ consolidated_data_map[rate]["data"].append(row)
return consolidated_data_map
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index 1d0432b..ff921c7 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.json
+++ b/erpnext/selling/doctype/sales_order/sales_order.json
@@ -25,6 +25,10 @@
"po_no",
"po_date",
"tax_id",
+ "accounting_dimensions_section",
+ "cost_center",
+ "dimension_col_break",
+ "project",
"contact_info",
"customer_address",
"address_display",
@@ -113,7 +117,6 @@
"is_internal_customer",
"represents_company",
"inter_company_order_reference",
- "project",
"party_account_currency",
"column_break_77",
"source",
@@ -1522,13 +1525,29 @@
"label": "% Picked",
"no_copy": 1,
"read_only": 1
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "accounting_dimensions_section",
+ "fieldtype": "Section Break",
+ "label": "Accounting Dimensions"
+ },
+ {
+ "fieldname": "cost_center",
+ "fieldtype": "Link",
+ "label": "Cost Center",
+ "options": "Cost Center"
+ },
+ {
+ "fieldname": "dimension_col_break",
+ "fieldtype": "Column Break"
}
],
"icon": "fa fa-file-text",
"idx": 105,
"is_submittable": 1,
"links": [],
- "modified": "2022-04-21 08:16:48.316074",
+ "modified": "2022-04-26 14:38:18.350207",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order",
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index c116458..9bde6e2 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -528,7 +528,7 @@
except ImportError:
pass
except Exception:
- frappe.log_error()
+ frappe.log_error("Unable to set country fixtures")
frappe.throw(
_("Failed to setup defaults for country {0}. Please contact support.").format(
frappe.bold(country)
diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py
index a0056e2..d979ad1 100644
--- a/erpnext/setup/setup_wizard/operations/install_fixtures.py
+++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py
@@ -48,7 +48,6 @@
{"doctype": "Domain", "domain": "Manufacturing"},
{"doctype": "Domain", "domain": "Retail"},
{"doctype": "Domain", "domain": "Services"},
- {"doctype": "Domain", "domain": "Education"},
{"doctype": "Domain", "domain": "Healthcare"},
{"doctype": "Domain", "domain": "Non Profit"},
# ensure at least an empty Address Template exists for this Country
@@ -376,7 +375,6 @@
{"doctype": "Party Type", "party_type": "Supplier", "account_type": "Payable"},
{"doctype": "Party Type", "party_type": "Employee", "account_type": "Payable"},
{"doctype": "Party Type", "party_type": "Shareholder", "account_type": "Payable"},
- {"doctype": "Party Type", "party_type": "Student", "account_type": "Receivable"},
{"doctype": "Opportunity Type", "name": _("Sales")},
{"doctype": "Opportunity Type", "name": _("Support")},
{"doctype": "Opportunity Type", "name": _("Maintenance")},
@@ -397,13 +395,6 @@
{"doctype": "Offer Term", "offer_term": _("Incentives")},
{"doctype": "Print Heading", "print_heading": _("Credit Note")},
{"doctype": "Print Heading", "print_heading": _("Debit Note")},
- # Assessment Group
- {
- "doctype": "Assessment Group",
- "assessment_group_name": _("All Assessment Groups"),
- "is_group": 1,
- "parent_assessment_group": "",
- },
# Share Management
{"doctype": "Share Type", "title": _("Equity")},
{"doctype": "Share Type", "title": _("Preference")},
diff --git a/erpnext/setup/setup_wizard/operations/taxes_setup.py b/erpnext/setup/setup_wizard/operations/taxes_setup.py
index 39dc7e3..2f77dd6 100644
--- a/erpnext/setup/setup_wizard/operations/taxes_setup.py
+++ b/erpnext/setup/setup_wizard/operations/taxes_setup.py
@@ -116,7 +116,7 @@
frappe.get_attr(module_name)(country, company)
except Exception as e:
# Log error and ignore if failed to setup regional tax settings
- frappe.log_error()
+ frappe.log_error("Unable to setup regional tax settings")
pass
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index 2200e6c..e848dfe 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -112,7 +112,7 @@
cache.setex(name=key, time=21600, value=flt(value))
return flt(value)
except Exception:
- frappe.log_error(title="Get Exchange Rate")
+ frappe.log_error("Unable to fetch exchange rate")
frappe.msgprint(
_(
"Unable to find exchange rate for {0} to {1} for key date {2}. Please create a Currency Exchange record manually"
diff --git a/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json b/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json
index c5640bc..eeb71c7 100644
--- a/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json
+++ b/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json
@@ -1,7 +1,7 @@
{
"charts": [],
"content": "[{\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Your Shortcuts\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t</b></span>\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Projects Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Stock Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"HR Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Selling Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Buying Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Support Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Shopping Cart Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Portal Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Domain Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Products Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Naming Series\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Manufacturing Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Education Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Hotel Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"CRM Settings\",\"col\":3}}]",
- "creation": "2020-03-12 14:47:51.166455",
+ "creation": "2022-01-27 13:14:47.349433",
"docstatus": 0,
"doctype": "Workspace",
"for_user": "",
@@ -10,7 +10,7 @@
"idx": 0,
"label": "ERPNext Settings",
"links": [],
- "modified": "2022-01-13 19:18:59.362820",
+ "modified": "2022-04-28 11:42:01.043569",
"modified_by": "Administrator",
"module": "Setup",
"name": "ERPNext Settings",
@@ -91,20 +91,6 @@
"type": "DocType"
},
{
- "icon": "education",
- "label": "Education Settings",
- "link_to": "Education Settings",
- "restrict_to_domain": "Education",
- "type": "DocType"
- },
- {
- "icon": "organization",
- "label": "Hotel Settings",
- "link_to": "Hotel Settings",
- "restrict_to_domain": "Hospitality",
- "type": "DocType"
- },
- {
"icon": "setting",
"label": "Domain Settings",
"link_to": "Domain Settings",
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json
index 7ebc4ee..e3222bc 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.json
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.json
@@ -23,6 +23,10 @@
"is_return",
"issue_credit_note",
"return_against",
+ "accounting_dimensions_section",
+ "cost_center",
+ "dimension_col_break",
+ "project",
"customer_po_details",
"po_no",
"column_break_17",
@@ -115,7 +119,6 @@
"driver_name",
"lr_date",
"more_info",
- "project",
"campaign",
"source",
"column_break5",
@@ -1309,13 +1312,29 @@
"fieldtype": "Currency",
"label": "Amount Eligible for Commission",
"read_only": 1
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "accounting_dimensions_section",
+ "fieldtype": "Section Break",
+ "label": "Accounting Dimensions"
+ },
+ {
+ "fieldname": "cost_center",
+ "fieldtype": "Link",
+ "label": "Cost Center",
+ "options": "Cost Center"
+ },
+ {
+ "fieldname": "dimension_col_break",
+ "fieldtype": "Column Break"
}
],
"icon": "fa fa-truck",
"idx": 146,
"is_submittable": 1,
"links": [],
- "modified": "2022-03-10 14:29:13.428984",
+ "modified": "2022-04-26 14:48:08.781837",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note",
@@ -1380,6 +1399,7 @@
"show_name_in_global_search": 1,
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"timeline_field": "customer",
"title_field": "title",
"track_changes": 1,
diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json
index 06da8ee..4f3e842 100644
--- a/erpnext/stock/doctype/item/item.json
+++ b/erpnext/stock/doctype/item/item.json
@@ -869,8 +869,9 @@
},
{
"fieldname": "default_item_manufacturer",
- "fieldtype": "Data",
+ "fieldtype": "Link",
"label": "Default Item Manufacturer",
+ "options": "Manufacturer",
"read_only": 1
},
{
@@ -918,7 +919,7 @@
"image_field": "image",
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2022-03-25 06:38:55.942304",
+ "modified": "2022-04-28 04:52:10.272256",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item",
@@ -991,4 +992,4 @@
"states": [],
"title_field": "item_name",
"track_changes": 1
-}
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
index 19c490d..983b62a 100755
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
@@ -24,6 +24,10 @@
"apply_putaway_rule",
"is_return",
"return_against",
+ "accounting_dimensions_section",
+ "cost_center",
+ "dimension_col_break",
+ "project",
"section_addresses",
"supplier_address",
"contact_person",
@@ -107,7 +111,6 @@
"bill_no",
"bill_date",
"more_info",
- "project",
"status",
"amended_from",
"range",
@@ -1143,13 +1146,29 @@
"label": "Represents Company",
"options": "Company",
"read_only": 1
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "accounting_dimensions_section",
+ "fieldtype": "Section Break",
+ "label": "Accounting Dimensions"
+ },
+ {
+ "fieldname": "cost_center",
+ "fieldtype": "Link",
+ "label": "Cost Center",
+ "options": "Cost Center"
+ },
+ {
+ "fieldname": "dimension_col_break",
+ "fieldtype": "Column Break"
}
],
"icon": "fa fa-truck",
"idx": 261,
"is_submittable": 1,
"links": [],
- "modified": "2022-04-10 22:50:37.761362",
+ "modified": "2022-04-26 13:41:32.625197",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt",
diff --git a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
index eb0be46..236b944 100644
--- a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
+++ b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
@@ -135,7 +135,7 @@
except Exception:
frappe.db.rollback()
traceback = frappe.get_traceback()
- frappe.log_error(traceback)
+ doc.log_error("Unable to repost item valuation")
message = frappe.message_log.pop() if frappe.message_log else ""
if traceback:
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.json b/erpnext/stock/doctype/stock_entry/stock_entry.json
index c38dfaa..f56e059 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.json
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.json
@@ -46,9 +46,9 @@
"items",
"get_stock_and_rate",
"section_break_19",
- "total_incoming_value",
- "column_break_22",
"total_outgoing_value",
+ "column_break_22",
+ "total_incoming_value",
"value_difference",
"additional_costs_section",
"additional_costs",
@@ -374,7 +374,7 @@
{
"fieldname": "total_incoming_value",
"fieldtype": "Currency",
- "label": "Total Incoming Value",
+ "label": "Total Incoming Value (Receipt)",
"options": "Company:company:default_currency",
"print_hide": 1,
"read_only": 1
@@ -386,7 +386,7 @@
{
"fieldname": "total_outgoing_value",
"fieldtype": "Currency",
- "label": "Total Outgoing Value",
+ "label": "Total Outgoing Value (Consumption)",
"options": "Company:company:default_currency",
"print_hide": 1,
"read_only": 1
@@ -394,7 +394,7 @@
{
"fieldname": "value_difference",
"fieldtype": "Currency",
- "label": "Total Value Difference (Out - In)",
+ "label": "Total Value Difference (Incoming - Outgoing)",
"options": "Company:company:default_currency",
"print_hide_if_no_value": 1,
"read_only": 1
@@ -619,7 +619,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2022-02-07 12:55:14.614077",
+ "modified": "2022-05-02 05:21:39.060501",
"modified_by": "Administrator",
"module": "Stock",
"name": "Stock Entry",
diff --git a/erpnext/stock/reorder_item.py b/erpnext/stock/reorder_item.py
index ee151b7..4763b47 100644
--- a/erpnext/stock/reorder_item.py
+++ b/erpnext/stock/reorder_item.py
@@ -136,14 +136,14 @@
mr_list = []
exceptions_list = []
- def _log_exception():
+ def _log_exception(mr):
if frappe.local.message_log:
exceptions_list.extend(frappe.local.message_log)
frappe.local.message_log = []
else:
exceptions_list.append(frappe.get_traceback())
- frappe.log_error(frappe.get_traceback())
+ mr.log_error("Unable to create material request")
for request_type in material_requests:
for company in material_requests[request_type]:
@@ -207,7 +207,7 @@
mr_list.append(mr)
except Exception:
- _log_exception()
+ _log_exception(mr)
if mr_list:
if getattr(frappe.local, "reorder_email_notify", None) is None:
diff --git a/erpnext/templates/generators/student_admission.html b/erpnext/templates/generators/student_admission.html
deleted file mode 100644
index 8cc58a0..0000000
--- a/erpnext/templates/generators/student_admission.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-{% extends "templates/web.html" %}
-
-{% block breadcrumbs %}
- {% include "templates/includes/breadcrumbs.html" %}
-{% endblock %}
-
-{% block header %}
-
-<h1>{{ title }}</h1>
-{% endblock %}
-
-{% block page_content %}
-
-{%- if introduction -%}
-<div>{{ introduction }}</div>
-{% endif %}
-
-{%- if doc.enable_admission_application -%}
-<p>
- <a class='btn btn-primary'
- href='/student-applicant'>
- {{ _("Apply Now") }}</a>
-</p>
-{% endif %}
-
-{% endblock %}
diff --git a/erpnext/templates/includes/assessment/assessment_row.html b/erpnext/templates/includes/assessment/assessment_row.html
deleted file mode 100644
index a33ccff..0000000
--- a/erpnext/templates/includes/assessment/assessment_row.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<div class="web-list-item">
- <div class="row">
- <div class="col-xs-4">
- {{ doc.course }}
- </div>
- <div class="col-xs-2">
- {{ doc.room }}
- </div>
- <div class="col-xs-2">
- {{doc.schedule_date }}
- </div>
- <div class="col-xs-2">
- {{ doc.from_time }}
- </div>
- <div class="col-xs-2">
- {{ doc.to_time }}
- </div>
- </div>
-</div>
diff --git a/erpnext/templates/includes/course/course_row.html b/erpnext/templates/includes/course/course_row.html
deleted file mode 100644
index fddfc3c..0000000
--- a/erpnext/templates/includes/course/course_row.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<div class="web-list-item">
- <a href="/courses?course={{ doc.course }}">
- <div class="row">
- <div class="col-xs-5">
- {{ doc.course }}
- </div>
- <div class="col-xs-3">
- {{ doc.name }}
- </div>
- <div class="col-xs-2">
- {{doc.academic_term }}
- </div>
- <div class="col-xs-2">
- {{ doc.academic_year }}
- </div>
- </div>
- </a>
-</div>
diff --git a/erpnext/templates/includes/course/macros.html b/erpnext/templates/includes/course/macros.html
deleted file mode 100644
index 334b5ea..0000000
--- a/erpnext/templates/includes/course/macros.html
+++ /dev/null
@@ -1 +0,0 @@
-{% macro back_link(doc) %}&back-to=/courses?course={{ doc.name }}&back-to-title={{ doc.course_name }}{% endmacro %}
diff --git a/erpnext/templates/pages/integrations/gocardless_checkout.py b/erpnext/templates/pages/integrations/gocardless_checkout.py
index 280f67f..655be52 100644
--- a/erpnext/templates/pages/integrations/gocardless_checkout.py
+++ b/erpnext/templates/pages/integrations/gocardless_checkout.py
@@ -96,5 +96,5 @@
return {"redirect_to": redirect_flow.redirect_url}
except Exception as e:
- frappe.log_error(e, "GoCardless Payment Error")
+ frappe.log_error("GoCardless Payment Error")
return {"redirect_to": "/integrations/payment-failed"}
diff --git a/erpnext/templates/pages/integrations/gocardless_confirmation.py b/erpnext/templates/pages/integrations/gocardless_confirmation.py
index cab532a..559aa48 100644
--- a/erpnext/templates/pages/integrations/gocardless_confirmation.py
+++ b/erpnext/templates/pages/integrations/gocardless_confirmation.py
@@ -60,7 +60,7 @@
try:
create_mandate(data)
except Exception as e:
- frappe.log_error(e, "GoCardless Mandate Registration Error")
+ frappe.log_error("GoCardless Mandate Registration Error")
gateway_controller = get_gateway_controller(reference_docname)
frappe.get_doc("GoCardless Settings", gateway_controller).create_payment_request(data)
@@ -68,7 +68,7 @@
return {"redirect_to": confirmation_url}
except Exception as e:
- frappe.log_error(e, "GoCardless Payment Error")
+ frappe.log_error("GoCardless Payment Error")
return {"redirect_to": "/integrations/payment-failed"}
@@ -103,4 +103,4 @@
).insert(ignore_permissions=True)
except Exception:
- frappe.log_error(frappe.get_traceback())
+ frappe.log_error("Gocardless: Unable to create mandate")
diff --git a/erpnext/tests/ui/agriculture.txt b/erpnext/tests/ui/agriculture.txt
deleted file mode 100644
index 4622bc0..0000000
--- a/erpnext/tests/ui/agriculture.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-erpnext/agriculture/doctype/land_unit/test_land_unit.js
-erpnext/agriculture/doctype/fertilizer/test_fertilizer.js
-erpnext/agriculture/doctype/water_analysis/test_water_analysis.js
-erpnext/agriculture/doctype/disease/test_disease.js
-erpnext/agriculture/doctype/soil_texture/test_soil_texture.js
-erpnext/agriculture/doctype/crop/test_crop.js
-erpnext/agriculture/doctype/crop_cycle/test_crop_cycle.js
\ No newline at end of file
diff --git a/erpnext/tests/ui/make_fixtures.js b/erpnext/tests/ui/make_fixtures.js
deleted file mode 100644
index 8c9e508..0000000
--- a/erpnext/tests/ui/make_fixtures.js
+++ /dev/null
@@ -1,258 +0,0 @@
-$.extend(frappe.test_data, {
- // "Fiscal Year": {
- // "2017-18": [
- // {"year": "2017-18"},
- // {"year_start_date": "2017-04-01"},
- // {"year_end_date": "2018-03-31"},
- // ]
- // },
- "Customer": {
- "Test Customer 1": [
- {customer_name: "Test Customer 1"}
- ],
- "Test Customer 2": [
- {customer_name: "Test Customer 2"}
- ],
- "Test Customer 3": [
- {customer_name: "Test Customer 3"}
- ],
- },
- "Item": {
- "Test Product 1": [
- {item_code: "Test Product 1"},
- {item_group: "Products"},
- {is_stock_item: 1},
- {standard_rate: 100},
- {opening_stock: 100},
- ],
- "Test Product 2": [
- {item_code: "Test Product 2"},
- {item_group: "Products"},
- {is_stock_item: 1},
- {standard_rate: 150},
- {opening_stock: 200},
- ],
- "Test Product 3": [
- {item_code: "Test Product 3"},
- {item_group: "Products"},
- {is_stock_item: 1},
- {standard_rate: 250},
- {opening_stock: 100},
- {stock_uom:'Kg'}
- ],
- "Test Service 1": [
- {item_code: "Test Service 1"},
- {item_group: "Services"},
- {is_stock_item: 0},
- {standard_rate: 200}
- ],
- "Test Service 2": [
- {item_code: "Test Service 2"},
- {item_group: "Services"},
- {is_stock_item: 0},
- {standard_rate: 300}
- ]
- },
- "Lead": {
- "LEAD-00001": [
- {lead_name: "Test Lead 1"}
- ],
- "LEAD-00002": [
- {lead_name: "Test Lead 2"}
- ],
- "LEAD-00003": [
- {lead_name: "Test Lead 3"}
- ]
- },
- "Address": {
- "Test1-Billing": [
- {address_title:"Test1"},
- {address_type: "Billing"},
- {address_line1: "Billing Street 1"},
- {city: "Billing City 1"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 1"}
- ]
- ]}
- ],
- "Test1-Shipping": [
- {address_title:"Test1"},
- {address_type: "Shipping"},
- {address_line1: "Shipping Street 1"},
- {city: "Shipping City 1"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 1"}
- ]
- ]}
- ],
- "Test1-Warehouse": [
- {address_title:"Test1"},
- {address_type: "Warehouse"},
- {address_line1: "Warehouse Street 1"},
- {city: "Warehouse City 1"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 1"}
- ]
- ]}
- ],
- "Test2-Billing": [
- {address_title:"Test2"},
- {address_type: "Billing"},
- {address_line1: "Billing Street 2"},
- {city: "Billing City 2"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 2"}
- ]
- ]}
- ],
- "Test2-Shipping": [
- {address_title:"Test2"},
- {address_type: "Shipping"},
- {address_line1: "Shipping Street 2"},
- {city: "Shipping City 2"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 2"}
- ]
- ]}
- ],
- "Test2-Warehouse": [
- {address_title:"Test2"},
- {address_type: "Warehouse"},
- {address_line1: "Warehouse Street 2"},
- {city: "Warehouse City 2"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 2"}
- ]
- ]}
- ]
- },
- "Contact": {
- "Contact 1-Test Customer 1": [
- {first_name: "Contact 1"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 1"}
- ]
- ]}
- ],
- "Contact 2-Test Customer 1": [
- {first_name: "Contact 2"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 1"}
- ]
- ]}
- ],
- "Contact 1-Test Customer 2": [
- {first_name: "Contact 1"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 2"}
- ]
- ]}
- ],
- "Contact 2-Test Customer 2": [
- {first_name: "Contact 2"},
- {links: [
- [
- {link_doctype: "Customer"},
- {link_name: "Test Customer 2"}
- ]
- ]}
- ],
- },
- "Price List": {
- "Test-Buying-USD": [
- {price_list_name: "Test-Buying-USD"},
- {currency: "USD"},
- {buying: "1"}
- ],
- "Test-Buying-EUR": [
- {price_list_name: "Test-Buying-EUR"},
- {currency: "EUR"},
- {buying: "1"}
- ],
- "Test-Selling-USD": [
- {price_list_name: "Test-Selling-USD"},
- {currency: "USD"},
- {selling: "1"}
- ],
- "Test-Selling-EUR": [
- {price_list_name: "Test-Selling-EUR"},
- {currency: "EUR"},
- {selling: "1"}
- ],
- },
- "Terms and Conditions": {
- "Test Term 1": [
- {title: "Test Term 1"}
- ],
- "Test Term 2": [
- {title: "Test Term 2"}
- ]
- },
- "Item Price": {
- "ITEM-PRICE-00001": [
- {item_code: 'Test Product 1'},
- {price_list: '_Test Price List'},
- {price_list_rate: 100}
- ],
- "ITEM-PRICE-00002": [
- {item_code: 'Test Product 2'},
- {price_list: '_Test Price List'},
- {price_list_rate: 200}
- ]
- },
- "Payment Term": {
- "_Test Payment Term": [
- {payment_term_name: '_Test Payment Term'},
- {due_date_based_on: 'Day(s) after invoice date'},
- {invoice_portion: 100},
- {credit_days: 0}
- ]
- },
- "Payment Terms Template": {
- "_Test Payment Term Template UI": [
- {template_name: "_Test Payment Term Template UI"},
- {terms: [
- [
- {payment_term: '_Test Payment Term'},
- {invoice_portion: 100}
- ]
- ]}
- ]
- }
-});
-
-
-// this is a script that creates all fixtures
-// called as a test
-QUnit.module('fixture');
-
-QUnit.test('Make fixtures', assert => {
- // create all fixtures first
- assert.expect(0);
- let done = assert.async();
- let tasks = [];
- Object.keys(frappe.test_data).forEach(function(doctype) {
- tasks.push(function() {
- return frappe.tests.setup_doctype(doctype, frappe.test_data[doctype]);
- });
- });
- frappe.run_serially(tasks).then(() => done());
-});
diff --git a/erpnext/tests/ui/setup_wizard.js b/erpnext/tests/ui/setup_wizard.js
deleted file mode 100644
index ccff785..0000000
--- a/erpnext/tests/ui/setup_wizard.js
+++ /dev/null
@@ -1,47 +0,0 @@
-const path = require('path');
-const path_join = path.resolve;
-const apps_path = path_join(__dirname, '..', '..', '..', '..');
-const frappe_ui_tests_path = path_join(apps_path, 'frappe', 'frappe', 'tests', 'ui');
-
-const login = require(frappe_ui_tests_path + "/login.js")['Login'];
-const welcome = require(frappe_ui_tests_path + "/setup_wizard.js")['Welcome'];
-const region = require(frappe_ui_tests_path + "/setup_wizard.js")['Region'];
-const user = require(frappe_ui_tests_path + "/setup_wizard.js")['User'];
-
-module.exports = {
- before: browser => {
- browser
- .url(browser.launch_url + '/login')
- .waitForElementVisible('body', 5000);
- },
- 'Login': login,
- 'Welcome': welcome,
- 'Region': region,
- 'User': user,
- 'Domain': browser => {
- let slide_selector = '[data-slide-name="domain"]';
- browser
- .waitForElementVisible(slide_selector, 2000)
- .setValue('select[data-fieldname="domain"]', "Manufacturing")
- .click(slide_selector + ' .next-btn');
- },
- 'Brand': browser => {
- let slide_selector = '[data-slide-name="brand"]';
- browser
- .waitForElementVisible(slide_selector, 2000)
- .setValue('input[data-fieldname="company_name"]', "Acme")
- .click(slide_selector + " .next-btn");
- },
- 'Organisation': browser => {
- let slide_selector = '[data-slide-name="organisation"]';
- browser
- .waitForElementVisible(slide_selector, 2000)
- .setValue('input[data-fieldname="company_tagline"]', "Build tools for Builders")
- .setValue('input[data-fieldname="bank_account"]', "YNG")
- .click(slide_selector + " .next-btn");
- },
-
- after: browser => {
- browser.end();
- },
-};
diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt
deleted file mode 100644
index 5e238e4..0000000
--- a/erpnext/tests/ui/tests.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-erpnext/tests/ui/make_fixtures.js #long
-erpnext/accounts/doctype/account/tests/test_account.js
-erpnext/accounts/doctype/account/tests/test_make_tax_account.js
-erpnext/accounts/doctype/account/tests/test_account_with_number.js
-erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule.js
-erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js
-erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js
-erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js
-erpnext/crm/doctype/opportunity/test_opportunity.js
-erpnext/stock/doctype/item/tests/test_item.js
-erpnext/selling/doctype/quotation/tests/test_quotation_with_discount_on_grand_total.js
-erpnext/selling/doctype/quotation/tests/test_quotation_with_item_wise_discount.js
-erpnext/selling/doctype/quotation/tests/test_quotation_with_multi_uom.js
-erpnext/selling/doctype/quotation/tests/test_quotation_with_taxes_and_charges.js
-erpnext/selling/doctype/quotation/tests/test_quotation_with_shipping_rule.js
-erpnext/selling/doctype/quotation/tests/test_quotation.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order_with_multiple_delivery_date.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order_with_item_wise_discount.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order_with_multi_uom.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order_with_discount_on_grand_total.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order_with_taxes_and_charges.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order_with_shipping_rule.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order_with_pricing_rule.js
-erpnext/manufacturing/doctype/workstation/test_workstation.js
-erpnext/manufacturing/doctype/operation/test_operation.js
-erpnext/manufacturing/doctype/bom/test_bom.js
-erpnext/projects/doctype/project/project_timesheet.js
-erpnext/hr/doctype/holiday_list/test_holiday_list.js
-erpnext/hr/doctype/branch/test_branch.js
-erpnext/hr/doctype/leave_block_list/test_leave_block_list.js
-erpnext/hr/doctype/department/test_department.js
-erpnext/hr/doctype/designation/test_designation.js
-erpnext/hr/doctype/employment_type/test_employment_type.js
-erpnext/hr/doctype/employee/test_employee.js
-erpnext/hr/doctype/employee_attendance_tool/test_employee_attendance_tool.js
-erpnext/hr/doctype/attendance/test_attendance.js
-erpnext/hr/doctype/leave_type/test_leave_type.js
-erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.js
-erpnext/hr/doctype/leave_allocation/test_leave_allocation.js
-erpnext/hr/doctype/leave_application/test_leave_application.js
-erpnext/stock/doctype/warehouse/test_warehouse.js
-erpnext/manufacturing/doctype/work_order/test_work_order.js #long
-erpnext/accounts/page/pos/test_pos.js
-erpnext/selling/page/point_of_sale/tests/test_point_of_sale.js
-erpnext/selling/doctype/product_bundle/test_product_bundle.js
-erpnext/stock/doctype/delivery_note/test_delivery_note.js
-erpnext/stock/doctype/material_request/tests/test_material_request.js
-erpnext/stock/doctype/material_request/tests/test_material_request_type_material_issue.js
-erpnext/stock/doctype/material_request/tests/test_material_request_type_material_transfer.js
-erpnext/stock/doctype/material_request/tests/test_material_request_type_manufacture.js
-erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_issue.js
-erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_receipt.js
-erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_transfer.js
-erpnext/hr/doctype/salary_structure/test_salary_structure.js
-erpnext/hr/doctype/salary_slip/test_salary_slip.js
-erpnext/hr/doctype/job_opening/test_job_opening.js
-erpnext/hr/doctype/job_applicant/test_job_applicant.js
-erpnext/hr/doctype/job_offer/test_job_offer.js
-erpnext/hr/doctype/appraisal_template/test_appraisal_template.js
-erpnext/hr/doctype/appraisal/test_appraisal.js
-erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.js
-erpnext/hr/doctype/expense_claim/test_expense_claim.js
-erpnext/hr/doctype/training_event/tests/test_training_event.js
-erpnext/hr/doctype/training_result_employee/test_training_result.js
-erpnext/hr/doctype/training_feedback/test_training_feedback.js
-erpnext/hr/doctype/loan_type/test_loan_type.js
-erpnext/hr/doctype/loan_application/test_loan_application.js
-erpnext/hr/doctype/loan/test_loan.js
-erpnext/buying/doctype/supplier/test_supplier.js
-erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation.js
-erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation.js
-erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation_for_taxes_and_charges.js
-erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice.js
-erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment.js
-erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment_request.js
-erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.js
-erpnext/accounts/doctype/payment_entry/tests/test_payment_against_purchase_invoice.js
-erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation_for_item_wise_discount.js
-erpnext/buying/doctype/purchase_order/tests/test_purchase_order.js
-erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_multi_uom.js
-erpnext/buying/doctype/purchase_order/tests/test_purchase_order_get_items.js
-erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_discount_on_grand_total.js
-erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_item_wise_discount.js
-erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_taxes_and_charges.js
-erpnext/buying/doctype/purchase_order/tests/test_purchase_order_receipt.js
-erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.js
-erpnext/accounts/doctype/journal_entry/test_journal_entry.js
-erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.js
-erpnext/accounts/doctype/payment_entry/tests/test_payment_entry.js
-erpnext/selling/doctype/quotation/tests/test_quotation_submit_cancel_amend.js
-erpnext/stock/doctype/batch/test_batch.js
-erpnext/accounts/doctype/bank_reconciliation/test_bank_reconciliation.js
-erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_receipt_for_serialize_item.js
-erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_transfer_for_manufacture.js
-erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_subcontract.js
-erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_issue_with_serialize_item.js
-erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_repack.js
-erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_serialize_item.js
-erpnext/accounts/doctype/payment_entry/tests/test_payment_against_invoice.js
-erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_last_purchase_rate.js
-erpnext/stock/doctype/item_price/test_item_price.js
-erpnext/stock/doctype/delivery_note/test_delivery_note_with_margin.js
-erpnext/selling/doctype/sales_order/tests/test_sales_order_with_margin.js
-erpnext/selling/doctype/quotation/tests/test_quotation_with_margin.js
-erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_margin.js
-erpnext/hr/doctype/payroll_entry/test_set_salary_components.js
-erpnext/hr/doctype/payroll_entry/test_payroll_entry.js
-erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js
-erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js
\ No newline at end of file
diff --git a/erpnext/tests/ui/tests2.txt b/erpnext/tests/ui/tests2.txt
deleted file mode 100644
index e410a83..0000000
--- a/erpnext/tests/ui/tests2.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-erpnext/setup/doctype/company/tests/test_company.js
-erpnext/crm/doctype/lead/tests/test_lead_individual.js
-erpnext/crm/doctype/lead/tests/test_lead_organization.js
-erpnext/setup/doctype/company/tests/test_company_production.js
-erpnext/hr/doctype/leave_block_list/test_leave_block_list.js
-erpnext/hr/doctype/department/test_department.js
-erpnext/hr/doctype/designation/test_designation.js
-erpnext/education/doctype/academic_year/test_academic_year.js
-erpnext/education/doctype/academic_term/test_academic_term.js
-erpnext/education/doctype/education_settings/test_education_settings.js
-erpnext/education/doctype/student_batch_name/test_student_batch_name.js
-erpnext/education/doctype/student_category/test_student_category.js
-erpnext/education/doctype/room/test_room.js
-erpnext/education/doctype/instructor/test_instructor.js
-erpnext/education/doctype/grading_scale/test_grading_scale.js
-erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.js
-erpnext/education/doctype/assessment_criteria/test_assessment_criteria.js
-erpnext/education/doctype/course/test_course.js
-erpnext/education/doctype/program/test_program.js
-erpnext/education/doctype/guardian/test_guardian.js
-erpnext/education/doctype/student_admission/test_student_admission.js
-erpnext/education/doctype/student_applicant/tests/test_student_applicant_dummy_data.js
-erpnext/education/doctype/student_applicant/tests/test_student_applicant.js
-erpnext/education/doctype/student_applicant/tests/test_student_applicant_options.js
-erpnext/education/doctype/student_log/test_student_log.js
-erpnext/education/doctype/student_group/test_student_group.js
-erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.js
-erpnext/education/doctype/student_leave_application/test_student_leave_application.js
-erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.js
-erpnext/education/doctype/student_attendance/test_student_attendance.js
-erpnext/education/doctype/assessment_group/test_assessment_group.js
-erpnext/education/doctype/assessment_plan/test_assessment_plan.js
-erpnext/education/doctype/assessment_result/test_assessment_result.js
-erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.js
-erpnext/projects/doctype/task/tests/test_task_tree.js
-erpnext/restaurant/doctype/restaurant/test_restaurant.js
-erpnext/restaurant/doctype/restaurant_table/test_restaurant_table.js
-erpnext/restaurant/doctype/restaurant_menu/test_restaurant_menu.js
-erpnext/restaurant/doctype/restaurant_order_entry/restaurant_order_entry.js
-erpnext/non_profit/doctype/membership_type/test_membership_type.js
-erpnext/non_profit/doctype/member/test_member.js
-erpnext/non_profit/doctype/volunteer_type/test_volunteer_type.js
-erpnext/non_profit/doctype/volunteer/test_volunteer.js
-erpnext/non_profit/doctype/donor_type/test_donor_type.js
-erpnext/non_profit/doctype/donor/test_donor.js
-erpnext/non_profit/doctype/grant_application/test_grant_application.js
\ No newline at end of file
diff --git a/erpnext/utilities/activation.py b/erpnext/utilities/activation.py
index 43af0dc..cd7910c 100644
--- a/erpnext/utilities/activation.py
+++ b/erpnext/utilities/activation.py
@@ -37,7 +37,6 @@
"Sales Order": 2,
"Sales Invoice": 2,
"Stock Entry": 3,
- "Student": 5,
"Supplier": 5,
"Task": 5,
"User": 5,
@@ -137,24 +136,6 @@
target=5,
),
frappe._dict(
- doctype="Student",
- title=_("Add Students"),
- description=_("Students are at the heart of the system, add all your students"),
- action=_("Create Student"),
- route="List/Student",
- domain=("Education",),
- target=5,
- ),
- frappe._dict(
- doctype="Student Batch",
- title=_("Group your students in batches"),
- description=_("Student Batches help you track attendance, assessments and fees for students"),
- action=_("Create Student Batch"),
- route="List/Student Batch",
- domain=("Education",),
- target=3,
- ),
- frappe._dict(
doctype="Employee",
title=_("Create Employee Records"),
description=_("Create Employee records to manage leaves, expense claims and payroll"),
diff --git a/erpnext/utilities/doctype/video/video.py b/erpnext/utilities/doctype/video/video.py
index 330812d..a39d0a9 100644
--- a/erpnext/utilities/doctype/video/video.py
+++ b/erpnext/utilities/doctype/video/video.py
@@ -36,8 +36,7 @@
self.comment_count = video_stats.get("commentCount")
except Exception:
- title = "Failed to Update YouTube Statistics for Video: {0}".format(self.name)
- frappe.log_error(title + "\n\n" + frappe.get_traceback(), title=title)
+ self.log_error("Unable to update YouTube statistics")
def is_tracking_enabled():
@@ -109,8 +108,7 @@
video_stats = video.items
return video_stats
except Exception:
- title = "Failed to Update YouTube Statistics"
- frappe.log_error(title + "\n\n" + frappe.get_traceback(), title=title)
+ frappe.log_error("Unable to update YouTube statistics")
def prepare_and_set_data(video_list):
video_ids = get_formatted_ids(video_list)
diff --git a/erpnext/utilities/doctype/video_settings/video_settings.py b/erpnext/utilities/doctype/video_settings/video_settings.py
index 97fbc41..9bc7972 100644
--- a/erpnext/utilities/doctype/video_settings/video_settings.py
+++ b/erpnext/utilities/doctype/video_settings/video_settings.py
@@ -18,5 +18,5 @@
build("youtube", "v3", developerKey=self.api_key)
except Exception:
title = _("Failed to Authenticate the API key.")
- frappe.log_error(title + "\n\n" + frappe.get_traceback(), title=title)
+ self.log_error("Failed to authenticate API key")
frappe.throw(title + " Please check the error logs.", title=_("Invalid Credentials"))
diff --git a/erpnext/www/lms/__init__.py b/erpnext/www/lms/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/www/lms/__init__.py
+++ /dev/null
diff --git a/erpnext/www/lms/content.html b/erpnext/www/lms/content.html
deleted file mode 100644
index d22ef66..0000000
--- a/erpnext/www/lms/content.html
+++ /dev/null
@@ -1,246 +0,0 @@
-{% extends "templates/base.html" %}
-{% block title %}{{ content.name or 'Content Page' }}{% endblock %}
-
-{% block head_include %}
- <style>
- .lms-content {
- line-height: 1.8em;
- }
-
- .lms-content h1 {
- margin-top: 1em;
- }
-
- .lms-content h2 {
- margin-top: 1em;
- }
-
- .lms-content h3 {
- margin-top: 0.8em;
- }
-
- .lms-content h4 {
- margin-top: 0.6em;
- }
-
- section {
- padding: 5rem 0 5rem 0;
- }
- .plyr--video .plyr__control.plyr__tab-focus,
- .plyr--video .plyr__control:hover,
- .plyr--video .plyr__control[aria-expanded='true'] {
- background: #5e64ff !important;
- }
-
- .plyr__control--overlaid:focus,
- .plyr__control--overlaid:hover {
- background: #5e64ff !important;
- }
-
- .plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before {
- background: #5e64ff !important;
- }
-
- .plyr__menu__container
- .plyr__control[role='menuitemradio'][aria-checked='true']::before {
- background: #5e64ff;
- }
- .plyr--full-ui input[type='range'] {
- color: #5e64ff !important;
- }
-
- .plyr__control--overlaid {
- background: rgba(94, 100, 255, 0.8) !important;
- }
- </style>
- <link rel="stylesheet" href="https://cdn.plyr.io/3.5.3/plyr.css" />
-{% endblock %}
-
-{% macro title() %}
- <div class="mb-3">
- <a href="/lms/course?name={{ course }}&program={{ program }}" class="text-muted">
- {{_('Back to Course')}}
- </a>
- </div>
- <div class="lms-title">
- <h2>{{ content.name }} <span class="small text-muted">({{ position + 1 }}/{{length}})</span></h2>
- <div class="lms-timer float-right fond-weight-bold hide"></div>
- </div>
-{% endmacro %}
-
-{% macro navigation() %}
- {% if previous %}
- <a href="/lms/content?program={{ program }}&course={{ course }}&topic={{ topic }}&type={{ previous.content_type }}&content={{ previous.content }}" class='btn text-muted' style="box-shadow: none;">{{_('Previous')}}</a>
- {% else %}
- <a href="/lms/course?name={{ course }}&program={{ program }}" class='btn text-muted' style="box-shadow: none;">{{ _('Back to Course') }}</a>
- {% endif %}
-
- {% if next %}
- <button id="nextButton" onclick="handle('/lms/content?program={{ program }}&course={{ course }}&topic={{ topic }}&type={{ next.content_type }}&content={{ next.content }}')" class='btn btn-primary' disabled="true">{{_('Next')}}</button>
- {% else %}
- <button id="nextButton" onclick="handle('/lms/course?name={{ course }}&program={{ program }}')" class='btn btn-primary' disabled="true">{{_('Finish Topic')}}</button>
- {% endif %}
-{% endmacro %}
-
-{% macro video() %}
-<div class="mb-5">
- {{ title() }}
- <div class="text-muted">
- {% if content.duration %}
- {{ content.duration }} {{_('Mins')}}
- {% endif %}
-
- {% if content.publish_date and content.duration%}
- -
- {% endif %}
-
- {% if content.publish_date %}
- {{_('Published on')}} {{ content.publish_date.strftime('%d, %b %Y') }}
- {% endif %}
- </div>
-</div>
-<div id="player" data-plyr-provider="{{ content.provider|lower }}" data-plyr-embed-id="{{ content.url }}"></div>
-<div class="my-5 lms-content">
- {{ content.description }}
-</div>
-{% endmacro %}
-
-{% macro article() %}
-<div class="mb-5">
- {{ title() }}
- <div class="text-muted">
- {% if content.author or content.publish_date %}
- {{_('Published')}}
- {% endif %}
- {% if content.author %}
- {{_('by')}} {{ content.author }}
- {% endif %}
- {% if content.publish_date %}
- {{_('on')}} {{ content.publish_date.strftime('%d, %b %Y') }}
- {% endif %}
- </div>
-</div>
-<div class="lms-content">
- {{ content.content }}
-</div>
-{% endmacro %}
-
-{% macro quiz() %}
-<div class="mb-5">
- {{ title() }}
-</div>
-<div id="quiz-wrapper">
-</div>
-{% endmacro %}
-
-{% block content %}
-<section class="section">
- <div>
- <div class='container pb-5'>
- {% if content_type=='Video' %}
- {{ video() }}
- {% elif content_type=='Article'%}
- {{ article() }}
- {% elif content_type=='Quiz' %}
- {{ quiz() }}
- {% endif %}
- <div class="pull-right" {{ 'hidden' if content_type=='Quiz'}}>
- {{ navigation() }}
- </div>
- </div>
- </div>
-</section>
-{% endblock %}
-
-{% block script %}
- {% if content_type=='Video' %}
- <script src="https://cdn.plyr.io/3.5.3/plyr.js"></script>
- {% elif content_type == 'Quiz' %}
- <script src='/assets/erpnext/js/education/lms/quiz.js'></script>
- {% endif %}
- <script>
- {% if content_type == 'Video' %}
- const player = new Plyr('#player');
- {% elif content_type == 'Quiz' %}
- {% if next %}
- const quiz_exit_button = 'Next'
- const next_url = '/lms/content?program={{ program }}&course={{ course }}&topic={{ topic }}&type={{ next.content_type }}&content={{ next.content }}'
- {% else %}
- const quiz_exit_button = 'Finish Course'
- const next_url = '/lms/course?name={{ course }}&program={{ program }}'
- {% endif %}
- frappe.ready(() => {
- {% if content.is_time_bound %}
- var duration = get_duration("{{content.duration}}")
- var d = frappe.msgprint({
- title: __('Important Notice'),
- indicator: "red",
- message: __(`This is a Time-Bound Quiz. <br><br>
- A timer for <b>${duration}</b> will start, once you click on <b>Proceed</b>. <br><br>
- If you fail to submit before the time is up, the Quiz will be submitted automatically.`),
- primary_action: {
- label: __("Proceed"),
- action: () => {
- create_quiz();
- d.hide();
- }
- },
- secondary_action: {
- action: () => {
- d.hide();
- window.location.href = "/lms/course?name={{ course }}&program={{ program }}";
- },
- label: __("Go Back"),
- }
- });
- {% else %}
- create_quiz();
- {% endif %}
- function create_quiz() {
- const quiz = new Quiz(document.getElementById('quiz-wrapper'), {
- name: '{{ content.name }}',
- course: '{{ course }}',
- program: '{{ program }}',
- quiz_exit_button: quiz_exit_button,
- next_url: next_url
- })
- window.quiz = quiz;
- }
- function get_duration(seconds){
- var hours = append_zero(Math.floor(seconds / 3600));
- var minutes = append_zero(Math.floor(seconds % 3600 / 60));
- var seconds = append_zero(Math.floor(seconds % 3600 % 60));
- return `${hours}:${minutes}:${seconds}`;
- }
- function append_zero(time) {
- return time > 9 ? time : "0" + time;
- }
- })
- {% endif %}
-
- {% if content_type != 'Quiz' %}
-
- frappe.ready(() => {
- next = document.getElementById('nextButton')
- next.disabled = false;
- })
-
-
- function handle(url) {
- opts = {
- method: "erpnext.education.utils.add_activity",
- args: {
- course: "{{ course }}",
- content_type: "{{ content_type }}",
- content: "{{ content.name }}",
- program: "{{ program }}"
- }
- }
- frappe.call(opts).then(res => {
- window.location.href = url;
- })
- }
-
- {% endif %}
- </script>
-{% endblock %}
diff --git a/erpnext/www/lms/content.py b/erpnext/www/lms/content.py
deleted file mode 100644
index 99462ce..0000000
--- a/erpnext/www/lms/content.py
+++ /dev/null
@@ -1,75 +0,0 @@
-import frappe
-
-import erpnext.education.utils as utils
-
-no_cache = 1
-
-
-def get_context(context):
- # Load Query Parameters
- try:
- program = frappe.form_dict["program"]
- content = frappe.form_dict["content"]
- content_type = frappe.form_dict["type"]
- course = frappe.form_dict["course"]
- topic = frappe.form_dict["topic"]
- except KeyError:
- frappe.local.flags.redirect_location = "/lms"
- raise frappe.Redirect
-
- # Check if user has access to the content
- has_program_access = utils.allowed_program_access(program)
- has_content_access = allowed_content_access(program, content, content_type)
-
- if frappe.session.user == "Guest" or not has_program_access or not has_content_access:
- frappe.local.flags.redirect_location = "/lms"
- raise frappe.Redirect
-
- # Set context for content to be displayer
- context.content = frappe.get_doc(content_type, content).as_dict()
- context.content_type = content_type
- context.program = program
- context.course = course
- context.topic = topic
-
- topic = frappe.get_doc("Topic", topic)
- content_list = [
- {"content_type": item.content_type, "content": item.content} for item in topic.topic_content
- ]
-
- # Set context for progress numbers
- context.position = content_list.index({"content": content, "content_type": content_type})
- context.length = len(content_list)
-
- # Set context for navigation
- context.previous = get_previous_content(content_list, context.position)
- context.next = get_next_content(content_list, context.position)
-
-
-def get_next_content(content_list, current_index):
- try:
- return content_list[current_index + 1]
- except IndexError:
- return None
-
-
-def get_previous_content(content_list, current_index):
- if current_index == 0:
- return None
- else:
- return content_list[current_index - 1]
-
-
-def allowed_content_access(program, content, content_type):
- contents_of_program = frappe.db.sql(
- """select `tabTopic Content`.content, `tabTopic Content`.content_type
- from `tabCourse Topic`,
- `tabProgram Course`,
- `tabTopic Content`
- where `tabCourse Topic`.parent = `tabProgram Course`.course
- and `tabTopic Content`.parent = `tabCourse Topic`.topic
- and `tabProgram Course`.parent = %(program)s""",
- {"program": program},
- )
-
- return (content, content_type) in contents_of_program
diff --git a/erpnext/www/lms/course.html b/erpnext/www/lms/course.html
deleted file mode 100644
index c07b940..0000000
--- a/erpnext/www/lms/course.html
+++ /dev/null
@@ -1,106 +0,0 @@
-{% extends "templates/base.html" %}
-{% block title %}{{ course.course_name }}{% endblock %}
-{% from "www/lms/macros/hero.html" import hero %}
-{% from "www/lms/macros/card.html" import null_card %}
-
-{% block head_include %}
- <style>
- div.card-hero-img {
- height: 220px;
- background-size: cover;
- background-repeat: no-repeat;
- background-position: center;
- background-color: rgb(250, 251, 252);
- }
-
- .card-image-wrapper {
- display: flex;
- overflow: hidden;
- height: 220px;
- background-color: rgb(250, 251, 252);
- justify-content: center;
- }
-
- .image-body {
- align-self: center;
- color: #d1d8dd;
- font-size: 24px;
- font-weight: 600;
- line-height: 1;
- padding: 20px;
- }
- section {
- padding: 5rem 0 5rem 0;
- }
- </style>
-{% endblock %}
-
-
-{% macro card(topic) %}
-<div class="col-sm-4 mb-4 text-left">
- <div class="card h-100">
- {% if has_access %}
- <a href="/lms/topic?program={{ program }}&course={{ course.name }}&topic={{ topic.name }}" class="no-decoration no-underline">
- {% else %}
- <a href="/login#login">
- {% endif %}
- {% if topic.hero_image %}
- <div class="card-hero-img" style="background-image: url('{{ topic.hero_image }}')"></div>
- {% else %}
- <div class="card-image-wrapper text-center">
- <div class="image-body"><i class="fa fa-picture-o" aria-hidden="true"></i></div>
- </div>
- {% endif %}
- <div class='card-body'>
- <h5 class='card-title'>{{ topic.topic_name }}</h5>
- <div>
- <ol class="list-unstyled">
- {% for content in topic.topic_content %}
- <li>
- {% if has_access %}
- <a class="text-muted" href="/lms/content?program={{ program }}&course={{ course.name }}&topic={{ topic.name }}&type={{ content.content_type }}&content={{ content.content }}">
- {{ content.content }}
- </a>
- {% else %}
- <span class="text-muted">{{ content.content }}</span>
- {% endif %}
- </li>
- {% endfor %}
- </ol>
- </div>
- </div>
- {% if has_access %}
- <div class='card-footer'>
- {% if progress[topic.name].completed %}
- <span class="indicator green">{{_('Completed')}}</span>
- {% elif progress[topic.name].started %}
- <span class="indicator orange">{{_('In Progress')}}</span>
- {% else %}
- <span class="indicator blue">{{_('Start')}}</span>
- {% endif %}
- </div>
- </a>
- {% else %}
- </a>
- {% endif %}
- </div>
-</div>
-{% endmacro %}
-
-{% block content %}
-<section class="section">
- {{ hero(course.course_name, course.description, has_access, {'name': 'Program', 'url': '/lms/program?program=' + program }) }}
- <div class='container'>
- <div class="row mt-5">
- {% for topic in topics %}
- {{ card(topic) }}
- {% endfor %}
- {% if topics %}
- {% for n in range( (3 - (topics|length)) %3) %}
- {{ null_card() }}
- {% endfor %}
- {% endif %}
- </div>
- </div>
-</section>
-{% endblock %}
diff --git a/erpnext/www/lms/course.py b/erpnext/www/lms/course.py
deleted file mode 100644
index 840beee..0000000
--- a/erpnext/www/lms/course.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import frappe
-
-import erpnext.education.utils as utils
-
-no_cache = 1
-
-
-def get_context(context):
- try:
- program = frappe.form_dict["program"]
- course_name = frappe.form_dict["name"]
- except KeyError:
- frappe.local.flags.redirect_location = "/lms"
- raise frappe.Redirect
-
- context.education_settings = frappe.get_single("Education Settings")
- course = frappe.get_doc("Course", course_name)
- context.program = program
- context.course = course
-
- context.topics = course.get_topics()
- context.has_access = utils.allowed_program_access(context.program)
- context.progress = get_topic_progress(context.topics, course, context.program)
-
-
-def get_topic_progress(topics, course, program):
- progress = {topic.name: utils.get_topic_progress(topic, course.name, program) for topic in topics}
- return progress
diff --git a/erpnext/www/lms/index.html b/erpnext/www/lms/index.html
deleted file mode 100644
index c1e9620..0000000
--- a/erpnext/www/lms/index.html
+++ /dev/null
@@ -1,69 +0,0 @@
-{% extends "templates/base.html" %}
-{% block title %}{{ education_settings.portal_title }}{% endblock %}
-{% from "www/lms/macros/card.html" import program_card %}
-{% from "www/lms/macros/card.html" import null_card %}
-
-{% block head_include %}
- <meta name="description" content="{{ education_settings.description }}" />
- <meta name="keywords" content="ERP Software, Cloud ERP, Open Source ERP, Accounting Software, Online ERP, Online Accounting, ERP for small business" />
- <style>
- div.card-hero-img {
- height: 220px;
- background-size: cover;
- background-repeat: no-repeat;
- background-position: center;
- background-color: rgb(250, 251, 252);
- }
-
- .card-image-wrapper {
- display: flex;
- overflow: hidden;
- height: 220px;
- background-color: rgb(250, 251, 252);
- justify-content: center;
- }
-
- .image-body {
- align-self: center;
- color: #d1d8dd;
- font-size: 24px;
- font-weight: 600;
- line-height: 1;
- padding: 20px;
- }
-
- section {
- padding: 5rem 0 5rem 0;
- }
- </style>
-{% endblock %}
-
-{% block content %}
-<section class="top-section" style="padding: 6rem 0rem;">
- <div class='container pb-5'>
- <h1>{{ education_settings.portal_title }}</h1>
- {% if education_settings.description %}
- <p class='lead'>{{ education_settings.description }}</p>
- {% endif %}
- <p class="mt-4">
- {% if frappe.session.user == 'Guest' %}
- <a class="btn btn-primary btn-lg" href="/login#signup">{{_('Sign Up')}}</a>
- {% endif %}
- </p>
- </div>
- <div class='container'>
- <div class="row mt-5">
- {% if featured_programs %}
- {% for program in featured_programs %}
- {{ program_card(program.program, program.has_access) }}
- {% endfor %}
- {% for n in range( (3 - (featured_programs|length)) %3) %}
- {{ null_card() }}
- {% endfor %}
- {% else %}
- <p class="lead">You have not enrolled in any program. Contact your Instructor.</p>
- {% endif %}
- </div>
- </div>
-</section>
-{% endblock %}
diff --git a/erpnext/www/lms/index.py b/erpnext/www/lms/index.py
deleted file mode 100644
index 782ac48..0000000
--- a/erpnext/www/lms/index.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import frappe
-
-import erpnext.education.utils as utils
-
-no_cache = 1
-
-
-def get_context(context):
- context.education_settings = frappe.get_single("Education Settings")
- if not context.education_settings.enable_lms:
- frappe.local.flags.redirect_location = "/"
- raise frappe.Redirect
- context.featured_programs = get_featured_programs()
-
-
-def get_featured_programs():
- return utils.get_portal_programs() or []
diff --git a/erpnext/www/lms/macros/__init__.py b/erpnext/www/lms/macros/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/www/lms/macros/__init__.py
+++ /dev/null
diff --git a/erpnext/www/lms/macros/card.html b/erpnext/www/lms/macros/card.html
deleted file mode 100644
index 3cbdec6..0000000
--- a/erpnext/www/lms/macros/card.html
+++ /dev/null
@@ -1,34 +0,0 @@
-{% macro program_card(program, has_access) %}
-<div class="col-sm-4 mb-4 text-left">
- <a href="/lms/program?program={{ program.name }}" class="no-decoration no-underline">
- <div class="card h-100">
- {% if program.hero_image %}
- <div class="card-hero-img" style="background-image: url('{{ program.hero_image }}')"></div>
- {% else %}
- <div class="card-image-wrapper text-center">
- <div class="image-body"><i class="fa fa-picture-o" aria-hidden="true"></i></div>
- </div>
- {% endif %}
- <div class='card-body'>
- <h5 class='card-title'>{{ program.program_name }}</h5>
- <div class="text-muted">{{ program.description[:110] + '...' if program.description else '' }}</div>
- </div>
- {% if has_access or program.intro_video%}
- <div class='card-footer'>
- {% if has_access %} <span class="indicator green">{{_('Enrolled')}}</span>
- {% elif program.intro_video %} <span><a href="{{ program.intro_video }}" target="blank">{{_('Watch Intro')}}</a></span>
- {% endif %}
- </div>
- {% endif %}
- </div>
- </a>
-</div>
-{% endmacro %}
-
-
-{% macro null_card() %}
-<div class="col-sm-4 mb-4 text-left">
- <div class="h-100 d-none d-sm-block" style="border: 1px solid rgba(209,216,221,0.5);border-radius: 0.25rem;background-color: rgb(250, 251, 252);">
- </div>
-</div>
-{% endmacro %}
diff --git a/erpnext/www/lms/macros/hero.html b/erpnext/www/lms/macros/hero.html
deleted file mode 100644
index dd3c23a..0000000
--- a/erpnext/www/lms/macros/hero.html
+++ /dev/null
@@ -1,53 +0,0 @@
-{% macro hero(title, description, has_access, back) %}
- <div class='container pb-5'>
- <div class="mb-3">
- <a href="{{ back.url }}" class="text-muted">
- {{_('Back to')}} {{ _(back.name) }}
- </a>
- </div>
- <h1>{{ title }}</h1>
- <p class='lead' style="max-width: 100%;">{{ description or ''}}</p>
- <p class="mt-4">
- {% if frappe.session.user == 'Guest' %}
- <a id="signup" class="btn btn-primary btn-lg" href="/login#signup">{{_('Sign Up')}}</a>
- {% elif not has_access %}
- <button id="enroll" class="btn btn-primary btn-lg" onclick="enroll()">{{_('Enroll')}}</button>
- {% endif %}
- </p>
- </div>
-
-{% block script %}
-<script type="text/javascript">
- frappe.ready(() => {
- btn = document.getElementById('enroll');
- })
-
- function enroll() {
- let params = frappe.utils.get_query_params()
-
- let btn = document.getElementById('enroll');
-
- let opts = {
- method: 'erpnext.education.utils.enroll_in_program',
- args: {
- program_name: params.program
- },
- freeze: true,
- freeze_message: __('Enrolling...')
- }
-
- frappe.call(opts).then(res => {
- let success_dialog = new frappe.ui.Dialog({
- title: __('Success'),
- primary_action_label: __('OK'),
- primary_action: function() {
- window.location.reload();
- }
- })
- success_dialog.show();
- success_dialog.set_message(__('You have successfully enrolled for the program.'));
- })
- }
-</script>
-{% endblock %}
-{% endmacro %}
diff --git a/erpnext/www/lms/profile.html b/erpnext/www/lms/profile.html
deleted file mode 100644
index 5755dfe..0000000
--- a/erpnext/www/lms/profile.html
+++ /dev/null
@@ -1,64 +0,0 @@
-{% extends "templates/base.html" %}
-{% block title %}Profile{% endblock %}
-{% from "www/lms/macros/hero.html" import hero %}
-
-{% block head_include %}
- <style>
- section {
- padding: 5rem 0 5rem 0;
- }
- </style>
-{% endblock %}
-
-{% macro card(program) %}
-<div class="col-sm-4 mb-4 text-left">
- <a href="/lms/program?program={{ program.name }}" class="no-decoration no-underline">
- <div class="card h-100">
- <div class='card-body'>
- <h5 class='card-title'>{{ program.program }}</h5>
- <ul class="list-unstyled text-muted">
- {% for course in program.progress %}
- <li>
- {% if course.completed %} <span class="indicator green">
- {% elif course.started %} <span class="indicator orange">
- {% else %} <span class="indicator blue">
- {% endif %}
- <a class="text-muted" href="/lms/course?name={{ course.name }}&program={{ program.name }}">{{ course.course }}</a>
- </span>
- </li>
- {% endfor %}
- </ul>
- </div>
- <div class='card-footer'>
- <span class="small">{{ program.completion }}{{_('% Complete')}}</span>
- </div>
- </div>
- </a>
-</div>
-{% endmacro %}
-
-{% block content %}
-<section class="section">
- <div class='container pb-5'>
- <div class="mb-3 row">
- <div class="col-md-7">
- <a href="/lms" class="text-muted">
- {{_('Back to Home')}}
- </a>
- </div>
- <div class="col-md-5 text-right">
- <a href="/update-profile?name={{ frappe.session.user }}" target="blank" class="mt-0 text-muted">{{_('Edit Profile')}}</a>
- </div>
- </div>
- <h1>{{ student.first_name }} {{ student.last_name or '' }}</h1>
- <p class="lead" style="max-width: 100%;">{{ student.name }}</p>
- </div>
- <div class='container'>
- <div class="row mt-5">
- {% for program in progress %}
- {{ card(program) }}
- {% endfor %}
- </div>
- </div>
-</section>
-{% endblock %}
diff --git a/erpnext/www/lms/profile.py b/erpnext/www/lms/profile.py
deleted file mode 100644
index c4c1cd7..0000000
--- a/erpnext/www/lms/profile.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import frappe
-
-import erpnext.education.utils as utils
-
-no_cache = 1
-
-
-def get_context(context):
- if frappe.session.user == "Guest":
- frappe.local.flags.redirect_location = "/lms"
- raise frappe.Redirect
-
- context.student = utils.get_current_student()
- if not context.student:
- context.student = frappe.get_doc("User", frappe.session.user)
- context.progress = get_program_progress(context.student.name)
-
-
-def get_program_progress(student):
- enrolled_programs = frappe.get_all(
- "Program Enrollment", filters={"student": student}, fields=["program"]
- )
- student_progress = []
- for list_item in enrolled_programs:
- program = frappe.get_doc("Program", list_item.program)
- progress = utils.get_program_progress(program)
- completion = utils.get_program_completion(program)
- student_progress.append(
- {
- "program": program.program_name,
- "name": program.name,
- "progress": progress,
- "completion": completion,
- }
- )
-
- return student_progress
diff --git a/erpnext/www/lms/program.html b/erpnext/www/lms/program.html
deleted file mode 100644
index 30528c6..0000000
--- a/erpnext/www/lms/program.html
+++ /dev/null
@@ -1,87 +0,0 @@
-{% extends "templates/base.html" %}
-{% block title %}{{ program.program_name }}{% endblock %}
-{% from "www/lms/macros/hero.html" import hero %}
-{% from "www/lms/macros/card.html" import null_card %}
-
-{% block head_include %}
- <style>
- div.card-hero-img {
- height: 220px;
- background-size: cover;
- background-repeat: no-repeat;
- background-position: center;
- background-color: rgb(250, 251, 252);
- }
-
- .card-image-wrapper {
- display: flex;
- overflow: hidden;
- height: 220px;
- background-color: rgb(250, 251, 252);
- justify-content: center;
- }
-
- .image-body {
- align-self: center;
- color: #d1d8dd;
- font-size: 24px;
- font-weight: 600;
- line-height: 1;
- padding: 20px;
- }
-
- section {
- padding: 5rem 0 5rem 0;
- }
- </style>
-{% endblock %}
-
-
-{% macro card(course) %}
-<div class="col-sm-4 mb-4 text-left">
- <a href="/lms/course?name={{ course.name }}&program={{ program.name }}" class="no-decoration no-underline">
- <div class="card h-100">
- {% if course.hero_image %}
- <div class="card-hero-img" style="background-image: url('{{ course.hero_image }}')"></div>
- {% else %}
- <div class="card-image-wrapper text-center">
- <div class="image-body"><i class="fa fa-picture-o" aria-hidden="true"></i></div>
- </div>
- {% endif %}
- <div class='card-body'>
- <h5 class='card-title'>{{ course.course_name }}</h5>
- <div class="text-muted">{{ course.description[:110] + '...' if course.description else '' }}</div>
- </div>
- {% if has_access and progress[course.name] %}
- <div class='card-footer'>
- {% if progress[course.name].completed %}
- <span class="indicator green">{{_('Completed')}}</span>
- {% elif progress[course.name].started %}
- <span class="indicator orange">{{_('In Progress')}}</span>
- {% else %}
- <span class="indicator blue">{{_('Start')}}</span>
- {% endif %}
- </div>
- {% endif %}
- </div>
- </a>
-</div>
-{% endmacro %}
-
-{% block content %}
-<section class="section">
- {{ hero(program.program_name, program.description, has_access, {'name': 'Home', 'url': '/lms'}) }}
- <div class='container'>
- <div class="row mt-5">
- {% for course in courses %}
- {{ card(course) }}
- {% endfor %}
- {% if courses %}
- {% for n in range( (3 - (courses|length)) %3) %}
- {{ null_card() }}
- {% endfor %}
- {% endif %}
- </div>
- </div>
-</section>
-{% endblock %}
diff --git a/erpnext/www/lms/program.py b/erpnext/www/lms/program.py
deleted file mode 100644
index 1df2aa5..0000000
--- a/erpnext/www/lms/program.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import frappe
-from frappe import _
-
-import erpnext.education.utils as utils
-
-no_cache = 1
-
-
-def get_context(context):
- try:
- program = frappe.form_dict["program"]
- except KeyError:
- frappe.local.flags.redirect_location = "/lms"
- raise frappe.Redirect
-
- context.education_settings = frappe.get_single("Education Settings")
- context.program = get_program(program)
- context.courses = [frappe.get_doc("Course", course.course) for course in context.program.courses]
- context.has_access = utils.allowed_program_access(program)
- context.progress = get_course_progress(context.courses, context.program)
-
-
-def get_program(program_name):
- try:
- return frappe.get_doc("Program", program_name)
- except frappe.DoesNotExistError:
- frappe.throw(_("Program {0} does not exist.").format(program_name))
-
-
-def get_course_progress(courses, program):
- progress = {course.name: utils.get_course_progress(course, program) for course in courses}
- return progress or {}
diff --git a/erpnext/www/lms/topic.html b/erpnext/www/lms/topic.html
deleted file mode 100644
index dc69599..0000000
--- a/erpnext/www/lms/topic.html
+++ /dev/null
@@ -1,58 +0,0 @@
-{% extends "templates/base.html" %}
-{% block title %}{{ topic.name }}{% endblock %}
-{% from "www/lms/macros/hero.html" import hero %}
-{% from "www/lms/macros/card.html" import null_card %}
-
-{% block head_include %}
- <style>
- section {
- padding: 5rem 0 5rem 0;
- }
- </style>
-{% endblock %}
-
-
-{% macro card(content, index, length) %}
-<div class="col-sm-4 mb-4 text-left">
- <a href="/lms/content?program={{ program }}&course={{ course }}&topic={{ topic.name }}&type={{ content.content_type }}&content={{ content.content.name }}" class="no-decoration no-underline">
- <div class="card h-100">
- <div class='card-body'>
- <div class="text-muted">{{ content.content_type or '' }}</div>
- <h5 class='card-title'>{{ content.content.name }}</h5>
- </div>
- {% if has_access %}
- <div class='card-footer'>
- {% if content.content_type == 'Quiz' %}
- {% if content.result == 'Fail' %} <span class="indicator red">{{_('Fail')}} <span class="text-muted">({{ content.score }}/100)</span></span>
- {% elif content.result == 'Pass' %} <span class="indicator green">{{_('Pass')}} <span class="text-muted">({{ content.score }}/100)</span>
- {% else %} <span class="indicator blue">{{_('Start')}}</span>
- {% endif %}
- {% else %}
- {% if content.completed %} <span class="indicator green">{{_('Completed')}}</span>
- {% else %} <span class="indicator blue">{{_('Start')}}</span>
- {% endif %}
- {% endif %}
- </div>
- {% endif %}
- </div>
- </a>
-</div>
-{% endmacro %}
-
-{% block content %}
-<section class="section">
- {{ hero(topic.topic_name, topic.description, has_access, {'name': 'Course', 'url': '/lms/course?name=' + course +'&program=' + program}) }}
- <div class='container'>
- <div class="row mt-5">
- {% for content in contents %}
- {{ card(content, loop.index, topic.contents|length) }}
- {% endfor %}
- {% if contents %}
- {% for n in range( (3 - (contents|length)) %3) %}
- {{ null_card() }}
- {% endfor %}
- {% endif %}
- </div>
- </div>
-</section>
-{% endblock %}
diff --git a/erpnext/www/lms/topic.py b/erpnext/www/lms/topic.py
deleted file mode 100644
index 7783211..0000000
--- a/erpnext/www/lms/topic.py
+++ /dev/null
@@ -1,57 +0,0 @@
-import frappe
-
-import erpnext.education.utils as utils
-
-no_cache = 1
-
-
-def get_context(context):
- try:
- course = frappe.form_dict["course"]
- program = frappe.form_dict["program"]
- topic = frappe.form_dict["topic"]
- except KeyError:
- frappe.local.flags.redirect_location = "/lms"
- raise frappe.Redirect
-
- context.program = program
- context.course = course
- context.topic = frappe.get_doc("Topic", topic)
- context.contents = get_contents(context.topic, course, program)
- context.has_access = utils.allowed_program_access(program)
-
-
-def get_contents(topic, course, program):
- student = utils.get_current_student()
- if student:
- course_enrollment = utils.get_or_create_course_enrollment(course, program)
- contents = topic.get_contents()
- progress = []
- if contents:
- for content in contents:
- if content.doctype in ("Article", "Video"):
- if student:
- status = utils.check_content_completion(content.name, content.doctype, course_enrollment.name)
- else:
- status = True
- progress.append({"content": content, "content_type": content.doctype, "completed": status})
- elif content.doctype == "Quiz":
- if student:
- status, score, result, time_taken = utils.check_quiz_completion(
- content, course_enrollment.name
- )
- else:
- status = False
- score = None
- result = None
- progress.append(
- {
- "content": content,
- "content_type": content.doctype,
- "completed": status,
- "score": score,
- "result": result,
- }
- )
-
- return progress