Merge branch 'latest' of github.com:webnotes/erpnext into latest

Conflicts:
	version.num
diff --git a/config/conf.py b/config/conf.py
deleted file mode 100644
index 1cf35e2..0000000
--- a/config/conf.py
+++ /dev/null
@@ -1,7 +0,0 @@
-index_path = '/'
-
-include_paths = [
-	'erpnext',
-	'lib/py',
-	'lib/py/legacy'
-]
\ No newline at end of file
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js
index e5fca9f..13416e6 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.js
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js
@@ -125,7 +125,7 @@
           var imgsrc=null;
           var has_children = true;
           if(cl[i].group_or_ledger=='Ledger') {
-            var imgsrc = 'lib/images/icons/page.gif';
+            var imgsrc = 'lib/images/icons/page.png';
             has_children = false;
           }
           var t = tree.addNode(n, cl[i].account_name, imgsrc,tree.std_onclick, has_children ? tree.std_onexp : null);
@@ -138,7 +138,7 @@
           var imgsrc=null;
           var has_children = true;
           if(cl[i].group_or_ledger=='Ledger') {
-            var imgsrc = 'lib/images/icons/page.gif';
+            var imgsrc = 'lib/images/icons/page.png';
             has_children = false;
           }
           var t = tree.addNode(n, cl[i].cost_center_name, imgsrc,tree.std_onclick, has_children ? tree.std_onexp : null);
diff --git a/erpnext/home/__init__.py b/erpnext/home/__init__.py
index 7059cec..5ebf7c0 100644
--- a/erpnext/home/__init__.py
+++ b/erpnext/home/__init__.py
@@ -34,23 +34,33 @@
 	'Support Ticket':       ['[%(status)s] %(subject)s', '#000080']	
 }
 
-def make_feed(doc, subject, color):
+def make_feed(feedtype, doctype, name, owner, subject, color):
 	"makes a new Feed record"
 	#msgprint(subject)
 	from webnotes.model.doc import Document
-	webnotes.conn.sql("delete from tabFeed where doc_type=%s and doc_name=%s", (doc.doctype, doc.name))
+
+	if feedtype in ('Login', 'Comment'):
+		# delete old login, comment feed
+		webnotes.conn.sql("""delete from tabFeed where 
+			datediff(curdate(), creation) > 7 and doc_type in ('Comment', 'Login')""")
+	else:
+		# one feed per item
+		webnotes.conn.sql("""delete from tabFeed
+			where doc_type=%s and doc_name=%s 
+			and ifnull(feed_type,'') != 'Comment'""", (doctype, name))
+
 	f = Document('Feed')
-	f.doc_type = doc.doctype
-	f.doc_name = doc.name
+	f.owner = owner
+	f.feed_type = feedtype
+	f.doc_type = doctype
+	f.doc_name = name
 	f.subject = subject
 	f.color = color
-	f.save(1)
+	f.save()
 
 def update_feed(doc, method=None):   
 	"adds a new feed"
 	if method=='on_update':
 		subject, color = feed_dict.get(doc.doctype, [None, None])
-		if subject:
-			subject = subject % doc.fields
-			
-			make_feed(doc, subject, color)
+		if subject:			
+			make_feed('', doc.doctype, doc.name, doc.owner, subject % doc.fields, color)
diff --git a/erpnext/home/doctype/feed/feed.txt b/erpnext/home/doctype/feed/feed.txt
index 5aa4f91..f239f7c 100644
--- a/erpnext/home/doctype/feed/feed.txt
+++ b/erpnext/home/doctype/feed/feed.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2011-04-08 10:50:41',
+		'creation': '2011-04-06 18:11:38',
 		'docstatus': 0,
-		'modified': '2011-04-05 09:16:57',
+		'modified': '2012-02-03 11:28:16',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
@@ -14,18 +14,18 @@
 	{
 		'autoname': '_FEED.#####',
 		'colour': 'White:FFF',
+		'default_print_format': 'Standard',
 		'doctype': 'DocType',
 		'module': 'Home',
 		'name': '__common__',
 		'section_style': 'Simple',
 		'show_in_menu': 0,
-		'version': 1
+		'version': 2
 	},
 
 	# These values are common for all DocField
 	{
 		'doctype': 'DocField',
-		'fieldtype': 'Data',
 		'name': '__common__',
 		'parent': 'Feed',
 		'parentfield': 'fields',
@@ -42,8 +42,16 @@
 	# DocField
 	{
 		'doctype': 'DocField',
+		'fieldname': 'feed_type',
+		'fieldtype': 'Select',
+		'label': 'Feed Type'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
 		'fieldname': 'doc_type',
-		'idx': 1,
+		'fieldtype': 'Data',
 		'label': 'Doc Type'
 	},
 
@@ -51,7 +59,7 @@
 	{
 		'doctype': 'DocField',
 		'fieldname': 'doc_name',
-		'idx': 2,
+		'fieldtype': 'Data',
 		'label': 'Doc Name'
 	},
 
@@ -59,7 +67,7 @@
 	{
 		'doctype': 'DocField',
 		'fieldname': 'subject',
-		'idx': 3,
+		'fieldtype': 'Data',
 		'label': 'Subject'
 	},
 
@@ -67,7 +75,7 @@
 	{
 		'doctype': 'DocField',
 		'fieldname': 'color',
-		'idx': 4,
+		'fieldtype': 'Data',
 		'label': 'Color'
 	}
 ]
