def execute():
	dataent.reload_doc("email", "doctype", "email_template")

	if not dataent.db.exists("Email Template", _('Leave Approval Notification')):
		base_path = dataent.get_app_path("epaas", "hr", "doctype")
		response = dataent.read_file(os.path.join(base_path, "leave_application/leave_application_email_template.html"))
		dataent.get_doc({
			'doctype': 'Email Template',
			'name': _("Leave Approval Notification"),
			'response': response,
			'subject': _("Leave Approval Notification"),
			'owner': dataent.session.user,
		}).insert(ignore_permissions=True)


	if not dataent.db.exists("Email Template", _('Leave Status Notification')):
		base_path = dataent.get_app_path("epaas", "hr", "doctype")
		response = dataent.read_file(os.path.join(base_path, "leave_application/leave_application_email_template.html"))
		dataent.get_doc({
			'doctype': 'Email Template',
			'name': _("Leave Status Notification"),
			'response': response,
			'subject': _("Leave Status Notification"),
			'owner': dataent.session.user,
		}).insert(ignore_permissions=True)
Exemplo n.º 2
0
def add_uom_data():
	# add UOMs
	uoms = json.loads(open(dataent.get_app_path("epaas", "setup", "setup_wizard", "data", "uom_data.json")).read())
	for d in uoms:
		if not dataent.db.exists('UOM', _(d.get("uom_name"))):
			uom_doc = dataent.get_doc({
				"doctype": "UOM",
				"uom_name": _(d.get("uom_name")),
				"name": _(d.get("uom_name")),
				"must_be_whole_number": d.get("must_be_whole_number")
			}).insert(ignore_permissions=True)

	# bootstrap uom conversion factors
	uom_conversions = json.loads(open(dataent.get_app_path("epaas", "setup", "setup_wizard", "data", "uom_conversion_data.json")).read())
	for d in uom_conversions:
		if not dataent.db.exists("UOM Category", _(d.get("category"))):
			dataent.get_doc({
				"doctype": "UOM Category",
				"category_name": _(d.get("category"))
			}).insert(ignore_permissions=True)

		uom_conversion = dataent.get_doc({
			"doctype": "UOM Conversion Factor",
			"category": _(d.get("category")),
			"from_uom": _(d.get("from_uom")),
			"to_uom": _(d.get("to_uom")),
			"value": d.get("value")
		}).insert(ignore_permissions=True)
Exemplo n.º 3
0
			def trigger_make(source_path, event_type):
				if "/docs/user/" in source_path:
					# user file
					target_path = dataent.get_app_path(target, 'www', 'docs', 'user',
						os.path.relpath(source_path, start=dataent.get_app_path(app, 'docs', 'user')))
					shutil.copy(source_path, target_path)
					add_breadcrumbs_tag(target_path)

				if source_path.endswith('/docs/index.md'):
					target_path = dataent.get_app_path(target, 'www', 'docs', 'index.md')
					shutil.copy(source_path, target_path)
Exemplo n.º 4
0
def export_fixture(doctype, app):
    if dataent.session.user != "Administrator":
        raise dataent.PermissionError

    if not os.path.exists(dataent.get_app_path(app, "fixtures")):
        os.mkdir(dataent.get_app_path(app, "fixtures"))

    export_json(doctype,
                dataent.get_app_path(app, "fixtures",
                                     dataent.scrub(doctype) + ".json"),
                order_by="name asc")
Exemplo n.º 5
0
def get_tests_for(app=None, test_list=None):
    tests = []
    if test_list:
        # Get all tests from a particular txt file
        app, test_list = test_list.split(os.path.sep, 1)
        tests_path = dataent.get_app_path(app, test_list)
    else:
        # Get all tests for a particular app
        tests_path = dataent.get_app_path(app, 'tests', 'ui', 'tests.txt')
    if os.path.exists(tests_path):
        with open(tests_path, 'r') as fileobj:
            tests = fileobj.read().strip().splitlines()
    return tests
