fix!: Switch to creation as default sort order

This commit is contained in:
Ankush Menat 2024-03-23 15:21:29 +05:30
parent 7f4bcf37ce
commit 071e269548
23 changed files with 54 additions and 60 deletions

View file

@ -34,7 +34,7 @@ class TestMilestoneTracker(FrappeTestCase):
"Milestone",
fields=["track_field", "value", "milestone_tracker"],
filters=dict(reference_type=todo.doctype, reference_name=todo.name),
order_by="modified desc",
order_by="creation desc",
)
self.assertEqual(len(milestones), 2)

View file

@ -76,7 +76,7 @@ def get_files_by_search_text(text: str) -> list[dict]:
"file_url": text,
"name": ("like", text),
},
order_by="modified desc",
order_by="creation desc",
limit=20,
)

View file

@ -7,7 +7,7 @@ frappe.listview_settings["Error Log"] = {
return [__("Not Seen"), "red", "seen,=,0"];
}
},
order_by: "seen asc, modified desc",
order_by: "creation desc",
onload: function (listview) {
listview.page.add_menu_item(__("Clear Error Logs"), function () {
frappe.call({

View file

@ -315,7 +315,7 @@ class Report(Document):
elif params.get("order_by"):
order_by = params.get("order_by")
else:
order_by = Report._format([self.ref_doctype, "modified"]) + " desc"
order_by = Report._format([self.ref_doctype, "creation"]) + " desc"
if params.get("sort_by_next"):
order_by += (

View file

@ -6,7 +6,7 @@
"doctype": "Report",
"is_standard": "No",
"javascript": null,
"json": "{\"filters\":[],\"columns\":[[\"name\",\"User\"],[\"user_type\",\"User\"],[\"first_name\",\"User\"],[\"last_name\",\"User\"],[\"last_active\",\"User\"],[\"role\",\"Has Role\"]],\"sort_by\":\"User.modified\",\"sort_order\":\"desc\",\"sort_by_next\":null,\"sort_order_next\":\"desc\"}",
"json": "{\"filters\":[],\"columns\":[[\"name\",\"User\"],[\"user_type\",\"User\"],[\"first_name\",\"User\"],[\"last_name\",\"User\"],[\"last_active\",\"User\"],[\"role\",\"Has Role\"]],\"sort_by\":\"User.creation\",\"sort_order\":\"desc\",\"sort_by_next\":null,\"sort_order_next\":\"desc\"}",
"modified": "2016-09-01 02:59:07.728890",
"module": "Core",
"name": "User Activity Report",
@ -14,4 +14,4 @@
"ref_doctype": "User",
"report_name": "User Activity Report",
"report_type": "Report Builder"
}
}

View file

@ -76,14 +76,14 @@ class RQJob(Document):
return self._job_obj
@staticmethod
def get_list(filters=None, start=0, page_length=20, order_by="modified desc"):
def get_list(filters=None, start=0, page_length=20, order_by="creation desc"):
matched_job_ids = RQJob.get_matching_job_ids(filters=filters)[start : start + page_length]
conn = get_redis_conn()
jobs = [serialize_job(job) for job in Job.fetch_many(job_ids=matched_job_ids, connection=conn) if job]
order_desc = "desc" in order_by
return sorted(jobs, key=lambda j: j.modified, reverse=order_desc)
return sorted(jobs, key=lambda j: j.creation, reverse=order_desc)
@staticmethod
def get_matching_job_ids(filters) -> list[str]:

View file

@ -1,24 +1,24 @@
{
"add_total_row": 0,
"apply_user_permissions": 1,
"creation": "2015-02-05 06:01:35.060098",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 2,
"is_standard": "Yes",
"json": "{\"add_total_row\": 0, \"sort_by\": \"DocShare.modified\", \"sort_order\": \"desc\", \"sort_by_next\": null, \"filters\": [], \"sort_order_next\": \"desc\", \"columns\": [[\"name\", \"DocShare\"], [\"user\", \"DocShare\"], [\"share_doctype\", \"DocShare\"], [\"share_name\", \"DocShare\"], [\"read\", \"DocShare\"], [\"write\", \"DocShare\"], [\"share\", \"DocShare\"]]}",
"modified": "2017-02-24 20:01:16.232286",
"modified_by": "Administrator",
"module": "Core",
"name": "Document Share Report",
"owner": "Administrator",
"ref_doctype": "DocShare",
"report_name": "Document Share Report",
"report_type": "Report Builder",
"add_total_row": 0,
"apply_user_permissions": 1,
"creation": "2015-02-05 06:01:35.060098",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 2,
"is_standard": "Yes",
"json": "{\"add_total_row\": 0, \"sort_by\": \"DocShare.creation\", \"sort_order\": \"desc\", \"sort_by_next\": null, \"filters\": [], \"sort_order_next\": \"desc\", \"columns\": [[\"name\", \"DocShare\"], [\"user\", \"DocShare\"], [\"share_doctype\", \"DocShare\"], [\"share_name\", \"DocShare\"], [\"read\", \"DocShare\"], [\"write\", \"DocShare\"], [\"share\", \"DocShare\"]]}",
"modified": "2017-02-24 20:01:16.232286",
"modified_by": "Administrator",
"module": "Core",
"name": "Document Share Report",
"owner": "Administrator",
"ref_doctype": "DocShare",
"report_name": "Document Share Report",
"report_type": "Report Builder",
"roles": [
{
"role": "System Manager"
}
]
}
}

View file

@ -609,7 +609,7 @@ class Database:
if (filters is not None) and (filters != doctype or doctype == "DocType"):
try:
if order_by:
order_by = "modified" if order_by == DefaultOrderBy else order_by
order_by = "creation" if order_by == DefaultOrderBy else order_by
out = self._get_values_from_table(
fields=fields,
filters=filters,

View file

@ -133,8 +133,7 @@ CREATE TABLE `tabDocType Action` (
`action_type` varchar(140) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`action` text COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`name`),
KEY `parent` (`parent`),
KEY `modified` (`modified`)
KEY `parent` (`parent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;
--
@ -157,8 +156,7 @@ CREATE TABLE `tabDocType Link` (
`link_doctype` varchar(140) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`link_fieldname` varchar(140) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`name`),
KEY `parent` (`parent`),
KEY `modified` (`modified`)
KEY `parent` (`parent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;
--

View file

@ -33,7 +33,7 @@ class MariaDBTable(DBTable):
]
else:
# parent types
additional_definitions.append("index modified(modified)")
additional_definitions.append("index creation(creation)")
# creating sequence(s)
if not self.meta.issingle and self.meta.autoname == "autoincrement":

View file

@ -165,7 +165,7 @@ def get_email_header(doc, language: str | None = None):
@frappe.whitelist()
def get_notification_logs(limit=20):
notification_logs = frappe.db.get_list(
"Notification Log", fields=["*"], limit=limit, order_by="modified desc"
"Notification Log", fields=["*"], limit=limit, order_by="creation desc"
)
users = [log.from_user for log in notification_logs]

View file

@ -1086,7 +1086,7 @@ class DatabaseQuery:
sort_order = (self.doctype_meta.sort_field and self.doctype_meta.sort_order) or "desc"
if self.order_by:
args.order_by = (
f"`tab{self.doctype}`.`{sort_field or 'modified'}` {sort_order or 'desc'}"
f"`tab{self.doctype}`.`{sort_field or 'creation'}` {sort_order or 'desc'}"
)
def validate_order_by_and_group_by(self, parameters: str):
@ -1215,11 +1215,7 @@ def get_order_by(doctype, meta):
else:
sort_field = meta.sort_field or "modified"
sort_order = (meta.sort_field and meta.sort_order) or "desc"
order_by = f"`tab{doctype}`.`{sort_field or 'modified'}` {sort_order or 'desc'}"
# draft docs always on top
if meta.is_submittable:
order_by = f"`tab{doctype}`.docstatus asc, {order_by}"
order_by = f"`tab{doctype}`.`{sort_field or 'creation'}` {sort_order or 'desc'}"
return order_by

View file

@ -25,7 +25,7 @@ def execute():
settings.pop("columns", None)
# sort_by + order_by -> order_by
settings.order_by = (settings.sort_by or "modified") + " " + (settings.order_by or "desc")
settings.order_by = (settings.sort_by or "creation") + " " + (settings.order_by or "desc")
# add_total_row -> add_totals_row
settings.add_totals_row = settings.add_total_row

View file

@ -54,7 +54,7 @@ frappe.views.BaseList = class BaseList {
this.fields = [];
this.filters = [];
this.sort_by = this.meta.sort_field || "modified";
this.sort_by = this.meta.sort_field || "creation";
this.sort_order = this.meta.sort_order || "desc";
// Setup buttons

View file

@ -84,7 +84,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
this.view = "List";
// initialize with saved order by
this.sort_by = this.view_user_settings.sort_by || this.sort_by || "modified";
this.sort_by = this.view_user_settings.sort_by || this.sort_by || "creation";
this.sort_order = this.view_user_settings.sort_order || this.sort_order || "desc";
// build menu items

View file

@ -109,7 +109,7 @@ frappe.ui.SortSelector = class SortSelector {
this.args.sort_order = meta_sort_order;
} else {
// default
this.args.sort_by = "modified";
this.args.sort_by = "creation";
this.args.sort_order = "desc";
}
}
@ -183,7 +183,7 @@ frappe.ui.SortSelector = class SortSelector {
};
} else {
return {
meta_sort_field: meta.sort_field || "modified",
meta_sort_field: meta.sort_field || "creation",
meta_sort_order: meta.sort_order ? meta.sort_order.toLowerCase() : "",
};
}

View file

@ -35,7 +35,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
this.add_totals_row = this.report_doc.json.add_totals_row;
this.page_title = __(this.report_name);
this.page_length = this.report_doc.json.page_length || 20;
this.order_by = this.report_doc.json.order_by || "modified desc";
this.order_by = this.report_doc.json.order_by || "creation desc";
this.chart_args = this.report_doc.json.chart_args;
});
} else {

View file

@ -211,7 +211,7 @@ export default class QuickListWidget extends Widget {
doctype: this.document_type,
fields: fields,
filters: quick_list_filter,
order_by: "modified desc",
order_by: "creation desc",
start: 0,
page_length: 4,
},

View file

@ -371,7 +371,7 @@ class TestQuery(FrappeTestCase):
"Test Tree DocType",
fields=["name"],
filters={"name": ("descendants of", "Parent 1")},
order_by="modified desc",
order_by="creation desc",
).run(as_list=1)
# Format decendants result
@ -382,7 +382,7 @@ class TestQuery(FrappeTestCase):
"Test Tree DocType",
fields=["name"],
filters={"name": ("ancestors of", "Child 2")},
order_by="modified desc",
order_by="creation desc",
).run(as_list=1)
# Format ancestors result
@ -393,7 +393,7 @@ class TestQuery(FrappeTestCase):
"Test Tree DocType",
fields=["name"],
filters={"name": ("not descendants of", "Parent 1")},
order_by="modified desc",
order_by="creation desc",
).run(as_dict=1)
self.assertListEqual(
@ -409,7 +409,7 @@ class TestQuery(FrappeTestCase):
"Test Tree DocType",
fields=["name"],
filters={"name": ("not ancestors of", "Child 2")},
order_by="modified desc",
order_by="creation desc",
).run(as_dict=1)
self.assertListEqual(

View file

@ -8,7 +8,7 @@ from frappe.core.doctype.scheduled_job_type.scheduled_job_type import ScheduledJ
from frappe.utils import add_days, get_datetime
from frappe.utils.doctor import purge_pending_jobs
from frappe.utils.scheduler import (
_get_last_modified_timestamp,
_get_last_creation_timestamp,
enqueue_events,
is_dormant,
schedule_jobs_based_on_activity,
@ -75,20 +75,20 @@ class TestScheduler(TestCase):
job.execute()
job_log = frappe.get_doc("Scheduled Job Log", dict(scheduled_job_type=job.name))
job_log.db_set(
"modified", add_days(_get_last_modified_timestamp("Activity Log"), 5), update_modified=False
"creation", add_days(_get_last_creation_timestamp("Activity Log"), 5), update_modified=False
)
# inactive site with recent job, don't run
self.assertFalse(
schedule_jobs_based_on_activity(
check_time=add_days(_get_last_modified_timestamp("Activity Log"), 5)
check_time=add_days(_get_last_creation_timestamp("Activity Log"), 5)
)
)
# one more day has passed
self.assertTrue(
schedule_jobs_based_on_activity(
check_time=add_days(_get_last_modified_timestamp("Activity Log"), 6)
check_time=add_days(_get_last_creation_timestamp("Activity Log"), 6)
)
)

View file

@ -60,6 +60,6 @@ def version_query(doctype, txt, searchfield, start, page_len, filters):
filters=version_filters,
limit_start=start,
limit_page_length=page_len,
order_by="modified desc",
order_by="creation desc",
)
return [(d.name, pretty_date(d.modified), d.modified, d.owner) for d in results]

View file

@ -155,7 +155,7 @@ def schedule_jobs_based_on_activity(check_time=None):
Also return True for inactive sites once every 24 hours based on `Scheduled Job Log`."""
if is_dormant(check_time=check_time):
# ensure last job is one day old
last_job_timestamp = _get_last_modified_timestamp("Scheduled Job Log")
last_job_timestamp = _get_last_creation_timestamp("Scheduled Job Log")
if not last_job_timestamp:
return True
else:
@ -171,7 +171,7 @@ def schedule_jobs_based_on_activity(check_time=None):
def is_dormant(check_time=None):
last_activity_log_timestamp = _get_last_modified_timestamp("Activity Log")
last_activity_log_timestamp = _get_last_creation_timestamp("Activity Log")
since = (frappe.get_system_settings("dormant_days") or 4) * 86400
if not last_activity_log_timestamp:
return True
@ -180,8 +180,8 @@ def is_dormant(check_time=None):
return False
def _get_last_modified_timestamp(doctype):
timestamp = frappe.db.get_value(doctype, filters={}, fieldname="modified", order_by="modified desc")
def _get_last_creation_timestamp(doctype):
timestamp = frappe.db.get_value(doctype, filters={}, fieldname="creation", order_by="creation desc")
if timestamp:
return get_datetime(timestamp)

View file

@ -108,7 +108,7 @@ def get_list_data(
filters=filters,
limit_start=limit_start,
limit_page_length=limit,
order_by=list_context.order_by or "modified desc",
order_by=list_context.order_by or "creation desc",
)
# allow guest if flag is set