\ No newline at end of file
diff --git a/erpnext/home/page/event_updates/event_updates.js b/erpnext/home/page/event_updates/event_updates.js
index 784577a..90aef9e 100644
--- a/erpnext/home/page/event_updates/event_updates.js
+++ b/erpnext/home/page/event_updates/event_updates.js
@@ -456,7 +456,7 @@
 	this.list = new wn.widgets.Listing({
 		parent: this.list_area,
 		query: repl('select \
-			distinct t1.name, t1.doc_type, t1.doc_name, t1.subject, t1.modified_by, \
+			distinct t1.name, t1.feed_type, t1.doc_type, t1.doc_name, t1.subject, t1.modified_by, \
 			concat(ifnull(t2.first_name,""), " ", ifnull(t2.last_name,"")) as full_name, \
 			t1.modified, t1.color \
 			from tabFeed t1, tabProfile t2, tabUserRole t3, tabDocPerm t4 \
@@ -495,13 +495,11 @@
 	this.tab = make_table(this.wrapper, 1, 2, '100%', [(100/7)+'%', (600/7)+'%']);
 	$y(this.tab,{tableLayout:'fixed'})
 
-	// image
 	$y($td(this.tab,0,0),{textAlign:'right',paddingRight:'4px'});
 	
 	// text
 	this.text_area = $a($td(this.tab,0,1), 'div');
-	this.render_references(this.text_area, det);
-	
+	this.render_references(this.text_area, det);	
 	this.render_tag(det);
 	
 	// add day separator
@@ -537,13 +535,21 @@
 // -------------------------------------------------
 
 FeedItem.prototype.render_tag = function(det) {
+	// type is the name
 	tag = $a($td(this.tab,0,0), 'div', '', 
-		{color:'#FFF', padding:'3px', textAlign:'right', fontSize:'11px', whiteSpace:'nowrap', overflow:'hidden', cursor:'pointer'});
+		{color:'#FFF', padding:'3px', textAlign:'right', fontSize:'11px', 
+			whiteSpace:'nowrap', overflow:'hidden', cursor:'pointer'});
 	$br(tag,'3px');
 	$y(tag, {backgroundColor:(det.color || '#273')});
-	tag.innerHTML = get_doctype_label(det.doc_type);
-	tag.dt = det.doc_type;
-	tag.onclick = function() { loaddocbrowser(this.dt); }
+	
+	// tag label
+	tag.innerHTML = det.feed_type || get_doctype_label(det.doc_type);
+	
+	// not comment / label
+	if(!det.feed_type) {
+		tag.dt = det.doc_type;
+		tag.onclick = function() { loaddocbrowser(this.dt); }		
+	}
 }
 
 FeedItem.prototype.render_references = function(div, det) {
@@ -552,10 +558,15 @@
 	var dt = det.doc_type; var dn = det.doc_name
 	
 	// link
-	var allow = in_list(profile.can_read, dt);
-	var span = $a($td(div.tab,0,0), 'span', (allow ? 'link_type': ''), null, det.doc_name);
-	span.dt = dt; span.dn = dn;
-	if(allow) span.onclick = function() { loaddoc(this.dt, this.dn); }
+	if(det.feed_type=='Login') {
+		// nothing - no link		
+	} else {
+		var allow = in_list(profile.can_read, dt);
+		var span = $a($td(div.tab,0,0), 'span', (allow ? 'link_type': ''), null, 
+			det.doc_name);
+		span.dt = dt; span.dn = dn;
+		if(allow) span.onclick = function() { loaddoc(this.dt, this.dn); }		
+	}
 	
 	// subject
 	if(det.subject) {
diff --git a/erpnext/home/page/my_company/my_company.js b/erpnext/home/page/my_company/my_company.js
index e85623f..298b313 100644
--- a/erpnext/home/page/my_company/my_company.js
+++ b/erpnext/home/page/my_company/my_company.js
@@ -858,7 +858,7 @@
 	
 	var t = make_table($td(tbl, ridx, cidx),1,2,null,['16px', null],{marginRight:'5px'});
 	var ic = $a($td(t,0,0), 'img','',{cursor:'pointer', marginRight:'5px'});
-	ic.src= 'lib/images/icons/help.gif';
+	ic.src= 'lib/images/icons/help.png';
 	ic.role = role;
 		
 	ic.onclick = function(){
diff --git a/erpnext/patches/jan_mar_2012/latest/__init__.py b/erpnext/patches/jan_mar_2012/latest/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/latest/__init__.py
diff --git a/erpnext/patches/jan_mar_2012/latest/cleanups.py b/erpnext/patches/jan_mar_2012/latest/cleanups.py
new file mode 100644
index 0000000..9a78a70
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/latest/cleanups.py
@@ -0,0 +1,35 @@
+import webnotes
+
+def execute():
+	from webnotes.model import delete_doc
+	from webnotes.modules import reload_doc
+	delete_doc("DocType", "SSO Control")
+	delete_doc("DocType", "WN ERP Client Control")
+	delete_doc("DocType", "Production Tips Common")
+	delete_doc("DocType", "DocTrigger")
+	delete_doc("Page", "Setup Wizard")
+	
+	# cleanup control panel
+	delete_doc("DocType", "Control Panel")
+	reload_doc("core", "doctype", "control_panel")
+
+	# cleanup page
+	delete_doc("DocType", "Page")
+	reload_doc("core", "doctype", "page")
+	
+	webnotes.conn.sql("""delete from tabSingles
+		where field like 'startup_%' and doctype='Control Panel'""")
+	webnotes.conn.sql("""delete from __SessionCache""")
+
+	webnotes.conn.commit()
+
+	# DDLs
+	# -------------------
+	
+	webnotes.conn.sql("drop table if exists tabDocTrigger")	
+
+	try: webnotes.conn.sql("""alter table `tabFile Data` drop column blob_content""")
+	except: pass
+		
+	webnotes.conn.sql("""alter table __PatchLog engine=InnoDB""")
+	
diff --git a/erpnext/patches/jan_mar_2012/latest/feed.py b/erpnext/patches/jan_mar_2012/latest/feed.py
new file mode 100644
index 0000000..c913c49
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/latest/feed.py
@@ -0,0 +1,6 @@
+import webnotes
+from webnotes.model.doc import Document
+from webnotes.modules import reload_doc
+
+def execute():
+	reload_doc('home', 'doctype', 'feed')
\ No newline at end of file
diff --git a/erpnext/patches/jan_mar_2012/latest/login.py b/erpnext/patches/jan_mar_2012/latest/login.py
new file mode 100644
index 0000000..97cd323
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/latest/login.py
@@ -0,0 +1,19 @@
+import webnotes
+from webnotes.model.doc import Document
+from webnotes.modules import reload_doc
+
+def execute():
+	add_default_home_page()
+	reload_doc('setup','doctype','manage_account')
+
+	
+def add_default_home_page():
+	if not webnotes.conn.sql("""select name from `tabDefault Home Page`
+		where role='Guest' and home_page='Login Page'"""):
+		d = Document('Default Home Page')
+		d.parent = 'Control Panel'
+		d.parenttype = 'Control Panel'
+		d.parentfield = 'default_home_pages'
+		d.role = 'Guest'
+		d.home_page = 'Login Page'
+		d.save(1)
diff --git a/erpnext/patches/jan_mar_2012/latest/website.py b/erpnext/patches/jan_mar_2012/latest/website.py
new file mode 100644
index 0000000..9c930e2
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/latest/website.py
@@ -0,0 +1,67 @@
+# website patch
+
+import webnotes
+from webnotes.model.doc import Document
+
+def execute():	
+	add_website_manager()
+	from webnotes.modules import reload_doc
+	from webnotes.model import delete_doc
+
+	reload_doc('setup', 'doctype', 'item_group')
+	delete_doc('Website', 'Module Def', 'Website')
+	reload_doc('website', 'Module Def', 'Website')
+	reload_doc('website', 'Role', 'Website Manager')
+
+	webnotes.conn.sql("""delete from `tabModule Def Role` where parent='Website'""")
+	d = Document('Module Def Role')
+	d.parent = 'Website'
+	d.role = 'Website Manager'
+	d.save()
+	
+	reload_doc('website', 'doctype', 'about_us_settings')
+	reload_doc('website', 'doctype', 'about_us_team')
+	reload_doc('website', 'doctype', 'blog')
+	reload_doc('website', 'doctype', 'blog_subscriber')
+	reload_doc('website', 'doctype', 'contact_us_settings')
+	reload_doc('website', 'doctype', 'product')
+	reload_doc('website', 'doctype', 'product_group')
+	reload_doc('website', 'doctype', 'products_settings')
+	reload_doc('website', 'doctype', 'related_page')
+	reload_doc('website', 'doctype', 'style_settings')
+	reload_doc('website', 'doctype', 'top_bar_item')
+	reload_doc('website', 'doctype', 'web_page')
+	reload_doc('website', 'doctype', 'website_settings')
+
+	reload_doc('website', 'page', 'about')
+	reload_doc('website', 'page', 'blog')
+	reload_doc('website', 'page', 'contact')
+	reload_doc('website', 'page', 'products')
+	reload_doc('website', 'page', 'unsubscribe')
+		
+	create_home_page()
+
+def create_home_page():
+	"""create a dummy home page"""
+	from webnotes.model.code import get_obj
+	if not webnotes.conn.sql("""select name from `tabWeb Page` where name='home'"""):
+		d = Document('Web Page')
+		d.title = 'Home'
+		d.head_section = "<h1>Your Headline</h1>"
+		d.main_section = "<p>Some introduction about your company</p>"
+		d.side_section = "<p>Links to other pages</p>"
+		d.save()
+		obj = get_obj(doc = d)
+		obj.validate()
+		obj.doc.save()
+
+def add_website_manager():
+	"""add website manager to system manager"""
+	for i in webnotes.conn.sql("""select distinct parent from tabUserRole 
+		where role='System Manager'"""):
+		if not webnotes.conn.sql("""select parent from tabUserRole 
+			where role='Website Manager' and parent=%s""", i[0]):
+			d = Document('UserRole')
+			d.parent = i[0]
+			d.role = 'Website Manager'
+			d.save(1)
diff --git a/erpnext/patches/jan_mar_2012/subdomain_login_patch.py b/erpnext/patches/jan_mar_2012/subdomain_login_patch.py
deleted file mode 100644
index fcf72dc..0000000
--- a/erpnext/patches/jan_mar_2012/subdomain_login_patch.py
+++ /dev/null
@@ -1,40 +0,0 @@
-import webnotes
-from webnotes.model.doc import Document
-from webnotes.modules import reload_doc
-
-def execute():
-	add_default_home_page()
-	reload_doc('setup','doctype','manage_account')
-	webnotes.conn.commit()
-	webnotes.conn.sql("drop table if exists tabDocTrigger")
-	cleanup()
-	
-def cleanup():
-	webnotes.conn.begin()
-	from webnotes.model import delete_doc
-	delete_doc("DocType", "SSO Control")
-	delete_doc("DocType", "WN ERP Client Control")
-	delete_doc("DocType", "Production Tips Common")
-	delete_doc("DocType", "DocTrigger")
-
-	# cleanup control panel
-	delete_doc("DocType", "Control Panel")
-	reload_doc("core", "doctype", "control_panel")
-
-	# cleanup page
-	delete_doc("DocType", "Page")
-	reload_doc("core", "doctype", "page")
-	
-	webnotes.conn.sql("""delete from tabSingles
-		where field like 'startup_%' and doctype='Control Panel'""")
-	
-def add_default_home_page():
-	if not webnotes.conn.sql("""select name from `tabDefault Home Page`
-		where role='Guest' and home_page='Login Page'"""):
-		d = Document('Default Home Page')
-		d.parent = 'Control Panel'
-		d.parenttype = 'Control Panel'
-		d.parentfield = 'default_home_pages'
-		d.role = 'Guest'
-		d.home_page = 'Login Page'
-		d.save(1)
diff --git a/erpnext/patches/jan_mar_2012/website.py b/erpnext/patches/jan_mar_2012/website.py
deleted file mode 100644
index 2d25e1f..0000000
--- a/erpnext/patches/jan_mar_2012/website.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# website patch
-
-import webnotes
-from webnotes.model.doc import Document
-
-def execute():	
-	add_website_manager()
-	cleanup_file_data()
-	update_patch_log()
-	from webnotes.modules import reload_doc
-	reload_doc('website', 'Role', 'Website Manager')
-	reload_doc('website', 'Module Def', 'Website')
-	reload_doc('website', 'doctype', 'website_settings')
-	reload_doc('website', 'doctype', 'style_settings')
-	reload_doc('website', 'doctype', 'top_bar_item')
-	reload_doc('website', 'doctype', 'contact_us_settings')
-	reload_doc('website', 'doctype', 'about_us_settings')
-	reload_doc('website', 'doctype', 'products_settings')
-	reload_doc('website', 'doctype', 'blog')
-	reload_doc('website', 'doctype', 'blog_subscriber')
-	reload_doc('website', 'doctype', 'product')
-	reload_doc('website', 'doctype', 'web_page')
-
-	reload_doc('website', 'page', 'contact')
-	reload_doc('website', 'page', 'about')
-	reload_doc('website', 'page', 'blog')
-	reload_doc('website', 'page', 'unsubscribe')
-	reload_doc('website', 'page', 'products')
-		
-def add_website_manager():
-	"""add website manager to system manager"""
-	for i in webnotes.conn.sql("""select distinct parent from tabUserRole 
-		where role='System Manager'"""):
-		if not webnotes.conn.sql("""select parent from tabUserRole 
-			where role='Website Manager' and parent=%s""", i[0]):
-			d = Document('UserRole')
-			d.parent = i[0]
-			d.role = 'Website Manager'
-			d.save(1)
-
-def cleanup_file_data():
-	webnotes.conn.commit()
-	webnotes.conn.sql("""alter table `tabFile Data` drop column blob_content""")
-	webnotes.conn.begin()
-
-def update_patch_log():
-	webnotes.conn.commit()
-	webnotes.conn.sql("""alter table __PatchLog engine=InnoDB""")
-	webnotes.conn.begin()
diff --git a/erpnext/selling/page/sales_browser/sales_browser.js b/erpnext/selling/page/sales_browser/sales_browser.js
index d2ba627..c7e400e 100644
--- a/erpnext/selling/page/sales_browser/sales_browser.js
+++ b/erpnext/selling/page/sales_browser/sales_browser.js
@@ -140,7 +140,7 @@
         var has_children = true;
 
         if(cl[i].is_group=='No') {
-          var imgsrc = 'lib/images/icons/page.gif';
+          var imgsrc = 'lib/images/icons/page.png';
           has_children = false;
         }
         var t = me.tree.addNode(n, cl[i].name, imgsrc,me.tree.std_onclick, has_children ? me.tree.std_onexp : null);
@@ -220,7 +220,7 @@
       var has_children = true;
 
       if(cl[i].is_group=='No') {
-        var imgsrc = 'lib/images/icons/page.gif';
+        var imgsrc = 'lib/images/icons/page.png';
         has_children = false;
       }
      me.tree_area.innerHTML = ''; 
diff --git a/erpnext/setup/doctype/item_group/item_group.txt b/erpnext/setup/doctype/item_group/item_group.txt
index 2e0731c..7c3e928 100644
--- a/erpnext/setup/doctype/item_group/item_group.txt
+++ b/erpnext/setup/doctype/item_group/item_group.txt
@@ -5,54 +5,54 @@
 	{
 		'creation': '2010-08-08 17:09:06',
 		'docstatus': 0,
-		'modified': '2012-01-30 12:14:30',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
+		'modified': '2012-02-06 17:38:00',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
 	},
 
 	# These values are common for all DocType
 	{
-		'_last_update': '1322549700',
+		'_last_update': u'1322549700',
 		'allow_trash': 1,
-		'autoname': 'field:item_group_name',
-		'colour': 'White:FFF',
-		'default_print_format': 'Standard',
+		'autoname': u'field:item_group_name',
+		'colour': u'White:FFF',
+		'default_print_format': u'Standard',
 		'doctype': 'DocType',
-		'document_type': 'Master',
+		'document_type': u'Master',
 		'in_create': 1,
 		'issingle': 0,
-		'module': 'Setup',
+		'module': u'Setup',
 		'name': '__common__',
-		'search_fields': 'parent_item_group',
-		'section_style': 'Simple',
-		'server_code_error': ' ',
+		'search_fields': u'parent_item_group',
+		'section_style': u'Simple',
+		'server_code_error': u' ',
 		'show_in_menu': 0,
-		'version': 57
+		'version': 58
 	},
 
 	# These values are common for all DocField
 	{
-		'doctype': 'DocField',
+		'doctype': u'DocField',
 		'name': '__common__',
-		'parent': 'Item Group',
-		'parentfield': 'fields',
-		'parenttype': 'DocType'
+		'parent': u'Item Group',
+		'parentfield': u'fields',
+		'parenttype': u'DocType'
 	},
 
 	# These values are common for all DocPerm
 	{
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'name': '__common__',
-		'parent': 'Item Group',
-		'parentfield': 'permissions',
-		'parenttype': 'DocType',
+		'parent': u'Item Group',
+		'parentfield': u'permissions',
+		'parenttype': u'DocType',
 		'read': 1
 	},
 
 	# DocType, Item Group
 	{
 		'doctype': 'DocType',
-		'name': 'Item Group'
+		'name': u'Item Group'
 	},
 
 	# DocPerm
@@ -60,9 +60,9 @@
 		'amend': 0,
 		'cancel': 0,
 		'create': 0,
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'permlevel': 1,
-		'role': 'Material Manager',
+		'role': u'Material Manager',
 		'submit': 0,
 		'write': 0
 	},
@@ -72,9 +72,9 @@
 		'amend': 0,
 		'cancel': 0,
 		'create': 0,
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'permlevel': 0,
-		'role': 'Material Manager',
+		'role': u'Material Manager',
 		'submit': 0,
 		'write': 0
 	},
@@ -84,9 +84,9 @@
 		'amend': 0,
 		'cancel': 0,
 		'create': 0,
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'permlevel': 1,
-		'role': 'Material User',
+		'role': u'Material User',
 		'submit': 0,
 		'write': 0
 	},
@@ -96,9 +96,9 @@
 		'amend': 0,
 		'cancel': 0,
 		'create': 0,
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'permlevel': 0,
-		'role': 'Material User',
+		'role': u'Material User',
 		'submit': 0,
 		'write': 0
 	},
@@ -107,9 +107,9 @@
 	{
 		'cancel': 1,
 		'create': 1,
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'permlevel': 0,
-		'role': 'System Manager',
+		'role': u'System Manager',
 		'write': 1
 	},
 
@@ -117,87 +117,98 @@
 	{
 		'cancel': 1,
 		'create': 1,
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'permlevel': 0,
-		'role': 'Material Master Manager',
+		'role': u'Material Master Manager',
 		'write': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'item_group_name',
-		'fieldtype': 'Data',
-		'label': 'Item Group Name',
-		'oldfieldname': 'item_group_name',
-		'oldfieldtype': 'Data',
+		'doctype': u'DocField',
+		'fieldname': u'item_group_name',
+		'fieldtype': u'Data',
+		'label': u'Item Group Name',
+		'oldfieldname': u'item_group_name',
+		'oldfieldtype': u'Data',
 		'permlevel': 0,
 		'reqd': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'description',
-		'fieldtype': 'Text',
-		'label': 'Description',
-		'oldfieldname': 'description',
-		'oldfieldtype': 'Text',
+		'doctype': u'DocField',
+		'fieldname': u'description',
+		'fieldtype': u'Text',
+		'label': u'Description',
+		'oldfieldname': u'description',
+		'oldfieldtype': u'Text',
 		'permlevel': 0,
-		'width': '300px'
+		'width': u'300px'
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'parent_item_group',
-		'fieldtype': 'Link',
-		'label': 'Parent Item Group',
-		'oldfieldname': 'parent_item_group',
-		'oldfieldtype': 'Link',
-		'options': 'Item Group',
+		'colour': u'White:FFF',
+		'description': u'Check this if you want to show in website',
+		'doctype': u'DocField',
+		'fieldname': u'show_in_website',
+		'fieldtype': u'Check',
+		'label': u'Show in Website',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': u'DocField',
+		'fieldname': u'parent_item_group',
+		'fieldtype': u'Link',
+		'label': u'Parent Item Group',
+		'oldfieldname': u'parent_item_group',
+		'oldfieldtype': u'Link',
+		'options': u'Item Group',
 		'permlevel': 0,
 		'reqd': 1,
-		'trigger': 'Client'
+		'trigger': u'Client'
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'description': 'Only leaf nodes are allowed in transaction',
-		'doctype': 'DocField',
-		'fieldname': 'is_group',
-		'fieldtype': 'Select',
-		'label': 'Has Child Node',
-		'oldfieldname': 'is_group',
-		'oldfieldtype': 'Select',
-		'options': '\nYes\nNo',
+		'colour': u'White:FFF',
+		'description': u'Only leaf nodes are allowed in transaction',
+		'doctype': u'DocField',
+		'fieldname': u'is_group',
+		'fieldtype': u'Select',
+		'label': u'Has Child Node',
+		'oldfieldname': u'is_group',
+		'oldfieldtype': u'Select',
+		'options': u'\nYes\nNo',
 		'permlevel': 0,
 		'reqd': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'trash_reason',
-		'fieldtype': 'Small Text',
-		'label': 'Trash Reason',
-		'oldfieldname': 'trash_reason',
-		'oldfieldtype': 'Small Text',
+		'doctype': u'DocField',
+		'fieldname': u'trash_reason',
+		'fieldtype': u'Small Text',
+		'label': u'Trash Reason',
+		'oldfieldname': u'trash_reason',
+		'oldfieldtype': u'Small Text',
 		'permlevel': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'lft',
-		'fieldtype': 'Int',
+		'doctype': u'DocField',
+		'fieldname': u'lft',
+		'fieldtype': u'Int',
 		'hidden': 1,
 		'in_filter': 1,
-		'label': 'lft',
+		'label': u'lft',
 		'no_copy': 1,
-		'oldfieldname': 'lft',
-		'oldfieldtype': 'Int',
+		'oldfieldname': u'lft',
+		'oldfieldtype': u'Int',
 		'permlevel': 0,
 		'print_hide': 1,
 		'report_hide': 0,
@@ -206,15 +217,15 @@
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'rgt',
-		'fieldtype': 'Int',
+		'doctype': u'DocField',
+		'fieldname': u'rgt',
+		'fieldtype': u'Int',
 		'hidden': 1,
 		'in_filter': 1,
-		'label': 'rgt',
+		'label': u'rgt',
 		'no_copy': 1,
-		'oldfieldname': 'rgt',
-		'oldfieldtype': 'Int',
+		'oldfieldname': u'rgt',
+		'oldfieldtype': u'Int',
 		'permlevel': 0,
 		'print_hide': 1,
 		'report_hide': 0,
@@ -223,17 +234,17 @@
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'old_parent',
-		'fieldtype': 'Link',
+		'doctype': u'DocField',
+		'fieldname': u'old_parent',
+		'fieldtype': u'Link',
 		'hidden': 1,
-		'label': 'old_parent',
+		'label': u'old_parent',
 		'no_copy': 1,
-		'oldfieldname': 'old_parent',
-		'oldfieldtype': 'Data',
-		'options': 'Item Group',
+		'oldfieldname': u'old_parent',
+		'oldfieldtype': u'Data',
+		'options': u'Item Group',
 		'permlevel': 0,
 		'print_hide': 1,
 		'report_hide': 1
 	}
-]
\ No newline at end of file
+]
diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py
index d9fb451..3c6281f 100644
--- a/erpnext/startup/event_handlers.py
+++ b/erpnext/startup/event_handlers.py
@@ -1,18 +1,18 @@
 import webnotes
 import webnotes.defs
 from webnotes.utils import cint
