From 71f2f3a1b1efebfe4c99395d6c818ec3fc6d54ac Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 1 Mar 2013 18:24:50 +0530 Subject: [PATCH] completed Time Log / Time Log Batch --- core/doctype/profile/profile.txt | 4 +- public/js/legacy/widgets/form/form.js | 4 ++ public/js/wn/model/meta.js | 12 ++++ public/js/wn/model/model.js | 83 +++++++++++++++++++++++++-- public/js/wn/views/listview.js | 3 +- public/js/wn/views/reportview.js | 2 +- webnotes/__init__.py | 2 +- webnotes/client.py | 7 ++- webnotes/model/bean.py | 2 + webnotes/model/doctype.py | 1 + webnotes/utils/__init__.py | 8 ++- webnotes/widgets/reportview.py | 3 +- 12 files changed, 116 insertions(+), 15 deletions(-) diff --git a/core/doctype/profile/profile.txt b/core/doctype/profile/profile.txt index 921cb89f28..f4ca204eec 100644 --- a/core/doctype/profile/profile.txt +++ b/core/doctype/profile/profile.txt @@ -2,7 +2,7 @@ { "creation": "2013-02-14 17:37:36", "docstatus": 0, - "modified": "2013-02-26 10:45:10", + "modified": "2013-03-01 10:18:03", "modified_by": "Administrator", "owner": "Administrator" }, @@ -131,7 +131,7 @@ "fieldname": "language", "fieldtype": "Select", "label": "Language", - "options": "\n\u0627\u0644\u0639\u0631\u0628\u064a\u0629\nenglish\nespa\u00f1ol\nfran\u00e7ais\n\u0939\u093f\u0902\u0926\u0940\nHrvatski\nnederlands\nportugu\u00eas\nportugu\u00eas brasileiro\n\u0441\u0440\u043f\u0441\u043a\u0438\n\u0ba4\u0bae\u0bbf\u0bb4\u0bcd\n\u0e44\u0e17\u0e22" + "options": "\n\u0627\u0644\u0639\u0631\u0628\u064a\u0629\nDeutsch\nenglish\nespa\u00f1ol\nfran\u00e7ais\n\u0939\u093f\u0902\u0926\u0940\nHrvatski\nnederlands\nportugu\u00eas\nportugu\u00eas brasileiro\n\u0441\u0440\u043f\u0441\u043a\u0438\n\u0ba4\u0bae\u0bbf\u0bb4\u0bcd\n\u0e44\u0e17\u0e22" }, { "doctype": "DocField", diff --git a/public/js/legacy/widgets/form/form.js b/public/js/legacy/widgets/form/form.js index b579ef7c3a..a27f9e57a9 100644 --- a/public/js/legacy/widgets/form/form.js +++ b/public/js/legacy/widgets/form/form.js @@ -652,6 +652,10 @@ _f.Frm.prototype.cleanup_refresh = function() { var fn = me.meta.autoname.substr(6); cur_frm.toggle_display(fn, false); } + + if(me.meta.autoname=="naming_series:" && !me.doc.__islocal) { + cur_frm.toggle_display("naming_series", false); + } } // Resolve "depends_on" and show / hide accordingly diff --git a/public/js/wn/model/meta.js b/public/js/wn/model/meta.js index a7760d3f88..202a1e30df 100644 --- a/public/js/wn/model/meta.js +++ b/public/js/wn/model/meta.js @@ -64,6 +64,18 @@ $.extend(wn.meta, { } }, + has_field: function(dt, fn) { + return wn.meta.docfield_map[dt][fn]; + }, + + get_parentfield: function(parent_dt, child_dt) { + var df = wn.model.get("DocField", {parent:parent_dt, fieldtype:"Table", + options:child_dt}) + if(!df.length) + throw "parentfield not found for " + parent_dt + ", " + child_dt; + return df[0].fieldname; + }, + get_label: function(dt, fn, dn) { if(fn==="owner") { return "Owner"; diff --git a/public/js/wn/model/model.js b/public/js/wn/model/model.js index 60a26992a1..c64e5ec62f 100644 --- a/public/js/wn/model/model.js +++ b/public/js/wn/model/model.js @@ -21,6 +21,7 @@ // wn.provide('wn.model'); +wn.provide("wn.model.map_info"); $.extend(wn.model, { no_value_type: ['Section Break', 'Column Break', 'HTML', 'Table', @@ -75,6 +76,9 @@ $.extend(wn.model, { if(meta.__calendar_js) { eval(meta.__calendar_js); } + if(meta.__map_js) { + eval(meta.__map_js); + } callback(r); } }); @@ -228,23 +232,90 @@ $.extend(wn.model, { delete locals[doctype][name]; }, - copy_doc: function(dt, dn, from_amend) { + get_no_copy_list: function(doctype) { var no_copy_list = ['name','amended_from','amendment_date','cancel_reason']; + $.each(wn.model.get("DocField", {parent:doctype}), function(i, df) { + if(cint(df.no_copy)) no_copy_list.push(df.fieldname); + }) + return no_copy_list; + }, + + copy_doc: function(dt, dn, from_amend) { + var no_copy_list = wn.model.get_no_copy_list(dt); var newdoc = wn.model.get_new_doc(dt); for(var key in locals[dt][dn]) { - // dont copy name and blank fields - var df = wn.meta.get_docfield(dt, key); - + // dont copy name and blank fields if(key.substr(0,2)!='__' - && !in_list(no_copy_list, key) - && !(df && (!from_amend && cint(df.no_copy)==1))) { + && !in_list(no_copy_list, key)) { newdoc[key] = locals[dt][dn][key]; } } return newdoc; }, + // args: source (doclist), target (doctype), table_map, field_map, callback + map: function(args) { + wn.model.with_doctype(args.target, function() { + var map_info = wn.model.map_info[args.target] + if(map_info) + map_info = map_info[args.source[0].doctype]; + if(!map_info) { + map_info = { + table_map: {}, + field_map: {} + } + } + + // main + var target = wn.model.map_doc(args.source[0], args.target, map_info.field_map[args.target]); + + // children + $.each(map_info.table_map, function(child_target, child_source) { + $.each($.map(args.source, function(d) + { if(d.doctype==child_source) return d; else return null; }), function(i, d) { + var child = wn.model.map_doc(d, child_target, map_info.field_map[child_target]); + $.extend(child, { + parent: target.name, + parenttype: target.doctype, + parentfield: wn.meta.get_parentfield(target.doctype, child.doctype), + idx: i+1 + }); + }); + }); + + if(args.callback) { + args.callback(target); + } else { + wn.set_route("Form", target.doctype, target.name); + } + }); + }, + + // map a single doc to a new doc of given DocType and field_map + map_doc: function(source, doctype, field_map) { + var new_doc = wn.model.get_new_doc(doctype); + var no_copy_list = wn.model.get_no_copy_list(doctype); + if(!field_map) field_map = {}; + delete no_copy_list[no_copy_list.indexOf("name")]; + + for(fieldname in wn.meta.docfield_map[doctype]) { + var df = wn.meta.docfield_map[doctype][fieldname]; + if(!df.no_copy) { + var source_key = field_map[df.fieldname] || df.fieldname; + if(source_key.substr(0,1)=="=") { + var value = source_key.substr(1); + } else { + var value = source[source_key]; + } + if(value!==undefined) { + new_doc[df.fieldname] = value; + } + } + } + return new_doc; + }, + delete_doc: function(doctype, docname, callback) { wn.confirm("Permanently delete "+ docname + "?", function() { wn.call({ diff --git a/public/js/wn/views/listview.js b/public/js/wn/views/listview.js index 6512f1b012..af4b9c3b12 100644 --- a/public/js/wn/views/listview.js +++ b/public/js/wn/views/listview.js @@ -57,7 +57,8 @@ wn.views.ListView = Class.extend({ // additional fields if(this.settings.add_fields) { $.each(this.settings.add_fields, function(i, d) { - me.fields.push(d); + if(me.fields.indexOf(d)==-1) + me.fields.push(d); }); } }, diff --git a/public/js/wn/views/reportview.js b/public/js/wn/views/reportview.js index cb872b436b..71caf4a49f 100644 --- a/public/js/wn/views/reportview.js +++ b/public/js/wn/views/reportview.js @@ -369,7 +369,7 @@ wn.views.ReportView = wn.ui.Listing.extend({ sort_by: me.sort_by_select.val(), sort_order: me.sort_order_select.val(), sort_by_next: me.sort_by_next_select.val(), - sort_order_next: me.sort_order_next_select.val() + sort_order_next: me.sort_order_next_select.val() }) }, callback: function(r) { diff --git a/webnotes/__init__.py b/webnotes/__init__.py index 17d470f2bd..bbb89ec67c 100644 --- a/webnotes/__init__.py +++ b/webnotes/__init__.py @@ -286,7 +286,7 @@ def generate_hash(): import hashlib, time return hashlib.sha224(str(time.time())).hexdigest() -def get_obj(dt = None, dn = None, doc=None, doclist=[], with_children = 0): +def get_obj(dt = None, dn = None, doc=None, doclist=[], with_children = True): from webnotes.model.code import get_obj return get_obj(dt, dn, doc, doclist, with_children) diff --git a/webnotes/client.py b/webnotes/client.py index dfef660a2f..25ac4440b0 100644 --- a/webnotes/client.py +++ b/webnotes/client.py @@ -33,10 +33,13 @@ def get(doctype, name=None, filters=None): return [d.fields for d in webnotes.bean(doctype, name).doclist] @webnotes.whitelist() -def get_value(doctype, fieldname, filters=None): +def get_value(doctype, fieldname, filters=None, as_dict=True): + if not webnotes.has_permission(doctype): + webnotes.msgprint("No Permission", raise_exception=True) + if fieldname and fieldname.startswith("["): fieldname = json.loads(fieldname) - return webnotes.conn.get_value(doctype, json.loads(filters), fieldname) + return webnotes.conn.get_value(doctype, json.loads(filters), fieldname, as_dict=as_dict) @webnotes.whitelist() def insert(doclist): diff --git a/webnotes/model/bean.py b/webnotes/model/bean.py index 9fd67c818d..975e936b01 100644 --- a/webnotes/model/bean.py +++ b/webnotes/model/bean.py @@ -278,6 +278,7 @@ class Bean: webnotes.msgprint("Only submitted can be cancelled", raise_exception=1) self.to_docstatus = 2 self.prepare_for_save(1) + self.run_method('before_cancel') self.save_main() self.save_children() self.run_method('on_cancel') @@ -292,6 +293,7 @@ class Bean: if self.ignore_permissions or webnotes.has_permission(self.doc.doctype, "write", self.doc): self.to_docstatus = 1 self.prepare_for_save(1) + self.run_method('before_update_after_submit') self.save_main() self.save_children() self.run_method('on_update_after_submit') diff --git a/webnotes/model/doctype.py b/webnotes/model/doctype.py index 33daa34b98..e317868ae7 100644 --- a/webnotes/model/doctype.py +++ b/webnotes/model/doctype.py @@ -276,6 +276,7 @@ def add_code(doctype, doclist): _add_code(scrub(doc.name) + '.css', '__css') _add_code('%s_list.js' % scrub(doc.name), '__list_js') _add_code('%s_calendar.js' % scrub(doc.name), '__calendar_js') + _add_code('%s_map.js' % scrub(doc.name), '__map_js') add_embedded_js(doc) def add_embedded_js(doc): diff --git a/webnotes/utils/__init__.py b/webnotes/utils/__init__.py index 047d1a0d19..59bd58c9c9 100644 --- a/webnotes/utils/__init__.py +++ b/webnotes/utils/__init__.py @@ -182,9 +182,15 @@ def add_years(date, years): def date_diff(string_ed_date, string_st_date): return (getdate(string_ed_date) - getdate(string_st_date)).days + +def time_diff(string_ed_date, string_st_date): + return get_datetime(string_ed_date) - get_datetime(string_st_date) def time_diff_in_seconds(string_ed_date, string_st_date): - return (get_datetime(string_ed_date) - get_datetime(string_st_date)).seconds + return time_diff(string_ed_date, string_st_date).seconds + +def time_diff_in_hours(string_ed_date, string_st_date): + return round(float(time_diff(string_ed_date, string_st_date).seconds) / 3600, 6) def now_datetime(): from datetime import datetime diff --git a/webnotes/widgets/reportview.py b/webnotes/widgets/reportview.py index b656f2adb0..059d68fc71 100644 --- a/webnotes/widgets/reportview.py +++ b/webnotes/widgets/reportview.py @@ -255,7 +255,8 @@ def save_report(): d = Document('Report') d.report_name = data['name'] d.ref_doctype = data['doctype'] - + + d.report_type = "Report Builder" d.json = data['json'] webnotes.bean([d]).save() webnotes.msgprint("%s saved." % d.name)