[MERGE] Forward-port of latest 7.0 bugfixes, up to rev. 9885 revid:dle@openerp.com-20140310114026-r0ijm0m36su19wn7

bzr revid: dle@openerp.com-20140310122101-gicombyc5ii0yz6a
This commit is contained in:
Denis Ledoux 2014-03-10 13:21:01 +01:00
commit c2ba11e72e
34 changed files with 2128 additions and 1057 deletions

View File

@ -1600,7 +1600,6 @@
<label for="value_amount" string="Amount To Pay" attrs="{'invisible':[('value','=','balance')]}"/> <label for="value_amount" string="Amount To Pay" attrs="{'invisible':[('value','=','balance')]}"/>
<div attrs="{'invisible':[('value','=','balance')]}"> <div attrs="{'invisible':[('value','=','balance')]}">
<field name="value_amount" class="oe_inline"/> <field name="value_amount" class="oe_inline"/>
<label string="%%" class="oe_inline" attrs="{'invisible':['!',('value','=','procent')]}" />
</div> </div>
</group> </group>
<group string="Due Date Computation"> <group string="Due Date Computation">

View File

@ -1623,6 +1623,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
def _set_recurrency_end_date(self, data, context=None): def _set_recurrency_end_date(self, data, context=None):
end_date = data.get('end_date') end_date = data.get('end_date')
rel_date = False
if data.get('recurrency') and data.get('end_type') in ('count', unicode('count')): if data.get('recurrency') and data.get('end_type') in ('count', unicode('count')):
data_date_deadline = datetime.strptime(data.get('date_deadline'), '%Y-%m-%d %H:%M:%S') data_date_deadline = datetime.strptime(data.get('date_deadline'), '%Y-%m-%d %H:%M:%S')
if data.get('rrule_type') in ('daily', unicode('count')): if data.get('rrule_type') in ('daily', unicode('count')):
@ -1633,7 +1634,9 @@ rule or repeating pattern of time to exclude from the recurring rule."),
rel_date = relativedelta(months=data.get('count')+1) rel_date = relativedelta(months=data.get('count')+1)
elif data.get('rrule_type') in ('yearly', unicode('yearly')): elif data.get('rrule_type') in ('yearly', unicode('yearly')):
rel_date = relativedelta(years=data.get('count')+1) rel_date = relativedelta(years=data.get('count')+1)
end_date = data_date_deadline + rel_date end_date = data_date_deadline
if rel_date:
end_date += rel_date
return end_date return end_date
def create(self, cr, uid, vals, context=None): def create(self, cr, uid, vals, context=None):

View File

@ -161,8 +161,7 @@
<page string="Recurrency Option" attrs="{'invisible': [('recurrency','=',False)]}"> <page string="Recurrency Option" attrs="{'invisible': [('recurrency','=',False)]}">
<group col="4" colspan="4" name="rrule"> <group col="4" colspan="4" name="rrule">
<group col="4" colspan="4"> <group col="4" colspan="4">
<field name="rrule_type" string="Recurrency period" <field name="rrule_type" string="Recurrency period" />
attrs="{'readonly':[('recurrent_id','!=',False)]}"/>
<field name="interval"/> <field name="interval"/>
<separator string="End of Recurrence" colspan="4"/> <separator string="End of Recurrence" colspan="4"/>
<field name="end_type"/> <field name="end_type"/>

View File

