@@ -1 +1 @@ | |||||
__version__ = "4.11.1" | |||||
__version__ = "4.11.2" |
@@ -5,8 +5,8 @@ from __future__ import unicode_literals | |||||
import frappe, json | import frappe, json | ||||
from frappe import _ | from frappe import _ | ||||
from frappe.website.render import clear_cache | from frappe.website.render import clear_cache | ||||
from frappe.model.document import Document | from frappe.model.document import Document | ||||
from frappe.model.db_schema import add_column | |||||
class Comment(Document): | class Comment(Document): | ||||
@@ -20,39 +20,44 @@ class Comment(Document): | |||||
def update_comment_in_doc(self): | def update_comment_in_doc(self): | ||||
if self.comment_doctype and self.comment_docname and self.comment and self.comment_type=="Comment": | if self.comment_doctype and self.comment_docname and self.comment and self.comment_type=="Comment": | ||||
try: | |||||
_comments = self.get_comments_from_parent() | |||||
updated = False | |||||
for c in _comments: | |||||
if c.get("name")==self.name: | |||||
c["comment"] = self.comment | |||||
updated = True | |||||
if not updated: | |||||
_comments.append({ | |||||
"comment": self.comment, | |||||
"by": self.comment_by or self.owner, | |||||
"name":self.name | |||||
}) | |||||
self.update_comments_in_parent(_comments) | |||||
except Exception, e: | |||||
if e.args[0]==1054: | |||||
if frappe.flags.in_test: | |||||
return | |||||
from frappe.model.db_schema import add_column | |||||
add_column(self.comment_doctype, "_comments", "Text") | |||||
self.update_comment_in_doc() | |||||
elif e.args[0]==1146: | |||||
# no table | |||||
pass | |||||
else: | |||||
raise | |||||
_comments = self.get_comments_from_parent() | |||||
updated = False | |||||
for c in _comments: | |||||
if c.get("name")==self.name: | |||||
c["comment"] = self.comment | |||||
updated = True | |||||
if not updated: | |||||
_comments.append({ | |||||
"comment": self.comment, | |||||
"by": self.comment_by or self.owner, | |||||
"name":self.name | |||||
}) | |||||
self.update_comments_in_parent(_comments) | |||||
def get_comments_from_parent(self): | def get_comments_from_parent(self): | ||||
_comments = frappe.db.get_value(self.comment_doctype, | |||||
self.comment_docname, "_comments") or "[]" | |||||
return json.loads(_comments) | |||||
try: | |||||
_comments = frappe.db.get_value(self.comment_doctype, | |||||
self.comment_docname, "_comments") or "[]" | |||||
return json.loads(_comments) | |||||
except Exception, e: | |||||
if e.args[0]==1054: | |||||
if frappe.flags.in_test: | |||||
return | |||||
add_column(self.comment_doctype, "_comments", "Text") | |||||
return self.get_comments_from_parent() | |||||
elif e.args[0]==1146: | |||||
# no table | |||||
pass | |||||
else: | |||||
raise | |||||
def update_comments_in_parent(self, _comments): | def update_comments_in_parent(self, _comments): | ||||
# use sql, so that we do not mess with the timestamp | # use sql, so that we do not mess with the timestamp | ||||
@@ -80,3 +85,4 @@ def on_doctype_update(): | |||||
frappe.db.commit() | frappe.db.commit() | ||||
frappe.db.sql("""alter table `tabComment` | frappe.db.sql("""alter table `tabComment` | ||||
add index comment_doctype_docname_index(comment_doctype, comment_docname)""") | add index comment_doctype_docname_index(comment_doctype, comment_docname)""") | ||||
@@ -44,7 +44,7 @@ def get_notifications(): | |||||
"open_count":result}).insert(ignore_permissions=True) | "open_count":result}).insert(ignore_permissions=True) | ||||
except MySQLdb.OperationalError, e: | except MySQLdb.OperationalError, e: | ||||
if e.args[0] != 1213: | |||||
if e.args[0] not in (1213, 1205): | |||||
raise | raise | ||||
logger.error("Deadlock") | logger.error("Deadlock") | ||||
@@ -60,7 +60,7 @@ def get_notifications(): | |||||
"open_count":open_count_module[m]}).insert(ignore_permissions=True) | "open_count":open_count_module[m]}).insert(ignore_permissions=True) | ||||
except MySQLdb.OperationalError, e: | except MySQLdb.OperationalError, e: | ||||
if e.args[0] != 1213: | |||||
if e.args[0] not in (1213, 1205): | |||||
raise | raise | ||||
logger.error("Deadlock") | logger.error("Deadlock") | ||||
@@ -82,7 +82,7 @@ def clear_notifications(user=None): | |||||
frappe.db.sql("""delete from `tabNotification Count`""") | frappe.db.sql("""delete from `tabNotification Count`""") | ||||
except MySQLdb.OperationalError, e: | except MySQLdb.OperationalError, e: | ||||
if e.args[0] != 1213: | |||||
if e.args[0] not in (1213, 1205): | |||||
raise | raise | ||||
logger.error("Deadlock") | logger.error("Deadlock") | ||||
@@ -94,7 +94,7 @@ def delete_notification_count_for(doctype): | |||||
frappe.db.sql("""delete from `tabNotification Count` where for_doctype = %s""", (doctype,)) | frappe.db.sql("""delete from `tabNotification Count` where for_doctype = %s""", (doctype,)) | ||||
except MySQLdb.OperationalError, e: | except MySQLdb.OperationalError, e: | ||||
if e.args[0] != 1213: | |||||
if e.args[0] not in (1213, 1205): | |||||
raise | raise | ||||
logger.error("Deadlock") | logger.error("Deadlock") | ||||
@@ -29,10 +29,10 @@ def validate(user, doctype): | |||||
def get_columns_and_fields(doctype): | def get_columns_and_fields(doctype): | ||||
columns = ["Name:Link/{}:200".format(doctype)] | columns = ["Name:Link/{}:200".format(doctype)] | ||||
fields = ["name"] | |||||
fields = ["`name`"] | |||||
for df in frappe.get_meta(doctype).fields: | for df in frappe.get_meta(doctype).fields: | ||||
if df.in_list_view and df.fieldtype in type_map: | if df.in_list_view and df.fieldtype in type_map: | ||||
fields.append(df.fieldname) | |||||
fields.append("`{0}`".format(df.fieldname)) | |||||
fieldtype = "Link/{}".format(df.options) if df.fieldtype=="Link" else df.fieldtype | fieldtype = "Link/{}".format(df.options) if df.fieldtype=="Link" else df.fieldtype | ||||
columns.append("{label}:{fieldtype}:{width}".format(label=df.label, fieldtype=fieldtype, width=df.width or 100)) | columns.append("{label}:{fieldtype}:{width}".format(label=df.label, fieldtype=fieldtype, width=df.width or 100)) | ||||
@@ -3,7 +3,7 @@ app_title = "Frappe Framework" | |||||
app_publisher = "Web Notes Technologies Pvt. Ltd." | app_publisher = "Web Notes Technologies Pvt. Ltd." | ||||
app_description = "Full Stack Web Application Framework in Python" | app_description = "Full Stack Web Application Framework in Python" | ||||
app_icon = "assets/frappe/images/frappe.svg" | app_icon = "assets/frappe/images/frappe.svg" | ||||
app_version = "4.11.1" | |||||
app_version = "4.11.2" | |||||
app_color = "#3498db" | app_color = "#3498db" | ||||
app_email = "support@frappe.io" | app_email = "support@frappe.io" | ||||
@@ -107,7 +107,7 @@ def extract_images_from_html(doc, fieldname): | |||||
return '<img src="{file_url}"'.format(file_url=file_url) | return '<img src="{file_url}"'.format(file_url=file_url) | ||||
if content: | if content: | ||||
content = re.sub('<img\s*src=\s*["\'](.*?)["\']', _save_file, content) | |||||
content = re.sub('<img\s*src=\s*["\'](?=data:)(.*?)["\']', _save_file, content) | |||||
if frappe.flags.has_dataurl: | if frappe.flags.has_dataurl: | ||||
doc.set(fieldname, content) | doc.set(fieldname, content) | ||||
@@ -1,7 +1,7 @@ | |||||
from setuptools import setup, find_packages | from setuptools import setup, find_packages | ||||
import os | import os | ||||
version = "4.11.1" | |||||
version = "4.11.2" | |||||
with open("requirements.txt", "r") as f: | with open("requirements.txt", "r") as f: | ||||
install_requires = f.readlines() | install_requires = f.readlines() | ||||