+import home
 
 def on_login(login_manager):
 	"""
 		called from login manager, before login
 	"""
-	try:
-		if login_manager.user not in ('Guest', None, ''):
+	if login_manager.user not in ('Guest', None, ''):
+		try:
 			import server_tools.gateway_utils
 			server_tools.gateway_utils.check_login(login_manager.user)
-	except ImportError:
-		pass
-
+		except ImportError:
+			pass
 		
 def on_login_post_session(login_manager):
 	"""
@@ -29,9 +29,21 @@
 				sid!=%s""", \
 			(webnotes.session['user'], webnotes.session['sid']), as_list=1)
 
+	if webnotes.session['user'] not in ('Guest'):
+		# create feed
+		from webnotes.utils import nowtime
+		home.make_feed('Login', 'Profile', login_manager.user, login_manager.user,
+			'%s logged in at %s' % (login_manager.user_fullname, nowtime()), 
+			login_manager.user=='Administrator' and '#8CA2B3' or '#1B750D')		
+
+def comment_added(doc):
+	"""add comment to feed"""
+	import json
+	home.make_feed('Comment', doc.comment_doctype, doc.comment_docname, doc.comment_by,
+		'<i>"' + doc.comment + '"</i>', '#6B24B3')
+
 def doclist_all(doc, method):
 	"""doclist trigger called from webnotes.model.doclist on any event"""