@ -32,6 +32,7 @@ Re-implement openerp's file import system:
], ],
'css': [ 'css': [
'static/lib/select2/select2.css', 'static/lib/select2/select2.css',
# TODO for trunk: add select2-bootstrap.css style (to download)
'static/src/css/import.css', 'static/src/css/import.css',
], ],
'js': [ 'js': [

View File

@ -1,12 +1,18 @@
Copyright 2012 Igor Vaynberg Copyright 2012 Igor Vaynberg
Version: @@ver@@ Timestamp: @@timestamp@@ Version: @@ver@@ Timestamp: @@timestamp@@
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
compliance with the License. You may obtain a copy of the License in the LICENSE file, or at: General Public License version 2 (the "GPL License"). You may choose either license to govern your
use of this software only upon the condition that you accept all of the terms of either the Apache
License or the GPL License.
You may obtain a copy of the Apache License and the GPL License at:
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
http://www.gnu.org/licenses/gpl-2.0.html
Unless required by applicable law or agreed to in writing, software distributed under the License is Unless required by applicable law or agreed to in writing, software distributed under the Apache License
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
See the License for the specific language governing permissions and limitations under the License. either express or implied. See the Apache License and the GPL License for the specific language governing
permissions and limitations under the Apache License and the GPL License.

View File

@ -1,39 +1,49 @@
Select2 Select2
================= =======
Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results. Look and feel of Select2 is based on the excellent [Chosen](http://harvesthq.github.com/chosen/) library. Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
To get started -- checkout http://ivaynberg.github.com/select2! To get started, checkout examples and documentation at http://ivaynberg.github.com/select2
What Does Select2 Support That Chosen Does Not? Use cases
------------------------------------------------- ---------
* Working with large datasets: Chosen requires the entire dataset to be loaded as `option` tags in the DOM, which limits * Enhancing native selects with search.
it to working with small-ish datasets. Select2 uses a function to find results on-the-fly, which allows it to partially * Enhancing native selects with a better multi-select interface.
load results. * Loading data from JavaScript: easily load items via ajax and have them searchable.
* Paging of results: Since Select2 works with large datasets and only loads a small amount of matching results at a time * Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
it has to support paging. Select2 will call the search function when the user scrolls to the bottom of currently loaded * Tagging: ability to add new items on the fly.
result set allowing for the 'infinite scrolling' of results. * Working with large, remote datasets: ability to partially load a dataset based on the search term.
* Custom markup for results: Chosen only supports rendering text results because that is the only markup supported by * Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
`option` tags. Select2 provides an extension point which can be used to produce any kind of markup to represent results. * Templating: support for custom rendering of results and selections.
* Ability to add results on the fly: Select2 provides the ability to add results from the search term entered by the user, which allows it to be used for
tagging.
Browser Compatibility Browser compatibility
-------------------- ---------------------
* IE 8+ (7 mostly works except for [issue with z-index](https://github.com/ivaynberg/select2/issues/37)) * IE 8+
* Chrome 8+ * Chrome 8+
* Firefox 3.5+ * Firefox 10+
* Safari 3+ * Safari 3+
* Opera 10.6+ * Opera 10.6+
Integrations Integrations
------------ ------------
* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / Apache Wicket) * [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails) * [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org)) * [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org))
* [Django](https://github.com/applegrew/django-select2) * [Django](https://github.com/applegrew/django-select2)
* [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
* [Bootstrap](https://github.com/t0m/select2-bootstrap-css) (CSS skin)
* [Yii](https://github.com/tonybolzan/yii-select2)
Internationalization (i18n)
---------------------------
Select2 supports multiple languages by simply including the right
language JS file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.).
Missing a language? Just copy `select2_locale_en.js.template`, translate
it, and make a pull request back to Select2 here on GitHub.
Bug tracker Bug tracker
----------- -----------
@ -42,7 +52,6 @@ Have a bug? Please create an issue here on GitHub!
https://github.com/ivaynberg/select2/issues https://github.com/ivaynberg/select2/issues
Mailing list Mailing list
------------ ------------
@ -53,16 +62,22 @@ select2@googlegroups.com
https://groups.google.com/d/forum/select2 https://groups.google.com/d/forum/select2
Copyright and License Copyright and license
--------------------- ---------------------
Copyright 2012 Igor Vaynberg Copyright 2012 Igor Vaynberg
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
compliance with the License. You may obtain a copy of the License in the LICENSE file, or at: General Public License version 2 (the "GPL License"). You may choose either license to govern your
use of this software only upon the condition that you accept all of the terms of either the Apache
License or the GPL License.
You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
http://www.gnu.org/licenses/gpl-2.0.html
Unless required by applicable law or agreed to in writing, software distributed under the License is Unless required by applicable law or agreed to in writing, software distributed under the Apache License
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
See the License for the specific language governing permissions and limitations under the License. either express or implied. See the Apache License and the GPL License for the specific language governing
permissions and limitations under the Apache License and the GPL License.

View File

@ -15,21 +15,33 @@ js="$name.js"
mini="$name.min.js" mini="$name.min.js"
css="$name.css" css="$name.css"
release="$name-$ver" release="$name-$ver"
releasedir="/tmp/$release" tag="$ver"
tag="release-$ver"
branch="build-$ver" branch="build-$ver"
curbranch=`git branch | grep "*" | sed "s/* //"` curbranch=`git branch | grep "*" | sed "s/* //"`
timestamp=$(date) timestamp=$(date)
tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g" tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
remote="github" remote="github"
echo "Pulling from origin"
git pull
echo "Updating Version Identifiers"
sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i "" bower.json select2.jquery.json
git add bower.json
git add select2.jquery.json
git commit -m "modified version identifiers in descriptors for release $ver"
git push
git branch "$branch" git branch "$branch"
git checkout "$branch" git checkout "$branch"
echo "Tokenizing..." echo "Tokenizing..."
find . -name "$js" | xargs sed -i -e "$tokens" find . -name "$js" | xargs -I{} sed -e "$tokens" -i "" {}
find . -name "$css" | xargs sed -i -e "$tokens" find . -name "$css" | xargs -I{} sed -e "$tokens" -i "" {}
sed -e "s/latest/$ver/g" -i "" bower.json
git add "$js" git add "$js"
git add "$css" git add "$css"
@ -41,11 +53,8 @@ cat LICENSE | sed "$tokens" >> "$mini"
echo "*/" >> "$mini" echo "*/" >> "$mini"
curl -s \ curl -s \
-d compilation_level=SIMPLE_OPTIMIZATIONS \
-d output_format=text \
-d output_info=compiled_code \
--data-urlencode "js_code@$js" \ --data-urlencode "js_code@$js" \
http://closure-compiler.appspot.com/compile \ http://marijnhaverbeke.nl/uglifyjs \
>> "$mini" >> "$mini"
git add "$mini" git add "$mini"
@ -53,25 +62,12 @@ git add "$mini"
git commit -m "release $ver" git commit -m "release $ver"
echo "Tagging..." echo "Tagging..."
git tag -a "$tag" -m "tagged version $ver" git tag -a "$tag" -m "tagged version $ver"
git push "$remote" --tags git push "$remote" --tags
echo "Archiving..."
rm -rf "$releasedir"
mkdir "$releasedir"
cp $name.* "$releasedir"
cp spinner.gif "$releasedir"
cp README.* "$releasedir"
zip -r "$releasedir.zip" "$releasedir"
rm -rf "$releasedir"
echo "Cleaning Up..." echo "Cleaning Up..."
git checkout "$curbranch" git checkout "$curbranch"
git branch -D "$branch" git branch -D "$branch"
echo "Done. Release archive created: $releasedir.zip" echo "Done"

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1,279 +1,317 @@
/* /*
Version: @@ver@@ Timestamp: @@timestamp@@ Version: 3.4.5 Timestamp: Mon Nov 4 08:22:42 PST 2013
*/ */
.select2-container { .select2-container {
margin: 0;
position: relative; position: relative;
display: inline-block; display: inline-block;
/* inline-block for ie7 */ /* inline-block for ie7 */
zoom: 1; zoom: 1;
*display: inline; *display: inline;
vertical-align: top; vertical-align: middle;
} }
.select2-container, .select2-container,
.select2-drop, .select2-drop,
.select2-search, .select2-search,
.select2-search input{ .select2-search input {
/* /*
Force border-box so that % widths fit the parent Force border-box so that % widths fit the parent
container without overlap because of margin/padding. container without overlap because of margin/padding.
More Info : http://www.quirksmode.org/css/box.html More Info : http://www.quirksmode.org/css/box.html
*/ */
-moz-box-sizing: border-box; /* firefox */
-ms-box-sizing: border-box; /* ie */
-webkit-box-sizing: border-box; /* webkit */ -webkit-box-sizing: border-box; /* webkit */
-khtml-box-sizing: border-box; /* konqueror */ -moz-box-sizing: border-box; /* firefox */
box-sizing: border-box; /* css3 */ box-sizing: border-box; /* css3 */
} }
.select2-container .select2-choice { .select2-container .select2-choice {
background-color: #fff;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
background-image: -o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%);
background-image: -ms-linear-gradient(top, #eeeeee 0%, #ffffff 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#ffffff', GradientType = 0);
background-image: linear-gradient(top, #eeeeee 0%, #ffffff 50%);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-moz-background-clip: padding;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #aaa;
display: block; display: block;
overflow: hidden;
white-space: nowrap;
position: relative;
height: 26px; height: 26px;
line-height: 26px;
padding: 0 0 0 8px; padding: 0 0 0 8px;
overflow: hidden;
position: relative;
border: 1px solid #aaa;
white-space: nowrap;
line-height: 26px;
color: #444; color: #444;
text-decoration: none; text-decoration: none;
border-radius: 4px;
background-clip: padding-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-color: #fff;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
background-image: linear-gradient(top, #fff 0%, #eee 50%);
} }
.select2-container.select2-drop-above .select2-choice .select2-container.select2-drop-above .select2-choice {
{
border-bottom-color: #aaa; border-bottom-color: #aaa;
-webkit-border-radius:0px 0px 4px 4px;
-moz-border-radius:0px 0px 4px 4px; border-radius: 0 0 4px 4px;
border-radius:0px 0px 4px 4px;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white)); background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%); background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 90%); background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 90%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 90%); background-image: linear-gradient(top, #eee 0%, #fff 90%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
background-image: linear-gradient(top, #eeeeee 0%,#ffffff 90%);
} }
.select2-container .select2-choice span { .select2-container.select2-allowclear .select2-choice .select2-chosen {
margin-right: 42px;
}
.select2-container .select2-choice > .select2-chosen {
margin-right: 26px; margin-right: 26px;
display: block; display: block;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
-o-text-overflow: ellipsis;
-ms-text-overflow: ellipsis;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.select2-container .select2-choice abbr { .select2-container .select2-choice abbr {
display: block; display: none;
position: absolute; width: 12px;
right: 26px; height: 12px;
top: 8px; position: absolute;
width: 12px; right: 24px;
height: 12px; top: 8px;
font-size: 1px;
background: url('select2.png') right top no-repeat; font-size: 1px;
cursor: pointer; text-decoration: none;
text-decoration: none;
border:0; border: 0;
outline: 0; background: url('select2.png') right top no-repeat;
cursor: pointer;
outline: 0;
} }
.select2-container.select2-allowclear .select2-choice abbr {
display: inline-block;
}
.select2-container .select2-choice abbr:hover { .select2-container .select2-choice abbr:hover {
background-position: right -11px; background-position: right -11px;
cursor: pointer; cursor: pointer;
}
.select2-drop-mask {
border: 0;
margin: 0;
padding: 0;
position: fixed;
left: 0;
top: 0;
min-height: 100%;
min-width: 100%;
height: auto;
width: auto;
opacity: 0;
z-index: 9998;
/* styles required for IE to work */
background-color: #fff;
filter: alpha(opacity=0);
} }
.select2-drop { .select2-drop {
width: 100%;
margin-top: -1px;
position: absolute;
z-index: 9999;
top: 100%;
background: #fff; background: #fff;
color: #000; color: #000;
border: 1px solid #aaa; border: 1px solid #aaa;
border-top: 0; border-top: 0;
position: absolute;
top: 100%;
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-o-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
z-index: 9999;
width:100%;
margin-top:-1px;
-webkit-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px;
-moz-border-radius: 0 0 4px 4px;
border-radius: 0 0 4px 4px; -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
}
.select2-drop-auto-width {
border-top: 1px solid #aaa;
width: auto;
}
.select2-drop-auto-width .select2-search {
padding-top: 4px;
} }
.select2-drop.select2-drop-above { .select2-drop.select2-drop-above {
-webkit-border-radius: 4px 4px 0px 0px; margin-top: 1px;
-moz-border-radius: 4px 4px 0px 0px;
border-radius: 4px 4px 0px 0px;
margin-top:1px;
border-top: 1px solid #aaa; border-top: 1px solid #aaa;
border-bottom: 0; border-bottom: 0;
border-radius: 4px 4px 0 0;
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-o-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
} }
.select2-container .select2-choice div { .select2-drop-active {
-webkit-border-radius: 0 4px 4px 0; border: 1px solid #5897fb;
-moz-border-radius: 0 4px 4px 0; border-top: none;
}
.select2-drop.select2-drop-above.select2-drop-active {
border-top: 1px solid #5897fb;
}
.select2-container .select2-choice .select2-arrow {
display: inline-block;
width: 18px;
height: 100%;
position: absolute;
right: 0;
top: 0;
border-left: 1px solid #aaa;
border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0;
-moz-background-clip: padding;
-webkit-background-clip: padding-box;
background-clip: padding-box; background-clip: padding-box;
background: #ccc; background: #ccc;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%); background-image: linear-gradient(top, #ccc 0%, #eee 60%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#cccccc', endColorstr = '#eeeeee', GradientType = 0);
background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%);
border-left: 1px solid #aaa;
position: absolute;
right: 0;
top: 0;
display: block;
height: 100%;
width: 18px;
} }
.select2-container .select2-choice div b { .select2-container .select2-choice .select2-arrow b {
background: url('select2.png') no-repeat 0 1px;
display: block; display: block;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: url('select2.png') no-repeat 0 1px;
} }
.select2-search { .select2-search {
display: inline-block; display: inline-block;
white-space: nowrap; width: 100%;
z-index: 10000; min-height: 26px;
min-height: 26px; margin: 0;
width: 100%; padding-left: 4px;
margin: 0; padding-right: 4px;
padding-left: 4px;
padding-right: 4px;
}
.select2-search-hidden { position: relative;
display: block; z-index: 10000;
position: absolute;
left: -10000px; white-space: nowrap;
} }
.select2-search input { .select2-search input {
background: #fff url('select2.png') no-repeat 100% -22px; width: 100%;
background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); height: auto !important;
background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); min-height: 26px;
background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
background: url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
padding: 4px 20px 4px 5px; padding: 4px 20px 4px 5px;
margin: 0;
outline: 0; outline: 0;
border: 1px solid #aaa;
font-family: sans-serif; font-family: sans-serif;
font-size: 1em; font-size: 1em;
width:100%;
margin:0; border: 1px solid #aaa;
height:auto !important;
min-height: 26px;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
border-radius: 0; border-radius: 0;
-moz-border-radius: 0;
-webkit-border-radius: 0; -webkit-box-shadow: none;
box-shadow: none;
background: #fff url('select2.png') no-repeat 100% -22px;
background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #fff 85%, #eee 99%);
} }
.select2-drop.select2-drop-above .select2-search input .select2-drop.select2-drop-above .select2-search input {
{ margin-top: 4px;
margin-top:4px;
} }
.select2-search input.select2-active { .select2-search input.select2-active {
background: #fff url('spinner.gif') no-repeat 100%; background: #fff url('select2-spinner.gif') no-repeat 100%;
background: url('spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
background: url('spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(top, #fff 85%, #eee 99%);
background: url('spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
background: url('spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
} }
.select2-container-active .select2-choice, .select2-container-active .select2-choice,
.select2-container-active .select2-choices { .select2-container-active .select2-choices {
-webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
-moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
-o-box-shadow : 0 0 5px rgba(0,0,0,.3);
box-shadow : 0 0 5px rgba(0,0,0,.3);
border: 1px solid #5897fb; border: 1px solid #5897fb;
outline: none; outline: none;
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
} }
.select2-dropdown-open .select2-choice { .select2-dropdown-open .select2-choice {
border: 1px solid #aaa; border-bottom-color: transparent;
border-bottom-color: transparent; -webkit-box-shadow: 0 1px 0 #fff inset;
-webkit-box-shadow: 0 1px 0 #fff inset; box-shadow: 0 1px 0 #fff inset;
-moz-box-shadow : 0 1px 0 #fff inset;
-o-box-shadow : 0 1px 0 #fff inset; border-bottom-left-radius: 0;
box-shadow : 0 1px 0 #fff inset; border-bottom-right-radius: 0;
background-color: #eee;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); background-color: #eee;
background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%); background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); background-image: linear-gradient(top, #fff 0%, #eee 50%);
background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%);
-webkit-border-bottom-left-radius : 0;
-webkit-border-bottom-right-radius: 0;
-moz-border-radius-bottomleft : 0;
-moz-border-radius-bottomright: 0;
border-bottom-left-radius : 0;
border-bottom-right-radius: 0;
} }
.select2-dropdown-open .select2-choice div { .select2-dropdown-open.select2-drop-above .select2-choice,
background: transparent; .select2-dropdown-open.select2-drop-above .select2-choices {
border-left: none; border: 1px solid #5897fb;
border-top-color: transparent;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
background-image: linear-gradient(bottom, #fff 0%, #eee 50%);
} }
.select2-dropdown-open .select2-choice div b {
background-position: -18px 1px; .select2-dropdown-open .select2-choice .select2-arrow {
background: transparent;
border-left: none;
filter: none;
}
.select2-dropdown-open .select2-choice .select2-arrow b {
background-position: -18px 1px;
} }
/* results */ /* results */
.select2-results { .select2-results {
margin: 4px 4px 4px 0; max-height: 200px;
padding: 0 0 0 4px; padding: 0 0 0 4px;
position: relative; margin: 4px 4px 4px 0;
overflow-x: hidden; position: relative;
overflow-y: auto; overflow-x: hidden;
max-height: 200px; overflow-y: auto;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
} }
.select2-results ul.select2-result-sub { .select2-results ul.select2-result-sub {
margin: 0 0 0 0; margin: 0;
padding-left: 0;
} }
.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px } .select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px }
@ -285,40 +323,59 @@ Version: @@ver@@ Timestamp: @@timestamp@@
.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px } .select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px }
.select2-results li { .select2-results li {
list-style: none; list-style: none;
display: list-item; display: list-item;
background-image: none;
} }
.select2-results li.select2-result-with-children > .select2-result-label { .select2-results li.select2-result-with-children > .select2-result-label {
font-weight: bold; font-weight: bold;
} }
.select2-results .select2-result-label { .select2-results .select2-result-label {
padding: 3px 7px 4px; padding: 3px 7px 4px;
margin: 0; margin: 0;
cursor: pointer; cursor: pointer;
min-height: 1em;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
} }
.select2-results .select2-highlighted { .select2-results .select2-highlighted {
background: #3875d7; background: #3875d7;
color: #fff; color: #fff;
} }
.select2-results li em { .select2-results li em {
background: #feffde; background: #feffde;
font-style: normal; font-style: normal;
} }
.select2-results .select2-highlighted em { .select2-results .select2-highlighted em {
background: transparent; background: transparent;
} }
.select2-results .select2-highlighted ul {
background: #fff;
color: #000;
}
.select2-results .select2-no-results, .select2-results .select2-no-results,
.select2-results .select2-searching, .select2-results .select2-searching,
.select2-results .select2-selection-limit { .select2-results .select2-selection-limit {
background: #f4f4f4; background: #f4f4f4;
display: list-item; display: list-item;
} }
/* /*
disabled look for already selected choices in the results dropdown disabled look for disabled choices in the results dropdown
*/
.select2-results .select2-disabled.select2-highlighted { .select2-results .select2-disabled.select2-highlighted {
color: #666; color: #666;
background: #f4f4f4; background: #f4f4f4;
@ -330,18 +387,18 @@ disabled look for already selected choices in the results dropdown
display: list-item; display: list-item;
cursor: default; cursor: default;
} }
*/
.select2-results .select2-disabled { .select2-results .select2-selected {
display: none; display: none;
} }
.select2-more-results.select2-active { .select2-more-results.select2-active {
background: #f4f4f4 url('spinner.gif') no-repeat 100%; background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
} }
.select2-more-results { .select2-more-results {
background: #f4f4f4; background: #f4f4f4;
display: list-item; display: list-item;
} }
/* disabled styles */ /* disabled styles */
@ -353,31 +410,39 @@ disabled look for already selected choices in the results dropdown
cursor: default; cursor: default;
} }
.select2-container.select2-container-disabled .select2-choice div { .select2-container.select2-container-disabled .select2-choice .select2-arrow {
background-color: #f4f4f4; background-color: #f4f4f4;
background-image: none; background-image: none;
border-left: 0; border-left: 0;
} }
.select2-container.select2-container-disabled .select2-choice abbr {
display: none;
}
/* multiselect */ /* multiselect */
.select2-container-multi .select2-choices { .select2-container-multi .select2-choices {
height: auto !important;
height: 1%;
margin: 0;
padding: 0;
position: relative;
border: 1px solid #aaa;
cursor: text;
overflow: hidden;
background-color: #fff; background-color: #fff;
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background-image: linear-gradient(top, #eee 1%, #fff 15%);
background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); }
background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%);
border: 1px solid #aaa; .select2-locked {
margin: 0; padding: 3px 5px 3px 5px !important;
padding: 0;
cursor: text;
overflow: hidden;
height: auto !important;
height: 1%;
position: relative;
} }
.select2-container-multi .select2-choices { .select2-container-multi .select2-choices {
@ -385,107 +450,107 @@ disabled look for already selected choices in the results dropdown
} }
.select2-container-multi.select2-container-active .select2-choices { .select2-container-multi.select2-container-active .select2-choices {
-webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
-moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
-o-box-shadow : 0 0 5px rgba(0,0,0,.3);
box-shadow : 0 0 5px rgba(0,0,0,.3);
border: 1px solid #5897fb; border: 1px solid #5897fb;
outline: none; outline: none;
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
} }
.select2-container-multi .select2-choices li { .select2-container-multi .select2-choices li {
float: left; float: left;
list-style: none; list-style: none;
} }
.select2-container-multi .select2-choices .select2-search-field { .select2-container-multi .select2-choices .select2-search-field {
white-space: nowrap; margin: 0;
margin: 0; padding: 0;
padding: 0; white-space: nowrap;
} }
.select2-container-multi .select2-choices .select2-search-field input { .select2-container-multi .select2-choices .select2-search-field input {
color: #666; padding: 5px;
background: transparent !important; margin: 1px 0;
font-family: sans-serif;
font-size: 100%; font-family: sans-serif;
height: 15px; font-size: 100%;
padding: 5px; color: #666;
margin: 1px 0; outline: 0;
outline: 0; border: 0;
border: 0; -webkit-box-shadow: none;
-webkit-box-shadow: none; box-shadow: none;
-moz-box-shadow : none; background: transparent !important;
-o-box-shadow : none;
box-shadow : none;
} }
.select2-container-multi .select2-choices .select2-search-field input.select2-active { .select2-container-multi .select2-choices .select2-search-field input.select2-active {
background: #fff url('spinner.gif') no-repeat 100% !important; background: #fff url('select2-spinner.gif') no-repeat 100% !important;
} }
.select2-default { .select2-default {
color: #999 !important; color: #999 !important;
} }
.select2-container-multi .select2-choices .select2-search-choice { .select2-container-multi .select2-choices .select2-search-choice {
-webkit-border-radius: 3px; padding: 3px 5px 3px 18px;
-moz-border-radius : 3px; margin: 3px 0 3px 5px;
border-radius : 3px; position: relative;
-moz-background-clip : padding;
-webkit-background-clip: padding-box; line-height: 13px;
background-clip : padding-box; color: #333;
background-color: #e4e4e4; cursor: default;
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); border: 1px solid #aaaaaa;
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); border-radius: 3px;
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); background-clip: padding-box;
-moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); -webkit-touch-callout: none;
color: #333; -webkit-user-select: none;
border: 1px solid #aaaaaa; -moz-user-select: none;
line-height: 13px; -ms-user-select: none;
padding: 3px 5px 3px 18px; user-select: none;
margin: 3px 0 3px 5px;
position: relative; background-color: #e4e4e4;
cursor: default; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
} }
.select2-container-multi .select2-choices .select2-search-choice span { .select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
cursor: default; cursor: default;
} }
.select2-container-multi .select2-choices .select2-search-choice-focus { .select2-container-multi .select2-choices .select2-search-choice-focus {
background: #d4d4d4; background: #d4d4d4;
} }
.select2-search-choice-close { .select2-search-choice-close {
display: block; display: block;
position: absolute; width: 12px;
right: 3px; height: 13px;
top: 4px; position: absolute;
width: 12px; right: 3px;
height: 13px; top: 4px;
font-size: 1px;
background: url('select2.png') right top no-repeat; font-size: 1px;
outline: none; outline: none;
background: url('select2.png') right top no-repeat;
} }
.select2-container-multi .select2-search-choice-close { .select2-container-multi .select2-search-choice-close {
left: 3px; left: 3px;
} }
.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover { .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
background-position: right -11px; background-position: right -11px;
} }
.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close { .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
background-position: right -11px; background-position: right -11px;
} }
/* disabled styles */ /* disabled styles */
.select2-container-multi.select2-container-disabled .select2-choices {
.select2-container-multi.select2-container-disabled .select2-choices{
background-color: #f4f4f4; background-color: #f4f4f4;
background-image: none; background-image: none;
border: 1px solid #ddd; border: 1px solid #ddd;
@ -493,32 +558,58 @@ disabled look for already selected choices in the results dropdown
} }
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice { .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
padding: 3px 5px 3px 5px;
border: 1px solid #ddd;
background-image: none; background-image: none;
background-color: #f4f4f4; background-color: #f4f4f4;
border: 1px solid #ddd;
padding: 3px 5px 3px 5px;
} }
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
display: none; background: none;
} }
/* end multiselect */ /* end multiselect */
.select2-result-selectable .select2-match, .select2-result-selectable .select2-match,
.select2-result-unselectable .select2-result-selectable .select2-match { text-decoration: underline; } .select2-result-unselectable .select2-match {
.select2-result-unselectable .select2-match { text-decoration: none; } text-decoration: underline;
}
.select2-offscreen { position: absolute; left: -10000px; } .select2-offscreen, .select2-offscreen:focus {
clip: rect(0 0 0 0) !important;
width: 1px !important;
height: 1px !important;
border: 0 !important;
margin: 0 !important;
padding: 0 !important;
overflow: hidden !important;
position: absolute !important;
outline: 0 !important;
left: 0px !important;
top: 0px !important;
}
.select2-display-none {
display: none;
}
.select2-measure-scrollbar {
position: absolute;
top: -10000px;
left: -10000px;
width: 100px;
height: 100px;
overflow: scroll;
}
/* Retina-ize icons */ /* Retina-ize icons */
@media only screen and (-webkit-min-device-pixel-ratio: 1.5) { @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi) {
.select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice div b { .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice .select2-arrow b {
background-image: url(select2x2.png) !important; background-image: url('select2x2.png') !important;
background-repeat: no-repeat !important; background-repeat: no-repeat !important;
background-size: 60px 40px !important; background-size: 60px 40px !important;
} }
.select2-search input { .select2-search input {
background-position: 100% -21px !important; background-position: 100% -21px !important;
} }
} }

