@@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json | |||
from .exceptions import * | |||
from .utils.jinja import get_jenv, get_template, render_template | |||
__version__ = '7.1.12' | |||
__version__ = '7.1.13' | |||
__title__ = "Frappe Framework" | |||
local = Local() | |||
@@ -135,6 +135,8 @@ def init(site, sites_path=None, new_site=False): | |||
local.jenv = None | |||
local.jloader =None | |||
local.cache = {} | |||
local.form_dict = _dict() | |||
local.session = _dict() | |||
setup_module_map() | |||
@@ -149,8 +151,6 @@ def connect(site=None, db_name=None): | |||
if site: | |||
init(site) | |||
local.db = Database(user=db_name or local.conf.db_name) | |||
local.form_dict = _dict() | |||
local.session = _dict() | |||
set_user("Administrator") | |||
def get_site_config(sites_path=None, site_path=None): | |||
@@ -1,14 +0,0 @@ | |||
{ | |||
"app_url": "https://frappe.github.io/paypal_integration", | |||
"app_name": "paypal_integration", | |||
"app_icon": "octicon octicon-credit-card", | |||
"app_color": "#179bd7", | |||
"app_description": "Accept Payment via PayPal", | |||
"app_publisher": "Frappe", | |||
"app_email": "hello@frappe.io", | |||
"repo_url": "https://github.com/frappe/paypal_integration.git", | |||
"app_title": "Paypal Integration", | |||
"app_version": "1.0.0", | |||
"app_category": "Integrations", | |||
"featured": 1 | |||
} |
@@ -1,14 +0,0 @@ | |||
{ | |||
"app_url": "https://frappe.github.io/razorpay_integration", | |||
"app_name": "razorpay_integration", | |||
"app_icon": "octicon octicon-credit-card", | |||
"app_color": "#179bd7", | |||
"app_description": "Accept Payment via Razorpay", | |||
"app_publisher": "Frappe", | |||
"app_email": "hello@frappe.io", | |||
"repo_url": "https://github.com/frappe/razorpay_integration.git", | |||
"app_title": "Razorpay Integration", | |||
"app_version": "1.0.0", | |||
"app_category": "Integrations", | |||
"featured": 1 | |||
} |
@@ -893,10 +893,14 @@ li .footer-child-item { | |||
padding-right: 15px; | |||
border-right: 1px solid #d1d8dd; | |||
} | |||
.shopping-cart .cart-icon .dropdown-toggle { | |||
text-decoration: none !important; | |||
} | |||
.badge-wrapper { | |||
min-height: 17px; | |||
min-width: 17px; | |||
display: inline-block; | |||
margin-left: 7px; | |||
margin-top: -3px; | |||
padding: 2px 7px; | |||
border: 1px solid #d1d8dd; | |||
border-radius: 3px; | |||
color: #7575ff; | |||
@@ -621,15 +621,21 @@ li .footer-child-item { | |||
padding-bottom:2000px; margin-bottom:-2000px;} | |||
.shopping-cart { | |||
.cart-icon { | |||
.dropdown-toggle { | |||
text-decoration: none !important; | |||
} | |||
} | |||
margin-top:12px; | |||
margin-bottom:8px; | |||
padding-right:15px; | |||
border-right: 1px solid @border-color; | |||
} | |||
.badge-wrapper { | |||
min-height: 17px; | |||
min-width: 17px; | |||
display: inline-block; | |||
margin-left: 7px; | |||
margin-top: -3px; | |||
padding: 2px 7px; | |||
border: 1px solid @border-color; | |||
border-radius: 3px; | |||
color: #7575ff; | |||
@@ -94,7 +94,7 @@ def get_dict(fortype, name=None): | |||
fortype = fortype.lower() | |||
cache = frappe.cache() | |||
asset_key = fortype + ":" + (name or "-") | |||
translation_assets = cache.hget("translation_assets", frappe.local.lang) or {} | |||
translation_assets = cache.hget("translation_assets", frappe.local.lang, shared=True) or {} | |||
if not asset_key in translation_assets: | |||
if fortype=="doctype": | |||
@@ -123,7 +123,7 @@ def get_dict(fortype, name=None): | |||
translation_assets[asset_key] = message_dict | |||
cache.hset("translation_assets", frappe.local.lang, translation_assets) | |||
cache.hset("translation_assets", frappe.local.lang, translation_assets, shared=True) | |||
return translation_assets[asset_key] | |||
@@ -203,7 +203,7 @@ def load_lang(lang, apps=None): | |||
if lang=='en': | |||
return {} | |||
out = frappe.cache().hget("lang_full_dict", lang) | |||
out = frappe.cache().hget("lang_full_dict", lang, shared=True) | |||
if not out: | |||
out = {} | |||
for app in (apps or frappe.get_all_apps(True)): | |||
@@ -216,7 +216,7 @@ def load_lang(lang, apps=None): | |||
parent_out.update(out) | |||
out = parent_out | |||
frappe.cache().hset("lang_full_dict", lang, out) | |||
frappe.cache().hset("lang_full_dict", lang, out, shared=True) | |||
return out or {} | |||
@@ -260,8 +260,8 @@ def clear_cache(): | |||
# clear translations saved in boot cache | |||
cache.delete_key("bootinfo") | |||
cache.delete_key("lang_full_dict") | |||
cache.delete_key("translation_assets") | |||
cache.delete_key("lang_full_dict", shared=True) | |||
cache.delete_key("translation_assets", shared=True) | |||
cache.delete_key("lang_user_translations") | |||
def get_messages_for_app(app): | |||
@@ -8,7 +8,9 @@ from frappe.utils import cstr | |||
class RedisWrapper(redis.Redis): | |||
"""Redis client that will automatically prefix conf.db_name""" | |||
def make_key(self, key, user=None): | |||
def make_key(self, key, user=None, shared=False): | |||
if shared: | |||
return key | |||
if user: | |||
if user == True: | |||
user = frappe.session.user | |||
@@ -100,23 +102,23 @@ class RedisWrapper(redis.Redis): | |||
def delete_key(self, *args, **kwargs): | |||
self.delete_value(*args, **kwargs) | |||
def delete_value(self, keys, user=None, make_keys=True): | |||
def delete_value(self, keys, user=None, make_keys=True, shared=False): | |||
"""Delete value, list of values.""" | |||
if not isinstance(keys, (list, tuple)): | |||
keys = (keys, ) | |||
for key in keys: | |||
if key in frappe.local.cache: | |||
del frappe.local.cache[key] | |||
if make_keys: | |||
key = self.make_key(key) | |||
key = self.make_key(key, shared=shared) | |||
try: | |||
self.delete(key) | |||
except redis.exceptions.ConnectionError: | |||
pass | |||
if key in frappe.local.cache: | |||
del frappe.local.cache[key] | |||
def lpush(self, key, value): | |||
super(redis.Redis, self).lpush(self.make_key(key), value) | |||
@@ -129,12 +131,13 @@ class RedisWrapper(redis.Redis): | |||
def llen(self, key): | |||
return super(redis.Redis, self).llen(self.make_key(key)) | |||
def hset(self, name, key, value): | |||
def hset(self, name, key, value, shared=False): | |||
if not name in frappe.local.cache: | |||
frappe.local.cache[name] = {} | |||
frappe.local.cache[name][key] = value | |||
try: | |||
super(redis.Redis, self).hset(self.make_key(name), key, pickle.dumps(value)) | |||
super(redis.Redis, self).hset(self.make_key(name, shared=shared), | |||
key, pickle.dumps(value)) | |||
except redis.exceptions.ConnectionError: | |||
pass | |||
@@ -142,7 +145,7 @@ class RedisWrapper(redis.Redis): | |||
return {key: pickle.loads(value) for key, value in | |||
super(redis.Redis, self).hgetall(self.make_key(name)).iteritems()} | |||
def hget(self, name, key, generator=None): | |||
def hget(self, name, key, generator=None, shared=False): | |||
if not name in frappe.local.cache: | |||
frappe.local.cache[name] = {} | |||
if key in frappe.local.cache[name]: | |||
@@ -150,7 +153,7 @@ class RedisWrapper(redis.Redis): | |||
value = None | |||
try: | |||
value = super(redis.Redis, self).hget(self.make_key(name), key) | |||
value = super(redis.Redis, self).hget(self.make_key(name, shared=shared), key) | |||
except redis.exceptions.ConnectionError: | |||
pass | |||
@@ -165,12 +168,12 @@ class RedisWrapper(redis.Redis): | |||
pass | |||
return value | |||
def hdel(self, name, key): | |||
def hdel(self, name, key, shared=False): | |||
if name in frappe.local.cache: | |||
if key in frappe.local.cache[name]: | |||
del frappe.local.cache[name][key] | |||
try: | |||
super(redis.Redis, self).hdel(self.make_key(name), key) | |||
super(redis.Redis, self).hdel(self.make_key(name, shared=shared), key) | |||
except redis.exceptions.ConnectionError: | |||
pass | |||
@@ -270,6 +270,10 @@ def make_layout(doc, meta, format_data=None): | |||
doc.set(df.fieldname, True) # show this field | |||
if is_visible(df, doc) and has_value(df, doc): | |||
if page[-1]['columns'] == []: | |||
# if no column, add one | |||
page[-1]['columns'].append({'fields': []}) | |||
page[-1]['columns'][-1]['fields'].append(df) | |||
# section has fields | |||