Pārlūkot izejas kodu

#478, fix sync and other minor fixes

version-14
Rushabh Mehta pirms 11 gadiem
vecāks
revīzija
f686c769b4
7 mainītis faili ar 124 papildinājumiem un 115 dzēšanām
  1. +2
    -2
      frappe/cli.py
  2. +14
    -9
      frappe/core/page/data_import_tool/data_import_tool.py
  3. +28
    -28
      frappe/core/page/data_import_tool/importer.py
  4. +16
    -12
      frappe/model/delete_doc.py
  5. +31
    -31
      frappe/templates/generators/website_group.py
  6. +32
    -32
      frappe/templates/website_group/post.py
  7. +1
    -1
      frappe/utils/fixtures.py

+ 2
- 2
frappe/cli.py Parādīt failu

@@ -362,13 +362,13 @@ def latest(verbose=True, rebuild_website_config=True, quiet=False):


# sync # sync
frappe.model.sync.sync_all(verbose=verbose) frappe.model.sync.sync_all(verbose=verbose)
sync_fixtures()


statics.sync().start()
# build website config if any changes in templates etc. # build website config if any changes in templates etc.
if rebuild_website_config: if rebuild_website_config:
rebuild_config() rebuild_config()


statics.sync().start()
sync_fixtures()


frappe.translate.clear_cache() frappe.translate.clear_cache()




+ 14
- 9
frappe/core/page/data_import_tool/data_import_tool.py Parādīt failu