-	import home
 	home.update_feed(doc, method)
 	
 def boot_session(bootinfo):
@@ -41,7 +53,7 @@
 	
 	if webnotes.session['user']=='Guest':
 		bootinfo['website_settings'] = webnotes.model.doc.getsingle('Website Settings')
-		bootinfo['website_menus'] = webnotes.conn.sql("""select label, std_page, custom_page, 
+		bootinfo['website_menus'] = webnotes.conn.sql("""select label, url, custom_page, 
 			parent_label, parentfield
 			from `tabTop Bar Item` where parent='Website Settings' order by idx asc""", as_dict=1)
 		bootinfo['custom_css'] = webnotes.conn.get_value('Style Settings', None, 'custom_css') or ''
@@ -51,5 +63,6 @@
 def get_letter_heads():
 	"""load letter heads with startup"""
 	import webnotes
-	ret = webnotes.conn.sql("select name, content from `tabLetter Head` where ifnull(disabled,0)=0")
+	ret = webnotes.conn.sql("""select name, content from `tabLetter Head` 
+		where ifnull(disabled,0)=0""")
 	return dict(ret)
diff --git a/erpnext/website/Role/Website Manager/Website Manager.txt b/erpnext/website/Role/Website Manager/Website Manager.txt
new file mode 100644
index 0000000..ad1ad9a
--- /dev/null
+++ b/erpnext/website/Role/Website Manager/Website Manager.txt
@@ -0,0 +1,26 @@
+# Role, Website Manager
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-01-24 10:18:47',
+		'docstatus': 0,
+		'modified': '2012-02-06 15:22:27',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
+	},
+
+	# These values are common for all Role
+	{
+		'doctype': 'Role',
+		'module': u'Website',
+		'name': '__common__',
+		'role_name': u'Website Manager'
+	},
+
+	# Role, Website Manager
+	{
+		'doctype': 'Role',
+		'name': u'Website Manager'
+	}
+]
\ No newline at end of file
diff --git a/erpnext/website/doctype/about_us_settings/about_us_settings.py b/erpnext/website/doctype/about_us_settings/about_us_settings.py
index 8a31ff0..770f1d2 100644
--- a/erpnext/website/doctype/about_us_settings/about_us_settings.py
+++ b/erpnext/website/doctype/about_us_settings/about_us_settings.py
@@ -14,11 +14,11 @@
 		path = os.path.join(os.path.dirname(__file__), 'template.html')
 		
 		self.doc.about_team = webnotes.conn.sql("""select * from `tabAbout Us Team` 
-			where parent='About Us Settings'""", as_dict=1)
+			where parent='About Us Settings' order by idx""", as_dict=1)
 		
 		import markdown2
 		for t in self.doc.about_team:
