From 96c987870ec60a1f9455255e873f0d1cad03748f Mon Sep 17 00:00:00 2001 From: Smit Vora Date: Fri, 30 Jun 2023 14:27:10 +0530 Subject: [PATCH 001/221] fix: support timespan filters for custom dashboard chart source --- frappe/desk/doctype/dashboard_chart/dashboard_chart.js | 1 - frappe/public/js/frappe/widgets/chart_widget.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index 6d23be79d7..5ed71e91a8 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -48,7 +48,6 @@ frappe.ui.form.on("Dashboard Chart", { frm.set_df_property("dynamic_filters_section", "hidden", 1); frm.trigger("set_parent_document_type"); - frm.trigger("set_time_series"); frm.set_query("document_type", function () { return { filters: { diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js index 18f7459a6c..ed40789173 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -103,7 +103,7 @@ export default class ChartWidget extends Widget { this.action_area.empty(); this.prepare_chart_actions(); - if (this.chart_doc.timeseries && this.chart_doc.chart_type !== "Custom") { + if (this.chart_doc.timeseries) { this.render_time_series_filters(); } } From fd432f413f926c7ef4350913645ebc9898d30627 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 25 Jul 2023 21:34:21 +0200 Subject: [PATCH 002/221] fix: translatable messages in sidebar and timeline --- .../js/frappe/form/footer/base_timeline.js | 2 +- .../js/frappe/form/footer/form_timeline.js | 33 +++++++------------ .../version_timeline_content_builder.js | 2 +- .../js/frappe/form/sidebar/form_sidebar.js | 33 +++++++++---------- 4 files changed, 30 insertions(+), 40 deletions(-) diff --git a/frappe/public/js/frappe/form/footer/base_timeline.js b/frappe/public/js/frappe/form/footer/base_timeline.js index e78c288159..9ed51096da 100644 --- a/frappe/public/js/frappe/form/footer/base_timeline.js +++ b/frappe/public/js/frappe/form/footer/base_timeline.js @@ -139,7 +139,7 @@ class BaseTimeline { let timeline_content = timeline_item.find(".timeline-content"); timeline_content.append(item.content); if (!item.hide_timestamp && !item.is_card) { - timeline_content.append(` - ${comment_when(item.creation)}`); + timeline_content.append(` · ${comment_when(item.creation)}`); } if (item.id) { timeline_content.attr("id", item.id); diff --git a/frappe/public/js/frappe/form/footer/form_timeline.js b/frappe/public/js/frappe/form/footer/form_timeline.js index bdd53f1a4e..d73a9d6ffa 100644 --- a/frappe/public/js/frappe/form/footer/form_timeline.js +++ b/frappe/public/js/frappe/form/footer/form_timeline.js @@ -118,7 +118,7 @@ class FormTimeline extends BaseTimeline { if (this.frm.doc.route && cint(frappe.boot.website_tracking_enabled)) { frappe.utils.get_page_view_count(this.frm.doc.route).then((res) => { this.add_timeline_item({ - content: __("{0} Web page views", [res.message], "Form timeline"), + content: __("{0} Web page views", [res.message]), hide_timestamp: true, }); }); @@ -126,27 +126,23 @@ class FormTimeline extends BaseTimeline { } get_creation_message() { - const user_link = get_user_link(this.frm.doc.owner); - return { creation: this.frm.doc.creation, content: get_user_message( this.frm.doc.owner, - __("You created this", null, "Form timeline"), - __("{0} created this", [user_link], "Form timeline") + __("You created this"), + __("{0} created this", [get_user_link(this.frm.doc.owner)]) ), }; } get_modified_message() { - const user_link = get_user_link(this.frm.doc.modified_by); - return { creation: this.frm.doc.modified, content: get_user_message( this.frm.doc.modified_by, - __("You last edited this", null, "Form timeline"), - __("{0} last edited this", [user_link], "Form timeline") + __("You last edited this"), + __("{0} last edited this", [get_user_link(this.frm.doc.modified_by)]) ), }; } @@ -174,18 +170,13 @@ class FormTimeline extends BaseTimeline { get_view_timeline_contents() { let view_timeline_contents = []; (this.doc_info.views || []).forEach((view) => { - const view_time = comment_when(view.creation); - const user_link = get_user_link(view.owner); - const timeline_content = get_user_message( - view.owner, - __("You viewed this {0}", [view_time], "Form timeline"), - __("{0} viewed this {1}", [user_link, view_time], "Form timeline") - ); - view_timeline_contents.push({ creation: view.creation, - content: timeline_content, - hide_timestamp: true, + content: get_user_message( + view.owner, + __("You viewed this"), + __("{0} viewed this", [get_user_link(view.owner)]) + ), }); }); @@ -462,8 +453,8 @@ class FormTimeline extends BaseTimeline { (this.doc_info.like_logs || []).forEach((like_log) => { const timeline_content = get_user_message( like_log.owner, - __("You Liked", null, "Form timeline"), - __("{0} Liked", [get_user_link(like_log.owner)], "Form timeline") + __("You Liked"), + __("{0} Liked", [get_user_link(like_log.owner)]) ); like_timeline_contents.push({ diff --git a/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js b/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js index 84ee4fd67d..77e6cacd66 100644 --- a/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js +++ b/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js @@ -284,7 +284,7 @@ function format_content_for_timeline(content) { } function get_user_link(user) { - const user_display_text = (frappe.user_info(user).fullname || "").bold(); + const user_display_text = frappe.user_info(user).fullname || ""; return frappe.utils.get_form_link("User", user, true, user_display_text); } diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 4859fa5c02..fce92596a8 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -5,6 +5,7 @@ import "./review"; import "./document_follow"; import "./user_image"; import "./form_sidebar_users"; +import { get_user_link, get_user_message } from "../footer/version_timeline_content_builder"; frappe.ui.form.Sidebar = class { constructor(opts) { @@ -79,33 +80,31 @@ frappe.ui.form.Sidebar = class { frappe.utils.get_page_view_count(route).then((res) => { this.sidebar .find(".pageview-count") - .html(__("{0} Page Views", [String(res.message).bold()])); + .html(__("{0} Web page views", [String(res.message).bold()])); }); } this.sidebar .find(".modified-by") .html( - __( - "{0} edited this {1}", - [ - frappe.user.full_name(this.frm.doc.modified_by).bold(), - "
" + comment_when(this.frm.doc.modified), - ], - "For example, 'Jon Doe edited this 5 minutes ago'." - ) + get_user_message( + this.frm.doc.modified_by, + __("You last edited this", null), + __("{0} last edited this", [get_user_link(this.frm.doc.modified_by)]) + ) + + " · " + + comment_when(this.frm.doc.modified) ); this.sidebar .find(".created-by") .html( - __( - "{0} created this {1}", - [ - frappe.user.full_name(this.frm.doc.owner).bold(), - "
" + comment_when(this.frm.doc.creation), - ], - "For example, 'Jon Doe created this 5 minutes ago'." - ) + get_user_message( + this.frm.doc.owner, + __("You created this", null), + __("{0} created this", [get_user_link(this.frm.doc.owner)]) + ) + + " · " + + comment_when(this.frm.doc.creation) ); this.refresh_like(); From a41979d85e43dd47243a79d61e0b8f72354c9bb5 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 25 Jul 2023 21:34:48 +0200 Subject: [PATCH 003/221] fix: german translations for timeline + sidebar --- frappe/translations/de.csv | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/frappe/translations/de.csv b/frappe/translations/de.csv index f8bbd8e22e..849bd71aac 100644 --- a/frappe/translations/de.csv +++ b/frappe/translations/de.csv @@ -4749,13 +4749,19 @@ Copy,Kopieren, {} Assigned,{} Zugewiesen, Hide Saved,Gespeicherte ausblenden, Show Saved,Gespeicherte anzeigen, -{0} created this {1},{0} erstellte dies {1}, -{0} created this,{0} erstellte dies, -You created this,Sie erstellten dies, -{0} edited this {1},{0} bearbeitete dies {1}, -You edited this {0},Sie bearbeiteten dies {0}, -{0} viewed this {1},{0} sah sich dies {1} an, -You viewed this {0},Sie sahen sich dies {0} an, +You created this,Von Ihnen erstellt, +{0} created this,Von {0} erstellt, +You last edited this,Zuletzt von Ihnen bearbeitet, +{0} last edited this,Zuletzt von {0} bearbeitet, +You viewed this,Von Ihnen angesehen, +{0} viewed this,Von {0} angesehen, +You liked,Gefällt Ihnen, +{0} liked,Gefällt {0}, +You changed the value of {0} {1},Sie haben folgende Werte geändert: {0} {1}, +{0} changed the value of {1} {2},{0} hat folgende Werte geändert: {1} {2}, +You changed the value of {0},Sie haben folgende Werte geändert: {0}, +{0} changed the value of {1},{0} hat folgende Werte geändert: {1}, +{0} Web page views,{0} Webseitenaufrufe, Toggle Full Width,Toggle Volle Breite, Documentation,Dokumentation, About,Über, @@ -4797,8 +4803,8 @@ Add a Filter,Filter hinzufügen, Reset Customizations,Anpassungen zurücksetzen, {} wants to access the following details from your account,{} möchte Zugriff auf die folgenden Angaben von Ihrem Account, {0} is not a field of doctype {1},{0} ist kein Feld in Doctype {1}, -{0} from {1} to {2} in row #{3},{0} von {1} zu/bis {2} in Zeile #{3}, -{0} from {1} to {2},{0} von {1} zu/bis {2}, +{0} from {1} to {2} in row #{3},{0} von {1} zu {2} in Zeile #{3}, +{0} from {1} to {2},{0} von {1} zu {2}, {0} changed {1} to {2},{0} wurde von {1} zu {2} geändert, {0} Map,{0} Karte, Use HTML,HTML verwenden, From 370e04ef43bbacc145e00a5656c55a44876f3f3e Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 25 Jul 2023 23:56:17 +0200 Subject: [PATCH 004/221] fix: german translations for timeline + sidebar --- frappe/translations/de.csv | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frappe/translations/de.csv b/frappe/translations/de.csv index 849bd71aac..4ac1e400fd 100644 --- a/frappe/translations/de.csv +++ b/frappe/translations/de.csv @@ -4170,7 +4170,7 @@ No changes in document,Keine Änderungen im Dokument, by Role,nach Rolle, Document is only editable by users with role,Das Dokument kann nur von Benutzern mit Rolle bearbeitet werden, {0}: Other permission rules may also apply,{0}: Möglicherweise gelten auch andere Berechtigungsregeln, -{0} Page Views,{0} Seitenaufrufe, +{0} Web page views,{0} Seitenaufrufe, Expand,Erweitern, Collapse,Zusammenbruch, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Ungültiger Inhaber-Token, bitte geben Sie einen gültigen Zugriffstoken mit dem Präfix "Träger" an.", @@ -4761,7 +4761,10 @@ You changed the value of {0} {1},Sie haben folgende Werte geändert: {0} {1}, {0} changed the value of {1} {2},{0} hat folgende Werte geändert: {1} {2}, You changed the value of {0},Sie haben folgende Werte geändert: {0}, {0} changed the value of {1},{0} hat folgende Werte geändert: {1}, -{0} Web page views,{0} Webseitenaufrufe, +You attached {0},Sie haben {0} angehängt, +{0} attached {1},{0} hat {1} angehängt, +You removed attachment {0},Sie haben den Anhang {0} entfernt, +{0} removed attachment {1},{0} hat den Anhang {1} entfernt, Toggle Full Width,Toggle Volle Breite, Documentation,Dokumentation, About,Über, From 0dfe3d54536a51681409488e8320b36e668ee7b7 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 25 Jul 2023 23:57:08 +0200 Subject: [PATCH 005/221] chore: migrate existing translations To match adjusted translatable strings --- frappe/translations/af.csv | 2 +- frappe/translations/am.csv | 2 +- frappe/translations/ar.csv | 2 +- frappe/translations/bg.csv | 2 +- frappe/translations/bn.csv | 2 +- frappe/translations/bs.csv | 2 +- frappe/translations/ca.csv | 2 +- frappe/translations/cs.csv | 2 +- frappe/translations/cz.csv | 4 ++-- frappe/translations/da.csv | 2 +- frappe/translations/el.csv | 2 +- frappe/translations/es.csv | 2 +- frappe/translations/et.csv | 2 +- frappe/translations/fa.csv | 2 +- frappe/translations/fi.csv | 2 +- frappe/translations/fr.csv | 12 ++++++++---- frappe/translations/gu.csv | 2 +- frappe/translations/he.csv | 2 +- frappe/translations/hi.csv | 2 +- frappe/translations/hr.csv | 2 +- frappe/translations/hu.csv | 2 +- frappe/translations/id.csv | 2 +- frappe/translations/is.csv | 2 +- frappe/translations/it.csv | 2 +- frappe/translations/ja.csv | 2 +- frappe/translations/km.csv | 2 +- frappe/translations/kn.csv | 2 +- frappe/translations/ko.csv | 2 +- frappe/translations/ku.csv | 2 +- frappe/translations/lo.csv | 2 +- frappe/translations/lt.csv | 2 +- frappe/translations/lv.csv | 2 +- frappe/translations/mk.csv | 2 +- frappe/translations/ml.csv | 2 +- frappe/translations/mr.csv | 2 +- frappe/translations/ms.csv | 2 +- frappe/translations/my.csv | 2 +- frappe/translations/nl.csv | 2 +- frappe/translations/no.csv | 2 +- frappe/translations/pl.csv | 2 +- frappe/translations/ps.csv | 2 +- frappe/translations/pt-BR.csv | 2 +- frappe/translations/pt.csv | 2 +- frappe/translations/ro.csv | 2 +- frappe/translations/ru.csv | 14 +++++++------- frappe/translations/rw.csv | 2 +- frappe/translations/si.csv | 2 +- frappe/translations/sk.csv | 2 +- frappe/translations/sl.csv | 2 +- frappe/translations/sq.csv | 2 +- frappe/translations/sr-BA.csv | 4 ++-- frappe/translations/sr-SP.csv | 4 ++-- frappe/translations/sr.csv | 2 +- frappe/translations/sv.csv | 2 +- frappe/translations/sw.csv | 2 +- frappe/translations/ta.csv | 2 +- frappe/translations/te.csv | 2 +- frappe/translations/th.csv | 2 +- frappe/translations/tr.csv | 2 +- frappe/translations/uk.csv | 2 +- frappe/translations/ur.csv | 2 +- frappe/translations/uz.csv | 2 +- frappe/translations/vi.csv | 2 +- frappe/translations/zh-TW.csv | 4 ++-- frappe/translations/zh.csv | 2 +- 65 files changed, 82 insertions(+), 78 deletions(-) diff --git a/frappe/translations/af.csv b/frappe/translations/af.csv index ab1f51b73d..4d2ff0fc56 100644 --- a/frappe/translations/af.csv +++ b/frappe/translations/af.csv @@ -4137,7 +4137,7 @@ No changes in document,Geen veranderinge in die dokument nie, by Role,deur Rol, Document is only editable by users with role,Dokument kan slegs deur gebruikers met rol gewysig word, {0}: Other permission rules may also apply,{0}: Ander toestemmingsreëls kan ook van toepassing wees, -{0} Page Views,{0} Bladsyaansigte, +{0} Web page views,{0} Bladsyaansigte, Expand,Brei uit, Collapse,Inval, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Ongeldige toker-token, verskaf 'n geldige toegangstoken met die voorvoegsel 'Draer'.", diff --git a/frappe/translations/am.csv b/frappe/translations/am.csv index 9b6b1b8813..e89bb0ebb8 100644 --- a/frappe/translations/am.csv +++ b/frappe/translations/am.csv @@ -4137,7 +4137,7 @@ No changes in document,በሰነድ ውስጥ ምንም ለውጦች የሉም, by Role,በ ሚና, Document is only editable by users with role,ሰነድ ሚና ባላቸው ተጠቃሚዎች ብቻ ሊስተካከል የሚችል ነው, {0}: Other permission rules may also apply,{0}: - ሌሎች የፈቃድ ሕጎችም ተፈጻሚ ሊሆኑ ይችላሉ, -{0} Page Views,{0} የገጽ እይታዎች, +{0} Web page views,{0} የገጽ እይታዎች, Expand,ዘርጋ, Collapse,ሰብስብ, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",ልክ ያልሆነ ተሸካሚ ማስመሰያ ፣ እባክዎን ትክክለኛ የመድረሻ ማስመሰያ በ ‹ተሸካሚ› ያቅርቡ ፡፡, diff --git a/frappe/translations/ar.csv b/frappe/translations/ar.csv index c45456f0ba..755a9619cc 100644 --- a/frappe/translations/ar.csv +++ b/frappe/translations/ar.csv @@ -4137,7 +4137,7 @@ No changes in document,لا توجد تغييرات في المستند, by Role,حسب الدور, Document is only editable by users with role,المستند قابل للتحرير فقط من قبل المستخدمين ذوي الدور, {0}: Other permission rules may also apply,{0}: قد تنطبق قواعد أذونات أخرى أيضًا, -{0} Page Views,{0} مشاهدات الصفحة, +{0} Web page views,{0} مشاهدات الصفحة, Expand,وسعت, Collapse,انهيار, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",رمز الحامل غير صالح ، يرجى تقديم رمز وصول صالح مع البادئة "Bearer"., diff --git a/frappe/translations/bg.csv b/frappe/translations/bg.csv index 1a12a874af..0da954ffda 100644 --- a/frappe/translations/bg.csv +++ b/frappe/translations/bg.csv @@ -4137,7 +4137,7 @@ No changes in document,Няма промени в документа, by Role,от Роля, Document is only editable by users with role,Документът може да се редактира само от потребители с роля, {0}: Other permission rules may also apply,{0}: Може да се прилагат и други правила за разрешение, -{0} Page Views,{0} Показвания на страници, +{0} Web page views,{0} Показвания на страници, Expand,Разгънете, Collapse,Свиване, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Невалиден маркер на носител, моля, предоставете валиден маркер за достъп с префикс „Носител“.", diff --git a/frappe/translations/bn.csv b/frappe/translations/bn.csv index d7334da435..5934e2f70f 100644 --- a/frappe/translations/bn.csv +++ b/frappe/translations/bn.csv @@ -4137,7 +4137,7 @@ No changes in document,নথিতে কোনও পরিবর্তন ন by Role,ভূমিকা দ্বারা, Document is only editable by users with role,দস্তাবেজটি ভূমিকা সহ ব্যবহারকারীরা কেবল সম্পাদনযোগ্য, {0}: Other permission rules may also apply,{0}: অন্যান্য অনুমতি বিধিগুলিও প্রয়োগ হতে পারে, -{0} Page Views,Views 0} পৃষ্ঠা দর্শন, +{0} Web page views,Views 0} পৃষ্ঠা দর্শন, Expand,বিস্তৃত করা, Collapse,সঙ্কুচিত, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","অবৈধ বেয়ারার টোকেন, অনুগ্রহ করে 'বহনকারী' উপসর্গ সহ একটি বৈধ অ্যাক্সেস টোকেন সরবরাহ করুন।", diff --git a/frappe/translations/bs.csv b/frappe/translations/bs.csv index edf865a6f4..930b4cebfa 100644 --- a/frappe/translations/bs.csv +++ b/frappe/translations/bs.csv @@ -4137,7 +4137,7 @@ No changes in document,Nema promjena u dokumentu, by Role,by Role, Document is only editable by users with role,Dokument mogu uređivati samo korisnici koji imaju ulogu, {0}: Other permission rules may also apply,{0}: Mogu se primijeniti i druga pravila dozvole, -{0} Page Views,{0} Prikazi stranice, +{0} Web page views,{0} Prikazi stranice, Expand,Proširiti, Collapse,Kolaps, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Nevažeći token nosioca, navedite važeći pristupni token s prefiksom 'Bearer'.", diff --git a/frappe/translations/ca.csv b/frappe/translations/ca.csv index ec258aee33..313bfb0ebe 100644 --- a/frappe/translations/ca.csv +++ b/frappe/translations/ca.csv @@ -4137,7 +4137,7 @@ No changes in document,No hi ha canvis al document, by Role,per Role, Document is only editable by users with role,El document només és editable pels usuaris amb funció, {0}: Other permission rules may also apply,{0}: també es poden aplicar altres regles de permís, -{0} Page Views,{0} Visualitzacions de pàgina, +{0} Web page views,{0} Visualitzacions de pàgina, Expand,Amplia, Collapse,Replega, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","El testimoni de portador no és vàlid, proporcioneu un testimoni d'accés vàlid amb el prefix "Portador".", diff --git a/frappe/translations/cs.csv b/frappe/translations/cs.csv index 0cc46a53f6..4d0f0950fc 100644 --- a/frappe/translations/cs.csv +++ b/frappe/translations/cs.csv @@ -4137,7 +4137,7 @@ No changes in document,Žádné změny v dokumentu, by Role,podle role, Document is only editable by users with role,Dokument lze upravovat pouze uživateli s rolí, {0}: Other permission rules may also apply,{0}: Mohou platit i další pravidla oprávnění, -{0} Page Views,{0} Zobrazení stránky, +{0} Web page views,{0} Zobrazení stránky, Expand,Rozšířit, Collapse,Kolaps, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Neplatný token na doručitele, uveďte platný přístupový token s předponou „na doručitele“.", diff --git a/frappe/translations/cz.csv b/frappe/translations/cz.csv index a8ebef69d5..5be9e5f1b5 100644 --- a/frappe/translations/cz.csv +++ b/frappe/translations/cz.csv @@ -816,7 +816,7 @@ Style,Styl, {0} comments,{0} komentáře, Label and Type,Popisek a typ, forward,předat dál, -{0} edited this {1},{0} upravovat tento {1} +{0} last edited this,{0} upravovat tento, Custom Javascript,Přizpůsobený Javascript, Submit,Odeslat, Sub-domain provided by erpnext.com,Sub doména poskytnutá (kým) erpnext.com, @@ -849,7 +849,7 @@ Dec,Pro, Leave blank to repeat always,Nechte prázdné pro opakování vždy, Ends on,Končo, Item cannot be added to its own descendants,Položka nemůže být přidána jako svůj vlastní podřízený potomek, -{0} created this {1},{0} vytvoření této {1} +{0} created this,{0} vytvořil(a) tento, "The task {0}, that you assigned to {1}, has been closed by {2}.","Úkol {0}, které jste přiřadili k {1}, bylo uzavřeno {2}." Short Name,Zkrácené jméno, magnet,magnet, diff --git a/frappe/translations/da.csv b/frappe/translations/da.csv index df68556fec..2b63ad076c 100644 --- a/frappe/translations/da.csv +++ b/frappe/translations/da.csv @@ -4137,7 +4137,7 @@ No changes in document,Ingen ændring på siden, by Role,af rolle, Document is only editable by users with role,Dokument kan kun redigeres af brugere med rolle, {0}: Other permission rules may also apply,{0}: Andre tilladelsesregler gælder muligvis også, -{0} Page Views,{0} Sidevisninger, +{0} Web page views,{0} Sidevisninger, Expand,Se mere, Collapse,Bryder sammen, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",Ugyldigt bærertoken. Angiv et gyldigt adgangstoken med præfikset 'Bærer'., diff --git a/frappe/translations/el.csv b/frappe/translations/el.csv index a3e0fbc6e0..f9ebb5d469 100644 --- a/frappe/translations/el.csv +++ b/frappe/translations/el.csv @@ -4137,7 +4137,7 @@ No changes in document,Δεν υπάρχουν αλλαγές στο έγγρα by Role,από τον ρόλο, Document is only editable by users with role,Το έγγραφο είναι επεξεργάσιμο μόνο από χρήστες με ρόλο, {0}: Other permission rules may also apply,{0}: Ενδέχεται να ισχύουν και άλλοι κανόνες άδειας, -{0} Page Views,{0} Προβολές σελίδας, +{0} Web page views,{0} Προβολές σελίδας, Expand,Επεκτείνουν, Collapse,Κατάρρευση, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Μη έγκυρο διακριτικό Bearer, δώστε ένα έγκυρο διακριτικό πρόσβασης με το πρόθεμα "Bearer".", diff --git a/frappe/translations/es.csv b/frappe/translations/es.csv index a01e456f3e..58f9b666b2 100644 --- a/frappe/translations/es.csv +++ b/frappe/translations/es.csv @@ -4152,7 +4152,7 @@ No changes in document,Sin cambios en el documento, by Role,por rol, Document is only editable by users with role,El documento solo es editable por usuarios con rol, {0}: Other permission rules may also apply,{0}: también se pueden aplicar otras reglas de permisos, -{0} Page Views,{0} Vistas de página, +{0} Web page views,{0} Vistas de página, Expand,Expandir, Collapse,Colapso, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Token de portador no válido, proporcione un token de acceso válido con el prefijo 'Portador'.", diff --git a/frappe/translations/et.csv b/frappe/translations/et.csv index e9b582aba8..3bd564cd0a 100644 --- a/frappe/translations/et.csv +++ b/frappe/translations/et.csv @@ -4137,7 +4137,7 @@ No changes in document,Dokumendis muudatusi pole, by Role,autorilt Role, Document is only editable by users with role,Dokumendi saavad redigeerida ainult rolliga kasutajad, {0}: Other permission rules may also apply,{0}: Võib kehtida ka muid lubade reegleid, -{0} Page Views,{0} Lehevaatamised, +{0} Web page views,{0} Lehevaatamised, Expand,Laienda, Collapse,Ahenda, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Kehtetu kandja luba, esitage kehtiv juurdepääsuluba eesliitega „Kandja”.", diff --git a/frappe/translations/fa.csv b/frappe/translations/fa.csv index b932e67e28..96351dd8c3 100644 --- a/frappe/translations/fa.csv +++ b/frappe/translations/fa.csv @@ -4137,7 +4137,7 @@ No changes in document,هیچ تغییری در سند وجود ندارد, by Role,توسط نقش, Document is only editable by users with role,سند فقط توسط کاربران با نقش قابل ویرایش است, {0}: Other permission rules may also apply,{0}: ممکن است سایر قوانین اجازه نیز اعمال شود, -{0} Page Views,{0} بازدید از صفحه, +{0} Web page views,{0} بازدید از صفحه, Expand,بسط دادن, Collapse,سقوط - فروپاشی, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",رمز حامل نامعتبر است ، لطفاً یک رمز دسترسی معتبر با پیشوند "حامل" ارائه دهید., diff --git a/frappe/translations/fi.csv b/frappe/translations/fi.csv index 1baae66db7..5aaca19d18 100644 --- a/frappe/translations/fi.csv +++ b/frappe/translations/fi.csv @@ -4137,7 +4137,7 @@ No changes in document,Ei muutoksia asiakirjassa, by Role,kirjoittanut Role, Document is only editable by users with role,"Asiakirjaa voivat muokata vain käyttäjät, joilla on rooli", {0}: Other permission rules may also apply,{0}: Myös muut käyttöoikeussäännöt voivat olla voimassa, -{0} Page Views,{0} Sivun näyttökerrat, +{0} Web page views,{0} Sivun näyttökerrat, Expand,Laajentaa, Collapse,Romahdus, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Virheellinen verkkotunnuksen tunnus. Anna kelvollinen käyttöoikeustunnus, jonka etuliite on 'kantaja'.", diff --git a/frappe/translations/fr.csv b/frappe/translations/fr.csv index 2983a9c1b5..1c0ceee327 100644 --- a/frappe/translations/fr.csv +++ b/frappe/translations/fr.csv @@ -4137,8 +4137,8 @@ No changes in document,Aucun changement dans le document, by Role,par rôle, Document is only editable by users with role,Le document n'est modifiable que par les utilisateurs avec un rôle, {0}: Other permission rules may also apply,{0}: d'autres règles d'autorisation peuvent également s'appliquer, -{0} Page Views,{0} pages vues, -{0} Page Views,{0} pages vues, +{0} Web page views,{0} pages vues, +{0} Web page views,{0} pages vues, Expand,Développer, Collapse,Réduire, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Jeton de porteur non valide, veuillez fournir un jeton d'accès valide avec le préfixe «porteur».", @@ -4701,8 +4701,12 @@ Value cannot be negative for {0}: {1},La valeur ne peut pas être négative pour Negative Value,Valeur négative, Authentication failed while receiving emails from Email Account: {0}.,L'authentification a échoué lors de la réception des e-mails du compte de messagerie: {0}., Message from server: {0},Message du serveur: {0} -{0} edited this {1},{0} a édité {1} -{0} created this {1},{0} a créé {1} +You last edited this,Vous avez édité ceci pour la dernière fois, +{0} last edited this,{0} a édité ceci pour la dernière fois, +You created this,Vous avez créé ceci, +{0} created this,{0} a créé ceci, +You liked,Vous avez aimé ceci, +{0} liked,{0} a aimé ceci, Report an Issue,Signaler une anomalie, User Forum,Forum utilisateur, About,A Propos, diff --git a/frappe/translations/gu.csv b/frappe/translations/gu.csv index b69b66d7f5..7910e75b39 100644 --- a/frappe/translations/gu.csv +++ b/frappe/translations/gu.csv @@ -4137,7 +4137,7 @@ No changes in document,દસ્તાવેજમાં કોઈ ફેરફ by Role,રોલ દ્વારા, Document is only editable by users with role,દસ્તાવેજ ભૂમિકાવાળા વપરાશકર્તાઓ દ્વારા જ સંપાદનયોગ્ય છે, {0}: Other permission rules may also apply,{0}: અન્ય પરવાનગી નિયમો પણ લાગુ થઈ શકે છે, -{0} Page Views,{0} પૃષ્ઠ દૃશ્યો, +{0} Web page views,{0} પૃષ્ઠ દૃશ્યો, Expand,વિસ્તૃત કરો, Collapse,પતન, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","અમાન્ય બેઅર ટોકન, કૃપા કરીને ઉપસર્ગ 'બેઅર' સાથે માન્ય accessક્સેસ ટોકન પ્રદાન કરો.", diff --git a/frappe/translations/he.csv b/frappe/translations/he.csv index 0142b7ada0..ef6b584df5 100644 --- a/frappe/translations/he.csv +++ b/frappe/translations/he.csv @@ -4137,7 +4137,7 @@ No changes in document,אין שינויים במסמך, by Role,מאת תפקיד, Document is only editable by users with role,ניתן לערוך את המסמך רק על ידי משתמשים בעלי תפקיד, {0}: Other permission rules may also apply,{0}: עשויים לחול כללי הרשאה אחרים, -{0} Page Views,{0} תצוגות דף, +{0} Web page views,{0} תצוגות דף, Expand,לְהַרְחִיב, Collapse,הִתמוֹטְטוּת, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","אסימון נושא לא חוקי, ספק אסימון גישה חוקי עם הקידומת 'נושא'.", diff --git a/frappe/translations/hi.csv b/frappe/translations/hi.csv index 7858773fe7..9105571380 100644 --- a/frappe/translations/hi.csv +++ b/frappe/translations/hi.csv @@ -4137,7 +4137,7 @@ No changes in document,दस्तावेज़ में कोई बदल by Role,भूमिका द्वारा, Document is only editable by users with role,दस्तावेज़ केवल भूमिका वाले उपयोगकर्ताओं द्वारा संपादन योग्य है, {0}: Other permission rules may also apply,{0}: अन्य अनुमति नियम भी लागू हो सकते हैं, -{0} Page Views,{0} पृष्ठ दृश्य, +{0} Web page views,{0} पृष्ठ दृश्य, Expand,विस्तार, Collapse,ढहने, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","अमान्य बियरर टोकन, कृपया उपसर्ग 'बियरर' के साथ एक मान्य एक्सेस टोकन प्रदान करें।", diff --git a/frappe/translations/hr.csv b/frappe/translations/hr.csv index cb0b39c3ab..cb14852f6d 100644 --- a/frappe/translations/hr.csv +++ b/frappe/translations/hr.csv @@ -4137,7 +4137,7 @@ No changes in document,Nema promjena u dokumentu, by Role,po Ulozi, Document is only editable by users with role,Dokument mogu uređivati samo korisnici s ulogom, {0}: Other permission rules may also apply,{0}: Mogu se primijeniti i druga pravila o dopuštenju, -{0} Page Views,{0} Prikazi stranice, +{0} Web page views,{0} Prikazi stranice, Expand,Proširiti, Collapse,Kolaps, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Nevaljani token nositelja, navedite valjani pristupni token s prefiksom "Nositelj".", diff --git a/frappe/translations/hu.csv b/frappe/translations/hu.csv index dd2151463c..442b91886b 100644 --- a/frappe/translations/hu.csv +++ b/frappe/translations/hu.csv @@ -4137,7 +4137,7 @@ No changes in document,Nincs változás a dokumentumban, by Role,Role által, Document is only editable by users with role,A dokumentumot csak szerepkörrel rendelkező felhasználók szerkeszthetik, {0}: Other permission rules may also apply,{0}: Egyéb engedélyezési szabályok is érvényesek lehetnek, -{0} Page Views,{0} Oldalmegtekintések, +{0} Web page views,{0} Oldalmegtekintések, Expand,Kiterjed, Collapse,Összeomlás, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Érvénytelen hordozó token, kérjük, adjon meg egy érvényes hozzáférési jogkivonatot a „hordozó” előtaggal.", diff --git a/frappe/translations/id.csv b/frappe/translations/id.csv index 63fe23ace2..a1598aa85f 100644 --- a/frappe/translations/id.csv +++ b/frappe/translations/id.csv @@ -4137,7 +4137,7 @@ No changes in document,Tidak ada perubahan dalam dokumen, by Role,berdasarkan Peran, Document is only editable by users with role,Dokumen hanya dapat diedit oleh pengguna dengan peran, {0}: Other permission rules may also apply,{0}: Aturan izin lain mungkin juga berlaku, -{0} Page Views,{0} Tampilan Halaman, +{0} Web page views,{0} Tampilan Halaman, Expand,Memperluas, Collapse,Jatuh, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Token Bearer tidak valid, berikan token akses yang valid dengan awalan 'Bearer'.", diff --git a/frappe/translations/is.csv b/frappe/translations/is.csv index fb899c35fc..74464d95bd 100644 --- a/frappe/translations/is.csv +++ b/frappe/translations/is.csv @@ -4137,7 +4137,7 @@ No changes in document,Engar breytingar á skjali, by Role,eftir Hlutverk, Document is only editable by users with role,Skjalinu er aðeins breytt af notendum með hlutverk, {0}: Other permission rules may also apply,{0}: Aðrar leyfisreglur geta einnig átt við, -{0} Page Views,{0} Síðuútsýni, +{0} Web page views,{0} Síðuútsýni, Expand,Stækkaðu, Collapse,Hrun, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Ógilt merki beranda, vinsamlegast gefðu upp gilt aðgangsmerki með forskeytinu 'Berandi'.", diff --git a/frappe/translations/it.csv b/frappe/translations/it.csv index 75bb160774..4621802948 100644 --- a/frappe/translations/it.csv +++ b/frappe/translations/it.csv @@ -4137,7 +4137,7 @@ No changes in document,Nessuna modifica nel documento, by Role,di Role, Document is only editable by users with role,Il documento è modificabile solo dagli utenti con ruolo, {0}: Other permission rules may also apply,{0}: potrebbero essere applicate anche altre regole di autorizzazione, -{0} Page Views,{0} Visualizzazioni di pagina, +{0} Web page views,{0} Visualizzazioni di pagina, Expand,Espandere, Collapse,Crollo, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Token del portatore non valido, fornire un token di accesso valido con il prefisso "Bearer".", diff --git a/frappe/translations/ja.csv b/frappe/translations/ja.csv index 83667d85ed..14177a7d3f 100644 --- a/frappe/translations/ja.csv +++ b/frappe/translations/ja.csv @@ -4137,7 +4137,7 @@ No changes in document,ドキュメントに変更はありません, by Role,役割別, Document is only editable by users with role,ドキュメントは、役割を持つユーザーのみが編集できます, {0}: Other permission rules may also apply,{0}:他の許可ルールも適用される場合があります, -{0} Page Views,{0}ページビュー, +{0} Web page views,{0}ページビュー, Expand,展開, Collapse,崩壊, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",無効なベアラートークン。プレフィックス「ベアラー」が付いた有効なアクセストークンを指定してください。, diff --git a/frappe/translations/km.csv b/frappe/translations/km.csv index 90b7171870..4099e895f2 100644 --- a/frappe/translations/km.csv +++ b/frappe/translations/km.csv @@ -4137,7 +4137,7 @@ No changes in document,គ្មានការផ្លាស់ប្តូរ by Role,ដោយតួនាទី, Document is only editable by users with role,ឯកសារអាចកែសម្រួលបានដោយអ្នកប្រើប្រាស់ដែលមានតួនាទីប៉ុណ្ណោះ, {0}: Other permission rules may also apply,{0}៖ ច្បាប់អនុញ្ញាតផ្សេងទៀតអាចត្រូវបានអនុវត្ត, -{0} Page Views,{0} ការមើលទំព័រ, +{0} Web page views,{0} ការមើលទំព័រ, Expand,ពង្រីក, Collapse,វេញ, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",និមិត្តសញ្ញាអ្នកកាន់មិនត្រឹមត្រូវសូមផ្តល់និមិត្តសញ្ញាចូលប្រើត្រឹមត្រូវដោយប្រើបុព្វបទ 'អ្នកកាន់' ។, diff --git a/frappe/translations/kn.csv b/frappe/translations/kn.csv index 85145c70af..e19d6f7165 100644 --- a/frappe/translations/kn.csv +++ b/frappe/translations/kn.csv @@ -4137,7 +4137,7 @@ No changes in document,ಡಾಕ್ಯುಮೆಂಟ್‌ನಲ್ಲಿ ಯ by Role,ಪಾತ್ರದಿಂದ, Document is only editable by users with role,ಪಾತ್ರವನ್ನು ಹೊಂದಿರುವ ಬಳಕೆದಾರರಿಂದ ಮಾತ್ರ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಸಂಪಾದಿಸಬಹುದಾಗಿದೆ, {0}: Other permission rules may also apply,{0}: ಇತರ ಅನುಮತಿ ನಿಯಮಗಳು ಸಹ ಅನ್ವಯಿಸಬಹುದು, -{0} Page Views,{0} ಪುಟ ವೀಕ್ಷಣೆಗಳು, +{0} Web page views,{0} ಪುಟ ವೀಕ್ಷಣೆಗಳು, Expand,ವಿಸ್ತರಿಸಲು, Collapse,ಕುಗ್ಗಿಸು, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","ಅಮಾನ್ಯ ಬೇರರ್ ಟೋಕನ್, ದಯವಿಟ್ಟು 'ಬೇರರ್' ಪೂರ್ವಪ್ರತ್ಯಯದೊಂದಿಗೆ ಮಾನ್ಯ ಪ್ರವೇಶ ಟೋಕನ್ ಒದಗಿಸಿ.", diff --git a/frappe/translations/ko.csv b/frappe/translations/ko.csv index 73f22a9843..3793e551f7 100644 --- a/frappe/translations/ko.csv +++ b/frappe/translations/ko.csv @@ -4137,7 +4137,7 @@ No changes in document,문서 변경 없음, by Role,역할 별, Document is only editable by users with role,문서는 역할이있는 사용자 만 편집 할 수 있습니다., {0}: Other permission rules may also apply,{0} : 다른 권한 규칙도 적용될 수 있습니다., -{0} Page Views,{0} 페이지 뷰, +{0} Web page views,{0} 페이지 뷰, Expand,넓히다, Collapse,무너짐, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",잘못된 Bearer 토큰입니다. 접두사가 'Bearer'인 유효한 액세스 토큰을 제공하세요., diff --git a/frappe/translations/ku.csv b/frappe/translations/ku.csv index 2fb808fd2f..0c5487e00a 100644 --- a/frappe/translations/ku.csv +++ b/frappe/translations/ku.csv @@ -4137,7 +4137,7 @@ No changes in document,Di belgeyê de guhertin tune, by Role,ji hêla Role ve, Document is only editable by users with role,Belge tenê ji hêla bikarhênerên bi rol ve têne guherandin, {0}: Other permission rules may also apply,{0}: Dibe ku qaîdeyên destûra din jî derbas bibin, -{0} Page Views,{0} Dîtinên Rûpelê, +{0} Web page views,{0} Dîtinên Rûpelê, Expand,Firehkirin, Collapse,Jiberhevketin, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Tokenek Hilbera nederbasdar, ji kerema xwe bi pêşgiriya 'Bearer' nîşanek gihîştina derbasdar peyda bikin.", diff --git a/frappe/translations/lo.csv b/frappe/translations/lo.csv index 624d583a4d..5a836c4ef3 100644 --- a/frappe/translations/lo.csv +++ b/frappe/translations/lo.csv @@ -4137,7 +4137,7 @@ No changes in document,ບໍ່ມີການປ່ຽນແປງໃນເອ by Role,ໂດຍບົດບາດ, Document is only editable by users with role,ເອກະສານສາມາດດັດແກ້ໄດ້ໂດຍຜູ້ໃຊ້ທີ່ມີບົດບາດ, {0}: Other permission rules may also apply,{0}: ກົດລະບຽບການອະນຸຍາດອື່ນໆອາດຈະ ນຳ ໃຊ້ໄດ້, -{0} Page Views,{0} ໜ້າ ວິວ, +{0} Web page views,{0} ໜ້າ ວິວ, Expand,ຂະຫຍາຍ, Collapse,ຍຸບລົງ, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","ເຄື່ອງ ໝາຍ ໃສ່ເຄື່ອງ ໝາຍ ຜູ້ທີ່ບໍ່ຖືກຕ້ອງ, ກະລຸນາໃຫ້ລະຫັດການເຂົ້າເຖິງທີ່ຖືກຕ້ອງກັບ ຄຳ ນຳ ໜ້າ 'Bearer'.", diff --git a/frappe/translations/lt.csv b/frappe/translations/lt.csv index c1d05068d4..2573a2aa35 100644 --- a/frappe/translations/lt.csv +++ b/frappe/translations/lt.csv @@ -4137,7 +4137,7 @@ No changes in document,Dokumente nėra jokių pakeitimų, by Role,pateikė Role, Document is only editable by users with role,Dokumentą gali redaguoti tik tam tikrą vaidmenį turintys vartotojai, {0}: Other permission rules may also apply,{0}: Taip pat gali būti taikomos kitos leidimo taisyklės, -{0} Page Views,{0} Puslapio peržiūros, +{0} Web page views,{0} Puslapio peržiūros, Expand,Išskleisti, Collapse,Sutraukti, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",Netinkamas turėtojo atpažinimo ženklas. Pateikite galiojantį prieigos raktą su priešdėliu „Bearer“., diff --git a/frappe/translations/lv.csv b/frappe/translations/lv.csv index 22f3eae1c8..b289af91a6 100644 --- a/frappe/translations/lv.csv +++ b/frappe/translations/lv.csv @@ -4137,7 +4137,7 @@ No changes in document,Dokumentā nav izmaiņu, by Role,autors Role, Document is only editable by users with role,Dokumentu var rediģēt tikai lietotāji ar lomu, {0}: Other permission rules may also apply,{0}: Var būt spēkā arī citi atļauju noteikumi, -{0} Page Views,{0} Lapas skatījumi, +{0} Web page views,{0} Lapas skatījumi, Expand,Izvērst, Collapse,Sakļaut, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Nederīgs nesēja marķieris, lūdzu, norādiet derīgu piekļuves marķieri ar prefiksu “Nesējs”.", diff --git a/frappe/translations/mk.csv b/frappe/translations/mk.csv index 1268fe1040..0f12e384a3 100644 --- a/frappe/translations/mk.csv +++ b/frappe/translations/mk.csv @@ -4137,7 +4137,7 @@ No changes in document,Нема промени во документот, by Role,од страна на Рол, Document is only editable by users with role,Документот може да се уредува само од корисници со улога, {0}: Other permission rules may also apply,{0}: Може да важат и други правила за дозвола, -{0} Page Views,{0} Прегледи на страницата, +{0} Web page views,{0} Прегледи на страницата, Expand,Прошири, Collapse,Колапс, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Неважечки токен на носител, наведете важечки токен за пристап со префиксот „Носител“.", diff --git a/frappe/translations/ml.csv b/frappe/translations/ml.csv index ef00ab36aa..37094d00a8 100644 --- a/frappe/translations/ml.csv +++ b/frappe/translations/ml.csv @@ -4137,7 +4137,7 @@ No changes in document,പ്രമാണത്തിൽ മാറ്റങ് by Role,റോൾ, Document is only editable by users with role,റോൾ ഉള്ള ഉപയോക്താക്കൾക്ക് മാത്രമേ പ്രമാണം എഡിറ്റുചെയ്യാനാകൂ, {0}: Other permission rules may also apply,{0}: മറ്റ് അനുമതി നിയമങ്ങളും ബാധകമായേക്കാം, -{0} Page Views,{0} പേജ് കാഴ്‌ചകൾ, +{0} Web page views,{0} പേജ് കാഴ്‌ചകൾ, Expand,വികസിപ്പിക്കുക, Collapse,ചുരുക്കുക, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","അസാധുവായ ബിയറർ ടോക്കൺ, 'ബിയറർ' പ്രിഫിക്‌സിനൊപ്പം സാധുവായ ആക്‌സസ്സ് ടോക്കൺ നൽകുക.", diff --git a/frappe/translations/mr.csv b/frappe/translations/mr.csv index 948c10f6c3..7e6f204c7a 100644 --- a/frappe/translations/mr.csv +++ b/frappe/translations/mr.csv @@ -4137,7 +4137,7 @@ No changes in document,दस्तऐवजात कोणतेही बद by Role,भूमिकेद्वारे, Document is only editable by users with role,दस्तऐवज केवळ भूमिका असलेल्या वापरकर्त्यांद्वारेच संपादन करण्यायोग्य आहे, {0}: Other permission rules may also apply,{0}: इतर परवानगी नियम देखील लागू होऊ शकतात, -{0} Page Views,Views 0} पृष्ठ दृश्ये, +{0} Web page views,Views 0} पृष्ठ दृश्ये, Expand,विस्तृत करा, Collapse,कोसळणे, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","अवैध बीयरर टोकन, कृपया उपसर्ग 'बीयरर' सह वैध toक्सेस टोकन प्रदान करा.", diff --git a/frappe/translations/ms.csv b/frappe/translations/ms.csv index ccb18a7a6d..41d89d10d1 100644 --- a/frappe/translations/ms.csv +++ b/frappe/translations/ms.csv @@ -4137,7 +4137,7 @@ No changes in document,Tiada perubahan dalam dokumen, by Role,oleh Peranan, Document is only editable by users with role,Dokumen hanya boleh diedit oleh pengguna dengan peranan, {0}: Other permission rules may also apply,{0}: Peraturan kebenaran lain juga mungkin berlaku, -{0} Page Views,{0} Paparan Halaman, +{0} Web page views,{0} Paparan Halaman, Expand,Kembangkan, Collapse,Runtuhkan, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Token Bearer tidak sah, sila berikan token akses yang sah dengan awalan 'Bearer'.", diff --git a/frappe/translations/my.csv b/frappe/translations/my.csv index 60e17753df..c94cab90c6 100644 --- a/frappe/translations/my.csv +++ b/frappe/translations/my.csv @@ -4137,7 +4137,7 @@ No changes in document,စာရွက်စာတမ်းတွင်အပြ by Role,အခန်းက္ပ, Document is only editable by users with role,Document ကိုအခန်းကဏ္ with ရှိတဲ့အသုံးပြုသူများမှသာတည်းဖြတ်နိုင်သည်, {0}: Other permission rules may also apply,{0} - အခြားခွင့်ပြုချက်စည်းမျဉ်းများကိုလည်းကျင့်သုံးနိုင်သည်, -{0} Page Views,{0} စာမျက်နှာကြည့်ရှုခြင်း, +{0} Web page views,{0} စာမျက်နှာကြည့်ရှုခြင်း, Expand,ချဲ့, Collapse,ပြိုကျသည်, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",မမှန်ကန်သော Bearer အမှတ်အသား၊ မှန်ကန်သောဝင်ရောက်ခွင့်သင်္ကေတကိုရှေ့ဆက် 'Bearer' ဖြင့်ပေးပါ။, diff --git a/frappe/translations/nl.csv b/frappe/translations/nl.csv index 37ac72e7cb..52bc971483 100644 --- a/frappe/translations/nl.csv +++ b/frappe/translations/nl.csv @@ -4137,7 +4137,7 @@ No changes in document,Geen wijzigingen in document, by Role,op rol, Document is only editable by users with role,Document kan alleen worden bewerkt door gebruikers met een rol, {0}: Other permission rules may also apply,{0}: er kunnen ook andere toestemmingsregels van toepassing zijn, -{0} Page Views,{0} paginaweergaven, +{0} Web page views,{0} paginaweergaven, Expand,Uitbreiden, Collapse,Ineenstorting, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Ongeldig Bearer-token, geef een geldig toegangstoken op met het voorvoegsel 'Bearer'.", diff --git a/frappe/translations/no.csv b/frappe/translations/no.csv index 4b0dbaeced..62310333d7 100644 --- a/frappe/translations/no.csv +++ b/frappe/translations/no.csv @@ -4137,7 +4137,7 @@ No changes in document,Ingen endringer i dokumentet, by Role,av rolle, Document is only editable by users with role,Dokumentet kan bare redigeres av brukere med rolle, {0}: Other permission rules may also apply,{0}: Andre tillatelsesregler kan også gjelde, -{0} Page Views,{0} Sidevisninger, +{0} Web page views,{0} Sidevisninger, Expand,Utvide, Collapse,Kollapse, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Ugyldig bærertoken, oppgi et gyldig tilgangstoken med prefikset 'bærer'.", diff --git a/frappe/translations/pl.csv b/frappe/translations/pl.csv index 0f073c7913..6e4bb46e6b 100644 --- a/frappe/translations/pl.csv +++ b/frappe/translations/pl.csv @@ -4137,7 +4137,7 @@ No changes in document,Brak zmian w dokumencie, by Role,według roli, Document is only editable by users with role,Dokument jest edytowalny tylko przez użytkowników posiadających rolę, {0}: Other permission rules may also apply,{0}: mogą obowiązywać również inne reguły dotyczące uprawnień, -{0} Page Views,{0} Wyświetlenia strony, +{0} Web page views,{0} Wyświetlenia strony, Expand,Rozszerzać, Collapse,Zawalić się, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",Nieprawidłowy token okaziciela. Podaj prawidłowy token dostępu z przedrostkiem „Okaziciel”., diff --git a/frappe/translations/ps.csv b/frappe/translations/ps.csv index a4e2086ac9..cc38ecd90e 100644 --- a/frappe/translations/ps.csv +++ b/frappe/translations/ps.csv @@ -4137,7 +4137,7 @@ No changes in document,په سند کې هیڅ بدلون نشته, by Role,د, Document is only editable by users with role,سند یوازې د کاروونکو لخوا د رول سره سمون وړ دی, {0}: Other permission rules may also apply,permission 0}: د اجازه لیک نور مقررات هم پلي کیدی شي, -{0} Page Views,د پا Viewsې لید, +{0} Web page views,د پا Viewsې لید, Expand,پراخول, Collapse,ماتول, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",د بیریر ناباوره نښه ده ، مهرباني وکړئ د مخکینۍ 'بیرونکي' سره د لاسرسي معتبر نښه چمتو کړئ., diff --git a/frappe/translations/pt-BR.csv b/frappe/translations/pt-BR.csv index 517cdb75ef..9f184458b7 100644 --- a/frappe/translations/pt-BR.csv +++ b/frappe/translations/pt-BR.csv @@ -4137,7 +4137,7 @@ No changes in document,Sem alterações no documento, by Role,por papel, Document is only editable by users with role,O documento só pode ser editado por usuários com função, {0}: Other permission rules may also apply,{0}: Outras regras de permissão também podem ser aplicadas, -{0} Page Views,{0} page views, +{0} Web page views,{0} page views, Expand,Expandir, Collapse,Colapso, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Token de portador inválido, forneça um token de acesso válido com o prefixo 'Portador'.", diff --git a/frappe/translations/pt.csv b/frappe/translations/pt.csv index 6c99ce5090..199b76924d 100644 --- a/frappe/translations/pt.csv +++ b/frappe/translations/pt.csv @@ -4137,7 +4137,7 @@ No changes in document,Sem alterações no documento, by Role,por papel, Document is only editable by users with role,O documento só pode ser editado por usuários com função, {0}: Other permission rules may also apply,{0}: Outras regras de permissão também podem ser aplicadas, -{0} Page Views,{0} page views, +{0} Web page views,{0} page views, Expand,Expandir, Collapse,Colapso, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Token de portador inválido, forneça um token de acesso válido com o prefixo 'Portador'.", diff --git a/frappe/translations/ro.csv b/frappe/translations/ro.csv index a3fe9f9f26..00270d4cf1 100644 --- a/frappe/translations/ro.csv +++ b/frappe/translations/ro.csv @@ -4137,7 +4137,7 @@ No changes in document,Nu există modificări în document, by Role,de rol, Document is only editable by users with role,Documentul poate fi modificat numai de utilizatorii cu rol, {0}: Other permission rules may also apply,{0}: se pot aplica și alte reguli de permisiune, -{0} Page Views,{0} Vizualizări de pagină, +{0} Web page views,{0} Vizualizări de pagină, Expand,Extinde, Collapse,Colaps, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Jeton purtător nevalid, vă rugăm să furnizați un jeton de acces valid cu prefixul „Purtător”.", diff --git a/frappe/translations/ru.csv b/frappe/translations/ru.csv index f83bf411ff..93bbe4d916 100644 --- a/frappe/translations/ru.csv +++ b/frappe/translations/ru.csv @@ -4103,7 +4103,7 @@ No changes in document,Без изменений в документе, by Role,по роли, Document is only editable by users with role,Документ могут редактировать только пользователи с ролью, {0}: Other permission rules may also apply,{0}: могут применяться и другие правила разрешений., -{0} Page Views,{0} Просмотры страниц, +{0} Web page views,{0} Просмотры страниц, Expand,Развернуть, Collapse,Свернуть, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Недействительный токен на предъявителя, укажите действительный токен доступа с префиксом «На предъявителя».", @@ -4675,12 +4675,12 @@ My Settings,Мои настройки, Toggle Full Width,Переключить ширину, Toggle Theme,Переключить тему, Modules,Модули, -You created this {0},Вы создали это {0}, -{0} created this {1},{0} создал(а) это {1}, -You edited this {0},Вы отредактировали это {0}, -{0} edited this {1},{0} отредактировал(а) это {1}, -You viewed this {0},Вы просмотрели это {0}, -{0} viewed this {1},{0} просмотрел(а) это {1}, +You created this,Вы создали это, +{0} created this,{0} создал(а) это, +You last edited this,Вы последний раз редактировали это, +{0} last edited this,{0} последний раз редактировалось это, +You viewed this,Вы просмотрели это, +{0} viewed this,{0} просмотрел(а) это, Apply Filters,Применить фильтры, + Add a Filter,+ Добавить фильтр, Is Template,Является шаблоном, diff --git a/frappe/translations/rw.csv b/frappe/translations/rw.csv index 335b2dc890..0a545425aa 100644 --- a/frappe/translations/rw.csv +++ b/frappe/translations/rw.csv @@ -4137,7 +4137,7 @@ No changes in document,Nta gihinduka mu nyandiko, by Role,Uruhare, Document is only editable by users with role,Inyandiko ihindurwa gusa nabakoresha bafite uruhare, {0}: Other permission rules may also apply,{0}: Andi mategeko yuruhushya arashobora no gukurikizwa, -{0} Page Views,{0} Urupapuro Reba, +{0} Web page views,{0} Urupapuro Reba, Expand,Kwagura, Collapse,Gusenyuka, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Ikimenyetso cyemewe cyo gutwara, nyamuneka tanga ikimenyetso cyemewe hamwe na prefix 'Bearer'.", diff --git a/frappe/translations/si.csv b/frappe/translations/si.csv index 27e79fa380..ffa75c52e8 100644 --- a/frappe/translations/si.csv +++ b/frappe/translations/si.csv @@ -4137,7 +4137,7 @@ No changes in document,ලේඛනයේ කිසිදු වෙනසක් by Role,භූමිකාව, Document is only editable by users with role,ලේඛනය සංස්කරණය කළ හැක්කේ භූමිකාව ඇති පරිශීලකයින්ට පමණි, {0}: Other permission rules may also apply,{0}: වෙනත් අවසර නීති ද අදාළ විය හැකිය, -{0} Page Views,Views 0} පිටු දසුන්, +{0} Web page views,Views 0} පිටු දසුන්, Expand,පුළුල් කරන්න, Collapse,බිඳ වැටීම, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","වලංගු නොවන දරන්නා ටෝකනය, කරුණාකර 'දරන්නා' උපසර්ගය සමඟ වලංගු ප්‍රවේශ ටෝකනයක් ලබා දෙන්න.", diff --git a/frappe/translations/sk.csv b/frappe/translations/sk.csv index 1bea4310a6..f7179f7e1b 100644 --- a/frappe/translations/sk.csv +++ b/frappe/translations/sk.csv @@ -4137,7 +4137,7 @@ No changes in document,Žiadne zmeny v dokumente, by Role,podľa roly, Document is only editable by users with role,Dokument môžu upravovať iba používatelia s rolou, {0}: Other permission rules may also apply,{0}: Môžu sa uplatňovať aj ďalšie pravidlá povolení, -{0} Page Views,{0} Zobrazenia stránky, +{0} Web page views,{0} Zobrazenia stránky, Expand,Rozbaliť, Collapse,Kolaps, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Neplatný token na doručiteľa, zadajte platný prístupový token s predponou „na doručiteľa“.", diff --git a/frappe/translations/sl.csv b/frappe/translations/sl.csv index ad330f935b..469b9f8696 100644 --- a/frappe/translations/sl.csv +++ b/frappe/translations/sl.csv @@ -4137,7 +4137,7 @@ No changes in document,V dokumentu ni sprememb, by Role,avtor Vloga, Document is only editable by users with role,Dokument lahko urejajo samo uporabniki z vlogo, {0}: Other permission rules may also apply,{0}: Morda bodo veljala tudi druga pravila o dovoljenjih, -{0} Page Views,{0} Ogledi strani, +{0} Web page views,{0} Ogledi strani, Expand,Razširi, Collapse,Strni, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Neveljaven žeton prinašalca, navedite veljaven žeton za dostop s predpono 'prinosnik'.", diff --git a/frappe/translations/sq.csv b/frappe/translations/sq.csv index d5e49c2c7c..f3bcda35a8 100644 --- a/frappe/translations/sq.csv +++ b/frappe/translations/sq.csv @@ -4137,7 +4137,7 @@ No changes in document,Asnjë ndryshim në dokument, by Role,nga Roli, Document is only editable by users with role,Dokumenti është i redaktueshëm vetëm nga përdoruesit me rol, {0}: Other permission rules may also apply,{0}: Mund të zbatohen edhe rregulla të tjera të lejes, -{0} Page Views,{0} Shikimet e faqeve, +{0} Web page views,{0} Shikimet e faqeve, Expand,Zgjero, Collapse,Shembje, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Shenjë e pavlefshme e Bartësit, ju lutemi siguroni një shenjë të vlefshme të hyrjes me parashtesën "Bartës".", diff --git a/frappe/translations/sr-BA.csv b/frappe/translations/sr-BA.csv index 4bc61c828f..4a6008bf01 100644 --- a/frappe/translations/sr-BA.csv +++ b/frappe/translations/sr-BA.csv @@ -60,7 +60,7 @@ Dashboard,Nadzorna ploča, Last Name,Prezime, Sorry! You are not permitted to view this page.,Niste autorizovani za prikaz ove stranice. Success Message,Poruka o uspjehu, -{0} created this {1},{1} {0} je kreirao/la ovo. +{0} created this,{0} je kreirao/la ovo. Online,Na mreži, Folder {0} does not exist,Folder {0} ne postoji, Subject,Naslov, @@ -289,7 +289,7 @@ Closed,Zatvoreno, User '{0}' already has the role '{1}',Korisnik '{0}' već sarži rolu '{1}' Create a new {0},Kreirajte {0} Loading...,Učitavanje ... -{0} edited this {1},{1} {0} je izmijenio/la ovo, +{0} last edited this,{0} je izmijenio/la ovo, Error Log,Log grešaka, Description,Opis, Newsletter,Newsletter, diff --git a/frappe/translations/sr-SP.csv b/frappe/translations/sr-SP.csv index 4bc61c828f..4a6008bf01 100644 --- a/frappe/translations/sr-SP.csv +++ b/frappe/translations/sr-SP.csv @@ -60,7 +60,7 @@ Dashboard,Nadzorna ploča, Last Name,Prezime, Sorry! You are not permitted to view this page.,Niste autorizovani za prikaz ove stranice. Success Message,Poruka o uspjehu, -{0} created this {1},{1} {0} je kreirao/la ovo. +{0} created this,{0} je kreirao/la ovo. Online,Na mreži, Folder {0} does not exist,Folder {0} ne postoji, Subject,Naslov, @@ -289,7 +289,7 @@ Closed,Zatvoreno, User '{0}' already has the role '{1}',Korisnik '{0}' već sarži rolu '{1}' Create a new {0},Kreirajte {0} Loading...,Učitavanje ... -{0} edited this {1},{1} {0} je izmijenio/la ovo, +{0} last edited this,{0} je izmijenio/la ovo, Error Log,Log grešaka, Description,Opis, Newsletter,Newsletter, diff --git a/frappe/translations/sr.csv b/frappe/translations/sr.csv index 14c4ee9001..dc6d1c0dda 100644 --- a/frappe/translations/sr.csv +++ b/frappe/translations/sr.csv @@ -4137,7 +4137,7 @@ No changes in document,Нема промена у документу, by Role,по улози, Document is only editable by users with role,Документ могу уређивати само корисници који имају улогу, {0}: Other permission rules may also apply,{0}: Такође могу да важе друга правила за дозволе, -{0} Page Views,{0} Прикази странице, +{0} Web page views,{0} Прикази странице, Expand,Проширити, Collapse,Колапс, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Неважећи токен носиоца, наведите важећи приступни токен са префиксом „носилац“.", diff --git a/frappe/translations/sv.csv b/frappe/translations/sv.csv index c92e29f567..15a18a80ec 100644 --- a/frappe/translations/sv.csv +++ b/frappe/translations/sv.csv @@ -4137,7 +4137,7 @@ No changes in document,Inga dokumentändringar, by Role,av roll, Document is only editable by users with role,Dokumentet kan endast redigeras av användare med roll, {0}: Other permission rules may also apply,{0}: Andra behörighetsregler kan också gälla, -{0} Page Views,{0} Sidvisningar, +{0} Web page views,{0} Sidvisningar, Expand,Bygga ut, Collapse,Kollaps, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Ogiltig bärartoken, ange en giltig åtkomsttoken med prefixet "bärare".", diff --git a/frappe/translations/sw.csv b/frappe/translations/sw.csv index 1ee3ecda23..262967fc79 100644 --- a/frappe/translations/sw.csv +++ b/frappe/translations/sw.csv @@ -4137,7 +4137,7 @@ No changes in document,Hakuna mabadiliko kwenye hati, by Role,na Wajibu, Document is only editable by users with role,Hati inaweza kuhaririwa tu na watumiaji walio na jukumu, {0}: Other permission rules may also apply,{0}: Sheria zingine za ruhusa zinaweza pia kutumika, -{0} Page Views,Mtazamo wa Ukurasa wa {0}, +{0} Web page views,Mtazamo wa Ukurasa wa {0}, Expand,Panua, Collapse,Kuanguka, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Ishara ya Bearer isiyo sahihi, tafadhali toa tokeni halali ya ufikiaji na kiambishi awali 'mbebaji'.", diff --git a/frappe/translations/ta.csv b/frappe/translations/ta.csv index 07c3f8a8f7..808ef02d4b 100644 --- a/frappe/translations/ta.csv +++ b/frappe/translations/ta.csv @@ -4137,7 +4137,7 @@ No changes in document,ஆவணத்தில் எந்த மாற்ற by Role,வழங்கியவர், Document is only editable by users with role,பாத்திரம் உள்ள பயனர்களால் மட்டுமே ஆவணத்தைத் திருத்த முடியும், {0}: Other permission rules may also apply,{0}: பிற அனுமதி விதிகளும் பொருந்தக்கூடும், -{0} Page Views,{0} பக்க காட்சிகள், +{0} Web page views,{0} பக்க காட்சிகள், Expand,விரிவாக்கு, Collapse,சுருக்கு, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","தவறான தாங்கி டோக்கன், தயவுசெய்து 'தாங்கி' முன்னொட்டுடன் சரியான அணுகல் டோக்கனை வழங்கவும்.", diff --git a/frappe/translations/te.csv b/frappe/translations/te.csv index 4e7d2f7b2a..1135305a6d 100644 --- a/frappe/translations/te.csv +++ b/frappe/translations/te.csv @@ -4137,7 +4137,7 @@ No changes in document,పత్రంలో మార్పులు లేవ by Role,పాత్ర ద్వారా, Document is only editable by users with role,పాత్ర ఉన్న వినియోగదారులకు మాత్రమే పత్రం సవరించబడుతుంది, {0}: Other permission rules may also apply,{0}: ఇతర అనుమతి నియమాలు కూడా వర్తించవచ్చు, -{0} Page Views,{0} పేజీ వీక్షణలు, +{0} Web page views,{0} పేజీ వీక్షణలు, Expand,విస్తరించండి, Collapse,కుదించు, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","చెల్లని బేరర్ టోకెన్, దయచేసి 'బేరర్' ఉపసర్గతో చెల్లుబాటు అయ్యే యాక్సెస్ టోకెన్‌ను అందించండి.", diff --git a/frappe/translations/th.csv b/frappe/translations/th.csv index 213b879c2d..c73e7af04f 100644 --- a/frappe/translations/th.csv +++ b/frappe/translations/th.csv @@ -4137,7 +4137,7 @@ No changes in document,ไม่มีการเปลี่ยนแปลง by Role,โดย Role, Document is only editable by users with role,เอกสารสามารถแก้ไขได้โดยผู้ใช้ที่มีบทบาทเท่านั้น, {0}: Other permission rules may also apply,{0}: อาจใช้กฎการอนุญาตอื่น ๆ ด้วย, -{0} Page Views,{0} การดูหน้า, +{0} Web page views,{0} การดูหน้า, Expand,ขยาย, Collapse,ยุบ, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",โทเค็นผู้ถือไม่ถูกต้องโปรดระบุโทเค็นการเข้าถึงที่ถูกต้องโดยมีคำนำหน้า "ผู้ถือ", diff --git a/frappe/translations/tr.csv b/frappe/translations/tr.csv index d81a953021..1fae541e8b 100644 --- a/frappe/translations/tr.csv +++ b/frappe/translations/tr.csv @@ -4177,7 +4177,7 @@ No changes in document,Belgede değişiklik yok, by Role,Rol ile, Document is only editable by users with role,Belge yalnızca rolü olan kullanıcılar tarafından düzenlenebilir, {0}: Other permission rules may also apply,{0}: Diğer izin kuralları da geçerli olabilir, -{0} Page Views,{0} Sayfa Görüntülemeleri, +{0} Web page views,{0} Sayfa Görüntülemeleri, Expand,Genişlet, Collapse,Çöküş, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Geçersiz Taşıyıcı belirteci, lütfen 'Taşıyıcı' ön ekiyle geçerli bir erişim belirteci sağlayın.", diff --git a/frappe/translations/uk.csv b/frappe/translations/uk.csv index 2cafc235c8..0fe7268ee1 100644 --- a/frappe/translations/uk.csv +++ b/frappe/translations/uk.csv @@ -4137,7 +4137,7 @@ No changes in document,Без змін у документі, by Role,за роллю, Document is only editable by users with role,Документ можуть редагувати лише користувачі з роллю, {0}: Other permission rules may also apply,{0}: Можуть також застосовуватися інші правила дозволу, -{0} Page Views,{0} Перегляди сторінок, +{0} Web page views,{0} Перегляди сторінок, Expand,Розгорнути, Collapse,Згорнути, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Недійсний маркер носія, надайте дійсний маркер доступу з префіксом "Носій".", diff --git a/frappe/translations/ur.csv b/frappe/translations/ur.csv index c1b5f91885..77cdb1bf13 100644 --- a/frappe/translations/ur.csv +++ b/frappe/translations/ur.csv @@ -4137,7 +4137,7 @@ No changes in document,دستاویز میں کوئی تبدیلی نہیں, by Role,بذریعہ کردار, Document is only editable by users with role,دستاویز صرف کردار والے صارفین کے ذریعہ قابل تدوین ہے, {0}: Other permission rules may also apply,{0}: اجازت کے دوسرے قواعد بھی لاگو ہوسکتے ہیں, -{0} Page Views,Views 0} صفحہ ملاحظات, +{0} Web page views,Views 0} صفحہ ملاحظات, Expand,پھیلائیں, Collapse,گرنے, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",غلط بیریر ٹوکن ، براہ کرم 'بیئرر' کے سابقے کے ساتھ ایک درست رسائی ٹوکن فراہم کریں۔, diff --git a/frappe/translations/uz.csv b/frappe/translations/uz.csv index 2dcd3ce6b3..3910f24b88 100644 --- a/frappe/translations/uz.csv +++ b/frappe/translations/uz.csv @@ -4137,7 +4137,7 @@ No changes in document,Hujjatda hech qanday o'zgarish yo'q, by Role,Role tomonidan, Document is only editable by users with role,Hujjatni faqat roli bo'lgan foydalanuvchilar tahrirlashlari mumkin, {0}: Other permission rules may also apply,{0}: Boshqa ruxsat qoidalari ham amal qilishi mumkin, -{0} Page Views,{0} Sahifalarni ko'rish, +{0} Web page views,{0} Sahifalarni ko'rish, Expand,Kengaytiring, Collapse,Yiqilish, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Yaroqsiz token belgisi, iltimos, "Bearer" prefiksi bilan yaroqli kirish belgisini taqdim eting.", diff --git a/frappe/translations/vi.csv b/frappe/translations/vi.csv index b18f28acc9..2e88fe852c 100644 --- a/frappe/translations/vi.csv +++ b/frappe/translations/vi.csv @@ -4137,7 +4137,7 @@ No changes in document,Không có thay đổi trong tài liệu, by Role,theo vai trò, Document is only editable by users with role,Chỉ người dùng có vai trò mới có thể chỉnh sửa tài liệu, {0}: Other permission rules may also apply,{0}: Các quy tắc cấp phép khác cũng có thể áp dụng, -{0} Page Views,{0} Lượt xem Trang, +{0} Web page views,{0} Lượt xem Trang, Expand,Mở rộng, Collapse,Sự sụp đổ, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.","Mã thông báo Bearer không hợp lệ, vui lòng cung cấp mã truy cập hợp lệ có tiền tố 'Bearer'.", diff --git a/frappe/translations/zh-TW.csv b/frappe/translations/zh-TW.csv index ca1119a36b..42e84d3d59 100644 --- a/frappe/translations/zh-TW.csv +++ b/frappe/translations/zh-TW.csv @@ -1681,7 +1681,7 @@ Report End Time,報告結束時間 {0} comments,{0}評論 Label and Type,標籤和類型 forward,轉發 -{0} edited this {1},{0}編輯此{1} +{0} last edited this,{0}編輯此 New Folder,新建文件夾 Uses the Email Address mentioned in this Account as the Sender for all emails sent using this Account. ,使用這個帳戶提到發件人使用此帳戶發送的所有電子郵件的電子郵件地址。 Toggle Charts,切換圖表 @@ -1771,7 +1771,7 @@ Show Totals,顯示總計 Relapses,復發 Preferred Shipping Address,偏好的送貨地址 With Letter head,隨著信頭 -{0} created this {1},{0}新增此{1} +{0} created this,{0}新增此 "If this is checked, rows with valid data will be imported and invalid rows will be dumped into a new file for you to import later.",如果選中此選項,將導入包含有效數據的行,並將無效行轉儲到新文件中以供稍後導入。 Document is only editable by users of role,文件只有通過編輯角色的用戶 "The task {0}, that you assigned to {1}, has been closed by {2}.",任務{0},您分配給{1},已被關閉{2}。 diff --git a/frappe/translations/zh.csv b/frappe/translations/zh.csv index c6004a2f8c..f5cdfe0f7e 100644 --- a/frappe/translations/zh.csv +++ b/frappe/translations/zh.csv @@ -4137,7 +4137,7 @@ No changes in document,文件无变化, by Role,按角色, Document is only editable by users with role,只有具有角色的用户才能编辑文档, {0}: Other permission rules may also apply,{0}:其他许可规则也可能适用, -{0} Page Views,{0}浏览量, +{0} Web page views,{0}浏览量, Expand,扩大, Collapse,坍方, "Invalid Bearer token, please provide a valid access token with prefix 'Bearer'.",无效的承载令牌,请提供带有前缀“承载”的有效访问令牌。, From fa241580d91fcd93e5b77378df673ce5ef5658ef Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 26 Jul 2023 19:49:28 +0530 Subject: [PATCH 006/221] feat: Sidebar Attachments accessibility - Issue: With a large volume of attachments, the "Attach File" button is pushed to the bottom - "Attach File" stays at the top of the pile - Small explore files button added so that users can use the File View to navigate/filter through files - Expanded Explore Files button when attach file action is hidden - Added `file_type` to Files, this is useful for filtering and visibility - Added "Type" to File List View - Patch to set File Type in all files --- frappe/core/doctype/file/file.js | 3 +- frappe/core/doctype/file/file.json | 16 +++++++- frappe/core/doctype/file/file.py | 11 +++++ frappe/patches.txt | 1 + frappe/patches/v15_0/set_file_type.py | 18 +++++++++ .../js/frappe/form/sidebar/attachments.js | 35 +++++++++++++++- .../frappe/form/templates/form_sidebar.html | 40 ++++++++++++++----- .../public/js/frappe/views/file/file_view.js | 6 +++ frappe/public/scss/desk/sidebar.scss | 12 +++++- 9 files changed, 126 insertions(+), 16 deletions(-) create mode 100644 frappe/patches/v15_0/set_file_type.py diff --git a/frappe/core/doctype/file/file.js b/frappe/core/doctype/file/file.js index 159cf1ce39..f1443d09f5 100644 --- a/frappe/core/doctype/file/file.js +++ b/frappe/core/doctype/file/file.js @@ -24,8 +24,7 @@ frappe.ui.form.on("File", { preview_file: function (frm) { let $preview = ""; - let file_name = frm.doc.file_name.split("?")[0]; - let file_extension = file_name.split(".").pop()?.toLowerCase(); + let file_extension = frm.doc.file_type.toLowerCase(); if (frappe.utils.is_image_file(frm.doc.file_url)) { $preview = $(`
diff --git a/frappe/core/doctype/file/file.json b/frappe/core/doctype/file/file.json index 6c64bfe274..11f80183b7 100644 --- a/frappe/core/doctype/file/file.json +++ b/frappe/core/doctype/file/file.json @@ -8,6 +8,8 @@ "field_order": [ "file_name", "is_private", + "column_break_7jmm", + "file_type", "preview", "preview_html", "section_break_5", @@ -168,13 +170,25 @@ "fieldtype": "Check", "label": "Uploaded To Google Drive", "read_only": 1 + }, + { + "fieldname": "column_break_7jmm", + "fieldtype": "Column Break" + }, + { + "fieldname": "file_type", + "fieldtype": "Data", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "File Type", + "read_only": 1 } ], "force_re_route_to_default_view": 1, "icon": "fa fa-file", "idx": 1, "links": [], - "modified": "2023-05-02 15:42:14.274901", + "modified": "2023-07-26 14:03:49.456951", "modified_by": "Administrator", "module": "Core", "name": "File", diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index cc3c2c228e..1a5bd54f9b 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -44,6 +44,7 @@ class File(Document): content_hash: DF.Data | None file_name: DF.Data | None file_size: DF.Int + file_type: DF.Data | None file_url: DF.Code | None folder: DF.Link | None is_attachments_folder: DF.Check @@ -86,6 +87,7 @@ class File(Document): self.set_folder_name() self.set_file_name() self.validate_attachment_limit() + self.set_file_type() if self.is_folder: return @@ -330,6 +332,15 @@ class File(Document): elif not self.is_home_folder: self.folder = "Home" + def set_file_type(self): + if self.is_folder: + return + + file_name = self.file_name.split("?")[0] + file_extension = file_name.split(".")[-1].upper() if file_name.split(".")[-1] else None + if file_extension: + self.file_type = file_extension + def validate_file_on_disk(self): """Validates existence file""" full_path = self.get_full_path() diff --git a/frappe/patches.txt b/frappe/patches.txt index 054fe9b946..45f3a73432 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -227,3 +227,4 @@ execute:frappe.delete_doc_if_exists("Workspace", "Customization") execute:frappe.db.set_single_value("Document Naming Settings", "default_amend_naming", "Amend Counter") execute:frappe.delete_doc_if_exists("DocType", "Error Snapshot") frappe.patches.v15_0.move_event_cancelled_to_status +frappe.patches.v15_0.set_file_type diff --git a/frappe/patches/v15_0/set_file_type.py b/frappe/patches/v15_0/set_file_type.py new file mode 100644 index 0000000000..a46787f491 --- /dev/null +++ b/frappe/patches/v15_0/set_file_type.py @@ -0,0 +1,18 @@ +import frappe + + +def execute(): + """Set 'File Type' for all files based on file extension.""" + files = frappe.db.get_all( + "File", + fields=["name", "file_name", "is_folder"], + ) + + for file in files: + if file.get("is_folder"): + continue + + file_name = file.get("file_name").split("?")[0] + file_extension = file_name.split(".")[-1].upper() if file_name.split(".")[-1] else None + if file_extension: + frappe.db.set_value("File", file.get("name"), "file_type", file_extension) diff --git a/frappe/public/js/frappe/form/sidebar/attachments.js b/frappe/public/js/frappe/form/sidebar/attachments.js index b7763c397d..2c344140c4 100644 --- a/frappe/public/js/frappe/form/sidebar/attachments.js +++ b/frappe/public/js/frappe/form/sidebar/attachments.js @@ -11,7 +11,16 @@ frappe.ui.form.Attachments = class Attachments { this.parent.find(".add-attachment-btn").click(function () { me.new_attachment(); }); - this.add_attachment_wrapper = this.parent.find(".add-attachment-btn"); + + this.parent.find(".explore-btn").click(() => { + frappe.open_in_new_tab = true; + frappe.set_route("List", "File", { + attached_to_doctype: this.frm.doctype, + attached_to_name: this.frm.docname, + }); + }); + + this.add_attachment_wrapper = this.parent.find(".attachments-actions"); this.attachments_label = this.parent.find(".attachments-label"); } max_reached(raise_exception = false) { @@ -42,6 +51,7 @@ frappe.ui.form.Attachments = class Attachments { var max_reached = this.max_reached(); this.add_attachment_wrapper.toggle(!max_reached); + this.setup_expanded_explore_button(max_reached); // add attachment objects var attachments = this.get_attachments(); @@ -57,11 +67,29 @@ frappe.ui.form.Attachments = class Attachments { }); } else { this.attachments_label.removeClass("has-attachments"); + this.parent.find(".explore-btn").toggle(false); // hide explore icon button } } + + setup_expanded_explore_button(max_reached) { + if (!max_reached) { + this.parent.find(".explore-full-btn").addClass("hidden"); + return; + } + + this.parent.find(".explore-full-btn").removeClass("hidden"); + this.parent.find(".explore-full-btn").click(() => { + frappe.set_route("List", "File", { + attached_to_doctype: this.frm.doctype, + attached_to_name: this.frm.docname, + }); + }); + } + get_attachments() { return this.frm.get_docinfo().attachments || []; } + add_attachment(attachment) { var file_name = attachment.file_name; var file_url = this.get_file_url(attachment); @@ -101,8 +129,11 @@ frappe.ui.form.Attachments = class Attachments { $(`
  • `) .append(frappe.get_data_pill(file_label, fileid, remove_action, icon)) - .insertAfter(this.attachments_label.addClass("has-attachments")); + .insertAfter(this.add_attachment_wrapper); + + this.parent.find(".explore-btn").toggle(true); // show explore icon button if hidden } + get_file_url(attachment) { var file_url = attachment.file_url; if (!file_url) { diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index dcea2f4647..33ebb33cc4 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -54,17 +54,37 @@
  • + +
  • + + + +
  • + -
  • - -
  • +
    - {%- if not disable_signup -%} @@ -43,6 +43,7 @@ Comment" - frappe.form_dict.comment_by = "hacker" - - add_comment() - + add_comment_args.update(comment="Comment", comment_by="hacker") + add_comment(**add_comment_args) self.assertEqual( frappe.get_all( "Comment", @@ -106,27 +93,30 @@ class TestComment(FrappeTestCase): def test_guest_cannot_comment(self): test_blog = make_test_blog() with set_user("Guest"): - frappe.form_dict.comment = "Good comment with 10 chars" - frappe.form_dict.comment_email = "mail@example.org" - frappe.form_dict.comment_by = "Good Tester" - frappe.form_dict.reference_doctype = "Blog Post" - frappe.form_dict.reference_name = test_blog.name - frappe.form_dict.route = test_blog.route - frappe.local.request_ip = "127.0.0.1" - - self.assertEqual(add_comment(), None) + self.assertEqual( + add_comment( + comment="Good comment with 10 chars", + comment_email="mail@example.org", + comment_by="Good Tester", + reference_doctype="Blog Post", + reference_name=test_blog.name, + route=test_blog.route, + ), + None, + ) def test_user_not_logged_in(self): - some_system_user = frappe.db.get_value("User", {}) + some_system_user = frappe.db.get_value("User", {"name": ("not in", frappe.STANDARD_USERS)}) test_blog = make_test_blog() with set_user("Guest"): - frappe.form_dict.comment = "Good comment with 10 chars" - frappe.form_dict.comment_email = some_system_user - frappe.form_dict.comment_by = "Good Tester" - frappe.form_dict.reference_doctype = "Blog Post" - frappe.form_dict.reference_name = test_blog.name - frappe.form_dict.route = test_blog.route - frappe.local.request_ip = "127.0.0.1" - - self.assertRaises(frappe.ValidationError, add_comment) + self.assertRaises( + frappe.ValidationError, + add_comment, + comment="Good comment with 10 chars", + comment_email=some_system_user, + comment_by="Good Tester", + reference_doctype="Blog Post", + reference_name=test_blog.name, + route=test_blog.route, + ) diff --git a/frappe/tests/utils.py b/frappe/tests/utils.py index c6c53e6bf5..a98801c503 100644 --- a/frappe/tests/utils.py +++ b/frappe/tests/utils.py @@ -149,6 +149,9 @@ def _restore_thread_locals(flags): frappe.local.lang = "en" frappe.local.preload_assets = {"style": [], "script": []} + if hasattr(frappe.local, "request"): + delattr(frappe.local, "request") + @contextmanager def change_settings(doctype, settings_dict): diff --git a/frappe/website/doctype/blog_post/test_blog_post.py b/frappe/website/doctype/blog_post/test_blog_post.py index 3ea447d90c..f0a5fb0295 100644 --- a/frappe/website/doctype/blog_post/test_blog_post.py +++ b/frappe/website/doctype/blog_post/test_blog_post.py @@ -20,6 +20,10 @@ class TestBlogPost(FrappeTestCase): def setUp(self): reset_customization("Blog Post") + def tearDown(self): + if hasattr(frappe.local, "request"): + delattr(frappe.local, "request") + def test_generator_view(self): pages = frappe.get_all( "Blog Post", fields=["name", "route"], filters={"published": 1, "route": ("!=", "")}, limit=1 @@ -159,17 +163,10 @@ class TestBlogPost(FrappeTestCase): from frappe.templates.includes.likes.likes import like - frappe.form_dict.reference_doctype = "Blog Post" - frappe.form_dict.reference_name = test_blog.name - frappe.form_dict.like = True - frappe.local.request_ip = "127.0.0.1" - - liked = like() + liked = like("Blog Post", test_blog.name, True) self.assertEqual(liked, True) - frappe.form_dict.like = False - - disliked = like() + disliked = like("Blog Post", test_blog.name, False) self.assertEqual(disliked, False) frappe.db.delete("Comment", {"comment_type": "Like", "reference_doctype": "Blog Post"}) diff --git a/frappe/website/doctype/web_form/test_web_form.py b/frappe/website/doctype/web_form/test_web_form.py index f86aa21735..2da24bc776 100644 --- a/frappe/website/doctype/web_form/test_web_form.py +++ b/frappe/website/doctype/web_form/test_web_form.py @@ -14,15 +14,9 @@ test_dependencies = ["Web Form"] class TestWebForm(FrappeTestCase): def setUp(self): frappe.conf.disable_website_cache = True - frappe.local.path = None def tearDown(self): frappe.conf.disable_website_cache = False - frappe.local.path = None - frappe.local.request_ip = None - frappe.form_dict.web_form = None - frappe.form_dict.data = None - frappe.form_dict.docname = None def test_accept(self): frappe.set_user("Administrator") @@ -34,10 +28,6 @@ class TestWebForm(FrappeTestCase): "starts_on": "2014-09-09", } - frappe.form_dict.web_form = "manage-events" - frappe.form_dict.data = json.dumps(doc) - frappe.local.request_ip = "127.0.0.1" - accept(web_form="manage-events", data=json.dumps(doc)) self.event_name = frappe.db.get_value("Event", {"subject": "_Test Event Web Form"}) @@ -58,11 +48,7 @@ class TestWebForm(FrappeTestCase): frappe.db.get_value("Event", self.event_name, "description"), doc.get("description") ) - frappe.form_dict.web_form = "manage-events" - frappe.form_dict.docname = self.event_name - frappe.form_dict.data = json.dumps(doc) - - accept(web_form="manage-events", docname=self.event_name, data=json.dumps(doc)) + accept("manage-events", json.dumps(doc)) self.assertEqual( frappe.db.get_value("Event", self.event_name, "description"), doc.get("description") From 7aed89ae4d41252964f0febc53f0e3eb1185e305 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Sat, 5 Aug 2023 14:43:45 +0530 Subject: [PATCH 061/221] test: set request before verifying --- frappe/email/queue.py | 5 ----- frappe/tests/test_email.py | 8 +++++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/frappe/email/queue.py b/frappe/email/queue.py index cae5f76b3d..b481fd21cd 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -88,11 +88,6 @@ def get_unsubcribed_url( if unsubscribe_params: params.update(unsubscribe_params) - query_string = get_signed_params(params) - - # for test - frappe.local.flags.signed_query_string = query_string - return get_url(unsubscribe_method + "?" + get_signed_params(params)) diff --git a/frappe/tests/test_email.py b/frappe/tests/test_email.py index 4cde7f9ace..6c6b0a86cf 100644 --- a/frappe/tests/test_email.py +++ b/frappe/tests/test_email.py @@ -156,7 +156,7 @@ class TestEmail(FrappeTestCase): frappe.conf.use_ssl = False def test_expose(self): - + from frappe.utils import set_request from frappe.utils.verified_command import verify_request frappe.sendmail( @@ -199,9 +199,11 @@ class TestEmail(FrappeTestCase): if content: eol = "\r\n" - frappe.local.flags.signed_query_string = re.search( + query_string = re.search( r"(?<=/api/method/frappe.email.queue.unsubscribe\?).*(?=" + eol + ")", content.decode() ).group(0) + + set_request(method="GET", query_string=query_string) self.assertTrue(verify_request()) break @@ -320,6 +322,6 @@ class TestVerifiedRequests(FrappeTestCase): for params in test_cases: signed_url = get_signed_params(params) - set_request(method="GET", path="?" + signed_url) + set_request(method="GET", query_string=signed_url) self.assertTrue(verify_request()) frappe.local.request = None From 379b90550d9116b26b2a42b3ca54fb901f0e273a Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Sat, 5 Aug 2023 17:02:36 +0530 Subject: [PATCH 062/221] fix: remove redundant fns from recorder request --- .../recorder_request/recorder_request.py | 157 ++---------------- 1 file changed, 12 insertions(+), 145 deletions(-) diff --git a/frappe/core/doctype/recorder_request/recorder_request.py b/frappe/core/doctype/recorder_request/recorder_request.py index dff2e66d0f..6c96bb6faf 100644 --- a/frappe/core/doctype/recorder_request/recorder_request.py +++ b/frappe/core/doctype/recorder_request/recorder_request.py @@ -3,19 +3,10 @@ import json import re -from collections import Counter - -import sqlparse import frappe -from frappe import _ -from frappe.database.database import is_query_type from frappe.model.document import Document - -RECORDER_INTERCEPT_FLAG = "recorder-intercept" -RECORDER_REQUEST_SPARSE_HASH = "recorder-requests-sparse" -RECORDER_REQUEST_HASH = "recorder-requests" -TRACEBACK_PATH_PATTERN = re.compile(".*/apps/") +from frappe.recorder import get class RecorderRequest(Document): @@ -45,7 +36,8 @@ class RecorderRequest(Document): def load_from_db(self): request_data = get(self.name) - super(Document, self).__init__(serialize_request(request_data)) + request = serialize_request(request_data) + super(Document, self).__init__(request) def db_update(self): pass @@ -68,144 +60,19 @@ class RecorderRequest(Document): pass -def administrator_only(function): - def wrapper(*args, **kwargs): - if frappe.session.user != "Administrator": - frappe.throw(_("Only Administrator is allowed to use Recorder")) - return function(*args, **kwargs) - - return wrapper - - -def do_not_record(function): - def wrapper(*args, **kwargs): - if hasattr(frappe.local, "_recorder"): - del frappe.local._recorder - frappe.db.sql = frappe.db._sql - return function(*args, **kwargs) - - return wrapper - - -@administrator_only -def get(uuid=None, *args, **kwargs): - if uuid: - result = frappe.cache.hget(RECORDER_REQUEST_HASH, uuid) - else: - result = list(frappe.cache.hgetall(RECORDER_REQUEST_SPARSE_HASH).values()) - return result - - def serialize_request(request): - return frappe._dict( + request = frappe._dict(request) + if request.get("calls"): + for i in request.calls: + i["stack"] = frappe.as_json(i["stack"]) + i["explain_result"] = frappe.as_json(i["explain_result"]) + request.update( name=request.get("uuid"), - path=request.get("path"), - method=request.get("method"), - cmd=request.get("cmd"), number_of_queries=request.get("queries"), time_in_queries=request.get("time_queries"), - time=request.get("time"), - duration=request.get("duration"), - request_headers=json.dumps(request.get("headers"), indent=4), - form_dict=json.dumps(request.get("form_dict"), indent=2), + request_headers=frappe.as_json(request.get("headers"), indent=4), + form_dict=frappe.as_json(request.get("form_dict"), indent=4), sql_queries=request.get("calls"), ) - -@frappe.whitelist() -@do_not_record -@administrator_only -def start(*args, **kwargs): - frappe.cache.set_value(RECORDER_INTERCEPT_FLAG, 1, expires_in_sec=60 * 60) - - -@frappe.whitelist() -@do_not_record -@administrator_only -def stop(*args, **kwargs): - frappe.cache.delete_value(RECORDER_INTERCEPT_FLAG) - frappe.enqueue(post_process) - - -@frappe.whitelist() -@do_not_record -@administrator_only -def delete_requests(*args, **kwargs): - frappe.cache.delete_value(RECORDER_REQUEST_SPARSE_HASH) - frappe.cache.delete_value(RECORDER_REQUEST_HASH) - - -@frappe.whitelist() -@do_not_record -@administrator_only -def get_status(*args, **kwargs): - return bool(frappe.cache.get_value(RECORDER_INTERCEPT_FLAG)) - - -def post_process(): - """post process all recorded values. - - Any processing that can be done later should be done here to avoid overhead while - profiling. As of now following values are post-processed: - - `EXPLAIN` output of queries. - - SQLParse reformatting of queries - - Mark duplicates - """ - frappe.db.rollback() - frappe.db.begin(read_only=True) # Explicitly start read only transaction - - result = list(frappe.cache.hgetall(RECORDER_REQUEST_HASH).values()) - - for request in result: - for call in request["calls"]: - formatted_query = sqlparse.format(call["query"].strip(), keyword_case="upper", reindent=True) - call["query"] = formatted_query - - # Collect EXPLAIN for executed query - if is_query_type(formatted_query, ("select", "update", "delete")): - # Only SELECT/UPDATE/DELETE queries can be "EXPLAIN"ed - try: - call["explain_result"] = frappe.db.sql(f"EXPLAIN {formatted_query}", as_dict=True) - except Exception: - pass - mark_duplicates(request) - frappe.cache.hset(RECORDER_REQUEST_HASH, request["uuid"], request) - - -def mark_duplicates(request): - exact_duplicates = Counter([call["query"] for call in request["calls"]]) - - for sql_call in request["calls"]: - sql_call["normalized_query"] = normalize_query(sql_call["query"]) - - normalized_duplicates = Counter([call["normalized_query"] for call in request["calls"]]) - - for index, call in enumerate(request["calls"]): - call["index"] = index - call["exact_copies"] = exact_duplicates[call["query"]] - call["normalized_copies"] = normalized_duplicates[call["normalized_query"]] - - -def normalize_query(query: str) -> str: - """Attempt to normalize query by removing variables. - This gives a different view of similar duplicate queries. - - Example: - These two are distinct queries: - `select * from user where name = 'x'` - `select * from user where name = 'z'` - - But their "normalized" form would be same: - `select * from user where name = ?` - """ - - try: - q = sqlparse.parse(query)[0] - for token in q.flatten(): - if "Token.Literal" in str(token.ttype): - token.value = "?" - return str(q) - except Exception as e: - print("Failed to normalize query ", e) - - return query + return request From 6fc9cbcdcd445c65a7df76f88b07fabfbdbce9c6 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Sat, 5 Aug 2023 17:06:22 +0530 Subject: [PATCH 063/221] feat: add html fields for stack trace and sql explain --- .../recorder_query/recorder_query.json | 40 ++++++++++++++++++- .../doctype/recorder_query/recorder_query.py | 2 + .../recorder_request/recorder_request.json | 14 ++----- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/frappe/core/doctype/recorder_query/recorder_query.json b/frappe/core/doctype/recorder_query/recorder_query.json index 921d6028ef..7ef70e0ef3 100644 --- a/frappe/core/doctype/recorder_query/recorder_query.json +++ b/frappe/core/doctype/recorder_query/recorder_query.json @@ -10,7 +10,13 @@ "exact_copies", "column_break_qmju", "normalized_query", - "normalized_copies" + "normalized_copies", + "section_break_dygy", + "stack_html", + "stack", + "section_break_kvkb", + "sql_explain_html", + "explain_result" ], "fields": [ { @@ -48,13 +54,43 @@ { "fieldname": "column_break_qmju", "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_dygy", + "fieldtype": "Section Break" + }, + { + "fieldname": "stack", + "fieldtype": "Text", + "hidden": 1, + "print_hide": 1 + }, + { + "fieldname": "stack_html", + "fieldtype": "HTML", + "label": "Stack Trace" + }, + { + "fieldname": "section_break_kvkb", + "fieldtype": "Section Break" + }, + { + "fieldname": "explain_result", + "fieldtype": "Text", + "hidden": 1, + "print_hide": 1 + }, + { + "fieldname": "sql_explain_html", + "fieldtype": "HTML", + "label": "SQL Explain" } ], "index_web_pages_for_search": 1, "is_virtual": 1, "istable": 1, "links": [], - "modified": "2023-08-02 17:23:43.670793", + "modified": "2023-08-05 14:25:34.794204", "modified_by": "Administrator", "module": "Core", "name": "Recorder Query", diff --git a/frappe/core/doctype/recorder_query/recorder_query.py b/frappe/core/doctype/recorder_query/recorder_query.py index 6471353ea7..da07499f7b 100644 --- a/frappe/core/doctype/recorder_query/recorder_query.py +++ b/frappe/core/doctype/recorder_query/recorder_query.py @@ -16,12 +16,14 @@ class RecorderQuery(Document): duration: DF.Float exact_copies: DF.Int + explain_result: DF.Text | None normalized_copies: DF.Int normalized_query: DF.Data | None parent: DF.Data parentfield: DF.Data parenttype: DF.Data query: DF.Data + stack: DF.Text | None # end: auto-generated types pass diff --git a/frappe/core/doctype/recorder_request/recorder_request.json b/frappe/core/doctype/recorder_request/recorder_request.json index 9d46689bda..699bd7d1a5 100644 --- a/frappe/core/doctype/recorder_request/recorder_request.json +++ b/frappe/core/doctype/recorder_request/recorder_request.json @@ -18,7 +18,6 @@ "request_headers", "section_break_sgro", "form_dict", - "section_break_4umr", "sql_queries" ], "fields": [ @@ -79,20 +78,15 @@ "label": "Form Dict" }, { - "fieldname": "section_break_4umr", - "fieldtype": "Section Break" + "fieldname": "method", + "fieldtype": "Data", + "label": "Method" }, { "fieldname": "sql_queries", "fieldtype": "Table", "label": "SQL Queries", "options": "Recorder Query" - }, - { - "fieldname": "method", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Method" } ], "hide_toolbar": 1, @@ -100,7 +94,7 @@ "index_web_pages_for_search": 1, "is_virtual": 1, "links": [], - "modified": "2023-08-02 20:36:12.191767", + "modified": "2023-08-05 14:45:04.358260", "modified_by": "Administrator", "module": "Core", "name": "Recorder Request", From 81b5b72f00d3735453249b871cdb70e5656ba5ef Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Sat, 5 Aug 2023 17:36:16 +0530 Subject: [PATCH 064/221] feat: add js for rendering html fields --- .../recorder_request/recorder_request.js | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/recorder_request/recorder_request.js b/frappe/core/doctype/recorder_request/recorder_request.js index 59d813e2d7..a56d636b5a 100644 --- a/frappe/core/doctype/recorder_request/recorder_request.js +++ b/frappe/core/doctype/recorder_request/recorder_request.js @@ -1,6 +1,47 @@ // Copyright (c) 2023, Frappe Technologies and contributors // For license information, please see license.txt -// frappe.ui.form.on("Recorder Request", { +frappe.ui.form.on("Recorder Query", "form_render", function (frm, cdt, cdn) { + let d = locals[cdt][cdn]; + let stack = JSON.parse(d.stack); + render_html_field(stack, "stack_html", "Stack Trace"); -// }); + let explain_result = JSON.parse(d.explain_result); + render_html_field(explain_result, "sql_explain_html", "SQL Explain"); + + function render_html_field(parsed_json, fieldname, label) { + let html = + "
    "; + if (parsed_json.length == 0) { + html += ""; + } else { + html = create_html_table(parsed_json, html); + } + + let field_wrapper = + frm.fields_dict[d.parentfield].grid.grid_rows_by_docname[cdn].grid_form.fields_dict[ + fieldname + ].wrapper; + $(html).appendTo(field_wrapper); + } + + function create_html_table(table_content, html) { + html += + ""; + return html; + } +}); From 75861fa321b11688458d009024a07e516cbb1526 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Sat, 5 Aug 2023 17:40:48 +0530 Subject: [PATCH 065/221] fix: indicators and primary btn in listview --- .../recorder_request/recorder_request_list.js | 110 +++++++++++++----- 1 file changed, 79 insertions(+), 31 deletions(-) diff --git a/frappe/core/doctype/recorder_request/recorder_request_list.js b/frappe/core/doctype/recorder_request/recorder_request_list.js index 3007c3c5cb..665338cacd 100644 --- a/frappe/core/doctype/recorder_request/recorder_request_list.js +++ b/frappe/core/doctype/recorder_request/recorder_request_list.js @@ -5,43 +5,91 @@ frappe.listview_settings["Recorder Request"] = { listview.page.sidebar.remove(); if (!has_common(frappe.user_roles, ["Administrator", "System Manager"])) return; - frappe - .xcall("frappe.core.doctype.recorder_request.recorder_request.get_status") - .then((status) => { - if (status) { - listview.page.set_indicator(__("Active"), "green"); - } else { - listview.page.set_indicator(__("Inactive"), "red"); - } - }); - - listview.page.add_button(__("Start"), () => { - frappe.call({ - method: "frappe.core.doctype.recorder_request.recorder_request.start", - callback: function () { - listview.page.set_indicator(__("Active"), "green"); - listview.refresh(); - }, - }); - }); - - listview.page.add_button(__("Stop"), () => { - frappe.call({ - method: "frappe.core.doctype.recorder_request.recorder_request.stop", - callback: function () { - listview.page.set_indicator(__("Inactive"), "red"); - listview.refresh(); - }, - }); - }); - listview.page.add_button(__("Clear"), () => { frappe.call({ - method: "frappe.core.doctype.recorder_request.recorder_request.delete_requests", + method: "frappe.recorder.delete", callback: function () { listview.refresh(); }, }); }); + + listview.page.add_menu_item(__("Import"), () => { + new frappe.ui.FileUploader({ + folder: this.current_folder, + on_success: (file) => { + if (cur_list.data.length > 0) { + // don't replace existing capture + return; + } + frappe.call({ + method: "frappe.recorder.import_data", + args: { + file: file.file_url, + }, + callback: function () { + listview.refresh(); + }, + }); + }, + }); + }); + + listview.page.add_menu_item(__("Export"), () => { + frappe.call({ + method: "frappe.recorder.export_data", + callback: function (r) { + const data = r.message; + const filename = `${data[0]["uuid"]}..${data[data.length - 1]["uuid"]}.json`; + + const el = document.createElement("a"); + el.setAttribute( + "href", + "data:application/json," + encodeURIComponent(JSON.stringify(data)) + ); + el.setAttribute("download", filename); + el.click(); + }, + }); + }); + }, + + refresh(listview) { + this.update_primary_action(listview); + this.update_indicators(listview); + }, + + update_primary_action(listview) { + frappe.xcall("frappe.recorder.status").then((status) => { + if (status) { + listview.page.set_primary_action(__("Stop"), () => { + frappe.call({ + method: "frappe.recorder.stop", + callback: function () { + listview.refresh(); + }, + }); + }); + } else { + listview.page.set_primary_action(__("Start"), () => { + frappe.call({ + method: "frappe.recorder.start", + callback: function () { + listview.refresh(); + }, + }); + }); + } + }); + }, + + update_indicators(listview) { + frappe.xcall("frappe.recorder.status").then((status) => { + if (status) { + listview.page.set_indicator(__("Active"), "green"); + } else { + listview.page.set_indicator(__("Inactive"), "red"); + } + }); }, }; From 30f17f417b0508bee3ce6d39d95bcc9af11bbcd9 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Sat, 5 Aug 2023 17:44:00 +0530 Subject: [PATCH 066/221] fix: handle file uploader obj while importing --- frappe/recorder.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frappe/recorder.py b/frappe/recorder.py index 96ab502fec..850129a34a 100644 --- a/frappe/recorder.py +++ b/frappe/recorder.py @@ -274,3 +274,14 @@ def record_queries(func: Callable): return ret return wrapped + + +@frappe.whitelist() +@do_not_record +@administrator_only +def import_data(**args): + file_doc = frappe.get_doc("File", {"file_url": args.get("file")}) + file_content = json.loads(file_doc.get_content()) + for request in file_content: + frappe.cache.hset(RECORDER_REQUEST_SPARSE_HASH, request["uuid"], request) + frappe.cache.hset(RECORDER_REQUEST_HASH, request["uuid"], request) From fd2efdb0e1a5a4c9338f8bb21b3ee8d5986b3822 Mon Sep 17 00:00:00 2001 From: Michelle Alva <50285544+michellealva@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:15:55 +0530 Subject: [PATCH 067/221] chore: whitelisted typo (#21930) --- frappe/utils/safe_exec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/utils/safe_exec.py b/frappe/utils/safe_exec.py index c0bfd3cbbb..be105b329d 100644 --- a/frappe/utils/safe_exec.py +++ b/frappe/utils/safe_exec.py @@ -247,7 +247,7 @@ def safe_enqueue(function, **kwargs): Accepts frappe.enqueue params like job_name, queue, timeout, etc. in addition to params to be passed to function - :param function: whitelised function or API Method set in Server Script + :param function: whitelisted function or API Method set in Server Script """ return enqueue("frappe.utils.safe_exec.call_whitelisted_function", function=function, **kwargs) From 2b96324c311d140b0a5285e1cab98f2d1106f7cd Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Sat, 5 Aug 2023 17:02:55 +0000 Subject: [PATCH 068/221] fix: rate limit for all HTTP methods (#21929) --- frappe/core/doctype/user/user.py | 2 +- frappe/website/doctype/web_form/web_form.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index b1f8777777..3a4fa12e91 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1010,7 +1010,7 @@ def sign_up(email: str, full_name: str, redirect_to: str) -> tuple[int, str]: @frappe.whitelist(allow_guest=True) -@rate_limit(limit=get_password_reset_limit, seconds=24 * 60 * 60, methods=["POST"]) +@rate_limit(limit=get_password_reset_limit, seconds=24 * 60 * 60) def reset_password(user: str) -> str: if user == "Administrator": return "not allowed" diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index 619692cc1d..0a2be0c1b8 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -429,7 +429,7 @@ def get_web_form_module(doc): @frappe.whitelist(allow_guest=True) -@rate_limit(key="web_form", limit=5, seconds=60, methods=["POST"]) +@rate_limit(key="web_form", limit=5, seconds=60) def accept(web_form, data): """Save the web form""" data = frappe._dict(json.loads(data)) From 4fae798ad1798296531bb3d06c2bbfb5f6aa8096 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Sun, 6 Aug 2023 13:51:22 +0200 Subject: [PATCH 069/221] fix: check file permission before zipping (#21934) --- frappe/core/doctype/file/file.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index cc3c2c228e..d334eaad1e 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -734,6 +734,8 @@ class File(Document): continue if _file.is_folder: continue + if not has_permission(_file, "read"): + continue zf.writestr(_file.file_name, _file.get_content()) zf.close() return zip_file.getvalue() From 5fce1a57c0a55e68bebe67e6f766d11b9d25a111 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Sun, 6 Aug 2023 14:03:34 +0200 Subject: [PATCH 070/221] fix: validate fieldname in get_group_by_count (#21932) * fix: validate fieldname in get_group_by_count * test: call get_group_by_count with invalid field * test: is_default_field --- frappe/desk/listview.py | 4 ++++ frappe/model/__init__.py | 4 ++++ frappe/tests/test_listview.py | 9 +++++++++ frappe/tests/test_model_utils.py | 12 +++++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/frappe/desk/listview.py b/frappe/desk/listview.py index a1db82810e..cc32e4ab06 100644 --- a/frappe/desk/listview.py +++ b/frappe/desk/listview.py @@ -2,6 +2,7 @@ # License: MIT. See LICENSE import frappe +from frappe.model import is_default_field from frappe.query_builder import Order from frappe.query_builder.functions import Count from frappe.query_builder.terms import SubQuery @@ -59,6 +60,9 @@ def get_group_by_count(doctype: str, current_filters: str, field: str) -> list[d .run(as_dict=True) ) + if not frappe.get_meta(doctype).has_field(field) and not is_default_field(field): + raise ValueError("Field does not belong to doctype") + return frappe.get_list( doctype, filters=current_filters, diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index ff6ad36c42..32e46c83c2 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -225,3 +225,7 @@ def get_permitted_fields( return meta_fields + permitted_fields + optional_meta_fields return [] + + +def is_default_field(fieldname: str) -> bool: + return fieldname in default_fields diff --git a/frappe/tests/test_listview.py b/frappe/tests/test_listview.py index df2299875e..f5d0b857ba 100644 --- a/frappe/tests/test_listview.py +++ b/frappe/tests/test_listview.py @@ -71,6 +71,15 @@ class TestListView(FrappeTestCase): } self.assertEqual(data["Administrator"], 1) + def test_get_group_by_invalid_field(self): + self.assertRaises( + ValueError, + get_group_by_count, + "Note", + '[["Note Seen By","user","=","Administrator"]]', + "invalid_field", + ) + def test_list_view_comment_count(self): frappe.form_dict.doctype = "DocType" frappe.form_dict.limit = "1" diff --git a/frappe/tests/test_model_utils.py b/frappe/tests/test_model_utils.py index 25523012e9..61828ef500 100644 --- a/frappe/tests/test_model_utils.py +++ b/frappe/tests/test_model_utils.py @@ -2,7 +2,7 @@ from contextlib import contextmanager from random import choice import frappe -from frappe.model import core_doctypes_list, get_permitted_fields +from frappe.model import core_doctypes_list, get_permitted_fields, is_default_field from frappe.model.utils import get_fetch_values from frappe.tests.utils import FrappeTestCase @@ -66,6 +66,16 @@ class TestModelUtils(FrappeTestCase): get_permitted_fields("Installed Application", parenttype="Installed Applications"), [] ) + def test_is_default_field(self): + self.assertTrue(is_default_field("doctype")) + self.assertTrue(is_default_field("name")) + self.assertTrue(is_default_field("owner")) + + self.assertFalse(is_default_field({})) + self.assertFalse(is_default_field("qwerty1234")) + self.assertFalse(is_default_field(True)) + self.assertFalse(is_default_field(42)) + @contextmanager def set_user(user: str): From a2b2998684ae4e941210b51469e9f795ebae7e2f Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 6 Aug 2023 18:55:16 +0530 Subject: [PATCH 071/221] fix(DX): Wrap print format errors (#21944) [skip ci] --- frappe/exceptions.py | 4 ++++ frappe/utils/error.py | 2 +- frappe/utils/pdf.py | 26 +++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/frappe/exceptions.py b/frappe/exceptions.py index 8dbd778a7d..f4bcb661f1 100644 --- a/frappe/exceptions.py +++ b/frappe/exceptions.py @@ -252,6 +252,10 @@ class SessionBootFailed(ValidationError): http_status_code = 500 +class PrintFormatError(ValidationError): + pass + + class TooManyWritesError(Exception): pass diff --git a/frappe/utils/error.py b/frappe/utils/error.py index 47902176ea..a3d39bbe7d 100644 --- a/frappe/utils/error.py +++ b/frappe/utils/error.py @@ -157,5 +157,5 @@ def guess_exception_source(exception: str) -> str | None: app_name = matches.group("app_name") apps[app_name] += app_priority.get(app_name, 0) - if probably_source := apps.most_common(1): + if (probably_source := apps.most_common(1)) and probably_source[0][0] != "frappe": return f"{probably_source[0][0]} (app)" diff --git a/frappe/utils/pdf.py b/frappe/utils/pdf.py index 721b061257..6751364edc 100644 --- a/frappe/utils/pdf.py +++ b/frappe/utils/pdf.py @@ -1,5 +1,6 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE +import contextlib import io import os import re @@ -43,7 +44,30 @@ def pdf_header_html(soup, head, content, styles, html_id, css): def pdf_body_html(template, args, **kwargs): - return template.render(args, filters={"len": len}) + try: + return template.render(args, filters={"len": len}) + except Exception as e: + # Guess line number ? + frappe.throw( + _("Error in print format on line {0}: {1}").format( + _guess_template_error_line_number(template), e + ), + exc=frappe.PrintFormatError, + title=_("Print Format Error"), + ) + + +def _guess_template_error_line_number(template) -> int | None: + """Guess line on which exception occured from current traceback.""" + with contextlib.suppress(Exception): + import sys + import traceback + + _, _, tb = sys.exc_info() + + for frame in reversed(traceback.extract_tb(tb)): + if template.filename in frame.filename: + return frame.lineno def pdf_footer_html(soup, head, content, styles, html_id, css): From 27426f7ceb13c59779bb225438a0ce60fc296c10 Mon Sep 17 00:00:00 2001 From: Ritvik Sardana Date: Mon, 7 Aug 2023 00:34:08 +0530 Subject: [PATCH 072/221] chore: code cleanup --- frappe/www/update-password.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frappe/www/update-password.html b/frappe/www/update-password.html index 2510aa4bd4..e42a7804b3 100644 --- a/frappe/www/update-password.html +++ b/frappe/www/update-password.html @@ -23,9 +23,9 @@ - - + + @@ -46,7 +46,7 @@ frappe.ready(function() { // URL args const key = frappe.utils.get_url_arg('key'); const pasword_expired = frappe.utils.get_url_arg('password_expired'); - // inputs and button elements + // inputs, paragraphs and button elements const old_password = $('#old_password'); const new_password = $('#new_password'); const confirm_password = $('#confirm_password'); @@ -54,7 +54,7 @@ frappe.ready(function() { const password_strength_indicator = $('.password-strength-indicator'); const password_strength_message =$('.password-strength-message'); const password_mismatch_message = $('.password-mismatch-message'); - // Span text + // Info text const password_not_same_as_old_password = "{{ _('New password cannot be same as old password') }}"; const password_mismatch = "{{ _('Passwords do not match') }}"; const password_strength_message_success = "{{ _('Success! You are good to go 👍') }}"; @@ -80,6 +80,7 @@ frappe.ready(function() { key: key || "", old_password: old_password.val(), new_password: new_password.val(), + confirm_password: confirm_password.val(), logout_all_sessions: 1 } if (!args.old_password && !args.key) { @@ -105,12 +106,11 @@ frappe.ready(function() { return; } - if (args.new_password !== confirm_password.val()) { + if (args.new_password !== args.confirm_password) { password_mismatch_message.text(password_mismatch) .removeClass('hidden text-muted').addClass('text-danger'); password_strength_message.addClass('hidden'); - return false; - + return; } frappe.call({ From dbc61cc1373907c15f1fd0b693b8ee3b08f6e681 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 7 Aug 2023 10:17:04 +0530 Subject: [PATCH 073/221] fix: workflow help closes https://github.com/frappe/frappe/issues/21923 --- frappe/public/js/frappe/form/workflow.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/form/workflow.js b/frappe/public/js/frappe/form/workflow.js index e2a7d2091c..e3532fddc8 100644 --- a/frappe/public/js/frappe/form/workflow.js +++ b/frappe/public/js/frappe/form/workflow.js @@ -36,8 +36,9 @@ frappe.ui.form.States = class FormStates { ).join(", ") || __("None: End of Workflow").bold(); const document_editable_by = frappe.workflow - .get_document_state(me.frm.doctype, state) - .allow_edit.bold(); + .get_document_state_roles(me.frm.doctype, state) + .map((role) => role.bold()) + .join(", "); $(d.body) .html( From 3f971f37c178aff2ad0186d1022092733bcad25b Mon Sep 17 00:00:00 2001 From: RitvikSardana <65544983+RitvikSardana@users.noreply.github.com> Date: Mon, 7 Aug 2023 11:33:41 +0530 Subject: [PATCH 074/221] feat: Added Re-run in Console Button in Console Log Doctype (#21825) * feat: Added Reload in Console Button in Console Log Doctype * refactor: simpler doc mapping * fix: added type of script * fix: renamed button name * fix: new solution for Re-run in console * refactor: use set_route [skip ci] --------- Co-authored-by: Ritvik Sardana Co-authored-by: Ankush Menat --- frappe/desk/doctype/console_log/console_log.js | 9 +++++++-- frappe/desk/doctype/console_log/console_log.json | 12 ++++++++++-- frappe/desk/doctype/console_log/console_log.py | 1 + frappe/desk/doctype/system_console/system_console.js | 10 +++++++++- frappe/desk/doctype/system_console/system_console.py | 3 +-- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/frappe/desk/doctype/console_log/console_log.js b/frappe/desk/doctype/console_log/console_log.js index 9a980667ac..822fbb466e 100644 --- a/frappe/desk/doctype/console_log/console_log.js +++ b/frappe/desk/doctype/console_log/console_log.js @@ -2,6 +2,11 @@ // For license information, please see license.txt frappe.ui.form.on("Console Log", { - // refresh: function(frm) { - // } + refresh: function (frm) { + frm.add_custom_button(__("Re-Run in Console"), () => { + localStorage.setItem("system_console_code", frm.doc.script); + localStorage.setItem("system_console_type", frm.doc.type); + frappe.set_route("Form", "System Console"); + }); + }, }); diff --git a/frappe/desk/doctype/console_log/console_log.json b/frappe/desk/doctype/console_log/console_log.json index b8ccf8c9b5..7531d97991 100644 --- a/frappe/desk/doctype/console_log/console_log.json +++ b/frappe/desk/doctype/console_log/console_log.json @@ -6,7 +6,8 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "script" + "script", + "type" ], "fields": [ { @@ -15,11 +16,18 @@ "in_list_view": 1, "label": "Script", "read_only": 1 + }, + { + "fieldname": "type", + "fieldtype": "Data", + "hidden": 1, + "label": "Type", + "read_only": 1 } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-07-05 22:16:02.823955", + "modified": "2023-07-27 22:52:37.239039", "modified_by": "Administrator", "module": "Desk", "name": "Console Log", diff --git a/frappe/desk/doctype/console_log/console_log.py b/frappe/desk/doctype/console_log/console_log.py index 9e243ee19a..bed829c5b8 100644 --- a/frappe/desk/doctype/console_log/console_log.py +++ b/frappe/desk/doctype/console_log/console_log.py @@ -15,5 +15,6 @@ class ConsoleLog(Document): from frappe.types import DF script: DF.Code | None + type: DF.Data | None # end: auto-generated types pass diff --git a/frappe/desk/doctype/system_console/system_console.js b/frappe/desk/doctype/system_console/system_console.js index dc73f33b67..bd993824ce 100644 --- a/frappe/desk/doctype/system_console/system_console.js +++ b/frappe/desk/doctype/system_console/system_console.js @@ -10,7 +10,15 @@ frappe.ui.form.on("System Console", { description: __("Execute Console script"), ignore_inputs: true, }); - frm.set_value("type", "Python"); + if ( + localStorage.getItem("system_console_code") && + localStorage.getItem("system_console_type") + ) { + frm.set_value("type", localStorage.getItem("system_console_type")); + frm.set_value("console", localStorage.getItem("system_console_code")); + localStorage.removeItem("system_console_code"); + localStorage.removeItem("system_console_type"); + } }, refresh: function (frm) { diff --git a/frappe/desk/doctype/system_console/system_console.py b/frappe/desk/doctype/system_console/system_console.py index 540936581a..14576d3860 100644 --- a/frappe/desk/doctype/system_console/system_console.py +++ b/frappe/desk/doctype/system_console/system_console.py @@ -40,8 +40,7 @@ class SystemConsole(Document): frappe.db.commit() else: frappe.db.rollback() - - frappe.get_doc(dict(doctype="Console Log", script=self.console)).insert() + frappe.get_doc(dict(doctype="Console Log", script=self.console, type=self.type)).insert() frappe.db.commit() From e877d926ebd564e15b4abd8438500dbe917eb34e Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Mon, 7 Aug 2023 06:07:23 +0000 Subject: [PATCH 075/221] test: set `request_ip` when testing `reset_password` (#21937) * test: set `request_ip` when testing `reset_password` * test: increase rate limit temporarily while testing `reset_password` --- frappe/core/doctype/user/test_user.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index b4d69d23d5..9be996e8c8 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -367,6 +367,9 @@ class TestUser(FrappeTestCase): set_request(path="/random") frappe.local.cookie_manager = CookieManager() frappe.local.login_manager = LoginManager() + # used by rate limiter when calling reset_password + frappe.local.request_ip = "127.0.0.1" + frappe.db.set_single_value("System Settings", "password_reset_limit", 6) frappe.set_user("testpassword@example.com") test_user = frappe.get_doc("User", "testpassword@example.com") From b385fae2dc9caff4acb27cc366e58cf01342a3de Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Mon, 7 Aug 2023 13:49:52 +0530 Subject: [PATCH 076/221] test: use unique IP to prevent future conflict with other tests --- frappe/core/doctype/user/test_user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index 9be996e8c8..1ca0a56ec0 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -368,7 +368,7 @@ class TestUser(FrappeTestCase): frappe.local.cookie_manager = CookieManager() frappe.local.login_manager = LoginManager() # used by rate limiter when calling reset_password - frappe.local.request_ip = "127.0.0.1" + frappe.local.request_ip = "127.0.0.69" frappe.db.set_single_value("System Settings", "password_reset_limit", 6) frappe.set_user("testpassword@example.com") From f6326b6145be8ed1ea2f4b4cbe80fad4b0b82205 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 7 Aug 2023 14:00:34 +0530 Subject: [PATCH 077/221] fix: check before deleting prepared report (#21950) --- frappe/core/doctype/prepared_report/prepared_report.py | 6 +++--- frappe/model/document.py | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frappe/core/doctype/prepared_report/prepared_report.py b/frappe/core/doctype/prepared_report/prepared_report.py index ef8ccce9c1..067cd728b2 100644 --- a/frappe/core/doctype/prepared_report/prepared_report.py +++ b/frappe/core/doctype/prepared_report/prepared_report.py @@ -211,9 +211,9 @@ def expire_stalled_report(): def delete_prepared_reports(reports): reports = frappe.parse_json(reports) for report in reports: - frappe.delete_doc( - "Prepared Report", report["name"], ignore_permissions=True, delete_permanently=True - ) + prepared_report = frappe.get_doc("Prepared Report", report["name"]) + if prepared_report.has_permission(): + prepared_report.delete(ignore_permissions=True, delete_permanently=True) def create_json_gz_file(data, dt, dn): diff --git a/frappe/model/document.py b/frappe/model/document.py index 9768200164..cedbe9ad71 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1039,7 +1039,7 @@ class Document(BaseDocument): """Rename the document to `name`. This transforms the current object.""" return self._rename(name=name, merge=merge, force=force, validate_rename=validate_rename) - def delete(self, ignore_permissions=False, force=False): + def delete(self, ignore_permissions=False, force=False, *, delete_permanently=False): """Delete document.""" return frappe.delete_doc( self.doctype, @@ -1047,6 +1047,7 @@ class Document(BaseDocument): ignore_permissions=ignore_permissions, flags=self.flags, force=force, + delete_permanently=delete_permanently, ) def run_before_save_methods(self): From b33ac8e74c77af72cb5dc3587e4200387959cba1 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Mon, 7 Aug 2023 18:25:20 +0530 Subject: [PATCH 078/221] fix: show idx for stack trace --- .../core/doctype/recorder_query/recorder_query.json | 11 +++++++++-- frappe/core/doctype/recorder_query/recorder_query.py | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/recorder_query/recorder_query.json b/frappe/core/doctype/recorder_query/recorder_query.json index 7ef70e0ef3..bb4e136178 100644 --- a/frappe/core/doctype/recorder_query/recorder_query.json +++ b/frappe/core/doctype/recorder_query/recorder_query.json @@ -5,10 +5,11 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ + "index", "query", "duration", - "exact_copies", "column_break_qmju", + "exact_copies", "normalized_query", "normalized_copies", "section_break_dygy", @@ -84,13 +85,19 @@ "fieldname": "sql_explain_html", "fieldtype": "HTML", "label": "SQL Explain" + }, + { + "fieldname": "index", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Index" } ], "index_web_pages_for_search": 1, "is_virtual": 1, "istable": 1, "links": [], - "modified": "2023-08-05 14:25:34.794204", + "modified": "2023-08-07 13:12:23.496002", "modified_by": "Administrator", "module": "Core", "name": "Recorder Query", diff --git a/frappe/core/doctype/recorder_query/recorder_query.py b/frappe/core/doctype/recorder_query/recorder_query.py index da07499f7b..185c927dbe 100644 --- a/frappe/core/doctype/recorder_query/recorder_query.py +++ b/frappe/core/doctype/recorder_query/recorder_query.py @@ -17,6 +17,7 @@ class RecorderQuery(Document): duration: DF.Float exact_copies: DF.Int explain_result: DF.Text | None + index: DF.Int normalized_copies: DF.Int normalized_query: DF.Data | None parent: DF.Data From 03637066b01db6a2262e514381ea094db02c67ed Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Mon, 7 Aug 2023 18:26:48 +0530 Subject: [PATCH 079/221] fix: filter and sort list view --- .../recorder_request/recorder_request.json | 17 ++++++++--- .../recorder_request/recorder_request.py | 30 ++++++++++++++++--- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/frappe/core/doctype/recorder_request/recorder_request.json b/frappe/core/doctype/recorder_request/recorder_request.json index 699bd7d1a5..0ebc2b1054 100644 --- a/frappe/core/doctype/recorder_request/recorder_request.json +++ b/frappe/core/doctype/recorder_request/recorder_request.json @@ -18,6 +18,7 @@ "request_headers", "section_break_sgro", "form_dict", + "section_break_9jhm", "sql_queries" ], "fields": [ @@ -25,11 +26,13 @@ "fieldname": "path", "fieldtype": "Data", "in_list_view": 1, + "in_standard_filter": 1, "label": "Path" }, { "fieldname": "cmd", "fieldtype": "Data", + "in_standard_filter": 1, "label": "CMD" }, { @@ -79,14 +82,20 @@ }, { "fieldname": "method", - "fieldtype": "Data", - "label": "Method" + "fieldtype": "Select", + "in_standard_filter": 1, + "label": "Method", + "options": "GET\nPOST" }, { "fieldname": "sql_queries", "fieldtype": "Table", "label": "SQL Queries", "options": "Recorder Query" + }, + { + "fieldname": "section_break_9jhm", + "fieldtype": "Section Break" } ], "hide_toolbar": 1, @@ -94,7 +103,7 @@ "index_web_pages_for_search": 1, "is_virtual": 1, "links": [], - "modified": "2023-08-05 14:45:04.358260", + "modified": "2023-08-07 14:47:10.047280", "modified_by": "Administrator", "module": "Core", "name": "Recorder Request", @@ -110,7 +119,7 @@ "share": 1 } ], - "sort_field": "modified", + "sort_field": "duration", "sort_order": "DESC", "states": [], "title_field": "path" diff --git a/frappe/core/doctype/recorder_request/recorder_request.py b/frappe/core/doctype/recorder_request/recorder_request.py index 6c96bb6faf..9e84416fe6 100644 --- a/frappe/core/doctype/recorder_request/recorder_request.py +++ b/frappe/core/doctype/recorder_request/recorder_request.py @@ -7,6 +7,7 @@ import re import frappe from frappe.model.document import Document from frappe.recorder import get +from frappe.utils import cint, compare, make_filter_dict class RecorderRequest(Document): @@ -22,7 +23,7 @@ class RecorderRequest(Document): cmd: DF.Data | None duration: DF.Float form_dict: DF.Code | None - method: DF.Data | None + method: DF.Literal["GET", "POST"] number_of_queries: DF.Int path: DF.Data | None request_headers: DF.Code | None @@ -44,12 +45,18 @@ class RecorderRequest(Document): @staticmethod def get_list(args): - requests = [serialize_request(request) for request in get()] - return requests + start = cint(args.get("start")) or 0 + page_length = cint(args.get("page_length")) or 20 + requests = RecorderRequest.get_filtered_requests(args)[start : start + page_length] + if args.get("order_by"): + sort_key, sort_order = args.get("order_by").split(".")[1].split(" ") + sort_key = sort_key.replace("`", "") + return sorted(requests, key=lambda r: r[sort_key], reverse=bool(sort_order == "desc")) + return sorted(requests, key=lambda r: r.duration, reverse=1) @staticmethod def get_count(args): - pass + return len(RecorderRequest.get_filtered_requests(args)) @staticmethod def get_stats(args): @@ -59,6 +66,21 @@ class RecorderRequest(Document): def delete(args): pass + @staticmethod + def get_filtered_requests(args): + filters = make_filter_dict(args.get("filters")) + requests = [serialize_request(request) for request in get()] + filtered_requests = [] + for request in requests: + filter_flag = 1 + for field in filters: + operator = "in" if filters[field][0] == "like" else filters[field][0] + if not compare(request[field], operator, filters[field][1]): + filter_flag = 0 + if filter_flag: + filtered_requests.append(request) + return filtered_requests + def serialize_request(request): request = frappe._dict(request) From 7bb81d710c7c78911603051e54ccac68668bcfb9 Mon Sep 17 00:00:00 2001 From: marination Date: Mon, 7 Aug 2023 20:11:00 +0530 Subject: [PATCH 080/221] fix: Make Show All button less prominent --- frappe/public/js/frappe/form/templates/form_sidebar.html | 8 +++----- frappe/public/scss/desk/sidebar.scss | 4 ---- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index 72710cbeb6..edfc194121 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -85,11 +85,9 @@ diff --git a/frappe/public/scss/desk/sidebar.scss b/frappe/public/scss/desk/sidebar.scss index 2fe2390a76..a4d713986c 100644 --- a/frappe/public/scss/desk/sidebar.scss +++ b/frappe/public/scss/desk/sidebar.scss @@ -403,10 +403,6 @@ body[data-route^="Module"] .main-menu { .show-all-btn { margin-top: var(--margin-md); text-align: center; - - .btn { - justify-content: center; - } } .shares, From 49a9f53d24ee125b28ff75c3cd11acd7a8f4cfe2 Mon Sep 17 00:00:00 2001 From: Jannat Patel <31363128+pateljannat@users.noreply.github.com> Date: Mon, 7 Aug 2023 20:23:53 +0530 Subject: [PATCH 081/221] feat: text editor and mentions for discussions (#21886) --- cypress/integration/discussions.js | 40 ++--- frappe/public/js/frappe-web.bundle.js | 1 + .../js/frappe/form/controls/text_editor.js | 8 +- frappe/templates/discussions/button.html | 2 +- frappe/templates/discussions/comment_box.html | 7 +- frappe/templates/discussions/discussions.js | 150 ++++++++++++------ .../discussions/discussions_section.html | 7 +- frappe/templates/discussions/reply_card.html | 27 +++- .../templates/discussions/reply_section.html | 14 +- frappe/templates/discussions/sidebar.html | 2 +- frappe/templates/styles/discussion_style.css | 98 +++++++----- .../discussion_reply/discussion_reply.json | 5 +- .../discussion_reply/discussion_reply.py | 2 +- 13 files changed, 219 insertions(+), 144 deletions(-) diff --git a/cypress/integration/discussions.js b/cypress/integration/discussions.js index 55bcabce19..9caeddeb1f 100644 --- a/cypress/integration/discussions.js +++ b/cypress/integration/discussions.js @@ -24,9 +24,9 @@ context("Discussions", () => { .should("have.value", "Discussion from tests"); // Enter comment - cy.get(".modal .comment-field") - .type("This is a discussion from the cypress ui tests.") - .should("have.value", "This is a discussion from the cypress ui tests."); + cy.get(".modal .discussions-comment").type( + "This is a discussion from the cypress ui tests." + ); // Submit cy.get(".modal .submit-discussion").click(); @@ -38,21 +38,16 @@ context("Discussions", () => { "Discussion from tests" ); cy.get(".discussion-on-page:visible").should("have.class", "show"); - cy.get(".discussion-on-page:visible .reply-card .reply-text").should( + cy.get(".discussion-on-page:visible .reply-card .reply-text .ql-editor p").should( "have.text", - "This is a discussion from the cypress ui tests.\n" + "This is a discussion from the cypress ui tests." ); }; const reply_through_comment_box = () => { - cy.get(".discussion-form:visible .comment-field") - .type( - "This is a discussion from the cypress ui tests. \n\nThis comment was entered through the commentbox on the page." - ) - .should( - "have.value", - "This is a discussion from the cypress ui tests. \n\nThis comment was entered through the commentbox on the page." - ); + cy.get(".discussion-form:visible .discussions-comment").type( + "This is a discussion from the cypress ui tests. \n\nThis comment was entered through the commentbox on the page." + ); cy.get(".discussion-form:visible .submit-discussion").click(); cy.wait(3000); @@ -63,28 +58,18 @@ context("Discussions", () => { .find(".reply-text") .should( "have.text", - "This is a discussion from the cypress ui tests. \n\nThis comment was entered through the commentbox on the page.\n" + "This is a discussion from the cypress ui tests. This comment was entered through the commentbox on the page.\n" ); }; - const cancel_and_clear_comment_box = () => { - cy.get(".discussion-form:visible .comment-field") - .type("This is a discussion from the cypress ui tests.") - .should("have.value", "This is a discussion from the cypress ui tests."); - - cy.get(".discussion-form:visible .cancel-comment").click(); - cy.get(".discussion-form:visible .comment-field").should("have.value", ""); - }; - const single_thread_discussion = () => { cy.visit("/test-single-thread"); cy.get(".discussions-sidebar").should("have.length", 0); cy.get(".reply").should("have.length", 0); - cy.get(".discussion-form:visible .comment-field") - .type("This comment is being made on a single thread discussion.") - .should("have.value", "This comment is being made on a single thread discussion."); - + cy.get(".discussion-form:visible .discussions-comment").type( + "This comment is being made on a single thread discussion." + ); cy.get(".discussion-form:visible .submit-discussion").click(); cy.wait(3000); cy.get(".discussion-on-page") @@ -96,6 +81,5 @@ context("Discussions", () => { it("reply through modal", reply_through_modal); it("reply through comment box", reply_through_comment_box); - it("cancel and clear comment box", cancel_and_clear_comment_box); it("single thread discussion", single_thread_discussion); }); diff --git a/frappe/public/js/frappe-web.bundle.js b/frappe/public/js/frappe-web.bundle.js index 36064767fb..30cf552c82 100644 --- a/frappe/public/js/frappe-web.bundle.js +++ b/frappe/public/js/frappe-web.bundle.js @@ -24,3 +24,4 @@ import "./bootstrap-4-web.bundle"; import "../../website/js/website.js"; import "./frappe/socketio_client.js"; +import "./frappe/form/controls/control.js"; diff --git a/frappe/public/js/frappe/form/controls/text_editor.js b/frappe/public/js/frappe/form/controls/text_editor.js index fd0e878567..15e11cd9e4 100644 --- a/frappe/public/js/frappe/form/controls/text_editor.js +++ b/frappe/public/js/frappe/form/controls/text_editor.js @@ -198,14 +198,18 @@ frappe.ui.form.ControlTextEditor = class ControlTextEditor extends frappe.ui.for get_quill_options() { return { modules: { - toolbar: this.get_toolbar_options(), + toolbar: Object.keys(this.df).includes("get_toolbar_options") + ? this.df.get_toolbar_options() + : this.get_toolbar_options(), table: true, imageResize: {}, magicUrl: true, mention: this.get_mention_options(), }, - theme: "snow", + theme: this.df.theme || "snow", readOnly: this.disabled, + bounds: this.quill_container[0], + placeholder: this.df.placeholder || "", }; } diff --git a/frappe/templates/discussions/button.html b/frappe/templates/discussions/button.html index 746227aa0b..dfc206b0b9 100644 --- a/frappe/templates/discussions/button.html +++ b/frappe/templates/discussions/button.html @@ -1,6 +1,6 @@ {% if frappe.session.user != "Guest" and (condition is not defined or (condition is defined and condition )) %} - + {{ _(cta_title) }} {% endif %} diff --git a/frappe/templates/discussions/comment_box.html b/frappe/templates/discussions/comment_box.html index 23c1bbecf1..eb27f6623a 100644 --- a/frappe/templates/discussions/comment_box.html +++ b/frappe/templates/discussions/comment_box.html @@ -15,19 +15,16 @@
    - +