Merge lp:~openerp-dev/openobject-client/m2o_with_selection into lp:~openerp-dev/openobject-client/trunk-dev-client
- m2o_with_selection
- Merge into trunk-dev-client
Status: | Rejected |
---|---|
Rejected by: | Naresh(OpenERP) |
Proposed branch: | lp:~openerp-dev/openobject-client/m2o_with_selection |
Merge into: | lp:~openerp-dev/openobject-client/trunk-dev-client |
Diff against target: |
1858 lines (+382/-342) 13 files modified
bin/po/pt_BR.po (+151/-183) bin/po/ur.po (+47/-38) bin/release.py (+2/-2) bin/widget/model/field.py (+33/-6) bin/widget/model/record.py (+5/-1) bin/widget/screen/screen.py (+2/-0) bin/widget/view/form_gtk/selection.py (+54/-73) bin/widget/view/list.py (+1/-1) bin/widget/view/tree_gtk/editabletree.py (+7/-2) bin/widget/view/tree_gtk/parser.py (+56/-27) bin/widget_search/checkbox.py (+6/-5) bin/widget_search/selection.py (+14/-4) bin/widget_search/wid_int.py (+4/-0) |
To merge this branch: | bzr merge lp:~openerp-dev/openobject-client/m2o_with_selection |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Naresh(OpenERP) | Needs Resubmitting | ||
Review via email: mp+49360@code.launchpad.net |
Commit message
Description of the change
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:/
Naresh(OpenERP) (nch-openerp) wrote : | # |
Unmerged revisions
- 1464. By Ravi Gadhia (OpenERP)
-
call field_get to get selection value because directly rpc function call raise access error when function is private
- 1463. By Ravi Gadhia (OpenERP)
-
[FIX/IMP] Clean up + fixes
- 1462. By Ravi Gadhia (OpenERP)
-
[IMP] List view: add context, domain, limit False on selection field
- 1461. By Ravi Gadhia (OpenERP)
-
[IMP] Form view: add context, domain on selection field + usability imrovement
- 1460. By Ravi Gadhia (OpenERP)
-
List view selection field improve + small fix
- 1459. By Ravi Gadhia (OpenERP)
-
[IMP] Reimplement selection field for List view
- 1458. By Ravi Gadhia (OpenERP)
-
[IMP] Reimplement selection field for form view (selection data should not pre loaded)
- 1457. By Ravi Gadhia (OpenERP)
-
Merge with trunk client
- 1456. By Ravi Gadhia (OpenERP)
-
[IMP] search_view: seletion fields
- 1455. By Ravi Gadhia (OpenERP)
-
[IMP] Search view: m20 with selection widget make rpc call when combobox popup
Preview Diff
1 | === modified file 'bin/po/pt_BR.po' |
2 | --- bin/po/pt_BR.po 2011-01-25 10:58:55 +0000 |
3 | +++ bin/po/pt_BR.po 2011-02-11 07:40:17 +0000 |
4 | @@ -8,13 +8,13 @@ |
5 | "Project-Id-Version: openobject-client\n" |
6 | "Report-Msgid-Bugs-To: \n" |
7 | "POT-Creation-Date: 2010-12-13 18:11+0100\n" |
8 | -"PO-Revision-Date: 2011-01-24 22:48+0000\n" |
9 | -"Last-Translator: Adriano Prado <adrianojprado@hotmail.com>\n" |
10 | +"PO-Revision-Date: 2011-02-05 12:45+0000\n" |
11 | +"Last-Translator: Emerson <Unknown>\n" |
12 | "Language-Team: Brazilian Portuguese <pt_BR@li.org>\n" |
13 | "MIME-Version: 1.0\n" |
14 | "Content-Type: text/plain; charset=UTF-8\n" |
15 | "Content-Transfer-Encoding: 8bit\n" |
16 | -"X-Launchpad-Export-Date: 2011-01-25 04:53+0000\n" |
17 | +"X-Launchpad-Export-Date: 2011-02-06 04:53+0000\n" |
18 | "X-Generator: Launchpad (build 12177)\n" |
19 | "Language: pt_BR\n" |
20 | |
21 | @@ -109,7 +109,7 @@ |
22 | |
23 | #: bin/modules/gui/main.py:194 |
24 | msgid "Bad Super Administrator Password" |
25 | -msgstr "" |
26 | +msgstr "Senha do Super Administrador Errada" |
27 | |
28 | #: bin/modules/gui/main.py:218 |
29 | msgid "Migration Scripts" |
30 | @@ -137,11 +137,11 @@ |
31 | |
32 | #: bin/modules/gui/main.py:264 |
33 | msgid "Migrate Database" |
34 | -msgstr "Migrar base de dados" |
35 | +msgstr "Migrar Base de Dados" |
36 | |
37 | #: bin/modules/gui/main.py:281 |
38 | msgid "Database" |
39 | -msgstr "Banco de Dados" |
40 | +msgstr "Base de Dados" |
41 | |
42 | #: bin/modules/gui/main.py:293 |
43 | msgid "Your database has been upgraded." |
44 | @@ -149,18 +149,15 @@ |
45 | |
46 | #: bin/modules/gui/main.py:295 |
47 | msgid "Your databases have been upgraded." |
48 | -msgstr "suas bases de dados já foram atualizadas." |
49 | +msgstr "Suas bases de dados já foram atualizadas." |
50 | |
51 | #: bin/modules/gui/main.py:297 |
52 | msgid "You have not selected a database" |
53 | -msgstr "Você não selecionou um Banco de Dados" |
54 | +msgstr "Você não selecionou uma base de dados" |
55 | |
56 | -# |
57 | -# File: bin/modules/gui/main.py, line: 165 |
58 | -# File: bin/modules/gui/main.py, line: 1161 |
59 | #: bin/modules/gui/main.py:361 |
60 | msgid "No database found, you must create one !" |
61 | -msgstr "Banco de dados não encontrado, você deve criar um !" |
62 | +msgstr "Base de dados não encontrada, você deve criar uma !" |
63 | |
64 | # |
65 | # File: bin/modules/gui/main.py, line: 154 |
66 | @@ -185,64 +182,43 @@ |
67 | msgid "Sorry,'" |
68 | msgstr "Desculpe,'" |
69 | |
70 | -# |
71 | -# File: bin/modules/gui/main.py, line: 309 |
72 | -# File: bin/modules/gui/main.py, line: 312 |
73 | #: bin/modules/gui/main.py:610 bin/modules/gui/main.py:613 |
74 | msgid "Bad database name !" |
75 | -msgstr "Nome do banco de dados inválido !" |
76 | +msgstr "Nome da base de dados inválida !" |
77 | |
78 | -# |
79 | -# File: bin/modules/gui/main.py, line: 312 |
80 | #: bin/modules/gui/main.py:613 |
81 | msgid "" |
82 | "The database name must contain only normal characters or \"_\".\n" |
83 | "You must avoid all accents, space or special characters." |
84 | msgstr "" |
85 | -"O nome do banco de dados deve conter apenas caracteres normais ou \"_\".\n" |
86 | +"O nome da base de dados deve conter apenas caracteres normais ou \"_\".\n" |
87 | "Você deve evitar acentos, espaços e caracteres especiais." |
88 | |
89 | -# |
90 | -# File: bin/modules/gui/main.py, line: 372 |
91 | -# File: bin/modules/gui/main.py, line: 374 |
92 | -# File: bin/modules/gui/main.py, line: 376 |
93 | #: bin/modules/gui/main.py:647 bin/modules/gui/main.py:649 |
94 | #: bin/modules/gui/main.py:651 |
95 | msgid "Could not create database." |
96 | -msgstr "Não foi possível criar banco de dados." |
97 | +msgstr "Não foi possível criar a base de dados." |
98 | |
99 | -# |
100 | -# File: bin/modules/gui/main.py, line: 372 |
101 | #: bin/modules/gui/main.py:647 |
102 | msgid "Database already exists !" |
103 | -msgstr "Banco de dados já existe !" |
104 | +msgstr "Base de dados já existe !" |
105 | |
106 | -# |
107 | -# File: bin/modules/gui/main.py, line: 374 |
108 | -# File: bin/modules/gui/main.py, line: 1060 |
109 | -# File: bin/modules/gui/main.py, line: 1079 |
110 | -# File: bin/modules/gui/main.py, line: 1149 |
111 | #: bin/modules/gui/main.py:649 bin/modules/gui/main.py:1383 |
112 | #: bin/modules/gui/main.py:1403 bin/modules/gui/main.py:1482 |
113 | msgid "Bad database administrator password !" |
114 | -msgstr "Senha do administrador do banco de dados inválida !" |
115 | +msgstr "Senha do administrador da base de dados inválida !" |
116 | |
117 | -# |
118 | -# File: bin/modules/gui/main.py, line: 376 |
119 | -# File: bin/modules/gui/main.py, line: 383 |
120 | #: bin/modules/gui/main.py:651 bin/modules/gui/main.py:658 |
121 | msgid "Error during database creation !" |
122 | -msgstr "Erro durante a criação do banco de dados !" |
123 | +msgstr "Erro durante a criação da base de dados !" |
124 | |
125 | -# |
126 | -# File: bin/modules/gui/main.py, line: 383 |
127 | #: bin/modules/gui/main.py:658 |
128 | msgid "" |
129 | "The server crashed during installation.\n" |
130 | "We suggest you to drop this database." |
131 | msgstr "" |
132 | "O servidor falhou durante a instalação.\n" |
133 | -"Sugerimos que você apague este banco de dados." |
134 | +"Sugerimos que você apague esta base de dados." |
135 | |
136 | # |
137 | # File: bin/modules/gui/main.py, line: 445 |
138 | @@ -285,12 +261,12 @@ |
139 | "Please double-check the database name or contact your administrator to " |
140 | "verify the database status." |
141 | msgstr "" |
142 | -"Por favor, verifique o nome do banco ou entre em contato com o administrador " |
143 | -"para verificar o status de banco de dados." |
144 | +"Por favor, verifique o nome da base ou entre em contato com o administrador " |
145 | +"para verificar o status da base de dados." |
146 | |
147 | #: bin/modules/gui/main.py:1037 |
148 | msgid "Database cannot be accessed or does not exist" |
149 | -msgstr "Banco de dados não pode ser acessado ou não existe" |
150 | +msgstr "Base de dados não pode ser acessada ou não existe" |
151 | |
152 | # |
153 | # File: bin/modules/gui/main.py, line: 746 |
154 | @@ -360,29 +336,21 @@ |
155 | msgid "Attachments" |
156 | msgstr "Anexos" |
157 | |
158 | -# |
159 | -# File: bin/modules/gui/main.py, line: 1051 |
160 | #: bin/modules/gui/main.py:1374 |
161 | msgid "Delete a database" |
162 | -msgstr "Apagar um banco de dados" |
163 | +msgstr "Apagar uma base de dados" |
164 | |
165 | -# |
166 | -# File: bin/modules/gui/main.py, line: 1057 |
167 | #: bin/modules/gui/main.py:1380 |
168 | msgid "Database dropped successfully !" |
169 | -msgstr "Banco de dados apagado com sucesso !" |
170 | +msgstr "Base de dados apagada com sucesso !" |
171 | |
172 | -# |
173 | -# File: bin/modules/gui/main.py, line: 1060 |
174 | #: bin/modules/gui/main.py:1383 |
175 | msgid "Could not drop database." |
176 | -msgstr "Não foi possível apagar o banco de dados." |
177 | +msgstr "Não foi possível apagar a base de dados." |
178 | |
179 | -# |
180 | -# File: bin/modules/gui/main.py, line: 1062 |
181 | #: bin/modules/gui/main.py:1385 |
182 | msgid "Couldn't drop database" |
183 | -msgstr "Não foi possível apagar o banco de dados." |
184 | +msgstr "Não foi possível apagar a base de dados." |
185 | |
186 | # |
187 | # File: bin/widget/view/form_gtk/image.py, line: 110 |
188 | @@ -394,23 +362,17 @@ |
189 | msgid "Open..." |
190 | msgstr "Abrir..." |
191 | |
192 | -# |
193 | -# File: bin/modules/gui/main.py, line: 1076 |
194 | #: bin/modules/gui/main.py:1400 |
195 | msgid "Database restored successfully !" |
196 | -msgstr "Banco de dados restaurado com sucesso !" |
197 | +msgstr "Base de dados restaurada com sucesso !" |
198 | |
199 | -# |
200 | -# File: bin/modules/gui/main.py, line: 1079 |
201 | #: bin/modules/gui/main.py:1403 |
202 | msgid "Could not restore database." |
203 | -msgstr "Não foi possível restaurar o banco de dados." |
204 | +msgstr "Não foi possível restaurar a base de dados." |
205 | |
206 | -# |
207 | -# File: bin/modules/gui/main.py, line: 1081 |
208 | #: bin/modules/gui/main.py:1405 |
209 | msgid "Couldn't restore database" |
210 | -msgstr "Não foi possível restaurar o banco de dados." |
211 | +msgstr "Não foi possível restaurar a base de dados." |
212 | |
213 | #: bin/modules/gui/main.py:1444 |
214 | msgid "" |
215 | @@ -438,12 +400,9 @@ |
216 | msgid "Error, password not changed." |
217 | msgstr "Erro, senha não alterada." |
218 | |
219 | -# |
220 | -# File: bin/modules/gui/main.py, line: 1133 |
221 | -# File: bin/modules/gui/main.py, line: 1153 |
222 | #: bin/modules/gui/main.py:1463 bin/modules/gui/main.py:1486 |
223 | msgid "Backup a database" |
224 | -msgstr "Fazer backup de um banco de dados" |
225 | +msgstr "Fazer backup de uma base de dados" |
226 | |
227 | #: bin/modules/gui/main.py:1466 bin/modules/gui/window/win_export.py:328 |
228 | #: bin/printer/printer.py:216 bin/widget/view/form_gtk/image.py:129 |
229 | @@ -453,17 +412,15 @@ |
230 | |
231 | #: bin/modules/gui/main.py:1479 |
232 | msgid "Database backed up successfully !" |
233 | -msgstr "Base de dados salvaguardada com sucesso." |
234 | +msgstr "Backup da base de dados criado com sucesso !" |
235 | |
236 | #: bin/modules/gui/main.py:1482 |
237 | msgid "Could not backup the database." |
238 | -msgstr "Não pôde salvaguardar a base de dados" |
239 | +msgstr "O backup da base de dados não pode ser criado." |
240 | |
241 | -# |
242 | -# File: bin/modules/gui/main.py, line: 1151 |
243 | #: bin/modules/gui/main.py:1484 |
244 | msgid "Couldn't backup database." |
245 | -msgstr "Não foi possível fazer backup do banco de dados." |
246 | +msgstr "O backup da base de dados não pode ser criado." |
247 | |
248 | #: bin/modules/gui/window/form.py:173 |
249 | msgid "Resource ID does not exist for this object!" |
250 | @@ -517,7 +474,7 @@ |
251 | |
252 | #: bin/modules/gui/window/form.py:258 |
253 | msgid "Internal Module Data ID" |
254 | -msgstr "" |
255 | +msgstr "Data ID Interna do Módulo" |
256 | |
257 | # |
258 | # File: bin/modules/gui/window/form.py, line: 230 |
259 | @@ -671,6 +628,12 @@ |
260 | "\n" |
261 | "%s" |
262 | msgstr "" |
263 | +"Erro na importação deste registro:\n" |
264 | +"%s\n" |
265 | +"Mensagem:\n" |
266 | +"%s\n" |
267 | +"\n" |
268 | +"%s" |
269 | |
270 | #: bin/modules/gui/window/win_import.py:69 |
271 | msgid "Importation Error !" |
272 | @@ -701,6 +664,8 @@ |
273 | "Error processing your first line of the file.\n" |
274 | "Field %s is unknown !" |
275 | msgstr "" |
276 | +"Erro no processamento da primeira linha do arquivo.\n" |
277 | +"Campo %s desconhecido !" |
278 | |
279 | #: bin/modules/gui/window/win_import.py:190 |
280 | msgid "Import Error." |
281 | @@ -712,7 +677,7 @@ |
282 | |
283 | #: bin/modules/gui/window/win_extension.py:42 |
284 | msgid "Extension" |
285 | -msgstr "" |
286 | +msgstr "Extensão" |
287 | |
288 | #: bin/modules/gui/window/win_extension.py:42 |
289 | msgid "Application" |
290 | @@ -720,7 +685,7 @@ |
291 | |
292 | #: bin/modules/gui/window/win_extension.py:42 |
293 | msgid "Print Processor" |
294 | -msgstr "" |
295 | +msgstr "Processador de Impressão" |
296 | |
297 | # |
298 | # File: bin/modules/gui/window/win_extension.py, line: 115 |
299 | @@ -840,7 +805,7 @@ |
300 | |
301 | #: bin/modules/gui/window/win_export.py:284 |
302 | msgid "What is the name of this export ?" |
303 | -msgstr "" |
304 | +msgstr "Qual o nome desta exportação ?" |
305 | |
306 | #: bin/modules/gui/window/win_export.py:320 |
307 | msgid "Exportation Error !" |
308 | @@ -908,7 +873,7 @@ |
309 | |
310 | #: bin/common/common.py:89 |
311 | msgid "Close current tip" |
312 | -msgstr "" |
313 | +msgstr "Fechar a dica atual" |
314 | |
315 | #: bin/common/common.py:90 |
316 | msgid "" |
317 | @@ -920,7 +885,7 @@ |
318 | |
319 | #: bin/common/common.py:100 |
320 | msgid "Disable all tips" |
321 | -msgstr "" |
322 | +msgstr "Desligar todas as dicas" |
323 | |
324 | #: bin/common/common.py:101 |
325 | msgid "" |
326 | @@ -929,10 +894,14 @@ |
327 | "To re-enable tips you need to check the <b>'Menu Tips'</b> option in the " |
328 | "user preferences." |
329 | msgstr "" |
330 | +"<span foreground=\"darkred\"><b>Desligar todas as dicas:</b></span>\n" |
331 | +"Isto vai desligar a apresentação das dicas em todos os itens de menu.\n" |
332 | +"Para ligar novamente marque a opção <b>'Dicas de Menu'</b> nas preferências " |
333 | +"de usuário." |
334 | |
335 | #: bin/common/common.py:115 bin/common/common.py:117 |
336 | msgid "Tips" |
337 | -msgstr "" |
338 | +msgstr "Dicas" |
339 | |
340 | # |
341 | # File: bin/modules/action/wizard.py, line: 133 |
342 | @@ -958,15 +927,15 @@ |
343 | #: bin/common/common.py:190 |
344 | #, python-format |
345 | msgid "Ensure that the file %s is correct" |
346 | -msgstr "" |
347 | +msgstr "Certifique-se que o arquivo %s está correto" |
348 | |
349 | #: bin/common/common.py:364 |
350 | msgid " has reported the following bug:\n" |
351 | -msgstr "" |
352 | +msgstr " notificou o seguinte erro:\n" |
353 | |
354 | #: bin/common/common.py:364 |
355 | msgid "remarks" |
356 | -msgstr "" |
357 | +msgstr "comentários" |
358 | |
359 | # |
360 | # File: bin/common/common.py, line: 298 |
361 | @@ -1082,6 +1051,8 @@ |
362 | #: bin/printer/printer.py:197 |
363 | msgid "Error! No Data found. Make sure you have enough data to print!" |
364 | msgstr "" |
365 | +"Erro! Nenhuma informação encontrada. Certifique-se que você tem informações " |
366 | +"para imprimir!" |
367 | |
368 | # |
369 | # File: bin/printer/printer.py, line: 215 |
370 | @@ -1149,7 +1120,7 @@ |
371 | |
372 | #: bin/widget_search/char.py:43 |
373 | msgid "Error: " |
374 | -msgstr "" |
375 | +msgstr "Erro: " |
376 | |
377 | # |
378 | # File: bin/widget_search/calendar.py, line: 55 |
379 | @@ -1182,35 +1153,35 @@ |
380 | |
381 | #: bin/widget_search/custom_filter.py:56 |
382 | msgid "contains" |
383 | -msgstr "" |
384 | +msgstr "contém" |
385 | |
386 | #: bin/widget_search/custom_filter.py:57 |
387 | msgid "doesn't contain" |
388 | -msgstr "" |
389 | +msgstr "não contém" |
390 | |
391 | #: bin/widget_search/custom_filter.py:58 |
392 | msgid "is equal to" |
393 | -msgstr "" |
394 | +msgstr "é igual a" |
395 | |
396 | #: bin/widget_search/custom_filter.py:59 |
397 | msgid "is not equal to" |
398 | -msgstr "" |
399 | +msgstr "não é igual a" |
400 | |
401 | #: bin/widget_search/custom_filter.py:60 |
402 | msgid "greater than" |
403 | -msgstr "" |
404 | +msgstr "maior que" |
405 | |
406 | #: bin/widget_search/custom_filter.py:61 |
407 | msgid "less than" |
408 | -msgstr "" |
409 | +msgstr "menor que" |
410 | |
411 | #: bin/widget_search/custom_filter.py:62 |
412 | msgid "in" |
413 | -msgstr "" |
414 | +msgstr "em" |
415 | |
416 | #: bin/widget_search/custom_filter.py:63 |
417 | msgid "not in" |
418 | -msgstr "" |
419 | +msgstr "não em" |
420 | |
421 | #: bin/widget_search/custom_filter.py:82 |
422 | msgid "" |
423 | @@ -1218,6 +1189,10 @@ |
424 | "For Date and DateTime Formats, specify text in '%Y-%m-%d' and '%Y-%m-%d " |
425 | "%H:%M:%S' formats respectively." |
426 | msgstr "" |
427 | +"Entre com valores separados por ',' se o operador 'em' ou 'não em' for " |
428 | +"escolhido.\n" |
429 | +"Para Formatos Data e Data e Hora, especifique o texto no formato '%Y-%m-%d' " |
430 | +"e '%Y-%m-%d %H:%M:%S' respectivamente." |
431 | |
432 | # |
433 | # File: bin/widget_search/checkbox.py, line: 36 |
434 | @@ -1240,7 +1215,7 @@ |
435 | |
436 | #: bin/widget/view/form.py:141 |
437 | msgid "Action not defined !" |
438 | -msgstr "" |
439 | +msgstr "Ação não definida !" |
440 | |
441 | # |
442 | # File: bin/widget/view/form.py, line: 182 |
443 | @@ -1296,19 +1271,19 @@ |
444 | |
445 | #: bin/widget/view/screen_container.py:73 |
446 | msgid "--Actions--" |
447 | -msgstr "" |
448 | +msgstr "--Ações--" |
449 | |
450 | #: bin/widget/view/screen_container.py:73 |
451 | msgid "Save as a Shortcut" |
452 | -msgstr "" |
453 | +msgstr "Gravar como Atalho" |
454 | |
455 | #: bin/widget/view/screen_container.py:73 |
456 | msgid "Save as a Filter" |
457 | -msgstr "" |
458 | +msgstr "Gravar como Filtro" |
459 | |
460 | #: bin/widget/view/screen_container.py:73 |
461 | msgid "Manage Filters" |
462 | -msgstr "" |
463 | +msgstr "Gerenciar Filtros" |
464 | |
465 | #: bin/widget/view/tree_gtk/parser.py:61 |
466 | msgid "" |
467 | @@ -1316,6 +1291,9 @@ |
468 | "\n" |
469 | "Please Save them before sorting !" |
470 | msgstr "" |
471 | +"Você tem registros sem gravar ! \n" |
472 | +"\n" |
473 | +"Favor Gravar antes de ordenar !" |
474 | |
475 | # |
476 | # File: bin/widget/view/tree_gtk/editabletree.py, line: 125 |
477 | @@ -1367,46 +1345,46 @@ |
478 | |
479 | #: bin/widget/view/diagram_gtk/xdot.py:1712 |
480 | msgid "Add New Node" |
481 | -msgstr "" |
482 | +msgstr "Adicionar Novo Nó" |
483 | |
484 | #: bin/widget/view/diagram_gtk/xdot.py:1713 |
485 | msgid "Add New Edge" |
486 | -msgstr "" |
487 | +msgstr "Adicionar Nova Borda" |
488 | |
489 | #: bin/widget/view/diagram_gtk/xdot.py:1714 |
490 | msgid "Enlarge the Diagram" |
491 | -msgstr "" |
492 | +msgstr "Ampliar o Diagrama" |
493 | |
494 | #: bin/widget/view/diagram_gtk/xdot.py:1715 |
495 | msgid "Shrink the Diagram" |
496 | -msgstr "" |
497 | +msgstr "Diminuir o Diagrama" |
498 | |
499 | #: bin/widget/view/diagram_gtk/xdot.py:1716 |
500 | msgid "Fit the diagram to the window" |
501 | -msgstr "" |
502 | +msgstr "Ajustar o diagrama na janela" |
503 | |
504 | #: bin/widget/view/diagram_gtk/xdot.py:1717 |
505 | msgid "Show the diagram at its normal size" |
506 | -msgstr "" |
507 | +msgstr "Mostrar o diagrama com tamanho normal" |
508 | |
509 | #: bin/widget/view/diagram_gtk/xdot.py:1718 |
510 | msgid "Print the Diagram" |
511 | -msgstr "" |
512 | +msgstr "Imprimir o Diagrama" |
513 | |
514 | #: bin/widget/view/diagram_gtk/xdot.py:1789 |
515 | #, python-format |
516 | msgid "Close Current %s" |
517 | -msgstr "" |
518 | +msgstr "Fechar %s Atual" |
519 | |
520 | #: bin/widget/view/diagram_gtk/xdot.py:1790 |
521 | #, python-format |
522 | msgid "Delete Current %s" |
523 | -msgstr "" |
524 | +msgstr "Excluir %s Atual" |
525 | |
526 | #: bin/widget/view/diagram_gtk/xdot.py:1791 |
527 | #, python-format |
528 | msgid "Edit Current %s" |
529 | -msgstr "" |
530 | +msgstr "Editar %s Atual" |
531 | |
532 | #: bin/widget/view/diagram_gtk/xdot.py:1875 |
533 | msgid " - Dot Viewer" |
534 | @@ -1433,11 +1411,11 @@ |
535 | |
536 | #: bin/widget/view/form_gtk/parser.py:318 |
537 | msgid "Field" |
538 | -msgstr "" |
539 | +msgstr "Campo" |
540 | |
541 | #: bin/widget/view/form_gtk/parser.py:318 |
542 | msgid "Object" |
543 | -msgstr "" |
544 | +msgstr "Objeto" |
545 | |
546 | #: bin/widget/view/form_gtk/parser.py:630 |
547 | msgid "Enter some text to the related field before adding translations!" |
548 | @@ -1458,15 +1436,15 @@ |
549 | |
550 | #: bin/widget/view/form_gtk/one2many_list.py:64 |
551 | msgid "Cancel" |
552 | -msgstr "" |
553 | +msgstr "Cancelar" |
554 | |
555 | #: bin/widget/view/form_gtk/one2many_list.py:70 |
556 | msgid "Save & Close" |
557 | -msgstr "" |
558 | +msgstr "Gravar & Fechar" |
559 | |
560 | #: bin/widget/view/form_gtk/one2many_list.py:75 |
561 | msgid "Save & New" |
562 | -msgstr "" |
563 | +msgstr "Gravar & Novo" |
564 | |
565 | # |
566 | # File: bin/widget/view/form_gtk/interface.py, line: 47 |
567 | @@ -1503,22 +1481,22 @@ |
568 | #: bin/widget/view/form_gtk/one2many_list.py:223 |
569 | #: bin/widget/view/form_gtk/many2many.py:84 |
570 | msgid "Previous Page" |
571 | -msgstr "" |
572 | +msgstr "Página Anterior" |
573 | |
574 | #: bin/widget/view/form_gtk/one2many_list.py:227 |
575 | #: bin/widget/view/form_gtk/many2many.py:88 |
576 | msgid "Previous Record" |
577 | -msgstr "" |
578 | +msgstr "Registro Anterior" |
579 | |
580 | #: bin/widget/view/form_gtk/one2many_list.py:235 |
581 | #: bin/widget/view/form_gtk/many2many.py:96 |
582 | msgid "Next Record" |
583 | -msgstr "" |
584 | +msgstr "Próximo Registro" |
585 | |
586 | #: bin/widget/view/form_gtk/one2many_list.py:239 |
587 | #: bin/widget/view/form_gtk/many2many.py:100 |
588 | msgid "Next Page" |
589 | -msgstr "" |
590 | +msgstr "Próxima Página" |
591 | |
592 | #: bin/widget/view/form_gtk/one2many_list.py:245 |
593 | msgid "Switch" |
594 | @@ -1527,7 +1505,7 @@ |
595 | #: bin/widget/view/form_gtk/one2many_list.py:251 |
596 | #: bin/widget/view/form_gtk/many2many.py:106 |
597 | msgid "Choose Limit" |
598 | -msgstr "" |
599 | +msgstr "Escolher Limite" |
600 | |
601 | # |
602 | # File: bin/widget/view/form_gtk/one2many_list.py, line: 269 |
603 | @@ -1569,11 +1547,11 @@ |
604 | |
605 | #: bin/widget/view/form_gtk/image.py:127 |
606 | msgid "There is no image to save as !" |
607 | -msgstr "" |
608 | +msgstr "Não há imagem para gravar como !" |
609 | |
610 | #: bin/widget/view/form_gtk/image.py:127 |
611 | msgid "Warning" |
612 | -msgstr "" |
613 | +msgstr "Atenção" |
614 | |
615 | #: bin/widget/view/form_gtk/many2one.py:158 bin/widget/view/form_gtk/url.py:55 |
616 | msgid "Open this resource" |
617 | @@ -1613,11 +1591,11 @@ |
618 | |
619 | #: bin/widget/view/form_gtk/interface.py:63 |
620 | msgid "You can not set to the default value here !" |
621 | -msgstr "" |
622 | +msgstr "Você não pode definir um valor padão aqui !" |
623 | |
624 | #: bin/widget/view/form_gtk/interface.py:63 |
625 | msgid "Operation not permited" |
626 | -msgstr "" |
627 | +msgstr "Operação não permitida" |
628 | |
629 | # |
630 | # File: bin/widget/view/form_gtk/binary.py, line: 77 |
631 | @@ -1711,6 +1689,8 @@ |
632 | "(Any existing filter with the \n" |
633 | "same name will be replaced)" |
634 | msgstr "" |
635 | +"(Qualquer filtro existente com \n" |
636 | +"o mesmo nome será trocado)" |
637 | |
638 | # |
639 | # File: bin/rpc.py, line: 143 |
640 | @@ -1740,12 +1720,9 @@ |
641 | msgid "OpenERP - Login" |
642 | msgstr "OpenERP - Login" |
643 | |
644 | -# |
645 | -# File: bin/openerp.glade, line: 118 |
646 | -# File: bin/openerp.glade, line: 7298 |
647 | #: bin/openerp.glade:116 bin/openerp.glade:6450 |
648 | msgid "Database:" |
649 | -msgstr "Banco de dados:" |
650 | +msgstr "Base de dados:" |
651 | |
652 | # |
653 | # File: bin/openerp.glade, line: 133 |
654 | @@ -1779,35 +1756,25 @@ |
655 | msgid "_Disconnect" |
656 | msgstr "_Desconectar" |
657 | |
658 | -# |
659 | -# File: bin/openerp.glade, line: 300 |
660 | #: bin/openerp.glade:308 |
661 | msgid "Databases" |
662 | -msgstr "Bancos de Dados" |
663 | +msgstr "Bases de Dados" |
664 | |
665 | -# |
666 | -# File: bin/openerp.glade, line: 307 |
667 | #: bin/openerp.glade:315 |
668 | msgid "_New database" |
669 | -msgstr "Novo banco de _dados" |
670 | +msgstr "_Nova base de dados" |
671 | |
672 | -# |
673 | -# File: bin/openerp.glade, line: 322 |
674 | #: bin/openerp.glade:330 |
675 | msgid "_Restore database" |
676 | -msgstr "_Restaurar banco de dados" |
677 | +msgstr "_Restaurar base de dados" |
678 | |
679 | -# |
680 | -# File: bin/openerp.glade, line: 337 |
681 | #: bin/openerp.glade:345 |
682 | msgid "_Backup database" |
683 | -msgstr "Fazer _backup do banco de dados" |
684 | +msgstr "Fazer _backup da base de dados" |
685 | |
686 | -# |
687 | -# File: bin/openerp.glade, line: 352 |
688 | #: bin/openerp.glade:360 |
689 | msgid "Dro_p database" |
690 | -msgstr "Apagar banco de dados" |
691 | +msgstr "_Apagar base de dados" |
692 | |
693 | #: bin/openerp.glade:380 |
694 | msgid "_Download Migrations Code" |
695 | @@ -1815,7 +1782,7 @@ |
696 | |
697 | #: bin/openerp.glade:395 |
698 | msgid "_Migrate Database(s)" |
699 | -msgstr "_Migrar base de dados" |
700 | +msgstr "_Migrar base(s) de dados" |
701 | |
702 | # |
703 | # File: bin/openerp.glade, line: 372 |
704 | @@ -2226,7 +2193,7 @@ |
705 | |
706 | #: bin/openerp.glade:1351 |
707 | msgid "Diagram" |
708 | -msgstr "" |
709 | +msgstr "Diagrama" |
710 | |
711 | # |
712 | # File: bin/openerp.glade, line: 1313 |
713 | @@ -2286,7 +2253,7 @@ |
714 | |
715 | #: bin/openerp.glade:1512 |
716 | msgid "Company:" |
717 | -msgstr "" |
718 | +msgstr "Empresa:" |
719 | |
720 | #: bin/openerp.glade:1535 |
721 | msgid "Requests:" |
722 | @@ -3103,29 +3070,21 @@ |
723 | msgid "Port:" |
724 | msgstr "Porta:" |
725 | |
726 | -# |
727 | -# File: bin/openerp.glade, line: 7237 |
728 | #: bin/openerp.glade:6389 |
729 | msgid "Choose a database..." |
730 | -msgstr "Escolha um banco de dados..." |
731 | +msgstr "Escolha uma base de dados..." |
732 | |
733 | -# |
734 | -# File: bin/openerp.glade, line: 7252 |
735 | #: bin/openerp.glade:6404 |
736 | msgid "<b>Backup a database</b>" |
737 | -msgstr "<b>Fazer Backup de um Banco de Dados</b>" |
738 | +msgstr "<b>Fazer backup de uma base de dados</b>" |
739 | |
740 | -# |
741 | -# File: bin/openerp.glade, line: 7483 |
742 | #: bin/openerp.glade:6645 |
743 | msgid "Restore a database" |
744 | -msgstr "Restaurar um banco de dados" |
745 | +msgstr "Restaurar uma base de dados" |
746 | |
747 | -# |
748 | -# File: bin/openerp.glade, line: 7496 |
749 | #: bin/openerp.glade:6658 |
750 | msgid "<b>Restore a database</b>" |
751 | -msgstr "<b>Restaurar um banco de dados</b>" |
752 | +msgstr "<b>Restaurar uma base de dados</b>" |
753 | |
754 | # |
755 | # File: bin/openerp.glade, line: 7540 |
756 | @@ -3133,11 +3092,9 @@ |
757 | msgid "(must not contain any special char)" |
758 | msgstr "(não deve conter caracteres especiais)" |
759 | |
760 | -# |
761 | -# File: bin/openerp.glade, line: 7569 |
762 | #: bin/openerp.glade:6732 |
763 | msgid "New database name:" |
764 | -msgstr "Novo nome do banco de dados:" |
765 | +msgstr "Nome da nova base de dados:" |
766 | |
767 | # |
768 | # File: bin/openerp.glade, line: 7669 |
769 | @@ -3147,17 +3104,13 @@ |
770 | msgid "http://localhost:8069" |
771 | msgstr "http://localhost:8069" |
772 | |
773 | -# |
774 | -# File: bin/openerp.glade, line: 7743 |
775 | #: bin/openerp.glade:6906 |
776 | msgid "Create a new database" |
777 | -msgstr "Criar um novo banco de dados" |
778 | +msgstr "Criar uma nova base de dados" |
779 | |
780 | -# |
781 | -# File: bin/openerp.glade, line: 7756 |
782 | #: bin/openerp.glade:6919 |
783 | msgid "<b>Create a new database</b>" |
784 | -msgstr "<b>Criar um novo banco de dados</b>" |
785 | +msgstr "<b>Criar uma nova base de dados</b>" |
786 | |
787 | # |
788 | # File: bin/openerp.glade, line: 7827 |
789 | @@ -3173,16 +3126,15 @@ |
790 | msgid "" |
791 | "<sup><b><span foreground=\"dark green\">?</span></b></sup>OpenERP Server:" |
792 | msgstr "" |
793 | +"<sup><b><span foreground=\"dark green\">?</span></b></sup>Servidor OpenERP:" |
794 | |
795 | -# |
796 | -# File: bin/openerp.glade, line: 7861 |
797 | #: bin/openerp.glade:7025 |
798 | msgid "" |
799 | "This is the password of the user that have the rights to administer " |
800 | "databases. This is not a OpenERP user, just a super administrator. If you " |
801 | "did not changed it, the password is 'admin' after installation." |
802 | msgstr "" |
803 | -"Esta é a senha do usuário que tem direitos para administrar bancos de dados. " |
804 | +"Esta é a senha do usuário que tem direitos para administrar bases de dados. " |
805 | "Este não é um usuário OpenERP, mas sim um super administrador. Se você não " |
806 | "alterou, a senha padrão é 'admin' após a instalação." |
807 | |
808 | @@ -3191,10 +3143,12 @@ |
809 | "<sup><b><span foreground=\"dark green\">?</span></b></sup>Super " |
810 | "Administrator Password:" |
811 | msgstr "" |
812 | +"<sup><b><span foreground=\"dark green\">?</span></b></sup>Senha de Super " |
813 | +"Administrador:" |
814 | |
815 | #: bin/openerp.glade:7048 |
816 | msgid "admin" |
817 | -msgstr "" |
818 | +msgstr "admin" |
819 | |
820 | # |
821 | # File: bin/openerp.glade, line: 7897 |
822 | @@ -3202,30 +3156,28 @@ |
823 | msgid "(<i>admin</i>, by default)" |
824 | msgstr "(<i>admin</i>, por padrão)" |
825 | |
826 | -# |
827 | -# File: bin/openerp.glade, line: 7962 |
828 | #: bin/openerp.glade:7127 |
829 | msgid "" |
830 | "Choose the name of the database that will be created. The name must not " |
831 | "contain any special character. Exemple: 'terp'." |
832 | msgstr "" |
833 | -"Escolha o nome do banco de dados que será criado. O nome não deve conter " |
834 | +"Escolha o nome da base de dados que será criada. O nome não deve conter " |
835 | "caracteres especiais. Exemplo: 'terp'." |
836 | |
837 | #: bin/openerp.glade:7129 |
838 | msgid "" |
839 | "<sup><b><span foreground=\"dark green\">?</span></b></sup>New Database Name:" |
840 | msgstr "" |
841 | +"<sup><b><span foreground=\"dark green\">?</span></b></sup>Nome da Nova Base " |
842 | +"de Dados:" |
843 | |
844 | -# |
845 | -# File: bin/openerp.glade, line: 7988 |
846 | #: bin/openerp.glade:7154 |
847 | msgid "" |
848 | "Choose the default language that will be installed for this database. You " |
849 | "will be able to install new languages after installation through the " |
850 | "administration menu." |
851 | msgstr "" |
852 | -"Escolha o idioma padrão que será instalado para este banco de dados. Você " |
853 | +"Escolha o idioma padrão que será instalado para esta base de dados. Você " |
854 | "poderá instalar novos idiomas depois da instalação, através do menu de " |
855 | "administração." |
856 | |
857 | @@ -3233,32 +3185,38 @@ |
858 | msgid "" |
859 | "<sup><b><span foreground=\"dark green\">?</span></b></sup>Default Language:" |
860 | msgstr "" |
861 | +"<sup><b><span foreground=\"dark green\">?</span></b></sup>Idioma Padrão:" |
862 | |
863 | #: bin/openerp.glade:7169 |
864 | msgid "" |
865 | "This is the password of the 'admin' user that will be created in your new " |
866 | "database." |
867 | msgstr "" |
868 | +"Esta é a senha para o usuário 'admin' que será criada em sua nova base de " |
869 | +"dados." |
870 | |
871 | #: bin/openerp.glade:7171 |
872 | msgid "" |
873 | "<sup><b><span foreground=\"dark green\">?</span></b></sup>Administrator " |
874 | "Password:" |
875 | msgstr "" |
876 | +"<sup><b><span foreground=\"dark green\">?</span></b></sup>Senha de " |
877 | +"Administrador:" |
878 | |
879 | #: bin/openerp.glade:7184 |
880 | msgid "" |
881 | "This is the password of the 'admin' user that will be created in your new " |
882 | "database. It has to be the same than the above field." |
883 | msgstr "" |
884 | +"Esta é a senha do usuário 'admin' que será criado em sua base de dados. " |
885 | +"Precisa ser a mesma informada no campo acima." |
886 | |
887 | #: bin/openerp.glade:7186 |
888 | msgid "" |
889 | "<sup><b><span foreground=\"dark green\">?</span></b></sup>Confirm Password:" |
890 | msgstr "" |
891 | +"<sup><b><span foreground=\"dark green\">?</span></b></sup>Confirme a Senha:" |
892 | |
893 | -# |
894 | -# File: bin/openerp.glade, line: 8110 |
895 | #: bin/openerp.glade:7279 |
896 | msgid "" |
897 | "Check this box if you want demonstration data to be installed on your new " |
898 | @@ -3266,14 +3224,16 @@ |
899 | "products, partners, etc." |
900 | msgstr "" |
901 | "Marque esta caixa se você deseja que os dados de demonstração sejam " |
902 | -"instalados no seu novo banco de dados. Estes dados vão ajudar você a " |
903 | -"entender o OpenERP, com produtos pré-definidos, parceiros, etc." |
904 | +"instalados no sua nova base de dados. Estes dados vão ajudar você a entender " |
905 | +"o OpenERP, com produtos pré-definidos, parceiros, etc." |
906 | |
907 | #: bin/openerp.glade:7282 |
908 | msgid "" |
909 | "<sup><b><span foreground=\"dark green\">?</span></b></sup>Load Demonstration " |
910 | "Data:" |
911 | msgstr "" |
912 | +"<sup><b><span foreground=\"dark green\">?</span></b></sup>Carregar Dados de " |
913 | +"Demonstração:" |
914 | |
915 | # |
916 | # File: bin/openerp.glade, line: 8170 |
917 | @@ -3387,7 +3347,7 @@ |
918 | |
919 | #: bin/openerp.glade:8289 |
920 | msgid "Conditional Operators" |
921 | -msgstr "" |
922 | +msgstr "Operadores Condicionais" |
923 | |
924 | #: bin/openerp.glade:8316 |
925 | msgid "The Choice will be applied with next filter if any" |
926 | @@ -3398,10 +3358,12 @@ |
927 | "AND\n" |
928 | "OR" |
929 | msgstr "" |
930 | +"E\n" |
931 | +"OU" |
932 | |
933 | #: bin/openerp.glade:8330 |
934 | msgid "Remove Filter" |
935 | -msgstr "" |
936 | +msgstr "Remover Filtro" |
937 | |
938 | #: bin/openerp.glade:8349 |
939 | msgid "Filter Entry" |
940 | @@ -3418,10 +3380,11 @@ |
941 | #: bin/win_error.glade:100 |
942 | msgid "Click here for details about the publisher warranty proposition" |
943 | msgstr "" |
944 | +"Clique aqui para detalhes sobre a proposta de garantia do distribuidor" |
945 | |
946 | #: bin/win_error.glade:120 |
947 | msgid "<i>_Publisher Warranty</i>" |
948 | -msgstr "" |
949 | +msgstr "<i>_Garantia do Distribuidor</i>" |
950 | |
951 | #: bin/win_error.glade:151 |
952 | msgid "" |
953 | @@ -3431,6 +3394,11 @@ |
954 | "you shortly.\n" |
955 | "</i>" |
956 | msgstr "" |
957 | +"<b>Contrato de Garantia do Distribuidor.</b>\n" |
958 | +"<i>\n" |
959 | +"Sua requisição será envidada para o OpenERP e a equipe de garantia do " |
960 | +"distribuidor responderá rapidamente.\n" |
961 | +"</i>" |
962 | |
963 | # |
964 | # File: bin/win_error.glade, line: 184 |
965 | @@ -3446,11 +3414,11 @@ |
966 | |
967 | #: bin/win_error.glade:285 |
968 | msgid "Send to Publisher Warranty Team" |
969 | -msgstr "" |
970 | +msgstr "Enviar para a Equipe de Garantia do Distribuidor" |
971 | |
972 | #: bin/win_error.glade:318 |
973 | msgid "Summary of the problem:" |
974 | -msgstr "" |
975 | +msgstr "Resumo do problema:" |
976 | |
977 | #: bin/win_error.glade:360 |
978 | msgid "<i>_Support Request</i>" |
979 | |
980 | === modified file 'bin/po/ur.po' |
981 | --- bin/po/ur.po 2011-01-31 04:55:13 +0000 |
982 | +++ bin/po/ur.po 2011-02-11 07:40:17 +0000 |
983 | @@ -8,13 +8,13 @@ |
984 | "Project-Id-Version: openobject-client\n" |
985 | "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" |
986 | "POT-Creation-Date: 2010-12-13 18:11+0100\n" |
987 | -"PO-Revision-Date: 2011-01-30 17:00+0000\n" |
988 | +"PO-Revision-Date: 2011-02-05 16:48+0000\n" |
989 | "Last-Translator: Aamir Riaz <Unknown>\n" |
990 | "Language-Team: Urdu <ur@li.org>\n" |
991 | "MIME-Version: 1.0\n" |
992 | "Content-Type: text/plain; charset=UTF-8\n" |
993 | "Content-Transfer-Encoding: 8bit\n" |
994 | -"X-Launchpad-Export-Date: 2011-01-31 04:55+0000\n" |
995 | +"X-Launchpad-Export-Date: 2011-02-06 04:53+0000\n" |
996 | "X-Generator: Launchpad (build 12177)\n" |
997 | |
998 | #: bin/plugins/__init__.py:27 |
999 | @@ -139,6 +139,9 @@ |
1000 | "The versions of the server (%s) and the client (%s) missmatch. The client " |
1001 | "may not work properly. Use it at your own risks." |
1002 | msgstr "" |
1003 | +"سرورکاورژن (%s) اورکلائنٹ کاورژن (%s) \r\n" |
1004 | +"مختلف ھیں، کلائنٹ صحیح کام نھیں کرسکتا،\r\n" |
1005 | +" اپنی ذمھداری پر استعمال کریں" |
1006 | |
1007 | #: bin/modules/gui/main.py:610 |
1008 | msgid "Sorry,'" |
1009 | @@ -544,38 +547,40 @@ |
1010 | "Error processing your first line of the file.\n" |
1011 | "Field %s is unknown !" |
1012 | msgstr "" |
1013 | +"آپ کی فائل کی پہلی سطر پر کاروائی کی خرابی.\n" |
1014 | +"فیلڈ %s نامعلوم ہے!" |
1015 | |
1016 | #: bin/modules/gui/window/win_import.py:190 |
1017 | msgid "Import Error." |
1018 | -msgstr "" |
1019 | +msgstr "درآمدکی خرابی۔" |
1020 | |
1021 | #: bin/modules/gui/window/win_import.py:221 |
1022 | msgid "You have not selected any fields to import" |
1023 | -msgstr "" |
1024 | +msgstr "آپ نےکسی فیلڈکا انتخاب نہیں کیا درآمد کرنےکیلیے-" |
1025 | |
1026 | #: bin/modules/gui/window/win_extension.py:42 |
1027 | msgid "Extension" |
1028 | -msgstr "" |
1029 | +msgstr "توسیع" |
1030 | |
1031 | #: bin/modules/gui/window/win_extension.py:42 |
1032 | msgid "Application" |
1033 | -msgstr "" |
1034 | +msgstr "ایپلیکیشن" |
1035 | |
1036 | #: bin/modules/gui/window/win_extension.py:42 |
1037 | msgid "Print Processor" |
1038 | -msgstr "" |
1039 | +msgstr "پرنٹ پروسیسر" |
1040 | |
1041 | #: bin/modules/gui/window/win_extension.py:114 |
1042 | msgid "This extension is already defined" |
1043 | -msgstr "" |
1044 | +msgstr "اس توسیع کی پھلےسےوظاحت ھو چُکی ھے-" |
1045 | |
1046 | #: bin/modules/gui/window/win_extension.py:114 bin/openerp.glade:7684 |
1047 | msgid "Extension Manager" |
1048 | -msgstr "" |
1049 | +msgstr "توسیع کامینیجر" |
1050 | |
1051 | #: bin/modules/gui/window/win_selection.py:51 |
1052 | msgid "Name" |
1053 | -msgstr "" |
1054 | +msgstr "نام" |
1055 | |
1056 | #: bin/modules/gui/window/win_selection.py:55 |
1057 | msgid "Ressource Name" |
1058 | @@ -627,11 +632,11 @@ |
1059 | |
1060 | #: bin/modules/gui/window/tree.py:234 |
1061 | msgid "Unable to chroot: no tree resource selected" |
1062 | -msgstr "" |
1063 | +msgstr "وسائل کا انتخاب نھیں ھُوا tree : chroot میں ناکام" |
1064 | |
1065 | #: bin/modules/gui/window/win_export.py:50 |
1066 | msgid " record(s) saved !" |
1067 | -msgstr "" |
1068 | +msgstr " ريکارڈز بچا لیا!" |
1069 | |
1070 | #: bin/modules/gui/window/win_export.py:53 |
1071 | msgid "" |
1072 | @@ -674,32 +679,32 @@ |
1073 | |
1074 | #: bin/options.py:110 |
1075 | msgid "specify alternate config file" |
1076 | -msgstr "" |
1077 | +msgstr "متبادل وضعی فائل کی وضاحت کریں۔" |
1078 | |
1079 | #: bin/options.py:111 |
1080 | msgid "Enable basic debugging. Alias for '--log-level=debug'" |
1081 | -msgstr "" |
1082 | +msgstr "بنیادی ٹھیک کرنا فعال کریں. عرفیت کے لئے '--log-level=debug'" |
1083 | |
1084 | #: bin/options.py:112 |
1085 | #, python-format |
1086 | msgid "specify the log level: %s" |
1087 | -msgstr "" |
1088 | +msgstr "لاگ کے درجہ کے وضاحت کریں: %s" |
1089 | |
1090 | #: bin/options.py:113 |
1091 | msgid "specify the user login" |
1092 | -msgstr "" |
1093 | +msgstr "صارف لاگ ان کی وضاحت کریں" |
1094 | |
1095 | #: bin/options.py:114 |
1096 | msgid "specify the server port" |
1097 | -msgstr "" |
1098 | +msgstr "سرور پورٹ کی وضاحت کریں" |
1099 | |
1100 | #: bin/options.py:115 |
1101 | msgid "specify the server ip/name" |
1102 | -msgstr "" |
1103 | +msgstr "سرور آئپی/نام کی وضاحت کریں" |
1104 | |
1105 | #: bin/common/common.py:89 |
1106 | msgid "Close current tip" |
1107 | -msgstr "" |
1108 | +msgstr "موجودھ اشاروں کوبندکریں" |
1109 | |
1110 | #: bin/common/common.py:90 |
1111 | msgid "" |
1112 | @@ -711,7 +716,7 @@ |
1113 | |
1114 | #: bin/common/common.py:100 |
1115 | msgid "Disable all tips" |
1116 | -msgstr "" |
1117 | +msgstr "تمام اشاروں کوغیرفعال کریں" |
1118 | |
1119 | #: bin/common/common.py:101 |
1120 | msgid "" |
1121 | @@ -754,7 +759,7 @@ |
1122 | |
1123 | #: bin/common/common.py:367 |
1124 | msgid "Support request sent !" |
1125 | -msgstr "" |
1126 | +msgstr "مدد کی درخواست بھیج کو دیا گیا!" |
1127 | |
1128 | #: bin/common/common.py:387 bin/common/common.py:430 |
1129 | msgid "" |
1130 | @@ -826,39 +831,43 @@ |
1131 | |
1132 | #: bin/common/common.py:491 |
1133 | msgid "Error" |
1134 | -msgstr "" |
1135 | +msgstr "خرابی" |
1136 | |
1137 | #: bin/common/common.py:646 |
1138 | msgid "Open with..." |
1139 | -msgstr "" |
1140 | +msgstr "کےساتھ کھولیں۔۔۔" |
1141 | |
1142 | #: bin/translate.py:183 |
1143 | #, python-format |
1144 | msgid "Unable to set locale %s: %s" |
1145 | -msgstr "" |
1146 | +msgstr "مقامی قائم کرنے میں ناکامی %s: %s" |
1147 | |
1148 | #: bin/printer/printer.py:184 |
1149 | #, python-format |
1150 | msgid "Unable to handle %s filetype" |
1151 | -msgstr "" |
1152 | +msgstr "فائل ٹائپ کوسنبھالنےکےقابل نھیں %s" |
1153 | |
1154 | #: bin/printer/printer.py:189 |
1155 | msgid "" |
1156 | "Linux Automatic Printing not implemented.\n" |
1157 | "Use preview option !" |
1158 | msgstr "" |
1159 | +"لینکس خودکار پرنٹنگ لاگو نہیں ھے۔\n" |
1160 | +"جائزھ کاآپشن استعمال کریں!" |
1161 | |
1162 | #: bin/printer/printer.py:197 |
1163 | msgid "Error! No Data found. Make sure you have enough data to print!" |
1164 | msgstr "" |
1165 | +"خرابی! پرنٹ کرنےکیلیےکوئ دیٹانھیں ھے. پرنٹ کرنے کے لئے کافی ڈیٹا یقینی " |
1166 | +"بنائیں!" |
1167 | |
1168 | #: bin/printer/printer.py:224 |
1169 | msgid "Error writing the file!" |
1170 | -msgstr "" |
1171 | +msgstr "فائل لکھنے میں خرابی!" |
1172 | |
1173 | #: bin/openerp-client.py:140 |
1174 | msgid "Closing OpenERP, KeyboardInterrupt" |
1175 | -msgstr "" |
1176 | +msgstr "اوپن ای آر پی بند ھورھی ھے، KeyboardInterrupt" |
1177 | |
1178 | #: bin/widget_search/reference.py:78 bin/widget_search/filter.py:74 |
1179 | #: bin/widget_search/selection.py:116 bin/widget_search/spinbutton.py:72 |
1180 | @@ -893,11 +902,11 @@ |
1181 | |
1182 | #: bin/widget_search/char.py:43 |
1183 | msgid "Error: " |
1184 | -msgstr "" |
1185 | +msgstr "خرابی: " |
1186 | |
1187 | #: bin/widget_search/calendar.py:50 bin/widget_search/calendar.py:177 |
1188 | msgid "Start date" |
1189 | -msgstr "" |
1190 | +msgstr "شروع کرنے کی تاریخ" |
1191 | |
1192 | #: bin/widget_search/calendar.py:54 bin/widget_search/calendar.py:74 |
1193 | #: bin/widget_search/calendar.py:181 bin/widget_search/calendar.py:201 |
1194 | @@ -908,7 +917,7 @@ |
1195 | |
1196 | #: bin/widget_search/calendar.py:70 bin/widget_search/calendar.py:197 |
1197 | msgid "End date" |
1198 | -msgstr "" |
1199 | +msgstr "آخری تاریخ" |
1200 | |
1201 | #: bin/widget_search/calendar.py:129 bin/widget_search/calendar.py:249 |
1202 | #: bin/widget/view/form_gtk/calendar.py:135 |
1203 | @@ -918,35 +927,35 @@ |
1204 | |
1205 | #: bin/widget_search/custom_filter.py:56 |
1206 | msgid "contains" |
1207 | -msgstr "" |
1208 | +msgstr "مُشتمل ھوتاھے" |
1209 | |
1210 | #: bin/widget_search/custom_filter.py:57 |
1211 | msgid "doesn't contain" |
1212 | -msgstr "" |
1213 | +msgstr "مُشتمل نھیں ھوتاھے" |
1214 | |
1215 | #: bin/widget_search/custom_filter.py:58 |
1216 | msgid "is equal to" |
1217 | -msgstr "" |
1218 | +msgstr "کےبرابرھے" |
1219 | |
1220 | #: bin/widget_search/custom_filter.py:59 |
1221 | msgid "is not equal to" |
1222 | -msgstr "" |
1223 | +msgstr "کےبرابرنھیں ھے" |
1224 | |
1225 | #: bin/widget_search/custom_filter.py:60 |
1226 | msgid "greater than" |
1227 | -msgstr "" |
1228 | +msgstr "سےبڑھکر" |
1229 | |
1230 | #: bin/widget_search/custom_filter.py:61 |
1231 | msgid "less than" |
1232 | -msgstr "" |
1233 | +msgstr "سےکمتر" |
1234 | |
1235 | #: bin/widget_search/custom_filter.py:62 |
1236 | msgid "in" |
1237 | -msgstr "" |
1238 | +msgstr "اندر" |
1239 | |
1240 | #: bin/widget_search/custom_filter.py:63 |
1241 | msgid "not in" |
1242 | -msgstr "" |
1243 | +msgstr "اندر نھیں" |
1244 | |
1245 | #: bin/widget_search/custom_filter.py:82 |
1246 | msgid "" |
1247 | |
1248 | === modified file 'bin/release.py' |
1249 | --- bin/release.py 2011-01-20 19:12:50 +0000 |
1250 | +++ bin/release.py 2011-02-11 07:40:17 +0000 |
1251 | @@ -21,8 +21,8 @@ |
1252 | # |
1253 | |
1254 | name = 'openerp-client' |
1255 | -version = '6.0.1' |
1256 | -major_version = '6.0' |
1257 | +version = '6.1-dev' |
1258 | +major_version = '6.1' |
1259 | description = 'OpenERP Client' |
1260 | long_desc = '''OpenERP is a complete ERP and CRM. The main features are accounting (analytic |
1261 | and financial), stock management, sales and purchases management, tasks |
1262 | |
1263 | === modified file 'bin/widget/model/field.py' |
1264 | --- bin/widget/model/field.py 2011-01-18 08:26:02 +0000 |
1265 | +++ bin/widget/model/field.py 2011-02-11 07:40:17 +0000 |
1266 | @@ -45,12 +45,31 @@ |
1267 | klass = TYPES.get(type, CharField) |
1268 | return klass |
1269 | |
1270 | +class M2O_SelectionField(dict): |
1271 | + def __init__(self ,*args, **kwargs): |
1272 | + self.swap = {} |
1273 | + |
1274 | + def __setitem__(self, key, value): |
1275 | + self.swap[value] = key |
1276 | + super(M2O_SelectionField, self).__setitem__(key, value) |
1277 | + |
1278 | + def update(self, *args, **kwargs): |
1279 | + for key, val in args[0].items(): |
1280 | + self.swap[val] = key |
1281 | + super(M2O_SelectionField, self).update(args[0]) |
1282 | + |
1283 | + def get_value(self, key): |
1284 | + return self.get(key, '') |
1285 | + |
1286 | + def get_key(self,value): |
1287 | + return self.swap.get(value, False) |
1288 | |
1289 | class CharField(object): |
1290 | def __init__(self, parent, attrs): |
1291 | self.parent = parent |
1292 | self.attrs = attrs |
1293 | self.name = attrs['name'] |
1294 | + self.selection = M2O_SelectionField() |
1295 | self.internal = False |
1296 | self.default_attrs = {} |
1297 | |
1298 | @@ -103,12 +122,12 @@ |
1299 | return True |
1300 | |
1301 | def get(self, model, check_load=True, readonly=True, modified=False): |
1302 | - return model.value.get(self.name, False) or False |
1303 | + return model.value.get(self.name, False) |
1304 | |
1305 | def set_client(self, model, value, test_state=True, force_change=False): |
1306 | internal = model.value.get(self.name, False) |
1307 | self.set(model, value, test_state) |
1308 | - if (internal or False) != (model.value.get(self.name,False) or False): |
1309 | + if (internal or False) != (model.value.get(self.name, False) or False): |
1310 | model.modified = True |
1311 | model.modified_fields.setdefault(self.name) |
1312 | self.sig_changed(model) |
1313 | @@ -135,7 +154,7 @@ |
1314 | try: |
1315 | attrs_changes = eval(self.attrs.get('attrs',"{}")) |
1316 | except: |
1317 | - attrs_changes = eval(self.attrs.get('attrs',"{}"),model.value) |
1318 | + attrs_changes = eval(self.attrs.get('attrs',"{}"), model.value) |
1319 | for k,v in attrs_changes.items(): |
1320 | for i in range(0,len(v)): |
1321 | if v[i][2]: |
1322 | @@ -236,14 +255,21 @@ |
1323 | |
1324 | |
1325 | class SelectionField(CharField): |
1326 | + |
1327 | + def get(self, model, check_load=True, readonly=True, modified=False): |
1328 | + return model.value.get(self.name, False) |
1329 | + |
1330 | def set(self, model, value, test_state=True, modified=False): |
1331 | + self.selection.update(dict(self.attrs.get('selection',[]))) |
1332 | + if isinstance(value,(list,tuple)) and len(value): |
1333 | + self.selection[value[0]] = value[1] |
1334 | + |
1335 | value = isinstance(value,(list,tuple)) and len(value) and value[0] or value |
1336 | |
1337 | if not self.get_state_attrs(model).get('required', False) and value is None: |
1338 | super(SelectionField, self).set(model, value, test_state, modified) |
1339 | - |
1340 | - if value in [sel[0] for sel in self.attrs['selection']]: |
1341 | - super(SelectionField, self).set(model, value, test_state, modified) |
1342 | + |
1343 | + super(SelectionField, self).set(model, value, test_state, modified) |
1344 | |
1345 | class FloatField(CharField): |
1346 | def validate(self, model): |
1347 | @@ -297,6 +323,7 @@ |
1348 | def get_client(self, model): |
1349 | #model._check_load() |
1350 | if model.value[self.name]: |
1351 | + self.selection.update(dict([model.value[self.name]])) |
1352 | return model.value[self.name][1] |
1353 | return False |
1354 | |
1355 | |
1356 | === modified file 'bin/widget/model/record.py' |
1357 | --- bin/widget/model/record.py 2011-01-25 06:56:46 +0000 |
1358 | +++ bin/widget/model/record.py 2011-02-11 07:40:17 +0000 |
1359 | @@ -33,6 +33,7 @@ |
1360 | from gtk import glade |
1361 | import tools |
1362 | from field import O2MField |
1363 | +from field import SelectionField |
1364 | |
1365 | class EvalEnvironment(object): |
1366 | def __init__(self, parent): |
1367 | @@ -230,6 +231,9 @@ |
1368 | if self.mgroup.mfields[fieldname].attrs.get('on_change',False): |
1369 | fields_with_on_change[fieldname] = value |
1370 | else: |
1371 | + if self.mgroup.mfields[fieldname].attrs.get('widget') == 'selection' and value: |
1372 | + relation = self.mgroup.mfields[fieldname].attrs['relation'] |
1373 | + value = rpc.session.rpc_exec_auth('/object', 'execute', relation, 'name_search', '', [('id','=',value)], 'ilike')[0] |
1374 | self.mgroup.mfields[fieldname].set_default(self, value) |
1375 | for field, value in fields_with_on_change.items(): |
1376 | self.mgroup.mfields[field].set_default(self, value) |
1377 | @@ -291,7 +295,7 @@ |
1378 | d['current_date'] = time.strftime('%Y-%m-%d') |
1379 | d['time'] = time |
1380 | d['context'] = self.context_get() |
1381 | - d['active_id'] = self.id |
1382 | + d['active_id'] = self.id or False |
1383 | if self.parent: |
1384 | d['parent'] = EvalEnvironment(self.parent) |
1385 | val = tools.expr_eval(dom, d) |
1386 | |
1387 | === modified file 'bin/widget/screen/screen.py' |
1388 | --- bin/widget/screen/screen.py 2011-01-27 12:43:03 +0000 |
1389 | +++ bin/widget/screen/screen.py 2011-02-11 07:40:17 +0000 |
1390 | @@ -593,6 +593,8 @@ |
1391 | if attrs.get('widget', False): |
1392 | if attrs['widget']=='one2many_list': |
1393 | attrs['widget']='one2many' |
1394 | +# attrs['py_field_type'] = attrs['type'] |
1395 | + attrs['py_type'] = fields[str(attrs['name'])]['type'] |
1396 | attrs['type'] = attrs['widget'] |
1397 | if attrs.get('selection',[]): |
1398 | attrs['selection'] = eval(attrs['selection']) |
1399 | |
1400 | === modified file 'bin/widget/view/form_gtk/selection.py' |
1401 | --- bin/widget/view/form_gtk/selection.py 2010-07-16 05:41:32 +0000 |
1402 | +++ bin/widget/view/form_gtk/selection.py 2011-02-11 07:40:17 +0000 |
1403 | @@ -23,7 +23,7 @@ |
1404 | import interface |
1405 | import gtk |
1406 | import gobject |
1407 | - |
1408 | +from rpc import RPCProxy |
1409 | import gettext |
1410 | |
1411 | class selection(interface.widget_interface): |
1412 | @@ -31,109 +31,91 @@ |
1413 | interface.widget_interface.__init__(self, window, parent, model, attrs) |
1414 | |
1415 | self.widget = gtk.HBox(spacing=3) |
1416 | - self.entry = gtk.ComboBoxEntry() |
1417 | + self.function = self.attrs.get('has_func', False) |
1418 | + self.name = attrs['name'] |
1419 | + self.attrs = attrs |
1420 | + self.entry = gtk.combo_box_entry_new_text() |
1421 | + self.entry.connect('notify::popup-shown', self.popup_show) |
1422 | self.child = self.entry.get_child() |
1423 | + self.relation_model = self.attrs.get('relation', '') |
1424 | + self.object_model = self.attrs.get('model','') |
1425 | self.child.set_property('activates_default', True) |
1426 | self.child.connect('changed', self.sig_changed) |
1427 | self.child.connect('populate-popup', self._menu_open) |
1428 | - self.child.connect('key_press_event', self.sig_key_press) |
1429 | - self.child.connect('activate', self.sig_activate) |
1430 | self.child.connect_after('focus-out-event', self.sig_activate) |
1431 | - self.entry.set_size_request(int(attrs.get('size', -1)), -1) |
1432 | self.widget.pack_start(self.entry, expand=True, fill=True) |
1433 | |
1434 | # the dropdown button is not focusable by a tab |
1435 | self.widget.set_focus_chain([self.child]) |
1436 | - self.ok = True |
1437 | + self.set_popdown(attrs.get('selection',[])) |
1438 | self._selection={} |
1439 | - |
1440 | - self.set_popdown(attrs.get('selection', [])) |
1441 | + self.entry_text = "" |
1442 | + |
1443 | + |
1444 | + def popup_show(self, combobox, popup_show): |
1445 | + text = self.child.get_text() |
1446 | + if self._view.modelfield.selection.get_key(text): |
1447 | + text = "" |
1448 | + if combobox.get_property('popup-shown'): |
1449 | + domain = self._view.modelfield.domain_get(self._view.model) |
1450 | + context = self._view.modelfield.context_get(self._view.model) |
1451 | + if self.attrs.get('widget') == 'selection': |
1452 | + rpc = RPCProxy(self.relation_model) |
1453 | + selection = rpc.name_search(text, domain, 'ilike', context, False) |
1454 | + self.set_popdown(selection) |
1455 | + if self.function: |
1456 | + rpc = RPCProxy(self.object_model) |
1457 | + selection = rpc.fields_get(self.name, context)[self.name]['selection'] |
1458 | + self.set_popdown(selection) |
1459 | |
1460 | def set_popdown(self, selection): |
1461 | - self.model = gtk.ListStore(gobject.TYPE_STRING) |
1462 | + self.model = self.entry.get_model() |
1463 | + self.model.clear() |
1464 | self._selection={} |
1465 | lst = [] |
1466 | - for (value, name) in selection: |
1467 | - name = str(name) |
1468 | + if not selection: |
1469 | + selection = [(False, '')] |
1470 | + for (i,j) in selection: |
1471 | + name = str(j) |
1472 | lst.append(name) |
1473 | - self._selection[name] = value |
1474 | - i = self.model.append() |
1475 | - self.model.set(i, 0, name) |
1476 | - self.entry.set_model(self.model) |
1477 | - self.entry.set_text_column(0) |
1478 | - return lst |
1479 | + self._selection[i]=name |
1480 | + self.entry.append_text(name) |
1481 | |
1482 | def _readonly_set(self, value): |
1483 | interface.widget_interface._readonly_set(self, value) |
1484 | self.entry.set_sensitive(not value) |
1485 | |
1486 | - def value_get(self): |
1487 | - res = self.child.get_text() |
1488 | - return self._selection.get(res, False) |
1489 | - |
1490 | - def sig_key_press(self, widget, event): |
1491 | - # allow showing available entries by hitting "ctrl+space" |
1492 | - completion=gtk.EntryCompletion() |
1493 | - if hasattr(completion, 'set_inline_selection'): |
1494 | - completion.set_inline_selection(True) |
1495 | - if (event.type == gtk.gdk.KEY_PRESS) \ |
1496 | - and ((event.state & gtk.gdk.CONTROL_MASK) != 0) \ |
1497 | - and (event.keyval == gtk.keysyms.space): |
1498 | - self.entry.popup() |
1499 | - elif not (event.keyval == gtk.keysyms.Up or event.keyval == gtk.keysyms.Down): |
1500 | - completion.set_match_func(self.match_func,widget) |
1501 | - completion.set_model(self.model) |
1502 | - widget.set_completion(completion) |
1503 | - completion.set_text_column(0) |
1504 | - |
1505 | - def match_func(self, completion, key, iter, widget): |
1506 | - model = completion.get_model() |
1507 | - return model[iter][0].lower().find(widget.get_text().lower()) >= 0 and True or False |
1508 | - |
1509 | def sig_activate(self, *args): |
1510 | text = self.child.get_text() |
1511 | - value = False |
1512 | - if text: |
1513 | - for txt, val in self._selection.items(): |
1514 | - if not val: |
1515 | - continue |
1516 | - if txt[:len(text)].lower() == text.lower(): |
1517 | - value = val |
1518 | - if len(txt) == len(text): |
1519 | - break |
1520 | + value = self._view.modelfield.selection.get_key(text) |
1521 | + if not value: |
1522 | + self.entry_text = text |
1523 | self._view.modelfield.set_client(self._view.model, value, force_change=True) |
1524 | self.display(self._view.model, self._view.modelfield) |
1525 | |
1526 | - |
1527 | def set_value(self, model, model_field): |
1528 | - model_field.set_client(model, self.value_get()) |
1529 | - |
1530 | - def _menu_sig_default_set(self): |
1531 | - self.set_value(self._view.model, self._view.modelfield) |
1532 | - super(selection, self)._menu_sig_default_set() |
1533 | + model_field.selection.update(self._selection) |
1534 | + text = self.child.get_text() |
1535 | + value = False |
1536 | + if text: |
1537 | + model_field.selection.get_key(text) |
1538 | + value = model_field.selection.get_key(text) |
1539 | + model_field.set_client(model, value) |
1540 | |
1541 | def display(self, model, model_field): |
1542 | - self.ok = False |
1543 | if not model_field: |
1544 | self.child.set_text('') |
1545 | - self.ok = True |
1546 | - return False |
1547 | + return |
1548 | + model_field.selection.update(dict(self.attrs.get('selection',[]))) |
1549 | super(selection, self).display(model, model_field) |
1550 | - value = model_field.get(model) |
1551 | - if not value: |
1552 | - self.child.set_text('') |
1553 | - else: |
1554 | - found = False |
1555 | - for long_text, sel_value in self._selection.items(): |
1556 | - if sel_value == value: |
1557 | - self.child.set_text(long_text) |
1558 | - found = True |
1559 | - break |
1560 | - self.ok = True |
1561 | + key = model_field.get(model, False) |
1562 | +# model_field.selection.update(self._selection) |
1563 | + text = model_field.selection.get_value(key) |
1564 | + self.child.set_text(self.entry_text or text) |
1565 | + self.entry_text = "" |
1566 | |
1567 | - def sig_changed(self, *args): |
1568 | - if self.ok: |
1569 | - self._focus_out() |
1570 | + def sig_changed(self, combox): |
1571 | + self._focus_out() |
1572 | |
1573 | def _color_widget(self): |
1574 | return self.child |
1575 | @@ -141,4 +123,3 @@ |
1576 | def grab_focus(self): |
1577 | return self.entry.grab_focus() |
1578 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
1579 | - |
1580 | |
1581 | === modified file 'bin/widget/view/list.py' |
1582 | --- bin/widget/view/list.py 2011-01-17 20:28:40 +0000 |
1583 | +++ bin/widget/view/list.py 2011-02-11 07:40:17 +0000 |
1584 | @@ -851,7 +851,7 @@ |
1585 | if col in self.widget_tree.handlers: |
1586 | if self.widget_tree.handlers[col]: |
1587 | renderer.disconnect(self.widget_tree.handlers[col]) |
1588 | - self.widget_tree.handlers[col] = renderer.connect_after('editing-started', send_keys, self.widget_tree) |
1589 | + self.widget_tree.handlers[col] = renderer.connect_after('editing-started', send_keys, self.widget_tree, col.name) |
1590 | |
1591 | |
1592 | def set_invisible_attr(self): |
1593 | |
1594 | === modified file 'bin/widget/view/tree_gtk/editabletree.py' |
1595 | --- bin/widget/view/tree_gtk/editabletree.py 2010-12-23 09:52:21 +0000 |
1596 | +++ bin/widget/view/tree_gtk/editabletree.py 2011-02-11 07:40:17 +0000 |
1597 | @@ -149,7 +149,12 @@ |
1598 | def get_cursor(self): |
1599 | res = super(EditableTreeView, self).get_cursor() |
1600 | return res |
1601 | - |
1602 | + |
1603 | + def get_current_model(self): |
1604 | + path, column = self.get_cursor() |
1605 | + store = self.get_model() |
1606 | + return store.get_value(store.get_iter(path), 0) |
1607 | + |
1608 | def set_value(self): |
1609 | path, column = self.get_cursor() |
1610 | store = self.get_model() |
1611 | @@ -175,7 +180,7 @@ |
1612 | def on_keypressed(self, entry, event, cell_value): |
1613 | path, column = self.get_cursor() |
1614 | store = self.get_model() |
1615 | - model = store.get_value(store.get_iter(path), 0) |
1616 | + model = self.get_current_model() |
1617 | if event.keyval in self.leaving_events: |
1618 | shift_pressed = bool(gtk.gdk.SHIFT_MASK & event.state) |
1619 | if isinstance(entry, gtk.Entry): |
1620 | |
1621 | === modified file 'bin/widget/view/tree_gtk/parser.py' |
1622 | --- bin/widget/view/tree_gtk/parser.py 2011-01-31 10:28:17 +0000 |
1623 | +++ bin/widget/view/tree_gtk/parser.py 2011-02-11 07:40:17 +0000 |
1624 | @@ -33,6 +33,7 @@ |
1625 | from editabletree import EditableTreeView |
1626 | from widget.view import interface |
1627 | from widget.view.list import group_record |
1628 | +from widget.model.field import SelectionField, M2OField |
1629 | import time |
1630 | import date_renderer |
1631 | |
1632 | @@ -47,13 +48,16 @@ |
1633 | import gobject |
1634 | import pango |
1635 | |
1636 | -def send_keys(renderer, entry, position, treeview): |
1637 | - if entry: |
1638 | +def send_keys(renderer, entry, position, treeview, col_name): |
1639 | + if entry: |
1640 | entry.connect('key_press_event', treeview.on_keypressed, renderer.get_property('text')) |
1641 | entry.set_data('renderer', renderer) |
1642 | entry.editing_done_id = entry.connect('editing_done', treeview.on_editing_done) |
1643 | if isinstance(entry, gtk.ComboBoxEntry): |
1644 | entry.connect('changed', treeview.on_editing_done) |
1645 | + if isinstance(entry, gtk.ComboBoxEntry): |
1646 | + popup = treeview.cells[col_name].popup |
1647 | + entry.connect('notify::popup-shown', popup, treeview) |
1648 | |
1649 | def sort_model(column, screen): |
1650 | unsaved_model = [x for x in screen.models if x.id == None or x.modified] |
1651 | @@ -107,10 +111,8 @@ |
1652 | treeview.sequence = False |
1653 | treeview.connect("motion-notify-event", treeview.set_tooltip) |
1654 | treeview.connect('key-press-event', treeview.on_tree_key_press) |
1655 | - |
1656 | for node in root_node: |
1657 | node_attrs = tools.node_attributes(node) |
1658 | - |
1659 | if node.tag == 'button': |
1660 | cell = Cell('button')(node_attrs['string'], treeview, node_attrs) |
1661 | cell.name = node_attrs['name'] |
1662 | @@ -158,16 +160,17 @@ |
1663 | self.window) |
1664 | treeview.cells[fname] = cell |
1665 | renderer = cell.renderer |
1666 | - |
1667 | + col = gtk.TreeViewColumn(None, renderer) |
1668 | + col.name = fname |
1669 | write_enable = editable and not node_attrs.get('readonly', False) |
1670 | if isinstance(renderer, gtk.CellRendererToggle): |
1671 | renderer.set_property('activatable', write_enable) |
1672 | elif isinstance(renderer, (gtk.CellRendererText, gtk.CellRendererCombo, date_renderer.DecoratorRenderer)): |
1673 | renderer.set_property('editable', write_enable) |
1674 | if write_enable: |
1675 | - handler_id = renderer.connect_after('editing-started', send_keys, treeview) |
1676 | - |
1677 | - col = gtk.TreeViewColumn(None, renderer) |
1678 | + handler_id = renderer.connect_after('editing-started', send_keys, treeview, col.name) |
1679 | + |
1680 | + |
1681 | treeview.handlers[col] = handler_id |
1682 | col_label = gtk.Label('') |
1683 | if fields[fname].get('required', False): |
1684 | @@ -176,7 +179,7 @@ |
1685 | col_label.set_text(fields[fname]['string']) |
1686 | col_label.show() |
1687 | col.set_widget(col_label) |
1688 | - col.name = fname |
1689 | + |
1690 | col._type = fields[fname]['type'] |
1691 | col.set_cell_data_func(renderer, cell.setter) |
1692 | col.set_clickable(True) |
1693 | @@ -549,6 +552,13 @@ |
1694 | return rpc.name_get([found[0]], context)[0] |
1695 | else: |
1696 | return False, None |
1697 | + |
1698 | + def get_textual_value(self, model): |
1699 | + if isinstance(model[self.field_name], SelectionField): |
1700 | + key = model[self.field_name].get_client(model) |
1701 | + return model[self.field_name].selection.get_value(key) |
1702 | + return model[self.field_name].get_client(model) or '' |
1703 | + |
1704 | |
1705 | |
1706 | class O2M(Char): |
1707 | @@ -609,29 +619,48 @@ |
1708 | def __init__(self, *args): |
1709 | super(Selection, self).__init__(*args) |
1710 | self.renderer = gtk.CellRendererCombo() |
1711 | - selection_data = gtk.ListStore(str, str) |
1712 | - for x in self.attrs.get('selection', []): |
1713 | - selection_data.append(x) |
1714 | - self.renderer.set_property('model', selection_data) |
1715 | + self.selection_data = gtk.ListStore(str, str) |
1716 | + selection = self.attrs.get('selection', []) |
1717 | + for x in selection: |
1718 | + self.selection_data.append(x) |
1719 | + if not selection: |
1720 | + self.selection_data.append([False, '']) |
1721 | + self.renderer.set_property('model', self.selection_data) |
1722 | self.renderer.set_property('text-column', 1) |
1723 | + self.relation = self.attrs.get('relation') |
1724 | |
1725 | def get_textual_value(self, model): |
1726 | - selection = dict(self.attrs['selection']) |
1727 | - selection_value = selection.get(model[self.field_name].get(model), '') |
1728 | - if isinstance(model, group_record): |
1729 | - return selection_value + model[self.field_name].count |
1730 | - return selection_value |
1731 | + if not isinstance(model, group_record): |
1732 | + key = model[self.field_name].get(model) |
1733 | + selection_value = model[self.field_name].selection.get_value(key) |
1734 | + return selection_value |
1735 | + else: |
1736 | + key = model[self.field_name].get(model) |
1737 | + return model.mgroup.mfields[self.field_name].selection.get_value(key) + model[self.field_name].count |
1738 | + |
1739 | + def popup(self, combobox, para, treeview): |
1740 | + if combobox.get_property('popup-shown') and self.relation: |
1741 | + entry = combobox.get_child() |
1742 | + text = entry.get_property('text') |
1743 | + rpc = RPCProxy(self.relation) |
1744 | + model = treeview.get_current_model() |
1745 | + domain = model[self.field_name].domain_get(model) |
1746 | + context = model[self.field_name].context_get(model) |
1747 | + key = model[self.field_name].selection.get_key(text) |
1748 | + if key: |
1749 | + text = '' |
1750 | + selection = rpc.name_search(text, domain, 'ilike',context, False) |
1751 | + if selection: |
1752 | + self.selection_data.clear() |
1753 | + model = treeview.get_current_model() |
1754 | + model[self.field_name].selection.update(dict(selection)) |
1755 | + for x in selection: |
1756 | + self.selection_data.append(x) |
1757 | |
1758 | def value_from_text(self, model, text): |
1759 | - selection = self.attrs['selection'] |
1760 | - text = tools.ustr(text) |
1761 | - res = False |
1762 | - for val, txt in selection: |
1763 | - if txt[:len(text)].lower() == text.lower(): |
1764 | - if len(txt) == len(text): |
1765 | - return val |
1766 | - res = val |
1767 | - return res |
1768 | + key = model[self.field_name].get(model) |
1769 | + selection_value = model[self.field_name].selection.get_value(key) |
1770 | + return model[self.field_name].selection.get_key(text) |
1771 | |
1772 | |
1773 | class ProgressBar(object): |
1774 | |
1775 | === modified file 'bin/widget_search/checkbox.py' |
1776 | --- bin/widget_search/checkbox.py 2010-09-21 09:39:49 +0000 |
1777 | +++ bin/widget_search/checkbox.py 2011-02-11 07:40:17 +0000 |
1778 | @@ -38,10 +38,11 @@ |
1779 | self.entry = self.widget.child |
1780 | self.entry.set_property('activates_default', True) |
1781 | self.entry.set_editable(False) |
1782 | - if self.default_search: |
1783 | - if self.default_search == 1: |
1784 | - self.default_search = 'Yes' |
1785 | - self.widget.child.set_text(self.default_search.capitalize()) |
1786 | + if bool(self.default_search): |
1787 | + self.default_search = _('Yes') |
1788 | + elif not self.default_search == '': |
1789 | + self.default_search = _('No') |
1790 | + self.widget.child.set_text(self.default_search.capitalize()) |
1791 | |
1792 | def clear(self): |
1793 | self.widget.child.set_text('') |
1794 | @@ -57,7 +58,7 @@ |
1795 | 'domain':domain, |
1796 | 'context': context |
1797 | } |
1798 | - |
1799 | + |
1800 | def grab_focus(self): |
1801 | self.widget.child.grab_focus() |
1802 | |
1803 | |
1804 | === modified file 'bin/widget_search/selection.py' |
1805 | --- bin/widget_search/selection.py 2011-01-17 19:11:21 +0000 |
1806 | +++ bin/widget_search/selection.py 2011-02-11 07:40:17 +0000 |
1807 | @@ -28,15 +28,15 @@ |
1808 | class selection(wid_int.wid_int): |
1809 | def __init__(self, name, parent, attrs={}, model=None, screen=None): |
1810 | wid_int.wid_int.__init__(self, name, parent, attrs, screen) |
1811 | - |
1812 | self.widget = gtk.combo_box_entry_new_text() |
1813 | + self.widget.connect('notify::popup-shown', self.popup_show) |
1814 | + self.context = screen.context |
1815 | + self.relation_model = self.attrs.get('relation', '') |
1816 | self.widget.child.set_editable(True) |
1817 | self.attrs = attrs |
1818 | self._selection = {} |
1819 | self.name = name |
1820 | - self.val_id = False |
1821 | - if 'selection' in attrs: |
1822 | - self.set_popdown(attrs.get('selection',[])) |
1823 | + self.set_popdown(attrs.get('selection',[])) |
1824 | if self.default_search: |
1825 | if self.attrs['type'] == 'many2one': |
1826 | self._value_set(int(self.default_search)) |
1827 | @@ -45,6 +45,16 @@ |
1828 | if self.widget.child.get_text() in self._selection.keys(): |
1829 | self.widget.set_active(self.indexes[self.widget.child.get_text()]-1) |
1830 | |
1831 | + def popup_show(self, combobox, popup_show): |
1832 | + search_text = self.widget.child.get_text() |
1833 | + if self._selection.get(search_text, False): |
1834 | + search_text ='' |
1835 | + if combobox.get_property('popup-shown') and self.attrs['type'] == 'many2one': |
1836 | + selection = rpc.session.rpc_exec_auth('/object', 'execute', self.relation_model, 'name_search', search_text , [] , 'ilike', self.context, False) |
1837 | + self.set_popdown(selection) |
1838 | + if not selection: |
1839 | + self.widget.child.set_text('') |
1840 | + |
1841 | def set_popdown(self, selection): |
1842 | self.model = self.widget.get_model() |
1843 | self.model.clear() |
1844 | |
1845 | === modified file 'bin/widget_search/wid_int.py' |
1846 | --- bin/widget_search/wid_int.py 2010-04-02 13:49:07 +0000 |
1847 | +++ bin/widget_search/wid_int.py 2011-02-11 07:40:17 +0000 |
1848 | @@ -39,6 +39,10 @@ |
1849 | default_context = call.context |
1850 | context_str = 'search_default_' + str(self.attrs['name']) |
1851 | self.default_search = default_context.get(context_str,False) |
1852 | + if attrs.get('type') == 'boolean': |
1853 | + if not default_context.has_key(context_str): |
1854 | + self.default_search = '' |
1855 | + |
1856 | |
1857 | def clear(self): |
1858 | self.value = '' |
Reasons:
1: send proposal to Trunk server
2: feature should only be available for widget=selection.
Thanks