-			t['bio'] = markdown2.markdown(t['bio'])
+			t['bio'] = markdown2.markdown(t.get('bio') or '')
 		
 		webnotes.conn.set_value('Page', 'about', 'title', self.doc.headline)
 		webnotes.conn.set_value('Page', 'about', 'content', make_template(self.doc, path))
diff --git a/erpnext/website/doctype/product/product.py b/erpnext/website/doctype/product/product.py
index 935d762..5880d34 100644
--- a/erpnext/website/doctype/product/product.py
+++ b/erpnext/website/doctype/product/product.py
@@ -1,3 +1,5 @@
+import webnotes
+
 class DocType:
 	def __init__(self, d, dl):
 		self.doc, self.doclist = d, dl
@@ -24,4 +26,14 @@
 		
 		website.utils.add_guest_access_to_page(p.name)
 		self.doc.page_name = p.name
-		del self.doc.fields['long_description_html']
\ No newline at end of file
+		del self.doc.fields['long_description_html']
+		self.make_item_group_active()
+
+
+	def make_item_group_active(self):
+		"""show item group in website"""
+		if self.doc.published:
+			from webnotes.model.doc import Document
+			ig = Document('Item Group', webnotes.conn.get_value('Item', self.doc.item, 'item_group'))
+			ig.show_in_website = 1
+			ig.save()
diff --git a/erpnext/website/doctype/product/product.txt b/erpnext/website/doctype/product/product.txt
index fac4cfb..6258691 100644
--- a/erpnext/website/doctype/product/product.txt
+++ b/erpnext/website/doctype/product/product.txt
@@ -5,245 +5,245 @@
 	{
 		'creation': '2012-01-30 16:21:29',
 		'docstatus': 0,
-		'modified': '2012-01-31 13:46:23',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
+		'modified': '2012-02-06 16:15:29',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
 	},
 
 	# These values are common for all DocType
 	{
-		'_last_update': '1327995660',
+		'_last_update': u'1327997783',
 		'allow_attach': 1,
-		'autoname': 'field:item',
-		'colour': 'White:FFF',
-		'description': 'A Product is shown on the website and is linked to an item.',
+		'autoname': u'field:item',
+		'colour': u'White:FFF',
+		'description': u'A Product is shown on the website and is linked to an item.',
 		'doctype': 'DocType',
 		'max_attachments': 5,
-		'module': 'Website',
+		'module': u'Website',
 		'name': '__common__',
-		'section_style': 'Simple',
+		'section_style': u'Simple',
 		'show_in_menu': 0,
-		'version': 10
+		'version': 11
 	},
 
 	# These values are common for all DocField
 	{
-		'doctype': 'DocField',
+		'doctype': u'DocField',
 		'name': '__common__',
-		'parent': 'Product',
-		'parentfield': 'fields',
-		'parenttype': 'DocType'
+		'parent': u'Product',
+		'parentfield': u'fields',
+		'parenttype': u'DocType'
 	},
 
 	# These values are common for all DocPerm
 	{
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'name': '__common__',
-		'parent': 'Product',
-		'parentfield': 'permissions',
-		'parenttype': 'DocType',
+		'parent': u'Product',
+		'parentfield': u'permissions',
+		'parenttype': u'DocType',
 		'read': 1,
-		'role': 'Website Manager'
+		'role': u'Website Manager'
 	},
 
 	# DocType, Product
 	{
 		'doctype': 'DocType',
-		'name': 'Product'
+		'name': u'Product'
 	},
 
 	# DocPerm
 	{
 		'create': 1,
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'permlevel': 0,
 		'write': 1
 	},
 
 	# DocPerm
 	{
-		'doctype': 'DocPerm',
+		'doctype': u'DocPerm',
 		'permlevel': 1
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'doctype': 'DocField',
-		'fieldname': 'item',
-		'fieldtype': 'Link',
-		'label': 'Item',
-		'options': 'Item',
+		'colour': u'White:FFF',
+		'doctype': u'DocField',
+		'fieldname': u'item',
+		'fieldtype': u'Link',
+		'label': u'Item',
+		'options': u'Item',
 		'permlevel': 0,
 		'reqd': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'title',
-		'fieldtype': 'Link',
-		'label': 'Title',
+		'doctype': u'DocField',
+		'fieldname': u'title',
+		'fieldtype': u'Data',
+		'label': u'Title',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'published',
-		'fieldtype': 'Check',
-		'label': 'Published',
+		'doctype': u'DocField',
+		'fieldname': u'published',
+		'fieldtype': u'Check',
+		'label': u'Published',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'description': 'Select Price List for the web. Leave blank to hide price.',
-		'doctype': 'DocField',
-		'fieldname': 'price_list',
-		'fieldtype': 'Link',
-		'label': 'Price List',
-		'options': 'Price List',
+		'colour': u'White:FFF',
+		'description': u'Select Price List for the web. Leave blank to hide price.',
+		'doctype': u'DocField',
+		'fieldname': u'price_list',
+		'fieldtype': u'Link',
+		'label': u'Price List',
+		'options': u'Price List',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'description': 'Select shipping warehouse to show "In Stock" or "Out of Stock". To hide, leave blank',
-		'doctype': 'DocField',
-		'fieldname': 'warehouse',
-		'fieldtype': 'Link',
-		'label': 'Warehouse',
-		'options': 'Warehouse',
+		'colour': u'White:FFF',
+		'description': u'Select shipping warehouse to show "In Stock" or "Out of Stock". To hide, leave blank',
+		'doctype': u'DocField',
+		'fieldname': u'warehouse',
+		'fieldtype': u'Link',
+		'label': u'Warehouse',
+		'options': u'Warehouse',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldtype': 'Column Break',
+		'doctype': u'DocField',
+		'fieldtype': u'Column Break',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'description': 'Image for listing (Width: 100px) (Attach First)',
-		'doctype': 'DocField',
-		'fieldname': 'thumbnail_image',
-		'fieldtype': 'Select',
-		'label': 'Thumbnail Image',
-		'options': 'attach_files:',
+		'colour': u'White:FFF',
+		'description': u'Image for listing (Width: 100px) (Attach First)',
+		'doctype': u'DocField',
+		'fieldname': u'thumbnail_image',
+		'fieldtype': u'Select',
+		'label': u'Thumbnail Image',
+		'options': u'attach_files:',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'description': 'Image for listing (Width: 300px) (Attach First)',
-		'doctype': 'DocField',
-		'fieldname': 'full_image',
-		'fieldtype': 'Select',
-		'label': 'Full Image',
-		'options': 'attach_files:',
+		'colour': u'White:FFF',
+		'description': u'Image for listing (Width: 300px) (Attach First)',
+		'doctype': u'DocField',
+		'fieldname': u'full_image',
+		'fieldtype': u'Select',
+		'label': u'Full Image',
+		'options': u'attach_files:',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'doctype': 'DocField',
-		'fieldname': 'short_description',
-		'fieldtype': 'Text',
-		'label': 'Short Description',
+		'colour': u'White:FFF',
+		'doctype': u'DocField',
+		'fieldname': u'short_description',
+		'fieldtype': u'Text',
+		'label': u'Short Description',
 		'permlevel': 0,
 		'reqd': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldtype': 'Section Break',
+		'doctype': u'DocField',
+		'fieldtype': u'Section Break',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'description': 'Full description (formatted as markdown)',
-		'doctype': 'DocField',
-		'fieldname': 'long_description',
-		'fieldtype': 'Code',
-		'label': 'Long Description',
+		'colour': u'White:FFF',
+		'description': u'Full description (formatted as markdown)',
+		'doctype': u'DocField',
+		'fieldname': u'long_description',
+		'fieldtype': u'Code',
+		'label': u'Long Description',
 		'permlevel': 0,
 		'reqd': 0
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldtype': 'Section Break',
+		'doctype': u'DocField',
+		'fieldtype': u'Section Break',
 		'permlevel': 0
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'page_name',
-		'fieldtype': 'Data',
-		'label': 'Page Name',
+		'doctype': u'DocField',
+		'fieldname': u'page_name',
+		'fieldtype': u'Data',
+		'label': u'Page Name',
 		'permlevel': 1
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'doctype': 'DocField',
-		'fieldname': 'price',
-		'fieldtype': 'Currency',
+		'colour': u'White:FFF',
+		'doctype': u'DocField',
+		'fieldname': u'price',
+		'fieldtype': u'Currency',
 		'hidden': 0,
-		'label': 'Price',
+		'label': u'Price',
 		'permlevel': 1
 	},
 
 	# DocField
 	{
-		'colour': 'White:FFF',
-		'doctype': 'DocField',
-		'fieldname': 'sales',
-		'fieldtype': 'Currency',
-		'label': 'Sales',
+		'colour': u'White:FFF',
+		'doctype': u'DocField',
+		'fieldname': u'sales',
+		'fieldtype': u'Currency',
+		'label': u'Sales',
 		'permlevel': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'stock',
-		'fieldtype': 'Currency',
-		'label': 'Stock',
+		'doctype': u'DocField',
+		'fieldname': u'stock',
+		'fieldtype': u'Currency',
+		'label': u'Stock',
 		'permlevel': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'currency',
-		'fieldtype': 'Link',
-		'label': 'Currency',
-		'options': 'Currency',
+		'doctype': u'DocField',
+		'fieldname': u'currency',
+		'fieldtype': u'Link',
+		'label': u'Currency',
+		'options': u'Currency',
 		'permlevel': 1
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'file_list',
-		'fieldtype': 'Text',
+		'doctype': u'DocField',
+		'fieldname': u'file_list',
+		'fieldtype': u'Text',
 		'hidden': 1,
-		'label': 'File List',
+		'label': u'File List',
 		'no_copy': 1,
 		'permlevel': 0,
 		'print_hide': 1
diff --git a/erpnext/website/doctype/related_page/related_page.txt b/erpnext/website/doctype/related_page/related_page.txt
index 3cb674f..67a30b7 100644
--- a/erpnext/website/doctype/related_page/related_page.txt
+++ b/erpnext/website/doctype/related_page/related_page.txt
@@ -5,45 +5,45 @@
 	{
 		'creation': '2012-02-01 16:16:47',
 		'docstatus': 0,
-		'modified': '2012-02-01 16:16:48',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
+		'modified': '2012-02-06 12:24:29',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
 	},
 
 	# These values are common for all DocType
 	{
-		'colour': 'White:FFF',
+		'colour': u'White:FFF',
 		'doctype': 'DocType',
 		'istable': 1,
-		'module': 'Website',
+		'module': u'Website',
 		'name': '__common__',
-		'section_style': 'Simple',
+		'section_style': u'Simple',
 		'show_in_menu': 0,
-		'version': 1
+		'version': 3
 	},
 
 	# These values are common for all DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'page',
-		'fieldtype': 'Link',
-		'label': 'Page',
+		'doctype': u'DocField',
+		'fieldname': u'page',
+		'fieldtype': u'Link',
+		'label': u'Page',
 		'name': '__common__',
-		'options': 'Page',
-		'parent': 'Related Page',
-		'parentfield': 'fields',
-		'parenttype': 'DocType',
+		'options': u'Page',
+		'parent': u'Related Page',
+		'parentfield': u'fields',
+		'parenttype': u'DocType',
 		'permlevel': 0
 	},
 
 	# DocType, Related Page
 	{
 		'doctype': 'DocType',
-		'name': 'Related Page'
+		'name': u'Related Page'
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField'
+		'doctype': u'DocField'
 	}
 ]
