Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/frappe/frappe into pg-poc
Browse files Browse the repository at this point in the history
  • Loading branch information
surajshetty3416 committed Sep 10, 2018
2 parents 147b111 + 1a2993e commit 31df1cb
Show file tree
Hide file tree
Showing 85 changed files with 3,289 additions and 3,100 deletions.
12 changes: 9 additions & 3 deletions .travis.yml
Expand Up @@ -20,6 +20,8 @@ install:
- sudo apt-get purge -y mysql-common mysql-server mysql-client
- nvm install v8.10.0

- pip install python-coveralls

- wget https://raw.githubusercontent.com/frappe/bench/master/playbooks/install.py

- sudo python install.py --develop --user travis --without-bench-setup
Expand Down Expand Up @@ -47,7 +49,9 @@ jobs:
- bench --site test_site setup-help
- bench setup-global-help --root_password travis
- bench --site test_site scheduler disable
- bench --site test_site run-tests
- bench --site test_site run-tests --coverage
after_script:
- coveralls -b apps/frappe -d ../../sites/.coverage
env: MariaDB
- # stage
script:
Expand All @@ -57,5 +61,7 @@ jobs:
- bench --site test_site_postgres setup-help
- bench setup-global-help --db_type=postgres --root_password travis
- bench --site test_site_postgres scheduler disable
- bench --site test_site_postgres run-tests
env: Postgres
- bench --site test_site_postgres run-tests --coverage
after_script:
- coveralls -b apps/frappe -d ../../sites/.coverage
env: Postgres
2 changes: 1 addition & 1 deletion frappe/__init__.py
Expand Up @@ -589,7 +589,7 @@ def has_website_permission(doc=None, ptype='read', user=None, verbose=False, doc

# check permission in controller
if hasattr(doc, 'has_website_permission'):
return doc.has_website_permission(doc, ptype, user, verbose=verbose)
return doc.has_website_permission(ptype, user, verbose=verbose)

hooks = (get_hooks("has_website_permission") or {}).get(doctype, [])
if hooks:
Expand Down
17 changes: 15 additions & 2 deletions frappe/commands/utils.py
Expand Up @@ -6,8 +6,9 @@
from distutils.spawn import find_executable
import frappe
from frappe.commands import pass_context, get_site
from frappe.utils import update_progress_bar
from frappe.utils import update_progress_bar, get_bench_path
from frappe.utils.response import json_handler
from coverage import Coverage

@click.command('build')
@click.option('--app', help='Build assets for app')
Expand Down Expand Up @@ -386,12 +387,13 @@ def console(context):
@click.option('--ui-tests', is_flag=True, default=False, help="Run UI Tests")
@click.option('--module', help="Run tests in a module")
@click.option('--profile', is_flag=True, default=False)
@click.option('--coverage', is_flag=True, default=False)
@click.option('--skip-test-records', is_flag=True, default=False, help="Don't create test records")
@click.option('--skip-before-tests', is_flag=True, default=False, help="Don't run before tests hook")
@click.option('--junit-xml-output', help="Destination file path for junit xml report")
@pass_context
def run_tests(context, app=None, module=None, doctype=None, test=(),
driver=None, profile=False, junit_xml_output=False, ui_tests = False,
driver=None, profile=False, coverage=False, junit_xml_output=False, ui_tests = False,
doctype_list_path=None, skip_test_records=False, skip_before_tests=False):
"Run tests"
import frappe.test_runner
Expand All @@ -403,9 +405,20 @@ def run_tests(context, app=None, module=None, doctype=None, test=(),
frappe.flags.skip_before_tests = skip_before_tests
frappe.flags.skip_test_records = skip_test_records

if coverage:
# Generate coverage report only for app that is being tested
source_path = os.path.join(get_bench_path(), 'apps', app or 'frappe', '*')
cov = Coverage(include=source_path, omit=['*.html', '*.js', '*.css'])
cov.start()

ret = frappe.test_runner.main(app, module, doctype, context.verbose, tests=tests,
force=context.force, profile=profile, junit_xml_output=junit_xml_output,
ui_tests = ui_tests, doctype_list_path = doctype_list_path)

if coverage:
cov.stop()
cov.save()

if len(ret.failures) == 0 and len(ret.errors) == 0:
ret = 0

Expand Down
3 changes: 1 addition & 2 deletions frappe/core/doctype/user/user.py
Expand Up @@ -97,8 +97,7 @@ def on_update(self):
if self.name not in ('Administrator', 'Guest') and not self.user_image:
frappe.enqueue('frappe.core.doctype.user.user.update_gravatar', name=self.name)


def has_website_permission(self, ptype, verbose=False):
def has_website_permission(self, ptype, user, verbose=False):
"""Returns true if current user is the session user"""
return self.name == frappe.session.user

Expand Down
8 changes: 7 additions & 1 deletion frappe/desk/doctype/todo/todo.py
Expand Up @@ -16,8 +16,14 @@ class ToDo(Document):
def validate(self):
self._assignment = None
if self.is_new():

if self.assigned_by == self.owner:
assignment_message = frappe._("{0} self assigned this task: {1}").format(get_fullname(self.assigned_by), self.description)
else:
assignment_message = frappe._("{0} assigned {1}: {2}").format(get_fullname(self.assigned_by), get_fullname(self.owner), self.description)

self._assignment = {
"text": frappe._("{0} assigned {1}: {2}").format(get_fullname(self.assigned_by), get_fullname(self.owner), self.description),
"text": assignment_message,
"comment_type": "Assigned"
}

Expand Down
28 changes: 27 additions & 1 deletion frappe/desk/form/assign_to.py
Expand Up @@ -170,4 +170,30 @@ def notify_assignment(assigned_by, owner, doc_type, doc_name, action='CLOSE',
'notify': notify
}

arg["parenttype"] = "Assignment"
if arg and arg.get("notify"):
_notify(arg)

def _notify(args):
from frappe.utils import get_fullname, get_url

args = frappe._dict(args)
contact = args.contact
txt = args.txt

try:
if not isinstance(contact, list):
contact = [frappe.db.get_value("User", contact, "email") or contact]

frappe.sendmail(\
recipients=contact,
sender= frappe.db.get_value("User", frappe.session.user, "email"),
subject=_("New message from {0}").format(get_fullname(frappe.session.user)),
template="new_message",
args={
"from": get_fullname(frappe.session.user),
"message": txt,
"link": get_url()
},
header=[_('New Message'), 'orange'])
except frappe.OutgoingEmailError:
pass
2 changes: 0 additions & 2 deletions frappe/frappeclient.py
Expand Up @@ -282,8 +282,6 @@ def preprocess(self, params):
return params

def post_process(self, response):
response.raise_for_status()

try:
rjson = response.json()
except ValueError:
Expand Down
4 changes: 1 addition & 3 deletions frappe/public/build.json
Expand Up @@ -91,7 +91,6 @@
"public/js/frappe/ui/dialog.js"
],
"css/desk.min.css": [
"public/js/lib/datepicker/datepicker.min.css",
"public/js/lib/summernote/summernote.css",
"public/js/lib/leaflet/leaflet.css",
"public/js/lib/leaflet/leaflet.draw.css",
Expand Down Expand Up @@ -360,8 +359,7 @@
"css/web_form.css": [
"public/less/list.less",
"website/css/web_form.css",
"public/js/lib/summernote/summernote.css",
"public/js/lib/datepicker/datepicker.min.css"
"public/js/lib/summernote/summernote.css"
],
"js/print_format_v3.min.js": [
"public/js/legacy/layout.js",
Expand Down
38 changes: 35 additions & 3 deletions frappe/public/js/frappe/form/dashboard.js
Expand Up @@ -85,11 +85,43 @@ frappe.ui.form.Dashboard = Class.extend({
title="%(title)s"></div>', opts)).appendTo(progress);
});

if(message) {
$('<p class="text-muted small">' + message + '</p>').appendTo(this.progress_area);
}
if (!message) message = '';
$(`<p class="progress-message text-muted small">${message}</p>`).appendTo(progress_chart);

this.show();

return progress_chart;
},

show_progress: function(title, percent, message) {
this._progress_map = this._progress_map || {};
if (!this._progress_map[title]) {
const progress_chart = this.add_progress(title, percent, message);
this._progress_map[title] = progress_chart;
}
let progress_chart = this._progress_map[title];
if (!$.isArray(percent)) {
percent = this.format_percent(title, percent);
}
progress_chart.find('.progress-bar').each((i, progress_bar) => {
const { progress_class, width } = percent[i];
$(progress_bar).css('width', width)
.removeClass('progress-bar-danger progress-bar-success')
.addClass(progress_class);
});

if (!message) message = '';
progress_chart.find('.progress-message').text(message);
},

hide_progress: function(title) {
if (title){
this._progress_map[title].remove();
delete this._progress_map[title];
} else {
this._progress_map = {};
this.progress_area.empty();
}
},

format_percent: function(title, percent) {
Expand Down
2 changes: 1 addition & 1 deletion frappe/public/js/frappe/form/footer/timeline.js
Expand Up @@ -677,7 +677,7 @@ frappe.ui.form.Timeline = Class.extend({
var valid_users = Object.keys(frappe.boot.user_info)
.filter(user => !["Administrator", "Guest"].includes(user));

return valid_users.map(user => frappe.boot.user_info[user].email);
return valid_users.map(user => frappe.boot.user_info[user].name);
},

setup_comment_like: function() {
Expand Down
15 changes: 7 additions & 8 deletions frappe/public/js/frappe/list/list_view.js
Expand Up @@ -334,9 +334,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
}

render_count() {
this.get_count_html()
.then(html => {
this.$result.find('.list-count').html(html);
this.get_count_str()
.then(str => {
this.$result.find('.list-count').html(`<span>${str}</span>`);
});
}

Expand Down Expand Up @@ -570,7 +570,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
return html;
}

get_count_html() {
get_count_str() {
const current_count = this.data.length;

return frappe.call({
Expand All @@ -582,10 +582,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
fields: [`count(${frappe.model.get_full_column_name('name', this.doctype)}) as total_count`]
}
}).then(r => {
const count = r.message.values[0][0] || current_count;
const str = __('{0} of {1}', [current_count, count]);
const html = `<span>${str}</span>`;
return html;
this.total_count = r.message.values[0][0] || current_count;
const str = __('{0} of {1}', [current_count, this.total_count]);
return str;
});
}

Expand Down
3 changes: 3 additions & 0 deletions frappe/public/js/frappe/ui/filters/field_select.js
Expand Up @@ -130,6 +130,9 @@ frappe.ui.FieldSelect = Class.extend({
},

add_field_option(df) {
if (df.fieldname == 'docstatus' && !frappe.model.is_submittable(this.doctype))
return;

var me = this;
var label, table;
if(me.doctype && df.parent==me.doctype) {
Expand Down
9 changes: 2 additions & 7 deletions frappe/public/js/frappe/ui/filters/filter.js
Expand Up @@ -331,13 +331,8 @@ frappe.ui.filter_utils = {

if(condition.indexOf('like', 'not like')!==-1) {
// automatically append wildcards
if(val) {
if(val.slice(0,1) !== "%") {
val = "%" + val;
}
if(val.slice(-1) !== "%") {
val = val + "%";
}
if(val && !(val.startsWith('%') || val.endsWith('%'))) {
val = '%' + val + '%';
}
} else if(in_list(["in", "not in"], condition)) {
if(val) {
Expand Down
76 changes: 54 additions & 22 deletions frappe/public/js/frappe/views/reports/report_view.js
Expand Up @@ -80,6 +80,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {

render(force) {
if (this.data.length === 0) return;
this.render_count();

if (this.chart) {
this.refresh_charts();
Expand All @@ -91,6 +92,20 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
this.setup_datatable(this.data);
}

render_count() {
let $list_count = this.$paging_area.find('.list-count');
if (!$list_count.length) {
this.$paging_area.find('.btn-more').addClass('margin-left');
$list_count = $('<span>')
.addClass('text-muted text-medium list-count')
.prependTo(this.$paging_area.find('.level-right'));
}
this.get_count_str()
.then(str => {
$list_count.text(str);
});
}

on_update(data) {
if (this.doctype === data.doctype && data.name) {
// flash row when doc is updated by some other user
Expand Down Expand Up @@ -998,33 +1013,50 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
const args = this.get_args();
const selected_items = this.get_checked_items(true);

frappe.prompt({
fieldtype:"Select", label: __("Select File Type"), fieldname:"file_format_type",
options:"Excel\nCSV", default:"Excel", reqd: 1
},
(data) => {
args.cmd = 'frappe.desk.reportview.export_query';
args.file_format_type = data.file_format_type;
const d = new frappe.ui.Dialog({
title: __("Export Report: {0}",[__(this.doctype)]),
fields: [
{
fieldtype: 'Select',
label: __('Select File Type'),
fieldname:'file_format_type',
options: ['Excel', 'CSV'],
default: 'Excel'
},
{
fieldtype: 'Check',
fieldname: 'export_all_rows',
label: __('Export All {0} rows?', [(this.total_count + "").bold()])
}
],
primary_action_label: __('Download'),
primary_action: (data) => {
args.cmd = 'frappe.desk.reportview.export_query';
args.file_format_type = data.file_format_type;

if (args.file_format_type === 'CSV') {
frappe.tools.downloadify(this.data, null, this.doctype);
return;
}
if(this.add_totals_row) {
args.add_totals_row = 1;
}

if(this.add_totals_row) {
args.add_totals_row = 1;
}
if(selected_items.length > 0) {
args.selected_items = selected_items;
}

if(selected_items.length > 0) {
args.selected_items = selected_items;
}
if (!data.export_all_rows) {
args.start = 0;
args.page_length = this.data.length;
} else {
delete args.start;
delete args.page_length;
}

args.start = 0;
args.page_length = this.data.length;
open_url_post(frappe.request.url, args);

open_url_post(frappe.request.url, args);
},
__("Export Report: {0}",[__(this.doctype)]), __("Download"));
d.hide();
},
});

d.show();
}
});
}
Expand Down

0 comments on commit 31df1cb

Please sign in to comment.