ソースを参照

Merge branch 'develop'

version-14
mbauskar 8年前
コミット
26638a9a83
46個のファイルの変更478行の追加253行の削除
  1. +9
    -2
      frappe/__init__.py
  2. +21
    -2
      frappe/contacts/doctype/address/address.json
  3. +51
    -31
      frappe/contacts/doctype/contact/contact.json
  4. +3
    -1
      frappe/core/doctype/custom_role/custom_role.py
  5. +15
    -1
      frappe/core/doctype/doctype/doctype.py
  6. +6
    -6
      frappe/core/doctype/report/report.py
  7. +9
    -33
      frappe/core/page/permission_manager/permission_manager.py
  8. +0
    -3
      frappe/core/report/todo/__init__.py
  9. +2
    -1
      frappe/custom/doctype/custom_field/custom_field.py
  10. +15
    -3
      frappe/custom/doctype/property_setter/property_setter.py
  11. +4
    -0
      frappe/desk/form/meta.py
  12. +5
    -0
      frappe/desk/page/setup_wizard/setup_wizard.py
  13. +5
    -4
      frappe/desk/query_report.py
  14. +0
    -0
      frappe/desk/report/__init__.py
  15. +0
    -0
      frappe/desk/report/todo/__init__.py
  16. +1
    -0
      frappe/desk/report/todo/todo.js
  17. +2
    -2
      frappe/desk/report/todo/todo.json
  18. +1
    -2
      frappe/desk/report/todo/todo.py
  19. +2
    -2
      frappe/docs/index.html
  20. +0
    -1
      frappe/model/document.py
  21. +8
    -9
      frappe/model/naming.py
  22. +17
    -0
      frappe/model/utils/__init__.py
  23. +1
    -1
      frappe/model/utils/user_settings.py
  24. +2
    -2
      frappe/modules/import_file.py
  25. +2
    -1
      frappe/patches.txt
  26. +27
    -1
      frappe/permissions.py
  27. +10
    -2
      frappe/public/css/form.css
  28. +13
    -0
      frappe/public/css/website.css
  29. +10
    -2
      frappe/public/js/frappe/form/control.js
  30. +145
    -96
      frappe/public/js/frappe/form/quick_entry.js
  31. +8
    -1
      frappe/public/js/frappe/model/create_new.js
  32. +12
    -2
      frappe/public/js/frappe/ui/page.js
  33. +1
    -1
      frappe/public/js/frappe/ui/toolbar/awesome_bar.js
  34. +8
    -5
      frappe/public/js/frappe/ui/toolbar/toolbar.js
  35. +2
    -0
      frappe/public/js/frappe/views/reports/query_report.js
  36. +11
    -1
      frappe/public/js/legacy/clientscriptAPI.js
  37. +11
    -2
      frappe/public/less/form.less
  38. +6
    -0
      frappe/public/less/website.less
  39. +12
    -12
      frappe/translations/de.csv
  40. +3
    -3
      frappe/translations/it.csv
  41. +1
    -1
      frappe/translations/pt-BR.csv
  42. +2
    -2
      frappe/translations/pt.csv
  43. +4
    -4
      frappe/translations/uk.csv
  44. +9
    -9
      frappe/translations/vi.csv
  45. +1
    -1
      frappe/utils/bench_helper.py
  46. +1
    -1
      frappe/website/context.py

+ 9
- 2
frappe/__init__.py ファイルの表示

@@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json
from .exceptions import *
from .utils.jinja import get_jenv, get_template, render_template

__version__ = '8.1.2'
__version__ = '8.1.3'
__title__ = "Frappe Framework"

local = Local()
@@ -139,6 +139,7 @@ def init(site, sites_path=None, new_site=False):
local.module_app = None
local.app_modules = None
local.system_settings = None
local.system_country = None

local.user = None
local.user_perms = None
@@ -946,6 +947,7 @@ def make_property_setter(args, ignore_validate=False, validate_fields_for_doctyp
})
ps.flags.ignore_validate = ignore_validate
ps.flags.validate_fields_for_doctype = validate_fields_for_doctype
ps.validate_fieldtype_change()
ps.insert()

def import_doc(path, ignore_links=False, ignore_insert=False, insert=False):
@@ -1360,4 +1362,9 @@ def get_active_domains():
active_domains.append("")
cache().hset("domains", "active_domains", active_domains)

return active_domains
return active_domains

def get_system_country():
if local.system_country is None:
local.system_country = db.get_single_value('System Settings', 'country') or ''
return local.system_country

+ 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)


+ 15
- 3
frappe/custom/doctype/property_setter/property_setter.py ファイルの表示

@@ -3,9 +3,12 @@

from __future__ import unicode_literals
import frappe
from frappe import _

from frappe.model.document import Document

not_allowed_fieldtype_change = ['naming_series']

class PropertySetter(Document):
def autoname(self):
self.name = self.doc_type + "-" \
@@ -13,6 +16,18 @@ class PropertySetter(Document):
+ self.property

def validate(self):
self.validate_fieldtype_change()
self.delete_property_setter()

# clear cache
frappe.clear_cache(doctype = self.doc_type)

def validate_fieldtype_change(self):
if self.field_name in not_allowed_fieldtype_change and \
self.property == 'fieldtype':
frappe.throw(_("Field type cannot be changed for {0}").format(self.field_name))

def delete_property_setter(self):
"""delete other property setters on this, if this is new"""
if self.get('__islocal'):
frappe.db.sql("""delete from `tabProperty Setter` where
@@ -21,9 +36,6 @@ class PropertySetter(Document):
and ifnull(field_name,'') = ifnull(%(field_name)s, '')
and property = %(property)s""", self.get_valid_dict())

# clear cache
frappe.clear_cache(doctype = self.doc_type)