\ No newline at end of file
diff --git a/erpnext/website/doctype/top_bar_item/top_bar_item.txt b/erpnext/website/doctype/top_bar_item/top_bar_item.txt
index 410352c..3ff23b3 100644
--- a/erpnext/website/doctype/top_bar_item/top_bar_item.txt
+++ b/erpnext/website/doctype/top_bar_item/top_bar_item.txt
@@ -5,70 +5,69 @@
 	{
 		'creation': '2012-01-24 10:24:19',
 		'docstatus': 0,
-		'modified': '2012-01-30 14:14:48',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
+		'modified': '2012-02-07 10:35:19',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
 	},
 
 	# These values are common for all DocType
 	{
-		'colour': 'White:FFF',
+		'colour': u'White:FFF',
 		'doctype': 'DocType',
 		'istable': 1,
-		'module': 'Website',
+		'module': u'Website',
 		'name': '__common__',
-		'section_style': 'Simple',
+		'section_style': u'Simple',
 		'show_in_menu': 0,
-		'version': 2
+		'version': 4
 	},
 
 	# These values are common for all DocField
 	{
-		'doctype': 'DocField',
+		'doctype': u'DocField',
 		'name': '__common__',
-		'parent': 'Top Bar Item',
-		'parentfield': 'fields',
-		'parenttype': 'DocType',
+		'parent': u'Top Bar Item',
+		'parentfield': u'fields',
+		'parenttype': u'DocType',
 		'permlevel': 0
 	},
 
 	# DocType, Top Bar Item
 	{
 		'doctype': 'DocType',
-		'name': 'Top Bar Item'
+		'name': u'Top Bar Item'
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'label',
-		'fieldtype': 'Data',
-		'label': 'Label'
+		'doctype': u'DocField',
+		'fieldname': u'label',
+		'fieldtype': u'Data',
+		'label': u'Label'
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'std_page',
-		'fieldtype': 'Select',
-		'label': 'Std Page',
-		'options': 'Home\nAbout\nContact\nProducts\nBlog\nCustom'
+		'doctype': u'DocField',
+		'fieldname': u'custom_page',
+		'fieldtype': u'Link',
+		'label': u'Page',
+		'options': u'Page'
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'custom_page',
-		'fieldtype': 'Link',
-		'label': 'Custom Page',
-		'options': 'Web Page'
+		'doctype': u'DocField',
+		'fieldname': u'url',
+		'fieldtype': u'Data',
+		'label': u'URL'
 	},
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldname': 'parent_label',
-		'fieldtype': 'Select',
-		'label': 'Parent Label'
+		'doctype': u'DocField',
+		'fieldname': u'parent_label',
+		'fieldtype': u'Select',
+		'label': u'Parent Label'
 	}
 ]
