summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruco <uco@tinyerp.com>2010-07-10 10:25:33 +0530
committeruco <uco@tinyerp.com>2010-07-10 10:25:33 +0530
commitdf65d72814b245970d0d2dfca4bcd9c2ca85f9a7 (patch)
tree58fa147b64f35ee2b5c8951d3daa9566fe0ae910
parent2185d20b4c7dafe40ad5c0a484207e58eeacbd42 (diff)
parentb051735eecccd1e66d8f28d2ff50ba45435b49f7 (diff)
[MERGE]
bzr revid: uco@tinyerp.com-20100710045533-op3teksgyqouzv0o
-rw-r--r--addons/account_report/i18n/bs.po18
-rw-r--r--addons/base_calendar/base_calendar.py19
-rw-r--r--addons/base_calendar/base_calendar_view.xml25
-rw-r--r--addons/base_calendar/wizard/base_calendar_invite_attendee.py7
-rw-r--r--addons/crm/board_crm_view.xml39
-rw-r--r--addons/crm/crm_meeting_view.xml15
-rw-r--r--addons/procurement/schedulers.py28
-rw-r--r--addons/procurement/scripts/scheduler.py30
-rw-r--r--addons/product/product_data.xml4
-rw-r--r--addons/project/__init__.py1
-rw-r--r--addons/project/__openerp__.py5
-rw-r--r--addons/project/board_project_demo.xml4
-rw-r--r--addons/project/board_project_view.xml22
-rw-r--r--addons/project/installer.py12
-rw-r--r--addons/project/project.py66
-rw-r--r--addons/project/project_data.xml1
-rw-r--r--addons/project/project_demo.xml9
-rw-r--r--addons/project/project_installer.xml11
-rw-r--r--addons/project/project_mailgate.py22
-rw-r--r--addons/project/project_resource.py35
-rw-r--r--addons/project/project_view.xml22
-rw-r--r--addons/project/project_wizard.xml13
-rw-r--r--addons/project/report/__init__.py1
-rw-r--r--addons/project/report/project_report.py3
-rw-r--r--addons/project/report/project_report_view.xml19
-rw-r--r--addons/project/res_partner.py2
-rw-r--r--addons/project/res_partner_view.xml1
-rw-r--r--addons/project/wizard/project_close_task.py20
-rw-r--r--addons/project/wizard/project_close_task_view.xml8
-rw-r--r--addons/project/wizard/project_task_delegate.py15
-rw-r--r--addons/project_issue/__openerp__.py1
-rw-r--r--addons/project_issue/project_issue.py2
-rw-r--r--addons/project_issue_sheet/project_issue_sheet.py1
-rw-r--r--addons/project_issue_sheet/project_issue_sheet_view.xml2
-rw-r--r--addons/project_long_term/__openerp__.py2
-rw-r--r--addons/project_long_term/project_long_term.py2
-rw-r--r--addons/project_long_term/wizard/project_compute_phases.py6
-rw-r--r--addons/project_long_term/wizard/project_schedule_tasks.py1
-rw-r--r--addons/project_messages/__openerp__.py4
-rw-r--r--addons/project_planning/project_planning.py13
-rw-r--r--addons/project_retro_planning/project_retro_planning.py3
-rw-r--r--addons/project_retro_planning/test/deadline_change.yml2
-rw-r--r--addons/project_timesheet/project_timesheet.py12
-rw-r--r--addons/purchase/purchase.py3
-rw-r--r--addons/scrum/scrum.py2
45 files changed, 284 insertions, 249 deletions
diff --git a/addons/account_report/i18n/bs.po b/addons/account_report/i18n/bs.po
index 3fd898408ff..bd0c14775ad 100644
--- a/addons/account_report/i18n/bs.po
+++ b/addons/account_report/i18n/bs.po
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2010-07-07 09:59+0000\n"
+"PO-Revision-Date: 2010-07-09 06:46+0000\n"
"Last-Translator: Bojan Markovic <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-07-08 03:50+0000\n"
+"X-Launchpad-Export-Date: 2010-07-10 04:02+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_report
@@ -26,17 +26,17 @@ msgstr ""
#. module: account_report
#: wizard_field:print.indicators.pdf,init,file:0
msgid "Select a PDF File"
-msgstr ""
+msgstr "Odaberi PDF datoteku"
#. module: account_report
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
-msgstr ""
+msgstr "Neispravan naziv modela u definiciji zadatka."
#. module: account_report
#: view:account.report.report:0
msgid "Operators:"
-msgstr ""
+msgstr "Operatori:"
#. module: account_report
#: field:account.report.report,parent_id:0
@@ -46,12 +46,12 @@ msgstr "Sintetika"
#. module: account_report
#: field:account.report.report,disp_graph:0
msgid "Display As Graph"
-msgstr ""
+msgstr "Prikaži kao grafikon"
#. module: account_report
#: view:account.report.report:0
msgid "Account Debit:"
-msgstr ""
+msgstr "Dugovanje konta:"
#. module: account_report
#: selection:account.report.report,type:0
@@ -66,12 +66,12 @@ msgstr ""
#. module: account_report
#: rml:print.indicators:0
msgid "Tabular Summary"
-msgstr ""
+msgstr "Tablični sažetak"
#. module: account_report
#: view:account.report.report:0
msgid "Notes"
-msgstr ""
+msgstr "Bilješke"
#. module: account_report
#: view:account.report.report:0
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 9458e3e01a6..85ec16bda8d 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -379,6 +379,9 @@ property or property parameter."),
_defaults = {
'state': 'needs-action',
'user_id': lambda self, cr, uid, ctx: uid,
+ 'role': 'req-participant',
+ 'rsvp': True,
+ 'cutype': 'individual',
}
def copy(self, cr, uid, id, default=None, context=None):
@@ -543,13 +546,13 @@ property or property parameter."),
context = {}
for vals in self.browse(cr, uid, ids, context=context):
- user = vals.user_id
- if user:
- mod_obj = self.pool.get(vals.ref._name)
- if vals.ref:
- if vals.ref.user_id.id != user.id:
- defaults = {'user_id': user.id}
- new_event = mod_obj.copy(cr, uid, vals.ref.id, default=defaults, context=context)
+ #user = vals.user_id
+ #if user:
+ # mod_obj = self.pool.get(vals.ref._name)
+ # if vals.ref:
+ # if vals.ref.user_id.id != user.id:
+ # defaults = {'user_id': user.id}
+ # new_event = mod_obj.copy(cr, uid, vals.ref.id, default=defaults, context=context)
self.write(cr, uid, vals.id, {'state': 'accepted'}, context)
return True
@@ -1417,6 +1420,8 @@ true, it will allow you to hide the event alarm information without removing it.
until_date = arg[2]
res = super(calendar_event, self).search(cr, uid, args_without_date, \
offset, limit, order, context, count)
+ #Search Event ID which are invitted
+
return self.get_recurrent_ids(cr, uid, res, start_date, until_date, limit)
diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml
index bb0412a2247..cb2ca806afa 100644
--- a/addons/base_calendar/base_calendar_view.xml
+++ b/addons/base_calendar/base_calendar_view.xml
@@ -76,13 +76,26 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Invitation details">
- <field name="email" string="Invitation To"/>
- <field name="user_id" string="Internal User" />
- <field name="partner_address_id" string="Contact" />
- <field name="role" />
+ <field name="sent_by_uid" string="Invitation From" />
+ <field name="role" string="My Role"/>
+ <field name="cutype" string="Invitation type"/>
<field name="state" />
- <field name="cutype" invisible="1"/>
- <field name="rsvp" invisible="1"/>
+ <field name="rsvp" string="Required to Join"/>
+ <button name="do_tentative" states="needs-action,declined,accepted"
+ string="Uncertain" type="object"
+ icon="terp-crm" />
+ <button name="do_accept" string="Accept"
+ states="needs-action,tentative,declined"
+ type="object" icon="gtk-apply" />
+ <button name="do_decline" string="Decline"
+ states="needs-action,tentative,accepted"
+ type="object" icon="gtk-cancel" />
+ <button
+ name="%(base_calendar.action_view_calendar_invite_attendee_wizard)d"
+ string="Delegate" type="action"
+ icon="gtk-sort-descending"
+ states="needs-action,tentative,declined,accepted"
+ context="{'model' : 'calendar.attendee', 'attendee_field' : 'child_ids'}" />
</tree>
</field>
</record>
diff --git a/addons/base_calendar/wizard/base_calendar_invite_attendee.py b/addons/base_calendar/wizard/base_calendar_invite_attendee.py
index ebbfe6c48d2..15763da202d 100644
--- a/addons/base_calendar/wizard/base_calendar_invite_attendee.py
+++ b/addons/base_calendar/wizard/base_calendar_invite_attendee.py
@@ -75,7 +75,8 @@ send an Email to Invited Person')
obj = self.pool.get(model)
res_obj = obj.browse(cr, uid, context_id)
att_obj = self.pool.get('calendar.attendee')
-
+ user_obj = self.pool.get('res.users')
+ current_user = user_obj.browse(cr, uid, uid, context=context)
for datas in self.read(cr, uid, ids, context=context):
type = datas.get('type')
vals = []
@@ -89,7 +90,7 @@ send an Email to Invited Person')
else:
return {}
if type == 'internal':
- user_obj = self.pool.get('res.users')
+
if not datas.get('user_ids'):
raise osv.except_osv(_('Error!'), ("Please select any User"))
for user_id in datas.get('user_ids'):
@@ -139,7 +140,7 @@ send an Email to Invited Person')
self._columns['type'].selection))
raise osv.except_osv(_('Error!'), ("%s must have an email Address to send mail") %(name[0]))
att_obj._send_mail(cr, uid, attendees, mail_to, \
- email_from= tools.config.get('email_from', False))
+ email_from = current_user.user_email or tools.config.get('email_from', False))
return {}
diff --git a/addons/crm/board_crm_view.xml b/addons/crm/board_crm_view.xml
index c90ecb28e03..ed6044a6fd6 100644
--- a/addons/crm/board_crm_view.xml
+++ b/addons/crm/board_crm_view.xml
@@ -4,23 +4,38 @@
<record model="board.note.type" id="note_crm_type">
<field name="name">CRM Configuration</field>
</record>
+
<record model="ir.ui.view" id="view_crm_opportunity_user_graph1">
<field name="name">crm.opportunity.user.graph1</field>
<field name="model">crm.lead.report</field>
<field name="type">graph</field>
<field name="arch" type="xml">
- <graph string="Opportunities by User and Section" type="pie">
- <field name="state"/>
+ <graph string="Opportunities by User and Section" type="bar">
+ <field name="stage_id"/>
<field name="nbr" operator="+"/>
+ <field name="user_id" group="True"/>
</graph>
</field>
</record>
- <record model="ir.actions.act_window" id="act_my_leads">
+
+ <record id="view_report_crm_oppor_graph" model="ir.ui.view">
+ <field name="name">crm.lead.report.graph</field>
+ <field name="model">crm.lead.report</field>
+ <field name="type">graph</field>
+ <field name="arch" type="xml">
+ <graph orientation="vertical" string="Opportunity Analysis" type="bar">
+ <field name="stage_id"/>
+ <field name="planned_revenue" operator="+"/>
+ </graph>
+ </field>
+ </record>
+
+ <record model="ir.actions.act_window" id="act_my_oppor">
<field name="res_model">crm.lead</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="crm.crm_case_tree_view_oppor"/>
- <field name="domain">[('user_id','=',uid),('state','!=','pending'),('state','!=','cancel')]</field>
+ <field name="domain">[('user_id','=',uid),('state','=','open'), ('type', '=', 'opportunity')]</field>
</record>
<record model="ir.actions.act_window" id="act_my_meetings">
@@ -31,12 +46,12 @@
<field name="domain">[('user_id','=',uid),('state','!=','cancel'),('date','ilike',time.strftime("%Y-%m"))]</field>
</record>
- <record model="ir.actions.act_window" id="act_my_leads_stage">
+ <record model="ir.actions.act_window" id="act_my_oppor_stage">
<field name="res_model">crm.lead.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree,form</field>
- <field name="view_id" ref="view_report_crm_lead_graph"/>
- <field name="domain">[('user_id','=',uid),('state','!=','pending'),('state','!=','cancel')]</field>
+ <field name="view_id" ref="view_report_crm_oppor_graph"/>
+ <field name="domain">['&amp;', ('user_id','=',uid), '!' , '&amp;', ('state', '=', 'done'), ('date_closed','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%Y-%m-%d'))]</field>
</record>
<record model="ir.actions.act_window" id="act_sales_pipeline">
@@ -44,7 +59,7 @@
<field name="view_type">form</field>
<field name="view_mode">graph,tree,form</field>
<field name="view_id" ref="view_crm_opportunity_user_graph1"/>
- <field name="domain">[('user_id','=',uid),('state','!=','pending'),('state','!=','cancel'),('type', '=', 'opportunity')]</field>
+ <field name="domain">['&amp;', ('state', '=', 'done') , '&amp;', ('create_date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%Y-%m-%d')), ('type', '=', 'opportunity')]</field>
</record>
<record model="ir.ui.view" id="board_crm_form">
@@ -56,8 +71,8 @@
<hpaned>
<child1>
<action
- string="My Opportunities"
- name="%(act_my_leads)d"
+ string="My Open Opportunities"
+ name="%(act_my_oppor)d"
colspan="4"
height="150"
width="510"/>
@@ -70,10 +85,10 @@
<child2>
<action
string="Revenues by stage"
- name="%(act_my_leads_stage)d"
+ name="%(act_my_oppor_stage)d"
colspan="4"/>
<action
- string="My Sales Pipeline"
+ string="Win/Lost Ratio for the last Year"
name="%(act_sales_pipeline)d"
colspan="4"/>
</child2>
diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml
index e635a1d26bc..6cc8059b1a6 100644
--- a/addons/crm/crm_meeting_view.xml
+++ b/addons/crm/crm_meeting_view.xml
@@ -342,20 +342,7 @@
</field>
</field>
</record>
-
- <!-- Calendar Attendee Tree View -->
-
- <record id="attendee_tree_view_inherit" model="ir.ui.view">
- <field name="name">calendar.attendee.tree.inherit</field>
- <field name="model">calendar.attendee</field>
- <field name="type">tree</field>
- <field name="inherit_id" ref="base_calendar.base_calendar_attendee_tree_view"/>
- <field name="arch" type="xml">
- <field name="role" position="after">
- <field name="categ_id" string="Event Type"/>
- </field>
- </field>
- </record>
+
</data>
</openerp>
diff --git a/addons/procurement/schedulers.py b/addons/procurement/schedulers.py
index dc66d9e3e8b..c0cc0f736b6 100644
--- a/addons/procurement/schedulers.py
+++ b/addons/procurement/schedulers.py
@@ -31,7 +31,15 @@ class procurement_order(osv.osv):
def _procure_confirm(self, cr, uid, ids=None, use_new_cursor=False, context=None):
'''
- use_new_cursor: False or the dbname
+ Call the scheduler to check the procurement order
+
+ @param self: The object pointer
+ @param cr: The current row, from the database cursor,
+ @param uid: The current user ID for security checks
+ @param ids: List of selected IDs
+ @param use_new_cursor: False or the dbname
+ @param context: A standard dictionary for contextual values
+ @return: Dictionary of values
'''
if not context:
context = {}
@@ -126,6 +134,15 @@ class procurement_order(osv.osv):
return {}
def create_automatic_op(self, cr, uid, context=None):
+ """
+ Create procurement of virtual stock < 0
+
+ @param self: The object pointer
+ @param cr: The current row, from the database cursor,
+ @param uid: The current user ID for security checks
+ @param context: A standard dictionary for contextual values
+ @return: Dictionary of values
+ """
if not context:
context = {}
product_obj = self.pool.get('product.product')
@@ -167,7 +184,16 @@ class procurement_order(osv.osv):
def _procure_orderpoint_confirm(self, cr, uid, automatic=False,\
use_new_cursor=False, context=None, user_id=False):
'''
+ Create procurement based on Orderpoint
use_new_cursor: False or the dbname
+
+ @param self: The object pointer
+ @param cr: The current row, from the database cursor,
+ @param user_id: The current user ID for security checks
+ @param context: A standard dictionary for contextual values
+ @param param: False or the dbname
+ @return: Dictionary of values
+ """
'''
if not context:
context = {}
diff --git a/addons/procurement/scripts/scheduler.py b/addons/procurement/scripts/scheduler.py
deleted file mode 100644
index 648da5cdddc..00000000000
--- a/addons/procurement/scripts/scheduler.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-import xmlrpclib
-
-sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/wizard')
-wiz_id = sock.create('trunk', 1, 'admin', 'procurement.order.compute.all')
-sock.execute('trunk', 1, 'admin', wiz_id, {'form': {'po_cycle': 1.0, 'po_lead': 1.0, 'user_id': 3, 'schedule_cycle': 1.0, 'picking_lead': 1.0, 'security_lead': 50.0, 'automatic': False}, 'ids': [], 'report_type': 'pdf', 'model': 'ir.ui.menu', 'id': False}, 'compute', {})
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/product/product_data.xml b/addons/product/product_data.xml
index 4fada46aeef..05a57126402 100644
--- a/addons/product/product_data.xml
+++ b/addons/product/product_data.xml
@@ -39,13 +39,13 @@
<field name="uom_type">smaller</field>
</record>
<record id="uom_hour" model="product.uom">
- <field name="name">hour</field>
+ <field name="name">Hour</field>
<field eval="uom_categ_wtime" name="category_id"/>
<field name="factor" eval="8.0"/>
<field name="uom_type">smaller</field>
</record>
<record id="uom_day" model="product.uom">
- <field name="name">day</field>
+ <field name="name">Day</field>
<field eval="uom_categ_wtime" name="category_id"/>
<field name="factor" eval="1.0"/>
</record>
diff --git a/addons/project/__init__.py b/addons/project/__init__.py
index 44154c8ae05..3f65abca376 100644
--- a/addons/project/__init__.py
+++ b/addons/project/__init__.py
@@ -27,5 +27,4 @@ import report
import wizard
import res_partner
-
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py
index c3784c457b1..726e87b5979 100644
--- a/addons/project/__openerp__.py
+++ b/addons/project/__openerp__.py
@@ -26,8 +26,8 @@
"author": "Tiny",
"website": "http://www.openerp.com",
"category": "Generic Modules/Projects & Services",
- "depends": ["product", "analytic", "process", "mail_gateway","board"],
- "description": """Project management module that track multi-level projects, tasks,
+ "depends": ["product", "analytic", "mail_gateway", "board"],
+ "description": """Project management module tracks multi-level projects, tasks,
work done on tasks, eso. It is able to render planning, order tasks, eso.
Dashboard for project members that includes:
* List of my open tasks
@@ -41,7 +41,6 @@ work done on tasks, eso. It is able to render planning, order tasks, eso.
"wizard/project_task_delegate_view.xml",
"security/ir.model.access.csv",
"project_data.xml",
- "project_wizard.xml",
"project_view.xml",
"project_report.xml",
"process/task_process.xml",
diff --git a/addons/project/board_project_demo.xml b/addons/project/board_project_demo.xml
index 2a160b4454f..99c9c4a23ff 100644
--- a/addons/project/board_project_demo.xml
+++ b/addons/project/board_project_demo.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
-
-
+
<!--
Administrator shortcut
Demo user startup menu
@@ -14,6 +13,7 @@
<field name="sequence">3</field>
<field name="res_id" ref="menu_board_project"/>
</record-->
+
<record id="base.user_root" model="res.users">
<field name="action_id" ref="open_board_project"/>
</record>
diff --git a/addons/project/board_project_view.xml b/addons/project/board_project_view.xml
index f9e2dc5dd52..6258c85f689 100644
--- a/addons/project/board_project_view.xml
+++ b/addons/project/board_project_view.xml
@@ -6,22 +6,6 @@
<field name="name">Project</field>
</record>
- <record id="view_task_tree" model="ir.ui.view">
- <field name="name">project.task.tree</field>
- <field name="model">project.task</field>
- <field name="type">tree</field>
- <field eval="99" name="priority"/>
- <field name="arch" type="xml">
- <tree colors="red:date_deadline&lt;current_date;blue:date_deadline==current_date;black:date_deadline&gt;current_date" string="My Tasks">
- <field name="name"/>
- <field name="project_id"/>
- <field name="date_deadline"/>
- <field name="planned_hours"/>
- <field name="effective_hours"/>
- <field name="priority"/>
- </tree>
- </field>
- </record>
<!-- Editable My task -->
<record id="view_task_tree" model="ir.ui.view">
<field name="name">project.task.tree</field>
@@ -39,6 +23,7 @@
</tree>
</field>
</record>
+
<record id="action_view_task_tree" model="ir.actions.act_window">
<field name="name">My Open Tasks</field>
<field name="res_model">project.task</field>
@@ -47,6 +32,7 @@
<field name="domain">[('user_id','=',uid),('state','=','open')]</field>
<field name="view_id" ref="view_task_tree"/>
</record>
+
<record id="action_view_pending_task_tree" model="ir.actions.act_window">
<field name="name">My Pending Tasks</field>
<field name="res_model">project.task</field>
@@ -55,6 +41,7 @@
<field name="domain">[('user_id','=',uid),('state','=','pending')]</field>
<field name="view_id" ref="view_task_tree"/>
</record>
+
<record id="action_view_task_tree_deadline" model="ir.actions.act_window">
<field name="name">My Task's Deadlines</field>
<field name="res_model">project.task</field>
@@ -125,17 +112,20 @@
<field name="usage">menu</field>
<field name="view_id" ref="board_project_form"/>
</record>
+
<menuitem
id="next_id_86"
name="Dashboard"
icon="terp-graph"
sequence="0"
parent="base.menu_project_report"/>
+
<menuitem
action="open_board_project"
icon="terp-graph"
id="menu_board_project"
parent="next_id_86"
sequence="1"/>
+
</data>
</openerp>
diff --git a/addons/project/installer.py b/addons/project/installer.py
index e35e1b72a6c..23ab9630570 100644
--- a/addons/project/installer.py
+++ b/addons/project/installer.py
@@ -18,6 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
+
from osv import fields, osv
class project_installer(osv.osv_memory):
@@ -26,7 +27,8 @@ class project_installer(osv.osv_memory):
_columns = {
# Project Management
- 'project_long_term': fields.boolean('Long Term Planning',
+ 'project_long_term': fields.boolean(
+ 'Long Term Planning',
help="Enables long-term projects tracking, including "
"multiple-phase projects and resource allocation handling."),
'project_wiki': fields.boolean('Specifications in a Wiki',
@@ -35,7 +37,7 @@ class project_installer(osv.osv_memory):
help="Tracks and helps employees encode and validate timesheets "
"and attendance."),
'hr_timesheet_invoice': fields.boolean('Invoice Based on Hours',
- help="Helps generate invoice based on based on human resources "
+ help="Helps generate invoice based on human resources "
"costs and general expenses."),
'account_budget': fields.boolean('Budgets',
help="Helps accountants manage analytic and crossover budgets."),
@@ -49,12 +51,14 @@ class project_installer(osv.osv_memory):
help="Implements and tracks the concepts and task types defined "
"in the SCRUM methodology."),
'project_gtd': fields.boolean('Getting Things Done',
- help="Embeds the Getting Things Done concepts into OpenERP's "
+ help="Embeds the 'Getting Things Done concepts' into OpenERP's "
"project management."),
}
+
_defaults={
- 'project_crm': True,
+ 'project_crm': True,
}
+
project_installer()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
diff --git a/addons/project/project.py b/addons/project/project.py
index 0d62929416e..5ed5f9641ab 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -18,8 +18,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
+
from lxml import etree
-import datetime
import time
from tools.translate import _
@@ -38,6 +38,7 @@ class project_task_type(osv.osv):
_defaults = {
'sequence': 1
}
+
project_task_type()
class project(osv.osv):
@@ -46,10 +47,8 @@ class project(osv.osv):
_inherits = {'account.analytic.account':"category_id"}
def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
- if context is None:
- context = {}
if user == 1:
- return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count)
+ return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count)
if context and context.has_key('user_prefence') and context['user_prefence']:
cr.execute("""SELECT project.id FROM project_project project
LEFT JOIN account_analytic_account account ON account.id = project.category_id
@@ -61,8 +60,6 @@ class project(osv.osv):
context=context, count=count)
def _complete_name(self, cr, uid, ids, name, args, context=None):
- if context is None:
- context = {}
res = {}
for m in self.browse(cr, uid, ids, context=context):
res[m.id] = (m.parent_id and (m.parent_id.name + '/') or '') + m.name
@@ -73,8 +70,6 @@ class project(osv.osv):
parent=parent)
def onchange_partner_id(self, cr, uid, ids, part=False, context=None):
- if context is None:
- context = {}
partner_obj = self.pool.get('res.partner')
if not part:
return {'value':{'contact_id': False, 'pricelist_id': False}}
@@ -84,8 +79,6 @@ class project(osv.osv):
return {'value':{'contact_id': addr['contact'], 'pricelist_id': pricelist_id}}
def _progress_rate(self, cr, uid, ids, names, arg, context=None):
- if context is None:
- context = {}
res = {}.fromkeys(ids, 0.0)
progress = {}
if not ids:
@@ -143,13 +136,16 @@ class project(osv.osv):
'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages'),
'project_escalation_id': fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.'),
}
+
_order = "sequence"
+
_defaults = {
'active': True,
'priority': 1,
'sequence': 10,
'warn_manager': True,
}
+
def _check_dates(self, cr, uid, ids):
leave = self.read(cr, uid, ids[0], ['date_start', 'date'])
if leave['date_start'] and leave['date']:
@@ -168,6 +164,7 @@ class project(osv.osv):
(_check_dates, 'Error! project start-date must be lower then project end-date.', ['date_start', 'date']),
(_check_escalation, 'Error! You cannot assign escalation to the same project!', ['project_escalation_id'])
]
+
def set_template(self, cr, uid, ids, context=None):
res = self.setActive(cr, uid, ids, value=False, context=context)
return res
@@ -255,16 +252,11 @@ class project(osv.osv):
'search_view_id': search_view['res_id'],
'nodestroy': True
}
-# return result
# set active value for a project, its sub projects and its tasks
def setActive(self, cr, uid, ids, value=True, context=None):
- if context is None:
- context = {}
task_obj = self.pool.get('project.task')
for proj in self.browse(cr, uid, ids, context=None):
- if context is None:
- context = {}
self.write(cr, uid, [proj.id], {'state': value and 'open' or 'template'}, context)
cr.execute('select id from project_task where project_id=%s', (proj.id,))
tasks_id = [x[0] for x in cr.fetchall()]
@@ -273,9 +265,8 @@ class project(osv.osv):
child_ids = self.search(cr, uid, [('parent_id','=', proj.id)])
if child_ids:
self.setActive(cr, uid, child_ids, value, context=None)
- if context is None:
- context = {}
return True
+
project()
class task(osv.osv):
@@ -285,16 +276,12 @@ class task(osv.osv):
_date_name = "date_start"
def _str_get(self, task, level=0, border='***', context=None):
- if context is None:
- context = {}
return border+' '+(task.user_id and task.user_id.name.upper() or '')+(level and (': L'+str(level)) or '')+(' - %.1fh / %.1fh'%(task.effective_hours or 0.0,task.planned_hours))+' '+border+'\n'+ \
border[0]+' '+(task.name or '')+'\n'+ \
(task.description or '')+'\n\n'
# Compute: effective_hours, total_hours, progress
def _hours_get(self, cr, uid, ids, field_names, args, context=None):
- if context is None:
- context = {}
res = {}
cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id IN %s GROUP BY task_id",(tuple(ids),))
hours = dict(cr.fetchall())
@@ -314,6 +301,8 @@ class task(osv.osv):
return {'value':{'remaining_hours': planned - effective}}
def _default_project(self, cr, uid, context=None):
+ if context is None:
+ context = {}
if 'project_id' in context and context['project_id']:
return int(context['project_id'])
return False
@@ -323,15 +312,11 @@ class task(osv.osv):
#]
def copy_data(self, cr, uid, id, default={}, context=None):
- if context is None:
- context = {}
default = default or {}
default['work_ids'] = []
return super(task, self).copy_data(cr, uid, id, default, context)
def _check_dates(self, cr, uid, ids, context=None):
- if context is None:
- context = {}
task = self.read(cr, uid, ids[0], ['date_start', 'date_end'])
if task['date_start'] and task['date_end']:
if task['date_start'] > task['date_end']:
@@ -346,7 +331,7 @@ class task(osv.osv):
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of tasks."),
'type': fields.many2one('project.task.type', 'Stage',),
'state': fields.selection([('draft', 'Draft'),('open', 'In Progress'),('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', readonly=True, required=True,
- help='If the task is created the state \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\
+ help='If the task is created the state is \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\
\n If the task is over, the states is set to \'Done\'.'),
'date_start': fields.datetime('Starting Date'),
'date_end': fields.datetime('Ending Date'),
@@ -370,6 +355,7 @@ class task(osv.osv):
'manager_id': fields.related('project_id', 'category_id', 'user_id', type='many2one', relation='res.users', string='Project Manager'),
'company_id': fields.many2one('res.company', 'Company'),
}
+
_defaults = {
'state': 'draft',
'priority': '2',
@@ -380,6 +366,7 @@ class task(osv.osv):
'project_id': _default_project,
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c)
}
+
_order = "sequence, priority, date_start, id"
_constraints = [
@@ -388,10 +375,9 @@ class task(osv.osv):
#
# Override view according to the company definition
#
+
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
users_obj = self.pool.get('res.users')
- if context is None:
- context = {}
obj_tm = users_obj.browse(cr, uid, uid, context).company_id.project_time_mode_id
tm = obj_tm and obj_tm.name or 'Hours'
@@ -424,6 +410,10 @@ class task(osv.osv):
mod_obj = self.pool.get('ir.model.data')
request = self.pool.get('res.request')
tasks = self.browse(cr, uid, ids)
+ task_id = ids[0]
+ cntx = {}
+ if len(args):
+ cntx = args[0]
for task in tasks:
project = task.project_id
if project:
@@ -437,8 +427,7 @@ class task(osv.osv):
'ref_doc1': 'project.task,%d'% (task.id,),
'ref_doc2': 'project.project,%d'% (project.id,),
})
- elif project.warn_manager:
- task_id = ids[0]
+ elif project.warn_manager and cntx.get('mail_send',False):
mail_send = True
message = _('Task ') + " '" + task.name + "' "+ _("is Done.")
self.log(cr, uid, task.id, message)
@@ -454,11 +443,11 @@ class task(osv.osv):
if mail_send:
model_data_ids = mod_obj.search(cr,uid,[('model','=','ir.ui.view'),('name','=','view_project_close_task')])
resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'])[0]['res_id']
- args[0].update({'task_id': task_id})
+ cntx.update({'task_id': task_id})
return {
'name': _('Email Send to Customer'),
'view_type': 'form',
- 'context': args[0], # improve me
+ 'context': cntx, # improve me
'view_mode': 'tree,form',
'res_model': 'close.task',
'views': [(resource_id,'form')],
@@ -466,7 +455,9 @@ class task(osv.osv):
'target': 'new',
'nodestroy': True
}
- return True
+ else:
+ self.write(cr, uid, [task_id], {'state': 'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S'), 'remaining_hours': 0.0})
+ return False
def do_reopen(self, cr, uid, ids, *args):
request = self.pool.get('res.request')
@@ -562,11 +553,14 @@ class project_work(osv.osv):
'user_id': fields.many2one('res.users', 'Done by', required=True),
'company_id': fields.related('task_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True)
}
+
_defaults = {
'user_id': lambda obj, cr, uid, context: uid,
'date': time.strftime('%Y-%m-%d %H:%M:%S')
}
+
_order = "date desc"
+
def create(self, cr, uid, vals, *args, **kwargs):
if 'hours' in vals and (not vals['hours']):
vals['hours'] = 0.00
@@ -588,10 +582,12 @@ class project_work(osv.osv):
for work in self.browse(cr, uid, ids):
cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work.hours, work.task_id.id))
return super(project_work,self).unlink(cr, uid, ids, *args, **kwargs)
+
project_work()
class config_compute_remaining(osv.osv_memory):
_name='config.compute.remaining'
+
def _get_remaining(self,cr, uid, ctx):
task_obj = self.pool.get('project.task')
if 'active_id' in ctx:
@@ -638,6 +634,7 @@ config_compute_remaining()
class message(osv.osv):
_name = "project.message"
_description = "Message"
+
_columns = {
'subject': fields.char('Subject', size=128, required="True"),
'project_id': fields.many2one('project.project', 'Project', ondelete='cascade'),
@@ -655,7 +652,7 @@ class message(osv.osv):
_defaults = {
'user_id': lambda self,cr,uid,ctx: uid,
- 'date': lambda self,cr,uid,ctx: time.strftime('%Y-%m-%d'),
+ 'date': time.strftime('%Y-%m-%d'),
'project_id': _default_project
}
@@ -667,6 +664,7 @@ class users(osv.osv):
_columns = {
'context_project_id': fields.many2one('project.project', 'Project')
}
+
users()
class account_analytic_account(osv.osv):
diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml
index a931c96f635..7c5b40f3ddf 100644
--- a/addons/project/project_data.xml
+++ b/addons/project/project_data.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
+
<!--
Requests Links
-->
diff --git a/addons/project/project_demo.xml b/addons/project/project_demo.xml
index 973194e0e31..43f01c2120d 100644
--- a/addons/project/project_demo.xml
+++ b/addons/project/project_demo.xml
@@ -45,7 +45,7 @@
<record id="project_project_22" model="project.project">
<field name="priority">20</field>
<field name="parent_id" ref="project_project_9"/>
- <field name="name">Specific Developements</field>
+ <field name="name">Specific Developments</field>
<field name="manager" ref="base.user_root"/>
<field eval="[(6, 0, [ref('project_tt_specification'), ref('project_tt_development')])]" name="type_ids"/>
</record>
@@ -64,7 +64,7 @@
<field name="type" ref="project_tt_development"/>
<field name="user_id" ref="base.user_root"/>
<field name="project_id" ref="project_project_22"/>
- <field name="description">BoM, After sales returns, interventions. Tracability.</field>
+ <field name="description">BoM, After sales returns, interventions. Traceability.</field>
<field name="name">Specific adaptation to MRP</field>
</record>
<record id="project_task_130" model="project.task">
@@ -146,7 +146,7 @@
<field name="remaining_hours">24.0</field>
<field name="user_id" ref="base.user_root"/>
<field name="project_id" ref="project_project_21"/>
- <field name="name">MRP; functionnal layer</field>
+ <field name="name">MRP; functional layer</field>
<field name="state">done</field>
<field eval="time.strftime('%Y-%m-%d 12:12')" name="date_close"/>
</record>
@@ -172,7 +172,7 @@
<field name="remaining_hours">32.0</field>
<field model="res.users" name="user_id" search="[('login','=','demo')]"/>
<field name="project_id" ref="project_project_22"/>
- <field name="name">Customer docs</field>
+ <field name="name">Customer doc</field>
</record>
<record id="project_task_197" model="project.task">
<field name="sequence">30</field>
@@ -266,5 +266,6 @@
- Create Users</field>
<field name="subject">Configuration steps</field>
</record>
+
</data>
</openerp>
diff --git a/addons/project/project_installer.xml b/addons/project/project_installer.xml
index 12510f8b944..c989ab50aab 100644
--- a/addons/project/project_installer.xml
+++ b/addons/project/project_installer.xml
@@ -1,12 +1,13 @@
<openerp>
<data>
+
<record id="view_project_installer" model="ir.ui.view">
<field name="name">project.installer.view</field>
<field name="model">project.installer</field>
<field name="type">form</field>
<field name="inherit_id" ref="base.res_config_installer"/>
<field name="arch" type="xml">
- <data>
+ <data>
<form position="attributes">
<attribute name="string">Project Modules Installation</attribute>
</form>
@@ -16,12 +17,11 @@
<xpath expr='//separator[@string="vsep"]' position='attributes'>
<attribute name='string'></attribute>
</xpath>
- <xpath expr="//label[@string='description']"
- position="attributes">
- <attribute name="string">Various OpenERP applications are available to bring your project management to the next levels of control and flexibility.</attribute>
+ <xpath expr="//label[@string='description']" position="attributes">
+ <attribute name="string">Various OpenERP applications are available to bring your project management to the next levels of control and flexibility.</attribute>
</xpath>
<xpath expr="//button[@string='Install Modules']" position="attributes">
- <attribute name="string">Configure</attribute>
+ <attribute name="string">Configure</attribute>
</xpath>
<group colspan="8">
<field name="project_crm"/>
@@ -65,5 +65,6 @@
</xpath>
</field>
</record>
+
</data>
</openerp>
diff --git a/addons/project/project_mailgate.py b/addons/project/project_mailgate.py
index b057c98b03d..8c1004b52fa 100644
--- a/addons/project/project_mailgate.py
+++ b/addons/project/project_mailgate.py
@@ -19,24 +19,13 @@
#
##############################################################################
-import time
-import re
-import os
-
-import mx.DateTime
-import base64
-
-from tools.translate import _
-
-import tools
-from osv import fields,osv,orm
-from osv.orm import except_orm
+from osv import fields,osv
class project_tasks(osv.osv):
_name = "project.task"
_inherit = "project.task"
- def msg_new(self, cr, uid, msg):
+ def msg_new(self, cr, uid, msg):
mailgate_obj = self.pool.get('mail.gateway')
msg_body = mailgate_obj.msg_body_get(msg)
data = {
@@ -72,14 +61,11 @@ class project_tasks(osv.osv):
if msg_actions['priority'] in ('1','2','3','4','5'):
data['priority'] = msg_actions['priority']
-
self.write(cr, uid, [id], data)
getattr(self,act)(cr, uid, [id])
return True
def message_followers(self, cr, uid, ids, context=None):
- if context is None:
- context = {}
res = []
if isinstance(ids, (str, int, long)):
select = [ids]
@@ -93,6 +79,8 @@ class project_tasks(osv.osv):
return res
def msg_send(self, cr, uid, id, *args, **argv):
- return True
+ return True
project_tasks()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
diff --git a/addons/project/project_resource.py b/addons/project/project_resource.py
index 8ff68c94ea8..1295ea9e64a 100644
--- a/addons/project/project_resource.py
+++ b/addons/project/project_resource.py
@@ -1,10 +1,29 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
import pooler
import datetime
-def timeformat_convert(cr, uid, time_string, context=None):
+def timeformat_convert(cr, uid, time_string):
# Function to convert input time string:: 8.5 to output time string 8:30
- if context is None:
- context = {}
split_list = str(time_string).split('.')
hour_part = split_list[0]
mins_part = split_list[1]
@@ -12,7 +31,7 @@ def timeformat_convert(cr, uid, time_string, context=None):
converted_string = hour_part + ':' + str(round_mins)[0:2]
return converted_string
-def leaves_resource(cr,uid,calendar_id,resource_id=False,resource_calendar=False):
+def leaves_resource(cr, uid, calendar_id, resource_id=False, resource_calendar=False):
# To get the leaves for the resource_ids working on phase
pool = pooler.get_pool(cr.dbname)
@@ -31,20 +50,20 @@ def leaves_resource(cr,uid,calendar_id,resource_id=False,resource_calendar=False
leaves.sort()
return leaves
-def compute_working_calendar(cr,uid,calendar_id):
+def compute_working_calendar(cr, uid, calendar_id):
# To change the format of working calendar to bring it into 'faces' format
pool = pooler.get_pool(cr.dbname)
resource_week_pool = pool.get('resource.calendar.week')
time_range = "8:00-8:00"
non_working = ""
- wk = {"0":"mon","1":"tue","2":"wed","3":"thu","4":"fri","5":"sat","6":"sun"}
+ wk = {"0":"mon", "1":"tue", "2":"wed", "3":"thu", "4":"fri", "5":"sat", "6":"sun"}
wk_days = {}
wk_time = {}
wktime_list = []
wktime_cal = []
week_ids = resource_week_pool.search(cr, uid, [('calendar_id','=',calendar_id)])
- week_obj = resource_week_pool.read(cr, uid, week_ids, ['dayofweek','hour_from','hour_to'])
+ week_obj = resource_week_pool.read(cr, uid, week_ids, ['dayofweek', 'hour_from', 'hour_to'])
# Converting time formats into appropriate format required
# and creating a list like [('mon', '8:00-12:00'), ('mon', '13:00-18:00')]
@@ -80,3 +99,5 @@ def compute_working_calendar(cr,uid,calendar_id):
wktime_cal.append((non_working[:-1],time_range))
return wktime_cal
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 006d32b8b68..0c9b2f671ce 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
+
<menuitem
icon="terp-project" id="base.menu_main_pm"
name="Project" sequence="10"
@@ -148,6 +149,7 @@
<field name="name" string="Project Name"/>
<field name="user_id" string="Project Manager"/>
<field name="partner_id" string="Partner"/>
+ <field name="parent_id" invisible="1"/>
<field name="planned_hours" widget="float_time"/>
<field name="total_hours" widget="float_time"/>
<field name="effective_hours" widget="float_time"/>
@@ -252,18 +254,19 @@
</group>
<notebook colspan="4">
<page string="Information">
+ <group col="2" colspan="2">
+ <field
+ name="planned_hours"
+ widget="float_time"
+ attrs="{'readonly':[('state','!=','draft')]}"
+ on_change="onchange_planned(planned_hours, effective_hours)"/>
+ <field name="effective_hours" widget="float_time"/>
+ </group>
<group col="3" colspan="2">
- <field
- name="planned_hours"
- widget="float_time"
- attrs="{'readonly':[('state','!=','draft')]}"
- on_change="onchange_planned(planned_hours, effective_hours)"/>
<field name="remaining_hours" widget="float_time" attrs="{'readonly':[('state','!=','draft')]}" colspan="2"/>
<button name="%(action_config_compute_remaining)d" string="Reevaluate" type="action" colspan="1" target="new" states="open,pending" icon="gtk-edit"/>
- </group>
- <group col="2" colspan="2">
- <field name="delay_hours" widget="float_time"/>
- <field name="effective_hours" widget="float_time"/>
+
+ <field name="delay_hours" widget="float_time"/>
</group>
<field colspan="4" name="description" nolabel="1" attrs="{'readonly':[('state','=','done')]}" widget="text_wiki"/>
@@ -647,5 +650,6 @@
<act_window domain="[('user_id', '=', active_id),('date', '&gt;=', time.strftime('%Y-%m-01'))]" id="act_res_users_2_project_task_work_month" name="Month works" res_model="project.task.work" src_model="res.users" view_mode="tree,form" view_type="form"/>
<act_window domain="[('project_id', '=', active_id)]" id="act_project_messages" name="Messages" res_model="project.message" src_model="project.project"/>
+
</data>
</openerp>
diff --git a/addons/project/project_wizard.xml b/addons/project/project_wizard.xml
deleted file mode 100644
index 25001605210..00000000000
--- a/addons/project/project_wizard.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data>
- <!--<wizard id="wizard_close_task" menu="False" model="project.task" name="project.task.close" string="Close Task"/>-->
- <!--<wizard id="wizard_delegate_task" menu="False" model="project.task" name="project.task.delegate" string="Delegate Task"/>-->
- <!--<wizard
- id="wizard_duplicate_template"
- menu="False"
- model="project.project"
- name="project.duplicate.template" string="Duplicate Template"/>
--->
- </data>
-</openerp>
diff --git a/addons/project/report/__init__.py b/addons/project/report/__init__.py
index 295b8c9674d..f35064b9752 100644
--- a/addons/project/report/__init__.py
+++ b/addons/project/report/__init__.py
@@ -18,6 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
+
import project_report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py
index fec1052b28b..a3ecf0f4ba1 100644
--- a/addons/project/report/project_report.py
+++ b/addons/project/report/project_report.py
@@ -118,6 +118,7 @@ class report_project_task_user(osv.osv):
t.type
""")
+
report_project_task_user()
#This class is generated for project deshboard purpose
@@ -162,6 +163,7 @@ class project_vs_remaining_hours(osv.osv):
GROUP BY pur.uid,aaa.state,aaa.name
)
""")
+
project_vs_remaining_hours()
class task_by_days(osv.osv):
@@ -192,6 +194,7 @@ class task_by_days(osv.osv):
to_char(pt.create_date, 'YYYY-MM-DD'),pt.state,pt.project_id
)
""")
+
task_by_days()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml
index 9df6bd1f8ab..f22875cee4d 100644
--- a/addons/project/report/project_report_view.xml
+++ b/addons/project/report/project_report_view.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
+
<menuitem id="base.menu_project_report" name="Reporting" parent="base.menu_main_pm" sequence="50"/>
<record id="view_task_project_user_tree" model="ir.ui.view">
@@ -42,13 +43,13 @@
<field name="model">report.project.task.user</field>
<field name="type">graph</field>
<field name="arch" type="xml">
- <graph string="Tasks Analysis" type="bar">
- <field name="name"/>
- <field name="state" group="True"/>
- <field name="no_of_days" operator="+"/>
- </graph>
- </field>
- </record>
+ <graph string="Tasks Analysis" type="bar">
+ <field name="name"/>
+ <field name="state" group="True"/>
+ <field name="no_of_days" operator="+"/>
+ </graph>
+ </field>
+ </record>
<record id="view_task_project_user_search" model="ir.ui.view">
<field name="name">report.project.task.user.search</field>
@@ -174,7 +175,7 @@
</field>
</record>
- <record id="action_project_vs_remaining_hours_graph" model="ir.actions.act_window">
+ <record id="action_project_vs_remaining_hours_graph" model="ir.actions.act_window">
<field name="name">Project and remaining hours</field>
<field name="res_model">project.vs.remaining.hours</field>
<field name="view_type">form</field>
@@ -184,7 +185,7 @@
</record>
<!-- Views and action for project issue dashboard -->
- <record id="view_task_by_days_tree" model="ir.ui.view">
+ <record id="view_task_by_days_tree" model="ir.ui.view">
<field name="name">task.by.days.tree</field>
<field name="model">task.by.days</field>
<field name="type">tree</field>
diff --git a/addons/project/res_partner.py b/addons/project/res_partner.py
index 351f28cb283..3e2ff83f078 100644
--- a/addons/project/res_partner.py
+++ b/addons/project/res_partner.py
@@ -23,7 +23,7 @@ from osv import fields,osv
class res_partner(osv.osv):
- """ Inherits partner and adds CRM information in the partner form """
+ """ Inherits partner and adds Tasks information in the partner form """
_inherit = 'res.partner'
_columns = {
'task_ids': fields.one2many('project.task', 'partner_id', 'Tasks'),
diff --git a/addons/project/res_partner_view.xml b/addons/project/res_partner_view.xml
index 4778c0f1017..b130b057062 100644
--- a/addons/project/res_partner_view.xml
+++ b/addons/project/res_partner_view.xml
@@ -20,6 +20,7 @@
</page>
</field>
</record>
+
</data>
</openerp>
diff --git a/addons/project/wizard/project_close_task.py b/addons/project/wizard/project_close_task.py
index b1cd933a4f7..715e70e59d0 100644
--- a/addons/project/wizard/project_close_task.py
+++ b/addons/project/wizard/project_close_task.py
@@ -19,8 +19,9 @@
#
##############################################################################
-from osv import fields, osv
+import time
+from osv import fields, osv
from tools.translate import _
from tools import email_send as email
@@ -42,7 +43,7 @@ class project_close_task(osv.osv_memory):
if 'task_id' in context:
task = self.pool.get('project.task').browse(cr, uid, context['task_id'])
partner_id = task.partner_id or task.project_id.partner_id
- if partner_id and partner_id.address[0].email:
+ if partner_id and len(partner_id.address) and partner_id.address[0].email:
email = partner_id.address[0].email
return email
@@ -54,10 +55,15 @@ class project_close_task(osv.osv_memory):
return task.description or task.name
return ''
- _defaults={
+ _defaults = {
'email': _get_email,
'description': _get_desc,
}
+
+ def close(self, cr, uid, ids, context=None):
+ if 'task_id' in context:
+ self.pool.get('project.task').write(cr, uid, [context['task_id']], {'state': 'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S'), 'remaining_hours': 0.0})
+ return {}
def confirm(self, cr, uid, ids, context=None):
if context is None:
@@ -67,8 +73,10 @@ class project_close_task(osv.osv_memory):
close_task = self.read(cr, uid, ids[0], [])
to_adr = close_task['email']
description = close_task['description']
+
if 'task_id' in context:
- for task in self.pool.get('project.task').browse(cr, uid, [context['task_id']], context=context):
+ task_obj = self.pool.get('project.task')
+ for task in task_obj.browse(cr, uid, [context['task_id']], context=context):
project = task.project_id
subject = "Task '%s' closed" % task.name
if task.user_id and task.user_id.address_id and task.user_id.address_id.email:
@@ -89,9 +97,11 @@ class project_close_task(osv.osv_memory):
footer = (project.warn_footer or '') % val
body = u'%s\n%s\n%s\n\n-- \n%s' % (header, description, footer, signature)
email(from_adr, [to_adr], subject, body.encode('utf-8'), email_bcc=[from_adr])
+ task_obj.write(cr, uid, [task.id], {'state': 'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S'), 'remaining_hours': 0.0})
else:
- raise osv.except_osv(_('Error'), _("Couldn't send mail because the contact for this task (%s) has no email address!") % contact.name)
+ raise osv.except_osv(_('Error'), _("Please specify the email address of partner."))
return {}
project_close_task()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project/wizard/project_close_task_view.xml b/addons/project/wizard/project_close_task_view.xml
index f9206152b25..e46ddf7d6da 100644
--- a/addons/project/wizard/project_close_task_view.xml
+++ b/addons/project/wizard/project_close_task_view.xml
@@ -16,9 +16,11 @@
<newline/>
<field name="description" />
</group>
- <group colspan="4" col="6">
- <button icon="gtk-cancel" special="cancel" string="_Close"/>
- <button icon="gtk-ok" name="confirm" string="Send Mail" type="object"/>
+ <separator string="" colspan="6"/>
+ <group colspan="6" col="6">
+ <button icon="gtk-ok" name="confirm" string="Send and Close" type="object"/>
+ <button icon="gtk-ok" string="Close" name="close" type="object"/>
+ <button icon="gtk-cancel" special="cancel" string="_Cancel"/>
</group>
</form>
</field>
diff --git a/addons/project/wizard/project_task_delegate.py b/addons/project/wizard/project_task_delegate.py
index 779909273df..850f27b99d4 100644
--- a/addons/project/wizard/project_task_delegate.py
+++ b/addons/project/wizard/project_task_delegate.py
@@ -102,19 +102,20 @@ class project_task_delegate(osv.osv_memory):
'description': delegate_data['new_task_description'] or '',
'child_ids': [],
'work_ids': []
- })
+ }, context)
task_obj.write(cr, uid, [task.id], {
'remaining_hours': delegate_data['planned_hours_me'],
'planned_hours': delegate_data['planned_hours_me'] + (task.effective_hours or 0.0),
'name': newname,
- })
+ }, context)
if delegate_data['state'] == 'pending':
- task_obj.do_pending(cr, uid, [task.id])
+ task_obj.do_pending(cr, uid, [task.id], context)
else:
- task_obj.do_close(cr, uid, [task.id])
- delegrate_user = user_obj.browse(cr, uid, delegate_data['user_id'], context=context)
- message = _('Task ') + " '" + delegate_data['name'] + "' "+ _("is Delegated to User:") +" '"+ delegrate_user.name +"' "
- self.log(cr, uid, task.id, message)
+ context.update({'mail_send': False} )
+ task_obj.do_close(cr, uid, [task.id], context)
+ delegrate_user = user_obj.browse(cr, uid, delegate_data['user_id'], context=context)
+ message = _('Task ') + " '" + delegate_data['name'] + "' "+ _("is Delegated to User:") +" '"+ delegrate_user.name +"' "
+ self.log(cr, uid, task.id, message)
return {}
project_task_delegate()
diff --git a/addons/project_issue/__openerp__.py b/addons/project_issue/__openerp__.py
index ff90c5c131b..84414cf8a1b 100644
--- a/addons/project_issue/__openerp__.py
+++ b/addons/project_issue/__openerp__.py
@@ -34,7 +34,6 @@
'crm',
'project',
'hr_timesheet_sheet',
- 'resource'
],
'init_xml': [
'project_issue_data.xml'
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index 802ef47124d..ed648fb2969 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -144,7 +144,6 @@ class project_issue(osv.osv, crm.crm_case):
'create_date': fields.datetime('Creation Date', readonly=True),
'write_date': fields.datetime('Update Date', readonly=True),
'date_deadline': fields.date('Deadline'),
- 'date_closed': fields.datetime('Closed', readonly=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team', \
select=True, help='Sales team to which Case belongs to.\
Define Responsible user and Email account for mail gateway.'),
@@ -391,7 +390,6 @@ class project_issue(osv.osv, crm.crm_case):
res = self.write(cr, uid, ids, vals)
return res
-
def msg_send(self, cr, uid, id, *args, **argv):
""" Send The Message
diff --git a/addons/project_issue_sheet/project_issue_sheet.py b/addons/project_issue_sheet/project_issue_sheet.py
index 99d08c51f2d..132fa50189b 100644
--- a/addons/project_issue_sheet/project_issue_sheet.py
+++ b/addons/project_issue_sheet/project_issue_sheet.py
@@ -29,6 +29,7 @@ class project_issue(osv.osv):
'timesheet_ids': fields.one2many('hr.analytic.timesheet', 'issue_id', 'Timesheets'),
'analytic_account_id': fields.related('project_id', 'category_id', string='Analytic Account')
}
+
project_issue()
class account_analytic_line(osv.osv):
diff --git a/addons/project_issue_sheet/project_issue_sheet_view.xml b/addons/project_issue_sheet/project_issue_sheet_view.xml
index fbc1dccc2ed..0ff6413b226 100644
--- a/addons/project_issue_sheet/project_issue_sheet_view.xml
+++ b/addons/project_issue_sheet/project_issue_sheet_view.xml
@@ -29,4 +29,4 @@
</field>
</record>
</data>
-</openerp>
+</openerp> \ No newline at end of file
diff --git a/addons/project_long_term/__openerp__.py b/addons/project_long_term/__openerp__.py
index dfcddb75b48..ae391ebbb03 100644
--- a/addons/project_long_term/__openerp__.py
+++ b/addons/project_long_term/__openerp__.py
@@ -25,7 +25,7 @@
"author": "Tiny",
"website": "http://www.openerp.com",
"category": "Generic Modules/Projects & Services",
- "depends": ["project", "resource"],
+ "depends": ["resource", "project"],
"description": """
Long Term Project management module that tracks planning, scheduling, resources allocation.
diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py
index 6cba9bc55d0..f76ab413e23 100644
--- a/addons/project_long_term/project_long_term.py
+++ b/addons/project_long_term/project_long_term.py
@@ -114,7 +114,7 @@ class project_phase(osv.osv):
'responsible_id': lambda obj,cr,uid,context: uid,
'state': 'draft',
'sequence': 10,
- 'product_uom': lambda self,cr,uid,c: self.pool.get('product.uom').search(cr, uid, [('name', '=', 'Day')], context=c)[0]
+ 'product_uom': lambda self,cr,uid,c: self.pool.get('product.uom').search(cr, uid, [('name', '=', 'day')], context=c)[0]
}
_order = "name"
_constraints = [
diff --git a/addons/project_long_term/wizard/project_compute_phases.py b/addons/project_long_term/wizard/project_compute_phases.py
index f4c5fbae443..bc377a5af7d 100644
--- a/addons/project_long_term/wizard/project_compute_phases.py
+++ b/addons/project_long_term/wizard/project_compute_phases.py
@@ -61,7 +61,6 @@ class project_compute_phases(osv.osv_memory):
resource_obj = self.pool.get('resource.resource')
uom_obj = self.pool.get('product.uom')
phase_resource_obj = False
-
if context is None:
context = {}
if phase:
@@ -134,14 +133,13 @@ class project_compute_phases(osv.osv_memory):
if context is None:
context = {}
- project_obj = self.pool.get('project.project')
phase_obj = self.pool.get('project.phase')
data = self.read(cr, uid, ids, [], context=context)[0]
if not data['project_id'] and data['target_project'] == 'one':
raise osv.except_osv(_('Error!'), _('Please Specify Project to be schedule'))
if data['project_id']: # If project mentioned find its phases
- project_id = project_obj.browse(cr, uid, data['project_id'], context=context)
- phase_ids = phase_obj.search(cr, uid, [('project_id', '=', project_id.id),
+ project_id = data['project_id']
+ phase_ids = phase_obj.search(cr, uid, [('project_id', '=', project_id),
('state', 'in', ['draft', 'open', 'pending']),
('previous_phase_ids', '=', False)
])
diff --git a/addons/project_long_term/wizard/project_schedule_tasks.py b/addons/project_long_term/wizard/project_schedule_tasks.py
index f0ad7c51dae..d3c42a983d0 100644
--- a/addons/project_long_term/wizard/project_schedule_tasks.py
+++ b/addons/project_long_term/wizard/project_schedule_tasks.py
@@ -160,4 +160,5 @@ class project_schedule_task(osv.osv_memory):
return {}
project_schedule_task()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_messages/__openerp__.py b/addons/project_messages/__openerp__.py
index eb2bc24dc7c..6127533e9c5 100644
--- a/addons/project_messages/__openerp__.py
+++ b/addons/project_messages/__openerp__.py
@@ -26,8 +26,8 @@
"depends": ["project"],
"author": "Tiny",
"description": """
- This module provides the functionality to send messages within a project.'
- A user can send messages individually to other user also he can broadcast
+ This module provides the functionality to send messages within a project.
+ A user can send messages individually to other user. He can even broadcast
it to all the users.
""",
'website': 'http://www.openerp.com',
diff --git a/addons/project_planning/project_planning.py b/addons/project_planning/project_planning.py
index 260113016cb..69dfde4e6bf 100644
--- a/addons/project_planning/project_planning.py
+++ b/addons/project_planning/project_planning.py
@@ -498,7 +498,10 @@ class report_account_analytic_planning_stat(osv.osv):
WHERE user_id=%s and account_id=%s and date>=%s and date<=%s''', (line.user_id.id, line.account_id.id, line.planning_id.date_from, line.planning_id.date_to))
else:
cr.execute('SELECT sum(unit_amount) FROM account_analytic_line WHERE account_id=%s AND date>=%s AND date<=%s', (line.account_id.id, line.planning_id.date_from, line.planning_id.date_to))
- result[line.id] = cr.fetchone()[0] * div2
+
+ sum = cr.fetchone()
+ if sum and sum[0]:
+ result[line.id] = sum[0] * div2
return result
def _sum_amount_tasks(self, cr, uid, ids, name, args, context=None):
@@ -527,13 +530,15 @@ WHERE user_id=%s and account_id=%s and date>=%s and date<=%s''', (line.user_id.i
WHERE
''' + where + '''
project_id IN (select id from project_project where category_id=%s) AND
- date_close>=%s AND
- date_close<=%s''', (
+ date_end>=%s AND
+ date_end<=%s''', (
line.account_id.id,
line.planning_id.date_from,
line.planning_id.date_to)
)
- result[line.id] = cr.fetchone()[0] /div * div2
+ sum = cr.fetchone()
+ if sum and sum[0]:
+ result[line.id] = sum[0] /div * div2
return result
_columns = {
diff --git a/addons/project_retro_planning/project_retro_planning.py b/addons/project_retro_planning/project_retro_planning.py
index 48244b49d67..ead6915326e 100644
--- a/addons/project_retro_planning/project_retro_planning.py
+++ b/addons/project_retro_planning/project_retro_planning.py
@@ -37,11 +37,12 @@ class project_project(osv.osv):
for task in prj.tasks:
start_dt = (datetime(*time.strptime(task.date_start,'%Y-%m-%d %H:%M:%S')[:6])+(new_end_date-old_end_date)).strftime('%Y-%m-%d %H:%M:%S')
if task.date_deadline:
- deadline_dt = (datetime(*time.strptime(task.date_deadline,'%Y-%m-%d %H:%M:%S')[:6])+(c-d)).strftime('%Y-%m-%d %H:%M:%S')
+ deadline_dt = (datetime(*time.strptime(task.date_deadline,'%Y-%m-%d')[:6])+(new_end_date-old_end_date)).strftime('%Y-%m-%d %H:%M:%S')
self.pool.get('project.task').write(cr, uid, task.id, {'date_start':start_dt, 'date_deadline':deadline_dt})
else:
self.pool.get('project.task').write(cr, uid, task.id, {'date_start':start_dt})
return super(project_project,self).write(cr, uid, ids, vals, *args, **kwargs)
project_project()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_retro_planning/test/deadline_change.yml b/addons/project_retro_planning/test/deadline_change.yml
index 0778c5c883b..717dccd5d97 100644
--- a/addons/project_retro_planning/test/deadline_change.yml
+++ b/addons/project_retro_planning/test/deadline_change.yml
@@ -3,7 +3,7 @@
-
!record {model: project.project, id: project_project_retroplanning0}:
company_id: base.main_company
- date: '2010-06-11'
+ date: '2010-06-10'
name: Retro Planning
diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py
index e125ccbe784..6fd2beb8475 100644
--- a/addons/project_timesheet/project_timesheet.py
+++ b/addons/project_timesheet/project_timesheet.py
@@ -84,10 +84,10 @@ class project_work(osv.osv):
timeline_id = obj_timesheet.create(cr, uid, vals=vals_line, context=kwargs['context'])
# Compute based on pricetype
- amount_unit=obj_timesheet.on_change_unit_amount(cr, uid, timeline_id,
+ amount_unit = obj_timesheet.on_change_unit_amount(cr, uid, timeline_id,
prod_id, amount, unit, context=kwargs['context'])
-
- vals_line['amount'] = (-1) * vals['hours']* (amount_unit['value']['amount'] or 0.0)
+ if amount_unit:
+ vals_line['amount'] = (-1) * vals['hours']* (amount_unit.get('value',{}).get('amount',0.0) or 0.0)
obj_timesheet.write(cr, uid, [timeline_id], vals_line, {})
vals['hr_analytic_timesheet_id'] = timeline_id
return super(project_work,self).create(cr, uid, vals, *args, **kwargs)
@@ -120,8 +120,10 @@ class project_work(osv.osv):
unit = False
amount_unit=obj.on_change_unit_amount(cr, uid, line_id,
vals_line['product_id'], vals_line['unit_amount'], unit, context=context)
-
- vals_line['amount'] = (-1) * vals['hours'] * (amount_unit['value']['amount'] or 0.0)
+
+ if amount_unit:
+ vals_line['amount'] = (-1) * vals['hours'] * (amount_unit.get('value',{}).get('amount',0.0) or 0.0)
+
obj.write(cr, uid, [line_id], vals_line, context=context)
return super(project_work,self).write(cr, uid, ids, vals, context)
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index d70ea13d39b..dfdf85080fe 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -425,6 +425,7 @@ class purchase_order(osv.osv):
'invoice_state': istate,
'purchase_id': order.id,
'company_id': order.company_id.id,
+ 'move_lines' : [],
})
todo_moves = []
for order_line in order.order_line:
@@ -800,4 +801,4 @@ class procurement_order(osv.osv):
procurement_order()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/scrum/scrum.py b/addons/scrum/scrum.py
index d4434968c51..673c47850d6 100644
--- a/addons/scrum/scrum.py
+++ b/addons/scrum/scrum.py
@@ -254,7 +254,7 @@ class scrum_product_backlog(osv.osv):
'tasks_id': fields.one2many('project.task', 'product_backlog_id', 'Tasks Details'),
'state': fields.selection([('draft','Draft'),('open','Open'),('pending','Pending'),('done','Done'),('cancel','Cancelled')], 'State', required=True),
'progress': fields.function(_calc_progress, method=True, string='Progress', help="Computed as: Time Spent / Total Time."),
- 'effective_hours': fields.function(_calc_effective, method=True, string='Effective hours', help="Computed using the sum of the task work done (Time spent on tasks)"),
+ 'effective_hours': fields.function(_calc_effective, method=True, string='Spent Hours', help="Computed using the sum of the time spent on every related tasks"),
'expected_hours': fields.float('Planned Hours', help='Estimated total time to do the Backlog'),
'create_date': fields.datetime("Creation Date", readonly=True),
'task_hours': fields.function(_calc_task, method=True, string='Task Hours', help='Estimated time of the total hours of the tasks')