Преглед на файлове

Merge pull request #3547 from rmehta/fixes-for-gst

Permissions and other minor fixes for GST
version-14
Makarand Bauskar преди 8 години
committed by GitHub
родител
ревизия
760ab551bb
променени са 24 файла, в които са добавени 199 реда и са изтрити 101 реда
  1. +21
    -2
      frappe/contacts/doctype/address/address.json
  2. +51
    -31
      frappe/contacts/doctype/contact/contact.json
  3. +3
    -1
      frappe/core/doctype/custom_role/custom_role.py
  4. +15
    -1
      frappe/core/doctype/doctype/doctype.py
  5. +6
    -6
      frappe/core/doctype/report/report.py
  6. +9
    -33
      frappe/core/page/permission_manager/permission_manager.py
  7. +0
    -3
      frappe/core/report/todo/__init__.py
  8. +2
    -1
      frappe/custom/doctype/custom_field/custom_field.py
  9. +5
    -0
      frappe/desk/page/setup_wizard/setup_wizard.py
  10. +5
    -4
      frappe/desk/query_report.py
  11. +0
    -0
      frappe/desk/report/__init__.py
  12. +0
    -0
      frappe/desk/report/todo/__init__.py
  13. +1
    -0
      frappe/desk/report/todo/todo.js
  14. +2
    -2
      frappe/desk/report/todo/todo.json
  15. +1
    -2
      frappe/desk/report/todo/todo.py
  16. +0
    -1
      frappe/model/document.py
  17. +17
    -0
      frappe/model/utils/__init__.py
  18. +1
    -1
      frappe/model/utils/user_settings.py
  19. +2
    -2
      frappe/modules/import_file.py
  20. +2
    -1
      frappe/patches.txt
  21. +27
    -1
      frappe/permissions.py
  22. +10
    -2
      frappe/public/css/form.css
  23. +8
    -5
      frappe/public/js/frappe/ui/toolbar/toolbar.js
  24. +11
    -2
      frappe/public/less/form.less

+ 21
- 2
frappe/contacts/doctype/address/address.json Целия файл

@@ -12,6 +12,7 @@
"editable_grid": 0,
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -41,11 +42,12 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "Name of person or organization that this address belongs to.",
"description": "",
"fieldname": "address_title",
"fieldtype": "Data",
"hidden": 0,
@@ -70,6 +72,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -99,6 +102,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -127,6 +131,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -155,6 +160,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -183,6 +189,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -212,6 +219,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -240,6 +248,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -269,6 +278,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -297,6 +307,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -325,6 +336,7 @@
"width": "50%"
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -353,6 +365,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -381,6 +394,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -409,6 +423,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -439,6 +454,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -469,6 +485,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -498,6 +515,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -528,6 +546,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -569,7 +588,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2017-04-10 13:09:45.030542",
"modified": "2017-06-21 11:30:20.719590",
"modified_by": "Administrator",
"module": "Contacts",
"name": "Address",


+ 51
- 31
frappe/contacts/doctype/contact/contact.json Целия файл

@@ -13,6 +13,7 @@
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -42,36 +43,7 @@
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "salutation",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Salutation",
"length": 0,
"no_copy": 0,
"options": "Salutation",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -102,6 +74,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
@@ -132,6 +105,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
@@ -163,6 +137,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -193,6 +168,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -220,6 +196,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -250,6 +227,38 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "salutation",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Salutation",
"length": 0,
"no_copy": 0,
"options": "Salutation",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -280,6 +289,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
@@ -310,6 +320,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
@@ -340,6 +351,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -369,6 +381,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -398,6 +411,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -430,6 +444,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -460,6 +475,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -489,6 +505,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -518,6 +535,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -547,6 +565,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -575,6 +594,7 @@
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -615,7 +635,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2017-04-10 13:09:27.880530",
"modified": "2017-06-21 17:17:44.694188",
"modified_by": "Administrator",
"module": "Contacts",
"name": "Contact",