\ No newline at end of file
diff --git a/erpnext/website/doctype/web_page/web_page.py b/erpnext/website/doctype/web_page/web_page.py
index 14a082b..8f7c38f 100644
--- a/erpnext/website/doctype/web_page/web_page.py
+++ b/erpnext/website/doctype/web_page/web_page.py
@@ -37,10 +37,13 @@
 						"title": webnotes.conn.get_value("Page", self.doc.next_page, "title")}
 
 		self.doc.see_also = ''
-		for l in webnotes.conn.sql("""select distinct t1.page, t2.title from
-			`tabRelated Page` t1, tabPage t2 where
-			t1.page = t2.name order by t2.title""", as_dict=1):
-			self.doc.see_also += """<p><a href="#!%(page)s">%(title)s</a></p>""" % l
+		for d in self.doclist:
+			if d.doctype=='Related Page':
+				tmp = {"page":d.page, "title":webnotes.conn.get_value('Page', d.page, 'title')}
+				self.doc.see_also += """<li><a href="#!%(page)s">%(title)s</a></li>""" % tmp
+		
+		if self.doc.see_also:
+			self.doc.see_also = '<ul>%s</ul>' % self.doc.see_also
 		
 	def cleanup_temp(self):
 		"""cleanup temp fields"""
diff --git a/erpnext/website/js/topbar.js b/erpnext/website/js/topbar.js
index 8a7870c..cffc825 100644
--- a/erpnext/website/js/topbar.js
+++ b/erpnext/website/js/topbar.js
@@ -37,7 +37,7 @@
 		for(var i=0;i<items.length;i++) {
 			var item = items[i];
 			if(!item.parent_label && item.parentfield=='top_bar_items') {
-				item.route = item.std_page ? item.std_page.toLowerCase() : item.custom_page;
+				item.route = item.url || item.custom_page;
 				$('header .nav:first').append(repl('<li><a href="#!%(route)s" \
 					data-label="%(label)s">%(label)s</a></li>', item))
 			}
@@ -64,7 +64,7 @@
 		for(var i=0;i<items.length;i++) {
 			var item = items[i];
 			if(!item.parent_label && item.parentfield=='footer_items') {
-				item.route = item.std_page ? item.std_page.toLowerCase() : item.custom_page;
+				item.route = item.url || item.custom_page;
 				$('.web-footer-menu ul').append(repl('<li><a href="#!%(route)s" \
 					data-label="%(label)s">%(label)s</a></li>', item))
 			}
@@ -72,4 +72,4 @@
 	}
 });
 
