[fix] change log
This commit is contained in:
parent
af83117192
commit
f71edb79b2
8 changed files with 122 additions and 126 deletions
|
|
@ -11,7 +11,7 @@ import frappe.defaults
|
|||
import frappe.desk.desk_page
|
||||
from frappe.utils import get_gravatar, get_url
|
||||
from frappe.desk.form.load import get_meta_bundle
|
||||
from frappe.change_log import get_versions
|
||||
from frappe.utils.change_log import get_versions
|
||||
|
||||
def get_bootinfo():
|
||||
"""build and return boot info"""
|
||||
|
|
|
|||
|
|
@ -1,96 +0,0 @@
|
|||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# MIT License. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import os
|
||||
import json
|
||||
from semantic_version import Version
|
||||
import frappe
|
||||
from frappe.utils import cstr
|
||||
|
||||
def get_change_log(user=None):
|
||||
if not user: user = frappe.session.user
|
||||
|
||||
last_known_versions = frappe._dict(json.loads(frappe.db.get_value("User", user, "last_known_versions") or "{}"))
|
||||
current_versions = get_versions()
|
||||
|
||||
if not last_known_versions:
|
||||
update_last_known_versions()
|
||||
return []
|
||||
|
||||
change_log = []
|
||||
for app, opts in current_versions.items():
|
||||
from_version = last_known_versions.get(app, {}).get("version") or "0.0.1"
|
||||
to_version = opts["version"]
|
||||
|
||||
if from_version != to_version:
|
||||
app_change_log = get_change_log_for_app(app, from_version=from_version, to_version=to_version)
|
||||
|
||||
if app_change_log:
|
||||
change_log.append({
|
||||
"title": opts["title"],
|
||||
"description": opts["description"],
|
||||
"version": to_version,
|
||||
"change_log": app_change_log
|
||||
})
|
||||
|
||||
return change_log
|
||||
|
||||
def get_change_log_for_app(app, from_version, to_version):
|
||||
change_log_folder = os.path.join(frappe.get_app_path(app), "change_log")
|
||||
if not os.path.exists(change_log_folder):
|
||||
return
|
||||
|
||||
from_version = Version(from_version)
|
||||
to_version = Version(to_version)
|
||||
# remove pre-release part
|
||||
to_version.prerelease = None
|
||||
|
||||
major_version_folders = ["v{0}".format(i) for i in xrange(from_version.major, to_version.major + 1)]
|
||||
app_change_log = []
|
||||
|
||||
for folder in os.listdir(change_log_folder):
|
||||
if folder in major_version_folders:
|
||||
for file in os.listdir(os.path.join(change_log_folder, folder)):
|
||||
version = Version(os.path.splitext(file)[0][1:].replace("_", "."))
|
||||
|
||||
if from_version < version <= to_version:
|
||||
file_path = os.path.join(change_log_folder, folder, file)
|
||||
content = frappe.read_file(file_path)
|
||||
app_change_log.append([version, content])
|
||||
|
||||
app_change_log = sorted(app_change_log, key=lambda d: d[0], reverse=True)
|
||||
|
||||
# convert version to string and send
|
||||
return [[cstr(d[0]), d[1]] for d in app_change_log]
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_last_known_versions():
|
||||
frappe.db.set_value("User", frappe.session.user, "last_known_versions", json.dumps(get_versions()), update_modified=False)
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_versions():
|
||||
"""Get versions of all installed apps.
|
||||
|
||||
Example:
|
||||
|
||||
{
|
||||
"frappe": {
|
||||
"title": "Frappe Framework",
|
||||
"version": "5.0.0"
|
||||
}
|
||||
}"""
|
||||
versions = {}
|
||||
for app in frappe.get_installed_apps(sort=True):
|
||||
versions[app] = {
|
||||
"title": frappe.get_hooks("app_title", app_name=app),
|
||||
"description": frappe.get_hooks("app_description", app_name=app)
|
||||
}
|
||||
try:
|
||||
versions[app]["version"] = frappe.get_attr(app + ".__version__")
|
||||
except AttributeError:
|
||||
versions[app]["version"] = '0.0.1'
|
||||
|
||||
return versions
|
||||
|
||||
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
### Version 5
|
||||
|
||||
Please see https://frappe.io/version-5
|
||||
|
||||
Changes include:
|
||||
|
||||
1. New Visual Design
|
||||
1. Custom DocTypes
|
||||
1. Email Accounts
|
||||
1. Email Replies and Notifications
|
||||
1. Print Format Builder
|
||||
1. Document Sharing
|
||||
|
||||
|
|
@ -1,17 +1,16 @@
|
|||
{% for (var i=0, l=change_log.length; i < l; i++) { var app_info = change_log[0]; %}
|
||||
{% for (var i=0, l=change_log.length; i < l; i++) {
|
||||
var app_info = change_log[i]; %}
|
||||
{% if (i > 0) { %} <hr> {% } %}
|
||||
<div class="text-left app-change-log">
|
||||
<h2 style="margin-top: 10px;">{%= app_info.title %}
|
||||
<small>{%= __("updated to {0}", [app_info.version]) %}</small>
|
||||
{% if (app_info.title != app_info.description) { %}
|
||||
<br>
|
||||
<small>{%= app_info.description %}</small>
|
||||
{% } %}
|
||||
<h2 style="margin-top: 10px;">
|
||||
{{ app_info.title }}
|
||||
<small>{{ __("updated to {0}", [app_info.version]) }}</small>
|
||||
</h2>
|
||||
{% for (var x=0, y=app_info.change_log.length; x < y; x++) { var version_info = app_info.change_log[i]; %}
|
||||
<hr>
|
||||
<h4>{%= __("New in version {0}", [version_info[0]]) %}</h4>
|
||||
<p>{%= frappe.markdown(version_info[1]) %}</p>
|
||||
{% } %}
|
||||
{% for (var x=0, y=app_info.change_log.length; x < y; x++) {
|
||||
var version_info = app_info.change_log[x];
|
||||
if(version_info) { %}
|
||||
<p>{{ frappe.markdown(version_info[1]) }}</p>
|
||||
{% }
|
||||
} %}
|
||||
</div>
|
||||
{% } %}
|
||||
|
|
|
|||
|
|
@ -293,7 +293,7 @@ frappe.Application = Class.extend({
|
|||
d.keep_open = true;
|
||||
d.custom_onhide = function() {
|
||||
frappe.call({
|
||||
"method": "frappe.change_log.update_last_known_versions"
|
||||
"method": "frappe.utils.change_log.update_last_known_versions"
|
||||
});
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ from frappe.utils import cint, cstr
|
|||
import frappe.model.meta
|
||||
import frappe.defaults
|
||||
import frappe.translate
|
||||
import frappe.change_log
|
||||
from frappe.utils.change_log import get_change_log
|
||||
import redis
|
||||
from urllib import unquote
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ def get():
|
|||
|
||||
# check only when clear cache is done, and don't cache this
|
||||
if frappe.local.request:
|
||||
bootinfo["change_log"] = frappe.change_log.get_change_log()
|
||||
bootinfo["change_log"] = get_change_log()
|
||||
|
||||
bootinfo["metadata_version"] = frappe.cache().get_value("metadata_version")
|
||||
if not bootinfo["metadata_version"]:
|
||||
|
|
@ -124,7 +124,6 @@ def get():
|
|||
frappe.get_attr(hook)(bootinfo=bootinfo)
|
||||
|
||||
bootinfo["lang"] = frappe.translate.get_user_lang()
|
||||
|
||||
return bootinfo
|
||||
|
||||
class Session:
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ def get_context(context):
|
|||
boot = frappe.sessions.get()
|
||||
boot_json = frappe.as_json(boot)
|
||||
|
||||
frappe.db.commit()
|
||||
|
||||
# remove script tags from boot
|
||||
boot_json = re.sub("\<script\>[^<]*\</script\>", "", boot_json)
|
||||
|
||||
|
|
|
|||
105
frappe/utils/change_log.py
Normal file
105
frappe/utils/change_log.py
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# MIT License. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import os
|
||||
import json
|
||||
from semantic_version import Version
|
||||
import frappe
|
||||
from frappe.utils import cstr
|
||||
|
||||
def get_change_log(user=None):
|
||||
if not user: user = frappe.session.user
|
||||
|
||||
last_known_versions = frappe._dict(json.loads(frappe.db.get_value("User",
|
||||
user, "last_known_versions") or "{}"))
|
||||
current_versions = get_versions()
|
||||
|
||||
if not last_known_versions:
|
||||
update_last_known_versions()
|
||||
return []
|
||||
|
||||
change_log = []
|
||||
def set_in_change_log(app, opts, change_log):
|
||||
from_version = last_known_versions.get(app, {}).get("version") or "0.0.1"
|
||||
to_version = opts["version"]
|
||||
|
||||
if from_version != to_version:
|
||||
app_change_log = get_change_log_for_app(app, from_version=from_version, to_version=to_version)
|
||||
|
||||
if app_change_log:
|
||||
change_log.append({
|
||||
"title": opts["title"],
|
||||
"description": opts["description"],
|
||||
"version": to_version,
|
||||
"change_log": app_change_log
|
||||
})
|
||||
|
||||
for app, opts in current_versions.items():
|
||||
if app != "frappe":
|
||||
set_in_change_log(app, opts, change_log)
|
||||
|
||||
if "frappe" in current_versions:
|
||||
set_in_change_log("frappe", current_versions["frappe"], change_log)
|
||||
|
||||
return change_log
|
||||
|
||||
def get_change_log_for_app(app, from_version, to_version):
|
||||
change_log_folder = os.path.join(frappe.get_app_path(app), "change_log")
|
||||
if not os.path.exists(change_log_folder):
|
||||
return
|
||||
|
||||
from_version = Version(from_version)
|
||||
to_version = Version(to_version)
|
||||
# remove pre-release part
|
||||
to_version.prerelease = None
|
||||
|
||||
major_version_folders = ["v{0}".format(i) for i in xrange(from_version.major, to_version.major + 1)]
|
||||
app_change_log = []
|
||||
|
||||
for folder in os.listdir(change_log_folder):
|
||||
if folder in major_version_folders:
|
||||
for file in os.listdir(os.path.join(change_log_folder, folder)):
|
||||
version = Version(os.path.splitext(file)[0][1:].replace("_", "."))
|
||||
|
||||
if from_version < version <= to_version:
|
||||
file_path = os.path.join(change_log_folder, folder, file)
|
||||
content = frappe.read_file(file_path)
|
||||
app_change_log.append([version, content])
|
||||
|
||||
app_change_log = sorted(app_change_log, key=lambda d: d[0], reverse=True)
|
||||
|
||||
# convert version to string and send
|
||||
return [[cstr(d[0]), d[1]] for d in app_change_log]
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_last_known_versions():
|
||||
frappe.db.set_value("User", frappe.session.user, "last_known_versions",
|
||||
json.dumps(get_versions()), update_modified=False)
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_versions():
|
||||
"""Get versions of all installed apps.
|
||||
|
||||
Example:
|
||||
|
||||
{
|
||||
"frappe": {
|
||||
"title": "Frappe Framework",
|
||||
"version": "5.0.0"
|
||||
}
|
||||
}"""
|
||||
versions = {}
|
||||
for app in frappe.get_installed_apps(sort=True):
|
||||
versions[app] = {
|
||||
"title": frappe.get_hooks("app_title", app_name=app)[0],
|
||||
"description": frappe.get_hooks("app_description", app_name=app)[0]
|
||||
}
|
||||
try:
|
||||
versions[app]["version"] = frappe.get_attr(app + ".__version__")
|
||||
except AttributeError:
|
||||
versions[app]["version"] = '0.0.1'
|
||||
|
||||
return versions
|
||||
|
||||
|
||||
Loading…
Add table
Reference in a new issue