View File

@ -0,0 +1,36 @@
{
"name": "select2",
"title": "Select2",
"description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
"keywords": [
"select",
"autocomplete",
"typeahead",
"dropdown",
"multiselect",
"tag",
"tagging"
],
"version": "3.4.5",
"author": {
"name": "Igor Vaynberg",
"url": "https://github.com/ivaynberg"
},
"licenses": [
{
"type": "Apache",
"url": "http://www.apache.org/licenses/LICENSE-2.0"
},
{
"type": "GPL v2",
"url": "http://www.gnu.org/licenses/gpl-2.0.html"
}
],
"bugs": "https://github.com/ivaynberg/select2/issues",
"homepage": "http://ivaynberg.github.com/select2",
"docs": "http://ivaynberg.github.com/select2/",
"download": "https://github.com/ivaynberg/select2/tags",
"dependencies": {
"jquery": ">=1.7.1"
}
}

File diff suppressed because one or more lines are too long

View File

@ -482,5 +482,13 @@ openerp.base_import = function (instance) {
{ name: 'import_succeeded', from: 'importing', to: 'imported'}, { name: 'import_succeeded', from: 'importing', to: 'imported'},
{ name: 'import_failed', from: 'importing', to: 'results' } { name: 'import_failed', from: 'importing', to: 'results' }
] ]
}) });
$.extend($.fn.select2.defaults, {
formatNoMatches: function () { return _t("No matches found"); },
formatLoadMore: function (pageNumber) { return _t("Loading more results..."); },
formatSearching: function () { return _t("Searching..."); }
});
}; };