Exemplo n.º 6
0
    def copy_user_assets(self):
        '''Copy docs/user and docs/assets to the target app'''
        print('Copying docs/user and docs/assets...')
        shutil.rmtree(os.path.join(self.docs_path, 'user'), ignore_errors=True)
        shutil.rmtree(os.path.join(self.docs_path, 'assets'),
                      ignore_errors=True)
        shutil.copytree(os.path.join(self.app_path, 'docs', 'user'),
                        os.path.join(self.docs_path, 'user'))
        shutil.copytree(
            os.path.join(self.app_path, 'docs', 'assets'),
            dataent.get_app_path(self.target_app, 'www', 'docs', 'assets'))

        # copy index
        shutil.copy(os.path.join(self.app_path, 'docs', 'index.md'),
                    dataent.get_app_path(self.target_app, 'www', 'docs'))
Exemplo n.º 7
0
	def add_to_modules_txt(self):
		"""Adds to `[app]/modules.txt`"""
		modules = None
		if not dataent.local.module_app.get(dataent.scrub(self.name)):
			with open(dataent.get_app_path(self.app_name, "modules.txt"), "r") as f:
				content = f.read()
				if not self.name in content.splitlines():
					modules = list(filter(None, content.splitlines()))
					modules.append(self.name)

			if modules:
				with open(dataent.get_app_path(self.app_name, "modules.txt"), "w") as f:
					f.write("\n".join(modules))

				dataent.clear_cache()
				dataent.setup_module_map()
Exemplo n.º 8
0
	def create_modules_folder(self):
		"""Creates a folder `[app]/[module]` and adds `__init__.py`"""
		module_path = dataent.get_app_path(self.app_name, self.name)
		if not os.path.exists(module_path):
			os.mkdir(module_path)
			with open(os.path.join(module_path, "__init__.py"), "w") as f:
				f.write("")
Exemplo n.º 9
0
def purifycss():
    with open(source, 'r') as f:
        src = f.read()

    classes = []
    for line in src.splitlines():
        line = line.strip()
        if not line:
            continue
        if line[0] == '@':
            continue
        classes.extend(re.findall('\.([^0-9][^ :&.{,(]*)', line))

    classes = list(set(classes))

    for app in target_apps:
        for basepath, folders, files in os.walk(dataent.get_app_path(app)):
            for fname in files:
                if fname.endswith('.html') or fname.endswith('.md'):
                    #print 'checking {0}...'.format(fname)
                    with open(os.path.join(basepath, fname), 'r') as f:
                        src = f.read()
                    for c in classes:
                        if c in src:
                            classes.remove(c)

    for c in sorted(classes):
        print(c)
Exemplo n.º 10
0
def get_change_log_for_app(app, from_version, to_version):
    change_log_folder = os.path.join(dataent.get_app_path(app), "change_log")
    if not os.path.exists(change_log_folder):
        return

    from_version = Version(from_version)
    to_version = Version(to_version)
    # remove pre-release part
    to_version.prerelease = None

    major_version_folders = [
        "v{0}".format(i)
        for i in range(from_version.major, to_version.major + 1)
    ]
    app_change_log = []

    for folder in os.listdir(change_log_folder):
        if folder in major_version_folders:
            for file in os.listdir(os.path.join(change_log_folder, folder)):
                version = Version(
                    os.path.splitext(file)[0][1:].replace("_", "."))

                if from_version < version <= to_version:
                    file_path = os.path.join(change_log_folder, folder, file)
                    content = dataent.read_file(file_path)
                    app_change_log.append([version, content])

    app_change_log = sorted(app_change_log, key=lambda d: d[0], reverse=True)

    # convert version to string and send
    return [[cstr(d[0]), d[1]] for d in app_change_log]
Exemplo n.º 11
0
def setup_integration_service(app_details, settings=None):
    if not settings:
        return

    setup_service_settings(app_details["service_name"], settings)

    doc_path = dataent.get_app_path("dataent", "integration_broker", "doctype",
                                    "integration_service",
                                    "integration_service.json")

    if not os.path.exists(doc_path):
        return

    dataent.reload_doc("integration_broker", "doctype", "integration_service")

    if dataent.db.exists("Integration Service", app_details["service_name"]):
        integration_service = dataent.get_doc("Integration Service",
                                              app_details["service_name"])
    else:
        integration_service = dataent.new_doc("Integration Service")
        integration_service.service = app_details["service_name"]

    integration_service.enabled = 1
    integration_service.flags.ignore_mandatory = True
    integration_service.save(ignore_permissions=True)
