[fixes] setup wizard and domainify for schools;

This commit is contained in:
Rushabh Mehta 2016-07-21 16:01:59 +05:30
parent b0061c9341
commit 20038ad2c9
9 changed files with 510 additions and 116 deletions

View File

@ -164,5 +164,111 @@ def get_data():
"icon": "octicon octicon-tools",
"type": "module",
"label": _("Maintenance")
},
{
"module_name": "Student",
"color": "#c0392b",
"icon": "octicon octicon-person",
"label": _("Student"),
"link": "List/Student",
"doctype": "Student",
"type": "list"
},
{
"module_name": "Student Group",
"color": "#d59919",
"icon": "octicon octicon-organization",
"label": _("Student Group"),
"link": "List/Student Group",
"doctype": "Student Group",
"type": "list"
},
{
"module_name": "Course Schedule",
"color": "#fd784f",
"icon": "octicon octicon-calendar",
"label": _("Course Schedule"),
"link": "Calendar/Course Schedule",
"doctype": "Course Schedule",
"type": "list"
},
{
"module_name": "Student Attendance",
"color": "#3aacba",
"icon": "octicon octicon-checklist",
"label": _("Student Attendance"),
"link": "List/Student Attendance",
"doctype": "Student Attendance",
"type": "list"
},
{
"module_name": "Course",
"color": "#8e44ad",
"icon": "octicon octicon-book",
"label": _("Course"),
"link": "List/Course",
"doctype": "Course",
"type": "list"
},
{
"module_name": "Program",
"color": "#9b59b6",
"icon": "octicon octicon-repo",
"label": _("Program"),
"link": "List/Program",
"doctype": "Program",
"type": "list"
},
{
"module_name": "Student Applicant",
"color": "#4d927f",
"icon": "octicon octicon-clippy",
"label": _("Student Applicant"),
"link": "List/Student Applicant",
"doctype": "Student Applicant",
"type": "list"
},
{
"module_name": "Examination",
"color": "#8a70be",
"icon": "icon-file-text-alt",
"label": _("Examination"),
"link": "List/Examination",
"doctype": "Examination",
"type": "list"
},
{
"module_name": "Fees",
"color": "#83C21E",
"icon": "icon-money",
"label": _("Fees"),
"link": "List/Fees",
"doctype": "Fees",
"type": "list"
},
{
"module_name": "Instructor",
"color": "#a99e4c",
"icon": "octicon octicon-broadcast",
"label": _("Instructor"),
"link": "List/Instructor",
"doctype": "Instructor",
"type": "list"
},
{
"module_name": "Room",
"color": "#f22683",
"icon": "icon-map-marker",
"label": _("Room"),
"link": "List/Room",
"doctype": "Examination",
"type": "list"
},
{
"module_name": "Schools",
"color": "#DE2B37",
"icon": "octicon octicon-mortar-board",
"type": "module",
"label": _("Schools")
}
]

110
erpnext/config/schools.py Normal file
View File

@ -0,0 +1,110 @@
from __future__ import unicode_literals
from frappe import _
def get_data():
return [
{
"label": _("Student"),
"items": [
{
"type": "doctype",
"name": "Student"
},
{
"type": "doctype",
"name": "Student Group"
},
{
"type": "doctype",
"name": "Student Applicant"
},
{
"type": "doctype",
"name": "Program Enrollment"
},
{
"type": "doctype",
"name": "Program Enrollment Tool"
},
{
"type": "doctype",
"name": "Student Group Creation Tool"
}
]
},
{
"label": _("Schedule"),
"items": [
{
"type": "doctype",
"name": "Course Schedule",
"route": "Calendar/Course Schedule"
},
{
"type": "doctype",
"name": "Student Attendance"
},
{
"type": "doctype",
"name": "Scheduling Tool"
},
{
"type": "doctype",
"name": "Examination"
}
]
},
{
"label": _("Fees"),
"items": [
{
"type": "doctype",
"name": "Fees"
},
{
"type": "doctype",
"name": "Fee Structure"
},
{
"type": "doctype",
"name": "Fee Category"
},
{
"type": "report",
"name": "Student Fee Collection",
"doctype": "Fees",
"is_query_report": True
}
]
},
{
"label": _("Setup"),
"items": [
{
"type": "doctype",
"name": "Course"
},
{
"type": "doctype",
"name": "Program"
},
{
"type": "doctype",
"name": "Instructor"
},
{
"type": "doctype",
"name": "Room"
},
{
"type": "doctype",
"name": "Academic Term"
},
{
"type": "doctype",
"name": "Academic Year"
}
]
},
]

