diff --git a/addons/caldav/caldav_node.py b/addons/caldav/caldav_node.py
index 63e683bafb7..55be22f198e 100644
--- a/addons/caldav/caldav_node.py
+++ b/addons/caldav/caldav_node.py
@@ -103,7 +103,12 @@ class node_calendar_collection(nodes.node_dir):
class node_calendar(nodes.node_class):
our_type = 'collection'
DAV_PROPS = {
- "http://calendarserver.org/ns/" : ('getctag',),
+ "DAV:": ('principal-collection-set'),
+ "http://cal.me.com/_namespace/" : ('user-state'),
+ "http://calendarserver.org/ns/" : (
+ 'dropbox-home-URL',
+ 'notification-URL',
+ 'getctag',),
'http://groupdav.org/': ('resourcetype',),
"urn:ietf:params:xml:ns:caldav" : (
'calendar-description',
@@ -114,6 +119,7 @@ class node_calendar(nodes.node_class):
'schedule-outbox-URL',)}
DAV_M_NS = {
"DAV:" : '_get_dav',
+ "http://cal.me.com/_namespace/": '_get_dav',
'http://groupdav.org/': '_get_gdav',
"http://calendarserver.org/ns/" : '_get_dav',
"urn:ietf:params:xml:ns:caldav" : '_get_caldav'}
@@ -134,6 +140,35 @@ class node_calendar(nodes.node_class):
result = self._get_ttag(cr) + ':' + str(time.time())
return str(result)
+ def _get_dav_dropbox_home_URL(self, cr):
+ import xml.dom.minidom
+ import urllib
+ uid = self.context.uid
+ ctx = self.context.context.copy()
+ ctx.update(self.dctx)
+ calendar_obj = self.context._dirobj.pool.get('basic.calendar')
+ calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
+ res = '%s/%s' %(calendar.collection_id.name, calendar.name)
+ url = urllib.quote('/%s/%s' % (cr.dbname, res))
+ return url
+
+ def _get_dav_notification_URL(self, cr):
+ import xml.dom.minidom
+ import urllib
+ uid = self.context.uid
+ ctx = self.context.context.copy()
+ ctx.update(self.dctx)
+ calendar_obj = self.context._dirobj.pool.get('basic.calendar')
+ calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
+ res = '%s/%s' %(calendar.collection_id.name, calendar.name)
+ url = urllib.quote('/%s/%s' % (cr.dbname, res))
+ return url
+
+ def _get_dav_user_state(self, cr):
+ #TODO
+ return True
+
+
def get_dav_resourcetype(self, cr):
res = [ ('collection', 'DAV:'),
(str(self.cal_type + '-collection'), 'http://groupdav.org/'),
@@ -258,6 +293,86 @@ class node_calendar(nodes.node_class):
def rmcol(self, cr):
return False
+
+ def _get_caldav_calendar_data(self, cr):
+ res = []
+ for child in self.children(cr):
+ res.append(child._get_caldav_calendar_data(cr))
+ return res
+
+ def _get_caldav_calendar_description(self, cr):
+ uid = self.context.uid
+ calendar_obj = self.context._dirobj.pool.get('basic.calendar')
+ ctx = self.context.context.copy()
+ ctx.update(self.dctx)
+ calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
+ return calendar.description
+
+ def _get_dav_principal_collection_set(self, uri):
+ import urllib
+ uid = self.context.uid
+ ctx = self.context.context.copy()
+ ctx.update(self.dctx)
+ calendar_obj = self.context._dirobj.pool.get('basic.calendar')
+ calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
+ res = '%s/%s' %(calendar.collection_id.name, calendar.name)
+ doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None)
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ huri = doc.createTextNode(urllib.quote('/%s/%s' % (cr.dbname, res)))
+ href.appendChild(huri)
+ return href
+
+ def _get_caldav_calendar_home_set(self, cr):
+ import xml.dom.minidom
+ import urllib
+ uid = self.context.uid
+ ctx = self.context.context.copy()
+ ctx.update(self.dctx)
+ doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None)
+
+ calendar_obj = self.context._dirobj.pool.get('basic.calendar')
+ calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
+ huri = doc.createTextNode(urllib.quote('/%s/%s' % (cr.dbname, calendar.collection_id.name)))
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ href.appendChild(huri)
+ return href
+
+ def _get_caldav_calendar_user_address_set(self, cr):
+ import xml.dom.minidom
+ dirobj = self.context._dirobj
+ uid = self.context.uid
+ ctx = self.context.context.copy()
+ ctx.update(self.dctx)
+ user_obj = self.context._dirobj.pool.get('res.users')
+ user = user_obj.browse(cr, uid, uid, context=ctx)
+ doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None)
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ huri = doc.createTextNode('MAILTO:' + str(user.email) or str(user.name))
+ href.appendChild(huri)
+ return href
+
+ def _get_caldav_schedule_outbox_URL(self, cr):
+ return self._get_caldav_schedule_inbox_URL(cr)
+
+ def _get_caldav_schedule_inbox_URL(self, cr):
+ import xml.dom.minidom
+ import urllib
+ uid = self.context.uid
+ ctx = self.context.context.copy()
+ ctx.update(self.dctx)
+ calendar_obj = self.context._dirobj.pool.get('basic.calendar')
+ calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
+ res = '%s/%s' %(calendar.collection_id.name, calendar.name)
+ doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None)
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ huri = doc.createTextNode(urllib.quote('/%s/%s' % (cr.dbname, res)))
+ href.appendChild(huri)
+ return href
+
class res_node_calendar(nodes.node_class):
our_type = 'file'
@@ -309,6 +424,9 @@ class res_node_calendar(nodes.node_class):
context.update({'model': self.model, 'res_id':self.res_id})
res = calendar_obj.export_cal(cr, uid, [self.calendar_id], context=context)
return res
+
+ def _get_caldav_calendar_data(self, cr):
+ return self.get_data(cr)
def get_data_len(self, cr, fil_obj = None):
return self.content_length
@@ -327,67 +445,6 @@ class res_node_calendar(nodes.node_class):
res = '%d' % (self.calendar_id)
return res
- def _get_caldav_calendar_data(self, cr):
- return self.get_data(cr)
-
-
- def _get_caldav_calendar_description(self, cr):
- uid = self.context.uid
- calendar_obj = self.context._dirobj.pool.get('basic.calendar')
- ctx = self.context.context.copy()
- ctx.update(self.dctx)
- calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
- return calendar.description
-
-
- def _get_caldav_calendar_home_set(self, cr):
- import xml.dom.minidom
- import urllib
- uid = self.context.uid
- ctx = self.context.context.copy()
- ctx.update(self.dctx)
- doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None)
-
- calendar_obj = self.context._dirobj.pool.get('basic.calendar')
- calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
- huri = doc.createTextNode(urllib.quote('/%s/%s' % (cr.dbname, calendar.collection_id.name)))
- href = doc.documentElement
- href.tagName = 'D:href'
- href.appendChild(huri)
- return href
-
- def _get_caldav_calendar_user_address_set(self, cr):
- import xml.dom.minidom
- dirobj = self.context._dirobj
- uid = self.context.uid
- ctx = self.context.context.copy()
- ctx.update(self.dctx)
- user_obj = self.context._dirobj.pool.get('res.users')
- user = user_obj.browse(cr, uid, uid, context=ctx)
- doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None)
- href = doc.documentElement
- href.tagName = 'D:href'
- huri = doc.createTextNode('MAILTO:' + user.email)
- href.appendChild(huri)
- return href
-
-
- def _get_caldav_schedule_inbox_URL(self, cr):
- import xml.dom.minidom
- import urllib
- uid = self.context.uid
- ctx = self.context.context.copy()
- ctx.update(self.dctx)
- calendar_obj = self.context._dirobj.pool.get('basic.calendar')
- calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
- res = '%s/%s' %(calendar.name, calendar.collection_id.name)
- doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None)
- href = doc.documentElement
- href.tagName = 'D:href'
- huri = doc.createTextNode(urllib.quote('/%s/%s' % (cr.dbname, res)))
- href.appendChild(huri)
- return href
-
def rm(self, cr):
uid = self.context.uid
@@ -401,7 +458,6 @@ class res_node_calendar(nodes.node_class):
return res
- def _get_caldav_schedule_outbox_URL(self, cr):
- return self._get_caldav_schedule_inbox_URL(cr)
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4
diff --git a/addons/document/document_view.xml b/addons/document/document_view.xml
index f6e21f338e7..69c1c5e2cc3 100644
--- a/addons/document/document_view.xml
+++ b/addons/document/document_view.xml
@@ -44,7 +44,7 @@
-
+
@@ -80,7 +80,7 @@
-
@@ -93,7 +93,7 @@
-
+
@@ -168,7 +168,7 @@
-
+
@@ -282,10 +282,9 @@
ir.attachment
search
-
-
+
@@ -293,7 +292,7 @@
+ help="Filter on my documents" />
@@ -332,7 +331,6 @@
Documents
ir.actions.act_window
ir.attachment
- Document
form
Documents give your access to all attached documents; it's a repository of all attached documents (mails, documents attached to a project, etc.)
diff --git a/addons/document_ftp/wizard/ftp_browse_view.xml b/addons/document_ftp/wizard/ftp_browse_view.xml
index 44cedccfc3e..7a52c1fd291 100644
--- a/addons/document_ftp/wizard/ftp_browse_view.xml
+++ b/addons/document_ftp/wizard/ftp_browse_view.xml
@@ -4,7 +4,7 @@
Document FTP Browse
document.ftp.browse
- form
+ form
@@ -32,7 +32,7 @@
diff --git a/addons/document_ftp/wizard/ftp_configuration_view.xml b/addons/document_ftp/wizard/ftp_configuration_view.xml
index 27df92ff515..0319c69823e 100644
--- a/addons/document_ftp/wizard/ftp_configuration_view.xml
+++ b/addons/document_ftp/wizard/ftp_configuration_view.xml
@@ -3,7 +3,7 @@
Browse Files
ftp://localhost:8021/
-
+
diff --git a/addons/project/installer.py b/addons/project/installer.py
index 95ab951949f..4662ebeda5d 100644
--- a/addons/project/installer.py
+++ b/addons/project/installer.py
@@ -42,7 +42,7 @@ class project_installer(osv.osv_memory):
'project_messages': fields.boolean('Project Messages',
help="Lets employees send messages to other members of the "
"projects they're working on."),
- 'project_crm': fields.boolean('Issues Tracker',
+ 'project_issue': fields.boolean('Issues Tracker',
help="Automatically synchronizes project tasks and crm cases."),
# Methodologies
'project_scrum': fields.boolean('SCRUM',
@@ -53,7 +53,7 @@ class project_installer(osv.osv_memory):
}
_defaults={
- 'project_crm': True,
+ 'project_issue': True,
}
project_installer()
diff --git a/addons/project/project.py b/addons/project/project.py
index 6959a19fd03..274263682a6 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -251,7 +251,7 @@ class project(osv.osv):
context['active_test'] = False
default['state'] = 'open'
if not default.get('name', False):
- default['name'] = proj.name+_(' (copy)')
+ default['name'] = proj.name + _(' (copy)')
res = super(project, self).copy(cr, uid, id, default, context)
return res
@@ -393,6 +393,8 @@ class task(osv.osv):
if not default.get('remaining_hours', False):
default['remaining_hours'] = float(self.read(cr, uid, id, ['planned_hours'])['planned_hours'])
default['active'] = True
+ if not default.get('name', False):
+ default['name'] = self.browse(cr, uid, id, context=context).name + _(' (copy)')
return super(task, self).copy_data(cr, uid, id, default, context)
def _check_dates(self, cr, uid, ids, context=None):
@@ -401,7 +403,7 @@ class task(osv.osv):
if task['date_start'] > task['date_end']:
return False
return True
-
+
def _is_template(self, cr, uid, ids, field_name, arg, context=None):
res = {}
for task in self.browse(cr, uid, ids, context=context):
@@ -415,7 +417,7 @@ class task(osv.osv):
'active': fields.function(_is_template, method=True, store=True, string='Not a Template Task', type='boolean', help="This field is computed automatically and have the same behavior than the boolean 'active' field: if the task is linked to a template or unactivated project, it will be hidden unless specifically asked."),
'name': fields.char('Task Summary', size=128, required=True),
'description': fields.text('Description'),
- 'priority' : fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Urgent'), ('0','Very urgent')], 'Importance'),
+ 'priority' : fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Urgent'), ('0','Very urgent')], 'Priority'),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of tasks."),
'type_id': 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,
@@ -425,8 +427,7 @@ class task(osv.osv):
'date_start': fields.datetime('Starting Date'),
'date_end': fields.datetime('Ending Date'),
'date_deadline': fields.date('Deadline'),
- 'project_id': fields.many2one('project.project', 'Project', ondelete='cascade',
- help="If you have [?] in the project name, it means there are no analytic account linked to this project."),
+ 'project_id': fields.many2one('project.project', 'Project', ondelete='cascade'),
'parent_ids': fields.many2many('project.task', 'project_task_parent_rel', 'task_id', 'parent_id', 'Parent Tasks'),
'child_ids': fields.many2many('project.task', 'project_task_parent_rel', 'parent_id', 'task_id', 'Delegated Tasks'),
'notes': fields.text('Notes'),
@@ -457,15 +458,15 @@ class task(osv.osv):
}
_order = "sequence, priority, date_start, id"
-
+
def _check_recursion(self, cr, uid, ids):
obj_task = self.browse(cr, uid, ids[0])
parent_ids = [x.id for x in obj_task.parent_ids]
children_ids = [x.id for x in obj_task.child_ids]
-
+
if (obj_task.id in children_ids) or (obj_task.id in parent_ids):
return False
-
+
while(ids):
cr.execute('SELECT DISTINCT task_id '\
'FROM project_task_parent_rel '\
@@ -518,6 +519,26 @@ class task(osv.osv):
res['fields'][f]['string'] = res['fields'][f]['string'].replace('Hours',tm)
return res
+ def action_close(self, cr, uid, ids, context=None):
+ # This action open wizard to send email to partner or project manager after close task.
+ project_id = len(ids) and ids[0] or False
+ if not project_id: return False
+ task = self.browse(cr, uid, project_id, context=context)
+ project = task.project_id
+ res = self.do_close(cr, uid, [project_id], context=context)
+ if project.warn_manager or project.warn_customer:
+ return {
+ 'name': _('Send Email after close task'),
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'project.task.close',
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ 'nodestroy': True,
+ 'context': {'active_id': task.id}
+ }
+ return res
+
def do_close(self, cr, uid, ids, context=None):
"""
Close Task
@@ -539,7 +560,7 @@ class task(osv.osv):
'ref_doc1': 'project.task,%d'% (task.id,),
'ref_doc2': 'project.project,%d'% (project.id,),
})
-
+
for parent_id in task.parent_ids:
if parent_id.state in ('pending','draft'):
reopen = True
diff --git a/addons/project/project_installer.xml b/addons/project/project_installer.xml
index 0093f6230be..2c22a4b6743 100644
--- a/addons/project/project_installer.xml
+++ b/addons/project/project_installer.xml
@@ -24,7 +24,7 @@
Configure
-
+
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 421729ccda5..f8fe814e218 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -21,8 +21,8 @@
-
-
+
+
@@ -43,12 +43,13 @@
+
-
+
-
+
-
+
@@ -239,7 +240,7 @@
-
+
@@ -300,8 +301,11 @@
+
+
+
-
-
+
@@ -369,8 +372,8 @@
-
-
+
+
-
+
@@ -397,9 +400,10 @@
+
+
-
@@ -414,10 +418,7 @@
{"search_default_project_id":project_id, "search_default_user_id":uid, "search_default_current": 1}
- In OpenERP, a project is made of a set of activities (or tasks) for completion.A list view allows the manager to quickly check for task status and make it evolve, delegate task, etc. A search tool allows a multi-criteria sort of activities.
-
-Issues like bugs in a system, client complain, materials breakdown are collected here.A list view allows the manager to quickly check for them, assign them, make their status evolved.
-
+ In OpenERP, a project is made of a set of activities (or tasks) for completion. A list view allows the manager to quickly check for task status and make it evolve, delegate task, etc. A search tool allows a multi-criteria sort of activities.
@@ -486,10 +487,10 @@ Issues like bugs in a system, client complain, materials breakdown are collected
-
+
-
-
+
+
diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py
index b9c22faee8b..e411248db4b 100644
--- a/addons/project/report/project_report.py
+++ b/addons/project/report/project_report.py
@@ -49,7 +49,7 @@ class report_project_task_user(osv.osv):
'delay_endings_days': fields.float('Overpassed Deadline', digits=(16,2), readonly=True),
'nbr': fields.integer('# of tasks', readonly=True),
'priority' : fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Urgent'),
-('0','Very urgent')], 'Importance', readonly=True),
+('0','Very urgent')], 'Priority', readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')], 'Month', readonly=True),
'state': fields.selection([('draft', 'Draft'), ('open', 'In Progress'), ('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')],'State', readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True, groups="base.group_multi_company"),
diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml
index 9db500d93ff..5218a968dbb 100644
--- a/addons/project/report/project_report_view.xml
+++ b/addons/project/report/project_report_view.xml
@@ -58,18 +58,18 @@
-
-
+
+ domain="[('date_start','<=', time.strftime('%%Y-%%m-%%d')),('date_start','>=',time.strftime('%%Y-%%m-01'))]"
+ help="Current Month"/>
+ domain="[('date_start','<=', (datetime.date (int(time.strftime('%%Y')), datetime.date.today().month, 1) - datetime.timedelta (days = 1)).strftime('%%Y-%%m-%%d')),('date_start','>',(datetime.date (int(time.strftime('%%Y')), datetime.date.today().month-1, 1)).strftime('%%Y-%%m-%%d'))]"
+ help="Previous Month"/>
-
-
-
+
+
+
-
-
-
+
+
+
+
-
+
-
-
-
+
diff --git a/addons/project/security/project_security.xml b/addons/project/security/project_security.xml
index f968ffc51a3..97453dcb33b 100644
--- a/addons/project/security/project_security.xml
+++ b/addons/project/security/project_security.xml
@@ -6,6 +6,10 @@
Project / Financial Manager
+
+ Project / Financial User
+
+
Project / Manager
@@ -43,5 +47,12 @@
['|','|','|',('user_id','=',False),('user_id','=',user.id),('project_id.members','in', [user.id]),('project_id.user_id','=',user.id)]
+
+ Projects According to User
+
+
+ [('user_id','=',user.id)]
+
+
diff --git a/addons/project/wizard/project_task_close.py b/addons/project/wizard/project_task_close.py
index 99b6caef308..78ffa5a8338 100644
--- a/addons/project/wizard/project_task_close.py
+++ b/addons/project/wizard/project_task_close.py
@@ -56,24 +56,18 @@ class project_task_close(osv.osv_memory):
partner = task.partner_id or task.project_id.partner_id
if 'description' in fields:
- res.update({'description': task.description})
+ res.update({'description': task.description or False})
if 'manager_warn' in fields:
- res.update({'manager_warn': project.warn_manager})
+ res.update({'manager_warn': project.warn_manager or False})
if 'partner_warn' in fields:
- res.update({'partner_warn': project.warn_customer})
+ res.update({'partner_warn': project.warn_customer or False})
if 'manager_email' in fields:
res.update({'manager_email': manager and manager.user_email or False})
if partner and len(partner.address) and 'partner_email' in fields:
res.update({'partner_email': partner.address[0].email})
return res
- def done(self, cr, uid, ids, context=None):
- task_pool = self.pool.get('project.task')
- task_id = context.get('active_id', False)
- res = task_pool.do_close(cr, uid, [task_id], context=context)
- return res
-
- def confirm(self, cr, uid, ids, context=None):
+ def send(self, cr, uid, ids, context=None):
if context is None:
context = {}
@@ -83,7 +77,6 @@ class project_task_close(osv.osv_memory):
return {}
task = task_pool.browse(cr, uid, task_id, context=context)
for data in self.browse(cr, uid, ids, context=context):
- res = task_pool.do_close(cr, uid, [task.id], context=context)
if res:
# Send Warn Message by Email to Manager and Customer
if data.manager_warn and not data.manager_email:
diff --git a/addons/project/wizard/project_task_close_view.xml b/addons/project/wizard/project_task_close_view.xml
index 9692fe9a733..6c064784827 100644
--- a/addons/project/wizard/project_task_close_view.xml
+++ b/addons/project/wizard/project_task_close_view.xml
@@ -3,34 +3,32 @@
- Done Task
+ Send Email
project.task.close
form
-
- Done Task
+ Send Email
ir.actions.act_window
project.task.close
form
diff --git a/addons/project/wizard/project_task_delegate.py b/addons/project/wizard/project_task_delegate.py
index 2ce74ceefc8..2430b8a0896 100644
--- a/addons/project/wizard/project_task_delegate.py
+++ b/addons/project/wizard/project_task_delegate.py
@@ -30,7 +30,7 @@ class project_task_delegate(osv.osv_memory):
_columns = {
'name': fields.char('Delegated Title', size=64, required=True, help="New title of the task delegated to the user"),
- 'prefix': fields.char('Your Task Title', size=64, required=True, help="New title of your own task to validate the work done"),
+ 'prefix': fields.char('Your Task Title', size=64, required=True, help="Title for your validation task"),
'user_id': fields.many2one('res.users', 'Assign To', required=True, help="User you want to delegate this task to"),
'new_task_description': fields.text('New Task Description', help="Reinclude the description of the task in the task of the user"),
'planned_hours': fields.float('Planned Hours', help="Estimated time to close this task by the delegated user"),
@@ -51,7 +51,7 @@ class project_task_delegate(osv.osv_memory):
project = task.project_id
manager = project.user_id or False
partner = task.partner_id or task.project_id.partner_id
-
+
if 'name' in fields:
if task.name.startswith(_('CHECK: ')):
newname = str(task.name).replace(_('CHECK: '), '')
diff --git a/addons/project/wizard/project_task_delegate_view.xml b/addons/project/wizard/project_task_delegate_view.xml
index 7bedecd8f53..dc299826419 100644
--- a/addons/project/wizard/project_task_delegate_view.xml
+++ b/addons/project/wizard/project_task_delegate_view.xml
@@ -15,17 +15,17 @@
-
+
-
+
-
+
-
+
diff --git a/addons/project/wizard/project_task_reevaluate_view.xml b/addons/project/wizard/project_task_reevaluate_view.xml
index 5e0e7c89069..db7bda3afe7 100644
--- a/addons/project/wizard/project_task_reevaluate_view.xml
+++ b/addons/project/wizard/project_task_reevaluate_view.xml
@@ -1,7 +1,7 @@
-
+
Re-evaluate Task
project.task.reevaluate
@@ -14,7 +14,7 @@
-
+
diff --git a/addons/project_gtd/project_gtd.py b/addons/project_gtd/project_gtd.py
index 46031048ae9..f29780126e0 100644
--- a/addons/project_gtd/project_gtd.py
+++ b/addons/project_gtd/project_gtd.py
@@ -114,7 +114,7 @@ class project_task(osv.osv):
if res['type'] == 'search':
tt = timebox_obj.browse(cr, uid, timebox_obj.search(cr,uid,[]))
search_extended ='''''' % (len(tt)+7,_('Getting Things Done'))
- search_extended += '''''' % (_('Inbox'),)
+ search_extended += '''''' % (_('Inbox'),)
search_extended += ''''''
for time in tt:
if time.icon:
diff --git a/addons/project_gtd/project_gtd_view.xml b/addons/project_gtd/project_gtd_view.xml
index 5672fdafa7c..99e87fcb325 100644
--- a/addons/project_gtd/project_gtd_view.xml
+++ b/addons/project_gtd/project_gtd_view.xml
@@ -19,7 +19,7 @@
form
@@ -53,7 +53,7 @@
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index 5c5a8907dc9..05e047914b7 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -70,7 +70,7 @@ class project_issue(crm.crm_case, osv.osv):
message = _('Issue ') + " '" + name + "' "+ _("is Closed.")
self.log(cr, uid, id, message)
return res
-
+
def _compute_day(self, cr, uid, ids, fields, args, context=None):
if context is None:
context = {}
@@ -152,7 +152,7 @@ class project_issue(crm.crm_case, osv.osv):
domain="[('partner_id','=',partner_id)]"),
'company_id': fields.many2one('res.company', 'Company'),
'description': fields.text('Description'),
- 'state': fields.selection([('draft', 'Draft'), ('open', 'Todo'), ('cancel', 'Cancelled'), ('done', 'Closed'),('pending', 'Pending'), ], 'State', size=16, readonly=True,
+ 'state': fields.selection([('draft', 'Draft'), ('open', 'To Do'), ('cancel', 'Cancelled'), ('done', 'Closed'),('pending', 'Pending'), ], 'State', size=16, readonly=True,
help='The state is set to \'Draft\', when a case is created.\
\nIf the case is in progress the state is set to \'Open\'.\
\nWhen the case is over, the state is set to \'Done\'.\
@@ -409,7 +409,7 @@ class project(osv.osv):
'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.', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}),
'reply_to' : fields.char('Reply-To Email Address', size=256)
}
-
+
def _check_escalation(self, cr, uid, ids):
project_obj = self.browse(cr, uid, ids[0])
if project_obj.project_escalation_id:
diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml
index 0ad753b0004..235d446e4a2 100644
--- a/addons/project_issue/project_issue_data.xml
+++ b/addons/project_issue/project_issue_data.xml
@@ -22,19 +22,16 @@
Version 4.2
-
Version 5.0
-
Version 6.0
-
diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml
index 9c074ed2fd3..df76e808bff 100644
--- a/addons/project_issue/project_issue_menu.xml
+++ b/addons/project_issue/project_issue_menu.xml
@@ -12,10 +12,10 @@
form
tree,calendar
-
+
{"search_default_user_id": uid, "search_default_current":1, "search_default_project_id":project_id}
- Issues like bugs in a system, client complain, materials breakdown are collected here.A list view allows the manager to quickly check for them, assign them, make their status evolved.
+ Issues like bugs in a system, client complain, materials breakdown are collected here. A list view allows the manager to quickly check for them, assign them, make their status evolved.
@@ -40,7 +40,7 @@
-
+
@@ -75,7 +75,7 @@
-
+
@@ -157,13 +157,13 @@
project.issue
tree
-
+
-
+
@@ -174,11 +174,12 @@
-
+
+
@@ -190,8 +191,8 @@
-
-
+
+
@@ -204,25 +205,31 @@
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+ domain="[]" context="{'group_by':'create_date'}" help="Creation Month"/>
@@ -254,7 +261,7 @@
-
+
@@ -316,6 +323,6 @@
-
+
diff --git a/addons/project_issue/report/project_issue_report_view.xml b/addons/project_issue/report/project_issue_report_view.xml
index c80ccc86e28..bb0147cd244 100644
--- a/addons/project_issue/report/project_issue_report_view.xml
+++ b/addons/project_issue/report/project_issue_report_view.xml
@@ -54,14 +54,16 @@
-
+
-
-
-
+
+
@@ -83,7 +86,7 @@
+ help="My Sale Team" />
@@ -91,42 +94,40 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
-
+
+
-
-
-
-
+ domain="[]" context="{'group_by':'day'}" help="Current Day"/>
+ domain="[]" context="{'group_by':'month'}" help="Current Month"/>
+ domain="[]" context="{'group_by':'name'}" help="Current Year"/>
diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py
index 79baff679cc..b795dda557e 100644
--- a/addons/project_long_term/project_long_term.py
+++ b/addons/project_long_term/project_long_term.py
@@ -214,6 +214,13 @@ class project_phase(osv.osv):
self._check_date_end(cr, uid, next_phase, dt_end, context=context)
return super(project_phase, self).write(cr, uid, ids, vals, context=context)
+ def copy(self, cr, uid, id, default=None, context=None):
+ if default is None:
+ default = {}
+ if not default.get('name', False):
+ default['name'] = self.browse(cr, uid, id, context=context).name + _(' (copy)')
+ return super(project_phase, self).copy(cr, uid, id, default, context)
+
def set_draft(self, cr, uid, ids, *args):
self.write(cr, uid, ids, {'state': 'draft'})
return True
diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml
index ee763b759b6..a3ff3b39669 100644
--- a/addons/project_long_term/project_long_term_view.xml
+++ b/addons/project_long_term/project_long_term_view.xml
@@ -30,7 +30,7 @@
@@ -60,8 +60,9 @@
-
+
+
@@ -89,16 +90,21 @@
@@ -115,9 +121,9 @@
-
-
+
+
@@ -184,7 +190,7 @@
tree
-
+
@@ -228,23 +234,26 @@
-
+
-
+
-
-
-
+
-
+
+
+
+
+
+
@@ -257,7 +266,7 @@
tree,form,gantt,calendar
{'search_default_responsible_id':uid}
- You can subdivide your larger projects into several phases. For each phase, you can define your resources allocation (humans or engine), describe de differend task and link your phase with previous and next one, add constraints date and scheduling. A gantt view of your project phase is also available from this menu. Gantt view is a graphically draw of the project plan; it includes any task dependencies by visually adjusting task durations and priorities, and by linking tasks to each other.
+ You can subdivide your larger projects into several phases. For each phase, you can define your resources allocation (humans or engine), describe de differend task and link your phase with previous and next one, add constraints date and scheduling. A gantt view of your project phase is also available from this menu. Gantt view is a graphically draw of the project plan; it includes any task dependencies by visually adjusting task durations and priorities, and by linking tasks to each other.
@@ -297,10 +306,10 @@
res_model="project.task"
src_model="project.phase"
view_mode="tree,form"
- domain="[('phase_id','=',active_id)]"/>
+ context="{'search_default_phase_id': [active_id]}"/>
diff --git a/addons/project_long_term/security/ir.model.access.csv b/addons/project_long_term/security/ir.model.access.csv
index 3653cd375f1..7af7984d7e6 100644
--- a/addons/project_long_term/security/ir.model.access.csv
+++ b/addons/project_long_term/security/ir.model.access.csv
@@ -1,9 +1,10 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_project_phase","project.phase","model_project_phase",project.group_project_user,1,1,1,0
-"access_project_resource_allocation","project.resource.allocation","model_project_resource_allocation",project.group_project_user,1,1,1,0
-"access_project_phase_manager","project.phase manager","model_project_phase",project.group_project_manager,1,0,0,0
-"access_project_resource_allocation_manager","project.resource.allocation manager","model_project_resource_allocation",project.group_project_manager,1,0,0,0
-"access_project_resource_allocation_system","project.resource.allocation system","model_project_resource_allocation",base.group_system,1,0,0,0
-"access_project_phase_system","project.phase system","model_project_phase",base.group_system,1,0,0,0
-"access_resource_resource_user","resource.resource user","resource.model_resource_resource",project.group_project_user,1,1,1,1
+"access_project_phase","project.phase","model_project_phase","project.group_project_user",1,1,1,0
+"access_project_resource_allocation","project.resource.allocation","model_project_resource_allocation","project.group_project_user",1,1,1,0
+"access_project_phase_manager","project.phase manager","model_project_phase","project.group_project_manager",1,0,0,0
+"access_project_resource_allocation_manager","project.resource.allocation manager","model_project_resource_allocation","project.group_project_manager",1,0,0,0
+"access_project_resource_allocation_system","project.resource.allocation system","model_project_resource_allocation","base.group_system",1,0,0,0
+"access_project_phase_system","project.phase system","model_project_phase","base.group_system",1,0,0,0
+"access_resource_resource_user","resource.resource user","resource.model_resource_resource","project.group_project_user",1,0,1,1
"access_resource_calendar_leaves_user","resource.calendar.leaves user","resource.model_resource_calendar_leaves","project.group_project_user",1,1,1,1
+"access_resource_resource_manager","resource.resource manager","resource.model_resource_resource","project.group_project_manager",1,1,1,1
diff --git a/addons/project_long_term/wizard/project_compute_phases_view.xml b/addons/project_long_term/wizard/project_compute_phases_view.xml
index 8818684e8fa..9d5754af09c 100644
--- a/addons/project_long_term/wizard/project_compute_phases_view.xml
+++ b/addons/project_long_term/wizard/project_compute_phases_view.xml
@@ -16,7 +16,7 @@
-
+
diff --git a/addons/project_long_term/wizard/project_compute_tasks_view.xml b/addons/project_long_term/wizard/project_compute_tasks_view.xml
index e0cd30d5622..e6540fafff9 100644
--- a/addons/project_long_term/wizard/project_compute_tasks_view.xml
+++ b/addons/project_long_term/wizard/project_compute_tasks_view.xml
@@ -9,13 +9,13 @@
-
+
project.messages.form
project.messages
@@ -48,7 +48,7 @@
-
+
project.messages.tree
project.messages
@@ -61,7 +61,7 @@
-
+
project.messages.search
project.messages
@@ -72,17 +72,19 @@
+
-
+
+
-
+
Communication Messages
project.messages
@@ -90,11 +92,11 @@
{"search_default_to_id":uid}
- An in-project messagery system permits an efficient and trackable communication between project members. The messages are kept in the system and can then be used for post-analysis.
+ An in-project messagery system permits an efficient and trackable communication between project members. The messages are kept in the system and can then be used for post-analysis.
-
-
-
+
+
+
diff --git a/addons/project_messages/security/ir.model.access.csv b/addons/project_messages/security/ir.model.access.csv
index b79a32fb2f5..fb0b4e8255a 100644
--- a/addons/project_messages/security/ir.model.access.csv
+++ b/addons/project_messages/security/ir.model.access.csv
@@ -1,2 +1,3 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_project_messages","project.messages","model_project_messages",project.group_project_user,1,1,1,1
+"access_project_messages","project.messages","model_project_messages","project.group_project_user",1,1,1,1
+"access_project_messages_manager","project.messages manager","model_project_messages","project.group_project_manager",1,1,1,1
diff --git a/addons/project_scrum/__openerp__.py b/addons/project_scrum/__openerp__.py
index 3350419af30..3e18db77f68 100644
--- a/addons/project_scrum/__openerp__.py
+++ b/addons/project_scrum/__openerp__.py
@@ -53,10 +53,10 @@
'security/ir.model.access.csv',
'project_scrum_report.xml',
'wizard/project_scrum_backlog_create_task_view.xml',
- 'project_scrum_view.xml',
- 'process/project_scrum_process.xml',
- 'wizard/project_scrum_backlog_sprint_view.xml',
'wizard/project_scrum_backlog_merger_view.xml',
+ 'project_scrum_view.xml',
+ 'wizard/project_scrum_backlog_sprint_view.xml',
+ 'process/project_scrum_process.xml',
"board_project_scrum_view.xml",
],
'demo_xml': ['project_scrum_demo.xml'],
diff --git a/addons/project_scrum/project_scrum.py b/addons/project_scrum/project_scrum.py
index d4be8ebe450..08c55837165 100644
--- a/addons/project_scrum/project_scrum.py
+++ b/addons/project_scrum/project_scrum.py
@@ -162,10 +162,11 @@ class project_scrum_product_backlog(osv.osv):
args=[]
if not context:
context={}
- match = re.match('^S\(([0-9]+)\)$', name)
- if match:
- ids = self.search(cr, uid, [('sprint_id','=', int(match.group(1)))], limit=limit, context=context)
- return self.name_get(cr, uid, ids, context=context)
+ if name:
+ match = re.match('^S\(([0-9]+)\)$', name)
+ if match:
+ ids = self.search(cr, uid, [('sprint_id','=', int(match.group(1)))], limit=limit, context=context)
+ return self.name_get(cr, uid, ids, context=context)
return super(project_scrum_product_backlog, self).name_search(cr, uid, name, args, operator,context, limit=limit)
def _compute(self, cr, uid, ids, fields, arg, context=None):
@@ -318,7 +319,8 @@ class project_scrum_meeting(osv.osv):
'question_today': fields.text('Tasks for today'),
'question_blocks': fields.text('Blocks encountered'),
'question_backlog': fields.text('Backlog Accurate'),
- 'task_ids': fields.many2many('project.task', 'meeting_task_rel', 'metting_id', 'task_id', 'Tasks')
+ 'task_ids': fields.many2many('project.task', 'meeting_task_rel', 'metting_id', 'task_id', 'Tasks'),
+ 'responsible_id': fields.related('sprint_id', 'scrum_master_id', type='many2one', relation='res.users', string='Responsible'),
}
#
# TODO: Find the right sprint thanks to users and date
diff --git a/addons/project_scrum/project_scrum_view.xml b/addons/project_scrum/project_scrum_view.xml
index fe995d30103..7b33658f065 100644
--- a/addons/project_scrum/project_scrum_view.xml
+++ b/addons/project_scrum/project_scrum_view.xml
@@ -40,13 +40,14 @@
-
-
+
+
-
+
-
-
+
+
+
@@ -102,22 +103,22 @@
help="Change Type"/>
-
-
+
+
-
+
-
+
-
+
-
+
@@ -135,25 +136,27 @@
string="Current"
name="current"
domain="['|','&',('sprint_id.date_start','<=',time.strftime('%%Y-%%m-%%d')), ('sprint_id.date_stop','>=',time.strftime('%%Y-%%m-%%d')), ('state','in',['draft','open','pending'])]"
- help="Current Backlogs"/>
+ help="Draft, Open and Pending Backlogs"/>
-
+
+
+
-
-
-
+
+
-
+
-
-
-
-
@@ -179,7 +180,7 @@
Product Backlogs
project.scrum.product.backlog
form
- {'search_default_current': 1}
+ {'search_default_current': 1,'search_default_user_id':uid,'search_default_project_id':project_id}