diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json
index 4c24199cc8..f909ef60b2 100644
--- a/erpnext/accounts/doctype/account/account.json
+++ b/erpnext/accounts/doctype/account/account.json
@@ -288,6 +288,7 @@
},
{
"amend": 0,
+ "apply_user_permissions": 0,
"create": 1,
"delete": 1,
"email": 1,
diff --git a/erpnext/accounts/doctype/chart_of_accounts/import_charts.py b/erpnext/accounts/doctype/chart_of_accounts/import_charts.py
index 9e60551665..7a47f6ee36 100644
--- a/erpnext/accounts/doctype/chart_of_accounts/import_charts.py
+++ b/erpnext/accounts/doctype/chart_of_accounts/import_charts.py
@@ -5,6 +5,7 @@ from __future__ import unicode_literals
import frappe, os, json
def import_charts():
+ print "Importing Chart of Accounts"
frappe.db.sql("""delete from `tabChart of Accounts`""")
charts_dir = os.path.join(os.path.dirname(__file__), "charts")
for fname in os.listdir(charts_dir):
@@ -19,8 +20,8 @@ def import_charts():
"source_file": fname,
"country": country
}).insert()
- print doc.name.encode("utf-8")
- else:
- print "No chart for: " + chart.get("name").encode("utf-8")
-
- frappe.db.commit()
\ No newline at end of file
+ #print doc.name.encode("utf-8")
+ #else:
+ #print "No chart for: " + chart.get("name").encode("utf-8")
+
+ frappe.db.commit()
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html
new file mode 100644
index 0000000000..dda1e61449
--- /dev/null
+++ b/erpnext/accounts/report/general_ledger/general_ledger.html
@@ -0,0 +1,38 @@
+
{%= __("Statement of Account") %}
+{%= filters.account || "General Ledger" %}
+
+
+
+
+ {%= __("Date") %} |
+ {%= __("Ref") %} |
+ {%= __("Party") %} |
+ {%= __("Debit") %} |
+ {%= __("Credit") %} |
+
+
+
+ {% for(var i=0, l=data.length; i
+ {% if(data[i].posting_date) { %}
+ {%= dateutil.str_to_user(data[i].posting_date) %} |
+ {%= data[i].voucher_no %} |
+ {%= data[i].account %}
+ {%= __("Against") %}: {%= data[i].account %}
+ {%= __("Remarks") %}: {%= data[i].remarks %} |
+ {%= fmt_money(data[i].debit) %} |
+ {%= fmt_money(data[i].credit) %} |
+ {% } else { %}
+ |
+ |
+ {%= data[i].account || " " %} |
+
+ {%= data[i].account && fmt_money(data[i].debit) %} |
+
+ {%= data[i].account && fmt_money(data[i].credit) %} |
+ {% } %}
+
+ {% } %}
+
+
+Printed On {%= dateutil.get_datetime_as_string() %}
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 8b147b0749..bddda2d601 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -24,6 +24,8 @@ mail_footer = "erpnext.startup.mail_footer"
on_session_creation = "erpnext.startup.event_handlers.on_session_creation"
before_tests = "erpnext.setup.utils.before_tests"
+website_generators = ["Item Group", "Item", "Sales Partner"]
+
standard_queries = "Customer:erpnext.selling.doctype.customer.customer.get_customer_list"
permission_query_conditions = {
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index 63bf3b481c..94cd3ec59a 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -7,6 +7,10 @@ import frappe
from frappe.utils.nestedset import NestedSet
from frappe.website.website_generator import WebsiteGenerator
from frappe.website.render import clear_cache
+from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow
+
+condition_field = "show_in_website"
+template = "templates/generators/item_group.html"
class ItemGroup(NestedSet, WebsiteGenerator):
nsm_parent_field = 'parent_item_group'
@@ -39,6 +43,53 @@ class ItemGroup(NestedSet, WebsiteGenerator):
if frappe.db.exists("Item", self.name):
frappe.throw(frappe._("An item exists with same name ({0}), please change the item group name or rename the item").format(self.name))
+ def get_context(self, context):
+ context.update({
+ "items": get_product_list_for_group(product_group = self.name, limit=100),
+ "parent_groups": get_parent_item_groups(self.name),
+ "title": self.name
+ })
+
+ if self.slideshow:
+ context.update(get_slideshow(self))
+
+ return context
+
+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 t1.name, t1.item_name, t1.page_name, t1.website_image, t1.item_group,
+ t1.web_long_description as website_description, t2.name as route
+ from `tabItem` t1, `tabWebsite Route` t2
+ where t1.show_in_website = 1 and (item_group in (%s)
+ or t1.name in (select parent from `tabWebsite Item Group` where item_group in (%s)))
+ and t1.name = t2.docname and t2.ref_doctype='Item' """ % (child_groups, child_groups)
+
+ query += """order by t1.weightage desc, t1.modified desc limit %s, %s""" % (start, limit)
+
+ data = frappe.db.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 = frappe.get_doc("Item Group", item_group_name)
+ return frappe.db.sql("""select name
+ from `tabItem Group` where lft>=%(lft)s and rgt<=%(rgt)s
+ and show_in_website = 1""", {"lft": item_group.lft, "rgt": item_group.rgt})
+
+def get_item_for_list_in_html(context):
+ return frappe.get_template("templates/includes/product_in_grid.html").render(context)
+
+def get_group_item_count(item_group):
+ child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(item_group)])
+ return frappe.db.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_parent_item_groups(item_group_name):
item_group = frappe.get_doc("Item Group", item_group_name)
return frappe.db.sql("""select name, page_name from `tabItem Group`
diff --git a/erpnext/setup/doctype/sales_partner/sales_partner.py b/erpnext/setup/doctype/sales_partner/sales_partner.py
index b90b65e868..69695190d4 100644
--- a/erpnext/setup/doctype/sales_partner/sales_partner.py
+++ b/erpnext/setup/doctype/sales_partner/sales_partner.py
@@ -3,9 +3,12 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cint, cstr, filter_strip_join
+from frappe.utils import cstr, filter_strip_join
from frappe.website.website_generator import WebsiteGenerator
+condition_field = "show_in_website"
+template = "templates/generators/sales_partner.html"
+
class SalesPartner(WebsiteGenerator):
def autoname(self):
self.name = self.partner_name
@@ -25,3 +28,21 @@ class SalesPartner(WebsiteGenerator):
def get_page_title(self):
return self.partner_name
+
+ def get_context(self, context):
+ address = frappe.db.get_value("Address",
+ {"sales_partner": self.name, "is_primary_address": 1},
+ "*", as_dict=True)
+ if address:
+ city_state = ", ".join(filter(None, [address.city, address.state]))
+ address_rows = [address.address_line1, address.address_line2,
+ city_state, address.pincode, address.country]
+
+ context.update({
+ "email": address.email_id,
+ "partner_address": filter_strip_join(address_rows, "\n
"),
+ "phone": filter_strip_join(cstr(address.phone).split(","), "\n
")
+ })
+
+ return context
+
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index f43b531392..f68f0e9071 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -6,11 +6,15 @@ import frappe
from frappe import msgprint, _
from frappe.utils import cstr, flt, getdate, now_datetime, formatdate
from frappe.website.website_generator import WebsiteGenerator
-from erpnext.setup.doctype.item_group.item_group import invalidate_cache_for
+from erpnext.setup.doctype.item_group.item_group import invalidate_cache_for, get_parent_item_groups
from frappe.website.render import clear_cache
+from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow
class WarehouseNotSet(frappe.ValidationError): pass
+condition_field = "show_in_website"
+template = "templates/generators/item.html"
+
class Item(WebsiteGenerator):
def onload(self):
super(Item, self).onload()
@@ -55,6 +59,14 @@ class Item(WebsiteGenerator):
self.validate_name_with_item_group()
self.update_item_price()
+ def get_context(self, context):
+ context["parent_groups"] = get_parent_item_groups(self.item_group) + \
+ [{"name": self.name}]
+ if self.slideshow:
+ context.update(get_slideshow(self))
+
+ return context
+
def check_warehouse_is_set_for_stock_item(self):
if self.is_stock_item=="Yes" and not self.default_warehouse:
frappe.msgprint(_("Default Warehouse is mandatory for stock Item."),
diff --git a/erpnext/templates/generators/item.py b/erpnext/templates/generators/item.py
deleted file mode 100644
index 1ad070ef87..0000000000
--- a/erpnext/templates/generators/item.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-
-import frappe
-from erpnext.setup.doctype.item_group.item_group import get_parent_item_groups
-from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow
-
-doctype = "Item"
-condition_field = "show_in_website"
-
-def get_context(context):
- item_context = context.doc.as_dict()
- item_context["parent_groups"] = get_parent_item_groups(context.doc.item_group) + \
- [{"name":context.doc.name}]
- if context.doc.slideshow:
- item_context.update(get_slideshow(context.doc))
-
- return item_context
diff --git a/erpnext/templates/generators/item_group.py b/erpnext/templates/generators/item_group.py
deleted file mode 100644
index 8e09dbc35e..0000000000
--- a/erpnext/templates/generators/item_group.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-
-import frappe
-from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow
-from erpnext.setup.doctype.item_group.item_group import get_parent_item_groups
-
-doctype = "Item Group"
-condition_field = "show_in_website"
-
-def get_context(context):
- item_group_context = context.doc.as_dict()
- item_group_context.update({
- "items": get_product_list_for_group(product_group = context.docname, limit=100),
- "parent_groups": get_parent_item_groups(context.docname),
- "title": context.docname
- })
-
- if context.doc.slideshow:
- item_group_context.update(get_slideshow(context.doc))
-
- return item_group_context
-
-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 t1.name, t1.item_name, t1.page_name, t1.website_image, t1.item_group,
- t1.web_long_description as website_description, t2.name as route
- from `tabItem` t1, `tabWebsite Route` t2
- where t1.show_in_website = 1 and (item_group in (%s)
- or t1.name in (select parent from `tabWebsite Item Group` where item_group in (%s)))
- and t1.name = t2.docname and t2.ref_doctype='Item' """ % (child_groups, child_groups)
-
- query += """order by t1.weightage desc, t1.modified desc limit %s, %s""" % (start, limit)
-
- data = frappe.db.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 = frappe.get_doc("Item Group", item_group_name)
- return frappe.db.sql("""select name
- from `tabItem Group` where lft>=%(lft)s and rgt<=%(rgt)s
- and show_in_website = 1""", {"lft": item_group.lft, "rgt": item_group.rgt})
-
-def get_item_for_list_in_html(context):
- return frappe.get_template("templates/includes/product_in_grid.html").render(context)
-
-def get_group_item_count(item_group):
- child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(item_group)])
- return frappe.db.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]
-
diff --git a/erpnext/templates/generators/partner.py b/erpnext/templates/generators/partner.py
deleted file mode 100644
index 2079309747..0000000000
--- a/erpnext/templates/generators/partner.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe.utils import filter_strip_join
-
-doctype = "Sales Partner"
-condition_field = "show_in_website"
-
-def get_context(context):
- partner_context = context.doc.as_dict()
-
- address = frappe.db.get_value("Address",
- {"sales_partner": context.doc.name, "is_primary_address": 1},
- "*", as_dict=True)
- if address:
- city_state = ", ".join(filter(None, [address.city, address.state]))
- address_rows = [address.address_line1, address.address_line2,
- city_state, address.pincode, address.country]
-
- partner_context.update({
- "email": address.email_id,
- "partner_address": filter_strip_join(address_rows, "\n
"),
- "phone": filter_strip_join(cstr(address.phone).split(","), "\n
")
- })
-
- return partner_context
diff --git a/erpnext/templates/includes/footer_powered.html b/erpnext/templates/includes/footer_powered.html
index 0abf2e4e77..96611813a7 100644
--- a/erpnext/templates/includes/footer_powered.html
+++ b/erpnext/templates/includes/footer_powered.html
@@ -1 +1 @@
-ERPNext Powered
\ No newline at end of file
+ERPNext Powered
diff --git a/erpnext/templates/pages/product_search.py b/erpnext/templates/pages/product_search.py
index 8b454ceeca..8464b2561e 100644
--- a/erpnext/templates/pages/product_search.py
+++ b/erpnext/templates/pages/product_search.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
from frappe.utils import cstr
-from erpnext.templates.generators.item_group import get_item_for_list_in_html
+from erpnext.setup.doctype.item_group.item_group import get_item_for_list_in_html
no_cache = 1
no_sitemap = 1