Exemplo n.º 12
0
def render_include(content):
    '''render {% raw %}{% include "app/path/filename" %}{% endraw %} in js file'''

    content = cstr(content)

    # try 5 levels of includes
    for i in range(5):
        if "{% include" in content:
            paths = re.findall(r'''{% include\s['"](.*)['"]\s%}''', content)
            if not paths:
                dataent.throw('Invalid include path', InvalidIncludePath)

            for path in paths:
                app, app_path = path.split('/', 1)
                with io.open(dataent.get_app_path(app, app_path),
                             'r',
                             encoding='utf-8') as f:
                    include = f.read()
                    if path.endswith('.html'):
                        include = html_to_js_template(path, include)

                    content = re.sub(
                        r'''{{% include\s['"]{0}['"]\s%}}'''.format(path),
                        include, content)

        else:
            break

    return content
Exemplo n.º 13
0
def setup_user():
	dataent.db.sql('delete from tabUser where name not in ("Guest", "Administrator")')
	for u in json.loads(open(dataent.get_app_path('epaas', 'demo', 'data', 'user.json')).read()):
		user = dataent.new_doc("User")
		user.update(u)
		user.flags.no_welcome_mail = True
		user.new_password = '******'
		user.insert()
Exemplo n.º 14
0
def get_all_messages_from_js_files(app_name=None):
    """Extracts all translatable strings from app `.js` files"""
    messages = []
    for app in ([app_name] if app_name else dataent.get_installed_apps()):
        if os.path.exists(dataent.get_app_path(app, "public")):
            for basepath, folders, files in os.walk(
                    dataent.get_app_path(app, "public")):
                if "dataent/public/js/lib" in basepath:
                    continue

                for fname in files:
                    if fname.endswith(".js") or fname.endswith(".html"):
                        messages.extend(
                            get_messages_from_file(
                                os.path.join(basepath, fname)))

    return messages
Exemplo n.º 15
0
def update_language_names():
    '''Update dataent/geo/languages.json names (for use via patch)'''
    with open(dataent.get_app_path('dataent', 'geo', 'languages.json'),
              'r') as f:
        data = json.loads(f.read())

    for l in data:
        dataent.db.set_value('Language', l['code'], 'language_name', l['name'])
Exemplo n.º 16
0
    def build(self, docs_version):
        """Build templates for docs models and Python API"""
        self.docs_path = dataent.get_app_path(self.target_app, 'www', "docs")
        self.path = os.path.join(self.docs_path, docs_version)
        self.app_context["app"]["docs_version"] = docs_version

        self.app_title = self.hooks.get("app_title")[0]
        self.app_path = dataent.get_app_path(self.app)

        print("Deleting current...")
        shutil.rmtree(self.path, ignore_errors=True)
        os.makedirs(self.path)

        self.make_home_pages()

        for basepath, folders, files in os.walk(self.app_path):

            # make module home page
            if "/doctype/" not in basepath and "doctype" in folders:
                module = os.path.basename(basepath)

                module_folder = os.path.join(self.models_base_path, module)

                self.make_folder(module_folder,
                                 template="templates/autodoc/module_home.html",
                                 context={"name": module})
                self.update_index_txt(module_folder)

            # make for model files
            if "/doctype/" in basepath:
                parts = basepath.split("/")
                #print parts
                module, doctype = parts[-3], parts[-1]

                if doctype != "boilerplate":
                    self.write_model_file(basepath, module, doctype)

            # standard python module
            if self.is_py_module(basepath, folders, files):
                self.write_modules(basepath, folders, files)

        #self.build_user_docs()
        self.copy_user_assets()
        self.add_sidebars()
        self.add_breadcrumbs_for_user_pages()
Exemplo n.º 17
0
def reload_doctypes_for_schools_icons():
    # 'Schools' module changed to the 'Education'
    # base_path = dataent.get_app_path('epaas', 'schools', 'doctype')

    base_path = dataent.get_app_path('epaas', 'education', 'doctype')
    for doctype in os.listdir(base_path):
        if os.path.exists(os.path.join(base_path, doctype, doctype + '.json')) \
         and doctype not in ("fee_component", "assessment", "assessment_result"):
            dataent.reload_doc('education', 'doctype', doctype)
