[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

@@ -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()