merge upstream
bzr revid: chs@openerp.com-20120718143252-4026zfkh5hcfcpr1
This commit is contained in:
+14
-71
@@ -417,6 +417,18 @@ class ControllerType(type):
|
||||
class Controller(object):
|
||||
__metaclass__ = ControllerType
|
||||
|
||||
class DisableCacheMiddleware(object):
|
||||
def __init__(self, app):
|
||||
self.app = app
|
||||
def __call__(self, environ, start_response):
|
||||
def start_wrapped(status, headers):
|
||||
debug = environ.get('HTTP_REFERER', '').find('debug') != -1
|
||||
filtered_headers = [(k,v) for k,v in headers if not (k=='Last-Modified' or (debug and k=='Cache-Control'))]
|
||||
if debug:
|
||||
filtered_headers.append(('Cache-Control', 'no-cache'))
|
||||
start_response(status, filtered_headers)
|
||||
return self.app(environ, start_wrapped)
|
||||
|
||||
class Root(object):
|
||||
"""Root WSGI application for the OpenERP Web Client.
|
||||
|
||||
@@ -452,8 +464,8 @@ class Root(object):
|
||||
|
||||
static_dirs = self._load_addons(openerp_addons_namespace)
|
||||
if options.serve_static:
|
||||
self.dispatch = SuperSharedDataMiddleware(
|
||||
self.dispatch, static_dirs, cache=False)
|
||||
app = werkzeug.wsgi.SharedDataMiddleware( self.dispatch, static_dirs)
|
||||
self.dispatch = DisableCacheMiddleware(app)
|
||||
|
||||
if options.session_storage:
|
||||
if not os.path.exists(options.session_storage):
|
||||
@@ -555,75 +567,6 @@ class Root(object):
|
||||
return m
|
||||
ps, _slash, meth = ps.rpartition('/')
|
||||
return None
|
||||
|
||||
class SuperSharedDataMiddleware(werkzeug.wsgi.SharedDataMiddleware):
|
||||
"""Redefine SharedDataMiddleware to better handle the cache = False directive.
|
||||
Also desactivate 304 Not Modified headers only when the referer has 'debug' in its
|
||||
arguments.
|
||||
"""
|
||||
def __call__(self, environ, start_response):
|
||||
import os
|
||||
import mimetypes
|
||||
import werkzeug.http
|
||||
import urlparse
|
||||
# sanitize the path for non unix systems
|
||||
cleaned_path = environ.get('PATH_INFO', '').strip('/')
|
||||
for sep in os.sep, os.altsep:
|
||||
if sep and sep != '/':
|
||||
cleaned_path = cleaned_path.replace(sep, '/')
|
||||
path = '/'.join([''] + [x for x in cleaned_path.split('/')
|
||||
if x and x != '..'])
|
||||
file_loader = None
|
||||
for search_path, loader in self.exports.iteritems():
|
||||
if search_path == path:
|
||||
real_filename, file_loader = loader(None)
|
||||
if file_loader is not None:
|
||||
break
|
||||
if not search_path.endswith('/'):
|
||||
search_path += '/'
|
||||
if path.startswith(search_path):
|
||||
real_filename, file_loader = loader(path[len(search_path):])
|
||||
if file_loader is not None:
|
||||
break
|
||||
if file_loader is None or not self.is_allowed(real_filename):
|
||||
return self.app(environ, start_response)
|
||||
|
||||
guessed_type = mimetypes.guess_type(real_filename)
|
||||
mime_type = guessed_type[0] or self.fallback_mimetype
|
||||
f, mtime, file_size = file_loader()
|
||||
|
||||
etag = self.generate_etag(mtime, file_size, real_filename)
|
||||
modified = werkzeug.http.is_resource_modified(environ, etag, last_modified=mtime)
|
||||
|
||||
headers = [('Date', werkzeug.http.http_date())]
|
||||
if self.cache:
|
||||
timeout = self.cache_timeout
|
||||
headers += [
|
||||
('Etag', '"%s"' % etag),
|
||||
('Cache-Control', 'max-age=%d, public' % timeout)
|
||||
]
|
||||
if modified:
|
||||
headers.append(('Expires', werkzeug.http.http_date(time() + timeout)))
|
||||
else:
|
||||
headers.append(('Cache-Control', 'no-cache'))
|
||||
|
||||
referer = environ.get('HTTP_REFERER', '')
|
||||
parsed = urlparse.urlparse(referer)
|
||||
debug = not urlparse.parse_qs(parsed.query).has_key('debug')
|
||||
# it's important to put it at the end
|
||||
if not debug and not modified:
|
||||
f.close()
|
||||
start_response('304 Not Modified', headers)
|
||||
return []
|
||||
|
||||
headers.extend((
|
||||
('Content-Type', mime_type),
|
||||
('Content-Length', str(file_size)),
|
||||
('Last-Modified', werkzeug.http.http_date(mtime))
|
||||
))
|
||||
start_response('200 OK', headers)
|
||||
return werkzeug.wsgi.wrap_file(environ, f)
|
||||
|
||||
|
||||
class LibException(Exception):
|
||||
""" Base of all client lib exceptions """
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@charset "utf-8";
|
||||
@charset "UTF-8";
|
||||
@font-face {
|
||||
font-family: "mnmliconsRegular";
|
||||
src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot");
|
||||
@@ -34,7 +34,7 @@
|
||||
background: white;
|
||||
/* http://www.quirksmode.org/dom/inputfile.html
|
||||
* http://stackoverflow.com/questions/2855589/replace-input-type-file-by-an-image
|
||||
*/ */
|
||||
*/
|
||||
}
|
||||
.openerp a {
|
||||
text-decoration: none;
|
||||
@@ -234,14 +234,13 @@
|
||||
.openerp.ui-dialog .ui-dialog-buttonpane {
|
||||
border-top: 1px solid #e0e0e0;
|
||||
background: #f5f7f9;
|
||||
padding: 8px;
|
||||
margin: 0;
|
||||
-moz-border-radius: 0 0 2px 2px;
|
||||
-webkit-border-radius: 0 0 2px 2px;
|
||||
border-radius: 0 0 2px 2px;
|
||||
}
|
||||
.openerp.ui-dialog .ui-dialog-buttonpane button {
|
||||
margin-left: 8px;
|
||||
margin: 0;
|
||||
}
|
||||
.openerp.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
|
||||
float: left;
|
||||
@@ -1855,9 +1854,12 @@
|
||||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer label:after {
|
||||
content: ":";
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer label.oe_subtotal_footer_separator {
|
||||
font-weight: bold !important;
|
||||
padding: 2px 8px 2px 0px !important;
|
||||
padding: 2px 11px 2px 0px !important;
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer label.oe_form_label_help {
|
||||
font-weight: normal;
|
||||
@@ -2061,15 +2063,6 @@
|
||||
.openerp .oe_form .oe_form_field_with_button.oe_no_button > .oe_button {
|
||||
display: none;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_with_button:not(.oe_no_button) input {
|
||||
border-right: none;
|
||||
-webkit-border-top-right-radius: 0px;
|
||||
-webkit-border-bottom-right-radius: 0px;
|
||||
-moz-border-radius-topright: 0px;
|
||||
-moz-border-radius-bottomright: 0px;
|
||||
border-top-right-radius: 0px;
|
||||
border-bottom-right-radius: 0px;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_with_button:not(.oe_no_button) > .oe_button {
|
||||
float: right;
|
||||
-moz-border-radius: 0;
|
||||
@@ -2148,9 +2141,12 @@
|
||||
}
|
||||
.openerp .oe_form_field_many2one span.oe_m2o_drop_down_button {
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
top: 2px;
|
||||
right: 0px;
|
||||
}
|
||||
.openerp .oe_form_field_many2one .oe_m2o_cm_button {
|
||||
line-height: 14px;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_one2many > .oe_view_manager .oe_list_pager_single_page {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -232,11 +232,10 @@ $sheet-max-width: 860px
|
||||
.ui-dialog-buttonpane
|
||||
border-top: 1px solid #e0e0e0
|
||||
background: #f5f7f9
|
||||
padding: 8px
|
||||
margin: 0
|
||||
@include radius(0 0 2px 2px)
|
||||
button
|
||||
margin-left: 8px
|
||||
margin: 0
|
||||
.ui-dialog-buttonset
|
||||
float: left
|
||||
.ui-dialog-titlebar-close
|
||||
@@ -1444,9 +1443,11 @@ $sheet-max-width: 860px
|
||||
border-top: 1px solid #cacaca
|
||||
font-weight: bold
|
||||
font-size: 18px
|
||||
label:after
|
||||
content: ":"
|
||||
label.oe_subtotal_footer_separator
|
||||
font-weight: bold !important
|
||||
padding: 2px 8px 2px 0px !important
|
||||
padding: 2px 11px 2px 0px !important
|
||||
label.oe_form_label_help
|
||||
font-weight: normal
|
||||
// no sheet in popups
|
||||
@@ -1610,14 +1611,6 @@ $sheet-max-width: 860px
|
||||
.oe_form_field_with_button.oe_no_button > .oe_button
|
||||
display: none
|
||||
.oe_form_field_with_button:not(.oe_no_button)
|
||||
input
|
||||
border-right: none
|
||||
-webkit-border-top-right-radius: 0px
|
||||
-webkit-border-bottom-right-radius: 0px
|
||||
-moz-border-radius-topright: 0px
|
||||
-moz-border-radius-bottomright: 0px
|
||||
border-top-right-radius: 0px
|
||||
border-bottom-right-radius: 0px
|
||||
> .oe_button
|
||||
float: right
|
||||
@include radius(0)
|
||||
@@ -1691,8 +1684,10 @@ $sheet-max-width: 860px
|
||||
position: relative
|
||||
span.oe_m2o_drop_down_button
|
||||
position: absolute
|
||||
top: 1px
|
||||
top: 2px
|
||||
right: 0px
|
||||
.oe_m2o_cm_button
|
||||
line-height: 14px
|
||||
// }}}
|
||||
// FormView.one2many {{{
|
||||
.oe_form .oe_form_field_one2many > .oe_view_manager
|
||||
|
||||
@@ -2739,10 +2739,20 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
|
||||
this.$input.val(str.split("\n")[0]);
|
||||
this.current_display = this.$input.val();
|
||||
} else {
|
||||
str = _.escape(str).split("\n").join("<br />");
|
||||
var lines = _.escape(str).split("\n");
|
||||
var link = "";
|
||||
var follow = "";
|
||||
if (! this.get_definition_options().highlight_first_line) {
|
||||
link = lines.join("<br />");
|
||||
} else {
|
||||
link = lines[0];
|
||||
follow = _.rest(lines).join("<br />");
|
||||
if (follow)
|
||||
link += "<br />";
|
||||
}
|
||||
this.$element.find('a')
|
||||
.unbind('click')
|
||||
.html(str)
|
||||
.html(link)
|
||||
.click(function () {
|
||||
self.do_action({
|
||||
type: 'ir.actions.act_window',
|
||||
@@ -2754,6 +2764,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
|
||||
});
|
||||
return false;
|
||||
});
|
||||
$(".oe_form_m2o_follow").html(follow);
|
||||
}
|
||||
},
|
||||
set_value: function(value_) {
|
||||
|
||||
@@ -951,11 +951,12 @@
|
||||
</t>
|
||||
<t t-name="FieldMany2One">
|
||||
<span class="oe_form_field oe_form_field_many2one oe_form_field_with_button" t-att-style="widget.node.attrs.style">
|
||||
<a t-if="widget.get('effective_readonly')" href="#" class="oe_form_uri"/>
|
||||
<t t-if="widget.get('effective_readonly')">
|
||||
<a href="#" class="oe_form_uri"/>
|
||||
<span class="oe_form_m2o_follow"/>
|
||||
</t>
|
||||
<t t-if="!widget.get('effective_readonly')">
|
||||
<button class="oe_button oe_m2o_cm_button" title="Open Resource">
|
||||
<img t-att-src='_s + "/web/static/src/img/icons/terp-folder-yellow.png"'/>
|
||||
</button>
|
||||
<a href="#" class="oe_m2o_cm_button oe_e oe_right">/</a>
|
||||
<div>
|
||||
<input type="text"
|
||||
t-att-id="widget.id_for_label"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
@charset "utf-8";
|
||||
.openerp .oe_kanban_view {
|
||||
background: url(data:image/pngbase64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAKElEQVQIHWP8DwTv379nAAFBQUEGhnfv3oHEwADEZgJLIRGMIClkLQCr3x2Htp/lLwAAAABJRU5ErkJggg==);
|
||||
background: url(/web/static/src/img/form_sheetbg.png);
|
||||
height: inherit;
|
||||
}
|
||||
.openerp .oe_kanban_view .ui-sortable-placeholder {
|
||||
@@ -239,6 +238,9 @@
|
||||
.openerp .oe_kanban_view .oe_kanban_grouped .oe_kanban_show_more .oe_button {
|
||||
width: 100%;
|
||||
}
|
||||
.openerp .oe_kanban_view .oe_kanban_ungrouped {
|
||||
background: white;
|
||||
}
|
||||
.openerp .oe_kanban_view .oe_kanban_ungrouped .oe_kanban_record {
|
||||
float: left;
|
||||
padding: 2px;
|
||||
@@ -399,17 +401,23 @@
|
||||
position: relative;
|
||||
top: 2px;
|
||||
}
|
||||
.openerp .oe_kanban_view .oe_kanban_project_times li {
|
||||
float: left;
|
||||
}
|
||||
.openerp .oe_kanban_view .oe_kanban_status {
|
||||
position: relative;
|
||||
top: 4px;
|
||||
display: inline-block;
|
||||
height: 12px;
|
||||
width: 12px;
|
||||
margin: 4px auto;
|
||||
-moz-border-radius: 6px;
|
||||
-webkit-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
|
||||
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
|
||||
-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
|
||||
background-position: center center;
|
||||
background-image: -webkit-radial-gradient(circle, #eeeeee 0%, #cccccc 40%, #bbbbbb 100%);
|
||||
background-image: -moz-radial-gradient(#eeeeee 0%, #cccccc 40%, #bbbbbb 100%);
|
||||
background-image: -ms-radial-gradient(#eeeeee 0%, #cccccc 40%, #bbbbbb 100%);
|
||||
background-image: radial-gradient(#eeeeee 0%, #cccccc 40%, #bbbbbb 100%);
|
||||
}
|
||||
.openerp .oe_kanban_view .oe_kanban_status_green {
|
||||
background: green;
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
|
||||
.openerp .oe_kanban_view
|
||||
// KanbanView {{{
|
||||
background: url(data:image/pngbase64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAKElEQVQIHWP8DwTv379nAAFBQUEGhnfv3oHEwADEZgJLIRGMIClkLQCr3x2Htp/lLwAAAABJRU5ErkJggg==)
|
||||
//background: url(data:image/pngbase64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAKElEQVQIHWP8DwTv379nAAFBQUEGhnfv3oHEwADEZgJLIRGMIClkLQCr3x2Htp/lLwAAAABJRU5ErkJggg==)
|
||||
background: url(/web/static/src/img/form_sheetbg.png)
|
||||
height: inherit
|
||||
.ui-sortable-placeholder
|
||||
border: 1px dotted black
|
||||
@@ -214,12 +215,14 @@
|
||||
text-align: center
|
||||
.oe_kanban_grouped .oe_kanban_show_more .oe_button
|
||||
width: 100%
|
||||
.oe_kanban_ungrouped .oe_kanban_record
|
||||
float: left
|
||||
padding: 2px
|
||||
box-sizing: border-box
|
||||
-moz-box-sizing: border-box
|
||||
-webkit-box-sizing: border-box
|
||||
.oe_kanban_ungrouped
|
||||
background: white
|
||||
.oe_kanban_record
|
||||
float: left
|
||||
padding: 2px
|
||||
box-sizing: border-box
|
||||
-moz-box-sizing: border-box
|
||||
-webkit-box-sizing: border-box
|
||||
.oe_kanban_action_button
|
||||
height: 22px
|
||||
margin: 0
|
||||
@@ -333,14 +336,18 @@
|
||||
float: right
|
||||
position: relative
|
||||
top: 2px
|
||||
|
||||
.oe_kanban_project_times li
|
||||
float: left
|
||||
|
||||
.oe_kanban_status
|
||||
position: relative
|
||||
top: 4px
|
||||
display: inline-block
|
||||
height: 12px
|
||||
width: 12px
|
||||
margin: 4px auto
|
||||
@include radius(6px)
|
||||
@include box-shadow(0 1px 3px rgba(0,0,0,0.6))
|
||||
@include radial-gradient((#eee 0%, #ccc 40%, #bbb 100%))
|
||||
.oe_kanban_status_green
|
||||
background: green
|
||||
@include radial-gradient((#55dd55 0%, #44aa44 40%, #339933 100%))
|
||||
|
||||
Reference in New Issue
Block a user