openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #02984
[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