Merge lp:~gs.clearcorp/openerp-ccorp-addons/7.0_project_openerp_methodology into lp:openerp-ccorp-addons/7.0

Proposed by Glen Sojo
Status: Merged
Merged at revision: 828
Proposed branch: lp:~gs.clearcorp/openerp-ccorp-addons/7.0_project_openerp_methodology
Merge into: lp:openerp-ccorp-addons/7.0
Diff against target: 6580 lines (+6423/-0)
25 files modified
project_openerp/__init__.py (+24/-0)
project_openerp/__openerp__.py (+53/-0)
project_openerp/data/project_openerp_data.xml (+156/-0)
project_openerp/i18n/es.po (+542/-0)
project_openerp/i18n/project_openerp.pot (+540/-0)
project_openerp/project_openerp.py (+377/-0)
project_openerp/security/ir.model.access.csv (+10/-0)
project_openerp/view/project_openerp_menu.xml (+46/-0)
project_openerp/view/project_openerp_view.xml (+300/-0)
project_openerp/wizard/__init__.py (+26/-0)
project_openerp/wizard/feature_import_wizard.py (+115/-0)
project_openerp/wizard/phase_create_wizard.py (+72/-0)
project_openerp/wizard/sprint_close_wizard.py (+71/-0)
project_openerp/wizard/task_create_wizard.py (+149/-0)
project_openerp/wizard/wizard_view.xml (+106/-0)
project_scrum/__init__.py (+23/-0)
project_scrum/__openerp__.py (+52/-0)
project_scrum/data/project_scrum_data.xml (+26/-0)
project_scrum/i18n/es.po (+829/-0)
project_scrum/i18n/project_scrum.pot (+820/-0)
project_scrum/project_scrum.py (+1152/-0)
project_scrum/security/ir.model.access.csv (+11/-0)
project_scrum/static/src/css/project_scrum.css (+33/-0)
project_scrum/view/project_scrum_menu.xml (+39/-0)
project_scrum/view/project_scrum_view.xml (+851/-0)
To merge this branch: bzr merge lp:~gs.clearcorp/openerp-ccorp-addons/7.0_project_openerp_methodology
Reviewer Review Type Date Requested Status
ClearCorp drivers Pending
Review via email: mp+212882@code.launchpad.net

Description of the change

[ADD] Inclusion of modules to manage scrum and openerp specific methodologies

To post a comment you must log in.
824. By Ronald Rubi

[MRG] Add exchange_rate_calculated module. It permits compute amount_currency with diferents currency and it assign this amount to debit or credit

825. By Ronald Rubi

[MRG] Add exchange rate currency for commercial currency in supplier and customer form for payments, Improve file names for account_voucher_payment_method module., Fix get_exchange_rate method. Add case when both currencies are equal

826. By Ronald Rubi

[MRG] Add account_partner_balance_report

827. By Ronald Rubi

[MRG] Add withholding tax comissions to customer and supplier voucher

828. By Ronald Rubi