+ 3
- 1
frappe/core/doctype/custom_role/custom_role.py Целия файл

@@ -7,7 +7,9 @@ import frappe
from frappe.model.document import Document

class CustomRole(Document):
pass
def validate(self):
if self.report and not self.ref_doctype:
self.ref_doctype = frappe.db.get_value('Report', self.report, 'ref_doctype')

def get_custom_allowed_roles(field, name):
allowed_roles = []


+ 15
- 1
frappe/core/doctype/doctype/doctype.py Целия файл

@@ -623,10 +623,24 @@ def validate_permissions_for_doctype(doctype, for_remove=False):
for perm in doctype.get("permissions"):
perm.db_update()

clear_permissions_cache(doctype.name)

def clear_permissions_cache(doctype):
frappe.clear_cache(doctype=doctype)
delete_notification_count_for(doctype)
for user in frappe.db.sql_list("""select
distinct `tabHas Role`.parent
from
`tabHas Role`,
tabDocPerm
where tabDocPerm.parent = %s
and tabDocPerm.role = `tabHas Role`.role""", doctype):
frappe.clear_cache(user=user)

def validate_permissions(doctype, for_remove=False):
permissions = doctype.get("permissions")
if not permissions:
frappe.throw(_('Enter at least one permission row'), frappe.MandatoryError)
frappe.msgprint(_('No Permissions Specified'), alert=True, indicator='orange')
issingle = issubmittable = isimportable = False
if doctype:
issingle = cint(doctype.issingle)


+ 6
- 6
frappe/core/doctype/report/report.py Целия файл

@@ -39,6 +39,7 @@ class Report(Document):
if self.report_type == "Report Builder":
self.update_report_json()

def before_insert(self):
self.set_doctype_roles()

def on_update(self):
@@ -48,11 +49,10 @@ class Report(Document):
delete_custom_role('report', self.name)

def set_doctype_roles(self):
if self.get('roles'): return

doc = frappe.get_meta(self.ref_doctype)
roles = [{'role': d.role} for d in doc.permissions if d.permlevel==0]
self.set('roles', roles)
if not self.get('roles'):
meta = frappe.get_meta(self.ref_doctype)
roles = [{'role': d.role} for d in meta.permissions if d.permlevel==0]
self.set('roles', roles)

def is_permitted(self):
"""Returns true if Has Role is not set or the user is allowed."""
@@ -153,7 +153,7 @@ class Report(Document):
for c in columns]

out = out + [list(d) for d in result]
if as_dict:
data = []
for row in out:


+ 9
- 33
frappe/core/page/permission_manager/permission_manager.py Целия файл

@@ -6,8 +6,10 @@ import frappe
import frappe.defaults
from frappe.modules.import_file import get_file_path, read_doc_from_file
from frappe.translate import send_translations
from frappe.desk.notifications import delete_notification_count_for
from frappe.permissions import reset_perms, get_linked_doctypes, get_all_perms, setup_custom_perms
from frappe.permissions import (reset_perms, get_linked_doctypes, get_all_perms,
setup_custom_perms, add_permission)
from frappe.core.doctype.doctype.doctype import (clear_permissions_cache,
validate_permissions_for_doctype)
from frappe import _

@frappe.whitelist()
@@ -61,20 +63,7 @@ def get_permissions(doctype=None, role=None):
@frappe.whitelist()
def add(parent, role, permlevel):
frappe.only_for("System Manager")
setup_custom_perms(parent)

frappe.get_doc({
"doctype":"Custom DocPerm",
"__islocal": 1,
"parent": parent,
"parenttype": "DocType",
"parentfield": "permissions",
"role": role,
"permlevel": permlevel,
"read": 1
}).save()

validate_and_reset(parent)
add_permission(parent, role, permlevel)

@frappe.whitelist()
def update(doctype, role, permlevel, ptype, value=None):
@@ -88,7 +77,7 @@ def update(doctype, role, permlevel, ptype, value=None):