@@ -18,11 +18,11 @@ data_keys = frappe._dict({
@frappe.whitelist() @frappe.whitelist()
def get_doctypes(): def get_doctypes():
if "System Manager" in frappe.get_roles(): if "System Manager" in frappe.get_roles():
return [r[0] for r in frappe.db.sql("""select name from `tabDocType`
return [r[0] for r in frappe.db.sql("""select name from `tabDocType`
where allow_import = 1""")] where allow_import = 1""")]
else: else:
return frappe.user._get("can_import") return frappe.user._get("can_import")
@frappe.whitelist() @frappe.whitelist()
def get_doctype_options(): def get_doctype_options():
doctype = frappe.form_dict['doctype'] doctype = frappe.form_dict['doctype']
@@ -35,7 +35,7 @@ def import_file_by_path(path, ignore_links=False, overwrite=False, submit=False)
from frappe.core.page.data_import_tool.importer import upload from frappe.core.page.data_import_tool.importer import upload
print "Importing " + path print "Importing " + path
with open(path, "r") as infile: with open(path, "r") as infile:
upload(rows = read_csv_content(infile), ignore_links=ignore_links, overwrite=overwrite, submit_after_import=submit)
upload(rows = read_csv_content(infile.read()), ignore_links=ignore_links, overwrite=overwrite, submit_after_import=submit)


def export_csv(doctype, path): def export_csv(doctype, path):
from frappe.core.page.data_import_tool.exporter import get_template from frappe.core.page.data_import_tool.exporter import get_template
@@ -59,25 +59,30 @@ def export_json(doctype, name, path):
def export_fixture(doctype, name, app): def export_fixture(doctype, name, app):
if frappe.session.user != "Administrator": if frappe.session.user != "Administrator":
raise frappe.PermissionError raise frappe.PermissionError
if not os.path.exists(frappe.get_app_path(app, "fixtures")): if not os.path.exists(frappe.get_app_path(app, "fixtures")):
os.mkdir(frappe.get_app_path(app, "fixtures")) os.mkdir(frappe.get_app_path(app, "fixtures"))
export_json(doctype, name, frappe.get_app_path(app, "fixtures", frappe.scrub(name) + ".json")) export_json(doctype, name, frappe.get_app_path(app, "fixtures", frappe.scrub(name) + ".json"))


def import_doc(path, overwrite=False, ignore_links=False, ignore_insert=False, insert=False, submit=False): def import_doc(path, overwrite=False, ignore_links=False, ignore_insert=False, insert=False, submit=False):
if os.path.isdir(path): if os.path.isdir(path):
files = [os.path.join(path, f) for f in os.listdir(path)] files = [os.path.join(path, f) for f in os.listdir(path)]
else: else:
files = [path] files = [path]
def _import_doc(d): def _import_doc(d):
doc = frappe.get_doc(d) doc = frappe.get_doc(d)
doc.ignore_links = ignore_links doc.ignore_links = ignore_links
if insert: if insert:
doc.set("__islocal", True) doc.set("__islocal", True)
try: try:
if doc.name and overwrite:
if frappe.db.exists(doc.doctype, doc.name):
frappe.delete_doc(doc.doctype, doc.name, force=True)
doc.set("__islocal", True)
doc.ignore_links = ignore_links
doc.save() doc.save()
except NameError: except NameError:
if ignore_insert: if ignore_insert:
@@ -85,7 +90,7 @@ def import_doc(path, overwrite=False, ignore_links=False, ignore_insert=False, i
else: else:
raise raise
print "Imported: " + doc.doctype + " / " + doc.name print "Imported: " + doc.doctype + " / " + doc.name
for f in files: for f in files:
if f.endswith(".json"): if f.endswith(".json"):
with open(f, "r") as infile: with open(f, "r") as infile:
@@ -97,5 +102,5 @@ def import_doc(path, overwrite=False, ignore_links=False, ignore_insert=False, i
_import_doc(data) _import_doc(data)
frappe.db.commit() frappe.db.commit()
if f.endswith(".csv"): if f.endswith(".csv"):
import_file_by_path(f, ignore_links=True, overwrite=overwrite, submit=submit)
import_file_by_path(f, ignore_links=ignore_links, overwrite=overwrite, submit=submit)
frappe.db.commit() frappe.db.commit()

+ 28
- 28
frappe/core/page/data_import_tool/importer.py Parādīt failu

@@ -17,7 +17,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
frappe.flags.mute_emails = True frappe.flags.mute_emails = True
# extra input params # extra input params
params = json.loads(frappe.form_dict.get("params") or '{}') params = json.loads(frappe.form_dict.get("params") or '{}')
if params.get("_submit"): if params.get("_submit"):
submit_after_import = True submit_after_import = True
if params.get("ignore_encoding_errors"): if params.get("ignore_encoding_errors"):
@@ -54,7 +54,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,


def filter_empty_columns(columns): def filter_empty_columns(columns):
empty_cols = filter(lambda x: x in ("", None), columns) empty_cols = filter(lambda x: x in ("", None), columns)
if empty_cols: if empty_cols:
if columns[-1*len(empty_cols):] == empty_cols: if columns[-1*len(empty_cols):] == empty_cols:
# filter empty columns if they exist at the end # filter empty columns if they exist at the end
@@ -69,7 +69,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
doctype_row, row_idx = get_header_row_and_idx(data_keys.doctype) doctype_row, row_idx = get_header_row_and_idx(data_keys.doctype)
if row_idx == -1: # old style if row_idx == -1: # old style
return return
dt = None dt = None
for i, d in enumerate(doctype_row[1:]): for i, d in enumerate(doctype_row[1:]):
if d not in ("~", "-"): if d not in ("~", "-"):
@@ -97,7 +97,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
try: try:
fieldname = column_idx_to_fieldname[dt][column_idx] fieldname = column_idx_to_fieldname[dt][column_idx]
fieldtype = column_idx_to_fieldtype[dt][column_idx] fieldtype = column_idx_to_fieldtype[dt][column_idx]
d[fieldname] = rows[idx][column_idx] d[fieldname] = rows[idx][column_idx]
if fieldtype in ("Int", "Check"): if fieldtype in ("Int", "Check"):
d[fieldname] = cint(d[fieldname]) d[fieldname] = cint(d[fieldname])
@@ -105,7 +105,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
d[fieldname] = flt(d[fieldname]) d[fieldname] = flt(d[fieldname])
except IndexError, e: except IndexError, e:
pass pass
# scrub quotes from name and modified # scrub quotes from name and modified
if d.get("name") and d["name"].startswith('"'): if d.get("name") and d["name"].startswith('"'):
d["name"] = d["name"][1:-1] d["name"] = d["name"][1:-1]
@@ -125,13 +125,13 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,


return doc return doc
else: else:
d = frappe._dict(zip(columns, rows[start_idx][1:]))
d['doctype'] = doctype
return [d]
doc = frappe._dict(zip(columns, rows[start_idx][1:]))
doc['doctype'] = doctype
return doc


def main_doc_empty(row): def main_doc_empty(row):
return not (row and ((len(row) > 1 and row[1]) or (len(row) > 2 and row[2]))) return not (row and ((len(row) > 1 and row[1]) or (len(row) > 2 and row[2])))
# header # header
if not rows: if not rows:
rows = read_csv_content_from_uploaded_file(ignore_encoding_errors) rows = read_csv_content_from_uploaded_file(ignore_encoding_errors)
@@ -144,13 +144,13 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
doctype_parentfield = {} doctype_parentfield = {}
column_idx_to_fieldname = {} column_idx_to_fieldname = {}
column_idx_to_fieldtype = {} column_idx_to_fieldtype = {}
if submit_after_import and not cint(frappe.db.get_value("DocType",
if submit_after_import and not cint(frappe.db.get_value("DocType",
doctype, "is_submittable")): doctype, "is_submittable")):
submit_after_import = False submit_after_import = False


parenttype = get_header_row(data_keys.parent_table) parenttype = get_header_row(data_keys.parent_table)
if len(parenttype) > 1: if len(parenttype) > 1:
parenttype = parenttype[1] parenttype = parenttype[1]
parentfield = get_parent_field(doctype, parenttype) parentfield = get_parent_field(doctype, parenttype)
@@ -159,15 +159,15 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
if not frappe.permissions.can_import(parenttype or doctype): if not frappe.permissions.can_import(parenttype or doctype):
frappe.flags.mute_emails = False frappe.flags.mute_emails = False
return {"messages": [_("Not allowed to Import") + ": " + _(doctype)], "error": True} return {"messages": [_("Not allowed to Import") + ": " + _(doctype)], "error": True}
# allow limit rows to be uploaded # allow limit rows to be uploaded
check_data_length() check_data_length()
make_column_map() make_column_map()
frappe.db.begin() frappe.db.begin()
if overwrite==None: if overwrite==None:
overwrite = params.get('overwrite') overwrite = params.get('overwrite')
# delete child rows (if parenttype) # delete child rows (if parenttype)
if parenttype and overwrite: if parenttype and overwrite:
delete_child_rows(data, doctype) delete_child_rows(data, doctype)
@@ -179,10 +179,10 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
# bypass empty rows # bypass empty rows
if main_doc_empty(row): if main_doc_empty(row):
continue continue
row_idx = i + start_row row_idx = i + start_row
doc = None doc = None
doc = get_doc(row_idx) doc = get_doc(row_idx)
try: try:
frappe.local.message_log = [] frappe.local.message_log = []
@@ -192,7 +192,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
parent.save() parent.save()
ret.append('Inserted row for %s at #%s' % (getlink(parenttype, ret.append('Inserted row for %s at #%s' % (getlink(parenttype,
doc.parent), unicode(doc.idx))) doc.parent), unicode(doc.idx)))
else: else:
if overwrite and frappe.db.exists(doctype, doc["name"]): if overwrite and frappe.db.exists(doctype, doc["name"]):
original = frappe.get_doc(doctype, doc["name"]) original = frappe.get_doc(doctype, doc["name"])
@@ -210,36 +210,36 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
except Exception, e: except Exception, e:
error = True error = True
if doc: if doc:
frappe.errprint(doc.as_dict())
frappe.errprint(doc if isinstance(doc, dict) else doc.as_dict())
err_msg = frappe.local.message_log and "<br>".join(frappe.local.message_log) or cstr(e) err_msg = frappe.local.message_log and "<br>".join(frappe.local.message_log) or cstr(e)
ret.append('Error for row (#%d) %s : %s' % (row_idx + 1,
ret.append('Error for row (#%d) %s : %s' % (row_idx + 1,
len(row)>1 and row[1] or "", err_msg)) len(row)>1 and row[1] or "", err_msg))
frappe.errprint(frappe.get_traceback()) frappe.errprint(frappe.get_traceback())
if error: if error:
frappe.db.rollback()
frappe.db.rollback()
else: else:
frappe.db.commit() frappe.db.commit()
frappe.flags.mute_emails = False frappe.flags.mute_emails = False
return {"messages": ret, "error": error} return {"messages": ret, "error": error}
def get_parent_field(doctype, parenttype): def get_parent_field(doctype, parenttype):
parentfield = None parentfield = None
# get parentfield # get parentfield
if parenttype: if parenttype:
for d in frappe.get_meta(parenttype).get_table_fields(): for d in frappe.get_meta(parenttype).get_table_fields():
if d.options==doctype: if d.options==doctype:
parentfield = d.fieldname parentfield = d.fieldname
break break
if not parentfield: if not parentfield:
frappe.msgprint("Did not find parentfield for %s (%s)" % \ frappe.msgprint("Did not find parentfield for %s (%s)" % \
(parenttype, doctype)) (parenttype, doctype))
raise Exception raise Exception
return parentfield return parentfield


def delete_child_rows(rows, doctype): def delete_child_rows(rows, doctype):


+ 16
- 12
frappe/model/delete_doc.py Parādīt failu

@@ -19,7 +19,7 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa
if not doctype: if not doctype:
doctype = frappe.form_dict.get('dt') doctype = frappe.form_dict.get('dt')
name = frappe.form_dict.get('dn') name = frappe.form_dict.get('dn')
if not doctype: if not doctype:
frappe.msgprint('Nothing to delete!', raise_exception =1) frappe.msgprint('Nothing to delete!', raise_exception =1)


@@ -28,16 +28,20 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa
return return


doc = frappe.get_doc(doctype, name) doc = frappe.get_doc(doctype, name)
if not for_reload: if not for_reload:
check_permission_and_not_submitted(doc, ignore_permissions) check_permission_and_not_submitted(doc, ignore_permissions)
doc.run_method("on_trash") doc.run_method("on_trash")
# check if links exist # check if links exist
if not force: if not force:
check_if_doc_is_linked(doc) check_if_doc_is_linked(doc)
try: try:
frappe.db.sql("delete from `tab%s` where name=%s" % (doctype, "%s"), (name,))
if doctype==name:
frappe.db.sql("delete from `tabSingles` where doctype=%s", name)
else:
frappe.db.sql("delete from `tab%s` where name=%s" % (doctype, "%s"), (name,))

for t in doc.meta.get_table_fields(): for t in doc.meta.get_table_fields():
if t.options not in ignore_doctypes: if t.options not in ignore_doctypes:
frappe.db.sql("delete from `tab%s` where parent = %s" % (t.options, '%s'), (name,)) frappe.db.sql("delete from `tab%s` where parent = %s" % (t.options, '%s'), (name,))
@@ -45,15 +49,15 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa
except Exception, e: except Exception, e:
if e.args[0]==1451: if e.args[0]==1451:
frappe.msgprint("Cannot delete %s '%s' as it is referenced in another record. You must delete the referred record first" % (doctype, name)) frappe.msgprint("Cannot delete %s '%s' as it is referenced in another record. You must delete the referred record first" % (doctype, name))
raise raise
# delete attachments # delete attachments
remove_all(doctype, name) remove_all(doctype, name)
# delete restrictions # delete restrictions
frappe.defaults.clear_default(parenttype="Restriction", key=doctype, value=name) frappe.defaults.clear_default(parenttype="Restriction", key=doctype, value=name)
return 'okay' return 'okay'


def check_permission_and_not_submitted(doc, ignore_permissions=False): def check_permission_and_not_submitted(doc, ignore_permissions=False):
@@ -78,12 +82,12 @@ def check_if_doc_is_linked(doc, method="Delete"):


for link_dt, link_field, issingle in link_fields: for link_dt, link_field, issingle in link_fields:
if not issingle: if not issingle:
item = frappe.db.get_value(link_dt, {link_field:doc.name},
item = frappe.db.get_value(link_dt, {link_field:doc.name},
["name", "parent", "parenttype", "docstatus"], as_dict=True) ["name", "parent", "parenttype", "docstatus"], as_dict=True)
if item and item.parent != doc.name and ((method=="Delete" and item.docstatus<2) or
if item and item.parent != doc.name and ((method=="Delete" and item.docstatus<2) or
(method=="Cancel" and item.docstatus==1)): (method=="Cancel" and item.docstatus==1)):
frappe.msgprint(method + " " + _("Error") + ":"+\ frappe.msgprint(method + " " + _("Error") + ":"+\
("%s (%s) " % (doc.name, doc.doctype)) + _("is linked in") + (" %s (%s)") %
("%s (%s) " % (doc.name, doc.doctype)) + _("is linked in") + (" %s (%s)") %
(item.parent or item.name, item.parent and item.parenttype or link_dt), (item.parent or item.name, item.parent and item.parenttype or link_dt),
raise_exception=LinkExistsError) raise_exception=LinkExistsError)

+ 31
- 31
frappe/templates/generators/website_group.py Parādīt failu

@@ -13,13 +13,13 @@ no_cache = 1


def get_context(context): def get_context(context):
group, view = guess_group_view(context) group, view = guess_group_view(context)
try: try:
if not has_access(context.access, view): if not has_access(context.access, view):
raise frappe.PermissionError raise frappe.PermissionError
return get_group_context(group, view, context) return get_group_context(group, view, context)
except frappe.DoesNotExistError: except frappe.DoesNotExistError:
return { return {
"content": '<div class="alert alert-danger full-page">' "content": '<div class="alert alert-danger full-page">'
@@ -30,48 +30,48 @@ def get_context(context):
"content": '<div class="alert alert-danger full-page">' "content": '<div class="alert alert-danger full-page">'
'You are not permitted to view this page.</div>' 'You are not permitted to view this page.</div>'
} }
def get_group_context(group, view, context): def get_group_context(group, view, context):
cache_key = "website_group_context:{}:{}".format(group, view) cache_key = "website_group_context:{}:{}".format(group, view)


views = get_views(context.doc.group_type) views = get_views(context.doc.group_type)
view = frappe._dict(views.get(view)) view = frappe._dict(views.get(view))
if can_cache(view.no_cache): if can_cache(view.no_cache):
group_context = frappe.cache().get_value(cache_key) group_context = frappe.cache().get_value(cache_key)
if group_context: if group_context:
return group_context return group_context
group_context = build_group_context(group, view, views, context) group_context = build_group_context(group, view, views, context)
if can_cache(view.get("no_cache")): if can_cache(view.get("no_cache")):
frappe.cache().set_value(cache_key, group_context) frappe.cache().set_value(cache_key, group_context)
return group_context return group_context
def build_group_context(group, view, views, context): def build_group_context(group, view, views, context):
title = "{} - {}".format(context.doc.group_title, view.get("label")) title = "{} - {}".format(context.doc.group_title, view.get("label"))
group_context = frappe._dict({ group_context = frappe._dict({
"group": context.doc.as_dict(),
"group": context.doc,
"view": view, "view": view,
"views": [v[1] for v in sorted(views.iteritems(), key=lambda (k, v): v.get("idx"))], "views": [v[1] for v in sorted(views.iteritems(), key=lambda (k, v): v.get("idx"))],
"title": title, "title": title,
"pathname": context.pathname "pathname": context.pathname
}) })
group_context.update(build_view_context(group_context)) group_context.update(build_view_context(group_context))
return group_context return group_context
def build_view_context(context): def build_view_context(context):
from frappe.templates.website_group.post import get_post_context from frappe.templates.website_group.post import get_post_context
if context.view.name in ("popular", "feed", "open", "closed", "upcoming", "past"): if context.view.name in ("popular", "feed", "open", "closed", "upcoming", "past"):
context.post_list_html = get_post_list_html(context.group.name, context.view.name) context.post_list_html = get_post_list_html(context.group.name, context.view.name)
elif context.view.name == "edit": elif context.view.name == "edit":
context.post = frappe.get_doc("Post", frappe.form_dict.name).as_dict() context.post = frappe.get_doc("Post", frappe.form_dict.name).as_dict()
if context.post.assigned_to: if context.post.assigned_to:
context.user = frappe.get_doc("User", context.post.assigned_to) context.user = frappe.get_doc("User", context.post.assigned_to)


@@ -79,22 +79,22 @@ def build_view_context(context):
context.users = frappe.db.sql("""select p.*, wsp.`read`, wsp.`write`, wsp.`admin` context.users = frappe.db.sql("""select p.*, wsp.`read`, wsp.`write`, wsp.`admin`
from `tabUser` p, `tabWebsite Route Permission` wsp from `tabUser` p, `tabWebsite Route Permission` wsp
where wsp.website_route=%s and wsp.user=p.name""", context.pathname, as_dict=True) where wsp.website_route=%s and wsp.user=p.name""", context.pathname, as_dict=True)
elif context.view.name == "post": elif context.view.name == "post":
context.update(get_post_context(context)) context.update(get_post_context(context))
return context return context
def guess_group_view(context): def guess_group_view(context):
group = context.docname group = context.docname
view = frappe.form_dict.view or get_default_view(context.doc.group_type) view = frappe.form_dict.view or get_default_view(context.doc.group_type)
return group, view return group, view
def get_default_view(group_type): def get_default_view(group_type):
for view, opts in get_views(group_type).iteritems(): for view, opts in get_views(group_type).iteritems():
if opts.get("default"): if opts.get("default"):
return view return view
def get_views(group_type=None): def get_views(group_type=None):
if group_type: if group_type:
group_views = frappe._dict(views[group_type]) group_views = frappe._dict(views[group_type])
@@ -102,22 +102,22 @@ def get_views(group_type=None):
group_views = {} group_views = {}
for group_type in views: for group_type in views:
group_views.update(views[group_type].copy()) group_views.update(views[group_type].copy())
group_views.update(common_views) group_views.update(common_views)
if group_type == "Forum": if group_type == "Forum":
group_views["post"]["upvote"] = True group_views["post"]["upvote"] = True
return group_views return group_views
def has_access(access, view):
def has_access(access, view):
if view=="settings": if view=="settings":
return access.get("admin") return access.get("admin")
elif view in ("add", "edit"): elif view in ("add", "edit"):
return access.get("write") return access.get("write")
else: else:
return access.get("read") return access.get("read")
def clear_cache(path=None, website_group=None): def clear_cache(path=None, website_group=None):
from frappe.templates.website_group.post import clear_post_cache from frappe.templates.website_group.post import clear_post_cache
if path: if path:
@@ -127,7 +127,7 @@ def clear_cache(path=None, website_group=None):
else: else:
clear_post_cache() clear_post_cache()
website_groups = frappe.db.sql_list("""select name from `tabWebsite Group`""") website_groups = frappe.db.sql_list("""select name from `tabWebsite Group`""")
cache = frappe.cache() cache = frappe.cache()
all_views = get_views() all_views = get_views()
for group in website_groups: for group in website_groups:
@@ -137,10 +137,10 @@ def clear_cache(path=None, website_group=None):
def clear_event_cache(): def clear_event_cache():
for group in frappe.db.sql_list("""select name from `tabWebsite Group` where group_type='Event'"""): for group in frappe.db.sql_list("""select name from `tabWebsite Group` where group_type='Event'"""):
clear_unit_views(website_group=group) clear_unit_views(website_group=group)
def clear_cache_on_doc_event(doc, method, *args, **kwargs): def clear_cache_on_doc_event(doc, method, *args, **kwargs):
clear_cache(path=doc.website_route, website_group=doc.website_group) clear_cache(path=doc.website_route, website_group=doc.website_group)
def get_pathname(group): def get_pathname(group):
return frappe.db.get_value("Website Route", {"ref_doctype": "Website Group", return frappe.db.get_value("Website Route", {"ref_doctype": "Website Group",
"docname": group}) "docname": group})
@@ -237,4 +237,4 @@ common_views = {
"hidden": True, "hidden": True,
"idx": 6 "idx": 6
} }
}
}

+ 32
- 32
frappe/templates/website_group/post.py Parādīt failu

@@ -12,7 +12,7 @@ def get_post_context(context):
post = frappe.get_doc("Post", frappe.form_dict.name) post = frappe.get_doc("Post", frappe.form_dict.name)
if post.parent_post: if post.parent_post:
raise frappe.PermissionError raise frappe.PermissionError
def _get_post_context(): def _get_post_context():
fullname = get_fullname(post.owner) fullname = get_fullname(post.owner)
return { return {
@@ -21,42 +21,42 @@ def get_post_context(context):
"post_list_html": get_child_posts_html(post, context), "post_list_html": get_child_posts_html(post, context),
"parent_post": post.name "parent_post": post.name
} }
cache_key = "website_group_post:{}".format(post.name) cache_key = "website_group_post:{}".format(post.name)
return frappe.cache().get_value(cache_key, lambda: _get_post_context()) return frappe.cache().get_value(cache_key, lambda: _get_post_context())
def get_parent_post_html(post, context): def get_parent_post_html(post, context):
user = frappe.get_doc("User", post.owner) user = frappe.get_doc("User", post.owner)
for fieldname in ("first_name", "last_name", "user_image", "location"): for fieldname in ("first_name", "last_name", "user_image", "location"):
post.set(fieldname, user.get(fieldname)) post.set(fieldname, user.get(fieldname))
return frappe.get_template("templates/includes/inline_post.html")\ return frappe.get_template("templates/includes/inline_post.html")\
.render({"post": post.as_dict(), "view": context.view})
.render({"post": post, "view": context.view})


def get_child_posts_html(post, context): def get_child_posts_html(post, context):
posts = frappe.db.sql("""select p.*, pr.user_image, pr.first_name, pr.last_name posts = frappe.db.sql("""select p.*, pr.user_image, pr.first_name, pr.last_name
from tabPost p, tabUser pr from tabPost p, tabUser pr
where p.parent_post=%s and pr.name = p.owner where p.parent_post=%s and pr.name = p.owner
order by p.creation asc""", (post.name,), as_dict=True) order by p.creation asc""", (post.name,), as_dict=True)
return frappe.get_template("templates/includes/post_list.html")\ return frappe.get_template("templates/includes/post_list.html")\
.render({ .render({
"posts": posts, "posts": posts,
"parent_post": post.name, "parent_post": post.name,
"view": context.view "view": context.view
}) })
def clear_post_cache(post=None): def clear_post_cache(post=None):
cache = frappe.cache() cache = frappe.cache()
posts = [post] if post else frappe.db.sql_list("select name from `tabPost`") posts = [post] if post else frappe.db.sql_list("select name from `tabPost`")


for post in posts: for post in posts:
cache.delete_value("website_group_post:{}".format(post)) cache.delete_value("website_group_post:{}".format(post))
@frappe.whitelist(allow_guest=True) @frappe.whitelist(allow_guest=True)
def add_post(group, content, picture, picture_name, title=None, parent_post=None,
def add_post(group, content, picture, picture_name, title=None, parent_post=None,
assigned_to=None, status=None, event_datetime=None): assigned_to=None, status=None, event_datetime=None):
access = get_access(get_pathname(group)) access = get_access(get_pathname(group))
if not access.get("write"): if not access.get("write"):
raise frappe.PermissionError raise frappe.PermissionError
@@ -64,8 +64,8 @@ def add_post(group, content, picture, picture_name, title=None, parent_post=None
if parent_post: if parent_post:
if frappe.db.get_value("Post", parent_post, "parent_post"): if frappe.db.get_value("Post", parent_post, "parent_post"):
frappe.throw("Cannot reply to a reply") frappe.throw("Cannot reply to a reply")
group = frappe.get_doc("Website Group", group)
group = frappe.get_doc("Website Group", group)
post = frappe.get_doc({ post = frappe.get_doc({
"doctype":"Post", "doctype":"Post",
"title": (title or "").title(), "title": (title or "").title(),
@@ -73,7 +73,7 @@ def add_post(group, content, picture, picture_name, title=None, parent_post=None
"website_group": group.name, "website_group": group.name,
"parent_post": parent_post or None "parent_post": parent_post or None
}) })
if not parent_post: if not parent_post:
if group.group_type == "Tasks": if group.group_type == "Tasks":
post.is_task = 1 post.is_task = 1
@@ -81,38 +81,38 @@ def add_post(group, content, picture, picture_name, title=None, parent_post=None
elif group.group_type == "Events": elif group.group_type == "Events":
post.is_event = 1 post.is_event = 1
post.event_datetime = event_datetime post.event_datetime = event_datetime
post.ignore_permissions = True post.ignore_permissions = True
post.insert() post.insert()


if picture_name and picture: if picture_name and picture:
process_picture(post, picture_name, picture) process_picture(post, picture_name, picture)
# send email # send email
if parent_post: if parent_post:
post.run_method("send_email_on_reply") post.run_method("send_email_on_reply")
return post.parent_post or post.name return post.parent_post or post.name
@frappe.whitelist(allow_guest=True) @frappe.whitelist(allow_guest=True)
def save_post(post, content, picture=None, picture_name=None, title=None, def save_post(post, content, picture=None, picture_name=None, title=None,
assigned_to=None, status=None, event_datetime=None): assigned_to=None, status=None, event_datetime=None):
post = frappe.get_doc("Post", post) post = frappe.get_doc("Post", post)
access = get_access(get_pathname(post.website_group)) access = get_access(get_pathname(post.website_group))
if not access.get("write"): if not access.get("write"):
raise frappe.PermissionError raise frappe.PermissionError
# TODO improve error message # TODO improve error message
if frappe.session.user != post.owner: if frappe.session.user != post.owner:
for fieldname in ("title", "content"): for fieldname in ("title", "content"):
if post.get(fieldname) != locals().get(fieldname): if post.get(fieldname) != locals().get(fieldname):
frappe.throw("You cannot change: {}".format(fieldname.title())) frappe.throw("You cannot change: {}".format(fieldname.title()))
if picture and picture_name: if picture and picture_name:
frappe.throw("You cannot change: Picture") frappe.throw("You cannot change: Picture")
post.update({ post.update({
"title": (title or "").title(), "title": (title or "").title(),
"content": content, "content": content,
@@ -122,34 +122,34 @@ def save_post(post, content, picture=None, picture_name=None, title=None,
}) })
post.ignore_permissions = True post.ignore_permissions = True
post.save() post.save()
if picture_name and picture: if picture_name and picture:
process_picture(post, picture_name, picture) process_picture(post, picture_name, picture)
return post.parent_post or post.name return post.parent_post or post.name
def process_picture(post, picture_name, picture): def process_picture(post, picture_name, picture):
from frappe.templates.generators.website_group import clear_cache from frappe.templates.generators.website_group import clear_cache
file_data = save_file(picture_name, picture, "Post", post.name, decode=True) file_data = save_file(picture_name, picture, "Post", post.name, decode=True)
post.picture_url = file_data.file_name or file_data.file_url post.picture_url = file_data.file_name or file_data.file_url
frappe.db.set_value("Post", post.name, "picture_url", post.picture_url) frappe.db.set_value("Post", post.name, "picture_url", post.picture_url)
clear_cache(website_group=post.website_group) clear_cache(website_group=post.website_group)
@frappe.whitelist() @frappe.whitelist()
def suggest_user(group, term): def suggest_user(group, term):
"""suggest a user that has read permission in this group tree""" """suggest a user that has read permission in this group tree"""
users = frappe.db.sql("""select
pr.name, pr.first_name, pr.last_name,
users = frappe.db.sql("""select
pr.name, pr.first_name, pr.last_name,
pr.user_image, pr.location pr.user_image, pr.location
from `tabUser` pr from `tabUser` pr
where (pr.first_name like %(term)s or pr.last_name like %(term)s) where (pr.first_name like %(term)s or pr.last_name like %(term)s)
and pr.user_type = 'Website User' and pr.enabled=1""",
and pr.user_type = 'Website User' and pr.enabled=1""",
{"term": "%{}%".format(term), "group": group}, as_dict=True) {"term": "%{}%".format(term), "group": group}, as_dict=True)
template = frappe.get_template("templates/includes/user_display.html") template = frappe.get_template("templates/includes/user_display.html")
return [{ return [{
"value": "{} {}".format(pr.first_name or "", pr.last_name or "").strip(),
"value": "{} {}".format(pr.first_name or "", pr.last_name or "").strip(),
"user_html": template.render({"user": pr}), "user_html": template.render({"user": pr}),
"user": pr.name "user": pr.name
} for pr in users] } for pr in users]

+ 1
- 1
frappe/utils/fixtures.py Parādīt failu

@@ -1,5 +1,5 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
# MIT License. See license.txt


from __future__ import unicode_literals from __future__ import unicode_literals




Notiek ielāde…
Atcelt
Saglabāt