[style]
This commit is contained in:
parent
812a969c54
commit
cd9a34616f
15 changed files with 103 additions and 6441 deletions
|
|
@ -31,7 +31,7 @@ def get_user_permissions(user=None):
|
|||
return build_user_permissions(user)
|
||||
|
||||
def build_user_permissions(user):
|
||||
out = frappe.cache().get_value("user_permissions:" + user)
|
||||
out = frappe.cache().get_value("user_permissions", user=user)
|
||||
if out==None:
|
||||
out = {}
|
||||
for key, value in frappe.db.sql("""select defkey, ifnull(defvalue, '') as defvalue
|
||||
|
|
@ -42,7 +42,7 @@ def build_user_permissions(user):
|
|||
if user not in out.get("User", []):
|
||||
out.setdefault("User", []).append(user)
|
||||
|
||||
frappe.cache().set_value("user_permissions:" + user, out)
|
||||
frappe.cache().set_value("user_permissions", out, user=user)
|
||||
return out
|
||||
|
||||
def get_defaults(user=None):
|
||||
|
|
|
|||
6364
frappe/public/css/bootstrap.css
vendored
6364
frappe/public/css/bootstrap.css
vendored
File diff suppressed because one or more lines are too long
|
|
@ -23,6 +23,10 @@ a {
|
|||
font-size: inherit;
|
||||
}
|
||||
|
||||
.nav-pills a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
a.disabled, a.disabled:hover {
|
||||
color: #888;
|
||||
cursor: default;
|
||||
|
|
@ -34,6 +38,7 @@ a.disabled, a.disabled:hover {
|
|||
}
|
||||
|
||||
a.form-link {
|
||||
color: inherit;
|
||||
font-weight: bold;
|
||||
font-size: 102%;
|
||||
}
|
||||
|
|
@ -112,9 +117,9 @@ em.link-option {
|
|||
padding-top: 3px;
|
||||
}
|
||||
|
||||
.list-filters {
|
||||
/*.list-filters {
|
||||
background-color: #f7fafc;
|
||||
}
|
||||
}*/
|
||||
|
||||
.list-paging-area {
|
||||
padding: 10px 15px;
|
||||
|
|
@ -216,7 +221,7 @@ em.link-option {
|
|||
margin: 0px;
|
||||
padding: 15px;
|
||||
}
|
||||
.form-section:nth-child(even), .list-row:nth-child(even), .timeline-item:nth-child(even) {
|
||||
.form-section:nth-child(even), .timeline-item:nth-child(even) {
|
||||
background-color: #fafbfc;
|
||||
}
|
||||
|
||||
|
|
@ -236,6 +241,11 @@ em.link-option {
|
|||
|
||||
.sidebar-section li {
|
||||
margin-top: 5px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.sidebar-section a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.sidebar-section {
|
||||
|
|
@ -356,6 +366,10 @@ textarea.form-control {
|
|||
height: 120px;
|
||||
}
|
||||
|
||||
.control-value a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
ul.linked-with-list {
|
||||
list-style: none;
|
||||
margin: 0 0 20px 0;
|
||||
|
|
@ -382,7 +396,7 @@ ul.linked-with-list li {
|
|||
}
|
||||
|
||||
.grid-row {
|
||||
padding: 10px 15px;
|
||||
padding: 8px 15px;
|
||||
border-bottom: 1px solid #d1d8dd;
|
||||
}
|
||||
|
||||
|
|
@ -402,6 +416,14 @@ ul.linked-with-list li {
|
|||
background-color: #fff;
|
||||
}
|
||||
|
||||
.grid-body .data-row {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.grid-body .data-row a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.grid-footer {
|
||||
padding: 10px 15px;
|
||||
border-top: 1px solid #d1d8dd;
|
||||
|
|
|
|||
|
|
@ -4,25 +4,34 @@
|
|||
</span>
|
||||
<div class="media-body">
|
||||
<div>
|
||||
<h6>
|
||||
<i class="{%= data.icon %} icon-fixed-width"></i>
|
||||
{%= data.fullname %} <span class="text-muted" style="font-weight: normal;">
|
||||
‐ {%= data.comment_on %}</span>
|
||||
</h6>
|
||||
{% if(data.doctype=="Communication") { %}
|
||||
<div class="pull-right">
|
||||
<span class="small text-muted">
|
||||
{%= data.delete %}
|
||||
</span>
|
||||
</div>
|
||||
{% if(data.doctype=="Communication" || data.comment_type=="Comment") { %}
|
||||
<h6>
|
||||
<i class="{%= data.icon %} icon-fixed-width"></i>
|
||||
{%= data.fullname %} <span class="text-muted" style="font-weight: normal;">
|
||||
‐ {%= data.comment_on %}</span>
|
||||
</h6>
|
||||
<blockquote>
|
||||
{% if(data.doctype=="Communication") { %}
|
||||
<h6>
|
||||
{%= data.subject %}
|
||||
<a href="#Form/{%= data.doctype %}/{%= data.name %}">{%= __("Details") %}</a>
|
||||
</h6>
|
||||
{% } %}
|
||||
<div>
|
||||
{%= data.comment_html %}
|
||||
</div>
|
||||
</blockquote>
|
||||
{% } else { %}
|
||||
<div>
|
||||
{%= data.comment_html %}
|
||||
</div>
|
||||
<h6>
|
||||
<i class="{%= data.icon %} icon-fixed-width"></i>
|
||||
{%= data.fullname %} {%= data.comment %}<span class="text-muted" style="font-weight: normal;">
|
||||
‐ {%= data.comment_on %}</span>
|
||||
</h6>
|
||||
{% } %}
|
||||
{% if(data.attachments && data.attachments.length) { %}
|
||||
<div style="margin: 10px 0px">
|
||||
|
|
@ -36,12 +45,6 @@
|
|||
{% }); %}
|
||||
</div>
|
||||
{% } %}
|
||||
<div>
|
||||
<span class="small text-muted">
|
||||
|
||||
{%= data.delete %}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ frappe.ui.form.Layout = Class.extend({
|
|||
make_page: function(df) {
|
||||
var me = this,
|
||||
head = $('<div class="form-page-header text-center">\
|
||||
<a class="btn-fold">'+__("View Details")+'</a>\
|
||||
<a class="btn-fold h6">'+__("Show more details")+'</a>\
|
||||
</div>').appendTo(this.wrapper);
|
||||
|
||||
this.page = $('<div class="form-page hide"></div>').appendTo(this.wrapper);
|
||||
|
|
@ -122,11 +122,11 @@ frappe.ui.form.Layout = Class.extend({
|
|||
this.fold_btn = head.find(".btn-fold").on("click", function() {
|
||||
var page = $(this).parent().next();
|
||||
if(page.hasClass("hide")) {
|
||||
$(this).removeClass("btn-fold").html(__("Hide Details"));
|
||||
$(this).removeClass("btn-fold").html(__("Hide details"));
|
||||
page.removeClass("hide");
|
||||
me.folded = false;
|
||||
} else {
|
||||
$(this).addClass("btn-fold").html(__("View Details"));
|
||||
$(this).addClass("btn-fold").html(__("Show more details"));
|
||||
page.addClass("hide");
|
||||
me.folded = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ frappe.views.ListSidebar = Class.extend({
|
|||
args.field = field;
|
||||
args.bar_style = "";
|
||||
|
||||
$item = $(repl('<div class="progress" style="height: 7px;">\
|
||||
$item = $(repl('<div class="progress" style="height: 5px;">\
|
||||
<div class="progress-bar %(bar_style)s" style="width: %(width)s%"></div>\
|
||||
</div>\
|
||||
<div class="stat-label" style="margin-top: -19px; text-align: center; \
|
||||
|
|
|
|||
|
|
@ -275,10 +275,10 @@ frappe.ui.make_app_page = function(opts) {
|
|||
opts.parent.body = opts.parent.appframe.add_view("main", '<div class="layout-main">');
|
||||
} else {
|
||||
var main = opts.parent.appframe.add_view("main", '<div class="row layout-main">\
|
||||
<div class="col-sm-2 layout-side-section"></div>\
|
||||
<div class="col-sm-10">\
|
||||
<div class="layout-main-section" style="margin: 0px -15px;"></div>\
|
||||
</div>\
|
||||
<div class="col-sm-2 layout-side-section"></div>\
|
||||
</div>');
|
||||
opts.parent.body = main.find(".layout-main-section");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,6 +95,8 @@ frappe.views.moduleview.ModuleView = Class.extend({
|
|||
me.update_open_count(wrapper.$layout);
|
||||
}
|
||||
});
|
||||
|
||||
$(wrapper).find(".layout-main").css({"padding-top": "15px"});
|
||||
},
|
||||
make: function(wrapper, module) {
|
||||
var me = this;
|
||||
|
|
@ -156,7 +158,7 @@ frappe.views.moduleview.ModuleView = Class.extend({
|
|||
.appendTo($sections);
|
||||
|
||||
// create content pane for this nav
|
||||
var $content = $('<div class="panel panel-default"></div>')
|
||||
var $content = $('<div class="panel panel-default""></div>')
|
||||
.toggle(false)
|
||||
.attr("data-content-label", d._label)
|
||||
.appendTo($layout.find(".contents"));
|
||||
|
|
|
|||
|
|
@ -28,29 +28,11 @@ def clear(user=None):
|
|||
def clear_cache(user=None):
|
||||
cache = frappe.cache()
|
||||
|
||||
def delete_user_cache(user):
|
||||
if user:
|
||||
for key in ("bootinfo", "lang", "roles", "user_permissions", "home_page"):
|
||||
cache.delete_value(key + ":" + user)
|
||||
|
||||
if user:
|
||||
delete_user_cache(user)
|
||||
|
||||
if frappe.session:
|
||||
if user==frappe.session.user and frappe.session.sid:
|
||||
cache.delete_value("session:" + frappe.session.sid)
|
||||
else:
|
||||
for sid in frappe.db.sql_list("""select sid from tabSessions
|
||||
where user=%s""", (user,)):
|
||||
cache.delete_value("session:" + sid)
|
||||
|
||||
cache.delete_keys("user:" + user)
|
||||
frappe.defaults.clear_cache(user)
|
||||
else:
|
||||
for sess in frappe.db.sql("""select user, sid from tabSessions""", as_dict=1):
|
||||
delete_user_cache(sess.user)
|
||||
cache.delete_value("session:" + sess.sid)
|
||||
|
||||
delete_user_cache("Guest")
|
||||
cache.delete_keys("user:")
|
||||
clear_global_cache()
|
||||
frappe.defaults.clear_cache()
|
||||
|
||||
|
|
@ -61,14 +43,18 @@ def clear_global_cache():
|
|||
def clear_sessions(user=None, keep_current=False):
|
||||
if not user:
|
||||
user = frappe.session.user
|
||||
|
||||
for sid in frappe.db.sql("""select sid from tabSessions where user=%s""", (user,)):
|
||||
if keep_current and frappe.session.sid==sid[0]:
|
||||
continue
|
||||
else:
|
||||
delete_session(sid[0])
|
||||
|
||||
def delete_session(sid=None):
|
||||
frappe.cache().delete_value("session:" + sid)
|
||||
def delete_session(sid=None, user=None):
|
||||
if not user:
|
||||
user = hasattr(frappe.local, "session") and frappe.session.user or "Guest"
|
||||
frappe.cache().delete_value("session:" + sid, user=user)
|
||||
frappe.cache().delete_value("last_db_session_update:" + sid)
|
||||
frappe.db.sql("""delete from tabSessions where sid=%s""", sid)
|
||||
|
||||
def clear_all_sessions():
|
||||
|
|
@ -92,10 +78,11 @@ def get():
|
|||
bootinfo = None
|
||||
if not getattr(frappe.conf,'disable_session_cache', None):
|
||||
# check if cache exists
|
||||
bootinfo = frappe.cache().get_value('bootinfo:' + frappe.session.user)
|
||||
bootinfo = frappe.cache().get_value("bootinfo", user=True)
|
||||
if bootinfo:
|
||||
bootinfo['from_cache'] = 1
|
||||
bootinfo["user"]["recent"] = json.dumps(frappe.cache().get_value("recent:" + frappe.session.user))
|
||||
bootinfo["user"]["recent"] = \
|
||||
json.dumps(frappe.cache().get_value("recent", user=True))
|
||||
bootinfo["notification_info"].update(get_notifications())
|
||||
|
||||
if not bootinfo:
|
||||
|
|
@ -103,7 +90,7 @@ def get():
|
|||
# if not create it
|
||||
bootinfo = get_bootinfo()
|
||||
bootinfo["notification_info"] = get_notification_info_for_boot()
|
||||
frappe.cache().set_value('bootinfo:' + frappe.session.user, bootinfo)
|
||||
frappe.cache().set_value("bootinfo", bootinfo, user=True)
|
||||
|
||||
bootinfo["metadata_version"] = frappe.cache().get_value("metadata_version")
|
||||
if not bootinfo["metadata_version"]:
|
||||
|
|
@ -165,7 +152,7 @@ class Session:
|
|||
(str(self.data['data']), self.data['user'], self.data['sid']))
|
||||
|
||||
# also add to memcache
|
||||
frappe.cache().set_value("session:" + self.data.sid, self.data)
|
||||
frappe.cache().set_value("session:" + self.data.sid, self.data, user=self.user)
|
||||
|
||||
def resume(self):
|
||||
"""non-login request: load a session"""
|
||||
|
|
@ -201,7 +188,7 @@ class Session:
|
|||
return data
|
||||
|
||||
def get_session_data_from_cache(self):
|
||||
data = frappe._dict(frappe.cache().get_value("session:" + self.sid) or {})
|
||||
data = frappe._dict(frappe.cache().get_value("session:" + self.sid, user=self.user) or {})
|
||||
if data:
|
||||
session_data = data.get("data", {})
|
||||
self.time_diff = frappe.utils.time_diff_in_seconds(frappe.utils.now(),
|
||||
|
|
@ -234,7 +221,7 @@ class Session:
|
|||
return (cint(parts[0]) * 3600) + (cint(parts[1]) * 60) + cint(parts[2])
|
||||
|
||||
def delete_session(self):
|
||||
delete_session(self.sid)
|
||||
delete_session(self.sid, user=self.user)
|
||||
|
||||
def start_as_guest(self):
|
||||
"""all guests share the same 'Guest' session"""
|
||||
|
|
@ -266,7 +253,7 @@ class Session:
|
|||
updated_in_db = True
|
||||
|
||||
# set in memcache
|
||||
frappe.cache().set_value("session:" + self.sid, self.data)
|
||||
frappe.cache().set_value("session:" + self.sid, self.data, user=self.user)
|
||||
|
||||
return updated_in_db
|
||||
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ def get_user_lang(user=None):
|
|||
user = frappe.session.user
|
||||
|
||||
# via cache
|
||||
lang = frappe.cache().get_value("lang:" + user)
|
||||
lang = frappe.cache().get_value("lang", user=user)
|
||||
|
||||
if not lang:
|
||||
|
||||
|
|
@ -62,7 +62,7 @@ def get_user_lang(user=None):
|
|||
default_lang = frappe.db.get_default("lang")
|
||||
lang = default_lang or frappe.local.lang
|
||||
|
||||
frappe.cache().set_value("lang:" + user, lang or "en")
|
||||
frappe.cache().set_value("lang", lang or "en", user=user)
|
||||
|
||||
return lang
|
||||
|
||||
|
|
|
|||
|
|
@ -63,11 +63,11 @@ def get_allowed_functions_for_jenv():
|
|||
"get_list": frappe.get_list,
|
||||
"get_all": frappe.get_all,
|
||||
"utils": datautils,
|
||||
"user": frappe.local.session.user,
|
||||
"user": hasattr(frappe.local, "session") and frappe.local.session.user or "Guest",
|
||||
"date_format": frappe.db.get_default("date_format") or "yyyy-mm-dd",
|
||||
"get_fullname": frappe.utils.get_fullname,
|
||||
"get_gravatar": frappe.utils.get_gravatar,
|
||||
"full_name": frappe.local.session.data.full_name
|
||||
"full_name": hasattr(frappe.local, "session") and frappe.local.session.data.full_name or "Guest"
|
||||
},
|
||||
"autodoc": {
|
||||
"get_version": get_version,
|
||||
|
|
|
|||
|
|
@ -6,28 +6,38 @@ import redis, frappe, cPickle as pickle
|
|||
|
||||
class RedisWrapper(redis.Redis):
|
||||
"""Redis client that will automatically prefix conf.db_name"""
|
||||
def n(self, key):
|
||||
def make_key(self, key, user=None):
|
||||
if user:
|
||||
print user
|
||||
if user == True:
|
||||
user = frappe.session.user
|
||||
|
||||
key = "user:{0}:{1}".format(user, key)
|
||||
|
||||
return (frappe.conf.db_name + "|" + key).encode('utf-8')
|
||||
|
||||
def set_value(self, key, val):
|
||||
def set_value(self, key, val, user=None):
|
||||
"""Sets cache value."""
|
||||
key = self.make_key(key, user)
|
||||
frappe.local.cache[key] = val
|
||||
self.set(self.n(key), pickle.dumps(val))
|
||||
self.set(key, pickle.dumps(val))
|
||||
|
||||
def get_value(self, key, generator=None):
|
||||
def get_value(self, key, generator=None, user=None):
|
||||
"""Returns cache value. If not found and generator function is
|
||||
given, it will call the generator.
|
||||
|
||||
:param key: Cache key.
|
||||
:param generator: Function to be called to generate a value if `None` is returned."""
|
||||
original_key = key
|
||||
key = self.make_key(key, user)
|
||||
val = frappe.local.cache.get(key)
|
||||
if val is None:
|
||||
val = self.get(self.n(key))
|
||||
val = self.get(key)
|
||||
if val is not None:
|
||||
val = pickle.loads(val)
|
||||
if val is None and generator:
|
||||
val = generator()
|
||||
self.set_value(key, val)
|
||||
self.set_value(original_key, val, user=user)
|
||||
else:
|
||||
frappe.local.cache[key] = val
|
||||
return val
|
||||
|
|
@ -41,17 +51,18 @@ class RedisWrapper(redis.Redis):
|
|||
|
||||
def get_keys(self, key):
|
||||
"""Return keys with wildcard `*`."""
|
||||
return self.keys(self.n(key + "*"))
|
||||
return self.keys(self.make_key(key + "*"))
|
||||
|
||||
def delete_keys(self, key):
|
||||
"""Delete keys with wildcard `*`."""
|
||||
self.delete_value(self.get_keys(key))
|
||||
|
||||
def delete_value(self, keys):
|
||||
def delete_value(self, keys, user=None):
|
||||
"""Delete value, list of values."""
|
||||
if not isinstance(keys, (list, tuple)):
|
||||
keys = (keys,)
|
||||
for key in keys:
|
||||
self.delete(self.n(key))
|
||||
key = self.make_key(key, user=user)
|
||||
self.delete(key)
|
||||
if key in frappe.local.cache:
|
||||
del frappe.local.cache[key]
|
||||
|
|
|
|||
|
|
@ -220,19 +220,19 @@ def add_system_manager(email, first_name=None, last_name=None):
|
|||
where name not in ("Administrator", "Guest", "All")""")
|
||||
user.add_roles(*roles)
|
||||
|
||||
def get_roles(username=None, with_standard=True):
|
||||
def get_roles(user=None, with_standard=True):
|
||||
"""get roles of current user"""
|
||||
if not username:
|
||||
username = frappe.session.user
|
||||
if not user:
|
||||
user = frappe.session.user
|
||||
|
||||
if username=='Guest':
|
||||
if user=='Guest':
|
||||
return ['Guest']
|
||||
|
||||
roles = frappe.cache().get_value("roles:" + username)
|
||||
roles = frappe.cache().get_value("roles", user=user)
|
||||
if not roles:
|
||||
roles = [r[0] for r in frappe.db.sql("""select role from tabUserRole
|
||||
where parent=%s and role!='All'""", (username,))] + ['All']
|
||||
frappe.cache().set_value("roles:" + username, roles)
|
||||
where parent=%s and role!='All'""", (user,))] + ['All']
|
||||
frappe.cache().set_value("roles", roles, user=user)
|
||||
|
||||
# filter standard if required
|
||||
if not with_standard:
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ def get_home_page():
|
|||
|
||||
return home_page
|
||||
|
||||
return frappe.cache().get_value("home_page:" + frappe.session.user, _get_home_page)
|
||||
return frappe.cache().get_value("home_page", _get_home_page, user=True)
|
||||
|
||||
def is_signup_enabled():
|
||||
if getattr(frappe.local, "is_signup_enabled", None) is None:
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ markupsafe
|
|||
mysql-python==1.2.5
|
||||
pygeoip
|
||||
python-dateutil
|
||||
python-memcached
|
||||
pytz
|
||||
six
|
||||
slugify
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue