diff --git a/frappe/__init__.py b/frappe/__init__.py
index 79c9f000ca..931bcccb6e 100644
--- a/frappe/__init__.py
+++ b/frappe/__init__.py
@@ -17,7 +17,7 @@ from faker import Faker
from .exceptions import *
from .utils.jinja import (get_jenv, get_template, render_template, get_email_from_template, get_jloader)
-__version__ = '10.1.67'
+__version__ = '10.1.68'
__title__ = "Frappe Framework"
local = Local()
diff --git a/frappe/core/doctype/report/test_report.py b/frappe/core/doctype/report/test_report.py
index 5591035c08..a8b756804e 100644
--- a/frappe/core/doctype/report/test_report.py
+++ b/frappe/core/doctype/report/test_report.py
@@ -61,9 +61,8 @@ class TestReport(unittest.TestCase):
with open(os.path.join(os.path.dirname(__file__), 'user_activity_report_without_sort.json'), 'r') as f:
frappe.get_doc(json.loads(f.read())).insert()
- report = frappe.get_doc('Report', 'User Activity Report Without Sort')
- # this would raise an error without the fix added along with this test case
columns, data = report.get_data()
+
self.assertEqual(columns[0].get('label'), 'ID')
self.assertEqual(columns[1].get('label'), 'User Type')
self.assertTrue('Administrator' in [d[0] for d in data])
diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py
index 270e61e8dc..16c57e1a6e 100644
--- a/frappe/core/doctype/user/test_user.py
+++ b/frappe/core/doctype/user/test_user.py
@@ -276,6 +276,13 @@ class TestUser(unittest.TestCase):
self.assertEqual(extract_mentions(user_name)[0], "test-user")
user_name = "Testing comment, @test.user@example.com please check."
self.assertEqual(extract_mentions(user_name)[0], "test.user@example.com")
+ user_name = "
@test_user@example.com and @test.again@example1.com
This is a test.
"
+ self.assertEqual(extract_mentions(user_name)[0], "test_user@example.com")
+ self.assertEqual(extract_mentions(user_name)[1], "test.again@example1.com")
+ user_name = "@user@example.com Test @test-comment@xyz.com
Test for comment mentions @test@abc.com
"
+ self.assertEqual(extract_mentions(user_name)[0], "user@example.com")
+ self.assertEqual(extract_mentions(user_name)[1], "test-comment@xyz.com")
+ self.assertEqual(extract_mentions(user_name)[2], "test@abc.com")
def delete_contact(user):
frappe.db.sql("delete from tabContact where email_id='%s'" % frappe.db.escape(user))
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index 4056267f7b..3d1a803e4d 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -922,7 +922,7 @@ def notify_admin_access_to_system_manager(login_manager=None):
def extract_mentions(txt):
"""Find all instances of @name in the string.
The mentions will be separated by non-word characters or may appear at the start of the string"""
- txt = txt.replace("
", "
")
+ txt = txt.replace("", "
")
txt = re.sub(r'(<[a-zA-Z\/][^>]*>)', '', txt)
return re.findall(r'(?:[^\w\.\-\@]|^)@([\w\.\-\@]*)', txt)
diff --git a/frappe/data/sample_site_config.json b/frappe/data/sample_site_config.json
index 1bf3914039..36818ef286 100644
--- a/frappe/data/sample_site_config.json
+++ b/frappe/data/sample_site_config.json
@@ -8,7 +8,7 @@
"space": 0.157,
"expiry": "2016-07-25",
"users": 1
- }
+ },
"developer_mode": 1,
"auto_cache_clear": true,
diff --git a/frappe/hooks.py b/frappe/hooks.py
index 5c7c45861c..742599377b 100644
--- a/frappe/hooks.py
+++ b/frappe/hooks.py
@@ -12,7 +12,7 @@ source_link = "https://github.com/frappe/frappe"
app_license = "MIT"
develop_version = '12.x.x-develop'
-staging_version = '11.0.3-beta.38'
+staging_version = '11.0.3-beta.39'
app_email = "info@frappe.io"
diff --git a/frappe/integrations/doctype/paypal_settings/paypal_settings.py b/frappe/integrations/doctype/paypal_settings/paypal_settings.py
index 83a1cb0aab..62e0555437 100644
--- a/frappe/integrations/doctype/paypal_settings/paypal_settings.py
+++ b/frappe/integrations/doctype/paypal_settings/paypal_settings.py
@@ -66,12 +66,12 @@ More Details:
from __future__ import unicode_literals
import frappe
import json
+import pytz
from frappe import _
-from datetime import datetime
from six.moves.urllib.parse import urlencode
from frappe.model.document import Document
from frappe.integrations.utils import create_request_log, make_post_request, create_payment_gateway
-from frappe.utils import get_url, call_hook_method, cint, get_timestamp, cstr, now, date_diff, get_datetime
+from frappe.utils import get_url, call_hook_method, cint, get_datetime
api_path = '/api/method/frappe.integrations.doctype.paypal_settings.paypal_settings'
@@ -309,9 +309,11 @@ def create_recurring_profile(token, payerid):
"INITAMT": data.get("upfront_amount")
})
- starts_at = get_datetime(subscription_details.get("start_date")) or frappe.utils.now_datetime()
status_changed_to = 'Completed' if data.get("starting_immediately") or updating else 'Verified'
+ starts_at = get_datetime(subscription_details.get("start_date")) or frappe.utils.now_datetime()
+ starts_at = starts_at.replace(tzinfo=pytz.timezone(frappe.utils.get_time_zone())).astimezone(pytz.utc)
+
#"PROFILESTARTDATE": datetime.utcfromtimestamp(get_timestamp(starts_at)).isoformat()
params.update({
"PROFILESTARTDATE": starts_at.isoformat()
diff --git a/frappe/patches.txt b/frappe/patches.txt
index c3799ccca9..cea8de972d 100644
--- a/frappe/patches.txt
+++ b/frappe/patches.txt
@@ -12,7 +12,6 @@ execute:frappe.reload_doc('core', 'doctype', 'docperm') #2018-05-29
frappe.patches.v8_0.drop_is_custom_from_docperm
execute:frappe.reload_doc('core', 'doctype', 'module_def') #2017-09-22
execute:frappe.reload_doc('core', 'doctype', 'version') #2017-04-01
-frappe.patches.v11_0.copy_fetch_data_from_options
frappe.patches.v7_1.rename_scheduler_log_to_error_log
frappe.patches.v6_1.rename_file_data
frappe.patches.v7_0.re_route #2016-06-27
@@ -20,6 +19,7 @@ frappe.patches.v8_0.update_records_in_global_search #11-05-2017
frappe.patches.v8_0.update_published_in_global_search
frappe.patches.v11_0.replicate_old_user_permissions
frappe.patches.v11_0.drop_column_apply_user_permissions
+frappe.patches.v11_0.copy_fetch_data_from_options
frappe.patches.v11_0.change_email_signature_fieldtype
execute:frappe.reload_doc('core', 'doctype', 'activity_log')
execute:frappe.reload_doc('core', 'doctype', 'deleted_document')
diff --git a/frappe/patches/v11_0/fix_order_by_in_reports_json.py b/frappe/patches/v11_0/fix_order_by_in_reports_json.py
index 28558ef4fb..561efdcee3 100644
--- a/frappe/patches/v11_0/fix_order_by_in_reports_json.py
+++ b/frappe/patches/v11_0/fix_order_by_in_reports_json.py
@@ -7,6 +7,9 @@ def execute():
for d in reports_data:
doc = frappe.get_doc('Report', d.get('name'))
+
+ if not doc.get('json'): continue
+
json_data = json.loads(doc.get('json'))
parts = []
diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js
index 77e691191a..1668d4a25d 100644
--- a/frappe/public/js/frappe/views/reports/report_view.js
+++ b/frappe/public/js/frappe/views/reports/report_view.js
@@ -1055,8 +1055,9 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
for (let cdt in values) {
fields = fields.concat(values[cdt].map(f => [f, cdt]));
}
-
- this.fields = fields;
+
+ // always keep name (ID) column
+ this.fields = [["name", this.doctype], ...fields];
this.fields.map(f => this.add_currency_column(f[0], f[1]));
diff --git a/frappe/public/less/chat.less b/frappe/public/less/chat.less
index 74fd78c01b..290e068d90 100644
--- a/frappe/public/less/chat.less
+++ b/frappe/public/less/chat.less
@@ -3,7 +3,7 @@
// http://codeguide.co - @mdo (Author of Bootstrap)
@import "flex.less";
-@import {reference} "common.less";
+@import (reference) "common.less";
// Typography
@font-weight-bold: 700;