View File

@ -299,3 +299,4 @@ execute:frappe.delete_doc_if_exists("Report", "Employee Holiday Attendance")
execute:frappe.delete_doc_if_exists("DocType", "Payment Tool")
execute:frappe.delete_doc_if_exists("DocType", "Payment Tool Detail")
erpnext.patches.v7_0.setup_account_table_for_expense_claim_type_if_exists
erpnext.patches.v7_0.migrate_schools_to_erpnext

View File

@ -1,7 +1,13 @@
from __future__ import unicode_literals
import frappe
from erpnext.setup.setup_wizard import domainify
def execute():
frappe.db.sql("""update `tabDoctype` set module='Schools' where module='Academics'""")
from frappe.installer import remove_from_installed_apps
remove_from_installed_apps("schools")
frappe.get_doc('Portal Settings', 'Portal Settings').sync_menu()
if 'schools' in frappe.get_installed_apps():
frappe.db.sql("""update `tabDoctype` set module='Schools' where module='Academics'""")
from frappe.installer import remove_from_installed_apps
remove_from_installed_apps("schools")
domainify.setup_domain('Education')
else:
domainify.setup_sidebar_items(domainify.get_domain('Manufacturing'))

View File

@ -9,28 +9,49 @@ frappe.pages['setup-wizard'].on_page_load = function(wrapper) {
function load_erpnext_slides() {
$.extend(erpnext.wiz, {
org: {
app_name: "erpnext",
title: __("The Organization"),
icon: "icon-building",
select_domain: {
domains: ["all"],
title: __('Select your Domain'),
fields: [
{fieldname:'company_name', label: __('Company Name'), fieldtype:'Data', reqd:1,
placeholder: __('e.g. "My Company LLC"')},
{fieldname:'company_abbr', label: __('Company Abbreviation'), fieldtype:'Data',
description: __('Max 5 characters'), placeholder: __('e.g. "MC"'), reqd:1},
{fieldname:'company_tagline', label: __('What does it do?'), fieldtype:'Data',
placeholder:__('e.g. "Build tools for builders"'), reqd:1},
{fieldname:'bank_account', label: __('Bank Name'), fieldtype:'Data',
placeholder: __('e.g. "XYZ National Bank"'), reqd:1 },
{fieldname:'domain', label: __('Domain'), fieldtype:'Select',
options: [
{"label": __("Distribution"), "value": "Distribution"},
{"label": __("Education"), "value": "Education"},
{"label": __("Manufacturing"), "value": "Manufacturing"},
{"label": __("Retail"), "value": "Retail"},
{"label": __("Services"), "value": "Services"},
{"label": __("Education"), "value": "Education"},
{"label": __("Other"), "value": "Other"},
{"label": __("Services"), "value": "Services"}
], reqd:1},
],
help: __('Select the nature of your business.'),
onload: function(slide) {
slide.get_input("domain").on("change", function() {
frappe.wiz.domain = $(this).val();
frappe.wizard.refresh_slides();
});
},
css_class: "single-column"
},
org: {
domains: ["all"],
title: __("The Organization"),
icon: "icon-building",
fields: [
{fieldname:'company_name',
label: frappe.wiz.domain==='Education' ?
__('Institute Name') : __('Company Name'),
fieldtype:'Data', reqd:1},
{fieldname:'company_abbr',
label: frappe.wiz.domain==='Education' ?
__('Institute Abbreviation') : __('Company Abbreviation'),
fieldtype:'Data'},
{fieldname:'company_tagline',
label: __('What does it do?'),
fieldtype:'Data',
placeholder: frappe.wiz.domain==='Education' ?
__('e.g. "Primary School" or "University"') :
__('e.g. "Build tools for builders"'),
reqd:1},
{fieldname:'bank_account', label: __('Bank Name'), fieldtype:'Data', reqd:1},
{fieldname:'chart_of_accounts', label: __('Chart of Accounts'),
options: "", fieldtype: 'Select'},
@ -41,7 +62,9 @@ function load_erpnext_slides() {
{fieldname:'fy_end_date', label:__('Financial Year End Date'), fieldtype:'Date',
description: __('Your financial year ends on'), reqd:1},
],
help: __('The name of your company for which you are setting up this system.'),
help: (frappe.wiz.domain==='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.')),
onload: function(slide) {
erpnext.wiz.org.load_chart_of_accounts(slide);
@ -67,7 +90,7 @@ function load_erpnext_slides() {
css_class: "single-column",
set_fy_dates: function(slide) {
var country = slide.wiz.get_values().country;
var country = frappe.wizard.values.country;
if(country) {
var fy = erpnext.wiz.fiscal_years[country];
@ -85,7 +108,7 @@ function load_erpnext_slides() {
},
load_chart_of_accounts: function(slide) {
var country = slide.wiz.get_values().country;
var country = frappe.wizard.values.country;
if(country) {
frappe.call({
@ -134,7 +157,7 @@ function load_erpnext_slides() {
},
branding: {
app_name: "erpnext",
domains: ["all"],
icon: "icon-bookmark",
title: __("The Brand"),
help: __('Upload your letter head and logo. (you can edit them later).'),
@ -156,7 +179,7 @@ function load_erpnext_slides() {
},
users: {
app_name: "erpnext",
domains: ["all"],
icon: "icon-money",
title: __("Add Users"),
help: __("Add users to your organization, other than yourself"),
@ -173,11 +196,14 @@ function load_erpnext_slides() {
options: "Email"},
{fieldtype:"Column Break"},
{fieldtype: "Check", fieldname: "user_sales_" + i,
label:__("Sales"), default: 1},
label:__("Sales"), "default": 1,
hidden: frappe.wiz.domain==='Education' ? 1 : 0},
{fieldtype: "Check", fieldname: "user_purchaser_" + i,
label:__("Purchaser"), default: 1},
label:__("Purchaser"), "default": 1,
hidden: frappe.wiz.domain==='Education' ? 1 : 0},
{fieldtype: "Check", fieldname: "user_accountant_" + i,
label:__("Accountant"), default: 1},
label:__("Accountant"), "default": 1,
hidden: frappe.wiz.domain==='Education' ? 1 : 0},
]);
}
},
@ -185,7 +211,7 @@ function load_erpnext_slides() {
},
taxes: {
app_name: "erpnext",
domains: ['manufacturing', 'services', 'retail', 'distribution'],
icon: "icon-money",
title: __("Add Taxes"),
help: __("List your tax heads (e.g. VAT, Customs etc; they should have unique names) and their standard rates. This will create a standard template, which you can edit and add more later."),
@ -206,7 +232,7 @@ function load_erpnext_slides() {
},
customers: {
app_name: "erpnext",
domains: ['manufacturing', 'services', 'retail', 'distribution'],
icon: "icon-group",
title: __("Your Customers"),
help: __("List a few of your customers. They could be organizations or individuals."),
@ -229,7 +255,7 @@ function load_erpnext_slides() {
},
suppliers: {
app_name: "erpnext",
domains: ['manufacturing', 'services', 'retail', 'distribution'],
icon: "icon-group",
title: __("Your Suppliers"),
help: __("List a few of your suppliers. They could be organizations or individuals."),
@ -252,7 +278,7 @@ function load_erpnext_slides() {
},
items: {
app_name: "erpnext",
domains: ['manufacturing', 'services', 'retail', 'distribution'],
icon: "icon-barcode",
title: __("Your Products or Services"),
help: __("List your products or services that you buy or sell. Make sure to check the Item Group, Unit of Measure and other properties when you start."),
@ -288,6 +314,81 @@ function load_erpnext_slides() {
},
css_class: "two-column"
},
program: {
domains: ["education"],
title: __("Program"),
help: __("Example: Masters in Computer Science"),
fields: [],
before_load: function(slide) {
slide.fields = [];
for(var i=1; i<6; i++) {
slide.fields = slide.fields.concat([
{fieldtype:"Section Break", show_section_border: true},
{fieldtype:"Data", fieldname:"program_" + i, label:__("Program") + " " + i, placeholder: __("Program Name")},
])
}
slide.fields[1].reqd = 1;
},
css_class: "single-column"
},
course: {
domains: ["education"],
title: __("Course"),
help: __("Example: Basic Mathematics"),
fields: [],
before_load: function(slide) {
slide.fields = [];
for(var i=1; i<6; i++) {
slide.fields = slide.fields.concat([
{fieldtype:"Section Break", show_section_border: true},
{fieldtype:"Data", fieldname:"course_" + i, label:__("Course") + " " + i, placeholder: __("Course Name")},
])
}
slide.fields[1].reqd = 1;
},
css_class: "single-column"
},
instructor: {
domains: ["education"],
title: __("Instructor"),
help: __("People who teach at your organisation"),
fields: [],
before_load: function(slide) {
slide.fields = [];
for(var i=1; i<6; i++) {
slide.fields = slide.fields.concat([
{fieldtype:"Section Break", show_section_border: true},
{fieldtype:"Data", fieldname:"instructor_" + i, label:__("Instructor") + " " + i, placeholder: __("Instructor Name")},
])
}
slide.fields[1].reqd = 1;
},
css_class: "single-column"
},
room: {
domains: ["education"],
title: __("Room"),
help: __("Classrooms/ Laboratories etc where lectures can be scheduled."),
fields: [],
before_load: function(slide) {
slide.fields = [];
for(var i=1; i<4; i++) {
slide.fields = slide.fields.concat([
{fieldtype:"Section Break", show_section_border: true},
{fieldtype:"Data", fieldname:"room_" + i, label:__("Room") + " " + i},
{fieldtype:"Column Break"},
{fieldtype:"Int", fieldname:"room_capacity_" + i, label:__("Room") + " " + i + " Capacity"},
])
}
slide.fields[1].reqd = 1;
},
css_class: "two-column"
},
});
// Source: https://en.wikipedia.org/wiki/Fiscal_year
@ -316,6 +417,8 @@ function load_erpnext_slides() {
frappe.wiz.on("before_load", function() {
load_erpnext_slides();
frappe.wiz.add_slide(erpnext.wiz.select_domain);
frappe.wiz.add_slide(erpnext.wiz.org);
frappe.wiz.add_slide(erpnext.wiz.branding);
@ -327,5 +430,29 @@ frappe.wiz.on("before_load", function() {
frappe.wiz.add_slide(erpnext.wiz.customers);
frappe.wiz.add_slide(erpnext.wiz.suppliers);
frappe.wiz.add_slide(erpnext.wiz.items);
frappe.wiz.welcome_page = "#welcome-to-erpnext";
frappe.wiz.add_slide(erpnext.wiz.program);
frappe.wiz.add_slide(erpnext.wiz.course);
frappe.wiz.add_slide(erpnext.wiz.instructor);
frappe.wiz.add_slide(erpnext.wiz.room);
if(frappe.wizard.domain && frappe.wizard.domain !== 'Education') {
frappe.wiz.welcome_page = "#welcome-to-erpnext";
}
});
test_values_edu = {
"language":"english",
"domain":"Education",
"country":"India",
"timezone":"Asia/Kolkata",
"currency":"INR",
"first_name":"Tester",
"email":"test@example.com",
"password":"test",
"company_name":"Hogwarts",
"company_abbr":"HS",
"company_tagline":"School for magicians",
"bank_account":"Gringotts Wizarding Bank",
"fy_start_date":"2016-04-01",
"fy_end_date":"2017-03-31"
}

View File

@ -9,6 +9,7 @@
"docstatus": 0,
"doctype": "DocType",
"document_type": "Document",
"editable_grid": 0,
"fields": [
{
"allow_on_submit": 0,
@ -276,8 +277,8 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2016-07-18 10:30:50.243271",
"modified_by": "Administrator",
"modified": "2016-07-21 06:30:12.825629",
"modified_by": "r@r.com",
"module": "Schools",
"name": "Announcement",
"name_case": "",
@ -302,26 +303,6 @@
"share": 1,
"submit": 1,
"write": 1
},
{
"amend": 0,
"apply_user_permissions": 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": "Guest",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 0,

View File

@ -478,8 +478,8 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
"modified": "2016-07-18 10:30:50.243271",
"modified_by": "Administrator",
"modified": "2016-07-21 06:20:10.878913",
"modified_by": "r@r.com",
"module": "Schools",
"name": "Fees",
"name_case": "",
@ -504,46 +504,6 @@
"share": 1,
"submit": 1,
"write": 1
},
{
"amend": 0,
"apply_user_permissions": 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": "Administrator",
"set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
},
{
"amend": 0,
"apply_user_permissions": 0,
"cancel": 0,
"create": 0,
"delete": 0,
"email": 0,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 0,
"role": "Guest",
"set_user_permissions": 0,
"share": 0,
"submit": 0,
"write": 0
}
],
"quick_entry": 0,

View File

@ -4,86 +4,136 @@
from __future__ import unicode_literals
import frappe
def get_domains():
def get_domain(domain):
'''Written as a function to prevent data mutation effects'''
return {
data = {
'Manufacturing': {
'desktop_icons': ['Item', 'BOM', 'Customer', 'Supplier', 'Sales Order',
'Production Order', 'Stock Entry', 'Purchase Order', 'Task', 'Buying', 'Selling',
'Accounts', 'HR', 'ToDo'],
'remove_roles': ['Academics User'],
'properties': [
{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'collapsible_depends_on', 'value': 'is_stock_item'},
],
'set_value': [
['Stock Settings', None, 'show_barcode_field', 1]
]
],
'remove_sidebar_items': ['/announcement', '/course', '/examination', '/fees']
},
'Retail': {
'desktop_icons': ['POS', 'Item', 'Customer', 'Sales Invoice', 'Purchase Order', 'Warranty Claim',
'Accounts', 'Buying', 'ToDo'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'],
'properties': [
{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'hidden', 'value': 1},
{'doctype': 'Customer', 'fieldname': 'credit_limit_section', 'property': 'hidden', 'value': 1},
],
'set_value': [
['Stock Settings', None, 'show_barcode_field', 1]
]
],
'remove_sidebar_items': ['/announcement', '/course', '/examination', '/fees']
},
'Distribution': {
'desktop_icons': ['Item', 'Customer', 'Supplier', 'Lead', 'Sales Order',
'Sales Invoice', 'CRM', 'Selling', 'Buying', 'Stock', 'Accounts', 'HR', 'ToDo'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'],
'properties': [
{'doctype': 'Item', 'fieldname': 'manufacturing', 'property': 'hidden', 'value': 1},
],
'set_value': [
['Stock Settings', None, 'show_barcode_field', 1]
]
],
'remove_sidebar_items': ['/announcement', '/course', '/examination', '/fees']
},
'Services': {
'desktop_icons': ['Project', 'Timesheet', 'Customer', 'Sales Order', 'Sales Invoice', 'Lead', 'Opportunity',
'Expense Claim', 'Employee', 'HR', 'ToDo'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager'],
'remove_roles': ['Manufacturing User', 'Manufacturing Manager', 'Academics User'],
'properties': [
{'doctype': 'Item', 'fieldname': 'is_stock_item', 'property': 'default', 'value': 0},
],
'set_value': [
['Stock Settings', None, 'show_barcode_field', 0]
]
}
],
'remove_sidebar_items': ['/announcement', '/course', '/examination', '/fees']
},
'Education': {
'desktop_icons': ['Student', 'Program', 'Course', 'Student Group', 'Instructor',
'Fees', 'ToDo', 'Schools'],
'allow_roles': ['Academics User', 'Accounts User', 'Accounts Manager'],
'allow_sidebar_items': ['/announcement', '/course', '/examination', '/fees']
},
}
if not domain in data:
raise 'Invalid Domain {0}'.format(domain)
return frappe._dict(data[domain])
def setup_domain(domain):
domains = get_domains()
if not domain in domains:
return
'''Setup roles, desktop icons, properties, values, portal sidebar menu based on domain'''
data = get_domain(domain)
setup_roles(data)
setup_desktop_icons(data)
setup_properties(data)
set_values(data)
setup_sidebar_items(data)
frappe.clear_cache()
def setup_desktop_icons(data):
'''set desktop icons form `data.desktop_icons`'''
from frappe.desk.doctype.desktop_icon.desktop_icon import set_desktop_icons
data = frappe._dict(domains[domain])
if data.remove_roles:
for role in data.remove_roles:
frappe.db.sql('delete from tabUserRole where role=%s', role)
if data.desktop_icons:
set_desktop_icons(data.desktop_icons)
def setup_properties(data):
if data.properties:
for args in data.properties:
frappe.make_property_setter(args)
def setup_roles(data):
'''Add, remove roles from `data.allow_roles` or `data.remove_roles`'''
def remove_role(role):
frappe.db.sql('delete from tabUserRole where role=%s', role)
if data.remove_roles:
for role in data.remove_roles:
remove_role(role)
if data.allow_roles:
# remove all roles other than allowed roles
data.allow_roles += ['Administrator', 'Guest', 'System Manager']
for role in frappe.get_all('Role'):
if not (role.name in data.allow_roles):
remove_role(role.name)
def set_values(data):
'''set values based on `data.set_value`'''
if data.set_value:
for args in data.set_value:
doc = frappe.get_doc(args[0], args[1] or args[0])
doc.set(args[2], args[3])
doc.save()
frappe.clear_cache()
def setup_sidebar_items(data):
'''Enable / disable sidebar items'''
if data.allow_sidebar_items:
# disable all
frappe.db.sql('update `tabPortal Menu Item` set enabled=0')
# enable
frappe.db.sql('''update `tabPortal Menu Item` set enabled=1
where route in ({0})'''.format(', '.join(['"{0}"'.format(d) for d in data.allow_sidebar_items])))
if data.remove_sidebar_items:
# disable all
frappe.db.sql('update `tabPortal Menu Item` set enabled=1')
# enable
frappe.db.sql('''update `tabPortal Menu Item` set enabled=0
where route in ({0})'''.format(', '.join(['"{0}"'.format(d) for d in data.remove_sidebar_items])))
def reset():
from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to

View File

@ -32,6 +32,15 @@ def setup_complete(args=None):
create_items(args)
create_customers(args)
create_suppliers(args)
if args.domain.lower() == 'education':
create_academic_term()
create_academic_year()
create_program(args)
create_course(args)
create_instructor(args)
create_room(args)
frappe.local.message_log = []
setup_domain(args.get('domain'))
@ -493,3 +502,47 @@ def create_users(args):
emp.flags.ignore_mandatory = True
emp.insert(ignore_permissions = True)
def create_academic_term():
at = ["Semester 1", "Semester 2", "Semester 3"]
for d in at:
academic_term = frappe.new_doc("Academic Term")
academic_term.term_name = d
academic_term.save()
def create_academic_year():
ac = ["2013-14", "2014-15", "2015-16", "2016-17", "2017-18"]
for d in ac:
academic_year = frappe.new_doc("Academic Year")
academic_year.academic_year_name = d
academic_year.save()
def create_program(args):
for i in xrange(1,6):
if args.get("program_" + str(i)):
program = frappe.new_doc("Program")
program.program_name = args.get("program_" + str(i))
program.save()
def create_course(args):
for i in xrange(1,6):
if args.get("course_" + str(i)):
course = frappe.new_doc("Course")
course.course_name = args.get("course_" + str(i))
course.save()
def create_instructor(args):
for i in xrange(1,6):
if args.get("instructor_" + str(i)):
instructor = frappe.new_doc("Instructor")
instructor.instructor_name = args.get("instructor_" + str(i))
instructor.save()
def create_room(args):
for i in xrange(1,6):
if args.get("room_" + str(i)):
room = frappe.new_doc("Room")
room.room_name = args.get("room_" + str(i))
room.seating_capacity = args.get("room_capacity_" + str(i))
room.save()