frappe.db.sql("""update `tabCustom DocPerm` set `%s`=%s where name=%s"""\
% (frappe.db.escape(ptype), '%s', '%s'), (value, name))
validate_and_reset(doctype)
validate_permissions_for_doctype(doctype)

return out

@@ -103,27 +92,14 @@ def remove(doctype, role, permlevel):
if not frappe.get_all('Custom DocPerm', dict(parent=doctype)):
frappe.throw(_('There must be atleast one permission rule.'), title=_('Cannot Remove'))

validate_and_reset(doctype, for_remove=True)

def validate_and_reset(doctype, for_remove=False):
from frappe.core.doctype.doctype.doctype import validate_permissions_for_doctype
validate_permissions_for_doctype(doctype, for_remove)
clear_doctype_cache(doctype)
validate_permissions_for_doctype(doctype, for_remove=True)

@frappe.whitelist()
def reset(doctype):
frappe.only_for("System Manager")
reset_perms(doctype)
clear_doctype_cache(doctype)

def clear_doctype_cache(doctype):
frappe.clear_cache(doctype=doctype)
delete_notification_count_for(doctype)
for user in frappe.db.sql_list("""select distinct `tabHas Role`.parent from `tabHas Role`,
tabDocPerm
where tabDocPerm.parent = %s
and tabDocPerm.role = `tabHas Role`.role""", doctype):
frappe.clear_cache(user=user)
clear_permissions_cache(doctype)


@frappe.whitelist()
def get_users_with_role(role):


+ 0
- 3
frappe/core/report/todo/__init__.py Целия файл

@@ -1,3 +0,0 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt


+ 2
- 1
frappe/custom/doctype/custom_field/custom_field.py Целия файл

@@ -73,7 +73,8 @@ class CustomField(Document):

@frappe.whitelist()
def get_fields_label(doctype=None):
return [{"value": df.fieldname or "", "label": _(df.label or "")} for df in frappe.get_meta(doctype).get("fields")]
return [{"value": df.fieldname or "", "label": _(df.label or "")}
for df in frappe.get_meta(doctype).get("fields")]

def create_custom_field_if_values_exist(doctype, df):
df = frappe._dict(df)


+ 5
- 0
frappe/desk/page/setup_wizard/setup_wizard.py Целия файл

@@ -86,6 +86,11 @@ def update_user_name(args):
first_name, last_name = first_name.split(' ', 1)

if args.get("email"):
if frappe.db.exists('User', args.get('email')):
# running again
return


args['name'] = args.get("email")

_mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True


+ 5
- 4
frappe/desk/query_report.py Целия файл

@@ -9,6 +9,7 @@ import os, json
from frappe import _
from frappe.modules import scrub, get_module_path
from frappe.utils import flt, cint, get_html_format, cstr
from frappe.model.utils import render_include
from frappe.translate import send_translations
import frappe.desk.reportview
from frappe.permissions import get_role_permissions
@@ -55,7 +56,7 @@ def get_script(report_name):
send_translations(frappe.get_lang_dict("report", report_name))

return {
"script": script,
"script": render_include(script),
"html_format": html_format
}

@@ -104,7 +105,7 @@ def run(report_name, filters=None, user=None):

