diff --git a/.travis.yml b/.travis.yml index d236789029..4601f0eafb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ install: script: - cd ~/frappe-bench - bench use test_site - - bench reinstall + - bench reinstall --yes - bench build - bench start & - sleep 10 diff --git a/frappe/__init__.py b/frappe/__init__.py index 601eee795e..26058ce943 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -13,7 +13,7 @@ import os, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template -__version__ = "7.0.0" +__version__ = "7.0.1" local = Local() diff --git a/frappe/client.py b/frappe/client.py index 54dce106bf..142aeb2d8a 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -154,6 +154,12 @@ def has_permission(doctype, docname, perm_type="read"): # perm_type can be one of read, write, create, submit, cancel, report return {"has_permission": frappe.has_permission(doctype, perm_type.lower(), docname)} +@frappe.whitelist() +def get_password(doctype, name, fieldname): + frappe.only_for("System Manager") + return frappe.get_doc(doctype, name).get_password(fieldname) + + @frappe.whitelist() def get_js(items): items = json.loads(items) diff --git a/frappe/commands/site.py b/frappe/commands/site.py index 111696980f..a961872192 100755 --- a/frappe/commands/site.py +++ b/frappe/commands/site.py @@ -100,15 +100,22 @@ def restore(context, sql_file_path, mariadb_root_username=None, mariadb_root_pas # Extract public and/or private files to the restored site, if user has given the path if with_public_files: - extract_tar_files(site, with_public_files, 'public') + public = extract_tar_files(site, with_public_files, 'public') + os.remove(public) if with_private_files: - extract_tar_files(site, with_private_files, 'private') + private = extract_tar_files(site, with_private_files, 'private') + os.remove(private) @click.command('reinstall') +@click.option('--yes', is_flag=True, default=False, help='Pass --yes to skip confirmation') @pass_context -def reinstall(context): +def reinstall(context, yes=False): "Reinstall site ie. wipe all data and start over" + + if not yes: + click.confirm('This will wipe your database. Are you sure you want to reinstall?', abort=True) + site = get_site(context) try: frappe.init(site=site) @@ -178,7 +185,7 @@ def disable_user(context, email): user = frappe.get_doc("User", email) user.enabled = 0 user.save(ignore_permissions=True) - frappe.db.commit() + frappe.db.commit() @click.command('migrate') diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index 415ba5ab5e..9dc75f06d9 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -76,7 +76,7 @@ class File(NestedSet): """Set folder size if folder""" if self.is_folder and not self.is_new(): self.file_size = self.get_folder_size() - frappe.db.set_value("File", self.name, "file_size", self.file_size) + self.db_set('file_size', self.file_size) for folder in self.get_ancestors(): frappe.db.set_value("File", folder, "file_size", self.get_folder_size(folder)) @@ -93,7 +93,7 @@ class File(NestedSet): def update_parent_folder_size(self): """Update size of parent folder""" if self.folder and not self.is_folder: # it not home - frappe.get_doc("File", self.folder).save(ignore_permissions=True) + frappe.get_doc("File", self.folder).set_folder_size() def set_folder_name(self): """Make parent folders if not exists based on reference doctype and name""" diff --git a/frappe/installer.py b/frappe/installer.py index fe1500313c..68bffabfb4 100755 --- a/frappe/installer.py +++ b/frappe/installer.py @@ -345,42 +345,36 @@ def check_if_ready_for_barracuda(): # raise Exception, "MariaDB needs to be configured!" def extract_sql_gzip(sql_gz_path): - success = -1 try: - subprocess.check_output(['gzip', '-d', '-v', '-f', sql_gz_path]) - except Exception as subprocess.CalledProcessError: - print subprocess.CalledProcessError.output - finally: - # subprocess.check_call returns '0' on success. On success, return path to sql file - return sql_gz_path[:-3] + success = subprocess.check_output(['gzip', '-d', '-v', '-f', sql_gz_path]) + except: + raise + + path = sql_gz_path[:-3] if success else None + + return path def extract_tar_files(site_name, file_path, folder_name): # Need to do frappe.init to maintain the site locals frappe.init(site=site_name) abs_site_path = os.path.abspath(frappe.get_site_path()) - # While creating tar files during backup, a complete recursive structure is created. - # For example, ///*.* - # Shift to parent directory and make it as current directory and do the extraction. - _parent_dir = os.path.dirname(abs_site_path) - os.chdir(_parent_dir) - # Copy the files to the parent directory and extract - shutil.copy2(os.path.abspath(file_path), _parent_dir) + shutil.copy2(os.path.abspath(file_path), abs_site_path) # Get the file name splitting the file path on - filename = file_path.split('/')[-1] - filepath = os.path.join(_parent_dir, filename) + tar_name = os.path.split(file_path)[1] + tar_path = os.path.join(abs_site_path, tar_name) try: - error = subprocess.check_output(['tar', 'xvf', filepath]) - except Exception as subprocess.CalledProcessError: - print subprocess.CalledProcessError.output + subprocess.check_output(['tar', 'xvf', tar_path, '--strip', '2'], cwd=abs_site_path) + except: + raise finally: - # On successful extraction delete the tarfile to avoid any abuse through command line - os.remove(filepath) frappe.destroy() + return tar_path + expected_config_for_barracuda = """[mysqld] innodb-file-format=barracuda innodb-file-per-table=1 diff --git a/frappe/public/js/frappe/form/grid.js b/frappe/public/js/frappe/form/grid.js index 3aa05bac9d..d31b971d21 100644 --- a/frappe/public/js/frappe/form/grid.js +++ b/frappe/public/js/frappe/form/grid.js @@ -718,7 +718,7 @@ frappe.ui.form.GridRow = Class.extend({ var me = this; // show static for field based on // whether grid is editable - if(this.grid.is_editable() && this.doc && show !== false) { + if(this.grid.allow_on_grid_editing() && this.grid.is_editable() && this.doc && show !== false) { // disable other editale row if(frappe.ui.form.editable_row diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py index 917197a56a..cd33f7ecf8 100644 --- a/frappe/utils/__init__.py +++ b/frappe/utils/__init__.py @@ -127,7 +127,12 @@ def has_gravatar(email): # since querying gravatar for every item will be slow return '' - gravatar_url = "https://secure.gravatar.com/avatar/{hash}?d=404&s=200".format(hash=md5.md5(email).hexdigest()) + if not isinstance(email, unicode): + email = unicode(email, 'utf-8') + + hexdigest = md5.md5(email).hexdigest() + + gravatar_url = "https://secure.gravatar.com/avatar/{hash}?d=404&s=200".format(hash=hexdigest) try: res = requests.get(gravatar_url) if res.status_code==200: @@ -514,6 +519,7 @@ def get_site_info(): 'language': system_settings.language or 'english', 'time_zone': system_settings.time_zone, 'setup_complete': cint(system_settings.setup_complete), + 'scheduler_enabled': system_settings.enable_scheduler, # usage 'emails_sent': get_emails_sent_this_month(),