diff --git a/css/legacy/body.css b/css/legacy/body.css index 8969701912..0f1b831708 100644 --- a/css/legacy/body.css +++ b/css/legacy/body.css @@ -141,8 +141,7 @@ div.std-footer-item { } .layout_wrapper { - padding: 13px; - margin: 7px; + padding: 15px; -moz-box-shadow: 1px 1px 6px #AAA; -webkit-box-shadow: 1px 1px 6px #AAA; box-shadow: 1px 1px 6px #AAA; diff --git a/css/legacy/default.css b/css/legacy/default.css index 888a144b16..5da88c30d6 100644 --- a/css/legacy/default.css +++ b/css/legacy/default.css @@ -145,8 +145,7 @@ div.std-footer-item { } .layout_wrapper { - padding: 13px; - margin: 7px; + padding: 15px; -moz-box-shadow: 1px 1px 6px #AAA; -webkit-box-shadow: 1px 1px 6px #AAA; box-shadow: 1px 1px 6px #AAA; diff --git a/js/legacy/app.js b/js/legacy/app.js index 0af2a16543..cb2aee02ab 100644 --- a/js/legacy/app.js +++ b/js/legacy/app.js @@ -4,6 +4,7 @@ var popup_cont; var session = {}; var start_sid = null; +if(!wn) var wn = {}; function startup() { @@ -15,6 +16,8 @@ function startup() { // Globals // --------------------------------- var setup_globals = function(r) { + wn.boot = r; + profile = r.profile; user = r.profile.name; user_fullname = profile.first_name + (r.profile.last_name ? (' ' + r.profile.last_name) : ''); @@ -35,6 +38,9 @@ function startup() { if(r.dt_labels) { for(key in r.dt_labels)session.rev_dt_labels[r.dt_labels[key]] = key; } + + // control panel + wn.control_panel = r.control_panel; } var setup_history = function(r) { @@ -192,17 +198,5 @@ window.onresize = function() { get_window_height = function() { var ht = window.innerHeight ? window.innerHeight : document.documentElement.offsetHeight ? document.documentElement.offsetHeight : document.body.offsetHeight; - var bannerh = page_body.banner_area ? page_body.banner_area.offsetHeight : 0 - var footerh = page_body.footer ? page_body.footer.offsetHeight : 0 - ht = ht - bannerh - footerh; return ht; } - -// setup space holder -setup_space_holder = function() { - // space holder div - window.space_holder_div = $a(null,'div','space_holder'); - window.space_holder_div.innerHTML = 'Loading...' -} - -startup_list.push(setup_space_holder); diff --git a/js/legacy/form.compressed.js b/js/legacy/form.compressed.js index e971f5a4e7..77f4079213 100644 --- a/js/legacy/form.compressed.js +++ b/js/legacy/form.compressed.js @@ -403,7 +403,7 @@ jslist=container.getElementsByTagName('script');}},show_letterhead:function(cont var finished=header +stat +container.innerHTML.replace(/
3) @@ -63,7 +63,7 @@ return"{"+l.join(',')+'}';} function ie_refresh(e){$dh(e);$ds(e);} function DocLink(p,doctype,name,onload){var a=$a(p,'span','link_type');a.innerHTML=a.dn=name;a.dt=doctype;a.onclick=function(){loaddoc(this.dt,this.dn,onload)};return a;} var doc_link=DocLink;var known_numbers={0:'zero',1:'one',2:'two',3:'three',4:'four',5:'five',6:'six',7:'seven',8:'eight',9:'nine',10:'ten',11:'eleven',12:'twelve',13:'thirteen',14:'fourteen',15:'fifteen',16:'sixteen',17:'seventeen',18:'eighteen',19:'nineteen',20:'twenty',30:'thirty',40:'forty',50:'fifty',60:'sixty',70:'seventy',80:'eighty',90:'ninety'} -function in_words(n){var is_million=locals['Control Panel']['Control Panel'].currency_format=='Millions'?1:0;n=cint(n) +function in_words(n){var is_million=wn.control_panel.currency_format=='Millions'?1:0;n=cint(n) if(known_numbers[n])return known_numbers[n];var bestguess=n+'';var remainder=0 if(n<=20) alert('Error while converting to words');else if(n<100){return in_words(Math.floor(n/10)*10)+'-'+in_words(n%10);}else if(n<1000){bestguess=in_words(Math.floor(n/100))+' '+'hundred';remainder=n%100;}else if(!is_million){if(n<100000){bestguess=in_words(Math.floor(n/1000))+' '+'thousand';remainder=n%1000;}else if(n<10000000){bestguess=in_words(Math.floor(n/100000))+' '+'lakh';remainder=n%100000;}else{bestguess=in_words(Math.floor(n/10000000))+' '+'crore' @@ -93,7 +93,7 @@ if(d.search('-')!=-1){var t=d.split('-');return new Date(t[0],t[1]-1,t[2],tm[0], new_dt=new Date(dt.getFullYear(),dt.getMonth()+months,dt.getDate()) if(new_dt.getDate()!=dt.getDate()){return dateutil.month_end(new Date(dt.getFullYear(),dt.getMonth()+months,1))} return dateutil.obj_to_str(new_dt);},month_start:function(){var d=new Date();return d.getFullYear()+'-'+int_to_str(d.getMonth()+1,2)+'-01';},month_end:function(d){if(!d)var d=new Date();var m=d.getMonth()+1;var y=d.getFullYear();last_date=month_last[m];if(m==2&&(y%4)==0&&((y%100)!=0||(y%400)==0)) -last_date=29;return y+'-'+int_to_str(m,2)+'-'+last_date;},get_user_fmt:function(){var t=locals['Control Panel']['Control Panel'].date_format;if(!t)t='dd-mm-yyyy';return t;},str_to_user:function(val,no_time_str){var user_fmt=dateutil.get_user_fmt();var time_str='';if(val==null||val=='')return null;if(val.search(':')!=-1){var tmp=val.split(' ');if(tmp[1]) +last_date=29;return y+'-'+int_to_str(m,2)+'-'+last_date;},get_user_fmt:function(){var t=wn.control_panel.date_format;if(!t)t='dd-mm-yyyy';return t;},str_to_user:function(val,no_time_str){var user_fmt=dateutil.get_user_fmt();var time_str='';if(val==null||val=='')return null;if(val.search(':')!=-1){var tmp=val.split(' ');if(tmp[1]) time_str=' '+tmp[1];var d=tmp[0];}else{var d=val;} if(no_time_str)time_str='';d=d.split('-');if(d.length==3){if(user_fmt=='dd-mm-yyyy') val=d[2]+'-'+d[1]+'-'+d[0]+time_str;else if(user_fmt=='dd/mm/yyyy') @@ -217,19 +217,16 @@ function get_scroll_top(){var st=0;if(document.documentElement&&document.documen st=document.documentElement.scrollTop;else if(document.body&&document.body.scrollTop) st=document.body.scrollTop;return st;} function get_cookie(c){var t=""+document.cookie;var ind=t.indexOf(c);if(ind==-1||c=="")return"";var ind1=t.indexOf(';',ind);if(ind1==-1)ind1=t.length;return unescape(t.substring(ind+c.length+1,ind1));} -add_space_holder=function(parent,cs){if(!cs)cs={margin:'170px 0px'} -$y(space_holder_div,cs);parent.appendChild(space_holder_div);} -remove_space_holder=function(){if(space_holder_div.parentNode) -space_holder_div.parentNode.removeChild(space_holder_div);};wn.urllib={get_arg:function(name){name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");var regexS="[\\?&]"+name+"=([^&#]*)";var regex=new RegExp(regexS);var results=regex.exec(window.location.href);if(results==null) +wn.urllib={get_arg:function(name){name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");var regexS="[\\?&]"+name+"=([^&#]*)";var regex=new RegExp(regexS);var results=regex.exec(window.location.href);if(results==null) return"";else return decodeURIComponent(results[1]);},get_dict:function(){var d={} var t=window.location.href.split('?')[1];if(!t)return d;if(t.indexOf('#')!=-1)t=t.split('#')[0];if(!t)return d;t=t.split('&');for(var i=0;i\ Recent\ \ - ');this.setup();this.bind_events();},bind_events:function(){rename_observers.push(this);},rename_notify:function(dt,old,name){this.remove(dt,old);this.add(dt,name,1);},add:function(dt,dn,on_top){this.remove(dt,dn);var html=repl('
  • \ +
  • ');this.setup();this.bind_events();},bind_events:function(){rename_observers.push(this);},rename_notify:function(dt,old,name){this.remove(dt,old);this.add(dt,name,1);},add:function(dt,dn,on_top){if(this.istable(dt))return;this.remove(dt,dn);var html=repl('
  • \ \ %(dt)s: %(dn)s\ -
  • ',{dt:dt,dn:dn});if(on_top){$('#toolbar-recent').prepend(html);}else{$('#toolbar-recent').append(html);}},remove:function(dt,dn){$(repl('#toolbar-recent li[data-docref="%(dt)s/%(dn)s"]',{dt:dt,dn:dn})).remove();},setup:function(){try{var rlist=JSON.parse(profile.recent);} + ',{dt:dt,dn:dn});if(on_top){$('#toolbar-recent').prepend(html);}else{$('#toolbar-recent').append(html);}},istable:function(dt){return locals.DocType[dt]&&locals.DocType[dt].istable||false;},remove:function(dt,dn){$(repl('#toolbar-recent li[data-docref="%(dt)s/%(dn)s"]',{dt:dt,dn:dn})).remove();},setup:function(){try{var rlist=JSON.parse(profile.recent);} catch(e){return;} var m=rlist.length;if(m>15)m=15;for(var i=0;i\ \ @@ -28,6 +30,9 @@ wn.ui.toolbar.RecentDocs = Class.extend({ $('#toolbar-recent').append(html); } }, + istable: function(dt) { + return locals.DocType[dt] && locals.DocType[dt].istable || false; + }, remove: function(dt, dn) { $(repl('#toolbar-recent li[data-docref="%(dt)s/%(dn)s"]', {dt:dt, dn:dn})).remove(); }, diff --git a/py/build/project.py b/py/build/project.py index a3c1ef1537..1591cfd7ca 100644 --- a/py/build/project.py +++ b/py/build/project.py @@ -76,5 +76,5 @@ class Project: for fname in wt[2]: if fname=='build.json': self.bundle.make(os.path.join(wt[0], fname)) - + self.render_templates() \ No newline at end of file diff --git a/py/core/doctype/control_panel/control_panel.txt b/py/core/doctype/control_panel/control_panel.txt index b943c64b44..a783ca7354 100644 --- a/py/core/doctype/control_panel/control_panel.txt +++ b/py/core/doctype/control_panel/control_panel.txt @@ -3,24 +3,24 @@ # These values are common in all dictionaries { - 'creation': '2009-05-12 11:19:11', + 'creation': '2012-01-24 12:47:42', 'docstatus': 0, - 'modified': '2011-02-12 17:04:27', + 'modified': '2012-01-24 12:50:01', 'modified_by': 'Administrator', 'owner': 'Administrator' }, # These values are common for all DocType { - '_last_update': '1307624201', + '_last_update': '1327389019', 'allow_copy': 0, 'allow_email': 0, 'allow_print': 0, 'colour': 'White:FFF', + 'default_print_format': 'Standard', 'doctype': 'DocType', 'hide_heading': 0, 'hide_toolbar': 0, - 'idx': 0, 'in_create': 1, 'issingle': 1, 'istable': 0, @@ -32,7 +32,7 @@ 'server_code_error': ' ', 'show_in_menu': 1, 'smallicon': 'controller.png', - 'version': 21 + 'version': 25 }, # These values are common for all DocField @@ -50,7 +50,6 @@ 'create': 1, 'doctype': 'DocPerm', 'execute': 0, - 'idx': 1, 'name': '__common__', 'parent': 'Control Panel', 'parentfield': 'permissions', @@ -77,7 +76,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 1, 'label': 'General', 'permlevel': 0 }, @@ -87,7 +85,6 @@ 'doctype': 'DocField', 'fieldname': 'date_format', 'fieldtype': 'Select', - 'idx': 2, 'label': 'Date Format', 'options': 'yyyy-mm-dd\ndd-mm-yyyy\ndd/mm/yyyy\nmm/dd/yyyy\nmm-dd-yyyy', 'permlevel': 0 @@ -98,7 +95,6 @@ 'doctype': 'DocField', 'fieldname': 'currency_format', 'fieldtype': 'Select', - 'idx': 3, 'label': 'Currency Format', 'options': 'Millions\nLacs', 'permlevel': 0 @@ -109,7 +105,6 @@ 'doctype': 'DocField', 'fieldname': 'password_expiry_days', 'fieldtype': 'Int', - 'idx': 4, 'label': 'Password Expires in (days)', 'permlevel': 0 }, @@ -121,7 +116,6 @@ 'doctype': 'DocField', 'fieldname': 'session_expiry', 'fieldtype': 'Data', - 'idx': 5, 'label': 'Session Expires in (time)', 'permlevel': 0 }, @@ -131,17 +125,22 @@ 'doctype': 'DocField', 'fieldname': 'sync_with_gateway', 'fieldtype': 'Check', - 'idx': 6, 'label': 'Sync with Gateway', 'permlevel': 0 }, + # DocField + { + 'doctype': 'DocField', + 'fieldtype': 'Column Break', + 'permlevel': 0 + }, + # DocField { 'doctype': 'DocField', 'fieldname': 'title', 'fieldtype': 'Data', - 'idx': 7, 'label': 'Title', 'permlevel': 0 }, @@ -151,7 +150,6 @@ 'doctype': 'DocField', 'fieldname': 'account_id', 'fieldtype': 'Data', - 'idx': 8, 'label': 'Account Id', 'permlevel': 0 }, @@ -161,7 +159,6 @@ 'doctype': 'DocField', 'fieldname': 'company_name', 'fieldtype': 'Data', - 'idx': 9, 'label': 'Company Name', 'permlevel': 0 }, @@ -171,7 +168,6 @@ 'doctype': 'DocField', 'fieldname': 'industry', 'fieldtype': 'Data', - 'idx': 10, 'label': 'Industry', 'permlevel': 0 }, @@ -181,7 +177,6 @@ 'doctype': 'DocField', 'fieldname': 'time_zone', 'fieldtype': 'Data', - 'idx': 11, 'label': 'Time Zone', 'permlevel': 0 }, @@ -191,7 +186,6 @@ 'doctype': 'DocField', 'fieldname': 'country', 'fieldtype': 'Data', - 'idx': 12, 'label': 'Country', 'permlevel': 0 }, @@ -201,7 +195,6 @@ 'doctype': 'DocField', 'fieldname': 'total_sms_sent', 'fieldtype': 'Int', - 'idx': 13, 'label': 'Total SMS Sent', 'permlevel': 1 }, @@ -210,189 +203,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 14, - 'label': 'Home Pages', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'default_home_pages', - 'fieldtype': 'Table', - 'idx': 15, - 'label': 'Default Home Pages', - 'options': 'Default Home Page', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'home_page', - 'fieldtype': 'Link', - 'idx': 16, - 'label': 'Home Page', - 'options': 'Page', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'Section Break', - 'idx': 17, - 'label': 'Startup', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'startup_code', - 'fieldtype': 'Code', - 'idx': 18, - 'label': 'Startup Code (JS)', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'startup_css', - 'fieldtype': 'Code', - 'idx': 19, - 'label': 'Startup CSS', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'Section Break', - 'idx': 20, - 'label': 'Display', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'Column Break', - 'idx': 21, - 'label': 'Display Options', - 'permlevel': 0, - 'width': '100%' - }, - - # DocField - { - 'description': 'Default page width is auto', - 'doctype': 'DocField', - 'fieldname': 'page_width', - 'fieldtype': 'Int', - 'idx': 22, - 'label': 'Page WIdth', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'hide_webnotes_toolbar', - 'fieldtype': 'Check', - 'idx': 23, - 'label': 'Hide WebNotes Toolbar', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'background_color', - 'fieldtype': 'Data', - 'idx': 24, - 'label': 'Background Color', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'Section Break', - 'idx': 25, - 'label': 'Header / Footer', - 'permlevel': 0 - }, - - # DocField - { - 'description': 'Default header height is 40px', - 'doctype': 'DocField', - 'fieldname': 'header_height', - 'fieldtype': 'Int', - 'idx': 26, - 'label': 'Header Height', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'client_name', - 'fieldtype': 'Text', - 'idx': 27, - 'label': 'Header HTML', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'footer_height', - 'fieldtype': 'Int', - 'idx': 28, - 'label': 'Footer Height', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'footer_html', - 'fieldtype': 'Text', - 'idx': 29, - 'label': 'Footer HTML', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'letter_head', - 'fieldtype': 'Text', - 'idx': 30, - 'label': 'Letter Head', - 'permlevel': 0, - 'print_hide': 1 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'client_logo', - 'fieldtype': 'Link', - 'idx': 31, - 'label': 'Client Logo', - 'options': 'File', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'Section Break', - 'idx': 32, 'label': 'Mail Server', 'permlevel': 0 }, @@ -403,7 +213,6 @@ 'doctype': 'DocField', 'fieldname': 'support_email_id', 'fieldtype': 'Data', - 'idx': 33, 'label': 'Support Email Id', 'permlevel': 0 }, @@ -413,7 +222,6 @@ 'doctype': 'DocField', 'fieldname': 'letter_head_image', 'fieldtype': 'Data', - 'idx': 34, 'label': 'Letter Head Image', 'permlevel': 0 }, @@ -424,7 +232,6 @@ 'doctype': 'DocField', 'fieldname': 'auto_email_id', 'fieldtype': 'Data', - 'idx': 35, 'label': 'Auto Email Id', 'permlevel': 0 }, @@ -436,17 +243,22 @@ 'doctype': 'DocField', 'fieldname': 'outgoing_mail_server', 'fieldtype': 'Data', - 'idx': 36, 'label': 'Outgoing Mail Server', 'permlevel': 0 }, + # DocField + { + 'doctype': 'DocField', + 'fieldtype': 'Column Break', + 'permlevel': 0 + }, + # DocField { 'doctype': 'DocField', 'fieldname': 'mail_port', 'fieldtype': 'Data', - 'idx': 37, 'label': 'Mail Port', 'permlevel': 0 }, @@ -456,7 +268,6 @@ 'doctype': 'DocField', 'fieldname': 'use_ssl', 'fieldtype': 'Check', - 'idx': 38, 'label': 'Use SSL', 'permlevel': 0 }, @@ -466,7 +277,6 @@ 'doctype': 'DocField', 'fieldname': 'mail_login', 'fieldtype': 'Data', - 'idx': 39, 'label': 'Login Id', 'permlevel': 0 }, @@ -476,7 +286,6 @@ 'doctype': 'DocField', 'fieldname': 'mail_password', 'fieldtype': 'Password', - 'idx': 40, 'label': 'Mail Password', 'permlevel': 0 }, @@ -486,7 +295,6 @@ 'doctype': 'DocField', 'fieldname': 'mail_footer', 'fieldtype': 'Text', - 'idx': 41, 'label': 'Mail Footer', 'permlevel': 0 }, @@ -495,7 +303,6 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 42, 'label': 'Defaults', 'permlevel': 0 }, @@ -506,7 +313,6 @@ 'fieldname': 'system_defaults', 'fieldtype': 'Table', 'hidden': 0, - 'idx': 43, 'label': 'System Defaults', 'options': 'DefaultValue', 'permlevel': 0, @@ -518,30 +324,16 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 44, - 'label': 'Sidebars', + 'label': 'Banner', 'permlevel': 0 }, # DocField { - 'description': 'To hide the left sidebar, leave this blank or 0', 'doctype': 'DocField', - 'fieldname': 'left_sidebar_width', - 'fieldtype': 'Int', - 'idx': 45, - 'label': 'Left Sidebar Width', - 'permlevel': 0 - }, - - # DocField - { - 'description': 'To hide the right sidebar, leave this blank or 0', - 'doctype': 'DocField', - 'fieldname': 'right_sidebar_width', - 'fieldtype': 'Int', - 'idx': 46, - 'label': 'Right Sidebar Width', + 'fieldname': 'client_name', + 'fieldtype': 'Text', + 'label': 'Banner HTML', 'permlevel': 0 }, @@ -549,39 +341,44 @@ { 'doctype': 'DocField', 'fieldtype': 'Section Break', - 'idx': 47, - 'label': 'Test Script', + 'label': 'Startup', 'permlevel': 0 }, # DocField { 'doctype': 'DocField', - 'fieldtype': 'Button', - 'idx': 48, - 'label': 'Execute Local', - 'permlevel': 0 - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldtype': 'Button', - 'icon': 'accept.png', - 'idx': 49, - 'label': 'Execute (Careful!)', - 'options': 'execute_test', - 'permlevel': 0, - 'width': '150px' - }, - - # DocField - { - 'doctype': 'DocField', - 'fieldname': 'test_code', + 'fieldname': 'custom_startup_code', 'fieldtype': 'Code', - 'idx': 50, - 'label': 'Test Code', + 'label': 'Custom Startup Code', + 'permlevel': 0 + }, + + # DocField + { + 'doctype': 'DocField', + 'fieldtype': 'Section Break', + 'label': 'Home Pages', + 'permlevel': 0 + }, + + # DocField + { + 'doctype': 'DocField', + 'fieldname': 'home_page', + 'fieldtype': 'Link', + 'label': 'Home Page', + 'options': 'Page', + 'permlevel': 0 + }, + + # DocField + { + 'doctype': 'DocField', + 'fieldname': 'default_home_pages', + 'fieldtype': 'Table', + 'label': 'Default Home Pages', + 'options': 'Default Home Page', 'permlevel': 0 } ] \ No newline at end of file diff --git a/py/core/page/login_page/login_page.css b/py/core/page/login_page/login_page.css index d162bf720f..a4e9f7558e 100644 --- a/py/core/page/login_page/login_page.css +++ b/py/core/page/login_page/login_page.css @@ -1,8 +1,3 @@ -#body_div { - width: 960px; - margin: auto; -} - .login-banner { margin-bottom: 20px; } \ No newline at end of file diff --git a/py/core/page/login_page/login_page.js b/py/core/page/login_page/login_page.js index 919689aaa8..b4f63ee85e 100644 --- a/py/core/page/login_page/login_page.js +++ b/py/core/page/login_page/login_page.js @@ -14,7 +14,7 @@ pscript['onload_Login Page'] = function(){ pscript['onshow_Login Page'] = function() { // set banner - var bannerhtml = locals['Control Panel']['Control Panel'].client_name; + var bannerhtml = wn.control_panel.client_name; if(bannerhtml) $('.login-banner').html(bannerhtml); } diff --git a/py/webnotes/auth.py b/py/webnotes/auth.py index 8dac74ffbe..293632dd5b 100644 --- a/py/webnotes/auth.py +++ b/py/webnotes/auth.py @@ -267,7 +267,10 @@ class CookieManager: # ----------- def set_cookies(self): - webnotes.cookies['account_id'] = webnotes.conn.cur_db_name + if webnotes.form_dict.get('cmd')=='logout': + webnotes.cookies['account_id'] = '' + else: + webnotes.cookies['account_id'] = webnotes.conn.cur_db_name if webnotes.session.get('sid'): webnotes.cookies['sid'] = webnotes.session['sid'] diff --git a/py/webnotes/boot.py b/py/webnotes/boot.py new file mode 100644 index 0000000000..271f631a99 --- /dev/null +++ b/py/webnotes/boot.py @@ -0,0 +1,76 @@ +""" +bootstrap client session +""" + + +def get_bootinfo(): + """build and return boot info""" + import webnotes + bootinfo = {} + doclist = [] + + webnotes.conn.begin() + + # profile + get_profile(bootinfo) + + # control panel + import webnotes.model.doc + cp = webnotes.model.doc.getsingle('Control Panel') + + # system info + bootinfo['control_panel'] = cp + bootinfo['account_name'] = cp.get('account_id') + bootinfo['sysdefaults'] = webnotes.utils.get_defaults() + + if webnotes.session['user'] != 'Guest': + import webnotes.widgets.menus + bootinfo['start_items'] = webnotes.widgets.menus.get_menu_items() + bootinfo['dt_labels'] = get_dt_labels() + + # home page + get_home_page(bootinfo, doclist) + + # ipinfo + if webnotes.session['data'].get('ipinfo'): + bootinfo['ipinfo'] = webnotes.session['data']['ipinfo'] + + # add docs + bootinfo['docs'] = doclist + + # plugins + import startup.event_handlers + if getattr(startup.event_handlers, 'boot_session'): + startup.event_handlers.boot_session(bootinfo) + + webnotes.conn.commit() + + return bootinfo + +def get_profile(bootinfo): + """get profile info""" + import webnotes + bootinfo['profile'] = webnotes.user.load_profile() + webnotes.session['data']['profile'] = bootinfo['profile'] + +def get_home_page(bootinfo, doclist): + """load home page""" + import webnotes + home_page = webnotes.user.get_home_page() + if home_page: + import webnotes.widgets.page + doclist += webnotes.widgets.page.get(home_page) + bootinfo['home_page'] = home_page or '' + +def get_dt_labels(): + import webnotes + d = {} + try: + res = webnotes.conn.sql("select name, dt_label from `tabDocType Label`") + except: + return {} + + for r in res: + d[r[0]] = r[1] + + return d diff --git a/py/webnotes/model/__init__.py b/py/webnotes/model/__init__.py index 2448f5d5be..bcbd76e923 100644 --- a/py/webnotes/model/__init__.py +++ b/py/webnotes/model/__init__.py @@ -93,21 +93,6 @@ def delete_doc(doctype=None, name=None, doclist = None, force=0): return 'okay' -#================================================================================= -# new feature added 9-Jun-10 to allow doctypes to have labels -def get_dt_labels(): - d = {} - try: - res = webnotes.conn.sql("select name, dt_label from `tabDocType Label`") - except: - return {} - - for r in res: - d[r[0]] = r[1] - - return d -#================================================================================= - def get_search_criteria(dt): import webnotes.model.doc # load search criteria for reports (all) diff --git a/py/webnotes/model/doc.py b/py/webnotes/model/doc.py index 6a6a15596f..48f30c7da5 100755 --- a/py/webnotes/model/doc.py +++ b/py/webnotes/model/doc.py @@ -130,8 +130,7 @@ class Document: def _loadsingle(self): self.name = self.doctype - dataset = webnotes.conn.sql("select field, value from tabSingles where doctype='%s'" % self.doctype) - for d in dataset: self.fields[d[0]] = d[1] + self.fields.update(getsingle(self.doctype)) # Setter # --------------------------------------------------------------------------- @@ -671,9 +670,6 @@ def get(dt, dn='', with_children = 1, from_get_obj = 0, prefix = 'tab'): webnotes.response['exc_type'] = 'PermissionError' raise webnotes.ValidationError, '[WNF] No read permission for %s %s' % (dt, dn) - # import report_builder code - get_report_builder_code(doc) - if not with_children: # done return [doc,] @@ -686,4 +682,14 @@ def get(dt, dn='', with_children = 1, from_get_obj = 0, prefix = 'tab'): for t in tablefields: doclist += getchildren(doc.name, t[0], t[1], dt, prefix=prefix) + # import report_builder code + if not from_get_obj: + get_report_builder_code(doc) + return doclist + +def getsingle(doctype): + """get single doc as dict""" + dataset = webnotes.conn.sql("select field, value from tabSingles where doctype=%s", doctype) + return dict(dataset) + \ No newline at end of file diff --git a/py/webnotes/modules/patch_handler.py b/py/webnotes/modules/patch_handler.py index 86eb4c2d32..eba4207f34 100644 --- a/py/webnotes/modules/patch_handler.py +++ b/py/webnotes/modules/patch_handler.py @@ -60,7 +60,8 @@ def execute_patch(patchmodule, method=None, methodargs=None): def add_to_patch_log(tb): """add error log to patches/patch.log""" - with open('patches/patch.log','a') as patchlog: + import webnotes.defs, os + with open(os.path.join(webnotes.defs.modules_path,'patches','patch.log'),'a') as patchlog: patchlog.write('\n\n' + tb) def update_patch_log(patchmodule): diff --git a/py/webnotes/session_cache.py b/py/webnotes/session_cache.py index 233afb0e98..ff29f77416 100644 --- a/py/webnotes/session_cache.py +++ b/py/webnotes/session_cache.py @@ -1,16 +1,18 @@ -# session_cache.py +""" +Boot session from cache or build -# clear cache -# ================================================== +Session bootstraps info needed by common client side activities including +permission, homepage, control panel variables, system defaults etc +""" +import webnotes def clear(): + """clear all cache""" clear_cache() - - import webnotes webnotes.response['message'] = "Cache Cleared" def clear_cache(user=''): - import webnotes + """clear cache""" try: if user: webnotes.conn.sql("delete from __SessionCache where user=%s", user) @@ -22,14 +24,10 @@ def clear_cache(user=''): else: raise e -# load cache -# ================================================== - def get(): - import webnotes + """get session boot info""" import webnotes.defs - # get country country = webnotes.session['data'].get('ipinfo', {}).get('countryName', 'Unknown Country') @@ -40,20 +38,14 @@ def get(): return cache # if not create it - sd = build() - dump(sd, country) - - # update profile from cache - webnotes.session['data']['profile'] = sd['profile'] + import webnotes.boot + bootinfo = webnotes.boot.get_bootinfo() + add_to_cache(bootinfo, country) - return sd - -# load cache -# ================================================== + return bootinfo def load(country): - import webnotes - + """load from cache""" try: sd = webnotes.conn.sql("select cache from __SessionCache where user='%s' %s" % (webnotes.session['user'], (country and (" and country='%s'" % country) or ''))) if sd: @@ -65,21 +57,9 @@ def load(country): make_cache_table() else: raise e - -# make the cache table -# ================================================== - -def make_cache_table(): - import webnotes - webnotes.conn.commit() - webnotes.conn.sql("create table `__SessionCache` (user VARCHAR(120), country VARCHAR(120), cache LONGTEXT)") - webnotes.conn.begin() - -# dump session to cache -# ================================================== - -def dump(sd, country): - import webnotes + +def add_to_cache(sd, country): + """add to cache""" import webnotes.model.utils if sd.get('docs'): @@ -91,80 +71,7 @@ def dump(sd, country): # make new webnotes.conn.sql("insert into `__SessionCache` (user, country, cache) VALUES (%s, %s, %s)", (webnotes.session['user'], country, str(sd))) -# ================================================== - -def get_letter_heads(): - import webnotes - try: - lh = {} - ret = webnotes.conn.sql("select name, content from `tabLetter Head` where ifnull(disabled,0)=0") - for r in ret: - lh[r[0]] = r[1] - return lh - except Exception, e: - if e.args[0]==1146: - return {} - else: - raise Exception, e - -# ================================================== -# load startup.js and startup.css from the modules/startup folder - -def load_startup(cp): - from webnotes.modules import ModuleFile - - try: from webnotes.defs import modules_path - except ImportError: return - - import os - - cp.startup_code = ModuleFile(os.path.join(modules_path, 'startup', 'startup.js')).load_content() - cp.startup_css = ModuleFile(os.path.join(modules_path, 'startup', 'startup.css')).load_content() - -# build it -# ================================================== - -def build(): - sd = {} - - import webnotes - import webnotes.model - import webnotes.model.doc - import webnotes.model.doctype - import webnotes.widgets.page - import webnotes.widgets.menus - import webnotes.profile - import webnotes.defs - - sql = webnotes.conn.sql - - webnotes.conn.begin() - sd['profile'] = webnotes.user.load_profile() - - doclist = [] - doclist += webnotes.model.doc.get('Control Panel') - cp = doclist[0] - load_startup(cp) - - doclist += webnotes.model.doctype.get('Event') - doclist += webnotes.model.doctype.get('Search Criteria') - home_page = webnotes.user.get_home_page() - - if home_page: - doclist += webnotes.widgets.page.get(home_page) - - sd['account_name'] = cp.account_id or '' - sd['sysdefaults'] = webnotes.utils.get_defaults() - sd['n_online'] = int(sql("SELECT COUNT(DISTINCT user) FROM tabSessions")[0][0] or 0) - sd['docs'] = doclist - sd['letter_heads'] = get_letter_heads() - sd['home_page'] = home_page or '' - sd['start_items'] = webnotes.widgets.menus.get_menu_items() - if webnotes.session['data'].get('ipinfo'): - sd['ipinfo'] = webnotes.session['data']['ipinfo'] - - webnotes.session['data']['profile'] = sd['profile'] - sd['dt_labels'] = webnotes.model.get_dt_labels() +def make_cache_table(): webnotes.conn.commit() - - return sd + webnotes.conn.sql("create table `__SessionCache` (user VARCHAR(120), country VARCHAR(120), cache LONGTEXT)") + webnotes.conn.begin() diff --git a/py/webnotes/startup_test.py b/py/webnotes/startup_test.py deleted file mode 100644 index dfb666135b..0000000000 --- a/py/webnotes/startup_test.py +++ /dev/null @@ -1,171 +0,0 @@ -""" - startup info for the app - - client needs info that is static across all users - and user specific info like roles and defaults - - so calling will be: - index.cgi?cmd=webnotes.startup.common_info - index.cgi?cmd=webnotes.startup.user_info&user=x@y.com - - to clear startup, - you must clear all files in the vcs starting with index.cgi?cmd=webnotes.startup -""" - -import webnotes - - -def get_letter_heads(): - """ - get letter head - """ - import webnotes - try: - lh = {} - ret = webnotes.conn.sql("select name, content from `tabLetter Head` where ifnull(disabled,0)=0") - for r in ret: - lh[r[0]] = r[1] - return lh - except Exception, e: - if e.args[0]==1146: - return {} - else: - raise Exception, e - - - - -def get_content_user(): - """ - get user specific content - """ - import webnotes - import webnotes.utils - import webnotes.widgets.page - import webnotes.widgets.menus - - user = webnotes.form_dict['user'] - doclist, ret = [], {} - - webnotes.conn.begin() - ret['profile'] = webnotes.user.load_profile() - home_page = webnotes.user.get_home_page() - if home_page: - doclist += webnotes.widgets.page.get(home_page) - - ret['sysdefaults'] = webnotes.utils.get_defaults() - ret['home_page'] = home_page or '' - - # role-wise menus - ret['start_items'] = webnotes.widgets.menus.get_menu_items() - - # bundle - webnotes.session['data']['profile'] = ret['profile'] - if webnotes.session['data'].get('ipinfo'): - ret['ipinfo'] = webnotes.session['data']['ipinfo'] - - webnotes.conn.commit() - - webnotes.response['docs'] = doclist - - return ret - -def get_content_common(): - """ - build common startup info - """ - - import webnotes - import webnotes.model.doc - import webnotes.model.doctype - import webnotes.model - - doclist, ret = [], {} - doclist += webnotes.model.doc.get('Control Panel') - doclist += webnotes.model.doctype.get('Event') - doclist += webnotes.model.doctype.get('Search Criteria') - - cp = doclist[0] - ret['account_name'] = cp.account_id or '' - ret['letter_heads'] = get_letter_heads() - ret['dt_labels'] = webnotes.model.get_dt_labels() - - webnotes.response['docs'] = doclist - - return ret - - -def common_info(): - """ - get common startup info (from version or live) - """ - get_info('index.cgi?cmd=webnotes.startup.common_info', 'common') - -def user_info(): - """ - get user info - """ - user = webnotes.form_dict['user'] - get_info('index.cgi?cmd=webnotes.startup.user_info&user='+user, 'user') - -def get_info(fname, key): - """ - get info from version or re-build - """ - from build.version import VersionControl - - vc = VersionControl() - - # from versions (same static) - - if vc.exists(fname): - content = vc.get_file(fname)['content'] - else: - content = globals().get('get_content_'+key)() - import json - content = json.dumps(content) - - # add in vcs - vc.add(fname=fname, content=content) - vc.commit() - - vc.close() - - webnotes.response['content'] = content - return - - - - - -def clear_info(info_type=None): - """ - clear startup info and force a new version - - parameter: info_type = 'user' or 'common' or 'all' - """ - if not info_type: - info_type = webnotes.form_dict.get('info_type') - - from build.version import VersionControl - vc = VersionControl() - - flist = [] - - if info_type=='common': - flist = ['index.cgi?cmd=webnotes.startup.common_info'] - elif info_type=='user': - flist = [f[0] for f in vc.repo.sql("""select fname from files where fname like ?""",\ - ('index.cgi?cmd=webnotes.startup.user_info%',))] - elif info_type=='all': - flist = [f[0] for f in vc.repo.sql("""select fname from files where fname like ?""",\ - ('index.cgi?cmd=webnotes.startup%',))] - else: - webnotes.msgprint("info_type not found: %s" % info_type) - - for f in flist: - print 'clearing %s' % f - vc.remove(f) - - vc.commit() - vc.close() \ No newline at end of file diff --git a/wnf.py b/wnf.py index 153482b47d..28d22512c2 100755 --- a/wnf.py +++ b/wnf.py @@ -45,6 +45,10 @@ def run(): if cmd=='build': from build.project import Project Project().build() + + elif cmd=='clear': + from build.project import Project + Project().render_templates() # replace code elif cmd=='replace':