Merge branch 'develop'
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index 5967305..ba4681f 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
from __future__ import unicode_literals
-__version__ = '6.23.0'
+__version__ = '6.23.1'
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 5645981..203b91d 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -7,7 +7,7 @@
app_description = """ERP made simple"""
app_icon = "icon-th"
app_color = "#e74c3c"
-app_version = "6.23.0"
+app_version = "6.23.1"
app_email = "info@erpnext.com"
app_license = "GNU General Public License (v3)"
source_link = "https://github.com/frappe/erpnext"
diff --git a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
index 302513f..d4d5329 100644
--- a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
+++ b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
@@ -23,6 +23,10 @@
def validate_bom(self):
if cstr(self.current_bom) == cstr(self.new_bom):
frappe.throw(_("Current BOM and New BOM can not be same"))
+
+ if frappe.db.get_value("BOM", self.current_bom, "item") \
+ != frappe.db.get_value("BOM", self.new_bom, "item"):
+ frappe.throw(_("The selected BOMs are not for the same item"))
def update_new_bom(self):
current_bom_unitcost = frappe.db.sql("""select total_cost/quantity
diff --git a/erpnext/public/js/setup_wizard.js b/erpnext/public/js/setup_wizard.js
index 9c6cd03..b2693b9 100644
--- a/erpnext/public/js/setup_wizard.js
+++ b/erpnext/public/js/setup_wizard.js
@@ -9,43 +9,8 @@
function load_erpnext_slides() {
$.extend(erpnext.wiz, {
- user: {
- title: __("The First User: You"),
- icon: "icon-user",
- fields: [
- {"fieldname": "first_name", "label": __("First Name"), "fieldtype": "Data",
- reqd:1},
- {"fieldname": "last_name", "label": __("Last Name"), "fieldtype": "Data"},
- {"fieldname": "email", "label": __("Email Address"), "fieldtype": "Data",
- reqd:1, "description": __("You will use it to Login"), "options":"Email"},
- {"fieldname": "password", "label": __("Password"), "fieldtype": "Password",
- reqd:1},
- {fieldtype:"Attach Image", fieldname:"attach_user",
- label: __("Attach Your Picture"), is_private: 0},
- ],
- help: __('The first user will become the System Manager (you can change this later).'),
- onload: function(slide) {
- if(user!=="Administrator") {
- slide.form.fields_dict.password.$wrapper.toggle(false);
- slide.form.fields_dict.email.$wrapper.toggle(false);
- slide.form.fields_dict.first_name.set_input(frappe.boot.user.first_name);
- slide.form.fields_dict.last_name.set_input(frappe.boot.user.last_name);
-
- var user_image = frappe.get_cookie("user_image");
- if(user_image) {
- var $attach_user = slide.form.fields_dict.attach_user.$wrapper;
- $attach_user.find(".missing-image").toggle(false);
- $attach_user.find("img").attr("src", decodeURIComponent(user_image)).toggle(true);
- }
-
- delete slide.form.fields_dict.email;
- delete slide.form.fields_dict.password;
- }
- },
- css_class: "single-column"
- },
-
org: {
+ app_name: "erpnext",
title: __("The Organization"),
icon: "icon-building",
fields: [
@@ -160,6 +125,7 @@
},
branding: {
+ app_name: "erpnext",
icon: "icon-bookmark",
title: __("The Brand"),
help: __('Upload your letter head and logo. (you can edit them later).'),
@@ -181,10 +147,11 @@
},
users: {
+ app_name: "erpnext",
icon: "icon-money",
- "title": __("Add Users"),
- "help": __("Add users to your organization, other than yourself"),
- "fields": [],
+ title: __("Add Users"),
+ help: __("Add users to your organization, other than yourself"),
+ fields: [],
before_load: function(slide) {
slide.fields = [];
for(var i=1; i<5; i++) {
@@ -209,9 +176,10 @@
},
taxes: {
+ app_name: "erpnext",
icon: "icon-money",
- "title": __("Add Taxes"),
- "help": __("List your tax heads (e.g. VAT, Customs etc; they should have unique names) and their standard rates. This will create a standard template, which you can edit and add more later."),
+ title: __("Add Taxes"),
+ help: __("List your tax heads (e.g. VAT, Customs etc; they should have unique names) and their standard rates. This will create a standard template, which you can edit and add more later."),
"fields": [],
before_load: function(slide) {
slide.fields = [];
@@ -229,10 +197,11 @@
},
customers: {
+ app_name: "erpnext",
icon: "icon-group",
- "title": __("Your Customers"),
- "help": __("List a few of your customers. They could be organizations or individuals."),
- "fields": [],
+ title: __("Your Customers"),
+ help: __("List a few of your customers. They could be organizations or individuals."),
+ fields: [],
before_load: function(slide) {
slide.fields = [];
for(var i=1; i<6; i++) {
@@ -251,10 +220,11 @@
},
suppliers: {
+ app_name: "erpnext",
icon: "icon-group",
- "title": __("Your Suppliers"),
- "help": __("List a few of your suppliers. They could be organizations or individuals."),
- "fields": [],
+ title: __("Your Suppliers"),
+ help: __("List a few of your suppliers. They could be organizations or individuals."),
+ fields: [],
before_load: function(slide) {
slide.fields = [];
for(var i=1; i<6; i++) {
@@ -273,10 +243,11 @@
},
items: {
+ app_name: "erpnext",
icon: "icon-barcode",
- "title": __("Your Products or Services"),
- "help": __("List your products or services that you buy or sell. Make sure to check the Item Group, Unit of Measure and other properties when you start."),
- "fields": [],
+ title: __("Your Products or Services"),
+ help: __("List your products or services that you buy or sell. Make sure to check the Item Group, Unit of Measure and other properties when you start."),
+ fields: [],
before_load: function(slide) {
slide.fields = [];
for(var i=1; i<6; i++) {
@@ -336,7 +307,6 @@
frappe.wiz.on("before_load", function() {
load_erpnext_slides();
- frappe.wiz.add_slide(erpnext.wiz.user);
frappe.wiz.add_slide(erpnext.wiz.org);
frappe.wiz.add_slide(erpnext.wiz.branding);
frappe.wiz.add_slide(erpnext.wiz.users);
diff --git a/erpnext/selling/page/sales_funnel/sales_funnel.py b/erpnext/selling/page/sales_funnel/sales_funnel.py
index eb3b996..4d12efd 100644
--- a/erpnext/selling/page/sales_funnel/sales_funnel.py
+++ b/erpnext/selling/page/sales_funnel/sales_funnel.py
@@ -17,7 +17,7 @@
and status != "Passive" """, (from_date, to_date))[0][0]
opportunities = frappe.db.sql("""select count(*) from `tabOpportunity`
- where docstatus = 1 and (date(`creation`) between %s and %s)
+ where (date(`creation`) between %s and %s)
and status != "Lost" """, (from_date, to_date))[0][0]
quotations = frappe.db.sql("""select count(*) from `tabQuotation`
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index ed7da9c..7669bff 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -16,7 +16,8 @@
website = frappe._dict(
condition_field = "show_in_website",
template = "templates/generators/item_group.html",
- parent_website_route_field = "parent_item_group"
+ parent_website_route_field = "parent_item_group",
+ no_cache = 1
)
def autoname(self):
@@ -52,8 +53,11 @@
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):
+ start = int(frappe.form_dict.start or 0)
+ if start < 0:
+ start = 0
context.update({
- "items": get_product_list_for_group(product_group = self.name, limit=100),
+ "items": get_product_list_for_group(product_group = self.name, start=start, limit=24),
"parent_groups": get_parent_item_groups(self.name),
"title": self.name
})
@@ -63,6 +67,7 @@
return context
+@frappe.whitelist(allow_guest=True)
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)])
@@ -122,4 +127,4 @@
d = frappe.get_doc("Item Group", d.name)
route = d.get_route()
if route:
- clear_cache(route)
+ clear_cache(route)
\ No newline at end of file
diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py
index b4e19da..d218793 100644
--- a/erpnext/setup/install.py
+++ b/erpnext/setup/install.py
@@ -12,7 +12,7 @@
frappe.get_doc({'doctype': "Role", "role_name": "Analytics"}).insert()
set_single_defaults()
feature_setup()
- from erpnext.setup.setup_wizard.setup_wizard import add_all_roles_to
+ from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
add_all_roles_to("Administrator")
add_web_forms()
frappe.db.commit()
diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py
index 890f317..5a04682 100644
--- a/erpnext/setup/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/setup_wizard/setup_wizard.py
@@ -19,8 +19,7 @@
frappe.throw(_("Setup Already Complete!!"))
install_fixtures.install(args.get("country"))
-
- update_user_name(args)
+
create_fiscal_year_and_company(args)
create_users(args)
set_defaults(args)
@@ -54,67 +53,32 @@
pass
-
-def update_user_name(args):
- if args.get("email"):
- args['name'] = args.get("email")
-
- _mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True
- doc = frappe.get_doc({
- "doctype":"User",
- "email": args.get("email"),
- "first_name": args.get("first_name"),
- "last_name": args.get("last_name")
- })
- doc.flags.no_welcome_mail = True
- doc.insert()
- frappe.flags.mute_emails = _mute_emails
- from frappe.auth import _update_password
- _update_password(args.get("email"), args.get("password"))
-
- else:
- args['name'] = frappe.session.user
-
- # Update User
- if not args.get('last_name') or args.get('last_name')=='None':
- args['last_name'] = None
- frappe.db.sql("""update `tabUser` SET first_name=%(first_name)s,
- last_name=%(last_name)s WHERE name=%(name)s""", args)
-
- if args.get("attach_user"):
- attach_user = args.get("attach_user").split(",")
- if len(attach_user)==3:
- filename, filetype, content = attach_user
- fileurl = save_file(filename, content, "User", args.get("name"), decode=True).file_url
- frappe.db.set_value("User", args.get("name"), "user_image", fileurl)
-
- add_all_roles_to(args.get("name"))
-
def create_fiscal_year_and_company(args):
- curr_fiscal_year = get_fy_details(args.get('fy_start_date'), args.get('fy_end_date'))
- frappe.get_doc({
+ if (args.get('fy_start_date')):
+ curr_fiscal_year = get_fy_details(args.get('fy_start_date'), args.get('fy_end_date'))
+ frappe.get_doc({
"doctype":"Fiscal Year",
'year': curr_fiscal_year,
'year_start_date': args.get('fy_start_date'),
'year_end_date': args.get('fy_end_date'),
- }).insert()
-
+ }).insert()
+ args["curr_fiscal_year"] = curr_fiscal_year
+
# Company
- frappe.get_doc({
- "doctype":"Company",
- 'domain': args.get("industry"),
- 'company_name':args.get('company_name').strip(),
- 'abbr':args.get('company_abbr'),
- 'default_currency':args.get('currency'),
- 'country': args.get('country'),
- 'chart_of_accounts': args.get(('chart_of_accounts')),
- }).insert()
+ if (args.get('company_name')):
+ frappe.get_doc({
+ "doctype":"Company",
+ 'domain': args.get("industry"),
+ 'company_name':args.get('company_name').strip(),
+ 'abbr':args.get('company_abbr'),
+ 'default_currency':args.get('currency'),
+ 'country': args.get('country'),
+ 'chart_of_accounts': args.get(('chart_of_accounts')),
+ }).insert()
- # Bank Account
- create_bank_account(args)
-
- args["curr_fiscal_year"] = curr_fiscal_year
-
+ # Bank Account
+ create_bank_account(args)
+
def create_bank_account(args):
if args.get("bank_account"):
company_name = args.get('company_name').strip()
@@ -440,14 +404,6 @@
frappe.db.set_value("Website Settings", "Website Settings", "brand_html",
"<img src='{0}' style='max-width: 40px; max-height: 25px;'> {1}".format(fileurl, args.get("company_name").strip()))
-def add_all_roles_to(name):
- user = frappe.get_doc("User", name)
- for role in frappe.db.sql("""select name from tabRole"""):
- if role[0] not in ["Administrator", "Guest", "All", "Customer", "Supplier", "Partner", "Employee"]:
- d = user.append("user_roles")
- d.role = role[0]
- user.save()
-
def create_territories():
"""create two default territories, one for home country and one named Rest of the World"""
from frappe.utils.nestedset import get_root_of
diff --git a/erpnext/templates/generators/item_group.html b/erpnext/templates/generators/item_group.html
index eb1278c..7e68bc7 100644
--- a/erpnext/templates/generators/item_group.html
+++ b/erpnext/templates/generators/item_group.html
@@ -25,9 +25,14 @@
{{ item }}
{% endfor %}
</div>
- {% if (items|length)==100 %}
- <div class="text-muted info">Showing top 100 items.</div>
- {% endif %}
+ <div class="text-center">
+ {% if frappe.form_dict.start|int > 0 %}
+ <a class="btn btn-default" href="{{ pathname }}?start={{ frappe.form_dict.start|int - 24 }}">Prev</a>
+ {% endif %}
+ {% if items|length == 24 %}
+ <a class="btn btn-default" href="{{ pathname }}?start={{ frappe.form_dict.start|int + 24 }}">Next</a>
+ {% endif %}
+ </div>
{% else %}
<div class="text-muted">No items listed.</div>
{% endif %}
diff --git a/setup.py b/setup.py
index cfbc311..b519e5b 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
from setuptools import setup, find_packages
from pip.req import parse_requirements
-version = "6.23.0"
+version = "6.23.1"
requirements = parse_requirements("requirements.txt", session="")
setup(