View File

@ -406,7 +406,7 @@ class crm_lead(format_address, osv.osv):
'probability = 0 %, select "Change Probability Automatically".\n' 'probability = 0 %, select "Change Probability Automatically".\n'
'Create a specific stage or edit an existing one by editing columns of your opportunity pipe.')) 'Create a specific stage or edit an existing one by editing columns of your opportunity pipe.'))
for stage_id, lead_ids in stages_leads.items(): for stage_id, lead_ids in stages_leads.items():
self.write(cr, uid, lead_ids, {'stage_id': stage_id}, context=context) self.write(cr, uid, lead_ids, {'stage_id': stage_id, 'date_closed': fields.datetime.now()}, context=context)
return True return True
def case_mark_won(self, cr, uid, ids, context=None): def case_mark_won(self, cr, uid, ids, context=None):
@ -427,7 +427,7 @@ class crm_lead(format_address, osv.osv):
'probability = 100 % and select "Change Probability Automatically".\n' 'probability = 100 % and select "Change Probability Automatically".\n'
'Create a specific stage or edit an existing one by editing columns of your opportunity pipe.')) 'Create a specific stage or edit an existing one by editing columns of your opportunity pipe.'))
for stage_id, lead_ids in stages_leads.items(): for stage_id, lead_ids in stages_leads.items():
self.write(cr, uid, lead_ids, {'stage_id': stage_id}, context=context) self.write(cr, uid, lead_ids, {'stage_id': stage_id, 'date_closed': fields.datetime.now()}, context=context)
return True return True
def case_escalate(self, cr, uid, ids, context=None): def case_escalate(self, cr, uid, ids, context=None):

