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':