def get_property_list(self, dt):
return frappe.db.sql("""select fieldname, label, fieldtype
from tabDocField


+ 4
- 0
frappe/desk/form/meta.py ファイルの表示

@@ -65,7 +65,11 @@ class FormMeta(Meta):
def _get_path(fname):
return os.path.join(path, scrub(fname))

system_country = frappe.get_system_country()

self._add_code(_get_path(self.name + '.js'), '__js')
if system_country:
self._add_code(_get_path(os.path.join('regional', system_country + '.js')), '__js')
self._add_code(_get_path(self.name + '.css'), "__css")
self._add_code(_get_path(self.name + '_list.js'), '__list_js')
self._add_code(_get_path(self.name + '_calendar.js'), '__calendar_js')


+ 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

+ 2
- 2
frappe/docs/index.html ファイルの表示

@@ -32,8 +32,8 @@
Javascript, HTML/CSS with MySQL as the backend. It was built for ERPNext
but is pretty generic and can be used to build database driven apps.</p>

<p>The key difference in Frappe compared to other frameworks is that in Frappe,
metadata is also treated as data and it can be used to build frontend
<p>The key differece in Frappe compared to other frameworks is that Frappe
is that meta-data is also treated as data and is used to build front-ends
very easily. Frappe comes with a full blown admin UI called the <strong>Desk</strong>
that handles forms, navigation, lists, menus, permissions, file attachment
and much more out of the box.</p>


+ 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


+ 8
- 9
frappe/model/naming.py ファイルの表示

@@ -8,17 +8,16 @@ from frappe.utils import now_datetime, cint
import re

def set_new_name(doc):
"""Sets the `name`` property for the document based on various rules.

1. If amened doc, set suffix.
3. If `autoname` method is declared, then call it.
4. If `autoname` property is set in the DocType (`meta`), then build it using the `autoname` property.
2. If `name` is already defined, use that name
5. If no rule defined, use hash.
"""
Sets the `name` property for the document based on various rules.

#### Note:
1. If amended doc, set suffix.
2. If `autoname` method is declared, then call it.
3. If `autoname` property is set in the DocType (`meta`), then build it using the `autoname` property.
4. If no rule defined, use hash.

:param doc: Document to be named."""
:param doc: Document to be named.
"""

doc.run_method("before_naming")



+ 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;
}


+ 13
- 0
frappe/public/css/website.css ファイルの表示

@@ -290,6 +290,14 @@ a.no-decoration:active {
.avatar-large .standard-image {
font-size: 36px;
}
.avatar-xl {
margin-right: 10px;
width: 108px;
height: 108px;
}
.avatar-xl .standard-image {
font-size: 72px;
}
.avatar-xs {
margin-right: 3px;
margin-top: -2px;
@@ -980,3 +988,8 @@ li.footer-child-item {
.page-card .btn {
margin-top: 30px;
}
.bordered {
border: 1px solid #d1d8dd;
padding: 10px;
border-radius: 4px;
}

+ 10
- 2
frappe/public/js/frappe/form/control.js ファイルの表示

@@ -609,6 +609,7 @@ frappe.ui.form.ControlDate = frappe.ui.form.ControlData.extend({
this.set_t_for_today();
},
set_formatted_input: function(value) {
this._super(value);
if(value
&& ((this.last_value && this.last_value !== value)
|| (!this.datepicker.selectedDates.length))) {
@@ -1289,7 +1290,14 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
frappe._from_link = this;
frappe._from_link_scrollY = $(document).scrollTop();

frappe.ui.form.quick_entry(doctype, function(doc) {
var trimmed_doctype = doctype.replace(/ /g, '');
var controller_name = "QuickEntryForm";

if(frappe.ui.form[trimmed_doctype + "QuickEntryForm"]){
controller_name = trimmed_doctype + "QuickEntryForm";
}

new frappe.ui.form[controller_name](doctype, function(doc) {
if(me.frm) {
me.parse_validate_and_set_in_model(doc.name);
} else {
@@ -1530,7 +1538,7 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
// validate the value just entered
var me = this;

if(this.df.options=="[Select]") {
if(this.df.options=="[Select]" || this.df.ignore_link_validation) {
callback(value);
return;
}


+ 145
- 96
frappe/public/js/frappe/form/quick_entry.js ファイルの表示

@@ -1,129 +1,178 @@
frappe.provide('frappe.ui.form');

frappe.ui.form.quick_entry = function(doctype, success) {
frappe.model.with_doctype(doctype, function() {
var mandatory = $.map(frappe.get_meta(doctype).fields,
function(d) { return (d.reqd || d.bold && !d.read_only) ? d : null });
var meta = frappe.get_meta(doctype);

var doc = frappe.model.get_new_doc(doctype, null, null, true);
frappe.ui.form.QuickEntryForm = Class.extend({
init: function(doctype, success_function){
this.doctype = doctype;
this.success_function = success_function;
this.setup();
},

setup: function(){
var me = this;
frappe.model.with_doctype(this.doctype, function() {
me.set_meta_and_mandatory_fields();
var validate_flag = me.validate_quick_entry();
if(!validate_flag){
me.render_dialog();
}
});
},

set_meta_and_mandatory_fields: function(){
this.mandatory = $.map(frappe.get_meta(this.doctype).fields,
function(d) { return (d.reqd || d.bold && !d.read_only) ? d : null; });
this.meta = frappe.get_meta(this.doctype);
this.doc = frappe.model.get_new_doc(this.doctype, null, null, true);
},

validate_quick_entry: function(){
if(this.meta.quick_entry != 1) {
frappe.set_route('Form', this.doctype, this.doc.name);
return true;
}
var mandatory_flag = this.validate_mandatory_length();
var child_table_flag = this.validate_for_child_table();

if(meta.quick_entry != 1) {
frappe.set_route('Form', doctype, doc.name);
return;
if (mandatory_flag || child_table_flag){
return true;
}
this.validate_for_prompt_autoname();
},

if(mandatory.length > 7) {
validate_mandatory_length: function(){
if(this.mandatory.length > 7) {
// too many fields, show form
frappe.set_route('Form', doctype, doc.name);
return;
frappe.set_route('Form', this.doctype, this.doc.name);
return true;
}
},

if($.map(mandatory, function(d) { return d.fieldtype==='Table' ? d : null }).length) {
validate_for_child_table: function(){
if($.map(this.mandatory, function(d) { return d.fieldtype==='Table' ? d : null; }).length) {
// has mandatory table, quit!
frappe.set_route('Form', doctype, doc.name);
return;
frappe.set_route('Form', this.doctype, this.doc.name);
return true;
}
},

if(meta.autoname && meta.autoname.toLowerCase()==='prompt') {
mandatory = [{fieldname:'__name', label:__('{0} Name', [meta.name]),
reqd: 1, fieldtype:'Data'}].concat(mandatory);
validate_for_prompt_autoname: function(){
if(this.meta.autoname && this.meta.autoname.toLowerCase()==='prompt') {
this.mandatory = [{fieldname:'__name', label:__('{0} Name', [this.meta.name]),
reqd: 1, fieldtype:'Data'}].concat(this.mandatory);
}
},

var dialog = new frappe.ui.Dialog({
title: __("New {0}", [__(doctype)]),
fields: mandatory,
render_dialog: function(){
var me = this;
this.dialog = new frappe.ui.Dialog({
title: __("New {0}", [__(this.doctype)]),
fields: this.mandatory,
});
this.dialog.doc = this.doc;
// refresh dependencies etc
this.dialog.refresh();

var update_doc = function() {
var data = dialog.get_values(true);
$.each(data, function(key, value) {
if(key==='__name') {
dialog.doc.name = value;
} else {
if(!is_null(value)) {
dialog.doc[key] = value;
}
this.register_primary_action();
this.render_edit_in_full_page_link();
// ctrl+enter to save
this.dialog.wrapper.keydown(function(e) {
if((e.ctrlKey || e.metaKey) && e.which==13) {
if(!frappe.request.ajax_count) {
// not already working -- double entry
me.dialog.get_primary_btn().trigger("click");
e.preventDefault();
return false;
}
});
return dialog.doc;
}

var open_doc = function() {
dialog.hide();
update_doc();
frappe.set_route('Form', doctype, doc.name);
}

dialog.doc = doc;
}
});

// refresh dependencies etc
dialog.refresh();
this.dialog.show();
this.set_defaults();
},

dialog.set_primary_action(__('Save'), function() {
if(dialog.working) return;
var data = dialog.get_values();
register_primary_action: function(){
var me = this;
this.dialog.set_primary_action(__('Save'), function() {
if(me.dialog.working) return;
var data = me.dialog.get_values();

if(data) {
dialog.working = true;
var values = update_doc();
frappe.call({
method: "frappe.client.insert",
args: {
doc: values
},
callback: function(r) {
dialog.hide();
// delete the old doc
frappe.model.clear_doc(dialog.doc.doctype, dialog.doc.name);
var doc = r.message;
if(success) {
success(doc);
}
frappe.ui.form.update_calling_link(doc.name);
},
error: function() {
open_doc();
},
always: function() {
dialog.working = false;
},
freeze: true
});
me.dialog.working = true;
var values = me.update_doc();
me.insert_document(values);
}
});
},

insert_document: function(values){
var me = this;
frappe.call({
method: "frappe.client.insert",
args: {
doc: values
},
callback: function(r) {
me.dialog.hide();
// delete the old doc
frappe.model.clear_doc(me.dialog.doc.doctype, me.dialog.doc.name);
var doc = r.message;
if(me.success_function) {
me.success_function(doc);
}
frappe.ui.form.update_calling_link(doc.name);
},
error: function() {
me.open_doc();
},
always: function() {
me.dialog.working = false;
},
freeze: true
});
},

update_doc: function(){
var me = this;
var data = this.dialog.get_values(true);
$.each(data, function(key, value) {
if(key==='__name') {
me.dialog.doc.name = value;
} else {
if(!is_null(value)) {
me.dialog.doc[key] = value;
}
}
});
return this.dialog.doc;
},

open_doc: function(){
this.dialog.hide();
this.update_doc();
frappe.set_route('Form', this.doctype, this.doc.name);
},

render_edit_in_full_page_link: function(){
var me = this;
var $link = $('<div class="text-muted small" style="padding-left: 10px; padding-top: 15px;">' +
__("Ctrl+enter to save") + ' | <a class="edit-full">' + __("Edit in full page") + '</a></div>').appendTo(dialog.body);
__("Ctrl+enter to save") + ' | <a class="edit-full">' + __("Edit in full page") + '</a></div>').appendTo(this.dialog.body);

$link.find('.edit-full').on('click', function() {
// edit in form
open_doc();
});

// ctrl+enter to save
dialog.wrapper.keydown(function(e) {
if((e.ctrlKey || e.metaKey) && e.which==13) {
if(!frappe.request.ajax_count) {
// not already working -- double entry
dialog.get_primary_btn().trigger("click");
e.preventDefault();
return false;
}
}
me.open_doc();
});
},

dialog.show();

set_defaults: function(){
var me = this;
// set defaults
$.each(dialog.fields_dict, function(fieldname, field) {
field.doctype = doc.doctype;
field.docname = doc.name;
$.each(this.dialog.fields_dict, function(fieldname, field) {
field.doctype = me.doc.doctype;
field.docname = me.doc.name;

if(!is_null(doc[fieldname])) {
field.set_input(doc[fieldname]);
if(!is_null(me.doc[fieldname])) {
field.set_input(me.doc[fieldname]);
}
});

});
}
}
});

+ 8
- 1
frappe/public/js/frappe/model/create_new.js ファイルの表示

@@ -318,7 +318,14 @@ frappe.new_doc = function (doctype, opts) {
if(frappe.create_routes[doctype]) {
frappe.set_route(frappe.create_routes[doctype]);
} else {
frappe.ui.form.quick_entry(doctype, function(doc) {
var trimmed_doctype = doctype.replace(/ /g, '');
var controller_name = "QuickEntryForm";

if(frappe.ui.form[trimmed_doctype + "QuickEntryForm"]){
controller_name = trimmed_doctype + "QuickEntryForm";
}

new frappe.ui.form[controller_name](doctype, function(doc) {
//frappe.set_route('List', doctype);
var title = doc.name;
var title_field = frappe.get_meta(doc.doctype).title_field;


+ 12
- 2
frappe/public/js/frappe/ui/page.js ファイルの表示

@@ -251,12 +251,22 @@ frappe.ui.Page = Class.extend({
},

add_inner_button: function(label, action, group) {
let _action = function() {
let btn = $(this);
let promise = action();
if (promise && promise.then) {
btn.attr('disabled', true);
promise.then(() => {
btn.attr('disabled', false);
})
}
}
if(group) {
var $group = this.get_inner_group_button(group);
return $('<li><a>'+label+'</a></li>').on('click', action).appendTo($group.find(".dropdown-menu"));
return $('<li><a>'+label+'</a></li>').on('click', _action).appendTo($group.find(".dropdown-menu"));
} else {
return $('<button class="btn btn-default btn-xs" style="margin-left: 10px;">'+__(label)+'</btn>')
.on("click", action).appendTo(this.inner_toolbar.removeClass("hide"))
.on("click", _action).appendTo(this.inner_toolbar.removeClass("hide"))
}
},



+ 1
- 1
frappe/public/js/frappe/ui/toolbar/awesome_bar.js ファイルの表示

@@ -18,7 +18,6 @@ frappe.search.AwesomeBar = Class.extend({
autoFirst: true,
list: [],
filter: function (text, term) {
this.get_item(text.value).boo = "foo";
return true;
},
data: function (item, input) {
@@ -194,6 +193,7 @@ frappe.search.AwesomeBar = Class.extend({
}
} else {
out.push(option);
routes.push("");
}
});
return out;


+ 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;
}



+ 2
- 0
frappe/public/js/frappe/views/reports/query_report.js ファイルの表示

@@ -306,6 +306,7 @@ frappe.views.QueryReport = Class.extend({
var f = me.page.add_field(df);
$(f.wrapper).addClass("filters pull-left");
me.filters.push(f);

if(df["default"]) {
f.set_input(df["default"]);
}
@@ -327,6 +328,7 @@ frappe.views.QueryReport = Class.extend({
}
f.set_mandatory && f.set_mandatory(f.$input.val());
}
df.ignore_link_validation = true;
}
});



+ 11
- 1
frappe/public/js/legacy/clientscriptAPI.js ファイルの表示

@@ -248,7 +248,17 @@ _f.Frm.prototype.clear_table = function(fieldname) {
_f.Frm.prototype.add_child = function(fieldname, values) {
var doc = frappe.model.add_child(this.doc, frappe.meta.get_docfield(this.doctype, fieldname).options, fieldname);
if(values) {
$.extend(doc, values);
// Values of unique keys should not be overridden
var d = {};
var unique_keys = ["idx", "name"];

Object.keys(values).map((key) => {
if(!unique_keys.includes(key)) {
d[key] = values[key];
}
});

$.extend(doc, d);
}
return doc;
}


+ 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;



+ 6
- 0
frappe/public/less/website.less ファイルの表示

@@ -720,3 +720,9 @@ li.footer-child-item {
margin-top: 30px;
}
}

.bordered {
border: 1px solid @border-color;
padding: 10px;
border-radius: 4px;
}

+ 12
- 12
frappe/translations/de.csv ファイルの表示

@@ -319,7 +319,7 @@ DocType: Event,Repeat Till,Wiederholen bis
apps/frappe/frappe/core/doctype/communication/communication_list.js +26,New,Neu
apps/frappe/frappe/public/js/frappe/form/share.js +74,Loading...,Laden ...
DocType: DocField,Password,Passwort
apps/frappe/frappe/utils/response.py +175,Your system is being updated. Please refresh again after a few moments,Ihr System wird aktualisiert. Bitte aktualisieren Sie die Seite in ein paar Momenten
apps/frappe/frappe/utils/response.py +175,Your system is being updated. Please refresh again after a few moments,Ihr System wird aktualisiert. Bitte aktualisieren Sie die Seite in einer kurzen Weile erneut
DocType: Blogger,Will be used in url (usually first name).,Wird in URL verwendet (in der Regel Vorname).
DocType: Auto Email Report,Day of Week,Tag der Woche
DocType: Note,Expire Notification On,Ablaufen Mitteilung On
@@ -412,7 +412,7 @@ DocType: Workflow State,exclamation-sign,Ausrufezeichen
apps/frappe/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.js +30,Show Permissions,Berechtigungen anzeigen
apps/frappe/frappe/core/doctype/doctype/doctype.py +554,Timeline field must be a Link or Dynamic Link,Timeline-Bereich muss einen Link oder Dynamic Link sein
apps/frappe/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py +36,Please install dropbox python module,Bitte das Dropbox-Python-Modul installieren
apps/frappe/frappe/public/js/frappe/form/multi_select_dialog.js +53,Date Range,Datumsbereich
apps/frappe/frappe/public/js/frappe/form/multi_select_dialog.js +53,Date Range,Datumspanne
apps/frappe/frappe/public/js/frappe/views/gantt/gantt_view.js +20,Gantt,Gantt-Diagramm
apps/frappe/frappe/public/html/print_template.html +27,Page {0} of {1},Seite {0} von {1}
DocType: About Us Settings,Introduce your company to the website visitor.,Vorstellung des Unternehmens für Besucher der Webseite.
@@ -1218,7 +1218,7 @@ apps/frappe/frappe/core/page/usage_info/usage_info.html +51,Max Emails,Max E-Mai
apps/frappe/frappe/public/js/frappe/form/footer/timeline.js +575,Delete comment?,Kommentar löschen?
DocType: Address Template,This format is used if country specific format is not found,"Dieses Format wird verwendet, wenn ein länderspezifisches Format nicht gefunden werden kann"
DocType: System Settings,Allow Login using Mobile Number,Login mit Mobilnummer zulassen
apps/frappe/frappe/public/js/frappe/request.js +104,You do not have enough permissions to access this resource. Please contact your manager to get access.,"Sie haben nicht genügend Rechte, um auf diese Ressource zuzugreifen. Bitte kontaktieren Sie Ihren Manager um Zugang zu bekommen."
apps/frappe/frappe/public/js/frappe/request.js +104,You do not have enough permissions to access this resource. Please contact your manager to get access.,"Sie haben nicht genügend Rechte, um auf diese Ressource zuzugreifen. Bitte kontaktieren Sie Ihren Manager um Zugang zu erhalten."
DocType: Custom Field,Custom,Benutzerdefiniert
apps/frappe/frappe/config/setup.py +150,Setup Email Alert based on various criteria.,E-Mail-Benachrichtigung einrichten auf der Grundlage verschiedener Kriterien.
apps/frappe/frappe/website/doctype/blog_post/blog_post.py +98,Posts filed under {0},Beiträge abgelegt unter {0}
@@ -1367,7 +1367,7 @@ apps/frappe/frappe/core/doctype/user/user.py +715,"Too many users signed up rece
apps/frappe/frappe/core/page/permission_manager/permission_manager.js +375,Add New Permission Rule,Neue Berechtigungsregel anlegen
apps/frappe/frappe/public/js/frappe/form/link_selector.js +26,You can use wildcard %,"Sie können den Platzhalter ""%"" verwenden"
apps/frappe/frappe/public/js/frappe/upload.js +270,"Only image extensions (.gif, .jpg, .jpeg, .tiff, .png, .svg) allowed","Nur Bild-Datenformate (.gif, .jpg, .jpeg, .tiff, .png, .svg) erlaubt"
DocType: DocType,Database Engine,Database Engine
DocType: DocType,Database Engine,Datenbank-Engine
DocType: Customize Form,"Fields separated by comma (,) will be included in the ""Search By"" list of Search dialog box","Felder, die durch Komma (,) getrennt sind, sind in der ""Suchen nach""-Liste des Suche-Dialogfeldes enthalten."
apps/frappe/frappe/website/doctype/website_theme/website_theme.py +35,Please Duplicate this Website Theme to customize.,Bitte dieses Webseiten-Thema duplizieren um es anzupassen.
DocType: DocField,Text Editor,Text Bearbeiter
@@ -1428,7 +1428,7 @@ apps/frappe/frappe/model/base_document.py +466,Options not set for link field {0
DocType: Customize Form,"Must be of type ""Attach Image""",Muss vom Typ sein &quot;Bild anhängen&quot;
apps/frappe/frappe/core/page/data_import_tool/data_import_main.html +25,Unselect All,Alles wiederufen
apps/frappe/frappe/custom/doctype/customize_form/customize_form.py +197,You cannot unset 'Read Only' for field {0},"""Nur lesen"" kann für das Feld {0} nicht rückgängig gemacht werden"
DocType: Auto Email Report,Zero means send records updated at anytime,Zero bedeutet Sendeaufzeichnungen jederzeit aktualisiert
DocType: Auto Email Report,Zero means send records updated at anytime,"Null bedeutet dass, Sendeaufzeichnungen jederzeit aktualisiert werden"
apps/frappe/frappe/desk/page/setup_wizard/setup_wizard_page.html +18,Complete Setup,Einrichtung abschliessen
DocType: Workflow State,asterisk,Sternchen
apps/frappe/frappe/core/page/data_import_tool/exporter.py +62,Please do not change the template headings.,Bitte nicht die Vorlagenköpfe ändern.
@@ -1757,7 +1757,7 @@ apps/frappe/frappe/core/page/desktop/desktop_help_message.html +5,You have made
DocType: OAuth Authorization Code,OAuth Authorization Code,OAuth-Autorisierungscode
apps/frappe/frappe/core/page/data_import_tool/importer.py +249,Not allowed to Import,Import nicht erlaubt
DocType: Social Login Keys,Frappe Client Secret,Frappe Client-Geheimnis
DocType: Deleted Document,Deleted DocType,Gelöschte DocType
DocType: Deleted Document,Deleted DocType,Gelöschtes DocType
apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +22,Permission Levels,Berechtigungsebenen
DocType: Workflow State,Warning,Warnung
DocType: Tag Category,Tag Category,Tag Kategorie
@@ -1778,7 +1778,7 @@ apps/frappe/frappe/core/page/usage_info/usage_info.html +22,Remaining,Verbleiben
apps/frappe/frappe/public/js/frappe/ui/toolbar/search.js +357,<p>No results found for '</p>,<p> Keine Ergebnisse für ' </p>
apps/frappe/frappe/public/js/legacy/form.js +139,Please save before attaching.,Bitte vor dem Anhängen speichern
apps/frappe/frappe/public/js/frappe/form/link_selector.js +124,Added {0} ({1}),{0} ({1}) hinzugefügt
apps/frappe/frappe/website/doctype/website_theme/website_theme.js +20,Default theme is set in {0},Standard-Design wird in {0}
apps/frappe/frappe/website/doctype/website_theme/website_theme.js +20,Default theme is set in {0},Standard-Design wird in {0} eingestellt
apps/frappe/frappe/custom/doctype/customize_form/customize_form.py +319,Fieldtype cannot be changed from {0} to {1} in row {2},Feldtyp kann nicht von {0} nach {1} in Zeile {2} geändert werden
apps/frappe/frappe/public/js/frappe/roles_editor.js +195,Role Permissions,Rollenberechtigungen
DocType: Help Article,Intermediate,Mittlere
@@ -1801,7 +1801,7 @@ apps/frappe/frappe/public/js/frappe/form/control.js +1407,Create a new {0},Neu e
DocType: Email Rule,Is Spam,ist Spam
apps/frappe/frappe/public/js/frappe/ui/toolbar/search_utils.js +192,Report {0},Bericht {0}
apps/frappe/frappe/public/js/frappe/form/templates/form_links.html +14,Open {0},{0} öffnen
DocType: OAuth Client,Default Redirect URI,Standard Redirect URI
DocType: OAuth Client,Default Redirect URI,Standard Weiterleitungs URI
DocType: Email Alert,Recipients,Empfänger
DocType: Workflow State,ok-sign,OK-Zeichen
apps/frappe/frappe/public/js/frappe/form/toolbar.js +141,Duplicate,Duplizieren
@@ -1914,9 +1914,9 @@ apps/frappe/frappe/public/js/frappe/ui/tags.js +20,Add a tag,Eine Markierung hin
apps/frappe/frappe/public/js/frappe/form/control.js +1207,Please attach a file first.,Bitte zuerst eine Datei anhängen.
apps/frappe/frappe/model/naming.py +169,"There were some errors setting the name, please contact the administrator",Beim Setzen des Namens hat es einige Fehler gegeben. Kontaktieren Sie bitte Ihren Administrator
apps/frappe/frappe/templates/includes/contact.js +17,"You seem to have written your name instead of your email. \
Please enter a valid email address so that we can get back.","Du scheinst deinen Namen anstelle deiner E-Mail geschrieben zu haben. \ Bitte geben Sie eine gültige E-Mail-Adresse ein, damit wir zurückkommen können."
Please enter a valid email address so that we can get back.","Du scheinst deinen Namen anstelle deiner E-Mail geschrieben zu haben. \ Bitte geben Sie eine gültige E-Mail-Adresse ein, damit wir uns bei Ihnen melden können."
DocType: Website Slideshow Item,Website Slideshow Item,Webseiten-Diashow-Artikel
DocType: Portal Settings,Default Role at Time of Signup,Standardrolle für Neuanmeldungen
DocType: Portal Settings,Default Role at Time of Signup,Standardrolle bei Neuanmeldungen
DocType: DocType,Title Case,Bezeichnung in Großbuchstaben
DocType: DocType,"Naming Options:
<ol><li><b>field:[fieldname]</b> - By Field</li><li><b>naming_series:</b> - By Naming Series (field called naming_series must be present</li><li><b>Prompt</b> - Prompt user for a name</li><li><b>[series]</b> - Series by prefix (separated by a dot); for example PRE.#####</li></ol>",Namensoptionen: <ol><li> <b>Feld: [Feldname]</b> - Mit dem Feld </li><li> <b>naming_series:</b> - Durch die Benennung der Serie (Feld namens naming_series muss vorhanden sein </li><li> <b>Prompt</b> - Benutzer nach einem Namen </li><li> <b>[Serie]</b> - Serie von Präfix (getrennt durch einen Punkt); zum Beispiel PRE. ##### </li></ol>
@@ -2050,7 +2050,7 @@ DocType: DocType,Timeline Field,Timeline-Feld
DocType: Country,Time Zones,Zeitzonen
apps/frappe/frappe/core/page/permission_manager/permission_manager.py +87,There must be atleast one permission rule.,Es muss atleast eine Erlaubnis Regel sein.
apps/frappe/frappe/public/js/frappe/form/multi_select_dialog.js +67,Get Items,Artikel aufrufen
apps/frappe/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py +96,You did not apporve Dropbox Access.,Sie haben den Dropbox-Zugriff nicht verifiziert.
apps/frappe/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py +96,You did not apporve Dropbox Access.,Sie haben den Dropbox-Zugriff nicht freigegeben.
DocType: DocField,Image,Bild
DocType: Workflow State,remove-sign,Entfernen-Zeichen
apps/frappe/frappe/www/search.html +30,Type something in the search box to search,Geben Sie etwas in das Suchfeld zu suchen
@@ -2306,7 +2306,7 @@ apps/frappe/frappe/core/page/data_import_tool/data_import_tool.js +137,Importing
apps/frappe/frappe/core/doctype/file/file.js +27,Unzip,Dekomprimieren
apps/frappe/frappe/model/document.py +923,Incorrect value in row {0}: {1} must be {2} {3},Falscher Wert in Zeile {0}: {1} muss {2} {3} sein
apps/frappe/frappe/workflow/doctype/workflow/workflow.py +67,Submitted Document cannot be converted back to draft. Transition row {0},Buchung kann nicht in Entwurf umgewandelt werden. Zeile {0}
apps/frappe/frappe/desk/reportview.py +217,Deleting {0},Löschen {0}
apps/frappe/frappe/desk/reportview.py +217,Deleting {0},Löscht {0}
apps/frappe/frappe/printing/page/print_format_builder/print_format_builder_start.html +2,Select an existing format to edit or start a new format.,Vorhandenes Format zum Bearbeiten wählen oder neues Format erstellen.
apps/frappe/frappe/workflow/doctype/workflow/workflow.py +38,Created Custom Field {0} in {1},benutzerdefiniertes Feld {0} in {1} erstellt
DocType: System Settings,Time Zone,Zeitzone


+ 3
- 3
frappe/translations/it.csv ファイルの表示

@@ -761,7 +761,7 @@ DocType: DocField,Section Break,Interruzione di sezione
DocType: Address,Warehouse,Deposito
,Messages,Messaggi
apps/frappe/frappe/desk/page/applications/applications.js +49,Portal,Portale
DocType: Email Account,Use Different Email Login ID,Utilizzare diversi ID di accesso di posta elettronica
DocType: Email Account,Use Different Email Login ID,Utilizzare un diverso ID di accesso alla posta elettronica
apps/frappe/frappe/desk/query_report.py +82,Must specify a Query to run,Necessario specificare una query per eseguire
apps/frappe/frappe/config/setup.py +78,"Language, Date and Time settings","Impostazioni di lingua , data e ora"
DocType: User Email,User Email,user-mail
@@ -1134,7 +1134,7 @@ DocType: Customize Form Field,Number of columns for a field in a Grid (Total Col
DocType: DocType,System,Sistema
DocType: Web Form,Max Attachment Size (in MB),Dimensione Max Allegato (in MB)
apps/frappe/frappe/www/login.html +93,Have an account? Login,Hai un account? Accedi
apps/frappe/frappe/public/js/legacy/print_format.js +148,Unknown Print Format: {0},Formato Stampa Sconosciuto: {0}
apps/frappe/frappe/public/js/legacy/print_format.js +148,Unknown Print Format: {0},Formato di Stampa Sconosciuto: {0}
DocType: Workflow State,arrow-down,freccia verso il basso
apps/frappe/frappe/public/js/frappe/ui/tree.js +130,Collapse,Collassa
apps/frappe/frappe/model/delete_doc.py +161,User not allowed to delete {0}: {1},L'utente non ha permesso di eliminare {0}: {1}
@@ -2325,7 +2325,7 @@ DocType: Email Account,Add Signature,Aggiungi Firma
apps/frappe/frappe/email/doctype/email_unsubscribe/email_unsubscribe.py +38,Left this conversation,Lasciato questa conversazione
apps/frappe/frappe/core/page/permission_manager/permission_manager.js +481,Did not set,Non impostato
,Background Jobs,Processi in background
DocType: ToDo,ToDo,Cose da fare
DocType: ToDo,ToDo,Da Fare
DocType: DocField,No Copy,Copia Assente
DocType: Workflow State,qrcode,QRCode
apps/frappe/frappe/www/login.html +34,Login with LDAP,Accesso con LDAP


+ 1
- 1
frappe/translations/pt-BR.csv ファイルの表示

@@ -141,7 +141,6 @@ DocType: Kanban Board Column,purple,roxo
apps/frappe/frappe/public/js/frappe/upload.js +222,Please attach a file or set a URL,"Por favor, anexar um arquivo ou definir uma URL"
DocType: Async Task,System Manager,Administrador do Sistema
DocType: Dropbox Settings,Allow Dropbox Access,Permitir Acesso Dropbox
apps/frappe/frappe/core/doctype/deleted_document/deleted_document.js +11,Restore,Restarurar
DocType: Workflow State,plus-sign,sinal de mais
apps/frappe/frappe/desk/page/setup_wizard/setup_wizard.py +23,Setup already complete,Configuração já está concluída
apps/frappe/frappe/__init__.py +883,App {0} is not installed,App {0} não está instalado
@@ -511,6 +510,7 @@ DocType: System Settings,Date and Number Format,Data e Formato de número
apps/frappe/frappe/model/document.py +906,one of,Um dos
apps/frappe/frappe/public/js/frappe/desk.js +151,Checking one moment,"Checando, um momento"
apps/frappe/frappe/public/js/frappe/list/list_sidebar.js +353,Show Tags,Mostrar Tags
DocType: Address,Billing,Faturamento
DocType: Email Queue,Not Sent,Não Enviados
DocType: Workflow State,align-justify,Justificar
apps/frappe/frappe/public/js/frappe/ui/field_group.js +79,Following fields have missing values:,Os campos a seguir estão em branco:


+ 2
- 2
frappe/translations/pt.csv ファイルの表示

@@ -920,7 +920,7 @@ apps/frappe/frappe/website/doctype/web_form/templates/web_form.html +169,Max att
apps/frappe/frappe/model/document.py +906,one of,um dos
apps/frappe/frappe/public/js/frappe/desk.js +151,Checking one moment,Verificando um momento
apps/frappe/frappe/public/js/frappe/list/list_sidebar.js +353,Show Tags,Mostrar as tags
DocType: Address,Billing,Faturamento
DocType: Address,Billing,Faturação
DocType: Email Queue,Not Sent,Não Enviado
DocType: Web Form,Actions,Ações
DocType: Workflow State,align-justify,alinhar justificado
@@ -2220,7 +2220,7 @@ DocType: Async Task,Core,Núcleo
apps/frappe/frappe/custom/doctype/customize_form/customize_form.js +78,Set Permissions,Definir permissões
DocType: DocField,Set non-standard precision for a Float or Currency field,Definir precisão não-padrão para um campo Float ou Moeda
DocType: Email Account,Ignore attachments over this size,Ignorar anexos acima deste tamanho
DocType: Address,Preferred Billing Address,Endereço de Faturamento Preferido
DocType: Address,Preferred Billing Address,Endereço de Faturação Preferido
apps/frappe/frappe/database.py +231,Too many writes in one request. Please send smaller requests,"Muitos escreve em um pedido. Por favor, enviar pedidos de menores"
apps/frappe/frappe/core/doctype/version/version_view.html +8,Values Changed,Os valores alterados
DocType: Workflow State,arrow-up,seta-para-cima


+ 4
- 4
frappe/translations/uk.csv ファイルの表示

@@ -1179,7 +1179,7 @@ apps/frappe/frappe/public/js/frappe/model/meta.js +189,Last Modified By,Оста
DocType: Workflow State,hand-down,виносити
apps/frappe/frappe/core/doctype/doctype/doctype.py +661,{0}: Cannot set Cancel without Submit,{0}: Неможливо встановити Скасувати без Проведення
DocType: Website Theme,Theme,Тема
apps/frappe/frappe/desk/page/setup_wizard/setup_wizard.js +158,There were errors.,Були помилки.
apps/frappe/frappe/desk/page/setup_wizard/setup_wizard.js +158,There were errors.,Трапились помилки.
DocType: OAuth Authorization Code,Redirect URI Bound To Auth Code,"Перенаправлення URI, пов&#39;язаного з Auth кодексу"
DocType: DocType,Is Submittable,Є Submittable
apps/frappe/frappe/custom/doctype/property_setter/property_setter.js +7,Value for a check field can be either 0 or 1,"Значення для поля реєстрації може бути або 0, або 1"
@@ -1296,7 +1296,7 @@ apps/frappe/frappe/model/document.py +526,Record does not exist,Запис не
apps/frappe/frappe/core/doctype/version/version_view.html +13,Original Value,первісна вартість
DocType: Help Category,Help Category,Довідка з категорій
apps/frappe/frappe/utils/oauth.py +288,User {0} is disabled,Користувач {0} відключена
apps/frappe/frappe/www/404.html +8,Page missing or moved,Сторінка відсутній або переїхав
apps/frappe/frappe/www/404.html +8,Page missing or moved,Сторінка відсутня або її було переміщено
apps/frappe/frappe/public/js/legacy/form.js +192,Edit {0} properties,Зміна {0} властивості
DocType: DocType,Route,маршрут
apps/frappe/frappe/config/integrations.py +23,Razorpay Payment gateway settings,Налаштування шлюзу оплати Razorpay
@@ -1414,7 +1414,7 @@ apps/frappe/frappe/email/doctype/email_group/email_group.js +13,Import Email Fro
apps/frappe/frappe/email/doctype/contact/contact.js +20,Invite as User,Запросити стати користувачем
apps/frappe/frappe/public/js/frappe/views/communication.js +83,Select Attachments,Виберіть Вкладення
apps/frappe/frappe/model/naming.py +95, for {0},для {0}
apps/frappe/frappe/website/js/web_form.js +301,There were errors. Please report this.,"Були помилки. Будь ласка, повідомте про це."
apps/frappe/frappe/website/js/web_form.js +301,There were errors. Please report this.,"Трапились помилки. Будь ласка, повідомте про це."
apps/frappe/frappe/public/js/legacy/form.js +176,You are not allowed to print this document,Ви не можете надрукувати цей документ
apps/frappe/frappe/email/doctype/auto_email_report/auto_email_report.py +103,Please set filters value in Report Filter table.,"Будь ласка, встановіть значення фільтрів в Report Filter таблиці."
apps/frappe/frappe/public/js/frappe/views/reports/query_report.js +375,Loading Report,Завантаження звіту
@@ -2192,7 +2192,7 @@ apps/frappe/frappe/public/js/frappe/form/save.js +15,Cancelling,Скасуван
DocType: DocType,Allow Rename,Дозволити Перейменувати
DocType: Authentication Log,Full Name,Повне ім&#39;я
DocType: DocType,Child Tables are shown as a Grid in other DocTypes.,Дитячі Столики показані у вигляді сітки в інших DOCTYPES.
apps/frappe/frappe/www/404.html +10,The page you are looking for is missing. This could be because it is moved or there is a typo in the link.,"Сторінка, яку ви шукаєте, відсутній. Це може бути тому, що вона переміщається або є помилка в засланні."
apps/frappe/frappe/www/404.html +10,The page you are looking for is missing. This could be because it is moved or there is a typo in the link.,"Сторінка, яку ви шукаєте, відсутня. Можливо, вона була переміщена або у посиланні є помилка."
apps/frappe/frappe/www/404.html +13,Error Code: {0},Код помилки: {0}
DocType: Blog Post,"Description for listing page, in plain text, only a couple of lines. (max 140 characters)","Опис для перерахування сторінку, у вигляді звичайного тексту, тільки пару рядків. (макс 140 знаків)"
apps/frappe/frappe/core/page/user_permissions/user_permissions.js +304,Add A User Restriction,Додати A Обмеження користувача


+ 9
- 9
frappe/translations/vi.csv ファイルの表示

@@ -52,7 +52,7 @@ apps/frappe/frappe/core/page/data_import_tool/exporter.py +52,Data Import Templa
apps/frappe/frappe/public/js/frappe/model/model.js +31,Parent,Cha mẹ
DocType: System Settings,"If enabled, the password strength will be enforced based on the Minimum Password Score value. A value of 2 being medium strong and 4 being very strong.","Nếu được bật, mật khẩu sẽ được thi hành dựa trên giá trị Điểm Số Điểm Tối Thiểu. Một giá trị của 2 là trung bình mạnh và 4 là rất mạnh."
DocType: System Settings,"If enabled, the password strength will be enforced based on the Minimum Password Score value. A value of 2 being medium strong and 4 being very strong.","Nếu được bật, mật khẩu sẽ được thi hành dựa trên giá trị Điểm Số Điểm Tối Thiểu. Một giá trị của 2 là trung bình mạnh và 4 là rất mạnh."
DocType: About Us Settings,"""Team Members"" or ""Management""","""Các Thành Viên Nhóm"" hay ""Ban Quản """
DocType: About Us Settings,"""Team Members"" or ""Management""","""Các Thành Viên Nhóm"" hay ""Ban Quản Trị"""
apps/frappe/frappe/core/doctype/doctype/doctype.py +437,Default for 'Check' type of field must be either '0' or '1',Mặc định cho loại 'Kiểm tra' của trường phải là '0' hoặc '1'
apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +50,Yesterday,Hôm qua
DocType: Contact,Designation,Chỉ định
@@ -97,7 +97,7 @@ apps/frappe/frappe/core/page/data_import_tool/data_import_main.html +4,"To impor
DocType: DocType,Default Print Format,Mặc định In Định dạng
DocType: Workflow State,Tags,tags
apps/frappe/frappe/public/js/frappe/form/workflow.js +33,None: End of Workflow,Không: Kết thúc quy trình làm việc
apps/frappe/frappe/model/db_schema.py +346,"{0} field cannot be set as unique in {1}, as there are non-unique existing values","trường {0} không thể thiết lập là duy nhất trong {1}, vì đang chứa những giá trị không phải duy nhất"
apps/frappe/frappe/model/db_schema.py +346,"{0} field cannot be set as unique in {1}, as there are non-unique existing values","{0}Lĩnh vực không thể thiết lập như kiểu duy nhất trong {1}, vì đang tồn tại những giá trị không phải duy nhất"
apps/frappe/frappe/core/page/permission_manager/permission_manager.js +47,Document Types,Các loại tài liệu
DocType: Workflow,Workflow State Field,Công việc nhà nước Dòng
apps/frappe/frappe/website/doctype/web_form/templates/web_form.html +54,Please sign-up or login to begin,Vui lòng đăng ký hoặc đăng nhập để bắt đầu
@@ -786,7 +786,7 @@ apps/frappe/frappe/desk/form/assign_to.py +137,"The task {0}, that you assigned
DocType: User,Modules Access,Modules truy cập
apps/frappe/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py +75,Please close this window,Hãy đóng cửa sổ này
DocType: Print Format,Print Format Type,Định dạng in Loại
DocType: Newsletter,A Lead with this Email Address should exist,Một Chì với Địa chỉ Email này nên tồn tại
DocType: Newsletter,A Lead with this Email Address should exist,Một Lead với Địa chỉ Email này nên tồn tại
apps/frappe/frappe/public/js/frappe/ui/toolbar/about.js +7,Open Source Applications for the Web,Ứng dụng mã nguồn mở cho Web
DocType: Website Theme,"Add the name of a ""Google Web Font"" e.g. ""Open Sans""",Thêm tên của một &quot;Font Google Web&quot; ví dụ &quot;Open Sans&quot;
apps/frappe/frappe/public/js/frappe/request.js +141,Request Timed Out,Yêu cầu Timed Out
@@ -1143,7 +1143,7 @@ apps/frappe/frappe/core/page/user_permissions/user_permissions.js +251,If Docume
apps/frappe/frappe/model/delete_doc.py +220,"Cannot delete or cancel because {0} <a href=""#Form/{0}/{1}"">{1}</a> is linked with {2} <a href=""#Form/{2}/{3}"">{3}</a> {4}","Không thể xóa hoặc hủy bỏ vì {0} <a href=""#Form/{0}/{1}"">{1}</a> được liên kết với {2} <a href=""#Form/{2}/{3}"">{3}</a> {4}"
apps/frappe/frappe/desk/page/applications/applications.py +109,Unknown app {0},Ứng dụng không rõ {0}
apps/frappe/frappe/email/doctype/auto_email_report/auto_email_report.py +48,"%s is not a valid report format. Report format should \
one of the following %s",%s không phải là một định dạng báo cáo hợp lệ. Mẫu báo cáo nên \ một trong những %s sau
one of the following %s",%s không phải là một mẫu báo cáo hợp lệ. Mẫu báo cáo nên \ một trong những %s sau
DocType: Communication,Chat,Trò chuyện
apps/frappe/frappe/core/doctype/doctype/doctype.py +391,Fieldname {0} appears multiple times in rows {1},Fieldname {0} xuất hiện nhiều lần trong hàng {1}
apps/frappe/frappe/public/js/frappe/form/footer/timeline.js +460,{0} from {1} to {2} in row #{3},{0} từ {1} đến {2} trong hàng # {3}
@@ -1578,7 +1578,7 @@ apps/frappe/frappe/desk/page/applications/applications.js +77,Installed,Đã cà
apps/frappe/frappe/desk/page/applications/applications.js +47,Developer Tools,Những công cụ phát triển
DocType: Workflow State,fullscreen,toàn màn hình
apps/frappe/frappe/public/js/frappe/views/reports/query_report.js +214,You are not allowed to make PDF for this report,Bạn không được phép làm PDF cho báo cáo này
apps/frappe/frappe/templates/emails/feedback_request_url.html +8,1 star being lowest & 5 stars being highest rating,1 sao là thấp nhất &amp; 5 sao được đánh giá cao nhất
apps/frappe/frappe/templates/emails/feedback_request_url.html +8,1 star being lowest & 5 stars being highest rating,1 sao là thấp nhất & 5 sao là đánh giá cao nhất
DocType: Event,Ref Name,Tài liệu tham khảo Tên
DocType: Web Page,Center,Trung tâm
apps/frappe/frappe/core/doctype/error_snapshot/error_snapshot_list.js +11,First Level,Đầu Cấp
@@ -1966,7 +1966,7 @@ DocType: Address Template,Template,Mẫu
apps/frappe/frappe/config/integrations.py +48,LDAP Settings,Cài đặt LDAP
apps/frappe/frappe/public/js/frappe/form/save.js +14,Amending,Sửa đổi
apps/frappe/frappe/config/integrations.py +18,PayPal payment gateway settings,thiết lập cổng thanh toán PayPal
apps/frappe/frappe/model/base_document.py +580,"{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}","{0}: {1} '({3}) sẽ được cắt ngắn, số kí tự tối đa cho phép là {2}"
apps/frappe/frappe/model/base_document.py +580,"{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}","{0}: {1} '({3}) sẽ được cắt ngắn, số kí tự tối đa cho phép là {2}"
DocType: OAuth Client,Resource Owner Password Credentials,Tài nguyên chủ Password Credentials
DocType: OAuth Client,Response Type,Loại phản ứng
apps/frappe/frappe/core/page/usage_info/usage_info.html +21,Max Users,người dùng Max
@@ -2246,7 +2246,7 @@ DocType: DocType,Quick Entry,Quick Entry
apps/frappe/frappe/core/doctype/file/file.py +224,No permission to write / remove.,Không có quyền viết / loại bỏ.
DocType: Web Form,Button Label,nút Label
DocType: Website Theme,UPPERCASE,in hoa
apps/frappe/frappe/public/js/frappe/list/list_view.js +806,{0} items selected,Đã chọn {0} mục
apps/frappe/frappe/public/js/frappe/list/list_view.js +806,{0} items selected,{0} mục đã được chọn
apps/frappe/frappe/email/doctype/email_queue/email_queue_list.js +16,Suspend Sending,đình chỉ Gửi
apps/frappe/frappe/printing/page/print_format_builder/print_format_builder_layout.html +3,Drag elements from the sidebar to add. Drag them back to trash.,Yếu tố kéo từ thanh bên để thêm. Kéo chúng trở lại vào thùng rác.
DocType: Workflow State,resize-small,thay đổi kích thước nhỏ
@@ -2374,7 +2374,7 @@ DocType: Web Page,Website Sidebar,website Sidebar
DocType: Web Form,Show Sidebar,Hiện Sidebar
apps/frappe/frappe/website/doctype/web_form/web_form.py +128,You need to be logged in to access this {0}.,Bạn cần phải đăng nhập để truy cập {0} này.
apps/frappe/frappe/public/js/frappe/form/footer/assign_to.js +142,Complete By,Hoàn chỉnh bởi
apps/frappe/frappe/templates/includes/comments/comments.py +48,{0} by {1},{0} nhân {1}
apps/frappe/frappe/templates/includes/comments/comments.py +48,{0} by {1},{0} bởi {1}
apps/frappe/frappe/utils/password_strength.py +171,All-uppercase is almost as easy to guess as all-lowercase.,All-hoa là gần như là dễ đoán như tất cả-chữ thường.
DocType: Feedback Trigger,Email Fieldname,Fieldname email
DocType: Website Settings,Top Bar Items,Top Bar mục
@@ -2692,7 +2692,7 @@ apps/frappe/frappe/public/js/frappe/views/treeview.js +297,View List,Xem danh s
apps/frappe/frappe/public/js/frappe/form/control.js +686,Date must be in format: {0},Ngày phải có định dạng: {0}
DocType: Workflow,Don't Override Status,Đừng Override Status
apps/frappe/frappe/www/feedback.html +90,Please give a rating.,Xin vui lòng cho một đánh giá.
apps/frappe/frappe/public/js/frappe/feedback.js +47,{0} Feedback Request,{0} Phản hồi Yêu cầu
apps/frappe/frappe/public/js/frappe/feedback.js +47,{0} Feedback Request,{0} Yêu cầu Phản Hồi
apps/frappe/frappe/public/js/frappe/form/multi_select_dialog.js +26,Search term,Thuật ngữ tìm kiếm
apps/frappe/frappe/desk/page/setup_wizard/setup_wizard.js +548,The First User: You,Những thành viên đầu tiên: Bạn
apps/frappe/frappe/printing/page/print_format_builder/print_format_builder_field.html +32,Select Columns,Select Columns


+ 1
- 1
frappe/utils/bench_helper.py ファイルの表示

@@ -78,7 +78,7 @@ def get_frappe_commands():
if app_commands:
commands.extend(app_commands.keys())

print(json.dumps(get_app_commands('frappe').keys()))
print(json.dumps(commands))

@click.command('get-frappe-help')
def get_frappe_help():


+ 1
- 1
frappe/website/context.py ファイルの表示

@@ -48,7 +48,7 @@ def update_controller_context(context, controller):
context.update(ret)
except frappe.Redirect:
raise
except frappe.PermissionError:
except (frappe.PermissionError, frappe.DoesNotExistError):
raise
except:
if not frappe.flags.in_migrate:


読み込み中…
キャンセル
保存