-erpnext.footer = new erpnext.Footer();
\ No newline at end of file
+erpnext.footer = new erpnext.Footer();
diff --git a/erpnext/website/utils.py b/erpnext/website/utils.py
index 330f7a3..66be4d2 100644
--- a/erpnext/website/utils.py
+++ b/erpnext/website/utils.py
@@ -25,7 +25,8 @@
 def page_name(title):
 	"""make page name from title, and check that there is no duplicate"""
 	import re
-	name = re.sub('[~!@#$%^&*()<>,."\']', '', title.lower())
+	name = title.lower()
+	name = re.sub('[~!@#$%^&*()<>,."\']', '', name)
 	return '-'.join(name.split()[:4])
 	
 def add_page(title):
@@ -50,4 +51,4 @@
 		d = Document('Page Role')
 		d.parent = page
 		d.role = 'Guest'
-		d.save()
\ No newline at end of file
+		d.save()
diff --git a/index.cgi b/index.cgi
index a119dae..bc1de92 100755
--- a/index.cgi
+++ b/index.cgi
@@ -19,7 +19,13 @@
 		webnotes.form_dict[key] = webnotes.form.getvalue(key)
 
 	# init request
-	webnotes.http_request = webnotes.auth.HTTPRequest()
+	try:
+		webnotes.http_request = webnotes.auth.HTTPRequest()
+	except Exception, e:
+		if webnotes.response['message']=='Authentication Failed':
+			pass
+		else:
+			raise e
 
 def respond():
 	import webnotes
@@ -34,4 +40,4 @@
 
 if __name__=="__main__":
 	init()
-	respond()
\ No newline at end of file
+	respond()
diff --git a/version.num b/version.num
index 6fa50e7..cf7ff50 100644
--- a/version.num
+++ b/version.num
@@ -1 +1 @@
-353
+359
diff --git a/wnf.py b/wnf.py
new file mode 100755
index 0000000..355474f
--- /dev/null
+++ b/wnf.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python
+
+import os, sys
+
+def replace_code(start, txt1, txt2, extn):
+	"""replace all txt1 by txt2 in files with extension (extn)"""
+	import os, re
+	for wt in os.walk(start, followlinks=1):
+		for fn in wt[2]:
+			if fn.split('.')[-1]==extn:
+				fpath = os.path.join(wt[0], fn)
+				with open(fpath, 'r') as f:
+					content = f.read()
+				
+				if re.search(txt1, content):
+					a = raw_input('Change in %s [y/n]?' % fpath)
+					if a=='y':
+						with open(fpath, 'w') as f:
+							f.write(re.sub(txt1, txt2, content))
+				
+						print 'updated in %s' % fpath
+
+def setup_options():
+	from optparse import OptionParser
+	parser = OptionParser()
+	parser.add_option("-b", "--build", default=False, action="store_true",
+						help="minify + concat js files")
+	parser.add_option("-c", "--clear", default=False, action="store_true",
+						help="increment version")
+	parser.add_option("--replace", nargs=3, default=False, 
+						metavar = "search replace_by extension",
+						help="file search-replace")
+	parser.add_option("--status", default=False, action="store_true",
+						help="git status")
+	parser.add_option("--pull", nargs=2, default=False,
+						metavar = "remote branch",
+						help="git pull (both repos)")
+	parser.add_option("--push", nargs=3, default=False, 
+						metavar = "remote branch comment",
+						help="git commit + push (both repos) [remote] [branch] [comment]")
+	parser.add_option("-l", "--latest",
+						action="store_true", dest="run_latest", default=False,
+						help="Apply the latest patches")
+	parser.add_option("-p", "--patch", nargs=1, dest="patch_list", metavar='patch_module',
+						action="append",
+						help="Apply patch")
+	parser.add_option("-f", "--force",
+						action="store_true", dest="force", default=False,
+						help="Force Apply all patches specified using option -p or --patch")
+	parser.add_option("-d", "--db",
+						dest="db_name",
+						help="Apply the patches on given db")
+	parser.add_option('--reload_doc', nargs=3, metavar = "module doctype docname",
+						help="reload doc")
+	
+	return parser.parse_args()
+	
+def run():
+	sys.path.append('lib')
+	sys.path.append('lib/py')
+	import webnotes
+	import webnotes.defs
+	sys.path.append(webnotes.defs.modules_path)
+
+	(options, args) = setup_options()
+
+
+	from webnotes.db import Database
+	import webnotes.modules.patch_handler
+
+	# connect
+	if options.db_name is not None:
+		webnotes.connect(options.db_name)
+
+	# build
+	if options.build:
+		import build.project
+		build.project.build()		
+
+	elif options.clear:
+		from build.project import increment_version
+		print "Version:" + str(increment_version())
+	
+	# code replace
+	elif options.replace:
+		replace_code('.', options.replace[0], options.replace[1], options.replace[2])
+	
+	# git
+	elif options.status:
+		os.system('git status')
+		os.chdir('lib')
+		os.system('git status')
+	
+	elif options.pull:
+		os.system('git pull %s %s' % (options.pull[0], options.pull[1]))
+		os.chdir('lib')
+		os.system('git pull %s %s' % (options.pull[0], options.pull[1]))
+
+	elif options.push:
+		os.system('git commit -a -m "%s"' % options.push[2])
+		os.system('git push %s %s' % (options.push[0], options.push[1]))
+		os.chdir('lib')
+		os.system('git commit -a -m "%s"' % options.push[2])
+		os.system('git push %s %s' % (options.push[0], options.push[1]))
+	
+	# patch
+	elif options.patch_list:
+		# clear log
+		webnotes.modules.patch_handler.log_list = []
+		
+		# run individual patches
+		for patch in options.patch_list:
+			webnotes.modules.patch_handler.run_single(\
+				patchmodule = patch, force = options.force)
+		
+		print '\n'.join(webnotes.modules.patch_handler.log_list)
+	
+		# reload
+	elif options.reload_doc:
+		webnotes.modules.patch_handler.reload_doc(\
+			{"module":options.reload_doc[0], "dt":options.reload_doc[1], "dn":options.reload_doc[2]})		
+		print '\n'.join(webnotes.modules.patch_handler.log_list)
+
+	# run all pending
+	elif options.run_latest:
+		webnotes.modules.patch_handler.run_all()
+		print '\n'.join(webnotes.modules.patch_handler.log_list)
+	
+	# print messages
+	if webnotes.message_log:
+		print '\n'.join(webnotes.message_log)
+
+if __name__=='__main__':
+	run()