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" %}

+
+ + + + + + + + + + + + {% for(var i=0, l=data.length; i + {% if(data[i].posting_date) { %} + + + + + + {% } else { %} + + + + + + {% } %} + + {% } %} + +
{%= __("Date") %}{%= __("Ref") %}{%= __("Party") %}{%= __("Debit") %}{%= __("Credit") %}
{%= 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) %}{%= 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