Exemplo n.º 18
0
def get_page_info(path, app, start, basepath=None, app_path=None, fname=None):
    '''Load page info'''
    if fname is None:
        fname = os.path.basename(path)

    if app_path is None:
        app_path = dataent.get_app_path(app)

    if basepath is None:
        basepath = os.path.dirname(path)

    page_name, extn = fname.rsplit(".", 1)

    # add website route
    page_info = dataent._dict()

    page_info.basename = page_name if extn in ('html', 'md') else fname
    page_info.basepath = basepath
    page_info.page_or_generator = "Page"

    page_info.template = os.path.relpath(os.path.join(basepath, fname),
                                         app_path)

    if page_info.basename == 'index':
        page_info.basename = ""

    # get route from template name
    page_info.route = page_info.template.replace(start, '').strip('/')
    if os.path.basename(page_info.route) in ('index.html', 'index.md'):
        page_info.route = os.path.dirname(page_info.route)

    # remove the extension
    if page_info.route.endswith('.md') or page_info.route.endswith('.html'):
        page_info.route = page_info.route.rsplit('.', 1)[0]

    page_info.name = page_info.page_name = page_info.route
    # controller
    page_info.controller_path = os.path.join(
        basepath,
        page_name.replace("-", "_") + ".py")

    if os.path.exists(page_info.controller_path):
        controller = app + "." + os.path.relpath(
            page_info.controller_path, app_path).replace(os.path.sep, ".")[:-3]

        page_info.controller = controller

    # get the source
    setup_source(page_info)

    # extract properties from HTML comments
    load_properties(page_info)

    # if not page_info.title:
    # 	print('no-title-for', page_info.route)

    return page_info
Exemplo n.º 19
0
def import_drug():
    dataent.flags.in_import = True
    data = json.loads(
        open(dataent.get_app_path('epaas', 'demo', 'data',
                                  'drug_list.json')).read())
    for d in data:
        doc = dataent.new_doc("Item")
        doc.update(d)
        doc.insert()
    dataent.flags.in_import = False
Exemplo n.º 20
0
def get_kernel():
	global kernel
	if not kernel:
		kernel = aiml.Kernel()
		for basepath, folders, files in os.walk(dataent.get_app_path('vidya', 'aiml')):
			for filename in files:
				if filename.endswith('.aiml'):
					print 'learning {0}'.format(os.path.join(basepath, filename))
					kernel.learn(os.path.join(basepath, filename))
	return kernel
Exemplo n.º 21
0
	def load_templates(self):
		if not self.custom:
			module = load_doctype_module(self.name)
			app = module.__name__.split(".")[0]
			templates = {}
			if hasattr(module, "form_grid_templates"):
				for key, path in iteritems(module.form_grid_templates):
					templates[key] = get_html_format(dataent.get_app_path(app, path))

				self.set("__form_grid_templates", templates)
Exemplo n.º 22
0
def main(app=None, module=None, doctype=None, verbose=False, tests=(),
	force=False, profile=False, junit_xml_output=None, ui_tests=False,
	doctype_list_path=None, skip_test_records=False, failfast=False):
	global unittest_runner

	if doctype_list_path:
		app, doctype_list_path = doctype_list_path.split(os.path.sep, 1)
		with open(dataent.get_app_path(app, doctype_list_path), 'r') as f:
			doctype = f.read().strip().splitlines()

	xmloutput_fh = None
	if junit_xml_output:
		xmloutput_fh = open(junit_xml_output, 'w')
		unittest_runner = xmlrunner_wrapper(xmloutput_fh)
	else:
		unittest_runner = unittest.TextTestRunner

	try:
		dataent.flags.print_messages = verbose
		dataent.flags.in_test = True

		if not dataent.db:
			dataent.connect()

		# if not dataent.conf.get("db_name").startswith("test_"):
		# 	raise Exception, 'db_name must start with "test_"'

		# workaround! since there is no separate test db
		dataent.clear_cache()
		dataent.utils.scheduler.disable_scheduler()
		set_test_email_config()

		if not dataent.flags.skip_before_tests:
			if verbose:
				print('Running "before_tests" hooks')
			for fn in dataent.get_hooks("before_tests", app_name=app):
				dataent.get_attr(fn)()

		if doctype:
			ret = run_tests_for_doctype(doctype, verbose, tests, force, profile)
		elif module:
			ret = run_tests_for_module(module, verbose, tests, profile)
		else:
			ret = run_all_tests(app, verbose, profile, ui_tests, failfast=failfast)

		dataent.db.commit()

		# workaround! since there is no separate test db
		dataent.clear_cache()
		return ret

	finally:
		if xmloutput_fh:
			xmloutput_fh.flush()
			xmloutput_fh.close()
