[website] [minor] moving to framework
diff --git a/website/templates/pages/blog.html b/website/doctype/blog_post/templates/blog.html
similarity index 100%
rename from website/templates/pages/blog.html
rename to website/doctype/blog_post/templates/blog.html
diff --git a/website/templates/html/blog_page.html b/website/doctype/blog_post/templates/blog_post.html
similarity index 100%
rename from website/templates/html/blog_page.html
rename to website/doctype/blog_post/templates/blog_post.html
diff --git a/website/templates/html/blog_footer.html b/website/doctype/blog_post/templates/includes/blog_footer.html
similarity index 100%
rename from website/templates/html/blog_footer.html
rename to website/doctype/blog_post/templates/includes/blog_footer.html
diff --git a/website/templates/html/blog_subscribe.html b/website/doctype/blog_post/templates/includes/blog_subscribe.html
similarity index 100%
rename from website/templates/html/blog_subscribe.html
rename to website/doctype/blog_post/templates/includes/blog_subscribe.html
diff --git a/website/templates/html/blogger.html b/website/doctype/blog_post/templates/includes/blogger.html
similarity index 100%
rename from website/templates/html/blogger.html
rename to website/doctype/blog_post/templates/includes/blogger.html
diff --git a/website/templates/html/comment.html b/website/doctype/blog_post/templates/includes/comment.html
similarity index 100%
rename from website/templates/html/comment.html
rename to website/doctype/blog_post/templates/includes/comment.html
diff --git a/website/templates/pages/writers.html b/website/doctype/blogger/templates/writers.html
similarity index 100%
rename from website/templates/pages/writers.html
rename to website/doctype/blogger/templates/writers.html
diff --git a/website/helpers/cart.py b/website/helpers/cart.py
deleted file mode 100644
index fc7d062..0000000
--- a/website/helpers/cart.py
+++ /dev/null
@@ -1,462 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import webnotes
-from webnotes import msgprint, _
-import webnotes.defaults
-from webnotes.utils import flt, get_fullname, fmt_money, cstr
-
-class WebsitePriceListMissingError(webnotes.ValidationError): pass
-
-def set_cart_count(quotation=None):
-	if not quotation:
-		quotation = _get_cart_quotation()
-	webnotes.add_cookies["cart_count"] = cstr(len(quotation.doclist.get(
-		{"parentfield": "quotation_details"})) or "")
-
-@webnotes.whitelist()
-def get_cart_quotation(doclist=None):
-	party = get_lead_or_customer()
-	
-	if not doclist:
-		quotation = _get_cart_quotation(party)
-		doclist = quotation.doclist
-		set_cart_count(quotation)
-	
-	return {
-		"doclist": decorate_quotation_doclist(doclist),
-		"addresses": [{"name": address.name, "display": address.display} 
-			for address in get_address_docs(party)],
-		"shipping_rules": get_applicable_shipping_rules(party)
-	}
-	
-@webnotes.whitelist()
-def place_order():
-	quotation = _get_cart_quotation()
-	controller = quotation.make_controller()
-	for fieldname in ["customer_address", "shipping_address_name"]:
-		if not quotation.doc.fields.get(fieldname):
-			msgprint(_("Please select a") + " " + _(controller.meta.get_label(fieldname)), raise_exception=True)
-	
-	quotation.ignore_permissions = True
-	quotation.submit()
-	
-	from selling.doctype.quotation.quotation import _make_sales_order
-	sales_order = webnotes.bean(_make_sales_order(quotation.doc.name, ignore_permissions=True))
-	sales_order.ignore_permissions = True
-	sales_order.insert()
-	sales_order.submit()
-	webnotes.add_cookies["cart_count"] = ""
-	
-	return sales_order.doc.name
-
-@webnotes.whitelist()
-def update_cart(item_code, qty, with_doclist=0):
-	quotation = _get_cart_quotation()
-	
-	qty = flt(qty)
-	if qty == 0:
-		quotation.set_doclist(quotation.doclist.get({"item_code": ["!=", item_code]}))
-		if not quotation.doclist.get({"parentfield": "quotation_details"}) and \
-			not quotation.doc.fields.get("__islocal"):
-				quotation.__delete = True
-			
-	else:
-		quotation_items = quotation.doclist.get({"item_code": item_code})
-		if not quotation_items:
-			quotation.doclist.append({
-				"doctype": "Quotation Item",
-				"parentfield": "quotation_details",
-				"item_code": item_code,
-				"qty": qty
-			})
-		else:
-			quotation_items[0].qty = qty
-	
-	apply_cart_settings(quotation=quotation)
-
-	if hasattr(quotation, "__delete"):
-		webnotes.delete_doc("Quotation", quotation.doc.name, ignore_permissions=True)
-		quotation = _get_cart_quotation()
-	else:
-		quotation.ignore_permissions = True
-		quotation.save()
-	
-	set_cart_count(quotation)
-	
-	if with_doclist:
-		return get_cart_quotation(quotation.doclist)
-	else:
-		return quotation.doc.name
-		
-@webnotes.whitelist()
-def update_cart_address(address_fieldname, address_name):
-	from utilities.transaction_base import get_address_display
-	
-	quotation = _get_cart_quotation()
-	address_display = get_address_display(webnotes.doc("Address", address_name).fields)
-	
-	if address_fieldname == "shipping_address_name":
-		quotation.doc.shipping_address_name = address_name
-		quotation.doc.shipping_address = address_display
-		
-		if not quotation.doc.customer_address:
-			address_fieldname == "customer_address"
-	
-	if address_fieldname == "customer_address":
-		quotation.doc.customer_address = address_name
-		quotation.doc.address_display = address_display
-		
-	
-	apply_cart_settings(quotation=quotation)
-	
-	quotation.ignore_permissions = True
-	quotation.save()
-		
-	return get_cart_quotation(quotation.doclist)
-
-@webnotes.whitelist()
-def get_addresses():
-	return [d.fields for d in get_address_docs()]
-	
-@webnotes.whitelist()
-def save_address(fields, address_fieldname=None):
-	party = get_lead_or_customer()
-	fields = webnotes.load_json(fields)
-	
-	if fields.get("name"):
-		bean = webnotes.bean("Address", fields.get("name"))
-	else:
-		bean = webnotes.bean({"doctype": "Address", "__islocal": 1})
-	
-	bean.doc.fields.update(fields)
-	
-	party_fieldname = party.doctype.lower()
-	bean.doc.fields.update({
-		party_fieldname: party.name,
-		(party_fieldname + "_name"): party.fields[party_fieldname + "_name"]
-	})
-	bean.ignore_permissions = True
-	bean.save()
-	
-	if address_fieldname:
-		update_cart_address(address_fieldname, bean.doc.name)
-	
-	return bean.doc.name
-	
-def get_address_docs(party=None):
-	from webnotes.model.doclist import objectify
-	from utilities.transaction_base import get_address_display
-	
-	if not party:
-		party = get_lead_or_customer()
-		
-	address_docs = objectify(webnotes.conn.sql("""select * from `tabAddress`
-		where `%s`=%s order by name""" % (party.doctype.lower(), "%s"), party.name, 
-		as_dict=True, update={"doctype": "Address"}))
-	
-	for address in address_docs:
-		address.display = get_address_display(address.fields)
-		address.display = (address.display).replace("\n", "<br>\n")
-		
-	return address_docs
-	
-def get_lead_or_customer():
-	customer = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user}, "customer")
-	if customer:
-		return webnotes.doc("Customer", customer)
-	
-	lead = webnotes.conn.get_value("Lead", {"email_id": webnotes.session.user})
-	if lead:
-		return webnotes.doc("Lead", lead)
-	else:
-		lead_bean = webnotes.bean({
-			"doctype": "Lead",
-			"email_id": webnotes.session.user,
-			"lead_name": get_fullname(webnotes.session.user),
-			"territory": guess_territory(),
-			"status": "Open" # TODO: set something better???
-		})
-		
-		if webnotes.session.user != "Guest":
-			lead_bean.ignore_permissions = True
-			lead_bean.insert()
-			
-		return lead_bean.doc
-		
-def guess_territory():
-	territory = None
-	geoip_country = webnotes.session.get("session_country")
-	if geoip_country:
-		territory = webnotes.conn.get_value("Territory", geoip_country)
-	
-	return territory or \
-		webnotes.conn.get_value("Shopping Cart Settings", None, "territory") or \
-		"All Territories"
-
-def decorate_quotation_doclist(doclist):
-	for d in doclist:
-		if d.item_code:
-			d.fields.update(webnotes.conn.get_value("Item", d.item_code, 
-				["website_image", "description", "page_name"], as_dict=True))
-			d.formatted_rate = fmt_money(d.export_rate, currency=doclist[0].currency)
-			d.formatted_amount = fmt_money(d.export_amount, currency=doclist[0].currency)
-		elif d.charge_type:
-			d.formatted_tax_amount = fmt_money(d.tax_amount / doclist[0].conversion_rate,
-				currency=doclist[0].currency)
-
-	doclist[0].formatted_grand_total_export = fmt_money(doclist[0].grand_total_export,
-		currency=doclist[0].currency)
-	
-	return [d.fields for d in doclist]
-
-def _get_cart_quotation(party=None):
-	if not party:
-		party = get_lead_or_customer()
-		
-	quotation = webnotes.conn.get_value("Quotation", 
-		{party.doctype.lower(): party.name, "order_type": "Shopping Cart", "docstatus": 0})
-	
-	if quotation:
-		qbean = webnotes.bean("Quotation", quotation)
-	else:
-		qbean = webnotes.bean({
-			"doctype": "Quotation",
-			"naming_series": webnotes.defaults.get_user_default("shopping_cart_quotation_series") or "QTN-CART-",
-			"quotation_to": party.doctype,
-			"company": webnotes.defaults.get_user_default("company"),
-			"order_type": "Shopping Cart",
-			"status": "Draft",
-			"docstatus": 0,
-			"__islocal": 1,
-			(party.doctype.lower()): party.name
-		})
-		
-		if party.doctype == "Customer":
-			qbean.doc.contact_person = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user,
-				"customer": party.name})
-			qbean.run_method("set_contact_fields")
-		
-		qbean.run_method("onload_post_render")
-		apply_cart_settings(party, qbean)
-	
-	return qbean
-
-def update_party(fullname, company_name=None, mobile_no=None, phone=None):
-	party = get_lead_or_customer()
-
-	if party.doctype == "Lead":
-		party.company_name = company_name
-		party.lead_name = fullname
-		party.mobile_no = mobile_no
-		party.phone = phone
-	else:
-		party.customer_name = company_name or fullname
-		party.customer_type == "Company" if company_name else "Individual"
-		
-		contact_name = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user,
-			"customer": party.name})
-		contact = webnotes.bean("Contact", contact_name)
-		contact.doc.first_name = fullname
-		contact.doc.last_name = None
-		contact.doc.customer_name = party.customer_name
-		contact.doc.mobile_no = mobile_no
-		contact.doc.phone = phone
-		contact.ignore_permissions = True
-		contact.save()
-	
-	party_bean = webnotes.bean(party.fields)
-	party_bean.ignore_permissions = True
-	party_bean.save()
-	
-	qbean = _get_cart_quotation(party)
-	if not qbean.doc.fields.get("__islocal"):
-		qbean.doc.customer_name = company_name or fullname
-		qbean.run_method("set_contact_fields")
-		qbean.ignore_permissions = True
-		qbean.save()
-
-def apply_cart_settings(party=None, quotation=None):
-	if not party:
-		party = get_lead_or_customer()
-	if not quotation:
-		quotation = _get_cart_quotation(party)
-	
-	cart_settings = webnotes.get_obj("Shopping Cart Settings")
-	
-	billing_territory = get_address_territory(quotation.doc.customer_address) or \
-		party.territory
-		
-	set_price_list_and_rate(quotation, cart_settings, billing_territory)
-	
-	quotation.run_method("calculate_taxes_and_totals")
-	
-	set_taxes(quotation, cart_settings, billing_territory)
-	
-	_apply_shipping_rule(party, quotation, cart_settings)
-	
-def set_price_list_and_rate(quotation, cart_settings, billing_territory):
-	"""set price list based on billing territory"""
-	quotation.doc.selling_price_list = cart_settings.get_price_list(billing_territory)
-	
-	# reset values
-	quotation.doc.price_list_currency = quotation.doc.currency = \
-		quotation.doc.plc_conversion_rate = quotation.doc.conversion_rate = None
-	for item in quotation.doclist.get({"parentfield": "quotation_details"}):
-		item.ref_rate = item.adj_rate = item.export_rate = item.export_amount = None
-	
-	# refetch values
-	quotation.run_method("set_price_list_and_item_details")
-	
-	# set it in cookies for using in product page
-	webnotes.cookies[b"selling_price_list"] = quotation.doc.selling_price_list
-	
-def set_taxes(quotation, cart_settings, billing_territory):
-	"""set taxes based on billing territory"""
-	quotation.doc.charge = cart_settings.get_tax_master(billing_territory)
-
-	# clear table
-	quotation.set_doclist(quotation.doclist.get({"parentfield": ["!=", "other_charges"]}))
-	
-	# append taxes
-	controller = quotation.make_controller()
-	controller.append_taxes_from_master("other_charges", "charge")
-	quotation.set_doclist(controller.doclist)
-
-@webnotes.whitelist()
-def apply_shipping_rule(shipping_rule):
-	quotation = _get_cart_quotation()
-	
-	quotation.doc.shipping_rule = shipping_rule
-	
-	apply_cart_settings(quotation=quotation)
-	
-	quotation.ignore_permissions = True
-	quotation.save()
-	
-	return get_cart_quotation(quotation.doclist)
-	
-def _apply_shipping_rule(party=None, quotation=None, cart_settings=None):
-	shipping_rules = get_shipping_rules(party, quotation, cart_settings)
-	
-	if not shipping_rules:
-		return
-		
-	elif quotation.doc.shipping_rule not in shipping_rules:
-		quotation.doc.shipping_rule = shipping_rules[0]
-	
-	quotation.run_method("apply_shipping_rule")
-	quotation.run_method("calculate_taxes_and_totals")
-	
-def get_applicable_shipping_rules(party=None, quotation=None):
-	shipping_rules = get_shipping_rules(party, quotation)
-	
-	if shipping_rules:
-		rule_label_map = webnotes.conn.get_values("Shipping Rule", shipping_rules, "label")
-		# we need this in sorted order as per the position of the rule in the settings page
-		return [[rule, rule_label_map.get(rule)] for rule in shipping_rules]
-		
-def get_shipping_rules(party=None, quotation=None, cart_settings=None):
-	if not party:
-		party = get_lead_or_customer()
-	if not quotation:
-		quotation = _get_cart_quotation()
-	if not cart_settings:
-		cart_settings = webnotes.get_obj("Shopping Cart Settings")
-		
-	# set shipping rule based on shipping territory	
-	shipping_territory = get_address_territory(quotation.doc.shipping_address_name) or \
-		party.territory
-	
-	shipping_rules = cart_settings.get_shipping_rules(shipping_territory)
-	
-	return shipping_rules
-	
-def get_address_territory(address_name):
-	"""Tries to match city, state and country of address to existing territory"""
-	territory = None
-
-	if address_name:
-		address_fields = webnotes.conn.get_value("Address", address_name, 
-			["city", "state", "country"])
-		for value in address_fields:
-			territory = webnotes.conn.get_value("Territory", value)
-			if territory:
-				break
-	
-	return territory
-	
-import unittest
-test_dependencies = ["Item", "Price List", "Contact", "Shopping Cart Settings"]
-
-class TestCart(unittest.TestCase):
-	def tearDown(self):
-		return
-		
-		cart_settings = webnotes.bean("Shopping Cart Settings")
-		cart_settings.ignore_permissions = True
-		cart_settings.doc.enabled = 0
-		cart_settings.save()
-	
-	def enable_shopping_cart(self):
-		return
-		if not webnotes.conn.get_value("Shopping Cart Settings", None, "enabled"):
-			cart_settings = webnotes.bean("Shopping Cart Settings")
-			cart_settings.ignore_permissions = True
-			cart_settings.doc.enabled = 1
-			cart_settings.save()
-			
-	def test_get_lead_or_customer(self):
-		webnotes.session.user = "test@example.com"
-		party1 = get_lead_or_customer()
-		party2 = get_lead_or_customer()
-		self.assertEquals(party1.name, party2.name)
-		self.assertEquals(party1.doctype, "Lead")
-		
-		webnotes.session.user = "test_contact_customer@example.com"
-		party = get_lead_or_customer()
-		self.assertEquals(party.name, "_Test Customer")
-		
-	def test_add_to_cart(self):
-		self.enable_shopping_cart()
-		webnotes.session.user = "test@example.com"
-		
-		update_cart("_Test Item", 1)
-		
-		quotation = _get_cart_quotation()
-		quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"})
-		self.assertTrue(quotation_items)
-		self.assertEquals(quotation_items[0].qty, 1)
-		
-		return quotation
-		
-	def test_update_cart(self):
-		self.test_add_to_cart()
-
-		update_cart("_Test Item", 5)
-		
-		quotation = _get_cart_quotation()
-		quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"})
-		self.assertTrue(quotation_items)
-		self.assertEquals(quotation_items[0].qty, 5)
-		
-		return quotation
-		
-	def test_remove_from_cart(self):
-		quotation0 = self.test_add_to_cart()
-		
-		update_cart("_Test Item", 0)
-		
-		quotation = _get_cart_quotation()
-		self.assertEquals(quotation0.doc.name, quotation.doc.name)
-		
-		quotation_items = quotation.doclist.get({"parentfield": "quotation_details", "item_code": "_Test Item"})
-		self.assertEquals(quotation_items, [])
-		
-	def test_place_order(self):
-		quotation = self.test_update_cart()
-		sales_order_name = place_order()
-		sales_order = webnotes.bean("Sales Order", sales_order_name)
-		self.assertEquals(sales_order.doclist.getone({"item_code": "_Test Item"}).prevdoc_docname, quotation.doc.name)
-		
\ No newline at end of file
diff --git a/website/helpers/contact.py b/website/helpers/contact.py
deleted file mode 100644
index 35446a3..0000000
--- a/website/helpers/contact.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-
-import webnotes
-from webnotes.utils import now
-
-max_communications_per_hour = 300
-
-@webnotes.whitelist(allow_guest=True)
-def send_message(subject="Website Query", message="", sender="", status="Open"):
-	if not message:
-		webnotes.response["message"] = 'Please write something'
-		return
-		
-	if not sender:
-		webnotes.response["message"] = 'Email Id Required'
-		return
-
-	# make lead / communication
-	from selling.doctype.lead.get_leads import add_sales_communication
-	message = add_sales_communication(subject or "Website Query", message, sender, sender, 
-		mail=None, status=status)
-	
-	# guest method, cap max writes per hour
-	if webnotes.conn.sql("""select count(*) from `tabCommunication`
-		where TIMEDIFF(%s, modified) < '01:00:00'""", now())[0][0] > max_communications_per_hour:
-		webnotes.response["message"] = "Sorry: we believe we have received an unreasonably high number of requests of this kind. Please try later"
-		return
-	
-	webnotes.response.status = "okay"
diff --git a/website/helpers/product.py b/website/helpers/product.py
deleted file mode 100644
index 031339a..0000000
--- a/website/helpers/product.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-
-import webnotes
-from webnotes.utils import cstr, cint, fmt_money
-from webnotes.webutils import build_html, delete_page_cache
-from website.helpers.cart import _get_cart_quotation
-
-@webnotes.whitelist(allow_guest=True)
-def get_product_info(item_code):
-	"""get product price / stock info"""
-	if not cint(webnotes.conn.get_default("shopping_cart_enabled")):
-		return {}
-	
-	cart_quotation = _get_cart_quotation()
-	
-	price_list = webnotes.cookies.get("selling_price_list").value
-
-	warehouse = webnotes.conn.get_value("Item", item_code, "website_warehouse")
-	if warehouse:
-		in_stock = webnotes.conn.sql("""select actual_qty from tabBin where
-			item_code=%s and warehouse=%s""", (item_code, warehouse))
-		if in_stock:
-			in_stock = in_stock[0][0] > 0 and 1 or 0
-	else:
-		in_stock = -1
-		
-	price = price_list and webnotes.conn.sql("""select ref_rate, ref_currency from
-		`tabItem Price` where parent=%s and price_list=%s""", 
-		(item_code, price_list), as_dict=1) or []
-	
-	price = price and price[0] or None
-	qty = 0
-
-	if price:
-		price["formatted_price"] = fmt_money(price["ref_rate"], currency=price["ref_currency"])
-		
-		price["ref_currency"] = not cint(webnotes.conn.get_default("hide_currency_symbol")) \
-			and (webnotes.conn.get_value("Currency", price.ref_currency, "symbol") or price.ref_currency) \
-			or ""
-		
-		if webnotes.session.user != "Guest":
-			item = cart_quotation.doclist.get({"item_code": item_code})
-			if item:
-				qty = item[0].qty
-
-	return {
-		"price": price,
-		"stock": in_stock,
-		"uom": webnotes.conn.get_value("Item", item_code, "stock_uom"),
-		"qty": qty
-	}
-
-@webnotes.whitelist(allow_guest=True)
-def get_product_list(search=None, start=0, limit=10):
-	# base query
-	query = """select name, item_name, page_name, website_image, item_group, 
-			web_long_description as website_description
-		from `tabItem` where docstatus = 0 and show_in_website = 1 """
-	
-	# search term condition
-	if search:
-		query += """and (web_long_description like %(search)s or
-				item_name like %(search)s or name like %(search)s)"""
-		search = "%" + cstr(search) + "%"
-	
-	# order by
-	query += """order by weightage desc, modified desc limit %s, %s""" % (start, limit)
-
-	data = webnotes.conn.sql(query, {
-		"search": search,
-	}, as_dict=1)
-	
-	return [get_item_for_list_in_html(r) for r in data]
-
-
-def get_product_list_for_group(product_group=None, start=0, limit=10):
-	child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(product_group)])
-
-	# base query
-	query = """select name, item_name, page_name, website_image, item_group, 
-			web_long_description as website_description
-		from `tabItem` where docstatus = 0 and show_in_website = 1
-		and (item_group in (%s)
-			or name in (select parent from `tabWebsite Item Group` where item_group in (%s))) """ % (child_groups, child_groups)
-	
-	query += """order by weightage desc, modified desc limit %s, %s""" % (start, limit)
-
-	data = webnotes.conn.sql(query, {"product_group": product_group}, as_dict=1)
-
-	return [get_item_for_list_in_html(r) for r in data]
-
-def get_child_groups(item_group_name):
-	item_group = webnotes.doc("Item Group", item_group_name)
-	return webnotes.conn.sql("""select name 
-		from `tabItem Group` where lft>=%(lft)s and rgt<=%(rgt)s
-			and show_in_website = 1""", item_group.fields)
-
-def get_group_item_count(item_group):
-	child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(item_group)])
-	return webnotes.conn.sql("""select count(*) from `tabItem` 
-		where docstatus = 0 and show_in_website = 1
-		and (item_group in (%s)
-			or name in (select parent from `tabWebsite Item Group` 
-				where item_group in (%s))) """ % (child_groups, child_groups))[0][0]
-
-def get_item_for_list_in_html(r):
-	scrub_item_for_list(r)
-	r.template = "app/website/templates/html/product_in_grid.html"
-	return build_html(r)
-
-def scrub_item_for_list(r):
-	if not r.website_description:
-		r.website_description = "No description given"
-	if len(r.website_description.split(" ")) > 24:
-		r.website_description = " ".join(r.website_description.split(" ")[:24]) + "..."
-
-def get_parent_item_groups(item_group_name):
-	item_group = webnotes.doc("Item Group", item_group_name)
-	return webnotes.conn.sql("""select name, page_name from `tabItem Group`
-		where lft <= %s and rgt >= %s 
-		and ifnull(show_in_website,0)=1
-		order by lft asc""", (item_group.lft, item_group.rgt), as_dict=True)
-		
-def invalidate_cache_for(item_group):
-	for i in get_parent_item_groups(item_group):
-		if i.page_name:
-			delete_page_cache(i.page_name)
\ No newline at end of file
diff --git a/website/helpers/transaction.py b/website/helpers/transaction.py
deleted file mode 100644
index 8943575..0000000
--- a/website/helpers/transaction.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import webnotes
-from webnotes.utils import cint, formatdate
-import json
-
-def get_transaction_list(doctype, start):
-	# find customer id
-	customer = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user}, 
-		"customer")
-		
-	if customer:
-		transactions = webnotes.conn.sql("""select name, creation, currency, grand_total_export 
-			from `tab%s` where customer=%s and docstatus=1
-			order by creation desc
-			limit %s, 20""" % (doctype, "%s", "%s"), (customer, cint(start)), as_dict=True)
-		for doc in transactions:
-			doc.items = ", ".join(webnotes.conn.sql_list("""select item_name
-				from `tab%s Item` where parent=%s limit 5""" % (doctype, "%s"), doc.name))
-			doc.creation = formatdate(doc.creation)
-		return transactions
-	else:
-		return []
-		
-def get_common_args():
-	return {
-		"global_number_format": webnotes.conn.get_default("number_format") or "#,###.##",
-		"currency": webnotes.conn.get_default("currency"),
-		"currency_symbols": json.dumps(dict(webnotes.conn.sql("""select name, symbol
-			from tabCurrency where ifnull(enabled,0)=1""")))
-	}
-
-@webnotes.whitelist()
-def get_orders(start=0):
-	return get_transaction_list("Sales Order", start)
-		
-def order_list_args():
-	args = get_common_args()
-	args.update({
-		"title": "My Orders",
-		"method": "website.helpers.transaction.get_orders",
-		"icon": "icon-list",
-		"empty_list_message": "No Orders Yet",
-		"page": "order",
-	})
-	return args
-
-@webnotes.whitelist()
-def get_invoices(start=0):
-	return get_transaction_list("Sales Invoice", start)
-
-def invoice_list_args():
-	args = get_common_args()
-	args.update({
-		"title": "Invoices",
-		"method": "website.helpers.transaction.get_invoices",
-		"icon": "icon-file-text",
-		"empty_list_message": "No Invoices Found",
-		"page": "invoice"
-	})
-	return args
-
-@webnotes.whitelist()
-def get_shipments(start=0):
-	return get_transaction_list("Delivery Note", start)
-
-def shipment_list_args():
-	args = get_common_args()
-	args.update({
-		"title": "Shipments",
-		"method": "website.helpers.transaction.get_shipments",
-		"icon": "icon-truck",
-		"empty_list_message": "No Shipments Found",
-		"page": "shipment"
-	})
-	return args
-	
-@webnotes.whitelist()
-def get_tickets(start=0):
-	tickets = webnotes.conn.sql("""select name, subject, status, creation 
-		from `tabSupport Ticket` where raised_by=%s 
-		order by modified desc
-		limit %s, 20""", (webnotes.session.user, cint(start)), as_dict=True)
-	for t in tickets:
-		t.creation = formatdate(t.creation)
-	
-	return tickets
-	
-def ticket_list_args():
-	return {
-		"title": "My Tickets",
-		"method": "website.helpers.transaction.get_tickets",
-		"icon": "icon-ticket",
-		"empty_list_message": "No Tickets Raised",
-		"page": "ticket"
-	}
-	
-def get_transaction_args(doctype, name):
-	customer = webnotes.conn.get_value("Contact", {"email_id": webnotes.session.user}, 
-		"customer")
-		
-	bean = webnotes.bean(doctype, name)
-	if bean.doc.customer != customer:
-		return {
-			"doc": {"name": "Not Allowed"}
-		}
-	else:
-		return {
-			"doc": bean.doc,
-			"doclist": bean.doclist,
-			"webnotes": webnotes,
-			"utils": webnotes.utils
-		}
-
-def get_order_args():	
-	args = get_transaction_args("Sales Order", webnotes.form_dict.name)
-	args.update({
-		"parent_link": "orders",
-		"parent_title": "My Orders"
-	})
-	return args
-	
-def get_invoice_args():
-	args = get_transaction_args("Sales Invoice", webnotes.form_dict.name)
-	args.update({
-		"parent_link": "invoices",
-		"parent_title": "Invoices"
-	})
-	return args
-
-def get_shipment_args():
-	args = get_transaction_args("Delivery Note", webnotes.form_dict.name)
-	args.update({
-		"parent_link": "shipments",
-		"parent_title": "Shipments"
-	})
-	return args
diff --git a/website/templates/html/partner_page.html b/website/templates/html/partner_page.html
deleted file mode 100644
index e5aac35..0000000
--- a/website/templates/html/partner_page.html
+++ /dev/null
@@ -1,26 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% block content %}
-	<div class="col-md-12" itemscope itemtype="http://schema.org/Organization">
-		<div class="row">
-			<div class="col-md-4">
-				{% if logo -%}
-				<img itemprop="brand" src="{{ logo }}" class="partner-logo" 
-					alt="{{ partner_name }}" title="{{ partner_name }}" />
-				<br><br>
-				{%- endif %}
-				<address>
-					{% if partner_website -%}<p><a href="{{ partner_website }}" 
-						target="_blank">{{ partner_website }}</a></p>{%- endif %}
-					{% if partner_address -%}<p itemprop="address">{{ partner_address }}</p>{%- endif %}
-					{% if phone -%}<p itemprop="telephone">{{ phone }}</p>{%- endif %}
-					{% if email -%}<p itemprop="email"><span class="icon-envelope"></span> {{ email }}</p>{%- endif %}
-				</address>
-			</div>
-			<div class="col-md-8">
-				<h3 itemprop="name" style="margin-top: 0px;">{{ partner_name }}</h3>
-				<p>{{ description }}</p>
-			</div>
-		</div>
-	</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/html/product_breadcrumbs.html b/website/templates/html/product_breadcrumbs.html
deleted file mode 100644
index 6d26748..0000000
--- a/website/templates/html/product_breadcrumbs.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{% if obj.parent_groups and len(obj.parent_groups) > 1 %}
-<div class="col-md-12">
-	<div class="clearfix">
-		<ul class="breadcrumb">
-			{% for ig in obj.parent_groups[:-1] %}
-			<li><a href="{{ ig.page_name }}.html">{{ ig.name }}</a></li>
-			{% endfor %}
-			<li class="active">{{ obj.parent_groups[-1].name }}</li>
-		</ul>
-	</div>
-</div>
-{% endif %}
\ No newline at end of file
diff --git a/website/templates/html/product_group.html b/website/templates/html/product_group.html
deleted file mode 100644
index 4bf52c5..0000000
--- a/website/templates/html/product_group.html
+++ /dev/null
@@ -1,42 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% block content %}
-{% include 'app/website/templates/html/product_search_box.html' %}
-{% include 'app/website/templates/html/product_breadcrumbs.html' %}
-<div class="col-md-12">
-	{% if slideshow %}<!-- slideshow -->
-	{% include "app/website/templates/html/slideshow.html" %}
-	{% endif %}
-	{% if description %}<!-- description -->
-	<div>{{ description or ""}}</div>
-	{% else %}
-	<h3>{{ name }}</h3>
-	{% endif %}
-</div>
-<div class="col-md-12">
-	{% if sub_groups %}
-	<hr />
-	<div class="row">
-	{% for d in sub_groups %}
-		<div class="col-md-4">
-			<a href="{{ d.page_name }}">{{ d.name }} ({{ d.count }})</a>
-		</div>
-	{% endfor %}
-	</div>
-	<hr />
-	{% endif %}
-	{% if items %}
-	<div id="search-list" class="row">
-		{% for item in items %}
-			{{ item }}
-		{% endfor %}
-	</div>
-		{% if len(items)==100 %}
-			<div class="alert info">Showing top 100 items.</div>
-		{% endif %}
-	{% else %}
-		<div class="alert">No items listed.</div>
-	{% endif %}
-</div>
-
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/html/product_in_grid.html b/website/templates/html/product_in_grid.html
deleted file mode 100644
index adb2f74..0000000
--- a/website/templates/html/product_in_grid.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<div class="col-md-3">
-	<div style="height: 120px; overflow: hidden;">
-		<a href="{{ page_name }}">
-		{%- if website_image -%}
-		<img class="product-image" style="width: 80%; margin: auto;" src="{{ website_image }}">
-		{%- else -%}
-		{% include 'app/website/templates/html/product_missing_image.html' %}
-		{%- endif -%}
-		</a>
-	</div>
-	<div style="height: 100px; overflow: hidden; font-size: 80%;">
-		<h4 style="margin-bottom: 2px;"><a href="{{ page_name }}">{{ item_name }}</a></h4>
-	</div>
-</div>
\ No newline at end of file
diff --git a/website/templates/html/product_in_list.html b/website/templates/html/product_in_list.html
deleted file mode 100644
index b3e5b86..0000000
--- a/website/templates/html/product_in_list.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- TODO product listing -->
-<div class="col-md-12">
-	<div style="height: 120px; overflow: hidden;">
-		<a href="{{ page_name }}">
-		{%- if website_image -%}
-		<img class="product-image" style="width: 80%; margin: auto;" src="{{ website_image }}">
-		{%- else -%}
-		{% include 'app/website/templates/html/product_missing_image.html' %}
-		{%- endif -%}
-		</a>
-	</div>
-	<div style="height: 100px; overflow: hidden; font-size: 80%;">
-		<h4 style="margin-bottom: 2px;"><a href="{{ page_name }}">{{ item_name }}</a></h4>
-	</div>
-</div>
\ No newline at end of file
diff --git a/website/templates/html/product_missing_image.html b/website/templates/html/product_missing_image.html
deleted file mode 100644
index 81b8935..0000000
--- a/website/templates/html/product_missing_image.html
+++ /dev/null
@@ -1 +0,0 @@
-<div class="missing-image"><i class="icon-camera"></i></div>
\ No newline at end of file
diff --git a/website/templates/html/product_page.html b/website/templates/html/product_page.html
deleted file mode 100644
index 5ac0b48..0000000
--- a/website/templates/html/product_page.html
+++ /dev/null
@@ -1,74 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% block javascript %}
-	{% include "app/website/templates/js/product_page.js" %}
-{% endblock %}
-
-{% block css %}
-	{% include "app/website/templates/css/product_page.css" %}
-{% endblock %}
-
-{% block content %}
-	{% include 'app/website/templates/html/product_search_box.html' %}
-	{% include 'app/website/templates/html/product_breadcrumbs.html' %}
-	<div class="col-md-12 product-page-content" itemscope itemtype="http://schema.org/Product">
-		<div class="row">
-			<div class="col-md-6">
-				{% if slideshow %}
-					{% include "app/website/templates/html/slideshow.html" %}
-				{% else %}
-					{% if website_image %}
-					<image itemprop="image" class="item-main-image"
-						src="{{ website_image }}" />
-					{% else %}
-					<div class="img-area">
-						{% include 'app/website/templates/html/product_missing_image.html' %}
-					</div>
-					{% endif %}
-				{% endif %}
-			</div>
-			<div class="col-md-6">
-				<h3 itemprop="name" style="margin-top: 0px;">{{ item_name }}</h3>
-				<p class="help">Item Code: <span itemprop="productID">{{ name }}</span></p>
-				<h4>Product Description</h4>
-				<div itemprop="description">
-				{{ web_long_description or description or "[No description given]" }}
-				</div>
-				<div style="min-height: 100px; margin: 10px 0;">
-					<div class="item-price-info" style="display: none;">
-						<h4 class="item-price" itemprop="price"></h4>
-						<div class="item-stock" itemprop="availablity"></div>
-						<div id="item-add-to-cart">
-							<button class="btn btn-primary">
-								<i class="icon-shopping-cart"></i> Add to Cart</button>
-						</div>
-						<div id="item-update-cart" class="input-group col-md-4" style="display: none;
-							padding-left: 0px; padding-right: 0px;">
-							<input class="form-control" type="text">
-							<div class="input-group-btn">
-								<button class="btn btn-primary">
-									<i class="icon-ok"></i></button>
-							</div>
-						</div>
-					</div>
-				</div>
-			</div>
-		</div>
-		{% if obj.doclist.get({"doctype":"Item Website Specification"}) -%}
-		<div class="row" style="margin-top: 20px">
-			<div class="col-md-12">
-				<h4>Specifications</h4>
-				<table class="table table-bordered" style="width: 100%">
-				{% for d in obj.doclist.get(
-					{"doctype":"Item Website Specification"}) -%}
-					<tr>
-						<td style="width: 30%;">{{ d.label }}</td>
-						<td>{{ d.description }}</td>
-					</tr>
-				{%- endfor %}
-				</table>
-			</div>
-		</div>
-		{%- endif %}
-	</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/html/product_search_box.html b/website/templates/html/product_search_box.html
deleted file mode 100644
index d808bf6..0000000
--- a/website/templates/html/product_search_box.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<div class="col-md-12 clearfix">
-	<div class="pull-right" style="margin-top: 15px; margin-bottom: 15px;">
-		<form class="form-search">
-			<div class="input-group col-md-4 col-md-offset-8">
-				<input class="form-control" type="text" id="product-search" placeholder="Product Search...">
-				<span class="input-group-btn">
-					<button class="btn btn-default" type="button" id="btn-product-search">
-						<i class="icon-search"></i></button>
-				</span>
-			</div>
-		</form>
-	</div>
-	<script>
-		// redirect to product search page
-		$(document).ready(function() {
-			$('.dropdown-toggle').dropdown()
-			$("#btn-product-search").click(function() {
-				var txt = $("#product-search").val();
-				if(txt) {
-					window.location.href="product_search.html?q=" + txt;
-				}
-				return false;
-			});
-			$("#product-search").keypress(function(e) {
-				if(e.which==13) $("#product-search-btn").click();
-			})
-		})
-	</script>
-</div>
\ No newline at end of file
diff --git a/website/templates/js/blog_page.js b/website/templates/js/blog_page.js
index 665dbf4..3d45925 100644
--- a/website/templates/js/blog_page.js
+++ b/website/templates/js/blog_page.js
@@ -14,6 +14,7 @@
 			.parent().append("<div class='alert alert-warning'>Comments are closed.</div>")
 	}
 	$(".add-comment").click(function() {
+		$(this).toggle(false);
 		$("#comment-form").toggle();
 		$("#comment-form input, #comment-form, textarea").val("");
 	})
