This commit is contained in:
Rushabh Mehta 2014-12-22 18:37:29 +05:30 committed by Anand Doshi
parent 812a969c54
commit cd9a34616f
15 changed files with 103 additions and 6441 deletions

View file

@ -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):

File diff suppressed because one or more lines are too long

View file

@ -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;

View file

@ -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;">
&dash; {%= 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;">
&dash; {%= 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;">
&dash; {%= 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>

View file

@ -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;
}

View file

@ -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; \

View file

@ -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");
}

View file

@ -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"));

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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]

View file

@ -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:

View file

@ -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:

View file

@ -9,7 +9,6 @@ markupsafe
mysql-python==1.2.5
pygeoip
python-dateutil
python-memcached
pytz
six
slugify