View File

@ -58,7 +58,7 @@
<field name="view_mode">tree,calendar</field> <field name="view_mode">tree,calendar</field>
<field name="view_id" ref="crm_case_inbound_phone_tree_view"/> <field name="view_id" ref="crm_case_inbound_phone_tree_view"/>
<field name="domain">[]</field> <field name="domain">[]</field>
<field name="context">{'default_state': 'done'}</field> <field name="context">{'search_default_state': 'done', 'default_state': 'done'}</field>
<field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/> <field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/>
<field name="help" type="html"> <field name="help" type="html">
<p class="oe_view_nocontent_create"> <p class="oe_view_nocontent_create">

View File

@ -167,6 +167,7 @@
<search string="Search Phonecalls"> <search string="Search Phonecalls">
<field name="name" string="Phonecalls"/> <field name="name" string="Phonecalls"/>
<field name="date"/> <field name="date"/>
<field name="state"/>
<separator/> <separator/>
<filter icon="terp-gtk-go-back-rtl" string="To Do" name="current" domain="[('state','=','open')]"/> <filter icon="terp-gtk-go-back-rtl" string="To Do" name="current" domain="[('state','=','open')]"/>
<separator/> <separator/>

View File

@ -58,7 +58,7 @@ class report_event_registration(osv.osv):
# TOFIX this request won't select events that have no registration # TOFIX this request won't select events that have no registration
cr.execute(""" CREATE VIEW report_event_registration AS ( cr.execute(""" CREATE VIEW report_event_registration AS (
SELECT SELECT
e.id::char || '/' || coalesce(r.id::char,'') AS id, e.id::varchar || '/' || coalesce(r.id::varchar,'') AS id,
e.id AS event_id, e.id AS event_id,
e.user_id AS user_id, e.user_id AS user_id,
r.user_id AS user_id_registration, r.user_id AS user_id_registration,

View File

@ -263,6 +263,10 @@ class hr_expense_expense(osv.osv):
#convert eml into an osv-valid format #convert eml into an osv-valid format
lines = map(lambda x:(0,0,self.line_get_convert(cr, uid, x, exp.employee_id.address_home_id, exp.date_confirm, context=context)), eml) lines = map(lambda x:(0,0,self.line_get_convert(cr, uid, x, exp.employee_id.address_home_id, exp.date_confirm, context=context)), eml)
journal_id = move_obj.browse(cr, uid, move_id, context).journal_id
# post the journal entry if 'Skip 'Draft' State for Manual Entries' is checked
if journal_id.entry_posted:
move_obj.button_validate(cr, uid, [move_id], context)
move_obj.write(cr, uid, [move_id], {'line_id': lines}, context=context) move_obj.write(cr, uid, [move_id], {'line_id': lines}, context=context)
self.write(cr, uid, ids, {'account_move_id': move_id, 'state': 'done'}, context=context) self.write(cr, uid, ids, {'account_move_id': move_id, 'state': 'done'}, context=context)
return True return True

View File

@ -23,7 +23,7 @@ import time
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from openerp.osv import fields, osv from openerp.osv import fields, osv
from openerp.tools import config from openerp.tools import config, float_compare
from openerp.tools.translate import _ from openerp.tools.translate import _
class hr_payslip(osv.osv): class hr_payslip(osv.osv):
@ -86,6 +86,7 @@ class hr_payslip(osv.osv):
def process_sheet(self, cr, uid, ids, context=None): def process_sheet(self, cr, uid, ids, context=None):
move_pool = self.pool.get('account.move') move_pool = self.pool.get('account.move')
period_pool = self.pool.get('account.period') period_pool = self.pool.get('account.period')
precision = self.pool.get('decimal.precision').precision_get(cr, uid, 'Payroll')
timenow = time.strftime('%Y-%m-%d') timenow = time.strftime('%Y-%m-%d')
for slip in self.browse(cr, uid, ids, context=context): for slip in self.browse(cr, uid, ids, context=context):
@ -149,7 +150,7 @@ class hr_payslip(osv.osv):
line_ids.append(credit_line) line_ids.append(credit_line)
credit_sum += credit_line[2]['credit'] - credit_line[2]['debit'] credit_sum += credit_line[2]['credit'] - credit_line[2]['debit']
if debit_sum > credit_sum: if float_compare(credit_sum, debit_sum, precision_digits=precision) == -1:
acc_id = slip.journal_id.default_credit_account_id.id acc_id = slip.journal_id.default_credit_account_id.id
if not acc_id: if not acc_id:
raise osv.except_osv(_('Configuration Error!'),_('The Expense Journal "%s" has not properly configured the Credit Account!')%(slip.journal_id.name)) raise osv.except_osv(_('Configuration Error!'),_('The Expense Journal "%s" has not properly configured the Credit Account!')%(slip.journal_id.name))
@ -165,7 +166,7 @@ class hr_payslip(osv.osv):
}) })
line_ids.append(adjust_credit) line_ids.append(adjust_credit)
elif debit_sum < credit_sum: elif float_compare(debit_sum, credit_sum, precision_digits=precision) == -1:
acc_id = slip.journal_id.default_debit_account_id.id acc_id = slip.journal_id.default_debit_account_id.id
if not acc_id: if not acc_id:
raise osv.except_osv(_('Configuration Error!'),_('The Expense Journal "%s" has not properly configured the Debit Account!')%(slip.journal_id.name)) raise osv.except_osv(_('Configuration Error!'),_('The Expense Journal "%s" has not properly configured the Debit Account!')%(slip.journal_id.name))

