diff --git a/frappe/desk/doctype/changelog_feed/__init__.py b/frappe/desk/doctype/changelog_feed/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/desk/doctype/changelog_feed/changelog_feed.js b/frappe/desk/doctype/changelog_feed/changelog_feed.js new file mode 100644 index 0000000000..44fa5ce24f --- /dev/null +++ b/frappe/desk/doctype/changelog_feed/changelog_feed.js @@ -0,0 +1,8 @@ +// Copyright (c) 2023, Frappe Technologies and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Changelog Feed", { +// refresh(frm) { + +// }, +// }); diff --git a/frappe/desk/doctype/changelog_feed/changelog_feed.json b/frappe/desk/doctype/changelog_feed/changelog_feed.json new file mode 100644 index 0000000000..c4798bd476 --- /dev/null +++ b/frappe/desk/doctype/changelog_feed/changelog_feed.json @@ -0,0 +1,66 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2023-05-16 19:37:51.047664", + "default_view": "List", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "title", + "app_name", + "link", + "creation_of_feed_item" + ], + "fields": [ + { + "fieldname": "title", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Title", + "reqd": 1 + }, + { + "fieldname": "app_name", + "fieldtype": "Data", + "label": "App Name" + }, + { + "fieldname": "link", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Link", + "reqd": 1 + }, + { + "fieldname": "creation_of_feed_item", + "fieldtype": "Datetime", + "label": "Creation of Feed Item", + "reqd": 1 + } + ], + "index_web_pages_for_search": 1, + "links": [], + "modified": "2023-05-22 10:04:52.980692", + "modified_by": "Administrator", + "module": "Desk", + "name": "Changelog Feed", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/frappe/desk/doctype/changelog_feed/changelog_feed.py b/frappe/desk/doctype/changelog_feed/changelog_feed.py new file mode 100644 index 0000000000..df0bfef7dd --- /dev/null +++ b/frappe/desk/doctype/changelog_feed/changelog_feed.py @@ -0,0 +1,66 @@ +# Copyright (c) 2023, Frappe Technologies and contributors +# For license information, please see license.txt + +import frappe +from frappe.hooks import app_title +from frappe.model.document import Document + + +class ChangelogFeed(Document): + pass + + +def get_feed(): + return [ + { + "title": "Spid", + "creation": "2023-04-03 16:56:51.436456", + "app_name": app_title, + "link": "https://frappe.io/wiki", + }, + { + "title": "Stable something something", + "creation": "2023-05-03 16:56:51.436456", + "app_name": "HRMS", + "link": "https://frappe.io/blog", + }, + ] + + +def fetch_changelog_feed_items_from_source(): + """Fetches changelog feed items from source using + `get_changelog_feed` hook and stores in the db""" + + changelog_feed_items = [] + for fn in frappe.get_hooks("get_changelog_feed"): + changelog_feed_items += frappe.get_attr(fn)() + + changelog_feed_items = sorted(changelog_feed_items, key=lambda x: x["creation"], reverse=True) + for changelog_feed_item in changelog_feed_items: + change_log_feed_item_dict = { + "doctype": "Changelog Feed", + "title": changelog_feed_item["title"], + "app_name": changelog_feed_item["app_name"], + "link": changelog_feed_item["link"], + "creation_of_feed_item": changelog_feed_item["creation"], + } + if not frappe.db.exists(change_log_feed_item_dict): + feed_doc = frappe.get_doc(change_log_feed_item_dict) + feed_doc.insert() + + +@frappe.whitelist() +def get_changelog_feed_items(): + """Returns a list of latest 10 changelog feed items""" + changelog_feed_items = frappe.cache().get_value("changelog_feed") + if not changelog_feed_items or frappe.conf.developer_mode: + fetch_changelog_feed_items_from_source() + changelog_feed_items = frappe.get_list( + "Changelog Feed", + fields=["title", "app_name", "link", "creation_of_feed_item"], + order_by="modified desc", + limit=10, + ) + frappe.cache().set_value("changelog_feed", changelog_feed_items, expires_in_sec=24 * 60 * 60) + + return changelog_feed_items diff --git a/frappe/desk/doctype/changelog_feed/test_changelog_feed.py b/frappe/desk/doctype/changelog_feed/test_changelog_feed.py new file mode 100644 index 0000000000..9427051f10 --- /dev/null +++ b/frappe/desk/doctype/changelog_feed/test_changelog_feed.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Frappe Technologies and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestChangelogFeed(FrappeTestCase): + pass diff --git a/frappe/hooks.py b/frappe/hooks.py index 75f93b0ad5..4bffbec8eb 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -236,6 +236,7 @@ scheduler_events = { "frappe.integrations.doctype.s3_backup_settings.s3_backup_settings.take_backups_daily", "frappe.email.doctype.auto_email_report.auto_email_report.send_daily", "frappe.integrations.doctype.google_drive.google_drive.daily_backup", + "frappe.desk.doctype.changelog_feed.changelog_feed.fetch_changelog_feed_items_from_source", ], "weekly_long": [ "frappe.integrations.doctype.dropbox_settings.dropbox_settings.take_backups_weekly", @@ -425,21 +426,4 @@ extend_bootinfo = [ "frappe.utils.telemetry.add_bootinfo", ] -get_changelog_feed = "frappe.hooks.get_feed" - - -def get_feed(): - return [ - { - "title": "Spid", - "creation": "2023-04-03 16:56:51.436456", - "app_title": app_title, - "link": "https://frappe.io/wiki", - }, - { - "title": "Stable something something", - "creation": "2023-05-03 16:56:51.436456", - "app_title": "HRMS", - "link": "https://frappe.io/blog", - }, - ] +get_changelog_feed = "frappe.desk.doctype.changelog_feed.changelog_feed.get_feed" diff --git a/frappe/public/js/frappe/ui/notifications/notifications.js b/frappe/public/js/frappe/ui/notifications/notifications.js index 24c93c438b..2bead8a765 100644 --- a/frappe/public/js/frappe/ui/notifications/notifications.js +++ b/frappe/public/js/frappe/ui/notifications/notifications.js @@ -449,7 +449,10 @@ class EventsView extends BaseNotificationsView { class ChangelogFeedView extends BaseNotificationsView { make() { frappe - .xcall("frappe.utils.change_log.get_changelog_feed_items", {}) + .xcall( + "frappe.desk.doctype.changelog_feed.changelog_feed.get_changelog_feed_items", + {} + ) .then((changelog_feed_list) => { this.render_changelog_feed_html(changelog_feed_list); }); @@ -460,11 +463,13 @@ class ChangelogFeedView extends BaseNotificationsView { if (changelog_feed_list.length) { this.container.empty(); const get_changelog_feed_html = (changelog_feed_item) => { - const timestamp = frappe.datetime.comment_when(changelog_feed_item.creation); + const timestamp = frappe.datetime.comment_when( + changelog_feed_item.creation_of_feed_item + ); const message_html = `
`; diff --git a/frappe/utils/change_log.py b/frappe/utils/change_log.py index 67e529c0f0..a4b56686c2 100644 --- a/frappe/utils/change_log.py +++ b/frappe/utils/change_log.py @@ -309,19 +309,3 @@ def show_update_popup(): if update_message: frappe.msgprint(update_message, title=_("New updates are available"), indicator="green") cache.srem("update-user-set", user) - - -@frappe.whitelist() -def get_changelog_feed_items(): - """Returns a list of all fetched changelog feed items""" - - changelog_feed_items = frappe.cache().get_value("changelog_feed") - if not changelog_feed_items: - changelog_feed_items = [] - for fn in frappe.get_hooks("get_changelog_feed"): - changelog_feed_items += frappe.get_attr(fn)() - - changelog_feed_items = sorted(changelog_feed_items, key=lambda x: x["creation"], reverse=True) - frappe.cache().set_value("changelog_feed", changelog_feed_items, expires_in_sec=60 * 60) - - return changelog_feed_items