diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index 619a324d04..d849b3cdac 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -264,8 +264,14 @@ class User(Document):
link = self.reset_password()
- self.send_login_mail(_("Verify Your Account"), "templates/emails/new_user.html",
- {"link": link, "site_url": get_url()})
+ app_title = [t for t in frappe.get_hooks('app_title') if t != 'Frappe Framework']
+ subject = _("Welcome to {0}").format(app_title[0])
+
+ self.send_login_mail(subject, "templates/emails/new_user.html",
+ dict(
+ link=link,
+ site_url=get_url(),
+ ))
def send_login_mail(self, subject, template, add_args, now=None):
diff --git a/frappe/desk/search.py b/frappe/desk/search.py
index 8dad0ba59b..ee88510176 100644
--- a/frappe/desk/search.py
+++ b/frappe/desk/search.py
@@ -106,7 +106,7 @@ def get_std_fields_list(meta, key):
def build_for_autosuggest(res):
results = []
for r in res:
- out = {"value": r[0], "description": ", ".join(unique(cstr(d) for d in r)[1:])}
+ out = {"value": r[0], "description": ", ".join(unique(cstr(d) for d in r if d)[1:])}
results.append(out)
return results
diff --git a/frappe/public/css/common.css b/frappe/public/css/common.css
index 7a3808c605..e010c95d8e 100644
--- a/frappe/public/css/common.css
+++ b/frappe/public/css/common.css
@@ -111,9 +111,6 @@ a.badge-hover:focus .badge,
a.badge-hover:active .badge {
background-color: #D8DFE5;
}
-.msgprint {
- margin: 15px 0px;
-}
.msgprint pre {
text-align: left;
}
diff --git a/frappe/public/css/desk.css b/frappe/public/css/desk.css
index 84ac24c0b0..9412885f3a 100644
--- a/frappe/public/css/desk.css
+++ b/frappe/public/css/desk.css
@@ -111,9 +111,6 @@ a.badge-hover:focus .badge,
a.badge-hover:active .badge {
background-color: #D8DFE5;
}
-.msgprint {
- margin: 15px 0px;
-}
.msgprint pre {
text-align: left;
}
@@ -499,6 +496,7 @@ fieldset[disabled] .form-control {
color: #fff;
border-radius: 10px;
cursor: pointer;
+ margin-right: 10px;
}
/* on small screens, show only icons on top */
@media (max-width: 767px) {
diff --git a/frappe/public/css/form_grid.css b/frappe/public/css/form_grid.css
index b0614d1205..58de6044d3 100644
--- a/frappe/public/css/form_grid.css
+++ b/frappe/public/css/form_grid.css
@@ -3,6 +3,9 @@
border: 1px solid #d1d8dd;
border-radius: 3px;
}
+.form-grid.error {
+ border-color: #ff5858;
+}
.grid-heading-row {
border-bottom: 1px solid #d1d8dd;
background-color: #F7FAFC;
@@ -52,7 +55,13 @@
padding: 10px 15px;
max-height: 200px;
border-right: 1px solid #d1d8dd;
- margin-bottom: -1px;
+}
+.grid-static-col.bold {
+ font-weight: bold;
+ background-color: #fffdf4;
+}
+.validated-form .grid-static-col.error {
+ background-color: #FFDCDC;
}
.grid-static-col input[type="checkbox"] {
margin-left: -16px !important;
diff --git a/frappe/public/css/website.css b/frappe/public/css/website.css
index e0b4e05115..5d40ad163b 100644
--- a/frappe/public/css/website.css
+++ b/frappe/public/css/website.css
@@ -111,9 +111,6 @@ a.badge-hover:focus .badge,
a.badge-hover:active .badge {
background-color: #D8DFE5;
}
-.msgprint {
- margin: 15px 0px;
-}
.msgprint pre {
text-align: left;
}
diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js
index 0a7e8c647f..ca41feb0d6 100644
--- a/frappe/public/js/frappe/form/control.js
+++ b/frappe/public/js/frappe/form/control.js
@@ -391,10 +391,10 @@ frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({
},
set_bold: function() {
if(this.$input) {
- this.$input.toggleClass("bold", !!this.df.bold);
+ this.$input.toggleClass("bold", !!(this.df.bold || this.df.reqd));
}
if(this.disp_area) {
- $(this.disp_area).toggleClass("bold", !!this.df.bold);
+ $(this.disp_area).toggleClass("bold", !!(this.df.bold || this.df.reqd));
}
}
});
diff --git a/frappe/public/js/frappe/form/grid.js b/frappe/public/js/frappe/form/grid.js
index 58e122bf62..503b3b7b6c 100644
--- a/frappe/public/js/frappe/form/grid.js
+++ b/frappe/public/js/frappe/form/grid.js
@@ -50,6 +50,8 @@ frappe.ui.form.Grid = Class.extend({
.appendTo(this.parent)
.attr("data-fieldname", this.df.fieldname);
+ this.form_grid = this.wrapper.find('.form-grid');
+
this.wrapper.find(".grid-add-row").click(function() {
me.add_new_row(null, null, true);
me.set_focus_on_row();
@@ -178,6 +180,9 @@ frappe.ui.form.Grid = Class.extend({
frappe.utils.scroll_to(_scroll_y);
}
+ // red if mandatory
+ this.form_grid.toggleClass('error', !!(this.df.reqd && !(data && data.length)));
+
this.refresh_remove_rows_button();
},
setup_toolbar: function() {
@@ -783,6 +788,15 @@ frappe.ui.form.GridRow = Class.extend({
this.refresh_field(df.fieldname, txt);
}
+ // background color for cellz
+ if(this.doc) {
+ if(df.reqd && !txt) {
+ column.addClass('error');
+ }
+ if (df.reqd || df.bold) {
+ column.addClass('bold');
+ }
+ }
}
},
@@ -1028,8 +1042,9 @@ frappe.ui.form.GridRow = Class.extend({
}
},
refresh_field: function(fieldname, txt) {
+ var df = this.grid.get_docfield(fieldname);
if(txt===undefined) {
- var txt = frappe.format(this.doc[fieldname], this.grid.get_docfield(fieldname),
+ var txt = frappe.format(this.doc[fieldname], df,
null, this.frm.doc);
}
@@ -1037,6 +1052,9 @@ frappe.ui.form.GridRow = Class.extend({
var column = this.columns[fieldname];
if(column) {
column.static_area.html(txt || "");
+ if(df.reqd) {
+ column.toggleClass('error', !!(txt===null || txt===''));
+ }
}
// reset field value
diff --git a/frappe/public/js/frappe/form/save.js b/frappe/public/js/frappe/form/save.js
index 65e708067a..5be3ffbc4e 100644
--- a/frappe/public/js/frappe/form/save.js
+++ b/frappe/public/js/frappe/form/save.js
@@ -19,6 +19,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) {
var save = function() {
check_name(function() {
+ $(frm.wrapper).addClass('validated-form');
if(check_mandatory()) {
_call({
method: "frappe.desk.form.save.savedocs",
@@ -132,10 +133,21 @@ frappe.ui.form.save = function(frm, action, callback, btn) {
}
});
- if(error_fields.length)
- msgprint(__('Mandatory fields required in {0}', [(doc.parenttype
- ? (__(frappe.meta.docfield_map[doc.parenttype][doc.parentfield].label) + ' ('+ __("Table") + ')')
- : __(doc.doctype))]) + '
{{_("Dear")}} {{ first_name }}{% if last_name %} {{ last_name}}{% endif %},
{{_("A new account has been created for you at {0}").format(site_url)}}.
{{_("Your login id is")}}: {{ user }}
{{_("Click on the link below to complete your registration and set a new password")}}.
-{{_("Complete Registration")}}
+ ++ {{ _("Complete Registration") }} +
+ +{% if user_fullname != "Administrator" %}{{_("Thank you")}},
{{ user_fullname }}
{{_("You can also copy-paste this link in your browser")}} {{ link }}
diff --git a/frappe/utils/user.py b/frappe/utils/user.py index 87426f5e9c..3e4b6515d7 100755 --- a/frappe/utils/user.py +++ b/frappe/utils/user.py @@ -265,6 +265,7 @@ def add_system_manager(email, first_name=None, last_name=None, send_welcome_emai "user_type": "System User", "send_welcome_email": 1 if send_welcome_email else 0 }) + user.insert() # add roles