View File

@ -138,7 +138,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
def _process_taxes_translations(self, cr, uid, obj_multi, company_id, langs, field, context=None): def _process_taxes_translations(self, cr, uid, obj_multi, company_id, langs, field, context=None):
obj_tax_template = self.pool.get('account.tax.template') obj_tax_template = self.pool.get('account.tax.template')
obj_tax = self.pool.get('account.tax') obj_tax = self.pool.get('account.tax')
in_ids = sorted([x.id for x in obj_multi.chart_template_id.tax_template_ids]) in_ids = [x.id for x in obj_multi.chart_template_id.tax_template_ids]
out_ids = obj_tax.search(cr, uid, [('company_id', '=', company_id)], order='id') out_ids = obj_tax.search(cr, uid, [('company_id', '=', company_id)], order='id')
return self.process_translations(cr, uid, langs, obj_tax_template, field, in_ids, obj_tax, out_ids, context=context) return self.process_translations(cr, uid, langs, obj_tax_template, field, in_ids, obj_tax, out_ids, context=context)

View File

@ -6,7 +6,7 @@
<record id="membership_0" model="product.product"> <record id="membership_0" model="product.product">
<field name="membership">True</field> <field name="membership">True</field>
<field eval="time.strftime('%Y-01-01')" name="membership_date_from"/> <field eval="time.strftime('%Y-01-01')" name="membership_date_from"/>
<field eval="time.strftime('%Y-12-01')" name="membership_date_to"/> <field eval="time.strftime('%Y-12-31')" name="membership_date_to"/>
<field name="name">Golden Membership</field> <field name="name">Golden Membership</field>
<field name="list_price">180</field> <field name="list_price">180</field>
<field name="categ_id" ref="product.product_category_1"/> <field name="categ_id" ref="product.product_category_1"/>
@ -16,7 +16,7 @@
<record id="membership_1" model="product.product"> <record id="membership_1" model="product.product">
<field name="membership">True</field> <field name="membership">True</field>
<field eval="time.strftime('%Y-01-01')" name="membership_date_from"/> <field eval="time.strftime('%Y-01-01')" name="membership_date_from"/>
<field eval="time.strftime('%Y-12-01')" name="membership_date_to"/> <field eval="time.strftime('%Y-12-31')" name="membership_date_to"/>
<field name="name">Silver Membership</field> <field name="name">Silver Membership</field>
<field name="categ_id" ref="product.product_category_1"/> <field name="categ_id" ref="product.product_category_1"/>
<field name="list_price">80</field> <field name="list_price">80</field>
@ -26,7 +26,7 @@
<record id="membership_2" model="product.product"> <record id="membership_2" model="product.product">
<field name="membership">True</field> <field name="membership">True</field>
<field eval="time.strftime('%Y-01-01')" name="membership_date_from"/> <field eval="time.strftime('%Y-01-01')" name="membership_date_from"/>
<field eval="time.strftime('%Y-12-01')" name="membership_date_to"/> <field eval="time.strftime('%Y-12-31')" name="membership_date_to"/>
<field name="name">Basic Membership</field> <field name="name">Basic Membership</field>
<field name="categ_id" ref="product.product_category_1"/> <field name="categ_id" ref="product.product_category_1"/>
<field name="list_price">40</field> <field name="list_price">40</field>

