← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-dev/openobject-client/m2o_with_selection into lp:~openerp-dev/openobject-client/trunk-dev-client

 

Ravi Gadhia (OpenERP) has proposed merging lp:~openerp-dev/openobject-client/m2o_with_selection into lp:~openerp-dev/openobject-client/trunk-dev-client.

Requested reviews:
  Naresh(OpenERP) (nch-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-client/m2o_with_selection/+merge/49360

Hello,

Improve selection field. 

Now M2O field with widget="selection" no need to pre-load selection value (at time of fields_view_get) it's get value on popup by name_search and we can apply domain as like M2O field

For selection field: if it has function to get selection value it also call at field popup time

related server branch:
https://code.launchpad.net/~openerp-dev/openobject-server/m2o_with_selection

-- 
https://code.launchpad.net/~openerp-dev/openobject-client/m2o_with_selection/+merge/49360
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-client/m2o_with_selection.
=== modified file 'bin/po/pt_BR.po'
--- bin/po/pt_BR.po	2011-01-25 10:58:55 +0000
+++ bin/po/pt_BR.po	2011-02-11 07:40:17 +0000
@@ -8,13 +8,13 @@
 "Project-Id-Version: openobject-client\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-12-13 18:11+0100\n"
-"PO-Revision-Date: 2011-01-24 22:48+0000\n"
-"Last-Translator: Adriano Prado <adrianojprado@xxxxxxxxxxx>\n"
+"PO-Revision-Date: 2011-02-05 12:45+0000\n"
+"Last-Translator: Emerson <Unknown>\n"
 "Language-Team: Brazilian Portuguese <pt_BR@xxxxxx>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-01-25 04:53+0000\n"
+"X-Launchpad-Export-Date: 2011-02-06 04:53+0000\n"
 "X-Generator: Launchpad (build 12177)\n"
 "Language: pt_BR\n"
 
@@ -109,7 +109,7 @@
 
 #: bin/modules/gui/main.py:194
 msgid "Bad Super Administrator Password"
-msgstr ""
+msgstr "Senha do Super Administrador Errada"
 
 #: bin/modules/gui/main.py:218
 msgid "Migration Scripts"
@@ -137,11 +137,11 @@
 
 #: bin/modules/gui/main.py:264
 msgid "Migrate Database"
-msgstr "Migrar base de dados"
+msgstr "Migrar Base de Dados"
 
 #: bin/modules/gui/main.py:281
 msgid "Database"
-msgstr "Banco de Dados"
+msgstr "Base de Dados"
 
 #: bin/modules/gui/main.py:293
 msgid "Your database has been upgraded."
@@ -149,18 +149,15 @@
 
 #: bin/modules/gui/main.py:295
 msgid "Your databases have been upgraded."
-msgstr "suas bases de dados já foram atualizadas."
+msgstr "Suas bases de dados já foram atualizadas."
 
 #: bin/modules/gui/main.py:297
 msgid "You have not selected a database"
-msgstr "Você não selecionou um Banco de Dados"
+msgstr "Você não selecionou uma base de dados"
 
-#
-# File: bin/modules/gui/main.py, line: 165
-# File: bin/modules/gui/main.py, line: 1161
 #: bin/modules/gui/main.py:361
 msgid "No database found, you must create one !"
-msgstr "Banco de dados não encontrado, você deve criar um !"
+msgstr "Base de dados não encontrada, você deve criar uma !"
 
 #
 # File: bin/modules/gui/main.py, line: 154
@@ -185,64 +182,43 @@
 msgid "Sorry,'"
 msgstr "Desculpe,'"
 
-#
-# File: bin/modules/gui/main.py, line: 309
-# File: bin/modules/gui/main.py, line: 312
 #: bin/modules/gui/main.py:610 bin/modules/gui/main.py:613
 msgid "Bad database name !"
-msgstr "Nome do banco de dados inválido !"
+msgstr "Nome da base de dados inválida !"
 
-#
-# File: bin/modules/gui/main.py, line: 312
 #: bin/modules/gui/main.py:613
 msgid ""
 "The database name must contain only normal characters or \"_\".\n"
 "You must avoid all accents, space or special characters."
 msgstr ""
-"O nome do banco de dados deve conter apenas caracteres normais ou \"_\".\n"
+"O nome da base de dados deve conter apenas caracteres normais ou \"_\".\n"
 "Você deve evitar acentos, espaços e caracteres especiais."
 
-#
-# File: bin/modules/gui/main.py, line: 372
-# File: bin/modules/gui/main.py, line: 374
-# File: bin/modules/gui/main.py, line: 376
 #: bin/modules/gui/main.py:647 bin/modules/gui/main.py:649
 #: bin/modules/gui/main.py:651
 msgid "Could not create database."
-msgstr "Não foi possível criar banco de dados."
+msgstr "Não foi possível criar a base de dados."
 
-#
-# File: bin/modules/gui/main.py, line: 372
 #: bin/modules/gui/main.py:647
 msgid "Database already exists !"
-msgstr "Banco de dados já existe !"
+msgstr "Base de dados já existe !"
 
-#
-# File: bin/modules/gui/main.py, line: 374
-# File: bin/modules/gui/main.py, line: 1060
-# File: bin/modules/gui/main.py, line: 1079
-# File: bin/modules/gui/main.py, line: 1149
 #: bin/modules/gui/main.py:649 bin/modules/gui/main.py:1383
 #: bin/modules/gui/main.py:1403 bin/modules/gui/main.py:1482
 msgid "Bad database administrator password !"
-msgstr "Senha do administrador do banco de dados inválida !"
+msgstr "Senha do administrador da base de dados inválida !"
 
-#
-# File: bin/modules/gui/main.py, line: 376
-# File: bin/modules/gui/main.py, line: 383
 #: bin/modules/gui/main.py:651 bin/modules/gui/main.py:658
 msgid "Error during database creation !"
-msgstr "Erro durante a criação do banco de dados !"
+msgstr "Erro durante a criação da base de dados !"
 
-#
-# File: bin/modules/gui/main.py, line: 383
 #: bin/modules/gui/main.py:658
 msgid ""
 "The server crashed during installation.\n"
 "We suggest you to drop this database."
 msgstr ""
 "O servidor falhou durante a instalação.\n"
-"Sugerimos que você apague este banco de dados."
+"Sugerimos que você apague esta base de dados."
 
 #
 # File: bin/modules/gui/main.py, line: 445
@@ -285,12 +261,12 @@
 "Please double-check the database name or contact your administrator to "
 "verify the database status."
 msgstr ""
-"Por favor, verifique o nome do banco ou entre em contato com o administrador "
-"para verificar o status de banco de dados."
+"Por favor, verifique o nome da base ou entre em contato com o administrador "
+"para verificar o status da base de dados."
 
 #: bin/modules/gui/main.py:1037
 msgid "Database cannot be accessed or does not exist"
-msgstr "Banco de dados não pode ser acessado ou não existe"
+msgstr "Base de dados não pode ser acessada ou não existe"
 
 #
 # File: bin/modules/gui/main.py, line: 746
@@ -360,29 +336,21 @@
 msgid "Attachments"
 msgstr "Anexos"
 
-#
-# File: bin/modules/gui/main.py, line: 1051
 #: bin/modules/gui/main.py:1374
 msgid "Delete a database"
-msgstr "Apagar um banco de dados"
+msgstr "Apagar uma base de dados"
 
-#
-# File: bin/modules/gui/main.py, line: 1057
 #: bin/modules/gui/main.py:1380
 msgid "Database dropped successfully !"
-msgstr "Banco de dados apagado com sucesso !"
+msgstr "Base de dados apagada com sucesso !"
 
-#
-# File: bin/modules/gui/main.py, line: 1060
 #: bin/modules/gui/main.py:1383
 msgid "Could not drop database."
-msgstr "Não foi possível apagar o banco de dados."
+msgstr "Não foi possível apagar a base de dados."
 
-#
-# File: bin/modules/gui/main.py, line: 1062
 #: bin/modules/gui/main.py:1385
 msgid "Couldn't drop database"
-msgstr "Não foi possível apagar o banco de dados."
+msgstr "Não foi possível apagar a base de dados."
 
 #
 # File: bin/widget/view/form_gtk/image.py, line: 110
@@ -394,23 +362,17 @@
 msgid "Open..."
 msgstr "Abrir..."
 
-#
-# File: bin/modules/gui/main.py, line: 1076
 #: bin/modules/gui/main.py:1400
 msgid "Database restored successfully !"
-msgstr "Banco de dados restaurado com sucesso !"
+msgstr "Base de dados restaurada com sucesso !"
 
-#
-# File: bin/modules/gui/main.py, line: 1079
 #: bin/modules/gui/main.py:1403
 msgid "Could not restore database."
-msgstr "Não foi possível restaurar o banco de dados."
+msgstr "Não foi possível restaurar a base de dados."
 
-#
-# File: bin/modules/gui/main.py, line: 1081
 #: bin/modules/gui/main.py:1405
 msgid "Couldn't restore database"
-msgstr "Não foi possível restaurar o banco de dados."
+msgstr "Não foi possível restaurar a base de dados."
 
 #: bin/modules/gui/main.py:1444
 msgid ""
@@ -438,12 +400,9 @@
 msgid "Error, password not changed."
 msgstr "Erro, senha não alterada."
 
-#
-# File: bin/modules/gui/main.py, line: 1133
-# File: bin/modules/gui/main.py, line: 1153
 #: bin/modules/gui/main.py:1463 bin/modules/gui/main.py:1486
 msgid "Backup a database"
-msgstr "Fazer backup de um banco de dados"
+msgstr "Fazer backup de uma base de dados"
 
 #: bin/modules/gui/main.py:1466 bin/modules/gui/window/win_export.py:328
 #: bin/printer/printer.py:216 bin/widget/view/form_gtk/image.py:129
@@ -453,17 +412,15 @@
 
 #: bin/modules/gui/main.py:1479
 msgid "Database backed up successfully !"
-msgstr "Base de dados salvaguardada com sucesso."
+msgstr "Backup da base de dados criado com sucesso !"
 
 #: bin/modules/gui/main.py:1482
 msgid "Could not backup the database."
-msgstr "Não pôde salvaguardar a base de dados"
+msgstr "O backup da base de dados não pode ser criado."
 
-#
-# File: bin/modules/gui/main.py, line: 1151
 #: bin/modules/gui/main.py:1484
 msgid "Couldn't backup database."
-msgstr "Não foi possível fazer backup do banco de dados."
+msgstr "O backup da base de dados não pode ser criado."
 
 #: bin/modules/gui/window/form.py:173
 msgid "Resource ID does not exist for this object!"
@@ -517,7 +474,7 @@
 
 #: bin/modules/gui/window/form.py:258
 msgid "Internal Module Data ID"
-msgstr ""
+msgstr "Data ID Interna do Módulo"
 
 #
 # File: bin/modules/gui/window/form.py, line: 230
@@ -671,6 +628,12 @@
 "\n"
 "%s"
 msgstr ""
+"Erro na importação deste registro:\n"
+"%s\n"
+"Mensagem:\n"
+"%s\n"
+"\n"
+"%s"
 
 #: bin/modules/gui/window/win_import.py:69
 msgid "Importation Error !"
@@ -701,6 +664,8 @@
 "Error processing your first line of the file.\n"
 "Field %s is unknown !"
 msgstr ""
+"Erro no processamento da primeira linha do arquivo.\n"
+"Campo %s desconhecido !"
 
 #: bin/modules/gui/window/win_import.py:190
 msgid "Import Error."
@@ -712,7 +677,7 @@
 
 #: bin/modules/gui/window/win_extension.py:42
 msgid "Extension"
-msgstr ""
+msgstr "Extensão"
 
 #: bin/modules/gui/window/win_extension.py:42
 msgid "Application"
@@ -720,7 +685,7 @@
 
 #: bin/modules/gui/window/win_extension.py:42
 msgid "Print Processor"
-msgstr ""
+msgstr "Processador de Impressão"
 
 #
 # File: bin/modules/gui/window/win_extension.py, line: 115
@@ -840,7 +805,7 @@
 
 #: bin/modules/gui/window/win_export.py:284
 msgid "What is the name of this export ?"
-msgstr ""
+msgstr "Qual o nome desta exportação ?"
 
 #: bin/modules/gui/window/win_export.py:320
 msgid "Exportation Error !"
@@ -908,7 +873,7 @@
 
 #: bin/common/common.py:89
 msgid "Close current tip"
-msgstr ""
+msgstr "Fechar a dica atual"
 
 #: bin/common/common.py:90
 msgid ""
@@ -920,7 +885,7 @@
 
 #: bin/common/common.py:100
 msgid "Disable all tips"
-msgstr ""
+msgstr "Desligar todas as dicas"
 
 #: bin/common/common.py:101
 msgid ""
@@ -929,10 +894,14 @@
 "To re-enable tips you need to check the <b>'Menu Tips'</b> option in the "
 "user preferences."
 msgstr ""
+"<span foreground=\"darkred\"><b>Desligar todas as dicas:</b></span>\n"
+"Isto vai desligar a apresentação das dicas em todos os itens de menu.\n"
+"Para ligar novamente marque a opção <b>'Dicas de Menu'</b> nas preferências "
+"de usuário."
 
 #: bin/common/common.py:115 bin/common/common.py:117
 msgid "Tips"
-msgstr ""
+msgstr "Dicas"
 
 #
 # File: bin/modules/action/wizard.py, line: 133
@@ -958,15 +927,15 @@
 #: bin/common/common.py:190
 #, python-format
 msgid "Ensure that the file %s is correct"
-msgstr ""
+msgstr "Certifique-se que o arquivo %s está correto"
 
 #: bin/common/common.py:364
 msgid " has reported the following bug:\n"
-msgstr ""
+msgstr " notificou o seguinte erro:\n"
 
 #: bin/common/common.py:364
 msgid "remarks"
-msgstr ""
+msgstr "comentários"
 
 #
 # File: bin/common/common.py, line: 298
@@ -1082,6 +1051,8 @@
 #: bin/printer/printer.py:197
 msgid "Error! No Data found. Make sure you have enough data to print!"
 msgstr ""
+"Erro! Nenhuma informação encontrada. Certifique-se que você tem informações "
+"para imprimir!"
 
 #
 # File: bin/printer/printer.py, line: 215
@@ -1149,7 +1120,7 @@
 
 #: bin/widget_search/char.py:43
 msgid "Error: "
-msgstr ""
+msgstr "Erro: "
 
 #
 # File: bin/widget_search/calendar.py, line: 55
@@ -1182,35 +1153,35 @@
 
 #: bin/widget_search/custom_filter.py:56
 msgid "contains"
-msgstr ""
+msgstr "contém"
 
 #: bin/widget_search/custom_filter.py:57
 msgid "doesn't contain"
-msgstr ""
+msgstr "não contém"
 
 #: bin/widget_search/custom_filter.py:58
 msgid "is equal to"
-msgstr ""
+msgstr "é igual a"
 
 #: bin/widget_search/custom_filter.py:59
 msgid "is not equal to"
-msgstr ""
+msgstr "não é igual a"
 
 #: bin/widget_search/custom_filter.py:60
 msgid "greater than"
-msgstr ""
+msgstr "maior que"
 
 #: bin/widget_search/custom_filter.py:61
 msgid "less than"
-msgstr ""
+msgstr "menor que"
 
 #: bin/widget_search/custom_filter.py:62
 msgid "in"
-msgstr ""
+msgstr "em"
 
 #: bin/widget_search/custom_filter.py:63
 msgid "not in"
-msgstr ""
+msgstr "não em"
 
 #: bin/widget_search/custom_filter.py:82
 msgid ""
@@ -1218,6 +1189,10 @@
 "For Date and DateTime Formats, specify text in '%Y-%m-%d' and '%Y-%m-%d "
 "%H:%M:%S' formats respectively."
 msgstr ""
+"Entre com valores separados por ',' se o operador 'em' ou 'não em' for "
+"escolhido.\n"
+"Para Formatos Data e Data e Hora, especifique o texto no formato '%Y-%m-%d' "
+"e '%Y-%m-%d %H:%M:%S' respectivamente."
 
 #
 # File: bin/widget_search/checkbox.py, line: 36
@@ -1240,7 +1215,7 @@
 
 #: bin/widget/view/form.py:141
 msgid "Action not defined !"
-msgstr ""
+msgstr "Ação não definida !"
 
 #
 # File: bin/widget/view/form.py, line: 182
@@ -1296,19 +1271,19 @@
 
 #: bin/widget/view/screen_container.py:73
 msgid "--Actions--"
-msgstr ""
+msgstr "--Ações--"
 
 #: bin/widget/view/screen_container.py:73
 msgid "Save as a Shortcut"
-msgstr ""
+msgstr "Gravar como Atalho"
 
 #: bin/widget/view/screen_container.py:73
 msgid "Save as a Filter"
-msgstr ""
+msgstr "Gravar como Filtro"
 
 #: bin/widget/view/screen_container.py:73
 msgid "Manage Filters"
-msgstr ""
+msgstr "Gerenciar Filtros"
 
 #: bin/widget/view/tree_gtk/parser.py:61
 msgid ""
@@ -1316,6 +1291,9 @@
 "\n"
 "Please Save them before sorting !"
 msgstr ""
+"Você tem registros sem gravar !  \n"
+"\n"
+"Favor Gravar antes de ordenar !"
 
 #
 # File: bin/widget/view/tree_gtk/editabletree.py, line: 125
@@ -1367,46 +1345,46 @@
 
 #: bin/widget/view/diagram_gtk/xdot.py:1712
 msgid "Add New Node"
-msgstr ""
+msgstr "Adicionar Novo Nó"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1713
 msgid "Add New Edge"
-msgstr ""
+msgstr "Adicionar Nova Borda"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1714
 msgid "Enlarge the Diagram"
-msgstr ""
+msgstr "Ampliar o Diagrama"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1715
 msgid "Shrink the Diagram"
-msgstr ""
+msgstr "Diminuir o Diagrama"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1716
 msgid "Fit the diagram to the window"
-msgstr ""
+msgstr "Ajustar o diagrama na janela"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1717
 msgid "Show the diagram at its normal size"
-msgstr ""
+msgstr "Mostrar o diagrama com tamanho normal"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1718
 msgid "Print the Diagram"
-msgstr ""
+msgstr "Imprimir o Diagrama"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1789
 #, python-format
 msgid "Close Current %s"
-msgstr ""
+msgstr "Fechar %s Atual"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1790
 #, python-format
 msgid "Delete Current %s"
-msgstr ""
+msgstr "Excluir %s Atual"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1791
 #, python-format
 msgid "Edit Current %s"
-msgstr ""
+msgstr "Editar %s Atual"
 
 #: bin/widget/view/diagram_gtk/xdot.py:1875
 msgid " - Dot Viewer"
@@ -1433,11 +1411,11 @@
 
 #: bin/widget/view/form_gtk/parser.py:318
 msgid "Field"
-msgstr ""
+msgstr "Campo"
 
 #: bin/widget/view/form_gtk/parser.py:318
 msgid "Object"
-msgstr ""
+msgstr "Objeto"
 
 #: bin/widget/view/form_gtk/parser.py:630
 msgid "Enter some text to the related field before adding translations!"
@@ -1458,15 +1436,15 @@
 
 #: bin/widget/view/form_gtk/one2many_list.py:64
 msgid "Cancel"
-msgstr ""
+msgstr "Cancelar"
 
 #: bin/widget/view/form_gtk/one2many_list.py:70
 msgid "Save & Close"
-msgstr ""
+msgstr "Gravar & Fechar"
 
 #: bin/widget/view/form_gtk/one2many_list.py:75
 msgid "Save & New"
-msgstr ""
+msgstr "Gravar & Novo"
 
 #
 # File: bin/widget/view/form_gtk/interface.py, line: 47
@@ -1503,22 +1481,22 @@
 #: bin/widget/view/form_gtk/one2many_list.py:223
 #: bin/widget/view/form_gtk/many2many.py:84
 msgid "Previous Page"
-msgstr ""
+msgstr "Página Anterior"
 
 #: bin/widget/view/form_gtk/one2many_list.py:227
 #: bin/widget/view/form_gtk/many2many.py:88
 msgid "Previous Record"
-msgstr ""
+msgstr "Registro Anterior"
 
 #: bin/widget/view/form_gtk/one2many_list.py:235
 #: bin/widget/view/form_gtk/many2many.py:96
 msgid "Next Record"
-msgstr ""
+msgstr "Próximo Registro"
 
 #: bin/widget/view/form_gtk/one2many_list.py:239
 #: bin/widget/view/form_gtk/many2many.py:100
 msgid "Next Page"
-msgstr ""
+msgstr "Próxima Página"
 
 #: bin/widget/view/form_gtk/one2many_list.py:245
 msgid "Switch"
@@ -1527,7 +1505,7 @@
 #: bin/widget/view/form_gtk/one2many_list.py:251
 #: bin/widget/view/form_gtk/many2many.py:106
 msgid "Choose Limit"
-msgstr ""
+msgstr "Escolher Limite"
 
 #
 # File: bin/widget/view/form_gtk/one2many_list.py, line: 269
@@ -1569,11 +1547,11 @@
 
 #: bin/widget/view/form_gtk/image.py:127
 msgid "There is no image to save as !"
-msgstr ""
+msgstr "Não há imagem para gravar como !"
 
 #: bin/widget/view/form_gtk/image.py:127
 msgid "Warning"
-msgstr ""
+msgstr "Atenção"
 
 #: bin/widget/view/form_gtk/many2one.py:158 bin/widget/view/form_gtk/url.py:55
 msgid "Open this resource"
@@ -1613,11 +1591,11 @@
 
 #: bin/widget/view/form_gtk/interface.py:63
 msgid "You can not set to the default value here !"
-msgstr ""
+msgstr "Você não pode definir um valor padão aqui !"
 
 #: bin/widget/view/form_gtk/interface.py:63
 msgid "Operation not permited"
-msgstr ""
+msgstr "Operação não permitida"
 
 #
 # File: bin/widget/view/form_gtk/binary.py, line: 77
@@ -1711,6 +1689,8 @@
 "(Any existing filter with the \n"
 "same name will be replaced)"
 msgstr ""
+"(Qualquer filtro existente com \n"
+"o mesmo nome será trocado)"
 
 #
 # File: bin/rpc.py, line: 143
@@ -1740,12 +1720,9 @@
 msgid "OpenERP - Login"
 msgstr "OpenERP - Login"
 
-#
-# File: bin/openerp.glade, line: 118
-# File: bin/openerp.glade, line: 7298
 #: bin/openerp.glade:116 bin/openerp.glade:6450
 msgid "Database:"
-msgstr "Banco de dados:"
+msgstr "Base de dados:"
 
 #
 # File: bin/openerp.glade, line: 133
@@ -1779,35 +1756,25 @@
 msgid "_Disconnect"
 msgstr "_Desconectar"
 
-#
-# File: bin/openerp.glade, line: 300
 #: bin/openerp.glade:308
 msgid "Databases"
-msgstr "Bancos de Dados"
+msgstr "Bases de Dados"
 
-#
-# File: bin/openerp.glade, line: 307
 #: bin/openerp.glade:315
 msgid "_New database"
-msgstr "Novo banco de _dados"
+msgstr "_Nova base de dados"
 
-#
-# File: bin/openerp.glade, line: 322
 #: bin/openerp.glade:330
 msgid "_Restore database"
-msgstr "_Restaurar banco de dados"
+msgstr "_Restaurar base de dados"
 
-#
-# File: bin/openerp.glade, line: 337
 #: bin/openerp.glade:345
 msgid "_Backup database"
-msgstr "Fazer _backup do banco de dados"
+msgstr "Fazer _backup da base de dados"
 
-#
-# File: bin/openerp.glade, line: 352
 #: bin/openerp.glade:360
 msgid "Dro_p database"
-msgstr "Apagar banco de dados"
+msgstr "_Apagar base de dados"
 
 #: bin/openerp.glade:380
 msgid "_Download Migrations Code"
@@ -1815,7 +1782,7 @@
 
 #: bin/openerp.glade:395
 msgid "_Migrate Database(s)"
-msgstr "_Migrar base de dados"
+msgstr "_Migrar base(s) de dados"
 
 #
 # File: bin/openerp.glade, line: 372
@@ -2226,7 +2193,7 @@
 
 #: bin/openerp.glade:1351
 msgid "Diagram"
-msgstr ""
+msgstr "Diagrama"
 
 #
 # File: bin/openerp.glade, line: 1313
@@ -2286,7 +2253,7 @@
 
 #: bin/openerp.glade:1512
 msgid "Company:"
-msgstr ""
+msgstr "Empresa:"
 
 #: bin/openerp.glade:1535
 msgid "Requests:"
@@ -3103,29 +3070,21 @@
 msgid "Port:"
 msgstr "Porta:"
 
-#
-# File: bin/openerp.glade, line: 7237
 #: bin/openerp.glade:6389
 msgid "Choose a database..."
-msgstr "Escolha um banco de dados..."
+msgstr "Escolha uma base de dados..."
 
-#
-# File: bin/openerp.glade, line: 7252
 #: bin/openerp.glade:6404
 msgid "<b>Backup a database</b>"
-msgstr "<b>Fazer Backup de um Banco de Dados</b>"
+msgstr "<b>Fazer backup de uma base de dados</b>"
 
-#
-# File: bin/openerp.glade, line: 7483
 #: bin/openerp.glade:6645
 msgid "Restore a database"
-msgstr "Restaurar um banco de dados"
+msgstr "Restaurar uma base de dados"
 
-#
-# File: bin/openerp.glade, line: 7496
 #: bin/openerp.glade:6658
 msgid "<b>Restore a database</b>"
-msgstr "<b>Restaurar um banco de dados</b>"
+msgstr "<b>Restaurar uma base de dados</b>"
 
 #
 # File: bin/openerp.glade, line: 7540
@@ -3133,11 +3092,9 @@
 msgid "(must not contain any special char)"
 msgstr "(não deve conter caracteres especiais)"
 
-#
-# File: bin/openerp.glade, line: 7569
 #: bin/openerp.glade:6732
 msgid "New database name:"
-msgstr "Novo nome do banco de dados:"
+msgstr "Nome da nova base de dados:"
 
 #
 # File: bin/openerp.glade, line: 7669
@@ -3147,17 +3104,13 @@
 msgid "http://localhost:8069";
 msgstr "http://localhost:8069";
 
-#
-# File: bin/openerp.glade, line: 7743
 #: bin/openerp.glade:6906
 msgid "Create a new database"
-msgstr "Criar um novo banco de dados"
+msgstr "Criar uma nova base de dados"
 
-#
-# File: bin/openerp.glade, line: 7756
 #: bin/openerp.glade:6919
 msgid "<b>Create a new database</b>"
-msgstr "<b>Criar um novo banco de dados</b>"
+msgstr "<b>Criar uma nova base de dados</b>"
 
 #
 # File: bin/openerp.glade, line: 7827
@@ -3173,16 +3126,15 @@
 msgid ""
 "<sup><b><span foreground=\"dark green\">?</span></b></sup>OpenERP Server:"
 msgstr ""
+"<sup><b><span foreground=\"dark green\">?</span></b></sup>Servidor OpenERP:"
 
-#
-# File: bin/openerp.glade, line: 7861
 #: bin/openerp.glade:7025
 msgid ""
 "This is the password of the user that have the rights to administer "
 "databases. This is not a OpenERP user, just a super administrator. If you "
 "did not changed it, the password is 'admin' after installation."
 msgstr ""
-"Esta é a senha do usuário que tem direitos para administrar bancos de dados. "
+"Esta é a senha do usuário que tem direitos para administrar bases de dados. "
 "Este não é um usuário OpenERP, mas sim um super administrador. Se você não "
 "alterou, a senha padrão é 'admin' após a instalação."
 
@@ -3191,10 +3143,12 @@
 "<sup><b><span foreground=\"dark green\">?</span></b></sup>Super "
 "Administrator Password:"
 msgstr ""
+"<sup><b><span foreground=\"dark green\">?</span></b></sup>Senha de Super "
+"Administrador:"
 
 #: bin/openerp.glade:7048
 msgid "admin"
-msgstr ""
+msgstr "admin"
 
 #
 # File: bin/openerp.glade, line: 7897
@@ -3202,30 +3156,28 @@
 msgid "(<i>admin</i>, by default)"
 msgstr "(<i>admin</i>, por padrão)"
 
-#
-# File: bin/openerp.glade, line: 7962
 #: bin/openerp.glade:7127
 msgid ""
 "Choose the name of the database that will be created. The name must not "
 "contain any special character. Exemple: 'terp'."
 msgstr ""
-"Escolha o nome do banco de dados que será criado. O nome não deve conter "
+"Escolha o nome da base de dados que será criada. O nome não deve conter "
 "caracteres especiais. Exemplo: 'terp'."
 
 #: bin/openerp.glade:7129
 msgid ""
 "<sup><b><span foreground=\"dark green\">?</span></b></sup>New Database Name:"
 msgstr ""
+"<sup><b><span foreground=\"dark green\">?</span></b></sup>Nome da Nova Base "
+"de Dados:"
 
-#
-# File: bin/openerp.glade, line: 7988
 #: bin/openerp.glade:7154
 msgid ""
 "Choose the default language that will be installed for this database. You "
 "will be able to install new languages after installation through the "
 "administration menu."
 msgstr ""
-"Escolha o idioma padrão que será instalado para este banco de dados. Você "
+"Escolha o idioma padrão que será instalado para esta base de dados. Você "
 "poderá instalar novos idiomas depois da instalação, através do menu de "
 "administração."
 
@@ -3233,32 +3185,38 @@
 msgid ""
 "<sup><b><span foreground=\"dark green\">?</span></b></sup>Default Language:"
 msgstr ""
+"<sup><b><span foreground=\"dark green\">?</span></b></sup>Idioma Padrão:"
 
 #: bin/openerp.glade:7169
 msgid ""
 "This is the password of the 'admin' user that will be created in your new "
 "database."
 msgstr ""
+"Esta é a senha para o usuário 'admin' que será criada em sua nova base de "
+"dados."
 
 #: bin/openerp.glade:7171
 msgid ""
 "<sup><b><span foreground=\"dark green\">?</span></b></sup>Administrator "
 "Password:"
 msgstr ""
+"<sup><b><span foreground=\"dark green\">?</span></b></sup>Senha de "
+"Administrador:"
 
 #: bin/openerp.glade:7184
 msgid ""
 "This is the password of the 'admin' user that will be created in your new "
 "database. It has to be the same than the above field."
 msgstr ""
+"Esta é a senha do usuário 'admin' que será criado em sua base de dados. "
+"Precisa ser a mesma informada no campo acima."
 
 #: bin/openerp.glade:7186
 msgid ""
 "<sup><b><span foreground=\"dark green\">?</span></b></sup>Confirm Password:"
 msgstr ""
+"<sup><b><span foreground=\"dark green\">?</span></b></sup>Confirme a Senha:"
 
-#
-# File: bin/openerp.glade, line: 8110
 #: bin/openerp.glade:7279
 msgid ""
 "Check this box if you want demonstration data to be installed on your new "
@@ -3266,14 +3224,16 @@
 "products, partners, etc."
 msgstr ""
 "Marque esta caixa se você deseja que os dados de demonstração sejam "
-"instalados no seu novo banco de dados. Estes dados vão ajudar você a "
-"entender o OpenERP, com produtos pré-definidos, parceiros, etc."
+"instalados no sua nova base de dados. Estes dados vão ajudar você a entender "
+"o OpenERP, com produtos pré-definidos, parceiros, etc."
 
 #: bin/openerp.glade:7282
 msgid ""
 "<sup><b><span foreground=\"dark green\">?</span></b></sup>Load Demonstration "
 "Data:"
 msgstr ""
+"<sup><b><span foreground=\"dark green\">?</span></b></sup>Carregar Dados de "
+"Demonstração:"
 
 #
 # File: bin/openerp.glade, line: 8170
@@ -3387,7 +3347,7 @@
 
 #: bin/openerp.glade:8289
 msgid "Conditional Operators"
-msgstr ""
+msgstr "Operadores Condicionais"
 
 #: bin/openerp.glade:8316
 msgid "The Choice will be applied with next filter if any"
@@ -3398,10 +3358,12 @@
 "AND\n"
 "OR"
 msgstr ""
+"E\n"
+"OU"
 
 #: bin/openerp.glade:8330
 msgid "Remove Filter"
-msgstr ""
+msgstr "Remover Filtro"
 
 #: bin/openerp.glade:8349
 msgid "Filter Entry"
@@ -3418,10 +3380,11 @@
 #: bin/win_error.glade:100
 msgid "Click here for details about the publisher warranty proposition"
 msgstr ""
+"Clique aqui para detalhes sobre a proposta de garantia do distribuidor"
 
 #: bin/win_error.glade:120
 msgid "<i>_Publisher Warranty</i>"
-msgstr ""
+msgstr "<i>_Garantia do Distribuidor</i>"
 
 #: bin/win_error.glade:151
 msgid ""
@@ -3431,6 +3394,11 @@
 "you shortly.\n"
 "</i>"
 msgstr ""
+"<b>Contrato de Garantia do Distribuidor.</b>\n"
+"<i>\n"
+"Sua requisição será envidada para o OpenERP e a equipe de garantia do "
+"distribuidor responderá rapidamente.\n"
+"</i>"
 
 #
 # File: bin/win_error.glade, line: 184
@@ -3446,11 +3414,11 @@
 
 #: bin/win_error.glade:285
 msgid "Send to Publisher Warranty Team"
-msgstr ""
+msgstr "Enviar para a Equipe de Garantia do Distribuidor"
 
 #: bin/win_error.glade:318
 msgid "Summary of the problem:"
-msgstr ""
+msgstr "Resumo do problema:"
 
 #: bin/win_error.glade:360
 msgid "<i>_Support Request</i>"

=== modified file 'bin/po/ur.po'
--- bin/po/ur.po	2011-01-31 04:55:13 +0000
+++ bin/po/ur.po	2011-02-11 07:40:17 +0000
@@ -8,13 +8,13 @@
 "Project-Id-Version: openobject-client\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 "POT-Creation-Date: 2010-12-13 18:11+0100\n"
-"PO-Revision-Date: 2011-01-30 17:00+0000\n"
+"PO-Revision-Date: 2011-02-05 16:48+0000\n"
 "Last-Translator: Aamir Riaz <Unknown>\n"
 "Language-Team: Urdu <ur@xxxxxx>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-01-31 04:55+0000\n"
+"X-Launchpad-Export-Date: 2011-02-06 04:53+0000\n"
 "X-Generator: Launchpad (build 12177)\n"
 
 #: bin/plugins/__init__.py:27
@@ -139,6 +139,9 @@
 "The versions of the server (%s) and the client (%s) missmatch. The client "
 "may not work properly. Use it at your own risks."
 msgstr ""
+"سرورکاورژن (%s) اورکلائنٹ کاورژن (%s) \r\n"
+"مختلف ھیں، کلائنٹ صحیح کام نھیں کرسکتا،\r\n"
+" اپنی ذمھداری پر استعمال کریں"
 
 #: bin/modules/gui/main.py:610
 msgid "Sorry,'"
@@ -544,38 +547,40 @@
 "Error processing your first line of the file.\n"
 "Field %s is unknown !"
 msgstr ""
+"آپ کی فائل کی پہلی سطر پر کاروائی کی خرابی.\n"
+"فیلڈ %s نامعلوم ہے!"
 
 #: bin/modules/gui/window/win_import.py:190
 msgid "Import Error."
-msgstr ""
+msgstr "درآمدکی خرابی۔"
 
 #: bin/modules/gui/window/win_import.py:221
 msgid "You have not selected any fields to import"
-msgstr ""
+msgstr "آپ نےکسی فیلڈکا انتخاب نہیں کیا درآمد کرنےکیلیے-"
 
 #: bin/modules/gui/window/win_extension.py:42
 msgid "Extension"
-msgstr ""
+msgstr "توسیع"
 
 #: bin/modules/gui/window/win_extension.py:42
 msgid "Application"
-msgstr ""
+msgstr "ایپلیکیشن"
 
 #: bin/modules/gui/window/win_extension.py:42
 msgid "Print Processor"
-msgstr ""
+msgstr "پرنٹ پروسیسر"
 
 #: bin/modules/gui/window/win_extension.py:114
 msgid "This extension is already defined"
-msgstr ""
+msgstr "اس توسیع کی پھلےسےوظاحت ھو چُکی ھے-"
 
 #: bin/modules/gui/window/win_extension.py:114 bin/openerp.glade:7684
 msgid "Extension Manager"
-msgstr ""
+msgstr "توسیع کامینیجر"
 
 #: bin/modules/gui/window/win_selection.py:51
 msgid "Name"
-msgstr ""
+msgstr "نام"
 
 #: bin/modules/gui/window/win_selection.py:55
 msgid "Ressource Name"
@@ -627,11 +632,11 @@
 
 #: bin/modules/gui/window/tree.py:234
 msgid "Unable to chroot: no tree resource selected"
-msgstr ""
+msgstr "وسائل کا انتخاب نھیں ھُوا tree : chroot میں ناکام"
 
 #: bin/modules/gui/window/win_export.py:50
 msgid " record(s) saved !"
-msgstr ""
+msgstr " ريکارڈز بچا لیا!"
 
 #: bin/modules/gui/window/win_export.py:53
 msgid ""
@@ -674,32 +679,32 @@
 
 #: bin/options.py:110
 msgid "specify alternate config file"
-msgstr ""
+msgstr "متبادل وضعی فائل کی وضاحت کریں۔"
 
 #: bin/options.py:111
 msgid "Enable basic debugging. Alias for '--log-level=debug'"
-msgstr ""
+msgstr "بنیادی ٹھیک کرنا فعال کریں. عرفیت کے لئے '--log-level=debug'"
 
 #: bin/options.py:112
 #, python-format
 msgid "specify the log level: %s"
-msgstr ""
+msgstr "لاگ کے درجہ کے وضاحت کریں: %s"
 
 #: bin/options.py:113
 msgid "specify the user login"
-msgstr ""
+msgstr "صارف لاگ ان کی وضاحت کریں"
 
 #: bin/options.py:114
 msgid "specify the server port"
-msgstr ""
+msgstr "سرور پورٹ کی وضاحت کریں"
 
 #: bin/options.py:115
 msgid "specify the server ip/name"
-msgstr ""
+msgstr "سرور آئپی/نام کی وضاحت کریں"
 
 #: bin/common/common.py:89
 msgid "Close current tip"
-msgstr ""
+msgstr "موجودھ اشاروں کوبندکریں"
 
 #: bin/common/common.py:90
 msgid ""
@@ -711,7 +716,7 @@
 
 #: bin/common/common.py:100
 msgid "Disable all tips"
-msgstr ""
+msgstr "تمام اشاروں کوغیرفعال کریں"
 
 #: bin/common/common.py:101
 msgid ""
@@ -754,7 +759,7 @@
 
 #: bin/common/common.py:367
 msgid "Support request sent !"
-msgstr ""
+msgstr "مدد کی درخواست بھیج کو دیا گیا!"
 
 #: bin/common/common.py:387 bin/common/common.py:430
 msgid ""
@@ -826,39 +831,43 @@
 
 #: bin/common/common.py:491
 msgid "Error"
-msgstr ""
+msgstr "خرابی"
 
 #: bin/common/common.py:646
 msgid "Open with..."
-msgstr ""
+msgstr "کےساتھ کھولیں۔۔۔"
 
 #: bin/translate.py:183
 #, python-format
 msgid "Unable to set locale %s: %s"
-msgstr ""
+msgstr "مقامی قائم کرنے میں ناکامی %s: %s"
 
 #: bin/printer/printer.py:184
 #, python-format
 msgid "Unable to handle %s filetype"
-msgstr ""
+msgstr "فائل ٹائپ کوسنبھالنےکےقابل نھیں %s"
 
 #: bin/printer/printer.py:189
 msgid ""
 "Linux Automatic Printing not implemented.\n"
 "Use preview option !"
 msgstr ""
+"لینکس خودکار پرنٹنگ لاگو نہیں ھے۔\n"
+"جائزھ کاآپشن استعمال کریں!"
 
 #: bin/printer/printer.py:197
 msgid "Error! No Data found. Make sure you have enough data to print!"
 msgstr ""
+"خرابی! پرنٹ کرنےکیلیےکوئ دیٹانھیں ھے. پرنٹ کرنے کے لئے کافی ڈیٹا یقینی "
+"بنائیں!"
 
 #: bin/printer/printer.py:224
 msgid "Error writing the file!"
-msgstr ""
+msgstr "فائل لکھنے میں خرابی!"
 
 #: bin/openerp-client.py:140
 msgid "Closing OpenERP, KeyboardInterrupt"
-msgstr ""
+msgstr "اوپن ای آر پی بند ھورھی ھے، KeyboardInterrupt"
 
 #: bin/widget_search/reference.py:78 bin/widget_search/filter.py:74
 #: bin/widget_search/selection.py:116 bin/widget_search/spinbutton.py:72
@@ -893,11 +902,11 @@
 
 #: bin/widget_search/char.py:43
 msgid "Error: "
-msgstr ""
+msgstr "خرابی: "
 
 #: bin/widget_search/calendar.py:50 bin/widget_search/calendar.py:177
 msgid "Start date"
-msgstr ""
+msgstr "شروع کرنے کی تاریخ"
 
 #: bin/widget_search/calendar.py:54 bin/widget_search/calendar.py:74
 #: bin/widget_search/calendar.py:181 bin/widget_search/calendar.py:201
@@ -908,7 +917,7 @@
 
 #: bin/widget_search/calendar.py:70 bin/widget_search/calendar.py:197
 msgid "End date"
-msgstr ""
+msgstr "آخری تاریخ"
 
 #: bin/widget_search/calendar.py:129 bin/widget_search/calendar.py:249
 #: bin/widget/view/form_gtk/calendar.py:135
@@ -918,35 +927,35 @@
 
 #: bin/widget_search/custom_filter.py:56
 msgid "contains"
-msgstr ""
+msgstr "مُشتمل ھوتاھے"
 
 #: bin/widget_search/custom_filter.py:57
 msgid "doesn't contain"
-msgstr ""
+msgstr "مُشتمل نھیں ھوتاھے"
 
 #: bin/widget_search/custom_filter.py:58
 msgid "is equal to"
-msgstr ""
+msgstr "کےبرابرھے"
 
 #: bin/widget_search/custom_filter.py:59
 msgid "is not equal to"
-msgstr ""
+msgstr "کےبرابرنھیں ھے"
 
 #: bin/widget_search/custom_filter.py:60
 msgid "greater than"
-msgstr ""
+msgstr "سےبڑھکر"
 
 #: bin/widget_search/custom_filter.py:61
 msgid "less than"
-msgstr ""
+msgstr "سےکمتر"
 
 #: bin/widget_search/custom_filter.py:62
 msgid "in"
-msgstr ""
+msgstr "اندر"
 
 #: bin/widget_search/custom_filter.py:63
 msgid "not in"
-msgstr ""
+msgstr "اندر نھیں"
 
 #: bin/widget_search/custom_filter.py:82
 msgid ""

=== modified file 'bin/release.py'
--- bin/release.py	2011-01-20 19:12:50 +0000
+++ bin/release.py	2011-02-11 07:40:17 +0000
@@ -21,8 +21,8 @@
 #
 
 name = 'openerp-client'
-version = '6.0.1'
-major_version = '6.0'
+version = '6.1-dev'
+major_version = '6.1'
 description = 'OpenERP Client'
 long_desc = '''OpenERP is a complete ERP and CRM. The main features are accounting (analytic
 and financial), stock management, sales and purchases management, tasks

=== modified file 'bin/widget/model/field.py'
--- bin/widget/model/field.py	2011-01-18 08:26:02 +0000
+++ bin/widget/model/field.py	2011-02-11 07:40:17 +0000
@@ -45,12 +45,31 @@
         klass = TYPES.get(type, CharField)
         return klass
 
+class M2O_SelectionField(dict):
+    def __init__(self ,*args, **kwargs):
+        self.swap = {}
+
+    def __setitem__(self, key, value):
+        self.swap[value] = key
+        super(M2O_SelectionField, self).__setitem__(key, value)
+
+    def update(self, *args, **kwargs):
+        for key, val in args[0].items():
+            self.swap[val] = key
+        super(M2O_SelectionField, self).update(args[0])
+
+    def get_value(self, key):
+        return self.get(key, '')
+
+    def get_key(self,value):
+        return self.swap.get(value, False)
 
 class CharField(object):
     def __init__(self, parent, attrs):
         self.parent = parent
         self.attrs = attrs
         self.name = attrs['name']
+        self.selection = M2O_SelectionField()
         self.internal = False
         self.default_attrs = {}
 
@@ -103,12 +122,12 @@
         return True
 
     def get(self, model, check_load=True, readonly=True, modified=False):
-        return model.value.get(self.name, False) or False
+        return model.value.get(self.name, False)
 
     def set_client(self, model, value, test_state=True, force_change=False):
         internal = model.value.get(self.name, False)
         self.set(model, value, test_state)
-        if (internal or False) != (model.value.get(self.name,False) or False):
+        if (internal or False) != (model.value.get(self.name, False) or False):
             model.modified = True
             model.modified_fields.setdefault(self.name)
             self.sig_changed(model)
@@ -135,7 +154,7 @@
         try:
             attrs_changes = eval(self.attrs.get('attrs',"{}"))
         except:
-            attrs_changes = eval(self.attrs.get('attrs',"{}"),model.value)
+            attrs_changes = eval(self.attrs.get('attrs',"{}"), model.value)
             for k,v in attrs_changes.items():
                 for i in range(0,len(v)):
                    if v[i][2]:
@@ -236,14 +255,21 @@
 
 
 class SelectionField(CharField):
+    
+    def get(self, model, check_load=True, readonly=True, modified=False):
+        return model.value.get(self.name, False)    
+    
     def set(self, model, value, test_state=True, modified=False):
+        self.selection.update(dict(self.attrs.get('selection',[])))
+        if isinstance(value,(list,tuple)) and len(value):
+            self.selection[value[0]] = value[1]
+            
         value = isinstance(value,(list,tuple)) and len(value) and value[0] or value
 
         if not self.get_state_attrs(model).get('required', False) and value is None:
             super(SelectionField, self).set(model, value, test_state, modified)
-
-        if value in [sel[0] for sel in self.attrs['selection']]:
-            super(SelectionField, self).set(model, value, test_state, modified)
+        
+        super(SelectionField, self).set(model, value, test_state, modified)
 
 class FloatField(CharField):
     def validate(self, model):
@@ -297,6 +323,7 @@
     def get_client(self, model):
         #model._check_load()
         if model.value[self.name]:
+            self.selection.update(dict([model.value[self.name]]))
             return model.value[self.name][1]
         return False
 

=== modified file 'bin/widget/model/record.py'
--- bin/widget/model/record.py	2011-01-25 06:56:46 +0000
+++ bin/widget/model/record.py	2011-02-11 07:40:17 +0000
@@ -33,6 +33,7 @@
 from gtk import glade
 import tools
 from field import O2MField
+from field import SelectionField
 
 class EvalEnvironment(object):
     def __init__(self, parent):
@@ -230,6 +231,9 @@
             if self.mgroup.mfields[fieldname].attrs.get('on_change',False):
                 fields_with_on_change[fieldname] = value
             else:
+                if self.mgroup.mfields[fieldname].attrs.get('widget') == 'selection' and value:
+                    relation = self.mgroup.mfields[fieldname].attrs['relation']
+                    value = rpc.session.rpc_exec_auth('/object', 'execute', relation, 'name_search', '', [('id','=',value)], 'ilike')[0]
                 self.mgroup.mfields[fieldname].set_default(self, value)
         for field, value in fields_with_on_change.items():
             self.mgroup.mfields[field].set_default(self, value)
@@ -291,7 +295,7 @@
         d['current_date'] = time.strftime('%Y-%m-%d')
         d['time'] = time
         d['context'] = self.context_get()
-        d['active_id'] = self.id
+        d['active_id'] = self.id or False
         if self.parent:
             d['parent'] = EvalEnvironment(self.parent)
         val = tools.expr_eval(dom, d)

=== modified file 'bin/widget/screen/screen.py'
--- bin/widget/screen/screen.py	2011-01-27 12:43:03 +0000
+++ bin/widget/screen/screen.py	2011-02-11 07:40:17 +0000
@@ -593,6 +593,8 @@
                 if attrs.get('widget', False):
                     if attrs['widget']=='one2many_list':
                         attrs['widget']='one2many'
+#                    attrs['py_field_type'] = attrs['type']
+                    attrs['py_type'] = fields[str(attrs['name'])]['type']
                     attrs['type'] = attrs['widget']
                 if attrs.get('selection',[]):
                     attrs['selection'] = eval(attrs['selection'])

=== modified file 'bin/widget/view/form_gtk/selection.py'
--- bin/widget/view/form_gtk/selection.py	2010-07-16 05:41:32 +0000
+++ bin/widget/view/form_gtk/selection.py	2011-02-11 07:40:17 +0000
@@ -23,7 +23,7 @@
 import interface
 import gtk
 import gobject
-
+from rpc import RPCProxy
 import gettext
 
 class selection(interface.widget_interface):
@@ -31,109 +31,91 @@
         interface.widget_interface.__init__(self, window, parent, model, attrs)
 
         self.widget = gtk.HBox(spacing=3)
-        self.entry = gtk.ComboBoxEntry()
+        self.function = self.attrs.get('has_func', False)
+        self.name = attrs['name']
+        self.attrs = attrs
+        self.entry = gtk.combo_box_entry_new_text()
+        self.entry.connect('notify::popup-shown', self.popup_show)
         self.child = self.entry.get_child()
+        self.relation_model = self.attrs.get('relation', '')
+        self.object_model = self.attrs.get('model','')
         self.child.set_property('activates_default', True)
         self.child.connect('changed', self.sig_changed)
         self.child.connect('populate-popup', self._menu_open)
-        self.child.connect('key_press_event', self.sig_key_press)
-        self.child.connect('activate', self.sig_activate)
         self.child.connect_after('focus-out-event', self.sig_activate)
-        self.entry.set_size_request(int(attrs.get('size', -1)), -1)
         self.widget.pack_start(self.entry, expand=True, fill=True)
 
         # the dropdown button is not focusable by a tab
         self.widget.set_focus_chain([self.child])
-        self.ok = True
+        self.set_popdown(attrs.get('selection',[]))
         self._selection={}
-
-        self.set_popdown(attrs.get('selection', []))
+        self.entry_text = ""
+
+
+    def popup_show(self, combobox, popup_show):
+        text = self.child.get_text()
+        if self._view.modelfield.selection.get_key(text):
+            text = ""
+        if combobox.get_property('popup-shown'):
+            domain = self._view.modelfield.domain_get(self._view.model)
+            context = self._view.modelfield.context_get(self._view.model)
+            if self.attrs.get('widget') == 'selection':
+                rpc = RPCProxy(self.relation_model)
+                selection = rpc.name_search(text, domain, 'ilike', context, False)
+                self.set_popdown(selection)
+            if self.function:
+                rpc = RPCProxy(self.object_model)
+                selection = rpc.fields_get(self.name, context)[self.name]['selection']
+                self.set_popdown(selection)
 
     def set_popdown(self, selection):
-        self.model = gtk.ListStore(gobject.TYPE_STRING)
+        self.model = self.entry.get_model()
+        self.model.clear()
         self._selection={}
         lst = []
-        for (value, name) in selection:
-            name = str(name)
+        if not selection:
+            selection = [(False, '')]
+        for (i,j) in selection:
+            name = str(j)
             lst.append(name)
-            self._selection[name] = value
-            i = self.model.append()
-            self.model.set(i, 0, name)
-        self.entry.set_model(self.model)
-        self.entry.set_text_column(0)
-        return lst
+            self._selection[i]=name
+            self.entry.append_text(name)
 
     def _readonly_set(self, value):
         interface.widget_interface._readonly_set(self, value)
         self.entry.set_sensitive(not value)
 
-    def value_get(self):
-        res = self.child.get_text()
-        return self._selection.get(res, False)
-
-    def sig_key_press(self, widget, event):
-        # allow showing available entries by hitting "ctrl+space"
-        completion=gtk.EntryCompletion()
-        if hasattr(completion, 'set_inline_selection'):
-            completion.set_inline_selection(True)
-        if (event.type == gtk.gdk.KEY_PRESS) \
-            and ((event.state & gtk.gdk.CONTROL_MASK) != 0) \
-            and (event.keyval == gtk.keysyms.space):
-            self.entry.popup()
-        elif not (event.keyval == gtk.keysyms.Up or event.keyval == gtk.keysyms.Down):
-            completion.set_match_func(self.match_func,widget)
-            completion.set_model(self.model)
-            widget.set_completion(completion)
-            completion.set_text_column(0)
-    
-    def match_func(self, completion, key, iter, widget):
-         model = completion.get_model()
-         return model[iter][0].lower().find(widget.get_text().lower()) >= 0 and True or False
-     
     def sig_activate(self, *args):
         text = self.child.get_text()
-        value = False
-        if text:
-            for txt, val in self._selection.items():
-                if not val:
-                    continue
-                if txt[:len(text)].lower() == text.lower():
-                    value = val
-                    if len(txt) == len(text):
-                        break
+        value = self._view.modelfield.selection.get_key(text)
+        if not value:
+            self.entry_text = text
         self._view.modelfield.set_client(self._view.model, value, force_change=True)
         self.display(self._view.model, self._view.modelfield)
 
-
     def set_value(self, model, model_field):
-        model_field.set_client(model, self.value_get())
-
-    def _menu_sig_default_set(self):
-        self.set_value(self._view.model, self._view.modelfield)
-        super(selection, self)._menu_sig_default_set()
+        model_field.selection.update(self._selection)
+        text = self.child.get_text()
+        value = False
+        if text:
+            model_field.selection.get_key(text)
+            value  = model_field.selection.get_key(text)
+        model_field.set_client(model, value)
 
     def display(self, model, model_field):
-        self.ok = False
         if not model_field:
             self.child.set_text('')
-            self.ok = True
-            return False
+            return
+        model_field.selection.update(dict(self.attrs.get('selection',[])))
         super(selection, self).display(model, model_field)
-        value = model_field.get(model)
-        if not value:
-            self.child.set_text('')
-        else:
-            found = False
-            for long_text, sel_value in self._selection.items():
-                if sel_value == value:
-                    self.child.set_text(long_text)
-                    found = True
-                    break
-        self.ok = True
+        key = model_field.get(model, False)
+#        model_field.selection.update(self._selection)
+        text = model_field.selection.get_value(key)
+        self.child.set_text(self.entry_text or text)
+        self.entry_text = ""
 
-    def sig_changed(self, *args):
-        if self.ok:
-            self._focus_out()
+    def sig_changed(self, combox):
+        self._focus_out()
 
     def _color_widget(self):
         return self.child
@@ -141,4 +123,3 @@
     def grab_focus(self):
         return self.entry.grab_focus()
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-

=== modified file 'bin/widget/view/list.py'
--- bin/widget/view/list.py	2011-01-17 20:28:40 +0000
+++ bin/widget/view/list.py	2011-02-11 07:40:17 +0000
@@ -851,7 +851,7 @@
                     if col in self.widget_tree.handlers:
                         if self.widget_tree.handlers[col]:
                             renderer.disconnect(self.widget_tree.handlers[col])
-                    self.widget_tree.handlers[col] = renderer.connect_after('editing-started', send_keys, self.widget_tree)
+                    self.widget_tree.handlers[col] = renderer.connect_after('editing-started', send_keys, self.widget_tree, col.name)
 
 
     def set_invisible_attr(self):

=== modified file 'bin/widget/view/tree_gtk/editabletree.py'
--- bin/widget/view/tree_gtk/editabletree.py	2010-12-23 09:52:21 +0000
+++ bin/widget/view/tree_gtk/editabletree.py	2011-02-11 07:40:17 +0000
@@ -149,7 +149,12 @@
     def get_cursor(self):
         res = super(EditableTreeView, self).get_cursor()
         return res
-
+    
+    def get_current_model(self):
+        path, column = self.get_cursor()
+        store = self.get_model()
+        return store.get_value(store.get_iter(path), 0)
+        
     def set_value(self):
         path, column = self.get_cursor()
         store = self.get_model()
@@ -175,7 +180,7 @@
     def on_keypressed(self, entry, event, cell_value):
         path, column = self.get_cursor()
         store = self.get_model()
-        model = store.get_value(store.get_iter(path), 0)
+        model = self.get_current_model()
         if event.keyval in self.leaving_events:
             shift_pressed = bool(gtk.gdk.SHIFT_MASK & event.state)
             if isinstance(entry, gtk.Entry):

=== modified file 'bin/widget/view/tree_gtk/parser.py'
--- bin/widget/view/tree_gtk/parser.py	2011-01-31 10:28:17 +0000
+++ bin/widget/view/tree_gtk/parser.py	2011-02-11 07:40:17 +0000
@@ -33,6 +33,7 @@
 from editabletree import EditableTreeView
 from widget.view import interface
 from widget.view.list import group_record
+from widget.model.field import SelectionField, M2OField
 import time
 import date_renderer
 
@@ -47,13 +48,16 @@
 import gobject
 import pango
 
-def send_keys(renderer, entry, position, treeview):
-    if entry:
+def send_keys(renderer, entry, position, treeview, col_name):
+     if entry:
         entry.connect('key_press_event', treeview.on_keypressed, renderer.get_property('text'))
         entry.set_data('renderer', renderer)
         entry.editing_done_id = entry.connect('editing_done', treeview.on_editing_done)
         if isinstance(entry, gtk.ComboBoxEntry):
             entry.connect('changed', treeview.on_editing_done)
+        if isinstance(entry, gtk.ComboBoxEntry):
+            popup = treeview.cells[col_name].popup
+            entry.connect('notify::popup-shown', popup, treeview)
 
 def sort_model(column, screen):
     unsaved_model =  [x for x in screen.models if x.id == None or x.modified]
@@ -107,10 +111,8 @@
         treeview.sequence = False
         treeview.connect("motion-notify-event", treeview.set_tooltip)
         treeview.connect('key-press-event', treeview.on_tree_key_press)
-
         for node in root_node:
             node_attrs = tools.node_attributes(node)
-
             if node.tag == 'button':
                 cell = Cell('button')(node_attrs['string'], treeview, node_attrs)
                 cell.name = node_attrs['name']
@@ -158,16 +160,17 @@
                         self.window)
                 treeview.cells[fname] = cell
                 renderer = cell.renderer
-
+                col = gtk.TreeViewColumn(None, renderer)
+                col.name = fname
                 write_enable = editable and not node_attrs.get('readonly', False)
                 if isinstance(renderer, gtk.CellRendererToggle):
                     renderer.set_property('activatable', write_enable)
                 elif isinstance(renderer, (gtk.CellRendererText, gtk.CellRendererCombo, date_renderer.DecoratorRenderer)):
                     renderer.set_property('editable', write_enable)
                 if write_enable:
-                    handler_id = renderer.connect_after('editing-started', send_keys, treeview)
-
-                col = gtk.TreeViewColumn(None, renderer)
+                    handler_id = renderer.connect_after('editing-started', send_keys, treeview, col.name)
+
+
                 treeview.handlers[col] = handler_id
                 col_label = gtk.Label('')
                 if fields[fname].get('required', False):
@@ -176,7 +179,7 @@
                     col_label.set_text(fields[fname]['string'])
                 col_label.show()
                 col.set_widget(col_label)
-                col.name = fname
+              
                 col._type = fields[fname]['type']
                 col.set_cell_data_func(renderer, cell.setter)
                 col.set_clickable(True)
@@ -549,6 +552,13 @@
             return rpc.name_get([found[0]], context)[0]
         else:
             return False, None
+    
+    def get_textual_value(self, model):
+        if isinstance(model[self.field_name], SelectionField):
+            key =  model[self.field_name].get_client(model)
+            return model[self.field_name].selection.get_value(key)
+        return model[self.field_name].get_client(model) or ''
+
 
 
 class O2M(Char):
@@ -609,29 +619,48 @@
     def __init__(self, *args):
         super(Selection, self).__init__(*args)
         self.renderer = gtk.CellRendererCombo()
-        selection_data = gtk.ListStore(str, str)
-        for x in self.attrs.get('selection', []):
-            selection_data.append(x)
-        self.renderer.set_property('model', selection_data)
+        self.selection_data = gtk.ListStore(str, str)
+        selection = self.attrs.get('selection', [])
+        for x in selection:
+            self.selection_data.append(x)
+        if not selection:
+            self.selection_data.append([False, ''])
+        self.renderer.set_property('model', self.selection_data)
         self.renderer.set_property('text-column', 1)
+        self.relation = self.attrs.get('relation')
 
     def get_textual_value(self, model):
-        selection = dict(self.attrs['selection'])
-        selection_value = selection.get(model[self.field_name].get(model), '')
-        if isinstance(model, group_record):
-            return selection_value +  model[self.field_name].count
-        return selection_value
+        if not isinstance(model, group_record):
+            key = model[self.field_name].get(model)
+            selection_value = model[self.field_name].selection.get_value(key)
+            return selection_value
+        else:
+            key = model[self.field_name].get(model)
+            return model.mgroup.mfields[self.field_name].selection.get_value(key) + model[self.field_name].count
+    
+    def popup(self, combobox, para, treeview):
+        if combobox.get_property('popup-shown') and self.relation:
+            entry = combobox.get_child()
+            text = entry.get_property('text')
+            rpc = RPCProxy(self.relation)
+            model = treeview.get_current_model()
+            domain = model[self.field_name].domain_get(model)
+            context = model[self.field_name].context_get(model)
+            key = model[self.field_name].selection.get_key(text)
+            if key:
+                text = ''
+            selection = rpc.name_search(text, domain, 'ilike',context, False)
+            if selection:
+                self.selection_data.clear()
+            model = treeview.get_current_model()
+            model[self.field_name].selection.update(dict(selection))
+            for x in selection:
+                self.selection_data.append(x)
 
     def value_from_text(self, model, text):
-        selection = self.attrs['selection']
-        text = tools.ustr(text)
-        res = False
-        for val, txt in selection:
-            if txt[:len(text)].lower() == text.lower():
-                if len(txt) == len(text):
-                    return val
-                res = val
-        return res
+        key = model[self.field_name].get(model)
+        selection_value = model[self.field_name].selection.get_value(key)
+        return model[self.field_name].selection.get_key(text)
 
 
 class ProgressBar(object):

=== modified file 'bin/widget_search/checkbox.py'
--- bin/widget_search/checkbox.py	2010-09-21 09:39:49 +0000
+++ bin/widget_search/checkbox.py	2011-02-11 07:40:17 +0000
@@ -38,10 +38,11 @@
         self.entry = self.widget.child
         self.entry.set_property('activates_default', True)
         self.entry.set_editable(False)
-        if self.default_search:
-            if self.default_search == 1:
-                self.default_search = 'Yes'
-            self.widget.child.set_text(self.default_search.capitalize())
+        if bool(self.default_search):
+            self.default_search = _('Yes')
+        elif not self.default_search == '':
+            self.default_search = _('No')
+        self.widget.child.set_text(self.default_search.capitalize())
 
     def clear(self):
         self.widget.child.set_text('')
@@ -57,7 +58,7 @@
             'domain':domain,
             'context': context
         }
-        
+
     def grab_focus(self):
         self.widget.child.grab_focus()
 

=== modified file 'bin/widget_search/selection.py'
--- bin/widget_search/selection.py	2011-01-17 19:11:21 +0000
+++ bin/widget_search/selection.py	2011-02-11 07:40:17 +0000
@@ -28,15 +28,15 @@
 class selection(wid_int.wid_int):
     def __init__(self, name, parent, attrs={}, model=None, screen=None):
         wid_int.wid_int.__init__(self, name, parent, attrs, screen)
-
         self.widget = gtk.combo_box_entry_new_text()
+        self.widget.connect('notify::popup-shown', self.popup_show)
+        self.context = screen.context
+        self.relation_model = self.attrs.get('relation', '')
         self.widget.child.set_editable(True)
         self.attrs = attrs
         self._selection = {}
         self.name = name
-        self.val_id = False
-        if 'selection' in attrs:
-            self.set_popdown(attrs.get('selection',[]))
+        self.set_popdown(attrs.get('selection',[]))
         if self.default_search:
             if self.attrs['type'] == 'many2one':
                 self._value_set(int(self.default_search))
@@ -45,6 +45,16 @@
                 if self.widget.child.get_text() in self._selection.keys():
                     self.widget.set_active(self.indexes[self.widget.child.get_text()]-1)
 
+    def popup_show(self, combobox, popup_show):
+        search_text = self.widget.child.get_text()
+        if self._selection.get(search_text, False):
+            search_text =''
+        if combobox.get_property('popup-shown') and self.attrs['type'] == 'many2one':
+            selection = rpc.session.rpc_exec_auth('/object', 'execute', self.relation_model, 'name_search', search_text , [] , 'ilike', self.context, False)
+            self.set_popdown(selection)
+            if not selection:
+                 self.widget.child.set_text('')
+
     def set_popdown(self, selection):
         self.model = self.widget.get_model()
         self.model.clear()

=== modified file 'bin/widget_search/wid_int.py'
--- bin/widget_search/wid_int.py	2010-04-02 13:49:07 +0000
+++ bin/widget_search/wid_int.py	2011-02-11 07:40:17 +0000
@@ -39,6 +39,10 @@
                default_context = call.context
             context_str = 'search_default_' + str(self.attrs['name'])
             self.default_search = default_context.get(context_str,False)
+            if attrs.get('type') == 'boolean':
+                if not default_context.has_key(context_str):
+                    self.default_search = ''
+
 
     def clear(self):
         self.value = ''


Follow ups