diff --git a/website/templates/js/cart.js b/website/templates/js/cart.js
index 20090ca..63c6463 100644
--- a/website/templates/js/cart.js
+++ b/website/templates/js/cart.js
@@ -7,7 +7,7 @@
 	wn.cart.bind_events();
 	return wn.call({
 		type: "POST",
-		method: "website.helpers.cart.get_cart_quotation",
+		method: "selling.utils.cart.get_cart_quotation",
 		callback: function(r) {
 			console.log(r);
 			$("#cart-container").removeClass("hide");
@@ -194,7 +194,7 @@
 		return wn.call({
 			btn: btn,
 			type: "POST",
-			method: "website.helpers.cart.apply_shipping_rule",
+			method: "selling.utils.cart.apply_shipping_rule",
 			args: { shipping_rule: rule },
 			callback: function(r) {
 				if(!r.exc) {
@@ -242,7 +242,7 @@
 				
 				return wn.call({
 					type: "POST",
-					method: "website.helpers.cart.update_cart_address",
+					method: "selling.utils.cart.update_cart_address",
 					args: {
 						address_fieldname: $address_wrapper.attr("data-fieldname"),
 						address_name: $(this).attr("data-address-name")
@@ -273,7 +273,7 @@
 	place_order: function() {
 		return wn.call({
 			type: "POST",
-			method: "website.helpers.cart.place_order",
+			method: "selling.utils.cart.place_order",
 			callback: function(r) {
 				if(r.exc) {
 					var msg = "";
diff --git a/website/templates/js/product_list.js b/website/templates/js/product_list.js
index 729499c..2856bde 100644
--- a/website/templates/js/product_list.js
+++ b/website/templates/js/product_list.js
@@ -15,7 +15,7 @@
 		url: "server.py",
 		dataType: "json",
 		data: {
-			cmd: "website.helpers.product.get_product_list",
+			cmd: "selling.utils.product.get_product_list",
 			start: window.start,
 			search: window.search,
 			product_group: window.product_group
diff --git a/website/templates/js/product_page.js b/website/templates/js/product_page.js
index b8c65ec..b2a122e 100644
--- a/website/templates/js/product_page.js
+++ b/website/templates/js/product_page.js
@@ -7,7 +7,7 @@
 	
 	wn.call({
 		type: "POST",
-		method: "website.helpers.product.get_product_info",
+		method: "selling.utils.product.get_product_info",
 		args: {
 			item_code: "{{ name }}"
 		},
diff --git a/website/templates/pages/address.html b/website/templates/pages/address.html
index 6544b12..6d4273c 100644
--- a/website/templates/pages/address.html
+++ b/website/templates/pages/address.html
@@ -89,7 +89,7 @@
 			wn.call({
 				btn: $(this),
 				type: "POST",
-				method: "website.helpers.cart.save_address",
+				method: "selling.utils.cart.save_address",
 				args: { fields: fields, address_fieldname: get_url_arg("address_fieldname") },
 				callback: function(r) {
 					if(r.exc) {
diff --git a/website/templates/pages/addresses.html b/website/templates/pages/addresses.html
index 04fc47b..b19780a 100644
--- a/website/templates/pages/addresses.html
+++ b/website/templates/pages/addresses.html
@@ -26,7 +26,7 @@
 	
 	var fetch_addresses = function() {
 		wn.call({
-			method: "website.helpers.cart.get_addresses",
+			method: "selling.utils.cart.get_addresses",
 			callback: function(r) {
 				$("#address-list .progress").remove();
 				var $list = $("#address-list");
diff --git a/website/templates/pages/messages.html b/website/templates/pages/messages.html
deleted file mode 100644
index e1ea8d0..0000000
--- a/website/templates/pages/messages.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{% extends "app/website/templates/html/transactions.html" %}
-
-{% block javascript -%}
-{{ super() }}
-
-var render = function(doc) {
-	doc.sender = doc.sender ? doc.sender : "To ";
-	doc.recipients = doc.recipients ? (" to " + doc.recipients) : "";
-	doc.content = remove_script_and_style(doc.content);
-	
-	if(!is_html(doc.content)) {
-		doc.content = doc.content.replace("\n", "<br>");
-	}
-		
-	$(repl('<a class="list-group-item">\
-			<div class="row col-md-12">%(subject)s</div>\
-			<div class="row text-muted">\
-				<div class="col-md-6">%(sender)s%(recipients)s</div>\
-				<div class="col-md-6 text-right">%(creation)s</div>\
-			</div>\
-			<div class="row col-md-12 msg-content" style="display: none;"><hr>%(content)s</div>\
-		</a>', doc))
-		.appendTo($list)
-		.on("click", function() {
-			$(this).find(".msg-content").toggle();
-		});
-	
-	
-}
-
-{%- endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/partners.html b/website/templates/pages/partners.html
deleted file mode 100644
index 50a095d..0000000
--- a/website/templates/pages/partners.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% set title="Partners" %}
-
-{% block content %}
-	<div class="col-md-12">
-		<h2 id="blog-title">{{ title }}</h2>
-		<hr>
-		{% for partner_info in partners %}
-		<div class="row">
-			<div class="col-md-3">
-				{% if partner_info.logo -%}
-				<a href="{{ partner_info.page_name }}">
-					<img itemprop="brand" src="{{ partner_info.logo }}" class="partner-logo" 
-						alt="{{ partner_info.partner_name }}" title="{{ partner_info.partner_name }}" />
-				</a>
-				{%- endif %}
-			</div>
-			<div class="col-md-9">
-				<a href="{{ partner_info.page_name }}">
-					<h4>{{ partner_info.partner_name }}</h4>
-				</a>
-				<p style="color: #999">{{ partner_info.territory }} - {{ partner_info.partner_type }}</p>
-				<p>{{ partner_info.introduction }}</p>
-			</div>
-		</div>
-		<hr>
-		{% endfor %}
-	</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/product_search.html b/website/templates/pages/product_search.html
deleted file mode 100644
index e969f75..0000000
--- a/website/templates/pages/product_search.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% set title="Product Search" %}
-
-{% block javascript %}
-{% include "app/website/templates/js/product_list.js" %}
-{% endblock %}
-
-{% block content %}
-<script>
-$(document).ready(function() {
-	var txt = get_url_arg("q");
-	$(".search-results").html("Search results for: " + txt);
-	window.search = txt;
-	window.start = 0;
-	window.get_product_list();
-});
-</script>
-
-{% include 'app/website/templates/html/product_search_box.html' %}
-<div class="col-md-12">
-	<h3 class="search-results">Search Results</h3>
-	<div id="search-list" class="row">
-		
-	</div>
-	<div style="text-align: center;">
-		<div class="more-btn" 
-			style="display: none; text-align: center;">
-			<button class="btn">More...</button>
-		</div>
-	</div>
-</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/ticket.html b/website/templates/pages/ticket.html
deleted file mode 100644
index 6622ed1..0000000
--- a/website/templates/pages/ticket.html
+++ /dev/null
@@ -1,67 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% set title=doc.name %}
-
-{% set status_label = {
-	"Open": "label-success",
-	"To Reply": "label-danger",
-	"Closed": "label-default"
-} %}
-
-{% block content %}
-<div class="col-md-12">
-    <ul class="breadcrumb">
-    	<li><a href="index">Home</a></li>
-    	<li><a href="account">My Account</a></li>
-    	<li><a href="tickets">My Tickets</a></li>
-    	<li class="active"><i class="icon-ticket icon-fixed-width"></i> {{ doc.name }}</li>
-    </ul>
-	<h3><i class="icon-ticket icon-fixed-width"></i> {{ doc.name }}</h3>
-	{% if doc.name == "Not Allowed" -%}
-		<script>ask_to_login();</script>
-	{% else %}
-	<hr>
-	{%- if doc.status -%}
-	{% if doc.status == "Waiting for Customer" -%}
-		{% set status = "To Reply" %}
-	{% else %}
-		{% set status = doc.status %}
-	{%- endif -%}
-	<div class="row">
-		<div class="col-md-2" style="margin-bottom: 7px;">
-			<span class="label {{ status_label.get(status) or 'label-default' }}">{{ status }}</span>
-		</div>
-		<div class="col-md-8">
-			<div class="row col-md-12">{{ doc.subject }}</div>
-		</div>
-		<div class="col-md-2 pull-right">
-			<span class="text-muted">{{ utils.formatdate(doc.creation) }}</span>
-		</div>
-	</div>
-	<br>
-	<h4>Messages</h4>
-	{%- if doclist.get({"doctype":"Communication"}) -%}
-	<div>
-		<table class="table table-bordered table-striped">
-			<tbody>
-				{%- for comm in doclist.get({"doctype":"Communication"}) %}
-				<tr>
-					<td>
-					<h5 style="text-transform: none">
-						{{ comm.sender }} on {{ utils.formatdate(doc.modified) }}</h5>
-					<hr>
-					<p>{{ webnotes.utils.is_html(comm.content) and comm.content or
-						comm.content.replace("\n", "<br>")}}</p>
-					</td>
-				</tr>
-				{% endfor -%}
-			</tbody>
-		</table>
-	</div>
-	{%- else -%}
-	<div class="alert">No messages</div>
-	{%- endif -%}
-	{%- endif -%}
-	{% endif -%}
-</div>
-{% endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/tickets.html b/website/templates/pages/tickets.html
deleted file mode 100644
index 166dbcd..0000000
--- a/website/templates/pages/tickets.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{% extends "app/website/templates/html/transactions.html" %}
-
-{% block javascript -%}
-{{ super() }}
-
-var status_label = {
-	"Open": "label-success",
-	"Waiting for Customer": "label-danger",
-	"Closed": "label-default"
-}
-
-var render = function(doc) {
-	doc.status = doc.status.trim();
-	doc.label_class = status_label[doc.status] || "label-default";
-	if(doc.status==="Waiting for Customer") doc.status = "To Reply";
-	
-	$(repl('<a href="{{ page }}?name=%(name)s" class="list-group-item">\
-			<div class="row">\
-				<div class="col-md-2" style="margin-bottom: 7px;"><span class="label %(label_class)s">\
-					%(status)s</span></div>\
-				<div class="col-md-8">\
-					<div class="row col-md-12">%(name)s</div>\
-					<div class="row col-md-12 text-muted">%(subject)s</div>\
-				</div>\
-				<div class="col-md-2 pull-right">\
-					<span class="text-muted">%(creation)s</span>\
-				</div>\
-			</div>\
-		</a>', doc)).appendTo($list);
-};
-{%- endblock %}
\ No newline at end of file