View File

@ -29,6 +29,7 @@ from openerp.tools import float_compare
from openerp.tools.translate import _ from openerp.tools.translate import _
from openerp import tools, SUPERUSER_ID from openerp import tools, SUPERUSER_ID
from openerp import SUPERUSER_ID from openerp import SUPERUSER_ID
from openerp.addons.product import _common
#---------------------------------------------------------- #----------------------------------------------------------
# Work Centers # Work Centers
@ -320,7 +321,7 @@ class mrp_bom(osv.osv):
""" """
routing_obj = self.pool.get('mrp.routing') routing_obj = self.pool.get('mrp.routing')
factor = factor / (bom.product_efficiency or 1.0) factor = factor / (bom.product_efficiency or 1.0)
factor = rounding(factor, bom.product_rounding) factor = _common.ceiling(factor, bom.product_rounding)
if factor < bom.product_rounding: if factor < bom.product_rounding:
factor = bom.product_rounding factor = bom.product_rounding
result = [] result = []
@ -376,6 +377,8 @@ class mrp_bom(osv.osv):
def rounding(f, r): def rounding(f, r):
# TODO for trunk: log deprecation warning
# _logger.warning("Deprecated rounding method, please use tools.float_round to round floats.")
import math import math
if not r: if not r:
return f return f

View File

@ -57,7 +57,8 @@ The following topics should be covered by this module:
'test/test_mrp_repair_b4inv.yml', 'test/test_mrp_repair_b4inv.yml',
'test/test_mrp_repair_afterinv.yml', 'test/test_mrp_repair_afterinv.yml',
'test/test_mrp_repair_cancel.yml', 'test/test_mrp_repair_cancel.yml',
'test/mrp_repair_report.yml' 'test/mrp_repair_report.yml',
'test/test_mrp_repair_fee.yml',
], ],
'installable': True, 'installable': True,
'auto_install': False, 'auto_install': False,

View File