[MRG] Add modules project_scrum and project_openerp

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'project_openerp'
2=== added file 'project_openerp/__init__.py'
3--- project_openerp/__init__.py 1970-01-01 00:00:00 +0000
4+++ project_openerp/__init__.py 2014-03-27 17:09:06 +0000
5@@ -0,0 +1,24 @@
6+# -*- coding: utf-8 -*-
7+##############################################################################
8+#
9+# OpenERP, Open Source Management Solution
10+# Addons modules by CLEARCORP S.A.
11+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
12+#
13+# This program is free software: you can redistribute it and/or modify
14+# it under the terms of the GNU Affero General Public License as
15+# published by the Free Software Foundation, either version 3 of the
16+# License, or (at your option) any later version.
17+#
18+# This program is distributed in the hope that it will be useful,
19+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21+# GNU Affero General Public License for more details.
22+#
23+# You should have received a copy of the GNU Affero General Public License
24+# along with this program. If not, see <http://www.gnu.org/licenses/>.
25+#
26+##############################################################################
27+
28+import project_openerp
29+import wizard
30\ No newline at end of file
31
32=== added file 'project_openerp/__openerp__.py'
33--- project_openerp/__openerp__.py 1970-01-01 00:00:00 +0000
34+++ project_openerp/__openerp__.py 2014-03-27 17:09:06 +0000
35@@ -0,0 +1,53 @@
36+# -*- coding: utf-8 -*-
37+##############################################################################
38+#
39+# OpenERP, Open Source Management Solution
40+# Addons modules by CLEARCORP S.A.
41+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
42+#
43+# This program is free software: you can redistribute it and/or modify
44+# it under the terms of the GNU Affero General Public License as
45+# published by the Free Software Foundation, either version 3 of the
46+# License, or (at your option) any later version.
47+#
48+# This program is distributed in the hope that it will be useful,
49+# but WITHOUT ANY WARRANTY; without even the implied warranty of
50+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
51+# GNU Affero General Public License for more details.
52+#
53+# You should have received a copy of the GNU Affero General Public License
54+# along with this program. If not, see <http://www.gnu.org/licenses/>.
55+#
56+##############################################################################
57+
58+{
59+ "name" : 'Project OpenERP Methodology',
60+ "version" : '1.0',
61+ "author" : 'CLEARCORP S.A.',
62+ 'complexity': 'normal',
63+ "description": """
64+""",
65+ "category": 'Project Management',
66+ "sequence": 10,
67+ "website" : "http://clearcorp.co.cr",
68+ "images" : [],
69+ "depends" : [
70+ 'project_scrum',
71+ 'project_long_term',
72+ ],
73+ "data" : [
74+ 'data/project_openerp_data.xml',
75+ 'wizard/wizard_view.xml',
76+ 'view/project_openerp_view.xml',
77+ 'view/project_openerp_menu.xml',
78+ 'security/ir.model.access.csv',
79+ ],
80+ "init_xml" : [],
81+ "demo_xml" : [],
82+ "update_xml" : [],
83+ "test" : [],
84+ "auto_install": False,
85+ "application": False,
86+ "installable": True,
87+ 'license': 'AGPL-3',
88+}
89\ No newline at end of file
90
91=== added directory 'project_openerp/data'
92=== added file 'project_openerp/data/project_openerp_data.xml'
93--- project_openerp/data/project_openerp_data.xml 1970-01-01 00:00:00 +0000
94+++ project_openerp/data/project_openerp_data.xml 2014-03-27 17:09:06 +0000
95@@ -0,0 +1,156 @@
96+<?xml version="1.0" encoding="utf-8"?>
97+<openerp>
98+ <data noupdate="1">
99+
100+ <record model="project.oerp.work.type.template.group" id="data_work_type_template_group">
101+ <field name="name">Default Templates</field>
102+ <field name="file">VHlwZSwjLEMsTmFtZSxEZXNjcmlwdGlvbixQcmlvcml0eSxPcHRpb25hbCBEYXRhLE9wdGlvbmFsIERhdGEsT3B0aW9uYWwgRGF0YSxDb25maWd1cmF0aW9uLEludGVyZmFjZSxJbnRlcmFjdGlvbixEaWFncmFtcyxJbmZvcm1zLFBlcm1pc3Npb25zLFRlc3RzLE9iamVjdHMsTWV0aG9kcyxGdW5jdGlvbmFsIEZpZWxkcyxXb3JrZmxvd3MsSW50ZXJmYWNlLFdpemFyZHMsSW5mb3JtcyxEYXRhIExvYWRpbmcsUGVybWlzc2lvbnMsVGVzdHMsR2VuZXJhbApQUkosMDAxLCxGZWF0dXJlIDEsRGVzY3JpcHRpb24gMSwyLEVtcHR5LEVtcHR5LEVtcHR5LDEsMCwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMSwzCkhSLDAwMiwsRmVhdHVyZSAyLERlc2NyaXB0aW9uIDIsMSxFbXB0eSxFbXB0eSxFbXB0eSwyLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDIsNQpQUkosMDAzLCxGZWF0dXJlIDMsRGVzY3JpcHRpb24gMywyLEVtcHR5LEVtcHR5LEVtcHR5LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzCkFDQywwMDQsLEZlYXR1cmUgNCxEZXNjcmlwdGlvbiA0LDMsRW1wdHksRW1wdHksRW1wdHksMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDMKUFJKLDAwNSwsRmVhdHVyZSA1LERlc2NyaXB0aW9uIDUsNCxFbXB0eSxFbXB0eSxFbXB0eSwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMg==</field>
103+ <field name="filename">default.cvs</field>
104+ </record>
105+
106+ <!-- Funtional -->
107+ <record model="project.oerp.work.type.template" id="data_work_type_template_fun">
108+ <field name="group_id" ref="data_work_type_template_group"/>
109+ <field name="name">Functional Analysis</field>
110+ </record>
111+
112+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_fun_conf">
113+ <field name="template_id" ref="data_work_type_template_fun"/>
114+ <field name="name">Configuration</field>
115+ <field name="sequence">0</field>
116+ <field name="column_number">10</field>
117+ </record>
118+
119+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_fun_int">
120+ <field name="template_id" ref="data_work_type_template_fun"/>
121+ <field name="name">Interface</field>
122+ <field name="sequence">1</field>
123+ <field name="column_number">11</field>
124+ </record>
125+
126+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_fun_intr">
127+ <field name="template_id" ref="data_work_type_template_fun"/>
128+ <field name="name">Interaction</field>
129+ <field name="sequence">2</field>
130+ <field name="column_number">12</field>
131+ </record>
132+
133+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_fun_dia">
134+ <field name="template_id" ref="data_work_type_template_fun"/>
135+ <field name="name">Diagrams</field>
136+ <field name="sequence">3</field>
137+ <field name="column_number">13</field>
138+ </record>
139+
140+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_fun_inf">
141+ <field name="template_id" ref="data_work_type_template_fun"/>
142+ <field name="name">Informs</field>
143+ <field name="sequence">4</field>
144+ <field name="column_number">14</field>
145+ </record>
146+
147+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_fun_per">
148+ <field name="template_id" ref="data_work_type_template_fun"/>
149+ <field name="name">Permissions</field>
150+ <field name="sequence">5</field>
151+ <field name="column_number">15</field>
152+ </record>
153+
154+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_fun_tes">
155+ <field name="template_id" ref="data_work_type_template_fun"/>
156+ <field name="name">Tests</field>
157+ <field name="sequence">6</field>
158+ <field name="column_number">16</field>
159+ </record>
160+
161+ <!-- Technical -->
162+ <record model="project.oerp.work.type.template" id="data_work_type_template_tec">
163+ <field name="group_id" ref="data_work_type_template_group"/>
164+ <field name="name">Technical Analysis</field>
165+ </record>
166+
167+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_obj">
168+ <field name="template_id" ref="data_work_type_template_tec"/>
169+ <field name="name">Objects</field>
170+ <field name="sequence">7</field>
171+ <field name="column_number">17</field>
172+ </record>
173+
174+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_met">
175+ <field name="template_id" ref="data_work_type_template_tec"/>
176+ <field name="name">Methods</field>
177+ <field name="sequence">8</field>
178+ <field name="column_number">18</field>
179+ </record>
180+
181+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_fun">
182+ <field name="template_id" ref="data_work_type_template_tec"/>
183+ <field name="name">Functional Fields</field>
184+ <field name="sequence">9</field>
185+ <field name="column_number">19</field>
186+ </record>
187+
188+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_wor">
189+ <field name="template_id" ref="data_work_type_template_tec"/>
190+ <field name="name">Workflows</field>
191+ <field name="sequence">10</field>
192+ <field name="column_number">20</field>
193+ </record>
194+
195+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_int">
196+ <field name="template_id" ref="data_work_type_template_tec"/>
197+ <field name="name">Interface</field>
198+ <field name="sequence">11</field>
199+ <field name="column_number">21</field>
200+ </record>
201+
202+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_wiz">
203+ <field name="template_id" ref="data_work_type_template_tec"/>
204+ <field name="name">Wizards</field>
205+ <field name="sequence">12</field>
206+ <field name="column_number">22</field>
207+ </record>
208+
209+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_inf">
210+ <field name="template_id" ref="data_work_type_template_tec"/>
211+ <field name="name">Informs</field>
212+ <field name="sequence">13</field>
213+ <field name="column_number">23</field>
214+ </record>
215+
216+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_load">
217+ <field name="template_id" ref="data_work_type_template_tec"/>
218+ <field name="name">Data Loading</field>
219+ <field name="sequence">14</field>
220+ <field name="column_number">24</field>
221+ </record>
222+
223+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_per">
224+ <field name="template_id" ref="data_work_type_template_tec"/>
225+ <field name="name">Permissions</field>
226+ <field name="sequence">15</field>
227+ <field name="column_number">25</field>
228+ </record>
229+
230+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_tec_tes">
231+ <field name="template_id" ref="data_work_type_template_tec"/>
232+ <field name="name">Tests</field>
233+ <field name="sequence">16</field>
234+ <field name="column_number">26</field>
235+ </record>
236+
237+ <!-- Development -->
238+ <record model="project.oerp.work.type.template" id="data_work_type_template_dev">
239+ <field name="group_id" ref="data_work_type_template_group"/>
240+ <field name="name">Development</field>
241+ </record>
242+
243+ <record model="project.oerp.work.type.mapping" id="data_work_type_mapping_dev_gen">
244+ <field name="template_id" ref="data_work_type_template_dev"/>
245+ <field name="name">General</field>
246+ <field name="sequence">17</field>
247+ <field name="column_number">27</field>
248+ </record>
249+
250+ </data>
251+</openerp>
252\ No newline at end of file
253
254=== added directory 'project_openerp/i18n'
255=== added file 'project_openerp/i18n/es.po'
256--- project_openerp/i18n/es.po 1970-01-01 00:00:00 +0000
257+++ project_openerp/i18n/es.po 2014-03-27 17:09:06 +0000
258@@ -0,0 +1,542 @@
259+# Translation of OpenERP Server.
260+# This file contains the translation of the following modules:
261+# * project_openerp
262+#
263+msgid ""
264+msgstr ""
265+"Project-Id-Version: OpenERP Server 7.0\n"
266+"Report-Msgid-Bugs-To: \n"
267+"POT-Creation-Date: 2014-03-25 22:41+0000\n"
268+"PO-Revision-Date: 2014-03-25 22:41+0000\n"
269+"Last-Translator: <>\n"
270+"Language-Team: \n"
271+"MIME-Version: 1.0\n"
272+"Content-Type: text/plain; charset=UTF-8\n"
273+"Content-Transfer-Encoding: \n"
274+"Plural-Forms: \n"
275+
276+#. module: project_openerp
277+#: field:project.oerp.feature.import.wizard,file:0
278+msgid "File to Import"
279+msgstr "Archivo a importar"
280+
281+#. module: project_openerp
282+#: field:project.oerp.work.type.template,filename:0
283+#: field:project.oerp.work.type.template.group,filename:0
284+msgid "Filename"
285+msgstr "Nombre de archivo"
286+
287+#. module: project_openerp
288+#: field:project.oerp.work.type.mapping,template_id:0
289+#: field:project.oerp.work.type.template,name:0
290+msgid "Template"
291+msgstr "Plantilla"
292+
293+#. module: project_openerp
294+#: field:project.oerp.work.type.template.group,name:0
295+msgid "Group Name"
296+msgstr "Nombre de grupo"
297+
298+#. module: project_openerp
299+#: field:project.oerp.phase.create.wizard,product_uom:0
300+msgid "Unit of Measure"
301+msgstr "Unidad de medida"
302+
303+#. module: project_openerp
304+#: model:ir.actions.act_window,name:project_openerp.action_phase_create_wizard
305+msgid "Create Phase from Template"
306+msgstr "Crear fase desde planilla"
307+
308+#. module: project_openerp
309+#: model:ir.actions.act_window,name:project_openerp.action_work_type_template
310+#: field:project.oerp.phase.create.wizard,work_type_template_id:0
311+#: view:project.oerp.work.type.template:0
312+msgid "Work Type Template"
313+msgstr "Planilla de tipo de trabajo"
314+
315+#. module: project_openerp
316+#: view:project.oerp.feature.import.wizard:0
317+msgid "Feature Import Wizard"
318+msgstr "Asistente de importación de características"
319+
320+#. module: project_openerp
321+#: field:project.oerp.task.hour,expected_hours:0
322+msgid "Initially Planned Hour(s)"
323+msgstr "Horas planeadas inicialmente"
324+
325+#. module: project_openerp
326+#: field:project.oerp.sprint.close.wizard,opening_sprint_id:0
327+msgid "Opening Sprint"
328+msgstr "Sprint apertura"
329+
330+#. module: project_openerp
331+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_wor
332+msgid "Workflows"
333+msgstr "Flujos de Trabajo"
334+
335+#. module: project_openerp
336+#: model:ir.model,name:project_openerp.model_project_task
337+#: field:project.oerp.task.hour,task_id:0
338+msgid "Task"
339+msgstr "Tarea"
340+
341+#. module: project_openerp
342+#: view:project.oerp.work.type.template:0
343+#: field:project.oerp.work.type.template,work_type_mapping_ids:0
344+#: view:project.phase:0
345+#: field:project.phase,work_type_ids:0
346+msgid "Work Types"
347+msgstr "Tipos de trabajo"
348+
349+#. module: project_openerp
350+#: field:project.oerp.feature.import.wizard,product_backlog_id:0
351+#: field:project.oerp.phase.create.wizard,product_backlog_id:0
352+#: field:project.phase,product_backlog_id:0
353+msgid "Product Backlog"
354+msgstr "Pila de producto"
355+
356+#. module: project_openerp
357+#: field:project.oerp.feature.hours,project_id:0
358+#: field:project.oerp.feature.import.wizard,project_id:0
359+#: field:project.oerp.phase.create.wizard,project_id:0
360+#: field:project.oerp.task.hour,project_id:0
361+msgid "Project"
362+msgstr "Proyecto"
363+
364+#. module: project_openerp
365+#: model:ir.ui.menu,name:project_openerp.menu_feature_import_wizard
366+msgid "Import Features"
367+msgstr "Importar características"
368+
369+#. module: project_openerp
370+#: model:project.oerp.work.type.template,name:project_openerp.data_work_type_template_fun
371+msgid "Functional Analysis"
372+msgstr "Análisis funcional"
373+
374+#. module: project_openerp
375+#: field:project.oerp.feature.hours,work_type_id:0
376+#: field:project.oerp.task.hour,work_type_id:0
377+#: field:project.task.work,work_type_id:0
378+msgid "Work Type"
379+msgstr "Tipo de trabajo"
380+
381+#. module: project_openerp
382+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_fun
383+msgid "Functional Fields"
384+msgstr "Campos funcionales"
385+
386+#. module: project_openerp
387+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_met
388+msgid "Methods"
389+msgstr "Métodos"
390+
391+#. module: project_openerp
392+#: model:project.oerp.work.type.template,name:project_openerp.data_work_type_template_tec
393+msgid "Technical Analysis"
394+msgstr "Análisis técnico"
395+
396+#. module: project_openerp
397+#: model:ir.actions.act_window,name:project_openerp.action_work_type_template_group
398+#: view:project.oerp.work.type.template.group:0
399+msgid "Work Type Template Group"
400+msgstr "Grupo de plantilla de tipo de trabajo"
401+
402+#. module: project_openerp
403+#: field:project.oerp.sprint.close.wizard,closing_sprint_id:0
404+msgid "Closing Sprint"
405+msgstr "Sprint de cierre"
406+
407+#. module: project_openerp
408+#: view:project.oerp.phase.create.wizard:0
409+#: view:project.oerp.sprint.close.wizard:0
410+#: view:project.oerp.task.create.wizard:0
411+msgid "Are you sure you want to continue?"
412+msgstr "¿Estás seguro que quieres continuar?"
413+
414+#. module: project_openerp
415+#: view:project.scrum.feature:0
416+#: field:project.scrum.feature,hour_ids:0
417+#: view:project.task:0
418+#: field:project.task,feature_hour_ids:0
419+msgid "Feature Hours"
420+msgstr "Horas de característica"
421+
422+#. module: project_openerp
423+#: view:project.oerp.phase.create.wizard:0
424+#: view:project.oerp.task.create.wizard:0
425+msgid "Create"
426+msgstr "Crear"
427+
428+#. module: project_openerp
429+#: field:project.oerp.feature.import.wizard,state:0
430+msgid "State"
431+msgstr "Estado"
432+
433+#. module: project_openerp
434+#: constraint:project.phase:0
435+msgid "All sprints must belong to the selected product backlog."
436+msgstr "Todos los sprints deben perteneces a la pila de producto seleccionada."
437+
438+#. module: project_openerp
439+#: code:addons/project_openerp/wizard/feature_import_wizard.py:39
440+#, python-format
441+msgid "An error occurred while reading the file. Please check if the format is correct."
442+msgstr "Un error ocurrio mientras se leia el archivo. Por favor verifique que el formato sea correcto."
443+
444+#. module: project_openerp
445+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_dia
446+msgid "Diagrams"
447+msgstr "Diagramas"
448+
449+#. module: project_openerp
450+#: model:ir.ui.menu,name:project_openerp.menu_work_type_template
451+#: view:project.oerp.work.type.template.group:0
452+msgid "Phase Templates"
453+msgstr "Plantilla de Fase"
454+
455+#. module: project_openerp
456+#: model:ir.actions.act_window,name:project_openerp.action_task_create_wizard
457+msgid "Create Tasks from Sequence"
458+msgstr "Crear tareas desde secuencia"
459+
460+#. module: project_openerp
461+#: model:ir.actions.act_window,name:project_openerp.action_sprint_close_wizard
462+#: model:ir.ui.menu,name:project_openerp.menu_sprint_close_wizard
463+msgid "Close Sprint"
464+msgstr "Cerrar Sprint"
465+
466+#. module: project_openerp
467+#: view:project.oerp.work.type.template:0
468+msgid "Work Type Templates"
469+msgstr "Plantillas de tipo de trabajo"
470+
471+#. module: project_openerp
472+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_int
473+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_int
474+msgid "Interface"
475+msgstr "Interfaz"
476+
477+#. module: project_openerp
478+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_conf
479+msgid "Configuration"
480+msgstr "Configuración"
481+
482+#. module: project_openerp
483+#: view:project.scrum.sprint:0
484+msgid "Are you sure you want to queue all tasks?"
485+msgstr "¿Estás seguro que deseas poner en cola todas las tareas?"
486+
487+#. module: project_openerp
488+#: view:project.task:0
489+#: field:project.task,task_hour_ids:0
490+msgid "Task Hours"
491+msgstr "Horas de tarea"
492+
493+#. module: project_openerp
494+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_intr
495+msgid "Interaction"
496+msgstr "Interacción"
497+
498+#. module: project_openerp
499+#: field:project.oerp.work.type,column_number:0
500+#: field:project.oerp.work.type.mapping,column_number:0
501+msgid "Column Number"
502+msgstr "Número de columna"
503+
504+#. module: project_openerp
505+#: field:project.oerp.feature.hours,expected_hours:0
506+#: view:project.task:0
507+msgid "Planned Hour(s)"
508+msgstr "Horas planeadas"
509+
510+#. module: project_openerp
511+#: view:project.oerp.feature.import.wizard:0
512+msgid "Are you sure you want to import this file?"
513+msgstr "¿Estás seguro que deseas importar este archivo?"
514+
515+#. module: project_openerp
516+#: model:ir.ui.menu,name:project_openerp.menu_phase_create_wizard
517+msgid "Create Phase"
518+msgstr "Crear fase"
519+
520+#. module: project_openerp
521+#: view:project.oerp.sprint.close.wizard:0
522+msgid "Close Sprint Wizard"
523+msgstr "Asistente de cierre de sprint"
524+
525+#. module: project_openerp
526+#: model:ir.actions.act_window,name:project_openerp.action_feature_import_wizard
527+msgid "Feature Import"
528+msgstr "Importación de características"
529+
530+#. module: project_openerp
531+#: model:ir.ui.menu,name:project_openerp.menu_task_create_wizard
532+msgid "Create Tasks"
533+msgstr "Crear tareas"
534+
535+#. module: project_openerp
536+#: field:project.phase,is_scrum:0
537+msgid "Is Scrum"
538+msgstr "Es scrum"
539+
540+#. module: project_openerp
541+#: view:project.scrum.sprint:0
542+#: field:project.scrum.sprint,desirable_task_ids:0
543+msgid "Desirable Tasks"
544+msgstr "Tareas deseables"
545+
546+#. module: project_openerp
547+#: view:project.oerp.feature.import.wizard:0
548+#: view:project.oerp.phase.create.wizard:0
549+#: view:project.oerp.sprint.close.wizard:0
550+#: view:project.oerp.task.create.wizard:0
551+msgid "or"
552+msgstr "ó"
553+
554+#. module: project_openerp
555+#: constraint:project.task.work:0
556+msgid "The selected Work Type has not been planned in the selected Feature."
557+msgstr "El tipo de tarea seleccionado no ha sido planeado en la característica seleccionada."
558+
559+#. module: project_openerp
560+#: field:project.oerp.work.type.template,group_id:0
561+msgid "Group"
562+msgstr "Grupo"
563+
564+#. module: project_openerp
565+#: view:project.oerp.feature.import.wizard:0
566+msgid "Import"
567+msgstr "Importar"
568+
569+#. module: project_openerp
570+#: model:ir.actions.act_window,help:project_openerp.action_work_type_template_group
571+msgid "<p class=\"oe_view_nocontent_create\">Create new Work Type Template Group</p>\n"
572+" "
573+msgstr "<p class=\"oe_view_nocontent_create\">Crear nuevo Grupo de plantilla de tipo de trabajo</p>\n"
574+" "
575+
576+#. module: project_openerp
577+#: model:ir.actions.act_window,help:project_openerp.action_work_type_template
578+msgid "<p class=\"oe_view_nocontent_create\">Create new Work Type Template</p>\n"
579+" "
580+msgstr "<p class=\"oe_view_nocontent_create\">Crear nueva plantilla de tipo de trabajo</p>\n"
581+" "
582+
583+#. module: project_openerp
584+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_tes
585+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_tes
586+msgid "Tests"
587+msgstr "Pruebas"
588+
589+#. module: project_openerp
590+#: view:project.oerp.phase.create.wizard:0
591+msgid "Phase Create Wizard"
592+msgstr "Asistente de creación de fase"
593+
594+#. module: project_openerp
595+#: view:project.oerp.task.create.wizard:0
596+msgid "Task Create Wizard"
597+msgstr "Asistente de creación de tareas"
598+
599+#. module: project_openerp
600+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_per
601+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_per
602+msgid "Permissions"
603+msgstr "Permisos"
604+
605+#. module: project_openerp
606+#: field:project.oerp.feature.hours,effective_hours:0
607+#: field:project.oerp.task.hour,effective_hours:0
608+#: view:project.task:0
609+msgid "Spent Hour(s)"
610+msgstr "Horas consumidas"
611+
612+#. module: project_openerp
613+#: view:project.oerp.work.type.template.group:0
614+msgid "Work Type Template Groups"
615+msgstr "Grupos de plantillas de tipo de trabajo"
616+
617+#. module: project_openerp
618+#: code:addons/project_openerp/wizard/feature_import_wizard.py:94
619+#, python-format
620+msgid "An error occurred while importing the features"
621+msgstr "Un error ocurrió mientras se importaban las características"
622+
623+#. module: project_openerp
624+#: code:addons/project_openerp/wizard/feature_import_wizard.py:39
625+#: code:addons/project_openerp/wizard/feature_import_wizard.py:86
626+#: code:addons/project_openerp/wizard/feature_import_wizard.py:94
627+#: code:addons/project_openerp/wizard/sprint_close_wizard.py:64
628+#: code:addons/project_openerp/wizard/task_create_wizard.py:47
629+#: code:addons/project_openerp/wizard/task_create_wizard.py:122
630+#, python-format
631+msgid "Error"
632+msgstr "Error"
633+
634+#. module: project_openerp
635+#: view:project.scrum.sprint:0
636+msgid "Tasks from Sequence"
637+msgstr "Tareas desde secuencia"
638+
639+#. module: project_openerp
640+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_dev_gen
641+msgid "General"
642+msgstr "General"
643+
644+#. module: project_openerp
645+#: selection:project.oerp.feature.import.wizard,state:0
646+msgid "Done"
647+msgstr "Realizado"
648+
649+#. module: project_openerp
650+#: view:project.oerp.feature.import.wizard:0
651+#: view:project.oerp.phase.create.wizard:0
652+#: view:project.oerp.sprint.close.wizard:0
653+#: view:project.oerp.task.create.wizard:0
654+msgid "Cancel"
655+msgstr "Cancelar"
656+
657+#. module: project_openerp
658+#: view:project.oerp.sprint.close.wizard:0
659+msgid "Close"
660+msgstr "Cerrar"
661+
662+#. module: project_openerp
663+#: field:project.oerp.work.type,name:0
664+#: field:project.oerp.work.type.mapping,name:0
665+msgid "Type Name"
666+msgstr "Nombre de tipo"
667+
668+#. module: project_openerp
669+#: view:project.scrum.sprint:0
670+msgid "Queue Tasks"
671+msgstr "Tareas en cola"
672+
673+#. module: project_openerp
674+#: field:project.oerp.feature.hours,feature_id:0
675+msgid "Feature"
676+msgstr "Característica"
677+
678+#. module: project_openerp
679+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_load
680+msgid "Data Loading"
681+msgstr "Carga de Datos"
682+
683+#. module: project_openerp
684+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_wiz
685+msgid "Wizards"
686+msgstr "Asistentes"
687+
688+#. module: project_openerp
689+#: selection:project.oerp.feature.import.wizard,state:0
690+msgid "New"
691+msgstr "Nuevo"
692+
693+#. module: project_openerp
694+#: field:project.phase,user_id:0
695+msgid "Phase Manager"
696+msgstr "Encargado de fase"
697+
698+#. module: project_openerp
699+#: model:project.oerp.work.type.template,name:project_openerp.data_work_type_template_dev
700+msgid "Development"
701+msgstr "Desarrollo"
702+
703+#. module: project_openerp
704+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_inf
705+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_inf
706+msgid "Informs"
707+msgstr "Informes"
708+
709+#. module: project_openerp
710+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_obj
711+msgid "Objects"
712+msgstr "Objetos"
713+
714+#. module: project_openerp
715+#: field:project.oerp.feature.hours,phase_id:0
716+#: field:project.oerp.task.hour,phase_id:0
717+#: field:project.oerp.work.type,phase_id:0
718+#: field:project.scrum.sprint,phase_id:0
719+#: field:project.task.work,phase_id:0
720+msgid "Phase"
721+msgstr "Fase"
722+
723+#. module: project_openerp
724+#: field:project.oerp.work.type.template.group,template_ids:0
725+msgid "Templates"
726+msgstr "Plantillas"
727+
728+#. module: project_openerp
729+#: code:addons/project_openerp/wizard/task_create_wizard.py:47
730+#, python-format
731+msgid "All task were created before."
732+msgstr "Todas las tareas creadas anteriormente."
733+
734+#. module: project_openerp
735+#: model:ir.model,name:project_openerp.model_project_phase
736+msgid "Project Phase"
737+msgstr "Fase de proyecto"
738+
739+#. module: project_openerp
740+#: model:project.oerp.work.type.template.group,name:project_openerp.data_work_type_template_group
741+msgid "Default Templates"
742+msgstr "Plantillas por defecto"
743+
744+#. module: project_openerp
745+#: code:addons/project_openerp/wizard/feature_import_wizard.py:86
746+#, python-format
747+msgid "An error occurred while reading the planned hours from file in column %s for work type %s"
748+msgstr "Un error ocurrió mientras se leían las horas planeadas del archivo en la columna %s para el tipo de trabajo %s"
749+
750+#. module: project_openerp
751+#: code:addons/project_openerp/wizard/task_create_wizard.py:122
752+#, python-format
753+msgid "An error occurred while creating the tasks. Please contact your system administrator."
754+msgstr "Un error ocurrió mientras se creaban las tareas. Por favor contacte su administrador de sistema."
755+
756+#. module: project_openerp
757+#: field:project.oerp.work.type,sequence:0
758+#: field:project.oerp.work.type.mapping,sequence:0
759+msgid "Sequence"
760+msgstr "Secuencia"
761+
762+#. module: project_openerp
763+#: code:addons/project_openerp/wizard/sprint_close_wizard.py:64
764+#, python-format
765+msgid "An error occurred while closing the sprint."
766+msgstr "Un error ocurrió mientra se cerraba el sprint."
767+
768+#. module: project_openerp
769+#: field:project.oerp.work.type.template,file:0
770+#: field:project.oerp.work.type.template.group,file:0
771+msgid "File"
772+msgstr "Archivo"
773+
774+#. module: project_openerp
775+#: field:project.oerp.feature.hours,remaining_hours:0
776+#: field:project.oerp.task.hour,remaining_hours:0
777+#: view:project.task:0
778+msgid "Remaining Hour(s)"
779+msgstr "Horas restantes"
780+
781+#. module: project_openerp
782+#: view:project.oerp.phase.create.wizard:0
783+#: field:project.oerp.phase.create.wizard,duration:0
784+msgid "Duration"
785+msgstr "Duración"
786+
787+#. module: project_openerp
788+#: field:project.oerp.task.create.wizard,sprint_id:0
789+msgid "Sprint"
790+msgstr "Sprint"
791+
792+#. module: project_openerp
793+#: model:ir.ui.menu,name:project_openerp.menu_tools
794+msgid "Tools"
795+msgstr "Herramientas"
796+
797+#. module: project_openerp
798+#: model:ir.ui.menu,name:project_openerp.menu_work_type_template_group
799+msgid "Phase Template Groups"
800+msgstr "Grupos de plantillas de fase"
801
802=== added file 'project_openerp/i18n/project_openerp.pot'
803--- project_openerp/i18n/project_openerp.pot 1970-01-01 00:00:00 +0000
804+++ project_openerp/i18n/project_openerp.pot 2014-03-27 17:09:06 +0000
805@@ -0,0 +1,540 @@
806+# Translation of OpenERP Server.
807+# This file contains the translation of the following modules:
808+# * project_openerp
809+#
810+msgid ""
811+msgstr ""
812+"Project-Id-Version: OpenERP Server 7.0\n"
813+"Report-Msgid-Bugs-To: \n"
814+"POT-Creation-Date: 2014-03-25 22:41+0000\n"
815+"PO-Revision-Date: 2014-03-25 22:41+0000\n"
816+"Last-Translator: <>\n"
817+"Language-Team: \n"
818+"MIME-Version: 1.0\n"
819+"Content-Type: text/plain; charset=UTF-8\n"
820+"Content-Transfer-Encoding: \n"
821+"Plural-Forms: \n"
822+
823+#. module: project_openerp
824+#: field:project.oerp.feature.import.wizard,file:0
825+msgid "File to Import"
826+msgstr ""
827+
828+#. module: project_openerp
829+#: field:project.oerp.work.type.template,filename:0
830+#: field:project.oerp.work.type.template.group,filename:0
831+msgid "Filename"
832+msgstr ""
833+
834+#. module: project_openerp
835+#: field:project.oerp.work.type.mapping,template_id:0
836+#: field:project.oerp.work.type.template,name:0
837+msgid "Template"
838+msgstr ""
839+
840+#. module: project_openerp
841+#: field:project.oerp.work.type.template.group,name:0
842+msgid "Group Name"
843+msgstr ""
844+
845+#. module: project_openerp
846+#: field:project.oerp.phase.create.wizard,product_uom:0
847+msgid "Unit of Measure"
848+msgstr ""
849+
850+#. module: project_openerp
851+#: model:ir.actions.act_window,name:project_openerp.action_phase_create_wizard
852+msgid "Create Phase from Template"
853+msgstr ""
854+
855+#. module: project_openerp
856+#: model:ir.actions.act_window,name:project_openerp.action_work_type_template
857+#: field:project.oerp.phase.create.wizard,work_type_template_id:0
858+#: view:project.oerp.work.type.template:0
859+msgid "Work Type Template"
860+msgstr ""
861+
862+#. module: project_openerp
863+#: view:project.oerp.feature.import.wizard:0
864+msgid "Feature Import Wizard"
865+msgstr ""
866+
867+#. module: project_openerp
868+#: field:project.oerp.task.hour,expected_hours:0
869+msgid "Initially Planned Hour(s)"
870+msgstr ""
871+
872+#. module: project_openerp
873+#: field:project.oerp.sprint.close.wizard,opening_sprint_id:0
874+msgid "Opening Sprint"
875+msgstr ""
876+
877+#. module: project_openerp
878+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_wor
879+msgid "Workflows"
880+msgstr ""
881+
882+#. module: project_openerp
883+#: model:ir.model,name:project_openerp.model_project_task
884+#: field:project.oerp.task.hour,task_id:0
885+msgid "Task"
886+msgstr ""
887+
888+#. module: project_openerp
889+#: view:project.oerp.work.type.template:0
890+#: field:project.oerp.work.type.template,work_type_mapping_ids:0
891+#: view:project.phase:0
892+#: field:project.phase,work_type_ids:0
893+msgid "Work Types"
894+msgstr ""
895+
896+#. module: project_openerp
897+#: field:project.oerp.feature.import.wizard,product_backlog_id:0
898+#: field:project.oerp.phase.create.wizard,product_backlog_id:0
899+#: field:project.phase,product_backlog_id:0
900+msgid "Product Backlog"
901+msgstr ""
902+
903+#. module: project_openerp
904+#: field:project.oerp.feature.hours,project_id:0
905+#: field:project.oerp.feature.import.wizard,project_id:0
906+#: field:project.oerp.phase.create.wizard,project_id:0
907+#: field:project.oerp.task.hour,project_id:0
908+msgid "Project"
909+msgstr ""
910+
911+#. module: project_openerp
912+#: model:ir.ui.menu,name:project_openerp.menu_feature_import_wizard
913+msgid "Import Features"
914+msgstr ""
915+
916+#. module: project_openerp
917+#: model:project.oerp.work.type.template,name:project_openerp.data_work_type_template_fun
918+msgid "Functional Analysis"
919+msgstr ""
920+
921+#. module: project_openerp
922+#: field:project.oerp.feature.hours,work_type_id:0
923+#: field:project.oerp.task.hour,work_type_id:0
924+#: field:project.task.work,work_type_id:0
925+msgid "Work Type"
926+msgstr ""
927+
928+#. module: project_openerp
929+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_fun
930+msgid "Functional Fields"
931+msgstr ""
932+
933+#. module: project_openerp
934+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_met
935+msgid "Methods"
936+msgstr ""
937+
938+#. module: project_openerp
939+#: model:project.oerp.work.type.template,name:project_openerp.data_work_type_template_tec
940+msgid "Technical Analysis"
941+msgstr ""
942+
943+#. module: project_openerp
944+#: model:ir.actions.act_window,name:project_openerp.action_work_type_template_group
945+#: view:project.oerp.work.type.template.group:0
946+msgid "Work Type Template Group"
947+msgstr ""
948+
949+#. module: project_openerp
950+#: field:project.oerp.sprint.close.wizard,closing_sprint_id:0
951+msgid "Closing Sprint"
952+msgstr ""
953+
954+#. module: project_openerp
955+#: view:project.oerp.phase.create.wizard:0
956+#: view:project.oerp.sprint.close.wizard:0
957+#: view:project.oerp.task.create.wizard:0
958+msgid "Are you sure you want to continue?"
959+msgstr ""
960+
961+#. module: project_openerp
962+#: view:project.scrum.feature:0
963+#: field:project.scrum.feature,hour_ids:0
964+#: view:project.task:0
965+#: field:project.task,feature_hour_ids:0
966+msgid "Feature Hours"
967+msgstr ""
968+
969+#. module: project_openerp
970+#: view:project.oerp.phase.create.wizard:0
971+#: view:project.oerp.task.create.wizard:0
972+msgid "Create"
973+msgstr ""
974+
975+#. module: project_openerp
976+#: field:project.oerp.feature.import.wizard,state:0
977+msgid "State"
978+msgstr ""
979+
980+#. module: project_openerp
981+#: constraint:project.phase:0
982+msgid "All sprints must belong to the selected product backlog."
983+msgstr ""
984+
985+#. module: project_openerp
986+#: code:addons/project_openerp/wizard/feature_import_wizard.py:39
987+#, python-format
988+msgid "An error occurred while reading the file. Please check if the format is correct."
989+msgstr ""
990+
991+#. module: project_openerp
992+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_dia
993+msgid "Diagrams"
994+msgstr ""
995+
996+#. module: project_openerp
997+#: model:ir.ui.menu,name:project_openerp.menu_work_type_template
998+#: view:project.oerp.work.type.template.group:0
999+msgid "Phase Templates"
1000+msgstr ""
1001+
1002+#. module: project_openerp
1003+#: model:ir.actions.act_window,name:project_openerp.action_task_create_wizard
1004+msgid "Create Tasks from Sequence"
1005+msgstr ""
1006+
1007+#. module: project_openerp
1008+#: model:ir.actions.act_window,name:project_openerp.action_sprint_close_wizard
1009+#: model:ir.ui.menu,name:project_openerp.menu_sprint_close_wizard
1010+msgid "Close Sprint"
1011+msgstr ""
1012+
1013+#. module: project_openerp
1014+#: view:project.oerp.work.type.template:0
1015+msgid "Work Type Templates"
1016+msgstr ""
1017+
1018+#. module: project_openerp
1019+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_int
1020+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_int
1021+msgid "Interface"
1022+msgstr ""
1023+
1024+#. module: project_openerp
1025+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_conf
1026+msgid "Configuration"
1027+msgstr ""
1028+
1029+#. module: project_openerp
1030+#: view:project.scrum.sprint:0
1031+msgid "Are you sure you want to queue all tasks?"
1032+msgstr ""
1033+
1034+#. module: project_openerp
1035+#: view:project.task:0
1036+#: field:project.task,task_hour_ids:0
1037+msgid "Task Hours"
1038+msgstr ""
1039+
1040+#. module: project_openerp
1041+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_intr
1042+msgid "Interaction"
1043+msgstr ""
1044+
1045+#. module: project_openerp
1046+#: field:project.oerp.work.type,column_number:0
1047+#: field:project.oerp.work.type.mapping,column_number:0
1048+msgid "Column Number"
1049+msgstr ""
1050+
1051+#. module: project_openerp
1052+#: field:project.oerp.feature.hours,expected_hours:0
1053+#: view:project.task:0
1054+msgid "Planned Hour(s)"
1055+msgstr ""
1056+
1057+#. module: project_openerp
1058+#: view:project.oerp.feature.import.wizard:0
1059+msgid "Are you sure you want to import this file?"
1060+msgstr ""
1061+
1062+#. module: project_openerp
1063+#: model:ir.ui.menu,name:project_openerp.menu_phase_create_wizard
1064+msgid "Create Phase"
1065+msgstr ""
1066+
1067+#. module: project_openerp
1068+#: view:project.oerp.sprint.close.wizard:0
1069+msgid "Close Sprint Wizard"
1070+msgstr ""
1071+
1072+#. module: project_openerp
1073+#: model:ir.actions.act_window,name:project_openerp.action_feature_import_wizard
1074+msgid "Feature Import"
1075+msgstr ""
1076+
1077+#. module: project_openerp
1078+#: model:ir.ui.menu,name:project_openerp.menu_task_create_wizard
1079+msgid "Create Tasks"
1080+msgstr ""
1081+
1082+#. module: project_openerp
1083+#: field:project.phase,is_scrum:0
1084+msgid "Is Scrum"
1085+msgstr ""
1086+
1087+#. module: project_openerp
1088+#: view:project.scrum.sprint:0
1089+#: field:project.scrum.sprint,desirable_task_ids:0
1090+msgid "Desirable Tasks"
1091+msgstr ""
1092+
1093+#. module: project_openerp
1094+#: view:project.oerp.feature.import.wizard:0
1095+#: view:project.oerp.phase.create.wizard:0
1096+#: view:project.oerp.sprint.close.wizard:0
1097+#: view:project.oerp.task.create.wizard:0
1098+msgid "or"
1099+msgstr ""
1100+
1101+#. module: project_openerp
1102+#: constraint:project.task.work:0
1103+msgid "The selected Work Type has not been planned in the selected Feature."
1104+msgstr ""
1105+
1106+#. module: project_openerp
1107+#: field:project.oerp.work.type.template,group_id:0
1108+msgid "Group"
1109+msgstr ""
1110+
1111+#. module: project_openerp
1112+#: view:project.oerp.feature.import.wizard:0
1113+msgid "Import"
1114+msgstr ""
1115+
1116+#. module: project_openerp
1117+#: model:ir.actions.act_window,help:project_openerp.action_work_type_template_group
1118+msgid "<p class=\"oe_view_nocontent_create\">Create new Work Type Template Group</p>\n"
1119+" "
1120+msgstr ""
1121+
1122+#. module: project_openerp
1123+#: model:ir.actions.act_window,help:project_openerp.action_work_type_template
1124+msgid "<p class=\"oe_view_nocontent_create\">Create new Work Type Template</p>\n"
1125+" "
1126+msgstr ""
1127+
1128+#. module: project_openerp
1129+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_tes
1130+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_tes
1131+msgid "Tests"
1132+msgstr ""
1133+
1134+#. module: project_openerp
1135+#: view:project.oerp.phase.create.wizard:0
1136+msgid "Phase Create Wizard"
1137+msgstr ""
1138+
1139+#. module: project_openerp
1140+#: view:project.oerp.task.create.wizard:0
1141+msgid "Task Create Wizard"
1142+msgstr ""
1143+
1144+#. module: project_openerp
1145+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_per
1146+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_per
1147+msgid "Permissions"
1148+msgstr ""
1149+
1150+#. module: project_openerp
1151+#: field:project.oerp.feature.hours,effective_hours:0
1152+#: field:project.oerp.task.hour,effective_hours:0
1153+#: view:project.task:0
1154+msgid "Spent Hour(s)"
1155+msgstr ""
1156+
1157+#. module: project_openerp
1158+#: view:project.oerp.work.type.template.group:0
1159+msgid "Work Type Template Groups"
1160+msgstr ""
1161+
1162+#. module: project_openerp
1163+#: code:addons/project_openerp/wizard/feature_import_wizard.py:94
1164+#, python-format
1165+msgid "An error occurred while importing the features"
1166+msgstr ""
1167+
1168+#. module: project_openerp
1169+#: code:addons/project_openerp/wizard/feature_import_wizard.py:39
1170+#: code:addons/project_openerp/wizard/feature_import_wizard.py:86
1171+#: code:addons/project_openerp/wizard/feature_import_wizard.py:94
1172+#: code:addons/project_openerp/wizard/sprint_close_wizard.py:64
1173+#: code:addons/project_openerp/wizard/task_create_wizard.py:47
1174+#: code:addons/project_openerp/wizard/task_create_wizard.py:122
1175+#, python-format
1176+msgid "Error"
1177+msgstr ""
1178+
1179+#. module: project_openerp
1180+#: view:project.scrum.sprint:0
1181+msgid "Tasks from Sequence"
1182+msgstr ""
1183+
1184+#. module: project_openerp
1185+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_dev_gen
1186+msgid "General"
1187+msgstr ""
1188+
1189+#. module: project_openerp
1190+#: selection:project.oerp.feature.import.wizard,state:0
1191+msgid "Done"
1192+msgstr ""
1193+
1194+#. module: project_openerp
1195+#: view:project.oerp.feature.import.wizard:0
1196+#: view:project.oerp.phase.create.wizard:0
1197+#: view:project.oerp.sprint.close.wizard:0
1198+#: view:project.oerp.task.create.wizard:0
1199+msgid "Cancel"
1200+msgstr ""
1201+
1202+#. module: project_openerp
1203+#: view:project.oerp.sprint.close.wizard:0
1204+msgid "Close"
1205+msgstr ""
1206+
1207+#. module: project_openerp
1208+#: field:project.oerp.work.type,name:0
1209+#: field:project.oerp.work.type.mapping,name:0
1210+msgid "Type Name"
1211+msgstr ""
1212+
1213+#. module: project_openerp
1214+#: view:project.scrum.sprint:0
1215+msgid "Queue Tasks"
1216+msgstr ""
1217+
1218+#. module: project_openerp
1219+#: field:project.oerp.feature.hours,feature_id:0
1220+msgid "Feature"
1221+msgstr ""
1222+
1223+#. module: project_openerp
1224+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_load
1225+msgid "Data Loading"
1226+msgstr ""
1227+
1228+#. module: project_openerp
1229+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_wiz
1230+msgid "Wizards"
1231+msgstr ""
1232+
1233+#. module: project_openerp
1234+#: selection:project.oerp.feature.import.wizard,state:0
1235+msgid "New"
1236+msgstr ""
1237+
1238+#. module: project_openerp
1239+#: field:project.phase,user_id:0
1240+msgid "Phase Manager"
1241+msgstr ""
1242+
1243+#. module: project_openerp
1244+#: model:project.oerp.work.type.template,name:project_openerp.data_work_type_template_dev
1245+msgid "Development"
1246+msgstr ""
1247+
1248+#. module: project_openerp
1249+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_fun_inf
1250+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_inf
1251+msgid "Informs"
1252+msgstr ""
1253+
1254+#. module: project_openerp
1255+#: model:project.oerp.work.type.mapping,name:project_openerp.data_work_type_mapping_tec_obj
1256+msgid "Objects"
1257+msgstr ""
1258+
1259+#. module: project_openerp
1260+#: field:project.oerp.feature.hours,phase_id:0
1261+#: field:project.oerp.task.hour,phase_id:0
1262+#: field:project.oerp.work.type,phase_id:0
1263+#: field:project.scrum.sprint,phase_id:0
1264+#: field:project.task.work,phase_id:0
1265+msgid "Phase"
1266+msgstr ""
1267+
1268+#. module: project_openerp
1269+#: field:project.oerp.work.type.template.group,template_ids:0
1270+msgid "Templates"
1271+msgstr ""
1272+
1273+#. module: project_openerp
1274+#: code:addons/project_openerp/wizard/task_create_wizard.py:47
1275+#, python-format
1276+msgid "All task were created before."
1277+msgstr ""
1278+
1279+#. module: project_openerp
1280+#: model:ir.model,name:project_openerp.model_project_phase
1281+msgid "Project Phase"
1282+msgstr ""
1283+
1284+#. module: project_openerp
1285+#: model:project.oerp.work.type.template.group,name:project_openerp.data_work_type_template_group
1286+msgid "Default Templates"
1287+msgstr ""
1288+
1289+#. module: project_openerp
1290+#: code:addons/project_openerp/wizard/feature_import_wizard.py:86
1291+#, python-format
1292+msgid "An error occurred while reading the planned hours from file in column %s for work type %s"
1293+msgstr ""
1294+
1295+#. module: project_openerp
1296+#: code:addons/project_openerp/wizard/task_create_wizard.py:122
1297+#, python-format
1298+msgid "An error occurred while creating the tasks. Please contact your system administrator."
1299+msgstr ""
1300+
1301+#. module: project_openerp
1302+#: field:project.oerp.work.type,sequence:0
1303+#: field:project.oerp.work.type.mapping,sequence:0
1304+msgid "Sequence"
1305+msgstr ""
1306+
1307+#. module: project_openerp
1308+#: code:addons/project_openerp/wizard/sprint_close_wizard.py:64
1309+#, python-format
1310+msgid "An error occurred while closing the sprint."
1311+msgstr ""
1312+
1313+#. module: project_openerp
1314+#: field:project.oerp.work.type.template,file:0
1315+#: field:project.oerp.work.type.template.group,file:0
1316+msgid "File"
1317+msgstr ""
1318+
1319+#. module: project_openerp
1320+#: field:project.oerp.feature.hours,remaining_hours:0
1321+#: field:project.oerp.task.hour,remaining_hours:0
1322+#: view:project.task:0
1323+msgid "Remaining Hour(s)"
1324+msgstr ""
1325+
1326+#. module: project_openerp
1327+#: view:project.oerp.phase.create.wizard:0
1328+#: field:project.oerp.phase.create.wizard,duration:0
1329+msgid "Duration"
1330+msgstr ""
1331+
1332+#. module: project_openerp
1333+#: field:project.oerp.task.create.wizard,sprint_id:0
1334+msgid "Sprint"
1335+msgstr ""
1336+
1337+#. module: project_openerp
1338+#: model:ir.ui.menu,name:project_openerp.menu_tools
1339+msgid "Tools"
1340+msgstr ""
1341+
1342+#. module: project_openerp
1343+#: model:ir.ui.menu,name:project_openerp.menu_work_type_template_group
1344+msgid "Phase Template Groups"
1345+msgstr ""
1346
1347=== added file 'project_openerp/project_openerp.py'
1348--- project_openerp/project_openerp.py 1970-01-01 00:00:00 +0000
1349+++ project_openerp/project_openerp.py 2014-03-27 17:09:06 +0000
1350@@ -0,0 +1,377 @@
1351+# -*- coding: utf-8 -*-
1352+##############################################################################
1353+#
1354+# OpenERP, Open Source Management Solution
1355+# Addons modules by CLEARCORP S.A.
1356+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
1357+#
1358+# This program is free software: you can redistribute it and/or modify
1359+# it under the terms of the GNU Affero General Public License as
1360+# published by the Free Software Foundation, either version 3 of the
1361+# License, or (at your option) any later version.
1362+#
1363+# This program is distributed in the hope that it will be useful,
1364+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1365+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1366+# GNU Affero General Public License for more details.
1367+#
1368+# You should have received a copy of the GNU Affero General Public License
1369+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1370+#
1371+##############################################################################
1372+
1373+from openerp.osv import fields, osv
1374+
1375+class WorkType(osv.Model):
1376+
1377+ _name = 'project.oerp.work.type'
1378+
1379+ _order = 'sequence'
1380+
1381+ _columns = {
1382+ 'name': fields.char('Type Name', size=128, required=True),
1383+ 'sequence': fields.integer('Sequence', required=True),
1384+ 'column_number': fields.integer('Column Number', required=True),
1385+ 'phase_id': fields.many2one('project.phase', ondelete='cascade',
1386+ string='Phase', required=True),
1387+ }
1388+
1389+ _defaults = {
1390+ 'phase_id': lambda slf, cr, uid, ctx: ctx.get('phase_id', False),
1391+ }
1392+
1393+
1394+class WorkTypeMapping(osv.Model):
1395+
1396+ _name = 'project.oerp.work.type.mapping'
1397+
1398+ _columns = {
1399+ 'template_id': fields.many2one('project.oerp.work.type.template', string='Template',
1400+ ondelete='cascade'),
1401+ 'name': fields.char('Type Name', size=128, translate=True, required=True),
1402+ 'sequence': fields.integer('Sequence', required=True),
1403+ 'column_number': fields.integer('Column Number', required=True),
1404+ }
1405+
1406+class WorkTypeTemplate(osv.Model):
1407+
1408+ _name = 'project.oerp.work.type.template'
1409+
1410+ _columns = {
1411+ 'name': fields.char('Template', size=128, translate=True, required=True),
1412+ 'group_id': fields.many2one('project.oerp.work.type.template.group', string='Group'),
1413+ 'file': fields.related('group_id', 'file', type='binary', string='File'),
1414+ 'filename': fields.related('group_id','filename', type='char', string='Filename'),
1415+ 'work_type_mapping_ids': fields.one2many('project.oerp.work.type.mapping', 'template_id',
1416+ string='Work Types')
1417+ }
1418+
1419+class WorkTypeTemplateGroup(osv.Model):
1420+
1421+ _name = 'project.oerp.work.type.template.group'
1422+
1423+ _columns = {
1424+ 'name': fields.char('Group Name', size=128, translate=True, required=True),
1425+ 'file': fields.binary('File', filters='*.csv'),
1426+ 'filename': fields.char('Filename', size=128),
1427+ 'template_ids': fields.one2many('project.oerp.work.type.template', 'group_id',
1428+ string='Templates'),
1429+ }
1430+
1431+ _defaults = {
1432+ 'filename': 'template.csv'
1433+ }
1434+
1435+class Sprint(osv.Model):
1436+
1437+ def queue_tasks(self, cr, uid, ids, context=None):
1438+ sprint = self.browse(cr, uid, ids[0], context=context)
1439+ for task in sprint.desirable_task_ids:
1440+ if not task.sprint_id:
1441+ task.write({'sprint_id': sprint.id}, context=context)
1442+ return True
1443+
1444+ _inherit = 'project.scrum.sprint'
1445+
1446+ _columns = {
1447+ 'desirable_task_ids': fields.many2many('project.task', string='Desirable Tasks'),
1448+ 'phase_id': fields.many2one('project.phase', string='Phase', required=True,
1449+ domain="[('project_id','=', project_id)]"),
1450+ }
1451+
1452+class Phase(osv.Model):
1453+
1454+ _inherit = 'project.phase'
1455+
1456+ def onchange_project(self, cr, uid, ids, project_id, context=None):
1457+ res = super(Phase, self).onchange_project(cr,uid,ids,project_id,context=context)
1458+ if project_id:
1459+ project = self.pool.get('project.project').browse(
1460+ cr, uid, project_id, context=context)
1461+ is_scrum = project.is_scrum
1462+ if 'value' in res:
1463+ res['value']['is_scrum'] = is_scrum
1464+ res['value']['product_backlog_id'] = False
1465+ else:
1466+ res['value'] = {
1467+ 'is_scrum': is_scrum,
1468+ 'product_backlog_id': False,
1469+ }
1470+
1471+ else:
1472+ if 'value' in res:
1473+ res['value']['is_scrum'] = False
1474+ res['value']['product_backlog_id'] = False
1475+ else:
1476+ res['value'] = {
1477+ 'is_scrum': False,
1478+ 'product_backlog_id': False,
1479+ }
1480+ return res
1481+
1482+ def _check_sprints(self, cr, uid, ids, context=None):
1483+ phases = self.browse(cr, uid, ids, context=context)
1484+ for phase in phases:
1485+ for sprint in phase.sprint_ids:
1486+ if sprint.product_backlog_id != phase.product_backlog_id:
1487+ return False
1488+ return True
1489+
1490+ _columns = {
1491+ 'is_scrum': fields.related('project_id','is_scrum', type='boolean', string='Is Scrum', readonly=True),
1492+ 'product_backlog_id': fields.many2one('project.scrum.product.backlog', string='Product Backlog',
1493+ domain="[('project_id','=',project_id)]"),
1494+ 'work_type_ids': fields.one2many('project.oerp.work.type', 'phase_id', string='Work Types'),
1495+ 'sprint_ids': fields.one2many('project.scrum.sprint', 'phase_id',
1496+ string='Sprints'),
1497+ 'user_id': fields.many2one('res.users', string='Phase Manager'),
1498+ }
1499+
1500+ _constraints = [(_check_sprints, 'All sprints must belong to the selected '
1501+ 'product backlog.',['Sprints'])]
1502+
1503+class FeatureHours(osv.Model):
1504+
1505+ _name = 'project.oerp.feature.hours'
1506+
1507+ def _effective_hours(self, cr ,uid, ids, field_name, arg, context=None):
1508+ res = {}
1509+ for hour in self.browse(cr, uid, ids, context=context):
1510+ task_obj = self.pool.get('project.task')
1511+ task_ids = task_obj.search(cr, uid, [('feature_id','=', hour.feature_id.id)], context=context)
1512+ tasks = task_obj.browse(cr, uid, task_ids, context=context)
1513+ sum = 0.0
1514+ for task in tasks:
1515+ for work in task.work_ids:
1516+ if work.work_type_id == hour.work_type_id:
1517+ sum += work.hours
1518+ res[hour.id] = sum
1519+ return res
1520+
1521+ def _remaining_hours(self, cr ,uid, ids, field_name, arg, context=None):
1522+ res = {}
1523+ for hour in self.browse(cr, uid, ids, context=context):
1524+ res[hour.id] = hour.expected_hours - hour.effective_hours
1525+ return res
1526+
1527+ _columns = {
1528+ 'feature_id': fields.many2one('project.scrum.feature', string='Feature', required=True,
1529+ ondelete='cascade'),
1530+ 'project_id': fields.related('feature_id', 'product_backlog_id', 'project_id',
1531+ type='many2one', relation='project.project', string='Project'),
1532+ 'phase_id': fields.many2one('project.phase', string="Phase",
1533+ domain="[('project_id','=',project_id)]"),
1534+ 'work_type_id': fields.many2one('project.oerp.work.type', string='Work Type',
1535+ required=True, domain="[('phase_id','=',phase_id)]"),
1536+ 'expected_hours': fields.float('Planned Hour(s)', required=True),
1537+ 'effective_hours': fields.function(_effective_hours, type='float', string='Spent Hour(s)'),
1538+ 'remaining_hours': fields.function(_remaining_hours, type='float', string='Remaining Hour(s)'),
1539+ }
1540+
1541+ _defaults = {
1542+ 'feature_id': lambda slf, cr, uid, ctx: ctx.get('feature_id', False),
1543+ 'project_id': lambda slf, cr, uid, ctx: ctx.get('project_id', False),
1544+ }
1545+
1546+class Feature(osv.Model):
1547+
1548+ _inherit = 'project.scrum.feature'
1549+
1550+ def onchange_product_backlog(self, cr, uid, ids, product_backlog_id, context=None):
1551+ res = {}
1552+ if product_backlog_id:
1553+ product_backlog = self.pool.get('project.scrum.product.backlog').browse(
1554+ cr, uid, product_backlog_id, context=context)
1555+ res = {'value': {'project_id': product_backlog.project_id.id}}
1556+ return res
1557+
1558+ _columns = {
1559+ 'hour_ids': fields.one2many('project.oerp.feature.hours', 'feature_id', string='Feature Hours'),
1560+ }
1561+
1562+ def write(self, cr, uid, ids, values, context=None):
1563+ if 'hour_ids' in values:
1564+ hours = values['hour_ids']
1565+ sum = 0.0
1566+ for hour in hours:
1567+ id = hour[1]
1568+ vals = hour[2]
1569+ if vals:
1570+ if 'expected_hours' in vals:
1571+ sum += vals['expected_hours']
1572+ else:
1573+ hour_obj = self.pool.get('project.oerp.feature.hours')
1574+ sum += hour_obj.browse(cr, uid, id, context=context).expected_hours
1575+ values['expected_hours'] = sum
1576+ return super(Feature,self).write(cr, uid, ids, values, context=context)
1577+
1578+ def create(self, cr, uid, values, context=None):
1579+ if 'hour_ids' in values:
1580+ hours = values['hour_ids']
1581+ sum = 0.0
1582+ for hour in hours:
1583+ id = hour[1]
1584+ vals = hour[2]
1585+ if vals:
1586+ if 'expected_hours' in vals:
1587+ sum += vals['expected_hours']
1588+ else:
1589+ hour_obj = self.pool.get('project.oerp.feature.hours')
1590+ sum += hour_obj.browse(cr, uid, id, context=context).expected_hours
1591+ values['expected_hours'] = sum
1592+ return super(Feature,self).create(cr, uid, values, context=context)
1593+
1594+class TaskHours(osv.Model):
1595+
1596+ _name = 'project.oerp.task.hour'
1597+
1598+ def _effective_hours(self, cr ,uid, ids, field_name, arg, context=None):
1599+ res = {}
1600+ for hour in self.browse(cr, uid, ids, context=context):
1601+ work_obj = self.pool.get('project.task.work')
1602+ work_ids = work_obj.search(cr, uid, [('task_id','=', hour.task_id.id),
1603+ ('work_type_id','=',hour.work_type_id.id)], context=context)
1604+ works = work_obj.browse(cr, uid, work_ids, context=context)
1605+ sum = 0.0
1606+ for work in works:
1607+ sum += work.hours
1608+ res[hour.id] = sum
1609+ return res
1610+
1611+ def _remaining_hours(self, cr ,uid, ids, field_name, arg, context=None):
1612+ res = {}
1613+ for hour in self.browse(cr, uid, ids, context=context):
1614+ res[hour.id] = hour.expected_hours - hour.effective_hours
1615+ return res
1616+
1617+ _columns = {
1618+ 'task_id': fields.many2one('project.task', string='Task', required=True, ondelete='cascade'),
1619+ 'project_id': fields.related('task_id', 'project_id', type='many2one',
1620+ relation='project.project', string='Project'),
1621+ 'phase_id': fields.many2one('project.phase', string="Phase",
1622+ domain="[('project_id','=',project_id)]"),
1623+ 'work_type_id': fields.many2one('project.oerp.work.type', string='Work Type', required =True,
1624+ domain="[('phase_id','=',phase_id)]"),
1625+ 'expected_hours': fields.float('Initially Planned Hour(s)', required=True),
1626+ 'effective_hours': fields.function(_effective_hours, type='float', string='Spent Hour(s)'),
1627+ 'remaining_hours': fields.function(_remaining_hours, type='float', string='Remaining Hour(s)'),
1628+ }
1629+
1630+ _defaults = {
1631+ 'project_id': lambda slf, cr, uid, ctx: ctx.get('project_id', False),
1632+ 'task_id': lambda slf, cr, uid, ctx: ctx.get('task_id', False),
1633+ }
1634+
1635+class Task(osv.Model):
1636+
1637+ _inherit = 'project.task'
1638+
1639+ def onchange_sprint(self, cr, uid, ids, sprint_id, context=None):
1640+ res = super(Task,self).onchange_sprint(cr, uid, ids, sprint_id, context=context)
1641+ if sprint_id:
1642+ sprint = self.pool.get('project.scrum.sprint').browse(
1643+ cr, uid, sprint_id, context=context)
1644+ if 'value' in res:
1645+ res['value']['phase_id'] = sprint.phase_id.id
1646+ else:
1647+ res['value'] = {'phase_id': sprint.phase_id.id}
1648+ else:
1649+ if 'value' in res:
1650+ res['value']['phase_id'] = False
1651+ else:
1652+ res['value'] = {'phase_id': False}
1653+ return res
1654+
1655+ _columns = {
1656+ 'feature_hour_ids': fields.related('feature_id', 'hour_ids', type='one2many',
1657+ relation='project.oerp.feature.hours', string='Feature Hours', readonly=True),
1658+ 'task_hour_ids': fields.one2many('project.oerp.task.hour', 'task_id', string='Task Hours'),
1659+ }
1660+
1661+ def create(self, cr, uid, values, context=None):
1662+ if 'project_id' in values:
1663+ project_obj = self.pool.get('project.project')
1664+ project = project_obj.browse(cr, uid, values['project_id'], context=context)
1665+ if project.is_scrum:
1666+ task_hour_ids = values['task_hour_ids']
1667+ sum = 0.0
1668+ for hour in task_hour_ids:
1669+ sum += hour[2]['expected_hours']
1670+ values['planned_hours'] = sum
1671+ return super(Task, self).create(cr, uid, values, context=context)
1672+
1673+ def write(self, cr, uid, ids, values, context=None):
1674+ if not isinstance(ids,list):
1675+ ids = [ids]
1676+ for task in self.browse(cr, uid, ids, context=context):
1677+ if task.project_id.is_scrum:
1678+ if 'task_hour_ids' in values:
1679+ sum = 0.0
1680+ for hour in values['task_hour_ids']:
1681+ if hour[0] == 0:
1682+ sum += hour[2]['expected_hours']
1683+ elif hour[0] == 1:
1684+ if 'expected_hours' in hour[2]:
1685+ sum += hour[2]['expected_hours']
1686+ else:
1687+ task_hour_obj = self.pool.get('project.oerp.task.hour')
1688+ task_hour = task_hour_obj.browse(cr, uid , hour[1], context=context)
1689+ sum += task_hour.expected_hours
1690+ elif hour[0] == 4:
1691+ task_hour_obj = self.pool.get('project.oerp.task.hour')
1692+ task_hour = task_hour_obj.browse(cr, uid , hour[1], context=context)
1693+ sum += task_hour.expected_hours
1694+ values['planned_hours'] = sum
1695+ super(Task, self).write(cr, uid, task.id, values, context)
1696+ return True
1697+
1698+class TaskWork(osv.Model):
1699+
1700+ _inherit = 'project.task.work'
1701+
1702+ def _check_work_type(self, cr , uid, ids, context=None):
1703+ works = self.browse(cr, uid, ids, context=context)
1704+ for work in works:
1705+ if work.work_type_id:
1706+ if work.task_id.feature_id:
1707+ feature = work.task_id.feature_id
1708+ flag = True
1709+ for hour in feature.hour_ids:
1710+ if hour.work_type_id == work.work_type_id:
1711+ flag = False
1712+ if flag:
1713+ return False
1714+ return True
1715+
1716+ _columns = {
1717+ 'phase_id': fields.many2one('project.phase', string='Phase'),
1718+ 'work_type_id': fields.many2one('project.oerp.work.type', string='Work Type',
1719+ domain="[('phase_id','=',phase_id)]"),
1720+ }
1721+
1722+ _defaults = {
1723+ 'phase_id': lambda slf, cr, uid, ctx: ctx.get('phase_id',False),
1724+ }
1725+
1726+ _constraints = [(_check_work_type,'The selected Work Type has not been '
1727+ 'planned in the selected Feature.',['Work Type'])]
1728\ No newline at end of file
1729
1730=== added directory 'project_openerp/security'
1731=== added file 'project_openerp/security/ir.model.access.csv'
1732--- project_openerp/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
1733+++ project_openerp/security/ir.model.access.csv 2014-03-27 17:09:06 +0000
1734@@ -0,0 +1,10 @@
1735+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
1736+access_project_oerp_work_type_manager,access.project.oerp.work.type.manager,model_project_oerp_work_type,project.group_project_manager,1,1,1,1
1737+access_project_oerp_work_type_user,access.project.oerp.work.type.user,model_project_oerp_work_type,project.group_project_user,1,0,0,0
1738+access_project_oerp_work_type_mapping_manager,access.project.oerp.work.type.mapping.manager,model_project_oerp_work_type_mapping,project.group_project_manager,1,1,1,1
1739+access_project_oerp_work_type_template_manager,access.project.oerp.work.type.template.manager,model_project_oerp_work_type_template,project.group_project_manager,1,1,1,1
1740+access_project_oerp_work_type_template_group_manager,access.project.oerp.work.type.template.group.manager,model_project_oerp_work_type_template_group,project.group_project_manager,1,1,1,1
1741+access_project_oerp_task_hour_manager,access.project.oerp.task.hour.manager,model_project_oerp_task_hour,project.group_project_manager,1,1,1,1
1742+access_project_oerp_task_hour_user,access.project.oerp.task.hour.user,model_project_oerp_task_hour,project.group_project_user,1,0,0,0
1743+access_project_oerp_feature_hours_manager,access.project.oerp.feature.hours.manager,model_project_oerp_feature_hours,project.group_project_manager,1,1,1,1
1744+access_project_oerp_feature_hours_user,access.project.oerp.feature.hours.user,model_project_oerp_feature_hours,project.group_project_user,1,0,0,0
1745
1746=== added directory 'project_openerp/view'
1747=== added file 'project_openerp/view/project_openerp_menu.xml'
1748--- project_openerp/view/project_openerp_menu.xml 1970-01-01 00:00:00 +0000
1749+++ project_openerp/view/project_openerp_menu.xml 2014-03-27 17:09:06 +0000
1750@@ -0,0 +1,46 @@
1751+<?xml version="1.0" encoding="UTF-8"?>
1752+
1753+<openerp>
1754+ <data>
1755+ <menuitem id="menu_tools"
1756+ parent="project_scrum.menu_scrum"
1757+ name="Tools"
1758+ sequence="50"/>
1759+
1760+ <menuitem id="menu_feature_import_wizard"
1761+ parent="menu_tools"
1762+ name="Import Features"
1763+ action="action_feature_import_wizard"
1764+ sequence="10"/>
1765+
1766+ <menuitem id="menu_task_create_wizard"
1767+ parent="menu_tools"
1768+ name="Create Tasks"
1769+ action="action_task_create_wizard"
1770+ sequence="20"/>
1771+
1772+ <menuitem id="menu_phase_create_wizard"
1773+ parent="menu_tools"
1774+ name="Create Phase"
1775+ action="action_phase_create_wizard"
1776+ sequence="30"/>
1777+
1778+ <menuitem id="menu_sprint_close_wizard"
1779+ parent="menu_tools"
1780+ name="Close Sprint"
1781+ action="action_sprint_close_wizard"
1782+ sequence="40"/>
1783+
1784+ <menuitem id="menu_work_type_template"
1785+ parent="base.menu_definitions"
1786+ name="Phase Templates"
1787+ action="action_work_type_template"
1788+ sequence="20"/>
1789+
1790+ <menuitem id="menu_work_type_template_group"
1791+ parent="base.menu_definitions"
1792+ name="Phase Template Groups"
1793+ action="action_work_type_template_group"
1794+ sequence="30"/>
1795+ </data>
1796+</openerp>
1797\ No newline at end of file
1798
1799=== added file 'project_openerp/view/project_openerp_view.xml'
1800--- project_openerp/view/project_openerp_view.xml 1970-01-01 00:00:00 +0000
1801+++ project_openerp/view/project_openerp_view.xml 2014-03-27 17:09:06 +0000
1802@@ -0,0 +1,300 @@
1803+<?xml version="1.0" encoding="UTF-8"?>
1804+<openerp>
1805+ <data>
1806+ <!-- actions -->
1807+ <!-- project.oerp.feature.import.wizard -->
1808+ <record model="ir.actions.act_window" id="action_feature_import_wizard">
1809+ <field name="name">Feature Import</field>
1810+ <field name="res_model">project.oerp.feature.import.wizard</field>
1811+ <field name="view_mode">form</field>
1812+ <field name="target">new</field>
1813+ </record>
1814+
1815+ <!-- project.oerp.task.create.wizard -->
1816+ <record model="ir.actions.act_window" id="action_task_create_wizard">
1817+ <field name="name">Create Tasks from Sequence</field>
1818+ <field name="res_model">project.oerp.task.create.wizard</field>
1819+ <field name="view_mode">form</field>
1820+ <field name="target">new</field>
1821+ </record>
1822+
1823+ <!-- project.oerp.phase.create.wizard -->
1824+ <record model="ir.actions.act_window" id="action_phase_create_wizard">
1825+ <field name="name">Create Phase from Template</field>
1826+ <field name="res_model">project.oerp.phase.create.wizard</field>
1827+ <field name="view_mode">form</field>
1828+ <field name="target">new</field>
1829+ </record>
1830+
1831+ <!-- project.oerp.sprint.close.wizard -->
1832+ <record model="ir.actions.act_window" id="action_sprint_close_wizard">
1833+ <field name="name">Close Sprint</field>
1834+ <field name="res_model">project.oerp.sprint.close.wizard</field>
1835+ <field name="view_mode">form</field>
1836+ <field name="target">new</field>
1837+ </record>
1838+
1839+ <!-- project.oerp.work.type.template -->
1840+ <record model="ir.actions.act_window" id="action_work_type_template">
1841+ <field name="name">Work Type Template</field>
1842+ <field name="res_model">project.oerp.work.type.template</field>
1843+ <field name="view_mode">tree,form</field>
1844+ <field name="help" type="html">
1845+ <p class="oe_view_nocontent_create">Create new Work Type Template</p>
1846+ </field>
1847+ </record>
1848+
1849+ <!-- project.oerp.work.type.template -->
1850+ <record model="ir.actions.act_window" id="action_work_type_template_group">
1851+ <field name="name">Work Type Template Group</field>
1852+ <field name="res_model">project.oerp.work.type.template.group</field>
1853+ <field name="view_mode">tree,form</field>
1854+ <field name="help" type="html">
1855+ <p class="oe_view_nocontent_create">Create new Work Type Template Group</p>
1856+ </field>
1857+ </record>
1858+
1859+ <!-- views -->
1860+ <!-- project.phase -->
1861+ <!-- form -->
1862+ <record id ="view_phase_form" model="ir.ui.view">
1863+ <field name="name">view.phase.form</field>
1864+ <field name="model">project.phase</field>
1865+ <field name="inherit_id" ref="project_long_term.view_project_phase_form"/>
1866+ <field name="arch" type="xml">
1867+ <xpath expr="//form/sheet/group/group/field[@name='project_id']" position="after">
1868+ <field name="is_scrum" invisible="True"/>
1869+ <field name="user_id"/>
1870+ <field name="product_backlog_id"
1871+ attrs="{'invisible': [('is_scrum','=',False)], 'required':['!',('is_scrum','=',False)]}"/>
1872+ </xpath>
1873+ <xpath expr="//form/sheet/notebook/page[@string='Constraints']" position="after">
1874+ <page string="Sprints" name="sprints">
1875+ <field name="sprint_ids"
1876+ context="{}"/>
1877+ </page>
1878+ <page string="Work Types" name="work_types">
1879+ <field name="work_type_ids" context="{'phase_id': active_id}">
1880+ <tree editable="bottom">
1881+ <field name="name"/>
1882+ <field name="sequence"/>
1883+ <field name="column_number"/>
1884+ </tree>
1885+ </field>
1886+ </page>
1887+ </xpath>
1888+ </field>
1889+ </record>
1890+
1891+ <!-- project.scrum.feature -->
1892+ <!-- form -->
1893+ <record id ="view_feature_form" model="ir.ui.view">
1894+ <field name="name">view.feature.form</field>
1895+ <field name="model">project.scrum.feature</field>
1896+ <field name="inherit_id" ref="project_scrum.view_feature_form"/>
1897+ <field name="arch" type="xml">
1898+ <xpath expr="//form/sheet/group/group/field[@name='expected_hours']" position="attributes">
1899+ <attribute name="readonly">True</attribute>
1900+ <attribute name="required">False</attribute>
1901+ </xpath>
1902+ <xpath expr="//form/sheet/group/group/field[@name='product_backlog_id']" position="attributes">
1903+ <attribute name="on_change">onchange_product_backlog(product_backlog_id)</attribute>
1904+ </xpath>
1905+ <xpath expr="//form/sheet/notebook/page[@name='sprints']" position="after">
1906+ <page string="Feature Hours" name="feature_hours">
1907+ <field name="id" invisible="True"/>
1908+ <field name="project_id" invisible="True"/>
1909+ <field name="hour_ids" context="{'feature_id': active_id, 'project_id': project_id}">
1910+ <tree editable="bottom">
1911+ <field name="phase_id"/>
1912+ <field name="work_type_id"/>
1913+ <field name="expected_hours"/>
1914+ <field name="effective_hours"/>
1915+ <field name="remaining_hours"/>
1916+ </tree>
1917+ </field>
1918+ </page>
1919+ </xpath>
1920+ </field>
1921+ </record>
1922+
1923+ <!-- project.task -->
1924+ <!-- form -->
1925+ <record id ="view_task_form" model="ir.ui.view">
1926+ <field name="name">view.task.form</field>
1927+ <field name="model">project.task</field>
1928+ <field name="inherit_id" ref="project.view_task_form2"/>
1929+ <field name="priority" eval="100"/>
1930+ <field name="arch" type="xml">
1931+ <xpath expr="//form/sheet/group/group/field[@name='phase_id']" position="attributes">
1932+ <attribute name="attrs">{'readonly': [('is_scrum','=',True)]}</attribute>
1933+ </xpath>
1934+ <xpath expr="//form/sheet/notebook/page/field[@name='work_ids']" position="attributes">
1935+ <attribute name="context">{'phase_id': phase_id}</attribute>
1936+ </xpath>
1937+ <xpath expr="//form/sheet/notebook/page/field[@name='work_ids']/tree/field[@name='date']" position="after">
1938+ <field name="work_type_id"/>
1939+ </xpath>
1940+ <xpath expr="//form/sheet/notebook/page[@name='sequence']" position="before">
1941+ <page string="Task Hours" name="task_hours"
1942+ attrs="{'invisible': [('is_scrum','=',False)]}">
1943+ <field name="task_hour_ids"
1944+ context="{'project_id': project_id, 'task_id': active_id}">
1945+ <tree editable="bottom">
1946+ <field name="phase_id"/>
1947+ <field name="work_type_id"/>
1948+ <field name="expected_hours" sum="Planned Hour(s)"/>
1949+ <field name="effective_hours" sum="Spent Hour(s)"/>
1950+ <field name="remaining_hours" sum="Remaining Hour(s)"/>
1951+ </tree>
1952+ </field>
1953+ </page>
1954+ <page string="Feature Hours" name="feature_hours"
1955+ attrs="{'invisible': [('feature_id','=',False)]}">
1956+ <field name="feature_hour_ids">
1957+ <tree>
1958+ <field name="phase_id"/>
1959+ <field name="work_type_id"/>
1960+ <field name="expected_hours" sum="Planned Hour(s)"/>
1961+ <field name="effective_hours" sum="Spent Hour(s)"/>
1962+ <field name="remaining_hours" sum="Remaining Hour(s)"/>
1963+ </tree>
1964+ </field>
1965+ </page>
1966+ </xpath>
1967+ </field>
1968+ </record>
1969+
1970+ <!-- project.scrum.sprint -->
1971+ <!-- form -->
1972+ <record id ="view_sprint_form" model="ir.ui.view">
1973+ <field name="name">view.sprint.form</field>
1974+ <field name="model">project.scrum.sprint</field>
1975+ <field name="inherit_id" ref="project_scrum.view_sprint_form"/>
1976+ <field name="arch" type="xml">
1977+ <xpath expr="//form/sheet/div[@name='buttons']/button[@name='tasks_from_features']" position="before">
1978+ <button name="%(action_task_create_wizard)d" string="Tasks from Sequence" type="action"
1979+ attrs="{'invisible':['|',('state','=','cancelled'),'|',('state','=','draft'),('state','=','done')]}"
1980+ context="{'sprint_id': active_id}"/>
1981+ <button name="queue_tasks" string="Queue Tasks" type="object"
1982+ confirm="Are you sure you want to queue all tasks?"/>
1983+ </xpath>
1984+ <xpath expr="//form/sheet/group/group/field[@name='release_backlog_id']" position="after">
1985+ <field name="phase_id"/>
1986+ </xpath>
1987+ <xpath expr="//form/sheet/notebook/page[@name='tasks']" position="after">
1988+ <page string="Desirable Tasks" name="desirable_tasks">
1989+ <field name="desirable_task_ids"/>
1990+ </page>
1991+ </xpath>
1992+ </field>
1993+ </record>
1994+
1995+ <!-- project.oerp.work.type.template -->
1996+ <!-- form -->
1997+ <record id ="view_work_type_template_form" model="ir.ui.view">
1998+ <field name="name">view.work.type.template.form</field>
1999+ <field name="model">project.oerp.work.type.template</field>
2000+ <field name="type">form</field>
2001+ <field name="priority" eval="16"/>
2002+ <field name="arch" type="xml">
2003+ <form string="Work Type Template" version="7.0">
2004+ <sheet>
2005+ <div class="oe_title">
2006+ <label for="name" class="oe_edit_only"/>
2007+ <h1>
2008+ <field name="name"/>
2009+ </h1>
2010+ </div>
2011+ <group>
2012+ <group>
2013+ <field name="group_id"/>
2014+ </group>
2015+ <group>
2016+ <field name="filename" invisible="True"/>
2017+ <field name="file" filename="filename"/>
2018+ </group>
2019+ </group>
2020+ <notebook>
2021+ <page string="Work Types" name="work_types">
2022+ <field name="work_type_mapping_ids">
2023+ <tree editable="top">
2024+ <field name="name"/>
2025+ <field name="sequence"/>
2026+ <field name="column_number"/>
2027+ </tree>
2028+ </field>
2029+ </page>
2030+ </notebook>
2031+ </sheet>
2032+ </form>
2033+ </field>
2034+ </record>
2035+
2036+ <!-- tree -->
2037+ <record id ="view_work_type_template_tree" model="ir.ui.view">
2038+ <field name="name">view.work.type.template.tree</field>
2039+ <field name="model">project.oerp.work.type.template</field>
2040+ <field name="type">tree</field>
2041+ <field name="priority" eval="16"/>
2042+ <field name="arch" type="xml">
2043+ <tree string="Work Type Templates">
2044+ <field name="name"/>
2045+ <field name="file"/>
2046+ </tree>
2047+ </field>
2048+ </record>
2049+
2050+ <!-- project.oerp.work.type.template.group -->
2051+ <!-- form -->
2052+ <record id ="view_work_type_template_group_form" model="ir.ui.view">
2053+ <field name="name">view.work.type.template.group.form</field>
2054+ <field name="model">project.oerp.work.type.template.group</field>
2055+ <field name="type">form</field>
2056+ <field name="priority" eval="16"/>
2057+ <field name="arch" type="xml">
2058+ <form string="Work Type Template Group" version="7.0">
2059+ <sheet>
2060+ <div class="oe_title">
2061+ <label for="name" class="oe_edit_only"/>
2062+ <h1>
2063+ <field name="name"/>
2064+ </h1>
2065+ </div>
2066+ <group>
2067+ <group>
2068+ <field name="file" filename="filename"/>
2069+ </group>
2070+ <group>
2071+ <field name="filename"/>
2072+ </group>
2073+ </group>
2074+ <notebook>
2075+ <page string="Phase Templates" name="work_types_templates">
2076+ <field name="template_ids">
2077+ <tree editable="top">
2078+ <field name="name"/>
2079+ </tree>
2080+ </field>
2081+ </page>
2082+ </notebook>
2083+ </sheet>
2084+ </form>
2085+ </field>
2086+ </record>
2087+
2088+ <!-- tree -->
2089+ <record id ="view_work_type_template_group_tree" model="ir.ui.view">
2090+ <field name="name">view.work.type.template.group.tree</field>
2091+ <field name="model">project.oerp.work.type.template.group</field>
2092+ <field name="type">tree</field>
2093+ <field name="priority" eval="16"/>
2094+ <field name="arch" type="xml">
2095+ <tree string="Work Type Template Groups">
2096+ <field name="name"/>
2097+ <field name="file"/>
2098+ </tree>
2099+ </field>
2100+ </record>
2101+ </data>
2102+</openerp>
2103\ No newline at end of file
2104
2105=== added directory 'project_openerp/wizard'
2106=== added file 'project_openerp/wizard/__init__.py'
2107--- project_openerp/wizard/__init__.py 1970-01-01 00:00:00 +0000
2108+++ project_openerp/wizard/__init__.py 2014-03-27 17:09:06 +0000
2109@@ -0,0 +1,26 @@
2110+# -*- coding: utf-8 -*-
2111+##############################################################################
2112+#
2113+# OpenERP, Open Source Management Solution
2114+# Addons modules by CLEARCORP S.A.
2115+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
2116+#
2117+# This program is free software: you can redistribute it and/or modify
2118+# it under the terms of the GNU Affero General Public License as
2119+# published by the Free Software Foundation, either version 3 of the
2120+# License, or (at your option) any later version.
2121+#
2122+# This program is distributed in the hope that it will be useful,
2123+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2124+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2125+# GNU Affero General Public License for more details.
2126+#
2127+# You should have received a copy of the GNU Affero General Public License
2128+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2129+#
2130+##############################################################################
2131+
2132+import feature_import_wizard
2133+import phase_create_wizard
2134+import task_create_wizard
2135+import sprint_close_wizard
2136\ No newline at end of file
2137
2138=== added file 'project_openerp/wizard/feature_import_wizard.py'
2139--- project_openerp/wizard/feature_import_wizard.py 1970-01-01 00:00:00 +0000
2140+++ project_openerp/wizard/feature_import_wizard.py 2014-03-27 17:09:06 +0000
2141@@ -0,0 +1,115 @@
2142+# -*- coding: utf-8 -*-
2143+##############################################################################
2144+#
2145+# OpenERP, Open Source Management Solution
2146+# Addons modules by CLEARCORP S.A.
2147+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
2148+#
2149+# This program is free software: you can redistribute it and/or modify
2150+# it under the terms of the GNU Affero General Public License as
2151+# published by the Free Software Foundation, either version 3 of the
2152+# License, or (at your option) any later version.
2153+#
2154+# This program is distributed in the hope that it will be useful,
2155+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2156+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2157+# GNU Affero General Public License for more details.
2158+#
2159+# You should have received a copy of the GNU Affero General Public License
2160+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2161+#
2162+##############################################################################
2163+
2164+import base64
2165+import StringIO
2166+import csv
2167+from openerp.osv import osv, fields
2168+from openerp.tools.translate import _
2169+
2170+class FeatureImportWizard(osv.TransientModel):
2171+
2172+ _name = 'project.oerp.feature.import.wizard'
2173+
2174+ def import_file(self, cr, uid, ids, context=None):
2175+ wizard = self.browse(cr, uid, ids[0], context=context)
2176+ try:
2177+ file = StringIO.StringIO(base64.decodestring(wizard.file))
2178+ reader = csv.reader(file, delimiter=',')
2179+ except:
2180+ raise osv.except_osv(_('Error'),_('An error occurred while reading the file. Please '
2181+ 'check if the format is correct.'))
2182+
2183+ phase_obj = self.pool.get('project.phase')
2184+ phase_ids = phase_obj.search(cr, uid, [('project_id','=',wizard.project_id.id)], context=context)
2185+ work_type_obj = self.pool.get('project.oerp.work.type')
2186+ work_type_ids = work_type_obj.search(cr, uid, [('phase_id','in',phase_ids)], context=context)
2187+ work_types = work_type_obj.browse(cr, uid, work_type_ids, context=context)
2188+
2189+ # TODO: improve skip
2190+ skipheader = True
2191+ for row in reader:
2192+ if skipheader:
2193+ skipheader = False
2194+ continue
2195+ if row[2] == '':
2196+
2197+ feature_type_id = self.pool.get('project.scrum.feature.type').search(
2198+ cr, uid, [('code','=',row[0])], context=context) or False
2199+ if feature_type_id:
2200+ feature_type_id = feature_type_id[0]
2201+ else: # TODO: log error
2202+ pass
2203+
2204+ try:
2205+ values = {
2206+ 'code': row[1],
2207+ 'name': row[3],
2208+ 'product_backlog_id': wizard.product_backlog_id.id,
2209+ 'description': row[4],
2210+ 'priority': int(row[5]),
2211+ 'type_id': feature_type_id,
2212+ }
2213+
2214+ hour_ids = []
2215+ for work_type in work_types:
2216+ try:
2217+ planned_hours = float(row[work_type.column_number-1])
2218+ if planned_hours != 0.0:
2219+ vals = {
2220+ 'project_id': wizard.project_id.id,
2221+ 'phase_id': work_type.phase_id.id,
2222+ 'work_type_id': work_type.id,
2223+ 'expected_hours': planned_hours,
2224+ }
2225+ hour_ids.append([0,False,vals])
2226+ except:
2227+ raise osv.except_osv(_('Error'),_('An error occurred while reading the planned hours '
2228+ 'from file in column %s for work type %s') % (work_type.column_number, work_type.name))
2229+ values['hour_ids'] = hour_ids
2230+
2231+ feature_obj = self.pool.get('project.scrum.feature')
2232+ feature_obj.create(cr, uid, values, context=context)
2233+
2234+ except:# TODO: capture better error messages
2235+ raise osv.except_osv(_('Error'),_('An error occurred while importing the features'))
2236+ return {
2237+ 'name': 'Features',
2238+ 'view_type': 'tree',
2239+ 'view_mode': 'tree',
2240+ 'res_model': 'project.scrum.feature',
2241+ 'context': context,
2242+ 'type': 'ir.actions.act_window',
2243+ }
2244+
2245+ _columns = {
2246+ 'project_id': fields.many2one('project.project', string='Project', required=True,
2247+ domain="[('is_scrum','=',True)]"),
2248+ 'product_backlog_id': fields.many2one('project.scrum.product.backlog', string='Product Backlog',
2249+ required=True, domain="[('project_id','=',project_id)]"),
2250+ 'file': fields.binary('File to Import', required=True),
2251+ 'state': fields.selection([('new','New'),('done','Done')], string='State'),
2252+ }
2253+
2254+ _defaults = {
2255+ 'state': 'new'
2256+ }
2257\ No newline at end of file
2258
2259=== added file 'project_openerp/wizard/phase_create_wizard.py'
2260--- project_openerp/wizard/phase_create_wizard.py 1970-01-01 00:00:00 +0000
2261+++ project_openerp/wizard/phase_create_wizard.py 2014-03-27 17:09:06 +0000
2262@@ -0,0 +1,72 @@
2263+# -*- coding: utf-8 -*-
2264+##############################################################################
2265+#
2266+# OpenERP, Open Source Management Solution
2267+# Addons modules by CLEARCORP S.A.
2268+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
2269+#
2270+# This program is free software: you can redistribute it and/or modify
2271+# it under the terms of the GNU Affero General Public License as
2272+# published by the Free Software Foundation, either version 3 of the
2273+# License, or (at your option) any later version.
2274+#
2275+# This program is distributed in the hope that it will be useful,
2276+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2277+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2278+# GNU Affero General Public License for more details.
2279+#
2280+# You should have received a copy of the GNU Affero General Public License
2281+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2282+#
2283+##############################################################################
2284+
2285+from openerp.osv import fields, osv
2286+
2287+class PhaseCreateWizard(osv.TransientModel):
2288+
2289+ _name = 'project.oerp.phase.create.wizard'
2290+
2291+ def create_phase(self, cr, uid, ids, context=None):
2292+ wizard = self.browse(cr, uid, ids[0], context=context)
2293+
2294+ values = {
2295+ 'name': wizard.work_type_template_id.name,
2296+ 'project_id': wizard.project_id.id,
2297+ 'product_backlog_id': wizard.product_backlog_id.id,
2298+ 'duration': wizard.duration,
2299+ 'product_uom': wizard.product_uom.id,
2300+ }
2301+
2302+ work_type_ids = []
2303+ for work_type in wizard.work_type_template_id.work_type_mapping_ids:
2304+ vals = {
2305+ 'name': work_type.name,
2306+ 'sequence': work_type.sequence,
2307+ 'column_number': work_type.column_number,
2308+ }
2309+ work_type_ids.append([0,False,vals])
2310+
2311+ values['work_type_ids'] = work_type_ids
2312+
2313+ phase_obj = self.pool.get('project.phase')
2314+ phase_id = phase_obj.create(cr, uid, values, context=context)
2315+ return {
2316+ 'name': 'Project Phases',
2317+ 'view_type': 'form',
2318+ 'view_mode': 'form',
2319+ 'res_model': 'project.phase',
2320+ 'context': context,
2321+ 'res_id': phase_id,
2322+ 'type': 'ir.actions.act_window',
2323+ }
2324+
2325+ _columns = {
2326+ 'work_type_template_id': fields.many2one('project.oerp.work.type.template', string='Work Type Template',
2327+ required=True),
2328+ 'project_id': fields.many2one('project.project', string='Project', required=True,
2329+ domain="[('is_scrum','=',True)]"),
2330+ 'product_backlog_id': fields.many2one('project.scrum.product.backlog', string='Product Backlog',
2331+ required=True, domain="[('project_id','=',project_id)]"),
2332+ 'duration': fields.float('Duration', required=True),
2333+ 'product_uom': fields.many2one('product.uom', string='Unit of Measure', required=True),
2334+ }
2335\ No newline at end of file
2336
2337=== added file 'project_openerp/wizard/sprint_close_wizard.py'
2338--- project_openerp/wizard/sprint_close_wizard.py 1970-01-01 00:00:00 +0000
2339+++ project_openerp/wizard/sprint_close_wizard.py 2014-03-27 17:09:06 +0000
2340@@ -0,0 +1,71 @@
2341+# -*- coding: utf-8 -*-
2342+##############################################################################
2343+#
2344+# OpenERP, Open Source Management Solution
2345+# Addons modules by CLEARCORP S.A.
2346+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
2347+#
2348+# This program is free software: you can redistribute it and/or modify
2349+# it under the terms of the GNU Affero General Public License as
2350+# published by the Free Software Foundation, either version 3 of the
2351+# License, or (at your option) any later version.
2352+#
2353+# This program is distributed in the hope that it will be useful,
2354+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2355+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2356+# GNU Affero General Public License for more details.
2357+#
2358+# You should have received a copy of the GNU Affero General Public License
2359+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2360+#
2361+##############################################################################
2362+
2363+from openerp.osv import fields, osv
2364+from openerp.tools.translate import _
2365+
2366+class SprintCloseWizard(osv.TransientModel):
2367+
2368+ _name = 'project.oerp.sprint.close.wizard'
2369+
2370+ def close_sprint(self, cr, uid, ids, context=None):
2371+ wizard = self.browse(cr, uid, ids[0], context=context)
2372+ closing = wizard.closing_sprint_id
2373+ opening = wizard.opening_sprint_id
2374+
2375+ try:
2376+ task_ids = []
2377+ for task in closing.task_ids:
2378+ if task.state in ['open','pending','draft']:
2379+ task_ids.append(task.id)
2380+ task.write({'sprint_id': False}, context=context)
2381+
2382+ feature_ids = []
2383+ for feature in closing.feature_ids:
2384+ if feature.state not in ['cancelled','done']:
2385+ feature_ids.append(feature.id)
2386+ opening.write({
2387+ 'desirable_task_ids': [[6,0,task_ids]],
2388+ 'feature_ids': [[6,0,feature_ids]],
2389+ }, context=context)
2390+
2391+ closing.set_done(context=context)
2392+
2393+ return {
2394+ 'name': 'Sprints',
2395+ 'view_type': 'form',
2396+ 'view_mode': 'form',
2397+ 'res_model': 'project.scrum.sprint',
2398+ 'context': context,
2399+ 'res_id': opening.id,
2400+ 'type': 'ir.actions.act_window',
2401+ }
2402+
2403+ except:
2404+ raise osv.except_osv(_('Error'),_('An error occurred while closing the sprint.'))
2405+
2406+ _columns = {
2407+ 'closing_sprint_id': fields.many2one('project.scrum.sprint', string='Closing Sprint',
2408+ required=True, domain="[('state','in',['open','pending'])]"),
2409+ 'opening_sprint_id': fields.many2one('project.scrum.sprint', string='Opening Sprint',
2410+ required=True, domain="[('state','in',['draft','close'])]"),
2411+ }
2412\ No newline at end of file
2413
2414=== added file 'project_openerp/wizard/task_create_wizard.py'
2415--- project_openerp/wizard/task_create_wizard.py 1970-01-01 00:00:00 +0000
2416+++ project_openerp/wizard/task_create_wizard.py 2014-03-27 17:09:06 +0000
2417@@ -0,0 +1,149 @@
2418+# -*- coding: utf-8 -*-
2419+##############################################################################
2420+#
2421+# OpenERP, Open Source Management Solution
2422+# Addons modules by CLEARCORP S.A.
2423+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
2424+#
2425+# This program is free software: you can redistribute it and/or modify
2426+# it under the terms of the GNU Affero General Public License as
2427+# published by the Free Software Foundation, either version 3 of the
2428+# License, or (at your option) any later version.
2429+#
2430+# This program is distributed in the hope that it will be useful,
2431+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2432+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2433+# GNU Affero General Public License for more details.
2434+#
2435+# You should have received a copy of the GNU Affero General Public License
2436+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2437+#
2438+##############################################################################
2439+
2440+from openerp.osv import fields, osv
2441+from openerp.tools.translate import _
2442+
2443+# Mapping between task priority and
2444+# feature priority
2445+PRIORITY = {
2446+ 5: '4',
2447+ 4: '3',
2448+ 3: '2',
2449+ 2: '1',
2450+ 1: '0',
2451+ }
2452+
2453+
2454+class TaskCreateWizard(osv.TransientModel):
2455+
2456+ _name = 'project.oerp.task.create.wizard'
2457+
2458+ def create_tasks(self, cr, uid, ids, context=None):
2459+ wizard = self.browse(cr, uid, ids[0], context=context)
2460+ sprint = wizard.sprint_id
2461+ features = wizard.sprint_id.feature_ids
2462+
2463+ if sprint.task_from_features:
2464+ raise osv.except_osv(_('Error'),_('All task were created before.'))
2465+
2466+ desirables = []
2467+ for feature in features:
2468+ try:
2469+ cr.execute('''SELECT string_agg(types.name,', ') AS name,
2470+ types.sequence,
2471+ SUM(types.expected_hours) AS expected_hours
2472+FROM (SELECT types.id,
2473+ types.sequence,
2474+ types.name,
2475+ hours.expected_hours
2476+FROM project_oerp_feature_hours AS hours,
2477+ project_oerp_work_type AS types
2478+WHERE hours.feature_id = %s
2479+AND hours.work_type_id = types.id) AS types
2480+GROUP BY types.sequence
2481+ORDER BY types.sequence ASC;''', (feature.id,))
2482+
2483+ previous_id = False
2484+ for sequence in cr.dictfetchall():
2485+ number = sequence.get('sequence')
2486+ values = {
2487+ 'name': feature.code + ' ' + feature.name + \
2488+ ' ' + sequence.get('name'),
2489+ 'project_id': sprint.project_id.id,
2490+ 'product_backlog_id': sprint.product_backlog_id.id,
2491+ 'release_backlog_id': sprint.release_backlog_id.id,
2492+ 'sprint_id': False,
2493+ 'feature_id': feature.id,
2494+ 'description': feature.description,
2495+ 'planned_hours': sequence.get('expected_hours'),
2496+ 'remaining_hours': sequence.get('expected_hours'),
2497+ 'priority': PRIORITY[feature.priority],
2498+ 'phase_id': sprint.phase_id.id,
2499+ 'date_deadline': sprint.deadline,
2500+ 'date_start': sprint.date_start,
2501+ 'sequence': number,
2502+ }
2503+
2504+ cr.execute('''SELECT types.id,
2505+ hours.expected_hours,
2506+ hours.phase_id
2507+FROM project_oerp_feature_hours AS hours,
2508+ project_oerp_work_type AS types
2509+WHERE hours.feature_id = %s
2510+AND hours.work_type_id = types.id
2511+AND types.sequence = %s;''', (feature.id, number,))
2512+
2513+ vals = []
2514+ for row in cr.dictfetchall():
2515+ vals.append([0,0,{
2516+ 'phase_id': row.get('phase_id'),
2517+ 'work_type_id': row.get('id'),
2518+ 'expected_hours': row.get('expected_hours'),
2519+ }])
2520+
2521+ values['task_hour_ids'] = vals
2522+
2523+ if sprint.phase_id.user_id:
2524+ values['user_id'] = sprint.phase_id.user_id.id
2525+
2526+ task_obj = self.pool.get('project.task')
2527+ task_id = task_obj.create(cr, uid, values, context=context)
2528+ desirables.append(task_id)
2529+
2530+ if previous_id:
2531+ values = {'previous_task_ids': [[6,0,[previous_id]]]}
2532+ task_obj.write(cr, uid, task_id, values, context=context)
2533+ values = {'next_task_ids': [[6,0,[task_id]]]}
2534+ task_obj.write(cr, uid, previous_id, values, context=context)
2535+
2536+ previous_id = task_id
2537+
2538+ except:
2539+ raise osv.except_osv(_('Error'),_('An error occurred while creating the tasks. '
2540+ 'Please contact your system administrator.'))
2541+
2542+ sprint_obj = self.pool.get('project.scrum.sprint')
2543+ sprint_obj.write(cr, uid, sprint.id,
2544+ {
2545+ 'task_from_features': True,
2546+ 'desirable_task_ids': [[6,0,desirables]],
2547+ })
2548+
2549+ return {
2550+ 'name': 'Sprints',
2551+ 'view_type': 'form',
2552+ 'view_mode': 'form',
2553+ 'res_model': 'project.scrum.sprint',
2554+ 'context': context,
2555+ 'res_id': sprint.id,
2556+ 'type': 'ir.actions.act_window',
2557+ }
2558+
2559+ _columns = {
2560+ 'sprint_id': fields.many2one('project.scrum.sprint', string='Sprint',
2561+ required = True, domain="[('state','=','open')]"),
2562+ }
2563+
2564+ _defaults = {
2565+ 'sprint_id': lambda slf, cr, uid, ctx: ctx.get('sprint_id', False),
2566+ }
2567\ No newline at end of file
2568
2569=== added file 'project_openerp/wizard/wizard_view.xml'
2570--- project_openerp/wizard/wizard_view.xml 1970-01-01 00:00:00 +0000
2571+++ project_openerp/wizard/wizard_view.xml 2014-03-27 17:09:06 +0000
2572@@ -0,0 +1,106 @@
2573+<?xml version="1.0" encoding="UTF-8"?>
2574+
2575+<openerp>
2576+ <data>
2577+ <!-- project.oerp.feature.import.wizard -->
2578+ <!-- form -->
2579+ <record id="view_feature_import_wizard_form" model="ir.ui.view">
2580+ <field name="name">view.feature.import.wizard.form</field>
2581+ <field name="model">project.oerp.feature.import.wizard</field>
2582+ <field name="arch" type="xml">
2583+ <form string="Feature Import Wizard" version="7.0">
2584+ <header>
2585+ <field name="state" widget="statusbar" />
2586+ </header>
2587+ <group states="new">
2588+ <field name="project_id"/>
2589+ <field name="product_backlog_id"/>
2590+ <field name="file"/>
2591+ </group>
2592+ <footer>
2593+ <button string="Import" type="object"
2594+ name="import_file" class="oe_highlight"
2595+ confirm="Are you sure you want to import this file?"
2596+ states="new"/> or
2597+ <button string="Cancel" class="oe_link"
2598+ special="cancel" states="new"/>
2599+ </footer>
2600+ </form>
2601+ </field>
2602+ </record>
2603+
2604+ <!-- project.oerp.task.create.wizard -->
2605+ <!-- form -->
2606+ <record id="view_task_create_wizard_form" model="ir.ui.view">
2607+ <field name="name">view.task.create.wizard.form</field>
2608+ <field name="model">project.oerp.task.create.wizard</field>
2609+ <field name="arch" type="xml">
2610+ <form string="Task Create Wizard" version="7.0">
2611+ <group>
2612+ <field name="sprint_id"/>
2613+ </group>
2614+ <footer>
2615+ <button string="Create" type="object"
2616+ name="create_tasks" class="oe_highlight"
2617+ confirm="Are you sure you want to continue?"/> or
2618+ <button string="Cancel" class="oe_link"
2619+ special="cancel"/>
2620+ </footer>
2621+ </form>
2622+ </field>
2623+ </record>
2624+
2625+ <!-- project.oerp.sprint.close.wizard -->
2626+ <!-- form -->
2627+ <record id="view_sprint_close_wizard_form" model="ir.ui.view">
2628+ <field name="name">view.sprint.close.wizard.form</field>
2629+ <field name="model">project.oerp.sprint.close.wizard</field>
2630+ <field name="arch" type="xml">
2631+ <form string="Close Sprint Wizard" version="7.0">
2632+ <group>
2633+ <group>
2634+ <field name="closing_sprint_id"/>
2635+ </group>
2636+ <group>
2637+ <field name="opening_sprint_id"/>
2638+ </group>
2639+ </group>
2640+ <footer>
2641+ <button string="Close" type="object"
2642+ name="close_sprint" class="oe_highlight"
2643+ confirm="Are you sure you want to continue?"/> or
2644+ <button string="Cancel" class="oe_link"
2645+ special="cancel"/>
2646+ </footer>
2647+ </form>
2648+ </field>
2649+ </record>
2650+
2651+ <!-- project.oerp.phase.create.wizard -->
2652+ <!-- form -->
2653+ <record id="view_phase_create_wizard_form" model="ir.ui.view">
2654+ <field name="name">view.phase.create.wizard.form</field>
2655+ <field name="model">project.oerp.phase.create.wizard</field>
2656+ <field name="arch" type="xml">
2657+ <form string="Phase Create Wizard" version="7.0">
2658+ <group>
2659+ <field name="work_type_template_id"/>
2660+ <field name="project_id"/>
2661+ <field name="product_backlog_id"/>
2662+ <label for="id" string="Duration"/>
2663+ <div>
2664+ <field name="duration" class="oe_inline"/><field name="product_uom" nolabel="1" class="oe_inline"/>
2665+ </div>
2666+ </group>
2667+ <footer>
2668+ <button string="Create" type="object"
2669+ name="create_phase" class="oe_highlight"
2670+ confirm="Are you sure you want to continue?"/> or
2671+ <button string="Cancel" class="oe_link"
2672+ special="cancel"/>
2673+ </footer>
2674+ </form>
2675+ </field>
2676+ </record>
2677+ </data>
2678+</openerp>
2679\ No newline at end of file
2680
2681=== added directory 'project_scrum'
2682=== added file 'project_scrum/__init__.py'
2683--- project_scrum/__init__.py 1970-01-01 00:00:00 +0000
2684+++ project_scrum/__init__.py 2014-03-27 17:09:06 +0000
2685@@ -0,0 +1,23 @@
2686+# -*- coding: utf-8 -*-
2687+##############################################################################
2688+#
2689+# OpenERP, Open Source Management Solution
2690+# Addons modules by CLEARCORP S.A.
2691+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
2692+#
2693+# This program is free software: you can redistribute it and/or modify
2694+# it under the terms of the GNU Affero General Public License as
2695+# published by the Free Software Foundation, either version 3 of the
2696+# License, or (at your option) any later version.
2697+#
2698+# This program is distributed in the hope that it will be useful,
2699+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2700+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2701+# GNU Affero General Public License for more details.
2702+#
2703+# You should have received a copy of the GNU Affero General Public License
2704+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2705+#
2706+##############################################################################
2707+
2708+import project_scrum
2709\ No newline at end of file
2710
2711=== added file 'project_scrum/__openerp__.py'
2712--- project_scrum/__openerp__.py 1970-01-01 00:00:00 +0000
2713+++ project_scrum/__openerp__.py 2014-03-27 17:09:06 +0000
2714@@ -0,0 +1,52 @@
2715+# -*- coding: utf-8 -*-
2716+##############################################################################
2717+#
2718+# OpenERP, Open Source Management Solution
2719+# Addons modules by CLEARCORP S.A.
2720+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
2721+#
2722+# This program is free software: you can redistribute it and/or modify
2723+# it under the terms of the GNU Affero General Public License as
2724+# published by the Free Software Foundation, either version 3 of the
2725+# License, or (at your option) any later version.
2726+#
2727+# This program is distributed in the hope that it will be useful,
2728+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2729+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2730+# GNU Affero General Public License for more details.
2731+#
2732+# You should have received a copy of the GNU Affero General Public License
2733+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2734+#
2735+##############################################################################
2736+
2737+{
2738+ "name" : 'Project Scrum',
2739+ "version" : '1.0',
2740+ "author" : 'CLEARCORP S.A.',
2741+ 'complexity': 'normal',
2742+ "description": """
2743+""",
2744+ "category": 'Project Management',
2745+ "sequence": 3,
2746+ "website" : "http://clearcorp.co.cr",
2747+ "images" : [],
2748+ "depends" : [
2749+ 'project',
2750+ ],
2751+ "data" : [
2752+ 'data/project_scrum_data.xml',
2753+ 'view/project_scrum_view.xml',
2754+ 'view/project_scrum_menu.xml',
2755+ 'security/ir.model.access.csv',
2756+ ],
2757+ "css" : ['static/src/css/project_scrum.css'],
2758+ "init_xml" : [],
2759+ "demo_xml" : [],
2760+ "update_xml" : [],
2761+ "test" : [],
2762+ "auto_install": False,
2763+ "application": False,
2764+ "installable": True,
2765+ 'license': 'AGPL-3',
2766+}
2767\ No newline at end of file
2768
2769=== added directory 'project_scrum/data'
2770=== added file 'project_scrum/data/project_scrum_data.xml'
2771--- project_scrum/data/project_scrum_data.xml 1970-01-01 00:00:00 +0000
2772+++ project_scrum/data/project_scrum_data.xml 2014-03-27 17:09:06 +0000
2773@@ -0,0 +1,26 @@
2774+<?xml version="1.0" encoding="utf-8"?>
2775+<openerp>
2776+ <data noupdate="1">
2777+
2778+ <record model="project.scrum.feature.type" id="data_feature_type_account">
2779+ <field name="name">Account</field>
2780+ <field name="code">ACC</field>
2781+ </record>
2782+
2783+ <record model="project.scrum.feature.type" id="data_feature_type_project">
2784+ <field name="name">Project</field>
2785+ <field name="code">PRJ</field>
2786+ </record>
2787+
2788+ <record model="project.scrum.feature.type" id="data_feature_type_hr">
2789+ <field name="name">Human Resources</field>
2790+ <field name="code">HR</field>
2791+ </record>
2792+
2793+ <record model="project.scrum.feature.type" id="data_feature_type_sales">
2794+ <field name="name">Sales</field>
2795+ <field name="code">SAL</field>
2796+ </record>
2797+
2798+ </data>
2799+</openerp>
2800\ No newline at end of file
2801
2802=== added directory 'project_scrum/i18n'
2803=== added file 'project_scrum/i18n/es.po'
2804--- project_scrum/i18n/es.po 1970-01-01 00:00:00 +0000
2805+++ project_scrum/i18n/es.po 2014-03-27 17:09:06 +0000
2806@@ -0,0 +1,829 @@
2807+# Translation of OpenERP Server.
2808+# This file contains the translation of the following modules:
2809+# * project_scrum
2810+#
2811+msgid ""
2812+msgstr ""
2813+"Project-Id-Version: OpenERP Server 7.0\n"
2814+"Report-Msgid-Bugs-To: \n"
2815+"POT-Creation-Date: 2014-03-21 21:11+0000\n"
2816+"PO-Revision-Date: 2014-03-21 21:11+0000\n"
2817+"Last-Translator: <>\n"
2818+"Language-Team: \n"
2819+"MIME-Version: 1.0\n"
2820+"Content-Type: text/plain; charset=UTF-8\n"
2821+"Content-Transfer-Encoding: \n"
2822+"Plural-Forms: \n"
2823+
2824+#. module: project_scrum
2825+#: model:project.scrum.feature.type,name:project_scrum.data_feature_type_hr
2826+msgid "Human Resources"
2827+msgstr "Recursos humanos"
2828+
2829+#. module: project_scrum
2830+#: view:project.scrum.feature:0
2831+#: view:project.scrum.product.backlog:0
2832+#: view:project.scrum.release.backlog:0
2833+#: view:project.scrum.sprint:0
2834+msgid "Group By..."
2835+msgstr "Agrupar por..."
2836+
2837+#. module: project_scrum
2838+#: view:project.scrum.feature:0
2839+msgid "My Features"
2840+msgstr "Mis características"
2841+
2842+#. module: project_scrum
2843+#: view:project.scrum.feature:0
2844+msgid "Very High"
2845+msgstr "Muy alta"
2846+
2847+#. module: project_scrum
2848+#: view:project.task:0
2849+#: field:project.task,next_task_ids:0
2850+msgid "Next Tasks"
2851+msgstr "Tareas siguientes"
2852+
2853+#. module: project_scrum
2854+#: view:project.scrum.release.backlog:0
2855+msgid "Are you sure you want to cancel this release backlog?"
2856+msgstr "¿Estás seguro que quieres cancelar esta pila de liberación?"
2857+
2858+#. module: project_scrum
2859+#: constraint:project.scrum.sprint:0
2860+msgid "Deadline must be greater than Start Date"
2861+msgstr "La fecha límite debe ser mayor que la fecha inicial"
2862+
2863+#. module: project_scrum
2864+#: field:project.scrum.feature,progress:0
2865+#: field:project.scrum.product.backlog,progress:0
2866+#: field:project.scrum.release.backlog,progress:0
2867+#: field:project.scrum.sprint,progress:0
2868+msgid "Progress (%)"
2869+msgstr "Progreso (%)"
2870+
2871+#. module: project_scrum
2872+#: field:project.scrum.feature,expected_hours:0
2873+#: field:project.scrum.product.backlog,expected_hours:0
2874+#: field:project.scrum.release.backlog,expected_hours:0
2875+#: field:project.scrum.sprint,expected_hours:0
2876+msgid "Initially Planned Hour(s)"
2877+msgstr "Horas planeadas inicialmente"
2878+
2879+#. module: project_scrum
2880+#: view:project.task:0
2881+#: field:project.task,previous_task_ids:0
2882+msgid "Previous Tasks"
2883+msgstr "Tareas previas"
2884+
2885+#. module: project_scrum
2886+#: view:project.scrum.feature:0
2887+#: selection:project.scrum.feature,state:0
2888+msgid "Approved"
2889+msgstr "Aprobado"
2890+
2891+#. module: project_scrum
2892+#: selection:project.scrum.feature,priority:0
2893+msgid "2 - High"
2894+msgstr "2 - Alta"
2895+
2896+#. module: project_scrum
2897+#: model:project.scrum.feature.type,name:project_scrum.data_feature_type_account
2898+msgid "Account"
2899+msgstr "Contabilidad"
2900+
2901+#. module: project_scrum
2902+#: model:ir.model,name:project_scrum.model_project_task
2903+msgid "Task"
2904+msgstr "Tarea"
2905+
2906+#. module: project_scrum
2907+#: model:ir.actions.act_window,name:project_scrum.action_product_backlog
2908+#: view:project.scrum.feature:0
2909+#: field:project.scrum.feature,product_backlog_id:0
2910+#: view:project.scrum.product.backlog:0
2911+#: view:project.scrum.release.backlog:0
2912+#: field:project.scrum.release.backlog,product_backlog_id:0
2913+#: view:project.scrum.sprint:0
2914+#: field:project.scrum.sprint,product_backlog_id:0
2915+#: field:project.task,product_backlog_id:0
2916+msgid "Product Backlog"
2917+msgstr "Pila de producto"
2918+
2919+#. module: project_scrum
2920+#: model:ir.model,name:project_scrum.model_project_project
2921+#: view:project.scrum.feature:0
2922+#: field:project.scrum.feature,project_id:0
2923+#: model:project.scrum.feature.type,name:project_scrum.data_feature_type_project
2924+#: view:project.scrum.product.backlog:0
2925+#: field:project.scrum.product.backlog,project_id:0
2926+#: view:project.scrum.release.backlog:0
2927+#: field:project.scrum.release.backlog,project_id:0
2928+#: field:project.scrum.release.backlog,user_id:0
2929+#: view:project.scrum.sprint:0
2930+#: field:project.scrum.sprint,project_id:0
2931+msgid "Project"
2932+msgstr "Proyecto"
2933+
2934+#. module: project_scrum
2935+#: selection:project.scrum.feature,priority:0
2936+msgid "1 - Very High"
2937+msgstr "1 - Muy alta"
2938+
2939+#. module: project_scrum
2940+#: view:project.scrum.sprint:0
2941+msgid "Are you sure you want to create a task for each feature related to this sprint?"
2942+msgstr "¿Estás seguro que deseas crear una tarea por cada característica relacionada a este sprint?"
2943+
2944+#. module: project_scrum
2945+#: view:project.scrum.feature:0
2946+#: selection:project.scrum.feature,state:0
2947+#: view:project.scrum.product.backlog:0
2948+#: selection:project.scrum.product.backlog,state:0
2949+#: view:project.scrum.release.backlog:0
2950+#: selection:project.scrum.release.backlog,state:0
2951+#: view:project.scrum.sprint:0
2952+msgid "Cancelled"
2953+msgstr "Cancelado"
2954+
2955+#. module: project_scrum
2956+#: field:project.scrum.feature,color:0
2957+#: field:project.scrum.product.backlog,color:0
2958+#: field:project.scrum.release.backlog,color:0
2959+#: field:project.scrum.sprint,color:0
2960+msgid "Color Index"
2961+msgstr "Indice de Color"
2962+
2963+#. module: project_scrum
2964+#: constraint:project.task:0
2965+msgid "The selected Feature must belong to the selected Sprint."
2966+msgstr "La característica seleccionada debe perteneces al sprint seleccionado."
2967+
2968+#. module: project_scrum
2969+#: constraint:project.task:0
2970+msgid "The selected Sprint must belong to the selected Release Backlog."
2971+msgstr "El sprint seleccionado debe pertenecer a la pila de liberación seleccionada."
2972+
2973+#. module: project_scrum
2974+#: model:ir.ui.menu,name:project_scrum.menu_release_backlog
2975+#: view:project.scrum.product.backlog:0
2976+#: field:project.scrum.product.backlog,release_backlog_ids:0
2977+msgid "Release Backlogs"
2978+msgstr "Pilas de liberación"
2979+
2980+#. module: project_scrum
2981+#: field:project.scrum.feature,deadline:0
2982+#: field:project.scrum.product.backlog,deadline:0
2983+#: field:project.scrum.release.backlog,deadline:0
2984+#: field:project.scrum.sprint,deadline:0
2985+msgid "Deadline"
2986+msgstr "Fecha límite"
2987+
2988+#. module: project_scrum
2989+#: view:project.scrum.sprint:0
2990+msgid "My Sprints"
2991+msgstr "Mis sprints"
2992+
2993+#. module: project_scrum
2994+#: help:project.scrum.release.backlog,expected_hours:0
2995+msgid "Total planned hours calculated from sprints."
2996+msgstr "Total de horas planeadas calculadas de los sprints."
2997+
2998+#. module: project_scrum
2999+#: view:project.scrum.feature:0
3000+#: view:project.scrum.product.backlog:0
3001+#: view:project.scrum.release.backlog:0
3002+#: view:project.scrum.sprint:0
3003+msgid "Edit..."
3004+msgstr "Editar..."
3005+
3006+#. module: project_scrum
3007+#: help:project.scrum.feature,effective_hours:0
3008+msgid "Total effective hours from tasks related to this feature."
3009+msgstr "Total de horas effectivas de las tareas relacionadas a esta característica."
3010+
3011+#. module: project_scrum
3012+#: model:ir.actions.act_window,name:project_scrum.action_sprint
3013+#: model:ir.ui.menu,name:project_scrum.menu_sprint
3014+#: view:project.scrum.feature:0
3015+#: field:project.scrum.feature,sprint_ids:0
3016+#: view:project.scrum.release.backlog:0
3017+#: field:project.scrum.release.backlog,sprint_ids:0
3018+msgid "Sprints"
3019+msgstr "Sprints"
3020+
3021+#. module: project_scrum
3022+#: help:project.scrum.feature,sprint_ids:0
3023+msgid "Sprints in which the feature has been used."
3024+msgstr "Sprints en los que la característica ha sido usada."
3025+
3026+#. module: project_scrum
3027+#: field:project.scrum.feature,date_end:0
3028+#: field:project.scrum.product.backlog,date_end:0
3029+#: field:project.scrum.release.backlog,date_end:0
3030+#: field:project.scrum.sprint,date_end:0
3031+msgid "End Date"
3032+msgstr "Fecha final"
3033+
3034+#. module: project_scrum
3035+#: model:ir.actions.act_window,help:project_scrum.action_release_backlog
3036+msgid "<p class=\"oe_view_nocontent_create\">Create new Release Backlog</p>\n"
3037+" "
3038+msgstr "<p class=\"oe_view_nocontent_create\">Crear nueva pila de liberación</p>\n"
3039+" "
3040+
3041+#. module: project_scrum
3042+#: view:project.scrum.feature:0
3043+#: field:project.scrum.feature,priority:0
3044+msgid "Priority"
3045+msgstr "Prioridad"
3046+
3047+#. module: project_scrum
3048+#: field:project.scrum.product.backlog,state:0
3049+#: field:project.scrum.release.backlog,state:0
3050+#: field:project.scrum.sprint,state:0
3051+msgid "State"
3052+msgstr "Estado"
3053+
3054+#. module: project_scrum
3055+#: constraint:project.task:0
3056+msgid "The selected Product Backlog must belong to the selected Project."
3057+msgstr "La pila de producto seleccionada debe pertenecer al proyecto seleccionado."
3058+
3059+#. module: project_scrum
3060+#: view:project.scrum.feature:0
3061+#: selection:project.scrum.feature,state:0
3062+#: view:project.scrum.product.backlog:0
3063+#: selection:project.scrum.product.backlog,state:0
3064+#: view:project.scrum.release.backlog:0
3065+#: selection:project.scrum.release.backlog,state:0
3066+#: view:project.scrum.sprint:0
3067+msgid "New"
3068+msgstr "Nuevo"
3069+
3070+#. module: project_scrum
3071+#: view:project.scrum.feature:0
3072+#: field:project.scrum.feature,type_id:0
3073+msgid "Type"
3074+msgstr "Tipo"
3075+
3076+#. module: project_scrum
3077+#: view:project.scrum.feature:0
3078+#: field:project.scrum.feature,user_id:0
3079+#: view:project.scrum.product.backlog:0
3080+#: field:project.scrum.product.backlog,user_id:0
3081+#: view:project.scrum.release.backlog:0
3082+#: view:project.scrum.sprint:0
3083+#: field:project.scrum.sprint,user_id:0
3084+msgid "Scrum Master"
3085+msgstr "Scrum Master"
3086+
3087+#. module: project_scrum
3088+#: model:ir.ui.menu,name:project_scrum.menu_product_backlog
3089+msgid "Product Backlogs"
3090+msgstr "Pilas de producto"
3091+
3092+#. module: project_scrum
3093+#: selection:project.scrum.feature,priority:0
3094+msgid "5 - Very Low"
3095+msgstr "5 - Muy baja"
3096+
3097+#. module: project_scrum
3098+#: field:project.project,is_scrum:0
3099+#: field:project.task,is_scrum:0
3100+msgid "Scrum"
3101+msgstr "Scrum"
3102+
3103+#. module: project_scrum
3104+#: help:project.scrum.product.backlog,expected_hours:0
3105+msgid "Total planned hours calculated from features."
3106+msgstr "Total de horas planeadas calculadas de las características."
3107+
3108+#. module: project_scrum
3109+#: view:project.scrum.product.backlog:0
3110+#: selection:project.scrum.product.backlog,state:0
3111+#: view:project.scrum.release.backlog:0
3112+#: selection:project.scrum.release.backlog,state:0
3113+#: view:project.scrum.sprint:0
3114+msgid "Pending"
3115+msgstr "Pendiente"
3116+
3117+#. module: project_scrum
3118+#: field:project.scrum.product.backlog,name:0
3119+msgid "Product Name"
3120+msgstr "Nombre del producto"
3121+
3122+#. module: project_scrum
3123+#: view:project.scrum.feature:0
3124+#: selection:project.scrum.feature,state:0
3125+#: view:project.scrum.product.backlog:0
3126+#: selection:project.scrum.product.backlog,state:0
3127+#: view:project.scrum.release.backlog:0
3128+#: selection:project.scrum.release.backlog,state:0
3129+#: view:project.scrum.sprint:0
3130+msgid "Done"
3131+msgstr "Realizado"
3132+
3133+#. module: project_scrum
3134+#: view:project.scrum.feature:0
3135+#: view:project.scrum.product.backlog:0
3136+#: field:project.scrum.product.backlog,stage_id:0
3137+#: view:project.scrum.release.backlog:0
3138+#: field:project.scrum.release.backlog,stage_id:0
3139+#: view:project.scrum.sprint:0
3140+#: field:project.scrum.sprint,stage_id:0
3141+msgid "Stage"
3142+msgstr "Etapa"
3143+
3144+#. module: project_scrum
3145+#: selection:project.scrum.feature,priority:0
3146+msgid "3 - Medium"
3147+msgstr "3 - Media"
3148+
3149+#. module: project_scrum
3150+#: help:project.scrum.product.backlog,effective_hours:0
3151+msgid "Total spent hours calculated from features."
3152+msgstr "Total de horas consumidas calculadas de las características."
3153+
3154+#. module: project_scrum
3155+#: code:addons/project_scrum/project_scrum.py:1105
3156+#, python-format
3157+msgid "You can not cancel a product backlog if all release backlogs related to it are not cancelled or done"
3158+msgstr "No puedes cancelar una pila de producto si todos las pilas de liberación relacionadas no se encuentran canceladas o hechas"
3159+
3160+#. module: project_scrum
3161+#: help:project.scrum.release.backlog,deadline:0
3162+msgid "Calculated Deadline, will be empty if any sprint has no deadline."
3163+msgstr "Fecha límite calculada, se encontrara vacía si algún sprint no tiene fecha límite."
3164+
3165+#. module: project_scrum
3166+#: view:project.scrum.feature:0
3167+msgid "Feature Summary"
3168+msgstr "Resumen de característica"
3169+
3170+#. module: project_scrum
3171+#: model:ir.actions.act_window,help:project_scrum.action_product_backlog
3172+msgid "<p class=\"oe_view_nocontent_create\">Create new Product Backlog</p>\n"
3173+" "
3174+msgstr "<p class=\"oe_view_nocontent_create\">Crear nueva pila de producto</p>\n"
3175+" "
3176+
3177+#. module: project_scrum
3178+#: help:project.scrum.feature,partner_id:0
3179+msgid "Contact or person responsible of keeping the business perspective in scrum projects."
3180+msgstr "Contacto o persona responsable de mantener la perspectiva del negocio en proyectos scrum."
3181+
3182+#. module: project_scrum
3183+#: view:project.scrum.feature:0
3184+#: view:project.scrum.product.backlog:0
3185+#: view:project.scrum.release.backlog:0
3186+#: view:project.scrum.sprint:0
3187+msgid "Delete"
3188+msgstr "Suprimir"
3189+
3190+#. module: project_scrum
3191+#: field:project.scrum.feature,task_ids:0
3192+#: view:project.scrum.sprint:0
3193+#: field:project.scrum.sprint,task_ids:0
3194+msgid "Tasks"
3195+msgstr "Tareas"
3196+
3197+#. module: project_scrum
3198+#: sql_constraint:project.scrum.feature:0
3199+msgid "Code must be unique for every feature related to a Product Backlog"
3200+msgstr "El código debe ser único para cada característica relacionada a la pila de producto"
3201+
3202+#. module: project_scrum
3203+#: view:project.scrum.sprint:0
3204+msgid "Are you sure you want to mark all features related to this sprint as done?"
3205+msgstr "¿Estás seguro que deseas marcar todas las características relacionadas a este sprint como realizadas?"
3206+
3207+#. module: project_scrum
3208+#: constraint:project.scrum.feature:0
3209+#: constraint:project.scrum.sprint:0
3210+msgid "The selected Release Backlog must belong to the selected Product Backlog"
3211+msgstr "La pila de liberación seleccionada debe pertenecer a la pila de producto seleccionada"
3212+
3213+#. module: project_scrum
3214+#: constraint:project.task:0
3215+msgid "The selected Release Backlog must belong to the selected Product Backlog."
3216+msgstr "La pila de liberación seleccionada debe pertenecer a la pila de producto seleccionada."
3217+
3218+#. module: project_scrum
3219+#: view:project.scrum.sprint:0
3220+msgid "Are you sure you want to set as done this sprint?"
3221+msgstr "¿Estás seguro que deseas marcar como realizado este sprint?"
3222+
3223+#. module: project_scrum
3224+#: field:project.scrum.feature,date_start:0
3225+#: field:project.scrum.release.backlog,date_start:0
3226+#: field:project.scrum.sprint,date_start:0
3227+msgid "Start Date"
3228+msgstr "Fecha inicial"
3229+
3230+#. module: project_scrum
3231+#: help:project.scrum.release.backlog,effective_hours:0
3232+msgid "Total spent hours calculated from sprints."
3233+msgstr "Total de horas consumidas calculadas de los sprints."
3234+
3235+#. module: project_scrum
3236+#: view:project.scrum.product.backlog:0
3237+#: field:project.scrum.product.backlog,member_ids:0
3238+#: view:project.scrum.sprint:0
3239+#: field:project.scrum.sprint,member_ids:0
3240+msgid "Team Members"
3241+msgstr "Miembros del Equipo"
3242+
3243+#. module: project_scrum
3244+#: help:project.scrum.feature,expected_hours:0
3245+msgid "Total planned hours for the development of this feature.\n"
3246+"Recommended values are:\n"
3247+" 1h, 2h, 4h, or 8h"
3248+msgstr "Total de horas planneadas para el desarrollo de esta característica.\n"
3249+"Los valores recomendados son:\n"
3250+" 1h, 2h, 4h, o 8h"
3251+
3252+#. module: project_scrum
3253+#: model:ir.actions.act_window,help:project_scrum.action_sprint
3254+msgid "<p class=\"oe_view_nocontent_create\">Create new Sprint</p>\n"
3255+" "
3256+msgstr "<p class=\"oe_view_nocontent_create\">Crear un nuevo sprint</p>\n"
3257+" "
3258+
3259+#. module: project_scrum
3260+#: view:project.scrum.feature:0
3261+msgid "Code..."
3262+msgstr "Código"
3263+
3264+#. module: project_scrum
3265+#: view:project.scrum.feature:0
3266+msgid "Low"
3267+msgstr "Baja"
3268+
3269+#. module: project_scrum
3270+#: view:project.scrum.product.backlog:0
3271+#: view:project.scrum.release.backlog:0
3272+#: view:project.scrum.sprint:0
3273+msgid "Closed"
3274+msgstr "Cerrado"
3275+
3276+#. module: project_scrum
3277+#: code:addons/project_scrum/project_scrum.py:442
3278+#, python-format
3279+msgid "All tasks were created before."
3280+msgstr "Todas las tareas fueron creadas anteriormente."
3281+
3282+#. module: project_scrum
3283+#: view:project.scrum.product.backlog:0
3284+msgid "Are you sure you want to cancel this product backlog?"
3285+msgstr "¿Estás seguro que deseas cancelar esta pila de producto?"
3286+
3287+#. module: project_scrum
3288+#: field:project.scrum.feature,state:0
3289+msgid "Status"
3290+msgstr "Estado"
3291+
3292+#. module: project_scrum
3293+#: view:project.scrum.feature:0
3294+#: view:project.scrum.product.backlog:0
3295+#: view:project.scrum.release.backlog:0
3296+#: view:project.scrum.sprint:0
3297+msgid "í"
3298+msgstr "í"
3299+
3300+#. module: project_scrum
3301+#: field:project.scrum.sprint,task_from_features:0
3302+msgid "Tasks from features"
3303+msgstr "Tareas de características"
3304+
3305+#. module: project_scrum
3306+#: field:project.scrum.feature,partner_id:0
3307+msgid "Product Owner"
3308+msgstr "Propietario del producto"
3309+
3310+#. module: project_scrum
3311+#: view:project.scrum.sprint:0
3312+msgid "Are you sure you want to cancel this sprint?"
3313+msgstr "¿Estás seguro que deseas cancelar este sprint?"
3314+
3315+#. module: project_scrum
3316+#: model:ir.actions.act_window,help:project_scrum.action_feature_type
3317+msgid "<p class=\"oe_view_nocontent_create\">Create new Feature Type</p>\n"
3318+" "
3319+msgstr "<p class=\"oe_view_nocontent_create\">Crear nuevo tipo de característica</p>\n"
3320+" "
3321+
3322+#. module: project_scrum
3323+#: code:addons/project_scrum/project_scrum.py:891
3324+#: code:addons/project_scrum/project_scrum.py:1098
3325+#, python-format
3326+msgid "There is no cancelled state configured for the project %s"
3327+msgstr "No hay un estado cancelado configurado para el proyecto %s"
3328+
3329+#. module: project_scrum
3330+#: code:addons/project_scrum/project_scrum.py:1088
3331+#, python-format
3332+msgid "You can not set as done a product backlog if all release backlogs related to it are not cancelled or done"
3333+msgstr "No puedes marcar como realizada una pila de producto si todas las pilas de liberación relacionadas no se encuentran canceladas o realizadas"
3334+
3335+#. module: project_scrum
3336+#: code:addons/project_scrum/project_scrum.py:430
3337+#: code:addons/project_scrum/project_scrum.py:927
3338+#: code:addons/project_scrum/project_scrum.py:1134
3339+#, python-format
3340+msgid "There is no draft state configured."
3341+msgstr "No hay un estado borrador configurado."
3342+
3343+#. module: project_scrum
3344+#: field:project.scrum.feature,effective_hours:0
3345+#: field:project.scrum.product.backlog,effective_hours:0
3346+#: field:project.scrum.release.backlog,effective_hours:0
3347+#: field:project.scrum.sprint,effective_hours:0
3348+msgid "Spent Hour(s)"
3349+msgstr "Horas consumidas"
3350+
3351+#. module: project_scrum
3352+#: field:project.scrum.feature,name:0
3353+msgid "Feature Name"
3354+msgstr "Nombre de la característica"
3355+
3356+#. module: project_scrum
3357+#: view:project.scrum.feature.type:0
3358+#: field:project.task,feature_type_id:0
3359+msgid "Feature Type"
3360+msgstr "Tipo de característica"
3361+
3362+#. module: project_scrum
3363+#: help:project.scrum.release.backlog,progress:0
3364+msgid "Total progress percentage calculated from sprints"
3365+msgstr "Porcentaje de progreso total calculado de los sprints"
3366+
3367+#. module: project_scrum
3368+#: code:addons/project_scrum/project_scrum.py:430
3369+#: code:addons/project_scrum/project_scrum.py:442
3370+#: code:addons/project_scrum/project_scrum.py:476
3371+#: code:addons/project_scrum/project_scrum.py:492
3372+#: code:addons/project_scrum/project_scrum.py:874
3373+#: code:addons/project_scrum/project_scrum.py:881
3374+#: code:addons/project_scrum/project_scrum.py:891
3375+#: code:addons/project_scrum/project_scrum.py:898
3376+#: code:addons/project_scrum/project_scrum.py:927
3377+#: code:addons/project_scrum/project_scrum.py:1081
3378+#: code:addons/project_scrum/project_scrum.py:1088
3379+#: code:addons/project_scrum/project_scrum.py:1098
3380+#: code:addons/project_scrum/project_scrum.py:1105
3381+#: code:addons/project_scrum/project_scrum.py:1134
3382+#, python-format
3383+msgid "Error"
3384+msgstr "Error"
3385+
3386+#. module: project_scrum
3387+#: field:project.scrum.feature,code:0
3388+#: field:project.scrum.feature.type,code:0
3389+msgid "Code"
3390+msgstr "Código"
3391+
3392+#. module: project_scrum
3393+#: model:ir.actions.act_window,name:project_scrum.action_feature
3394+#: model:ir.ui.menu,name:project_scrum.menu_feature
3395+#: view:project.scrum.product.backlog:0
3396+#: field:project.scrum.product.backlog,feature_ids:0
3397+#: view:project.scrum.release.backlog:0
3398+#: field:project.scrum.release.backlog,feature_ids:0
3399+#: view:project.scrum.sprint:0
3400+#: field:project.scrum.sprint,feature_ids:0
3401+msgid "Features"
3402+msgstr "Características"
3403+
3404+#. module: project_scrum
3405+#: model:project.scrum.feature.type,name:project_scrum.data_feature_type_sales
3406+msgid "Sales"
3407+msgstr "Ventas"
3408+
3409+#. module: project_scrum
3410+#: help:project.scrum.release.backlog,date_start:0
3411+msgid "Calculated Start Date, will be empty if any sprint has no start date."
3412+msgstr "Fecha inicial calculadada, se encontrara vacía si algún sprint no posee fecha inicial. "
3413+
3414+#. module: project_scrum
3415+#: help:project.scrum.product.backlog,progress:0
3416+msgid "Total progress percentage calculated from features"
3417+msgstr "Porcentaje de progresos total calculado de las características"
3418+
3419+#. module: project_scrum
3420+#: code:addons/project_scrum/project_scrum.py:477
3421+#: code:addons/project_scrum/project_scrum.py:493
3422+#, python-format
3423+msgid "All tasks must be done or cancelled in order to cancel this sprint."
3424+msgstr "Todas las tareas deben ser realizadas o canceladas para cancelar este sprint."
3425+
3426+#. module: project_scrum
3427+#: view:project.scrum.feature:0
3428+#: view:project.scrum.product.backlog:0
3429+#: view:project.scrum.release.backlog:0
3430+#: view:project.scrum.sprint:0
3431+msgid "Cancel"
3432+msgstr "Cancelar"
3433+
3434+#. module: project_scrum
3435+#: view:project.scrum.feature:0
3436+msgid "Open"
3437+msgstr "Abrir"
3438+
3439+#. module: project_scrum
3440+#: field:project.scrum.feature.type,name:0
3441+msgid "Type Name"
3442+msgstr "Nombre de tipo"
3443+
3444+#. module: project_scrum
3445+#: view:project.scrum.feature:0
3446+#: selection:project.scrum.feature,state:0
3447+#: view:project.scrum.product.backlog:0
3448+#: selection:project.scrum.product.backlog,state:0
3449+#: view:project.scrum.release.backlog:0
3450+#: selection:project.scrum.release.backlog,state:0
3451+#: view:project.scrum.sprint:0
3452+msgid "In Progress"
3453+msgstr "En progreso"
3454+
3455+#. module: project_scrum
3456+#: view:project.scrum.feature:0
3457+#: view:project.scrum.product.backlog:0
3458+#: view:project.scrum.release.backlog:0
3459+#: view:project.scrum.sprint:0
3460+msgid "Remaining Hours"
3461+msgstr "Horas restantes"
3462+
3463+#. module: project_scrum
3464+#: help:project.scrum.sprint,feature_ids:0
3465+msgid "Features to be developed in this sprint"
3466+msgstr "Características para ser desarrolladas en este sprint"
3467+
3468+#. module: project_scrum
3469+#: model:ir.actions.act_window,name:project_scrum.action_release_backlog
3470+#: view:project.scrum.feature:0
3471+#: field:project.scrum.feature,release_backlog_id:0
3472+#: view:project.scrum.release.backlog:0
3473+#: view:project.scrum.sprint:0
3474+#: field:project.scrum.sprint,release_backlog_id:0
3475+#: field:project.task,release_backlog_id:0
3476+msgid "Release Backlog"
3477+msgstr "Pila de liberación"
3478+
3479+#. module: project_scrum
3480+#: view:project.scrum.feature:0
3481+#: field:project.task,feature_id:0
3482+msgid "Feature"
3483+msgstr "Característica"
3484+
3485+#. module: project_scrum
3486+#: view:project.scrum.product.backlog:0
3487+#: view:project.scrum.release.backlog:0
3488+msgid "My Backlogs"
3489+msgstr "Mis pilas"
3490+
3491+#. module: project_scrum
3492+#: view:project.scrum.feature:0
3493+msgid "Very Low"
3494+msgstr "Muy baja"
3495+
3496+#. module: project_scrum
3497+#: view:project.scrum.product.backlog:0
3498+#: view:project.scrum.release.backlog:0
3499+msgid "Are you sure you want to set as done this release backlog?"
3500+msgstr "¿Estás seguro que quieres marcar como realizada esta pila de liberación?"
3501+
3502+#. module: project_scrum
3503+#: constraint:project.task:0
3504+msgid "There was an error checking the relationship between tasks. Please check if you selected an invalid task."
3505+msgstr "Hubo un error al comprobar la relación entre tareas. Por favor, compruebe si ha seleccionado una tareas inválida."
3506+
3507+#. module: project_scrum
3508+#: view:project.scrum.feature:0
3509+#: field:project.scrum.feature,description:0
3510+msgid "Description"
3511+msgstr "Descripción"
3512+
3513+#. module: project_scrum
3514+#: view:project.scrum.sprint:0
3515+msgid "Features Done"
3516+msgstr "Características Realizadas"
3517+
3518+#. module: project_scrum
3519+#: field:project.scrum.release.backlog,name:0
3520+msgid "Release Name"
3521+msgstr "Nombre de la liberación"
3522+
3523+#. module: project_scrum
3524+#: sql_constraint:project.scrum.feature.type:0
3525+msgid "Code must be unique for every feature type."
3526+msgstr "El código debe ser único para cada característica."
3527+
3528+#. module: project_scrum
3529+#: code:addons/project_scrum/project_scrum.py:874
3530+#: code:addons/project_scrum/project_scrum.py:1081
3531+#, python-format
3532+msgid "There is no done state configured for the project %s"
3533+msgstr "No hay un estado realizado configurado para el proyecto %s"
3534+
3535+#. module: project_scrum
3536+#: field:project.scrum.sprint,name:0
3537+msgid "Sprint Name"
3538+msgstr "Nombre del sprint"
3539+
3540+#. module: project_scrum
3541+#: model:ir.ui.menu,name:project_scrum.menu_scrum
3542+msgid "Scrum Project"
3543+msgstr "Scrum Project"
3544+
3545+#. module: project_scrum
3546+#: help:project.scrum.product.backlog,date_end:0
3547+msgid "Calculated End Date, will be empty if any feature has no end date."
3548+msgstr "Fecha final calculada, se encontrará vacía si alguna característica no posee fecha final."
3549+
3550+#. module: project_scrum
3551+#: help:project.scrum.product.backlog,deadline:0
3552+msgid "Calculated Deadline, will be empty if any feature has no deadline."
3553+msgstr "Fecha límite calculada, se encontrará vacía si a lguna característica no posee fecha límite."
3554+
3555+#. module: project_scrum
3556+#: model:ir.actions.act_window,help:project_scrum.action_feature
3557+msgid "<p class=\"oe_view_nocontent_create\">Create new Feature</p>\n"
3558+" "
3559+msgstr "<p class=\"oe_view_nocontent_create\">Crear nueva característica</p>\n"
3560+" "
3561+
3562+#. module: project_scrum
3563+#: help:project.scrum.release.backlog,date_end:0
3564+msgid "Calculated End Date, will be empty if any sprint has no end date."
3565+msgstr "Fecha final calculada, se encontrará vacía si algún sprint no posee fecha final."
3566+
3567+#. module: project_scrum
3568+#: view:project.scrum.sprint:0
3569+msgid "Tasks from Features"
3570+msgstr "Tareas de características"
3571+
3572+#. module: project_scrum
3573+#: code:addons/project_scrum/project_scrum.py:898
3574+#, python-format
3575+msgid "You can not cancel a release backlog if all sprints related to it are not cancelled or done"
3576+msgstr "No puedes cancelar una pila de liberación si todos los sprints relacionados no se encuentran cancelados o realizados"
3577+
3578+#. module: project_scrum
3579+#: help:project.scrum.feature,remaining_hours:0
3580+#: help:project.scrum.product.backlog,remaining_hours:0
3581+#: help:project.scrum.release.backlog,remaining_hours:0
3582+msgid "Difference between planned hours and spent hours."
3583+msgstr "Diferencia entre horas planeadas y consumidas."
3584+
3585+#. module: project_scrum
3586+#: view:project.scrum.feature:0
3587+msgid "Medium"
3588+msgstr "Media"
3589+
3590+#. module: project_scrum
3591+#: model:ir.actions.act_window,name:project_scrum.action_feature_type
3592+#: model:ir.ui.menu,name:project_scrum.menu_feature_type
3593+msgid "Feature Types"
3594+msgstr "Tipos de característica"
3595+
3596+#. module: project_scrum
3597+#: view:project.task:0
3598+msgid "Sequence"
3599+msgstr "Secuencia"
3600+
3601+#. module: project_scrum
3602+#: selection:project.scrum.feature,priority:0
3603+msgid "4 - Low"
3604+msgstr "4 - Baja"
3605+
3606+#. module: project_scrum
3607+#: view:project.scrum.feature:0
3608+msgid "High"
3609+msgstr "Alta"
3610+
3611+#. module: project_scrum
3612+#: view:project.scrum.feature:0
3613+msgid "Add a Description..."
3614+msgstr "Agregar una descripción..."
3615+
3616+#. module: project_scrum
3617+#: field:project.scrum.feature,remaining_hours:0
3618+#: field:project.scrum.product.backlog,remaining_hours:0
3619+#: field:project.scrum.release.backlog,remaining_hours:0
3620+#: field:project.scrum.sprint,remaining_hours:0
3621+msgid "Remaining Hour(s)"
3622+msgstr "Horas restantes"
3623+
3624+#. module: project_scrum
3625+#: code:addons/project_scrum/project_scrum.py:881
3626+#, python-format
3627+msgid "You can not set as done a release backlog if all sprints related to it are not cancelled or done"
3628+msgstr "No puedes marcar como realizada una pila de liberación si todos los sprints relacionado no se encuentran cancelados o realizados"
3629+
3630+#. module: project_scrum
3631+#: view:project.scrum.sprint:0
3632+#: field:project.task,sprint_id:0
3633+msgid "Sprint"
3634+msgstr "Sprint"
3635+
3636
3637=== added file 'project_scrum/i18n/project_scrum.pot'
3638--- project_scrum/i18n/project_scrum.pot 1970-01-01 00:00:00 +0000
3639+++ project_scrum/i18n/project_scrum.pot 2014-03-27 17:09:06 +0000
3640@@ -0,0 +1,820 @@
3641+# Translation of OpenERP Server.
3642+# This file contains the translation of the following modules:
3643+# * project_scrum
3644+#
3645+msgid ""
3646+msgstr ""
3647+"Project-Id-Version: OpenERP Server 7.0\n"
3648+"Report-Msgid-Bugs-To: \n"
3649+"POT-Creation-Date: 2014-03-21 21:11+0000\n"
3650+"PO-Revision-Date: 2014-03-21 21:11+0000\n"
3651+"Last-Translator: <>\n"
3652+"Language-Team: \n"
3653+"MIME-Version: 1.0\n"
3654+"Content-Type: text/plain; charset=UTF-8\n"
3655+"Content-Transfer-Encoding: \n"
3656+"Plural-Forms: \n"
3657+
3658+#. module: project_scrum
3659+#: model:project.scrum.feature.type,name:project_scrum.data_feature_type_hr
3660+msgid "Human Resources"
3661+msgstr ""
3662+
3663+#. module: project_scrum
3664+#: view:project.scrum.feature:0
3665+#: view:project.scrum.product.backlog:0
3666+#: view:project.scrum.release.backlog:0
3667+#: view:project.scrum.sprint:0
3668+msgid "Group By..."
3669+msgstr ""
3670+
3671+#. module: project_scrum
3672+#: view:project.scrum.feature:0
3673+msgid "My Features"
3674+msgstr ""
3675+
3676+#. module: project_scrum
3677+#: view:project.scrum.feature:0
3678+msgid "Very High"
3679+msgstr ""
3680+
3681+#. module: project_scrum
3682+#: view:project.task:0
3683+#: field:project.task,next_task_ids:0
3684+msgid "Next Tasks"
3685+msgstr ""
3686+
3687+#. module: project_scrum
3688+#: view:project.scrum.release.backlog:0
3689+msgid "Are you sure you want to cancel this release backlog?"
3690+msgstr ""
3691+
3692+#. module: project_scrum
3693+#: constraint:project.scrum.sprint:0
3694+msgid "Deadline must be greater than Start Date"
3695+msgstr ""
3696+
3697+#. module: project_scrum
3698+#: field:project.scrum.feature,progress:0
3699+#: field:project.scrum.product.backlog,progress:0
3700+#: field:project.scrum.release.backlog,progress:0
3701+#: field:project.scrum.sprint,progress:0
3702+msgid "Progress (%)"
3703+msgstr ""
3704+
3705+#. module: project_scrum
3706+#: field:project.scrum.feature,expected_hours:0
3707+#: field:project.scrum.product.backlog,expected_hours:0
3708+#: field:project.scrum.release.backlog,expected_hours:0
3709+#: field:project.scrum.sprint,expected_hours:0
3710+msgid "Initially Planned Hour(s)"
3711+msgstr ""
3712+
3713+#. module: project_scrum
3714+#: view:project.task:0
3715+#: field:project.task,previous_task_ids:0
3716+msgid "Previous Tasks"
3717+msgstr ""
3718+
3719+#. module: project_scrum
3720+#: view:project.scrum.feature:0
3721+#: selection:project.scrum.feature,state:0
3722+msgid "Approved"
3723+msgstr ""
3724+
3725+#. module: project_scrum
3726+#: selection:project.scrum.feature,priority:0
3727+msgid "2 - High"
3728+msgstr ""
3729+
3730+#. module: project_scrum
3731+#: model:project.scrum.feature.type,name:project_scrum.data_feature_type_account
3732+msgid "Account"
3733+msgstr ""
3734+
3735+#. module: project_scrum
3736+#: model:ir.model,name:project_scrum.model_project_task
3737+msgid "Task"
3738+msgstr ""
3739+
3740+#. module: project_scrum
3741+#: model:ir.actions.act_window,name:project_scrum.action_product_backlog
3742+#: view:project.scrum.feature:0
3743+#: field:project.scrum.feature,product_backlog_id:0
3744+#: view:project.scrum.product.backlog:0
3745+#: view:project.scrum.release.backlog:0
3746+#: field:project.scrum.release.backlog,product_backlog_id:0
3747+#: view:project.scrum.sprint:0
3748+#: field:project.scrum.sprint,product_backlog_id:0
3749+#: field:project.task,product_backlog_id:0
3750+msgid "Product Backlog"
3751+msgstr ""
3752+
3753+#. module: project_scrum
3754+#: model:ir.model,name:project_scrum.model_project_project
3755+#: view:project.scrum.feature:0
3756+#: field:project.scrum.feature,project_id:0
3757+#: model:project.scrum.feature.type,name:project_scrum.data_feature_type_project
3758+#: view:project.scrum.product.backlog:0
3759+#: field:project.scrum.product.backlog,project_id:0
3760+#: view:project.scrum.release.backlog:0
3761+#: field:project.scrum.release.backlog,project_id:0
3762+#: field:project.scrum.release.backlog,user_id:0
3763+#: view:project.scrum.sprint:0
3764+#: field:project.scrum.sprint,project_id:0
3765+msgid "Project"
3766+msgstr ""
3767+
3768+#. module: project_scrum
3769+#: selection:project.scrum.feature,priority:0
3770+msgid "1 - Very High"
3771+msgstr ""
3772+
3773+#. module: project_scrum
3774+#: view:project.scrum.sprint:0
3775+msgid "Are you sure you want to create a task for each feature related to this sprint?"
3776+msgstr ""
3777+
3778+#. module: project_scrum
3779+#: view:project.scrum.feature:0
3780+#: selection:project.scrum.feature,state:0
3781+#: view:project.scrum.product.backlog:0
3782+#: selection:project.scrum.product.backlog,state:0
3783+#: view:project.scrum.release.backlog:0
3784+#: selection:project.scrum.release.backlog,state:0
3785+#: view:project.scrum.sprint:0
3786+msgid "Cancelled"
3787+msgstr ""
3788+
3789+#. module: project_scrum
3790+#: field:project.scrum.feature,color:0
3791+#: field:project.scrum.product.backlog,color:0
3792+#: field:project.scrum.release.backlog,color:0
3793+#: field:project.scrum.sprint,color:0
3794+msgid "Color Index"
3795+msgstr ""
3796+
3797+#. module: project_scrum
3798+#: constraint:project.task:0
3799+msgid "The selected Feature must belong to the selected Sprint."
3800+msgstr ""
3801+
3802+#. module: project_scrum
3803+#: constraint:project.task:0
3804+msgid "The selected Sprint must belong to the selected Release Backlog."
3805+msgstr ""
3806+
3807+#. module: project_scrum
3808+#: model:ir.ui.menu,name:project_scrum.menu_release_backlog
3809+#: view:project.scrum.product.backlog:0
3810+#: field:project.scrum.product.backlog,release_backlog_ids:0
3811+msgid "Release Backlogs"
3812+msgstr ""
3813+
3814+#. module: project_scrum
3815+#: field:project.scrum.feature,deadline:0
3816+#: field:project.scrum.product.backlog,deadline:0
3817+#: field:project.scrum.release.backlog,deadline:0
3818+#: field:project.scrum.sprint,deadline:0
3819+msgid "Deadline"
3820+msgstr ""
3821+
3822+#. module: project_scrum
3823+#: view:project.scrum.sprint:0
3824+msgid "My Sprints"
3825+msgstr ""
3826+
3827+#. module: project_scrum
3828+#: help:project.scrum.release.backlog,expected_hours:0
3829+msgid "Total planned hours calculated from sprints."
3830+msgstr ""
3831+
3832+#. module: project_scrum
3833+#: view:project.scrum.feature:0
3834+#: view:project.scrum.product.backlog:0
3835+#: view:project.scrum.release.backlog:0
3836+#: view:project.scrum.sprint:0
3837+msgid "Edit..."
3838+msgstr ""
3839+
3840+#. module: project_scrum
3841+#: help:project.scrum.feature,effective_hours:0
3842+msgid "Total effective hours from tasks related to this feature."
3843+msgstr ""
3844+
3845+#. module: project_scrum
3846+#: model:ir.actions.act_window,name:project_scrum.action_sprint
3847+#: model:ir.ui.menu,name:project_scrum.menu_sprint
3848+#: view:project.scrum.feature:0
3849+#: field:project.scrum.feature,sprint_ids:0
3850+#: view:project.scrum.release.backlog:0
3851+#: field:project.scrum.release.backlog,sprint_ids:0
3852+msgid "Sprints"
3853+msgstr ""
3854+
3855+#. module: project_scrum
3856+#: help:project.scrum.feature,sprint_ids:0
3857+msgid "Sprints in which the feature has been used."
3858+msgstr ""
3859+
3860+#. module: project_scrum
3861+#: field:project.scrum.feature,date_end:0
3862+#: field:project.scrum.product.backlog,date_end:0
3863+#: field:project.scrum.release.backlog,date_end:0
3864+#: field:project.scrum.sprint,date_end:0
3865+msgid "End Date"
3866+msgstr ""
3867+
3868+#. module: project_scrum
3869+#: model:ir.actions.act_window,help:project_scrum.action_release_backlog
3870+msgid "<p class=\"oe_view_nocontent_create\">Create new Release Backlog</p>\n"
3871+" "
3872+msgstr ""
3873+
3874+#. module: project_scrum
3875+#: view:project.scrum.feature:0
3876+#: field:project.scrum.feature,priority:0
3877+msgid "Priority"
3878+msgstr ""
3879+
3880+#. module: project_scrum
3881+#: field:project.scrum.product.backlog,state:0
3882+#: field:project.scrum.release.backlog,state:0
3883+#: field:project.scrum.sprint,state:0
3884+msgid "State"
3885+msgstr ""
3886+
3887+#. module: project_scrum
3888+#: constraint:project.task:0
3889+msgid "The selected Product Backlog must belong to the selected Project."
3890+msgstr ""
3891+
3892+#. module: project_scrum
3893+#: view:project.scrum.feature:0
3894+#: selection:project.scrum.feature,state:0
3895+#: view:project.scrum.product.backlog:0
3896+#: selection:project.scrum.product.backlog,state:0
3897+#: view:project.scrum.release.backlog:0
3898+#: selection:project.scrum.release.backlog,state:0
3899+#: view:project.scrum.sprint:0
3900+msgid "New"
3901+msgstr ""
3902+
3903+#. module: project_scrum
3904+#: view:project.scrum.feature:0
3905+#: field:project.scrum.feature,type_id:0
3906+msgid "Type"
3907+msgstr ""
3908+
3909+#. module: project_scrum
3910+#: view:project.scrum.feature:0
3911+#: field:project.scrum.feature,user_id:0
3912+#: view:project.scrum.product.backlog:0
3913+#: field:project.scrum.product.backlog,user_id:0
3914+#: view:project.scrum.release.backlog:0
3915+#: view:project.scrum.sprint:0
3916+#: field:project.scrum.sprint,user_id:0
3917+msgid "Scrum Master"
3918+msgstr ""
3919+
3920+#. module: project_scrum
3921+#: model:ir.ui.menu,name:project_scrum.menu_product_backlog
3922+msgid "Product Backlogs"
3923+msgstr ""
3924+
3925+#. module: project_scrum
3926+#: selection:project.scrum.feature,priority:0
3927+msgid "5 - Very Low"
3928+msgstr ""
3929+
3930+#. module: project_scrum
3931+#: field:project.project,is_scrum:0
3932+#: field:project.task,is_scrum:0
3933+msgid "Scrum"
3934+msgstr ""
3935+
3936+#. module: project_scrum
3937+#: help:project.scrum.product.backlog,expected_hours:0
3938+msgid "Total planned hours calculated from features."
3939+msgstr ""
3940+
3941+#. module: project_scrum
3942+#: view:project.scrum.product.backlog:0
3943+#: selection:project.scrum.product.backlog,state:0
3944+#: view:project.scrum.release.backlog:0
3945+#: selection:project.scrum.release.backlog,state:0
3946+#: view:project.scrum.sprint:0
3947+msgid "Pending"
3948+msgstr ""
3949+
3950+#. module: project_scrum
3951+#: field:project.scrum.product.backlog,name:0
3952+msgid "Product Name"
3953+msgstr ""
3954+
3955+#. module: project_scrum
3956+#: view:project.scrum.feature:0
3957+#: selection:project.scrum.feature,state:0
3958+#: view:project.scrum.product.backlog:0
3959+#: selection:project.scrum.product.backlog,state:0
3960+#: view:project.scrum.release.backlog:0
3961+#: selection:project.scrum.release.backlog,state:0
3962+#: view:project.scrum.sprint:0
3963+msgid "Done"
3964+msgstr ""
3965+
3966+#. module: project_scrum
3967+#: view:project.scrum.feature:0
3968+#: view:project.scrum.product.backlog:0
3969+#: field:project.scrum.product.backlog,stage_id:0
3970+#: view:project.scrum.release.backlog:0
3971+#: field:project.scrum.release.backlog,stage_id:0
3972+#: view:project.scrum.sprint:0
3973+#: field:project.scrum.sprint,stage_id:0
3974+msgid "Stage"
3975+msgstr ""
3976+
3977+#. module: project_scrum
3978+#: selection:project.scrum.feature,priority:0
3979+msgid "3 - Medium"
3980+msgstr ""
3981+
3982+#. module: project_scrum
3983+#: help:project.scrum.product.backlog,effective_hours:0
3984+msgid "Total spent hours calculated from features."
3985+msgstr ""
3986+
3987+#. module: project_scrum
3988+#: code:addons/project_scrum/project_scrum.py:1105
3989+#, python-format
3990+msgid "You can not cancel a product backlog if all release backlogs related to it are not cancelled or done"
3991+msgstr ""
3992+
3993+#. module: project_scrum
3994+#: help:project.scrum.release.backlog,deadline:0
3995+msgid "Calculated Deadline, will be empty if any sprint has no deadline."
3996+msgstr ""
3997+
3998+#. module: project_scrum
3999+#: view:project.scrum.feature:0
4000+msgid "Feature Summary"
4001+msgstr ""
4002+
4003+#. module: project_scrum
4004+#: model:ir.actions.act_window,help:project_scrum.action_product_backlog
4005+msgid "<p class=\"oe_view_nocontent_create\">Create new Product Backlog</p>\n"
4006+" "
4007+msgstr ""
4008+
4009+#. module: project_scrum
4010+#: help:project.scrum.feature,partner_id:0
4011+msgid "Contact or person responsible of keeping the business perspective in scrum projects."
4012+msgstr ""
4013+
4014+#. module: project_scrum
4015+#: view:project.scrum.feature:0
4016+#: view:project.scrum.product.backlog:0
4017+#: view:project.scrum.release.backlog:0
4018+#: view:project.scrum.sprint:0
4019+msgid "Delete"
4020+msgstr ""
4021+
4022+#. module: project_scrum
4023+#: field:project.scrum.feature,task_ids:0
4024+#: view:project.scrum.sprint:0
4025+#: field:project.scrum.sprint,task_ids:0
4026+msgid "Tasks"
4027+msgstr ""
4028+
4029+#. module: project_scrum
4030+#: sql_constraint:project.scrum.feature:0
4031+msgid "Code must be unique for every feature related to a Product Backlog"
4032+msgstr ""
4033+
4034+#. module: project_scrum
4035+#: view:project.scrum.sprint:0
4036+msgid "Are you sure you want to mark all features related to this sprint as done?"
4037+msgstr ""
4038+
4039+#. module: project_scrum
4040+#: constraint:project.scrum.feature:0
4041+#: constraint:project.scrum.sprint:0
4042+msgid "The selected Release Backlog must belong to the selected Product Backlog"
4043+msgstr ""
4044+
4045+#. module: project_scrum
4046+#: constraint:project.task:0
4047+msgid "The selected Release Backlog must belong to the selected Product Backlog."
4048+msgstr ""
4049+
4050+#. module: project_scrum
4051+#: view:project.scrum.sprint:0
4052+msgid "Are you sure you want to set as done this sprint?"
4053+msgstr ""
4054+
4055+#. module: project_scrum
4056+#: field:project.scrum.feature,date_start:0
4057+#: field:project.scrum.release.backlog,date_start:0
4058+#: field:project.scrum.sprint,date_start:0
4059+msgid "Start Date"
4060+msgstr ""
4061+
4062+#. module: project_scrum
4063+#: help:project.scrum.release.backlog,effective_hours:0
4064+msgid "Total spent hours calculated from sprints."
4065+msgstr ""
4066+
4067+#. module: project_scrum
4068+#: view:project.scrum.product.backlog:0
4069+#: field:project.scrum.product.backlog,member_ids:0
4070+#: view:project.scrum.sprint:0
4071+#: field:project.scrum.sprint,member_ids:0
4072+msgid "Team Members"
4073+msgstr ""
4074+
4075+#. module: project_scrum
4076+#: help:project.scrum.feature,expected_hours:0
4077+msgid "Total planned hours for the development of this feature.\n"
4078+"Recommended values are:\n"
4079+" 1h, 2h, 4h, or 8h"
4080+msgstr ""
4081+
4082+#. module: project_scrum
4083+#: model:ir.actions.act_window,help:project_scrum.action_sprint
4084+msgid ""
4085+
4086+#. module: project_scrum
4087+#: view:project.scrum.feature:0
4088+msgid "Code..."
4089+msgstr ""
4090+
4091+#. module: project_scrum
4092+#: view:project.scrum.feature:0
4093+msgid "Low"
4094+msgstr ""
4095+
4096+#. module: project_scrum
4097+#: view:project.scrum.product.backlog:0
4098+#: view:project.scrum.release.backlog:0
4099+#: view:project.scrum.sprint:0
4100+msgid "Closed"
4101+msgstr ""
4102+
4103+#. module: project_scrum
4104+#: code:addons/project_scrum/project_scrum.py:442
4105+#, python-format
4106+msgid "All tasks were created before."
4107+msgstr ""
4108+
4109+#. module: project_scrum
4110+#: view:project.scrum.product.backlog:0
4111+msgid "Are you sure you want to cancel this product backlog?"
4112+msgstr ""
4113+
4114+#. module: project_scrum
4115+#: field:project.scrum.feature,state:0
4116+msgid "Status"
4117+msgstr ""
4118+
4119+#. module: project_scrum
4120+#: view:project.scrum.feature:0
4121+#: view:project.scrum.product.backlog:0
4122+#: view:project.scrum.release.backlog:0
4123+#: view:project.scrum.sprint:0
4124+msgid "í"
4125+msgstr ""
4126+
4127+#. module: project_scrum
4128+#: field:project.scrum.sprint,task_from_features:0
4129+msgid "Tasks from features"
4130+msgstr ""
4131+
4132+#. module: project_scrum
4133+#: field:project.scrum.feature,partner_id:0
4134+msgid "Product Owner"
4135+msgstr ""
4136+
4137+#. module: project_scrum
4138+#: view:project.scrum.sprint:0
4139+msgid "Are you sure you want to cancel this sprint?"
4140+msgstr ""
4141+
4142+#. module: project_scrum
4143+#: model:ir.actions.act_window,help:project_scrum.action_feature_type
4144+msgid "<p class=\"oe_view_nocontent_create\">Create new Feature Type</p>\n"
4145+" "
4146+msgstr ""
4147+
4148+#. module: project_scrum
4149+#: code:addons/project_scrum/project_scrum.py:891
4150+#: code:addons/project_scrum/project_scrum.py:1098
4151+#, python-format
4152+msgid "There is no cancelled state configured for the project %s"
4153+msgstr ""
4154+
4155+#. module: project_scrum
4156+#: code:addons/project_scrum/project_scrum.py:1088
4157+#, python-format
4158+msgid "You can not set as done a product backlog if all release backlogs related to it are not cancelled or done"
4159+msgstr ""
4160+
4161+#. module: project_scrum
4162+#: code:addons/project_scrum/project_scrum.py:430
4163+#: code:addons/project_scrum/project_scrum.py:927
4164+#: code:addons/project_scrum/project_scrum.py:1134
4165+#, python-format
4166+msgid "There is no draft state configured."
4167+msgstr ""
4168+
4169+#. module: project_scrum
4170+#: field:project.scrum.feature,effective_hours:0
4171+#: field:project.scrum.product.backlog,effective_hours:0
4172+#: field:project.scrum.release.backlog,effective_hours:0
4173+#: field:project.scrum.sprint,effective_hours:0
4174+msgid "Spent Hour(s)"
4175+msgstr ""
4176+
4177+#. module: project_scrum
4178+#: field:project.scrum.feature,name:0
4179+msgid "Feature Name"
4180+msgstr ""
4181+
4182+#. module: project_scrum
4183+#: view:project.scrum.feature.type:0
4184+#: field:project.task,feature_type_id:0
4185+msgid "Feature Type"
4186+msgstr ""
4187+
4188+#. module: project_scrum
4189+#: help:project.scrum.release.backlog,progress:0
4190+msgid "Total progress percentage calculated from sprints"
4191+msgstr ""
4192+
4193+#. module: project_scrum
4194+#: code:addons/project_scrum/project_scrum.py:430
4195+#: code:addons/project_scrum/project_scrum.py:442
4196+#: code:addons/project_scrum/project_scrum.py:476
4197+#: code:addons/project_scrum/project_scrum.py:492
4198+#: code:addons/project_scrum/project_scrum.py:874
4199+#: code:addons/project_scrum/project_scrum.py:881
4200+#: code:addons/project_scrum/project_scrum.py:891
4201+#: code:addons/project_scrum/project_scrum.py:898
4202+#: code:addons/project_scrum/project_scrum.py:927
4203+#: code:addons/project_scrum/project_scrum.py:1081
4204+#: code:addons/project_scrum/project_scrum.py:1088
4205+#: code:addons/project_scrum/project_scrum.py:1098
4206+#: code:addons/project_scrum/project_scrum.py:1105
4207+#: code:addons/project_scrum/project_scrum.py:1134
4208+#, python-format
4209+msgid "Error"
4210+msgstr ""
4211+
4212+#. module: project_scrum
4213+#: field:project.scrum.feature,code:0
4214+#: field:project.scrum.feature.type,code:0
4215+msgid "Code"
4216+msgstr ""
4217+
4218+#. module: project_scrum
4219+#: model:ir.actions.act_window,name:project_scrum.action_feature
4220+#: model:ir.ui.menu,name:project_scrum.menu_feature
4221+#: view:project.scrum.product.backlog:0
4222+#: field:project.scrum.product.backlog,feature_ids:0
4223+#: view:project.scrum.release.backlog:0
4224+#: field:project.scrum.release.backlog,feature_ids:0
4225+#: view:project.scrum.sprint:0
4226+#: field:project.scrum.sprint,feature_ids:0
4227+msgid "Features"
4228+msgstr ""
4229+
4230+#. module: project_scrum
4231+#: model:project.scrum.feature.type,name:project_scrum.data_feature_type_sales
4232+msgid "Sales"
4233+msgstr ""
4234+
4235+#. module: project_scrum
4236+#: help:project.scrum.release.backlog,date_start:0
4237+msgid "Calculated Start Date, will be empty if any sprint has no start date."
4238+msgstr ""
4239+
4240+#. module: project_scrum
4241+#: help:project.scrum.product.backlog,progress:0
4242+msgid "Total progress percentage calculated from features"
4243+msgstr ""
4244+
4245+#. module: project_scrum
4246+#: code:addons/project_scrum/project_scrum.py:477
4247+#: code:addons/project_scrum/project_scrum.py:493
4248+#, python-format
4249+msgid "All tasks must be done or cancelled in order to cancel this sprint."
4250+msgstr ""
4251+
4252+#. module: project_scrum
4253+#: view:project.scrum.feature:0
4254+#: view:project.scrum.product.backlog:0
4255+#: view:project.scrum.release.backlog:0
4256+#: view:project.scrum.sprint:0
4257+msgid "Cancel"
4258+msgstr ""
4259+
4260+#. module: project_scrum
4261+#: view:project.scrum.feature:0
4262+msgid "Open"
4263+msgstr ""
4264+
4265+#. module: project_scrum
4266+#: field:project.scrum.feature.type,name:0
4267+msgid "Type Name"
4268+msgstr ""
4269+
4270+#. module: project_scrum
4271+#: view:project.scrum.feature:0
4272+#: selection:project.scrum.feature,state:0
4273+#: view:project.scrum.product.backlog:0
4274+#: selection:project.scrum.product.backlog,state:0
4275+#: view:project.scrum.release.backlog:0
4276+#: selection:project.scrum.release.backlog,state:0
4277+#: view:project.scrum.sprint:0
4278+msgid "In Progress"
4279+msgstr ""
4280+
4281+#. module: project_scrum
4282+#: view:project.scrum.feature:0
4283+#: view:project.scrum.product.backlog:0
4284+#: view:project.scrum.release.backlog:0
4285+#: view:project.scrum.sprint:0
4286+msgid "Remaining Hours"
4287+msgstr ""
4288+
4289+#. module: project_scrum
4290+#: help:project.scrum.sprint,feature_ids:0
4291+msgid "Features to be developed in this sprint"
4292+msgstr ""
4293+
4294+#. module: project_scrum
4295+#: model:ir.actions.act_window,name:project_scrum.action_release_backlog
4296+#: view:project.scrum.feature:0
4297+#: field:project.scrum.feature,release_backlog_id:0
4298+#: view:project.scrum.release.backlog:0
4299+#: view:project.scrum.sprint:0
4300+#: field:project.scrum.sprint,release_backlog_id:0
4301+#: field:project.task,release_backlog_id:0
4302+msgid "Release Backlog"
4303+msgstr ""
4304+
4305+#. module: project_scrum
4306+#: view:project.scrum.feature:0
4307+#: field:project.task,feature_id:0
4308+msgid "Feature"
4309+msgstr ""
4310+
4311+#. module: project_scrum
4312+#: view:project.scrum.product.backlog:0
4313+#: view:project.scrum.release.backlog:0
4314+msgid "My Backlogs"
4315+msgstr ""
4316+
4317+#. module: project_scrum
4318+#: view:project.scrum.feature:0
4319+msgid "Very Low"
4320+msgstr ""
4321+
4322+#. module: project_scrum
4323+#: view:project.scrum.product.backlog:0
4324+#: view:project.scrum.release.backlog:0
4325+msgid "Are you sure you want to set as done this release backlog?"
4326+msgstr ""
4327+
4328+#. module: project_scrum
4329+#: constraint:project.task:0
4330+msgid "There was an error checking the relationship between tasks. Please check if you selected an invalid task."
4331+msgstr ""
4332+
4333+#. module: project_scrum
4334+#: view:project.scrum.feature:0
4335+#: field:project.scrum.feature,description:0
4336+msgid "Description"
4337+msgstr ""
4338+
4339+#. module: project_scrum
4340+#: view:project.scrum.sprint:0
4341+msgid "Features Done"
4342+msgstr ""
4343+
4344+#. module: project_scrum
4345+#: field:project.scrum.release.backlog,name:0
4346+msgid "Release Name"
4347+msgstr ""
4348+
4349+#. module: project_scrum
4350+#: sql_constraint:project.scrum.feature.type:0
4351+msgid "Code must be unique for every feature type."
4352+msgstr ""
4353+
4354+#. module: project_scrum
4355+#: code:addons/project_scrum/project_scrum.py:874
4356+#: code:addons/project_scrum/project_scrum.py:1081
4357+#, python-format
4358+msgid "There is no done state configured for the project %s"
4359+msgstr ""
4360+
4361+#. module: project_scrum
4362+#: field:project.scrum.sprint,name:0
4363+msgid "Sprint Name"
4364+msgstr ""
4365+
4366+#. module: project_scrum
4367+#: model:ir.ui.menu,name:project_scrum.menu_scrum
4368+msgid "Scrum Project"
4369+msgstr ""
4370+
4371+#. module: project_scrum
4372+#: help:project.scrum.product.backlog,date_end:0
4373+msgid "Calculated End Date, will be empty if any feature has no end date."
4374+msgstr ""
4375+
4376+#. module: project_scrum
4377+#: help:project.scrum.product.backlog,deadline:0
4378+msgid "Calculated Deadline, will be empty if any feature has no deadline."
4379+msgstr ""
4380+
4381+#. module: project_scrum
4382+#: model:ir.actions.act_window,help:project_scrum.action_feature
4383+msgid "<p class=\"oe_view_nocontent_create\">Create new Feature</p>\n"
4384+" "
4385+msgstr ""
4386+
4387+#. module: project_scrum
4388+#: help:project.scrum.release.backlog,date_end:0
4389+msgid "Calculated End Date, will be empty if any sprint has no end date."
4390+msgstr ""
4391+
4392+#. module: project_scrum
4393+#: view:project.scrum.sprint:0
4394+msgid "Tasks from Features"
4395+msgstr ""
4396+
4397+#. module: project_scrum
4398+#: code:addons/project_scrum/project_scrum.py:898
4399+#, python-format
4400+msgid "You can not cancel a release backlog if all sprints related to it are not cancelled or done"
4401+msgstr ""
4402+
4403+#. module: project_scrum
4404+#: help:project.scrum.feature,remaining_hours:0
4405+#: help:project.scrum.product.backlog,remaining_hours:0
4406+#: help:project.scrum.release.backlog,remaining_hours:0
4407+msgid "Difference between planned hours and spent hours."
4408+msgstr ""
4409+
4410+#. module: project_scrum
4411+#: view:project.scrum.feature:0
4412+msgid "Medium"
4413+msgstr ""
4414+
4415+#. module: project_scrum
4416+#: model:ir.actions.act_window,name:project_scrum.action_feature_type
4417+#: model:ir.ui.menu,name:project_scrum.menu_feature_type
4418+msgid "Feature Types"
4419+msgstr ""
4420+
4421+#. module: project_scrum
4422+#: view:project.task:0
4423+msgid "Sequence"
4424+msgstr ""
4425+
4426+#. module: project_scrum
4427+#: selection:project.scrum.feature,priority:0
4428+msgid "4 - Low"
4429+msgstr ""
4430+
4431+#. module: project_scrum
4432+#: view:project.scrum.feature:0
4433+msgid "High"
4434+msgstr ""
4435+
4436+#. module: project_scrum
4437+#: view:project.scrum.feature:0
4438+msgid "Add a Description..."
4439+msgstr ""
4440+
4441+#. module: project_scrum
4442+#: field:project.scrum.feature,remaining_hours:0
4443+#: field:project.scrum.product.backlog,remaining_hours:0
4444+#: field:project.scrum.release.backlog,remaining_hours:0
4445+#: field:project.scrum.sprint,remaining_hours:0
4446+msgid "Remaining Hour(s)"
4447+msgstr ""
4448+
4449+#. module: project_scrum
4450+#: code:addons/project_scrum/project_scrum.py:881
4451+#, python-format
4452+msgid "You can not set as done a release backlog if all sprints related to it are not cancelled or done"
4453+msgstr ""
4454+
4455+#. module: project_scrum
4456+#: view:project.scrum.sprint:0
4457+#: field:project.task,sprint_id:0
4458+msgid "Sprint"
4459+msgstr ""
4460+
4461
4462=== added file 'project_scrum/project_scrum.py'
4463--- project_scrum/project_scrum.py 1970-01-01 00:00:00 +0000
4464+++ project_scrum/project_scrum.py 2014-03-27 17:09:06 +0000
4465@@ -0,0 +1,1152 @@
4466+# -*- coding: utf-8 -*-
4467+##############################################################################
4468+#
4469+# OpenERP, Open Source Management Solution
4470+# Addons modules by CLEARCORP S.A.
4471+# Copyright (C) 2009-TODAY CLEARCORP S.A. (<http://clearcorp.co.cr>).
4472+#
4473+# This program is free software: you can redistribute it and/or modify
4474+# it under the terms of the GNU Affero General Public License as
4475+# published by the Free Software Foundation, either version 3 of the
4476+# License, or (at your option) any later version.
4477+#
4478+# This program is distributed in the hope that it will be useful,
4479+# but WITHOUT ANY WARRANTY; without even the implied warranty of
4480+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4481+# GNU Affero General Public License for more details.
4482+#
4483+# You should have received a copy of the GNU Affero General Public License
4484+# along with this program. If not, see <http://www.gnu.org/licenses/>.
4485+#
4486+##############################################################################
4487+
4488+from openerp.osv import osv, fields
4489+from openerp.tools.translate import _
4490+from datetime import datetime
4491+
4492+# Mapping between task priority and
4493+# feature priority
4494+PRIORITY = {
4495+ 5: '4',
4496+ 4: '3',
4497+ 3: '2',
4498+ 2: '1',
4499+ 1: '0',
4500+ }
4501+
4502+STATES = [('draft', 'New'),('open', 'In Progress'),
4503+ ('pending', 'Pending'), ('done', 'Done'),
4504+ ('cancelled', 'Cancelled')]
4505+
4506+class project(osv.Model):
4507+
4508+ _inherit = 'project.project'
4509+
4510+ _columns = {
4511+ 'is_scrum': fields.boolean('Scrum'),
4512+ }
4513+
4514+class featureType(osv.Model):
4515+
4516+ _name = 'project.scrum.feature.type'
4517+
4518+ _columns = {
4519+ 'code': fields.char('Code', size=16, required=True),
4520+ 'name': fields.char('Type Name', size=128, required=True, translate=True),
4521+ }
4522+
4523+ _sql_constraints = [('unique_code','UNIQUE(code)','Code must be unique for every feature type.')]
4524+
4525+ def name_get(self, cr, uid, ids, context=None):
4526+ res =[]
4527+ for r in self.read(cr, uid, ids, ['code', 'name'], context=context):
4528+ name = '%s - %s' %(r['code'],r['name'])
4529+ res.append((r['id'], name))
4530+ return res
4531+
4532+class Feature(osv.Model):
4533+
4534+ _name = 'project.scrum.feature'
4535+
4536+ def _date_start(self, cr, uid, ids, field_name, arg, context=None):
4537+ """Calculate the date_start based on the tasks from sprints
4538+ related to each feature"""
4539+ res = {}
4540+ for id in ids:
4541+ sprint_ids = [x.id for x in
4542+ self.browse(cr, uid, id,
4543+ context=context).sprint_ids]
4544+ task_obj = self.pool.get('project.task')
4545+ task_ids = task_obj.search(cr, uid,
4546+ [('sprint_id','in',sprint_ids),
4547+ ('feature_id','=',id),
4548+ '!',('state','in',['cancelled','draft'])],
4549+ context=context)
4550+ tasks = task_obj.browse(cr,uid,task_ids,context=context)
4551+ date_start = False
4552+ for task in tasks:
4553+ if task.date_start:
4554+ date = datetime.strptime(task.date_start,'%Y-%m-%d %H:%M:%S')
4555+ if not date_start:
4556+ date_start = date
4557+ else:
4558+ if date_start > date:
4559+ date_start = date
4560+ if date_start:
4561+ date_start = datetime.strftime(date_start,'%Y-%m-%d %H:%M:%S')
4562+ res[id] = date_start
4563+ return res
4564+
4565+ def _date_end(self, cr, uid, ids, field_name, arg, context=None):
4566+ """Calculate the end date based on the tasks from sprints
4567+ related to each feature"""
4568+ res = {}
4569+ for id in ids:
4570+ sprint_ids = [x.id for x in
4571+ self.browse(cr, uid, id,
4572+ context=context).sprint_ids]
4573+ task_obj = self.pool.get('project.task')
4574+ task_ids = task_obj.search(cr, uid,
4575+ [('sprint_id','in',sprint_ids),
4576+ ('feature_id','=',id),
4577+ '!',('state','in',['cancelled','draft'])],
4578+ context=context)
4579+ tasks = task_obj.browse(cr,uid,task_ids,context=context)
4580+ date_end = False
4581+ for task in tasks:
4582+ if task.date_end:
4583+ date = datetime.strptime(task.date_end,'%Y-%m-%d %H:%M:%S')
4584+ if not date_end:
4585+ date_end = date
4586+ else:
4587+ if date > date_end:
4588+ date_end = date
4589+ if date_end:
4590+ date_end = datetime.strftime(date_end,'%Y-%m-%d %H:%M:%S')
4591+ res[id] = date_end
4592+ return res
4593+
4594+ def _deadline(self, cr, uid, ids, field_name, arg, context=None):
4595+ """Calculate the deadline based on the tasks from sprints
4596+ related to each feature"""
4597+ res = {}
4598+ for id in ids:
4599+ sprint_ids = [x.id for x in
4600+ self.browse(cr, uid, id,
4601+ context=context).sprint_ids]
4602+ task_obj = self.pool.get('project.task')
4603+ task_ids = task_obj.search(cr, uid,
4604+ [('sprint_id','in',sprint_ids),
4605+ ('feature_id','=',id),
4606+ '!',('state','in',['cancelled','draft'])],
4607+ context=context)
4608+ tasks = task_obj.browse(cr,uid,task_ids,context=context)
4609+ deadline = False
4610+ for task in tasks:
4611+ if task.date_deadline:
4612+ date = datetime.strptime(task.date_deadline,'%Y-%m-%d')
4613+ if not deadline:
4614+ deadline = date
4615+ else:
4616+ if date > deadline:
4617+ deadline = date
4618+ if deadline:
4619+ deadline = datetime.strftime(deadline,'%Y-%m-%d')
4620+ res[id] = deadline
4621+ return res
4622+
4623+ def _effective_hours(self, cr, uid, ids, field_name, arg, context=None):
4624+ """Calculate the planned hours based on the tasks from sprints
4625+ related to each feature"""
4626+ res = {}
4627+ for id in ids:
4628+ sprint_ids = [x.id for x in
4629+ self.browse(cr, uid, id,
4630+ context=context).sprint_ids]
4631+ task_obj = self.pool.get('project.task')
4632+ task_ids = task_obj.search(cr, uid,
4633+ [('sprint_id','in',sprint_ids),
4634+ ('feature_id','=',id)],
4635+ context=context)
4636+ tasks = task_obj.browse(cr,uid,task_ids,context=context)
4637+ sum = reduce(lambda result,task: result+task.effective_hours,
4638+ tasks, 0.0)
4639+ res[id] = sum
4640+ return res
4641+
4642+ def _remaining_hours(self, cr, uid, ids, field_name, arg, context=None):
4643+ """Calculate the difference between planned and effective hours"""
4644+ res={}
4645+ features = self.browse(cr, uid, ids, context=context)
4646+ for feature in features:
4647+ res[feature.id] = feature.expected_hours - \
4648+ feature.effective_hours
4649+ return res
4650+
4651+ def _progress(self, cr, uid, ids, field_name, arg, context=None):
4652+ """Calculate the total progress based on the tasks from sprints
4653+ related to each feature"""
4654+ res = {}
4655+ for id in ids:
4656+ sprint_ids = [x.id for x in
4657+ self.browse(cr, uid, id,
4658+ context=context).sprint_ids]
4659+ task_obj = self.pool.get('project.task')
4660+ task_ids = task_obj.search(cr, uid,
4661+ [('sprint_id','in',sprint_ids),
4662+ ('feature_id','=',id)],
4663+ context=context)
4664+ tasks = task_obj.browse(cr,uid,task_ids,context=context)
4665+ if tasks:
4666+ sum = reduce(lambda result,task: result+task.progress,
4667+ tasks, 0.0)
4668+ res[id] = sum/len(tasks)
4669+ else:
4670+ res[id] = 0.0
4671+ return res
4672+
4673+ def set_open(self, cr, uid, ids, context=None):
4674+ return self.write(cr, uid, ids, {'state':'open'}, context=context)
4675+
4676+ def set_approved(self, cr, uid, ids, context=None):
4677+ return self.write(cr, uid, ids, {'state':'approved'}, context=context)
4678+
4679+ def set_done(self, cr, uid, ids, context=None):
4680+ return self.write(cr, uid, ids, {'state':'done'}, context=context)
4681+
4682+ def set_cancel(self, cr, uid, ids, context=None):
4683+ return self.write(cr, uid, ids, {'state':'cancelled'}, context=context)
4684+
4685+ def set_very_low_priority(self, cr, uid, ids, context=None):
4686+ return self.write(cr, uid, ids, {'priority':5}, context=context)
4687+
4688+ def set_low_priority(self, cr, uid, ids, context=None):
4689+ return self.write(cr, uid, ids, {'priority':4}, context=context)
4690+
4691+ def set_medium_priority(self, cr, uid, ids, context=None):
4692+ return self.write(cr, uid, ids, {'priority':3}, context=context)
4693+
4694+ def set_high_priority(self, cr, uid, ids, context=None):
4695+ return self.write(cr, uid, ids, {'priority':2}, context=context)
4696+
4697+ def set_very_high_priority(self, cr, uid, ids, context=None):
4698+ return self.write(cr, uid, ids, {'priority':1}, context=context)
4699+
4700+ def _check_release_backlog(self, cr, uid, ids, context=None):
4701+ for feature in self.browse(cr, uid, ids, context=context):
4702+ if feature.release_backlog_id and \
4703+ not feature.release_backlog_id in \
4704+ feature.product_backlog_id.release_backlog_ids:
4705+ return False
4706+ return True
4707+
4708+ _columns = {
4709+ 'name': fields.char('Feature Name', size=128, required=True),
4710+ 'code': fields.char('Code', size=16, required=True),
4711+ 'product_backlog_id': fields.many2one('project.scrum.product.backlog',
4712+ string='Product Backlog', required=True, domain="[('state','in',['draft','open','pending'])]"),
4713+ 'release_backlog_id': fields.many2one('project.scrum.release.backlog',
4714+ string='Release Backlog', domain="[('product_backlog_id','=',product_backlog_id),"
4715+ "'|',('state','=','open'),('state','=','pending')]"),
4716+ 'project_id': fields.related('product_backlog_id', 'project_id', type='many2one',
4717+ relation='project.project', string='Project', store=True),
4718+ 'user_id': fields.related('product_backlog_id', 'user_id', type='many2one',
4719+ relation='res.users', string='Scrum Master', store=True),
4720+ 'description': fields.text('Description'),
4721+ 'partner_id': fields.many2one('res.partner', string='Product Owner',
4722+ domain="[('customer','=',True)]",
4723+ help='Contact or person responsible of keeping the '
4724+ 'business perspective in scrum projects.'),
4725+ 'type_id': fields.many2one('project.scrum.feature.type', string='Type'),
4726+ 'priority': fields.selection([(5, '5 - Very Low'),(4,'4 - Low'),(3,'3 - Medium'),(2,'2 - High'),
4727+ (1,'1 - Very High')], string='Priority', required=True),
4728+ 'sprint_ids': fields.many2many(
4729+ 'project.scrum.sprint', readonly=True, string='Sprints',
4730+ rel='project_scrum_sprint_backlog',
4731+ help='Sprints in which the feature has been used.'),
4732+ 'task_ids': fields.one2many('project.task', 'feature_id', string='Tasks', readonly=True),
4733+ 'date_start': fields.function(_date_start, type='datetime', string='Start Date'),
4734+ 'date_end': fields.function(_date_end, type='datetime', string='End Date'),
4735+ 'deadline': fields.function(_deadline, type='date', string='Deadline'),
4736+ 'expected_hours': fields.float('Initially Planned Hour(s)',
4737+ help='Total planned hours for the development of '
4738+ 'this feature.\nRecommended values are:\n 1h, 2h, 4h,'
4739+ ' or 8h'),
4740+ 'effective_hours': fields.function(
4741+ _effective_hours, type='float', string='Spent Hour(s)',
4742+ help='Total effective hours from tasks related to this feature.'),
4743+ 'remaining_hours': fields.function(
4744+ _remaining_hours, type='float', string='Remaining Hour(s)',
4745+ help='Difference between planned hours and spent hours.'),
4746+ 'progress': fields.function(_progress, type='float', string='Progress (%)'),
4747+ 'state': fields.selection([('draft','New'), ('approved','Approved'),
4748+ ('open','In Progress'), ('cancelled', 'Cancelled'),('done','Done'),],
4749+ 'Status', required=True),
4750+ 'color': fields.integer('Color Index'),
4751+ }
4752+
4753+ _defaults = {
4754+ 'priority': 3,
4755+ 'state': 'draft',
4756+ 'product_backlog_id': lambda self, cr, uid, c: c.get('product_backlog_id', False),
4757+ 'release_backlog_id': lambda self, cr, uid, c: c.get('release_backlog_id', False),
4758+ }
4759+
4760+ def name_get(self, cr, uid, ids, context=None):
4761+ res =[]
4762+ for r in self.read(cr, uid, ids, ['code', 'name'], context=context):
4763+ name = '%s - %s' %(r['code'],r['name'])
4764+ res.append((r['id'], name))
4765+ return res
4766+
4767+ def name_search(self, cr, uid, name='', args=None, operator='ilike', context=None, limit=50):
4768+ ids = []
4769+ if name:
4770+ ids = self.search(cr, uid,
4771+ ['|',('code',operator,name),
4772+ ('name',operator,name)] + args,
4773+ limit=limit, context=context)
4774+ else:
4775+ ids = self.search(cr, uid, args, limit=limit, context=context)
4776+
4777+ return self.name_get(cr, uid, ids, context=context)
4778+
4779+ def copy(self, cr, uid, id, defaults, context=None):
4780+ feature = self.browse(cr, uid, id, context=context)
4781+ defaults['code'] = feature.code + ' (copy)'
4782+ return super(Feature, self).copy(cr, uid, id, defaults, context=context)
4783+
4784+ _constraints = [(_check_release_backlog,'The selected Release Backlog must belong to '
4785+ 'the selected Product Backlog',['Release Backlog'])]
4786+
4787+ _sql_constraints = [('unique_code_product','UNIQUE(code,product_backlog_id)',
4788+ 'Code must be unique for every feature related to a Product Backlog')]
4789+
4790+class Sprint(osv.Model):
4791+
4792+ _name = 'project.scrum.sprint'
4793+
4794+ def _date_end(self, cr, uid, ids, field_name, arg, context=None):
4795+ """Calculate End date as the highest End Date from
4796+ tasks related to this sprint"""
4797+ res = {}
4798+ for id in ids:
4799+ tasks = self.browse(cr, uid, id, context=context).task_ids
4800+ date_end = False
4801+ for task in tasks:
4802+ if task.date_end and task.state not in ('draft','cancelled'):
4803+ date = datetime.strptime(task.date_end, '%Y-%m-%d %H:%M:%S')
4804+ if not date_end:
4805+ date_end = date
4806+ else:
4807+ if date > date_end:
4808+ date_end = date
4809+ if date_end:
4810+ date_end = date_end.strftime('%Y-%m-%d %H:%M:%S')
4811+ res[id] = date_end
4812+ return res
4813+
4814+ def _expected_hours(self, cr, uid, ids, field_name, arg, context=None):
4815+ """Calculate the expected hours from features related to this
4816+ sprint."""
4817+ res = {}
4818+ for id in ids:
4819+ features = self.browse(cr, uid, id, context=context).feature_ids
4820+ sum = reduce(lambda result,feature: result+feature.expected_hours,
4821+ features, 0.0)
4822+ res[id] = sum
4823+ return res
4824+
4825+ def _effective_hours(self, cr, uid, ids, field_name, arg, context=None):
4826+ """Calculate the effective hours using the work done in tasks
4827+ related to this sprint."""
4828+ res = {}
4829+ for id in ids:
4830+ tasks = self.browse(cr, uid, id, context=context).task_ids
4831+ sum = reduce(lambda result,task: result+task.effective_hours,
4832+ tasks, 0.0)
4833+ res[id] = sum
4834+ return res
4835+
4836+ def _remaining_hours(self, cr, uid, ids, field_name, arg, context=None):
4837+ """Calculate the difference between planned and effective hours."""
4838+ res = {}
4839+ sprints = self.browse(cr, uid, ids, context=context)
4840+ for sprint in sprints:
4841+ res[sprint.id] = sprint.expected_hours - sprint.effective_hours
4842+ return res
4843+
4844+ def _progress(self, cr, uid, ids, field_name, arg, context=None):
4845+ """Calculate the progress using the progress in tasks related
4846+ to this sprint."""
4847+ res = {}
4848+ for id in ids:
4849+ tasks = self.browse(cr, uid, id, context=context).task_ids
4850+ if tasks:
4851+ sum = reduce(lambda result,task: result+task.progress,
4852+ tasks, 0.0)
4853+ res[id] = sum/len(tasks)
4854+ else:
4855+ # set a zero if no tasks are available
4856+ res[id] = 0.0
4857+ return res
4858+
4859+ def onchange_product_backlog(self, cr, uid, ids, product_backlog_id, context=None):
4860+ vals = {}
4861+ if product_backlog_id:
4862+ backlog = self.pool.get('project.scrum.product.backlog').browse(
4863+ cr,uid,product_backlog_id,context=context)
4864+ vals['project_id'] = backlog.project_id.id
4865+ else:
4866+ vals['project_id'] = False
4867+ return {'value': vals}
4868+
4869+ def onchange_project(self, cr, uid, ids, project_id, stage_id, context=None):
4870+ if project_id:
4871+ type_ids = [x.id for x in self.pool.get('project.project').browse(
4872+ cr, uid, project_id, context=context).type_ids]
4873+ if not stage_id in type_ids:
4874+ stage = self.get_default_stage_id(cr, uid, project_id, context=context)
4875+ return {'value': {'stage_id': stage}}
4876+ else:
4877+ return {}
4878+ return {
4879+ 'value': {
4880+ 'stage_id': self.get_default_stage(cr, uid, context=context)
4881+ }
4882+ }
4883+
4884+ def get_default_stage(self, cr ,uid, context=None):
4885+ type_obj = self.pool.get('project.task.type')
4886+ type = type_obj.search(cr, uid, [('state','=','draft')],
4887+ context=context, limit=1)[0]
4888+ if not type:
4889+ raise osv.except_osv(_('Error'),_('There is no ''draft'' state configured.'))
4890+ return type
4891+
4892+ def get_default_stage_id(self, cr ,uid, project_id, context=None):
4893+ type_obj = self.pool.get('project.task.type')
4894+ type = type_obj.search(cr,uid,
4895+ [('project_ids','=',project_id)], context=context, limit=1)[0]
4896+ return type
4897+
4898+ def tasks_from_features(self, cr, uid, ids, context=None):
4899+ sprint = self.browse(cr, uid, ids[0], context=context)
4900+ if sprint.task_from_features:
4901+ raise osv.except_osv(_('Error'),_('All tasks were created before.'))
4902+ task_obj = self.pool.get('project.task')
4903+ for feature in sprint.feature_ids:
4904+ values = {
4905+ 'project_id': sprint.project_id.id,
4906+ 'product_backlog_id': sprint.product_backlog_id.id,
4907+ 'release_backlog_id': sprint.release_backlog_id.id,
4908+ 'sprint_id': sprint.id,
4909+ 'feature_id': feature.id,
4910+ 'user_id': uid,
4911+ 'planned_hours': feature.expected_hours,
4912+ 'remaining_hours': feature.expected_hours,
4913+ 'date_start': sprint.date_start,
4914+ 'date_end': sprint.deadline,
4915+ 'date_deadline': sprint.deadline,
4916+ 'priority': PRIORITY[feature.priority],
4917+ 'description': feature.description,
4918+ 'name': feature.code + ' ' + feature.name,
4919+ }
4920+ task_obj.create(cr, uid, values, context=context)
4921+ self.write(cr, uid, ids[0], {'task_from_features': True}, context=context)
4922+ return True
4923+
4924+ def set_features_done(self, cr, uid, ids, context=None):
4925+ sprint = self.browse(cr, uid, ids[0], context=context)
4926+ for feature in sprint.feature_ids:
4927+ if not feature.state in ('done','cancelled'):
4928+ feature.write({'state': 'done'}, context=context)
4929+ return True
4930+
4931+ def set_done(self, cr, uid, ids, context=None):
4932+ if not isinstance(ids,list):
4933+ ids = [ids]
4934+ sprint = self.browse(cr, uid, ids[0], context=context)
4935+ for task in sprint.task_ids:
4936+ if not task.state in ['done','cancelled']:
4937+ raise osv.except_osv(_('Error'),
4938+ _('All tasks must be done or cancelled in order '
4939+ 'to cancel this sprint.'))
4940+ project = sprint.project_id
4941+ id = False
4942+ for stage in project.type_ids:
4943+ if stage.state == 'done':
4944+ id = stage.id
4945+ break
4946+ self.write(cr, uid, ids[0], {'stage_id': id}, context)
4947+ return True
4948+
4949+ def set_cancel(self, cr, uid, ids, context=None):
4950+ sprint = self.browse(cr, uid, ids[0], context=context)
4951+ for task in sprint.task_ids:
4952+ if not task.state in ['done','cancelled']:
4953+ raise osv.except_osv(_('Error'),
4954+ _('All tasks must be done or cancelled in order '
4955+ 'to cancel this sprint.'))
4956+ project = sprint.project_id
4957+ id = False
4958+ for stage in project.type_ids:
4959+ if stage.state == 'cancelled':
4960+ id = stage.id
4961+ break
4962+ self.write(cr, uid, ids[0], {'stage_id': id}, context)
4963+ return True
4964+
4965+ def _check_release_backlog(self, cr, uid, ids, context=None):
4966+ sprints = self.browse(cr, uid, ids, context=context)
4967+ for sprint in sprints:
4968+ if sprint.release_backlog_id and sprint.product_backlog_id:
4969+ if sprint.release_backlog_id.product_backlog_id != sprint.product_backlog_id:
4970+ return False
4971+ return True
4972+
4973+ def _check_deadline(self, cr, uid, ids, context=None):
4974+ sprints = self.browse(cr, uid, ids, context=context)
4975+ for sprint in sprints:
4976+ date_start = datetime.strptime(sprint.date_start, '%Y-%m-%d %H:%M:%S')
4977+ deadline = datetime.strptime(sprint.deadline, '%Y-%m-%d')
4978+ if deadline < date_start:
4979+ return False
4980+ return True
4981+
4982+ _columns = {
4983+ 'name': fields.char('Sprint Name', size=128, required=True),
4984+ 'product_backlog_id': fields.many2one('project.scrum.product.backlog',
4985+ string='Product Backlog', domain="['|',('state','=','open'),"
4986+ "('state','=','pending')]", required=True),
4987+ 'release_backlog_id': fields.many2one('project.scrum.release.backlog',
4988+ required=True, string='Release Backlog', domain="[('product_backlog_id','=',product_backlog_id),"
4989+ "'|',('state','=','open'),('state','=','pending')]"),
4990+ 'project_id': fields.related('release_backlog_id','product_backlog_id','project_id',
4991+ relation='project.project', type='many2one', string='Project', store=True, readonly=True),
4992+ 'user_id': fields.related('release_backlog_id','product_backlog_id','project_id', 'user_id',
4993+ relation='res.users', type='many2one', string='Scrum Master', store=True),
4994+ 'member_ids': fields.related('release_backlog_id','product_backlog_id','project_id', 'members',
4995+ relation='res.users', type='many2many', string='Team Members', readonly=True),
4996+ 'task_ids': fields.one2many('project.task', 'sprint_id', string='Tasks'),
4997+ 'feature_ids': fields.many2many('project.scrum.feature', rel='project_scrum_sprint_backlog',
4998+ string='Features', help='Features to be developed in this sprint',
4999+ domain="[('state','in',['approved','open']),('release_backlog_id','=',release_backlog_id),"
5000+ "('release_backlog_id','!=',False)]"),
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches