[fixes] setup wizard and domainify for schools;
diff --git a/erpnext/config/desktop.py b/erpnext/config/desktop.py
index fc2be82..df2a0ee 100644
--- a/erpnext/config/desktop.py
+++ b/erpnext/config/desktop.py
@@ -164,5 +164,111 @@
"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")
}
]
diff --git a/erpnext/config/schools.py b/erpnext/config/schools.py
new file mode 100644
index 0000000..ee1a8cb
--- /dev/null
+++ b/erpnext/config/schools.py
@@ -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"
+ }
+ ]
+ },
+ ]
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 699a745f..d211ca9 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -299,3 +299,4 @@
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
diff --git a/erpnext/patches/v7_0/migrate_schools_to_erpnext.py b/erpnext/patches/v7_0/migrate_schools_to_erpnext.py
index 95ab16c..ca37e69 100644
--- a/erpnext/patches/v7_0/migrate_schools_to_erpnext.py
+++ b/erpnext/patches/v7_0/migrate_schools_to_erpnext.py
@@ -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")
\ No newline at end of file
+ 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'))
diff --git a/erpnext/public/js/setup_wizard.js b/erpnext/public/js/setup_wizard.js
index 9954ae0..4da4ce2 100644
--- a/erpnext/public/js/setup_wizard.js
+++ b/erpnext/public/js/setup_wizard.js
@@ -9,28 +9,49 @@
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 @@
{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 @@
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 @@
},
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 @@
},
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 @@
},
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 @@
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 @@
},
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 @@
},
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 @@
},
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 @@
},
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 @@
},
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 @@
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.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"
+}
diff --git a/erpnext/schools/doctype/announcement/announcement.json b/erpnext/schools/doctype/announcement/announcement.json
index c965da5..831b71f 100644
--- a/erpnext/schools/doctype/announcement/announcement.json
+++ b/erpnext/schools/doctype/announcement/announcement.json
@@ -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,
diff --git a/erpnext/schools/doctype/fees/fees.json b/erpnext/schools/doctype/fees/fees.json
index 8e3b560..576d69e 100644
--- a/erpnext/schools/doctype/fees/fees.json
+++ b/erpnext/schools/doctype/fees/fees.json
@@ -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,
diff --git a/erpnext/setup/setup_wizard/domainify.py b/erpnext/setup/setup_wizard/domainify.py
index 02be189..07b2e19 100644
--- a/erpnext/setup/setup_wizard/domainify.py
+++ b/erpnext/setup/setup_wizard/domainify.py
@@ -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()
+ '''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()
- if not domain in domains:
- return
-
+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
diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py
index 0284ca8..3cabde1 100644
--- a/erpnext/setup/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/setup_wizard/setup_wizard.py
@@ -32,6 +32,15 @@
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 @@
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()
+
+