@ -108,10 +108,12 @@ class mrp_repair(osv.osv):
return res return res
def _get_lines(self, cr, uid, ids, context=None): def _get_lines(self, cr, uid, ids, context=None):
result = {} return self.pool['mrp.repair'].search(
for line in self.pool.get('mrp.repair.line').browse(cr, uid, ids, context=context): cr, uid, [('operations', 'in', ids)], context=context)
result[line.repair_id.id] = True
return result.keys() def _get_fee_lines(self, cr, uid, ids, context=None):
return self.pool['mrp.repair'].search(
cr, uid, [('fees_lines', 'in', ids)], context=context)
_columns = { _columns = {
'name': fields.char('Repair Reference',size=24, required=True, states={'confirmed':[('readonly',True)]}), 'name': fields.char('Repair Reference',size=24, required=True, states={'confirmed':[('readonly',True)]}),
@ -160,18 +162,21 @@ class mrp_repair(osv.osv):
'repaired': fields.boolean('Repaired', readonly=True), 'repaired': fields.boolean('Repaired', readonly=True),
'amount_untaxed': fields.function(_amount_untaxed, string='Untaxed Amount', 'amount_untaxed': fields.function(_amount_untaxed, string='Untaxed Amount',
store={ store={
'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10), 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations', 'fees_lines'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10), 'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}), }),
'amount_tax': fields.function(_amount_tax, string='Taxes', 'amount_tax': fields.function(_amount_tax, string='Taxes',
store={ store={
'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10), 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations', 'fees_lines'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10), 'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}), }),
'amount_total': fields.function(_amount_total, string='Total', 'amount_total': fields.function(_amount_total, string='Total',
store={ store={
'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations'], 10), 'mrp.repair': (lambda self, cr, uid, ids, c={}: ids, ['operations', 'fees_lines'], 10),
'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10), 'mrp.repair.line': (_get_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
'mrp.repair.fee': (_get_fee_lines, ['price_unit', 'price_subtotal', 'product_id', 'tax_id', 'product_uom_qty', 'product_uom'], 10),
}), }),
} }

View File

@ -0,0 +1,23 @@
-
Testing total amount update function
-
I check the total amount of mrp_repair_rmrp1 is 100
-
!assert {model: mrp.repair, id: mrp_repair_rmrp1, string=amount_total should be 100}:
- amount_total == 100
-
I add a new fee line
-
!record {model: mrp.repair, id: mrp_repair_rmrp1}:
fees_lines:
- name: 'Assembly Service Cost'
product_id: product.product_assembly
product_uom_qty: 1.0
product_uom: product.product_uom_hour
price_unit: 12.0
to_invoice: True
-
I check the total amount of mrp_repair_rmrp1 is now 112
-
!assert {model: mrp.repair, id: mrp_repair_rmrp1, string=amount_total should be 112}:
- amount_total == 112

View File

@ -61,7 +61,6 @@ Print product labels with barcode.
], ],
'test': [ 'test': [
'product_pricelist_demo.yml', 'product_pricelist_demo.yml',
'test/product_uom.yml',
'test/product_pricelist.yml', 'test/product_pricelist.yml',
], ],
'installable': True, 'installable': True,

View File

@ -18,12 +18,18 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################## ##############################################################################
from openerp import tools
import math
def rounding(f, r): def rounding(f, r):
# TODO for trunk: log deprecation warning
# _logger.warning("Deprecated rounding method, please use tools.float_round to round floats.")
return tools.float_round(f, precision_rounding=r)
# TODO for trunk: add rounding method parameter to tools.float_round and use this method as hook
def ceiling(f, r):
if not r: if not r:
return f return f
return round(f / r) * r return math.ceil(f / r) * r
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -21,8 +21,7 @@
import time import time
from _common import rounding from openerp import tools
from openerp.osv import fields, osv from openerp.osv import fields, osv
from openerp.tools.translate import _ from openerp.tools.translate import _
@ -294,7 +293,8 @@ class product_pricelist(osv.osv):
if price is not False: if price is not False:
price_limit = price price_limit = price
price = price * (1.0+(res['price_discount'] or 0.0)) price = price * (1.0+(res['price_discount'] or 0.0))
price = rounding(price, res['price_round']) #TOFIX: rounding with tools.float_rouding if res['price_round']:
price = tools.float_round(price, precision_rounding=res['price_round'])
price += (res['price_surcharge'] or 0.0) price += (res['price_surcharge'] or 0.0)
if res['price_min_margin']: if res['price_min_margin']:
price = max(price, price_limit+res['price_min_margin']) price = max(price, price_limit+res['price_min_margin'])

View File

@ -22,7 +22,7 @@
import math import math
import re import re
from _common import rounding from _common import ceiling
from openerp import tools from openerp import tools
from openerp.osv import osv, fields from openerp.osv import osv, fields
@ -177,7 +177,7 @@ class product_uom(osv.osv):
return qty return qty
amount = qty / from_unit.factor amount = qty / from_unit.factor
if to_unit: if to_unit:
amount = rounding(amount * to_unit.factor, to_unit.rounding) amount = ceiling(amount * to_unit.factor, to_unit.rounding)
return amount return amount
def _compute_price(self, cr, uid, from_uom_id, price, to_uom_id=False): def _compute_price(self, cr, uid, from_uom_id, price, to_uom_id=False):

View File

@ -178,7 +178,6 @@
<kanban> <kanban>
<field name="color"/> <field name="color"/>
<field name="type"/> <field name="type"/>
<field name="image_small"/>
<field name="list_price"/> <field name="list_price"/>
<templates> <templates>
<t t-name="kanban-box"> <t t-name="kanban-box">

View File

@ -1,15 +0,0 @@
-
In order to test conversation of UOM,
-
I convert Grams into TON with price.
-
!python {model: product.uom}: |
from_uom_id = ref("product_uom_gram")
to_uom_id = ref("product_uom_ton")
price = 2
qty = 1020000
price = self._compute_price(cr, uid, from_uom_id, price, to_uom_id)
qty = self._compute_qty(cr, uid, from_uom_id, qty, to_uom_id)
assert qty == 1.02, "Qty is not correspond."
assert price == 2000000.0, "Price is not correspond."

View File

@ -0,0 +1,5 @@
from . import test_uom
fast_suite = [
test_uom,
]

View File

@ -0,0 +1,37 @@
from openerp.tests.common import TransactionCase
class TestUom(TransactionCase):
"""Tests for unit of measure conversion"""
def setUp(self):
super(TestUom, self).setUp()
self.product = self.registry('product.product')
self.uom = self.registry('product.uom')
self.imd = self.registry('ir.model.data')
def test_10_conversion(self):
cr, uid = self.cr, self.uid
gram_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_gram')[1]
tonne_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_ton')[1]
qty = self.uom._compute_qty(cr, uid, gram_id, 1020000, tonne_id)
self.assertEquals(qty, 1.02, "Converted quantity does not correspond.")
price = self.uom._compute_price(cr, uid, gram_id, 2, tonne_id)
self.assertEquals(price, 2000000.0, "Converted price does not correspond.")
def test_20_rounding(self):
cr, uid = self.cr, self.uid
unit_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_unit')[1]
categ_unit_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_categ_unit')[1]
score_id = self.uom.create(cr, uid, {
'name': 'Score',
'factor_inv': 20,
'uom_type': 'bigger',
'rounding': 1.0,
'category_id': categ_unit_id
})
qty = self.uom._compute_qty(cr, uid, unit_id, 2, score_id)
self.assertEquals(qty, 1, "Converted quantity should be rounded up.")

View File

@ -53,9 +53,9 @@ class product_product(osv.osv):
states = ('draft', 'open', 'paid') states = ('draft', 'open', 'paid')
sqlstr="""select sqlstr="""select
sum(l.price_unit * l.quantity)/sum(l.quantity) as avg_unit_price, sum(l.price_unit * l.quantity)/sum(nullif(l.quantity,0)) as avg_unit_price,
sum(l.quantity) as num_qty, sum(l.quantity) as num_qty,
sum(l.quantity * (l.price_subtotal/l.quantity)) as total, sum(l.quantity * (l.price_subtotal/(nullif(l.quantity,0)))) as total,
sum(l.quantity * pt.list_price) as sale_expected, sum(l.quantity * pt.list_price) as sale_expected,
sum(l.quantity * pt.standard_price) as normal_cost sum(l.quantity * pt.standard_price) as normal_cost
from account_invoice_line l from account_invoice_line l

View File

@ -180,8 +180,8 @@ class sale_order(osv.osv):
'date_confirm': fields.date('Confirmation Date', readonly=True, select=True, help="Date on which sales order is confirmed."), 'date_confirm': fields.date('Confirmation Date', readonly=True, select=True, help="Date on which sales order is confirmed."),
'user_id': fields.many2one('res.users', 'Salesperson', states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, select=True, track_visibility='onchange'), 'user_id': fields.many2one('res.users', 'Salesperson', states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, select=True, track_visibility='onchange'),
'partner_id': fields.many2one('res.partner', 'Customer', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, required=True, change_default=True, select=True, track_visibility='always'), 'partner_id': fields.many2one('res.partner', 'Customer', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, required=True, change_default=True, select=True, track_visibility='always'),
'partner_invoice_id': fields.many2one('res.partner', 'Invoice Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Invoice address for current sales order."), 'partner_invoice_id': fields.many2one('res.partner', 'Invoice Address', domain="[('parent_id','=',partner_id)]", readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Invoice address for current sales order."),
'partner_shipping_id': fields.many2one('res.partner', 'Delivery Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Delivery address for current sales order."), 'partner_shipping_id': fields.many2one('res.partner', 'Delivery Address', domain="[('parent_id','=',partner_id)]", readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Delivery address for current sales order."),
'order_policy': fields.selection([ 'order_policy': fields.selection([
('manual', 'On Demand'), ('manual', 'On Demand'),
], 'Create Invoice', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, ], 'Create Invoice', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},