Exemplo n.º 23
0
def export_languages_json():
    '''Export list of all languages'''
    languages = dataent.db.get_all('Language',
                                   fields=['name', 'language_name'])
    languages = [{'name': d.language_name, 'code': d.name} for d in languages]

    languages.sort(key=lambda a: a['code'])

    with open(dataent.get_app_path('dataent', 'geo', 'languages.json'),
              'w') as f:
        f.write(dataent.as_json(languages))
Exemplo n.º 24
0
def watch(no_compress):
    """watch and rebuild if necessary"""
    setup()

    pacman = get_node_pacman()

    dataent_app_path = os.path.abspath(os.path.join(app_paths[0], '..'))
    check_yarn()
    dataent_app_path = dataent.get_app_path('dataent', '..')
    dataent.commands.popen('{pacman} run watch'.format(pacman=pacman),
                           cwd=dataent_app_path)
Exemplo n.º 25
0
def setup_item():
	items = json.loads(open(dataent.get_app_path('epaas', 'demo', 'data', 'item.json')).read())
	for i in items:
		item = dataent.new_doc('Item')
		item.update(i)
		if hasattr(item, 'item_defaults') and item.item_defaults[0].default_warehouse:
			item.item_defaults[0].company = data.get("Manufacturing").get('company_name')
			warehouse = dataent.get_all('Warehouse', filters={'warehouse_name': item.item_defaults[0].default_warehouse}, limit=1)
			if warehouse:
				item.item_defaults[0].default_warehouse = warehouse[0].name
		item.insert()
Exemplo n.º 26
0
def export_fixtures():
    """Export fixtures as JSON to `[app]/fixtures`"""
    for app in dataent.get_installed_apps():
        for fixture in dataent.get_hooks("fixtures", app_name=app):
            filters = None
            or_filters = None
            if isinstance(fixture, dict):
                filters = fixture.get("filters")
                or_filters = fixture.get("or_filters")
                fixture = fixture.get("doctype") or fixture.get("dt")
            print("Exporting {0} app {1} filters {2}".format(
                fixture, app, (filters if filters else or_filters)))
            if not os.path.exists(dataent.get_app_path(app, "fixtures")):
                os.mkdir(dataent.get_app_path(app, "fixtures"))

            export_json(fixture,
                        dataent.get_app_path(app, "fixtures",
                                             dataent.scrub(fixture) + ".json"),
                        filters=filters,
                        or_filters=or_filters)
Exemplo n.º 27
0
def setup_account():
	dataent.flags.in_import = True
	data = json.loads(open(dataent.get_app_path('epaas', 'demo', 'data',
		'account.json')).read())
	for d in data:
		doc = dataent.new_doc('Account')
		doc.update(d)
		doc.parent_account = dataent.db.get_value('Account', {'account_name': doc.parent_account})
		doc.insert()

	dataent.flags.in_import = False
Exemplo n.º 28
0
	def setUp(self):
		dataent.set_user("Administrator")

		# use the fixture data
		import_doc(path=dataent.get_app_path("epaas", "epaas_integrations/doctype/shopify_settings/test_data/custom_field.json"),
			ignore_links=True, overwrite=True)

		dataent.reload_doctype("Customer")
		dataent.reload_doctype("Sales Order")
		dataent.reload_doctype("Delivery Note")
		dataent.reload_doctype("Sales Invoice")

		self.setup_shopify()
Exemplo n.º 29
0
def sync_languages():
    '''Sync dataent/geo/languages.json with Language'''
    with open(dataent.get_app_path('dataent', 'geo', 'languages.json'),
              'r') as f:
        data = json.loads(f.read())

    for l in data:
        if not dataent.db.exists('Language', l['code']):
            dataent.get_doc({
                'doctype': 'Language',
                'language_code': l['code'],
                'language_name': l['name']
            }).insert()
Exemplo n.º 30
0
def is_static_file(path):
    if ('.' not in path):
        return False
    extn = path.rsplit('.', 1)[-1]
    if extn in ('html', 'md', 'js', 'xml', 'css', 'txt', 'py'):
        return False

    for app in dataent.get_installed_apps():
        file_path = dataent.get_app_path(app, 'www') + '/' + path
        if os.path.exists(file_path):
            dataent.flags.file_path = file_path
            return True

    return False