if cint(report.add_total_row) and result:
result = add_total_row(result, columns)
return {
"result": result,
"columns": columns,
@@ -145,7 +146,7 @@ def export_query():
# add column headings
for idx in range(len(data.columns)):
result[0].append(columns[idx]["label"])
# build table from dict
if isinstance(data.result[0], dict):
for i,row in enumerate(data.result):
@@ -381,4 +382,4 @@ def get_user_match_filters(doctypes, ref_doctype):
if filter_list:
match_filters[dt] = filter_list

return match_filters
return match_filters

+ 0
- 0
frappe/desk/report/__init__.py Целия файл


+ 0
- 0
frappe/desk/report/todo/__init__.py Целия файл


frappe/core/report/todo/todo.js → frappe/desk/report/todo/todo.js Целия файл

@@ -1,5 +1,6 @@
// Copyright (c) 2016, Frappe Technologies and contributors
// For license information, please see license.txt
/* eslint-disable */

frappe.query_reports["ToDo"] = {
"filters": [

frappe/core/report/todo/todo.json → frappe/desk/report/todo/todo.json Целия файл

@@ -7,9 +7,9 @@
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
"modified": "2017-02-24 20:13:12.217943",
"modified": "2017-06-21 18:18:50.748793",
"modified_by": "Administrator",
"module": "Core",
"module": "Desk",
"name": "ToDo",
"owner": "Administrator",
"ref_doctype": "ToDo",

frappe/core/report/todo/todo.py → frappe/desk/report/todo/todo.py Целия файл

@@ -31,5 +31,4 @@ def execute(filters=None):
result.append([todo.name, todo.priority, todo.date, todo.description,
todo.owner, todo.assigned_by, todo.reference])

return columns, result

return columns, result

+ 0
- 1
frappe/model/document.py Целия файл

@@ -4,7 +4,6 @@
from __future__ import unicode_literals, print_function
import frappe
import time
import redis
from frappe import _, msgprint
from frappe.utils import flt, cstr, now, get_datetime_str, file_lock
from frappe.utils.background_jobs import enqueue


+ 17
- 0
frappe/model/utils/__init__.py Целия файл

@@ -61,3 +61,20 @@ def render_include(content):
break

return content

def get_fetch_values(doctype, fieldname, value):
'''Returns fetch value dict for the given object

:param doctype: Target doctype
:param fieldname: Link fieldname selected
:param value: Value selected
'''
out = {}
meta = frappe.get_meta(doctype)
link_df = meta.get_field(fieldname)
for df in meta.get_fields_to_fetch(fieldname):
# example shipping_address.gistin
link_field, source_fieldname = df.options.split('.', 1)
out[df.fieldname] = frappe.db.get_value(link_df.options, value, source_fieldname)

return out

+ 1
- 1
frappe/model/utils/user_settings.py Целия файл

@@ -16,7 +16,7 @@ def get_user_settings(doctype, for_update=False):

if not for_update:
update_user_settings(doctype, user_settings, True)
return user_settings or '{}'

def update_user_settings(doctype, user_settings, for_update=False):


+ 2
- 2
frappe/modules/import_file.py Целия файл

@@ -34,7 +34,6 @@ def get_file_path(module, dt, dn):

def import_file_by_path(path, force=False, data_import=False, pre_process=None, ignore_version=None,
reset_permissions=False):
frappe.flags.in_import = True
try:
docs = read_doc_from_file(path)
except IOError:
@@ -54,8 +53,10 @@ def import_file_by_path(path, force=False, data_import=False, pre_process=None,

original_modified = doc.get("modified")

frappe.flags.in_import = True
import_doc(doc, force=force, data_import=data_import, pre_process=pre_process,
ignore_version=ignore_version, reset_permissions=reset_permissions)
frappe.flags.in_import = False

if original_modified:
# since there is a new timestamp on the file, update timestamp in
@@ -67,7 +68,6 @@ def import_file_by_path(path, force=False, data_import=False, pre_process=None,
(doc['doctype'], '%s', '%s'),
(original_modified, doc['name']))

frappe.flags.in_import = False
return True

def read_doc_from_file(path):


+ 2
- 1
frappe/patches.txt Целия файл

@@ -183,4 +183,5 @@ frappe.patches.v8_0.set_currency_field_precision # 2017-05-09
frappe.patches.v8_0.rename_print_to_printing
frappe.patches.v7_1.disabled_print_settings_for_custom_print_format
frappe.patches.v8_0.update_desktop_icons
frappe.patches.v8_0.update_gender_and_salutation
frappe.patches.v8_0.update_gender_and_salutation
execute:frappe.db.sql('update tabReport set module="Desk" where name="ToDo"')

+ 27
- 1
frappe/permissions.py Целия файл

@@ -330,7 +330,7 @@ def get_all_perms(role):
'''Returns valid permissions for a given role'''
perms = frappe.get_all('DocPerm', fields='*', filters=dict(role=role))
custom_perms = frappe.get_all('Custom DocPerm', fields='*', filters=dict(role=role))
doctypes_with_custom_perms = frappe.db.sql_list("""select distinct parent
doctypes_with_custom_perms = frappe.db.sql_list("""select distinct parent
from `tabCustom DocPerm`""")

for p in perms:
@@ -458,6 +458,31 @@ def setup_custom_perms(parent):
copy_perms(parent)
return True

def add_permission(doctype, role, permlevel=0):
'''Add a new permission rule to the given doctype
for the given Role and Permission Level'''
from frappe.core.doctype.doctype.doctype import validate_permissions_for_doctype
setup_custom_perms(doctype)

if frappe.db.get_value('Custom DocPerm', dict(parent=doctype, role=role,
permlevel=permlevel)):
return

custom_docperm = frappe.get_doc({
"doctype":"Custom DocPerm",
"__islocal": 1,
"parent": doctype,
"parenttype": "DocType",
"parentfield": "permissions",
"role": role,
'read': 1,
"permlevel": permlevel,
})

custom_docperm.save()

validate_permissions_for_doctype(doctype)

def copy_perms(parent):
'''Copy all DocPerm in to Custom DocPerm for the given document'''
for d in frappe.get_all('DocPerm', fields='*', filters=dict(parent=parent)):
@@ -480,3 +505,4 @@ def get_linked_doctypes(dt):
"options": ("!=", "[Select]")
})
]))


+ 10
- 2
frappe/public/css/form.css Целия файл

@@ -223,6 +223,14 @@ h6.uppercase,
.badge-important {
background-color: #e74c3c;
}
.address-box {
background-color: #fafbfc;
padding: 0px 15px;
margin: 15px 0px;
border: 1px solid #d1d8dd;
border-radius: 3px;
font-size: 12px;
}
.timeline {
margin: 30px 0px;
}
@@ -272,7 +280,7 @@ h6.uppercase,
}
.timeline-item.user-content .media-body {
border: 1px solid #d1d8dd;
border-radius: 2px;
border-radius: 3px;
margin-left: -7px;
position: relative;
overflow: visible;
@@ -386,7 +394,7 @@ h6.uppercase,
.timeline-head {
background-color: white;
border: 1px solid #d1d8dd;
border-radius: 2px;
border-radius: 3px;
position: relative;
z-index: 1;
}


+ 8
- 5
frappe/public/js/frappe/ui/toolbar/toolbar.js Целия файл

@@ -218,12 +218,15 @@ $.extend(frappe.ui.toolbar, {

frappe.ui.toolbar.clear_cache = function() {
frappe.assets.clear_local_storage();
$c('frappe.sessions.clear',{},function(r,rt){
if(!r.exc) {
frappe.show_alert(r.message);
location.reload(true);
frappe.call({
method: 'frappe.sessions.clear',
callback: function(r) {
if(!r.exc) {
frappe.show_alert({message:r.message, indicator:'green'});
location.reload(true);
}
}
});
})
return false;
}



+ 11
- 2
frappe/public/less/form.less Целия файл

@@ -293,6 +293,15 @@ h6.uppercase, .h6.uppercase {
background-color: #e74c3c;
}

.address-box {
background-color: @light-bg;
padding: 0px 15px;
margin: 15px 0px;
border: 1px solid @border-color;
border-radius: 3px;
font-size: 12px;
}

.timeline {
margin: 30px 0px;

@@ -356,7 +365,7 @@ h6.uppercase, .h6.uppercase {

.media-body {
border: 1px solid @border-color;
border-radius: 2px;
border-radius: 3px;
margin-left: -7px;
position: relative;

@@ -502,7 +511,7 @@ h6.uppercase, .h6.uppercase {
background-color: white;
// padding: 15px 30px;
border: 1px solid @border-color;
border-radius: 2px;
border-radius: 3px;
position: relative;
z-index: 1;



Зареждане…
Отказ
Запис