2010-04-19 08:38:25 +00:00
#-*- 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/>.
#
##############################################################################
from crm import crm
2010-09-27 13:44:03 +00:00
from datetime import datetime
from osv import fields , osv
2010-04-19 08:38:25 +00:00
from tools . translate import _
2010-09-27 13:44:03 +00:00
import binascii
import time
2010-06-24 19:53:32 +00:00
import tools
2011-02-24 10:13:05 +00:00
from crm import wizard
wizard . email_compose_message . email_model . append ( ' project.issue ' )
2010-04-19 08:38:25 +00:00
2010-09-28 12:50:08 +00:00
class project_issue_version ( osv . osv ) :
_name = " project.issue.version "
_order = " name desc "
_columns = {
' name ' : fields . char ( ' Version Number ' , size = 32 , required = True ) ,
' active ' : fields . boolean ( ' Active ' , required = False ) ,
}
_defaults = {
' active ' : 1 ,
}
project_issue_version ( )
2010-08-17 12:54:00 +00:00
class project_issue ( crm . crm_case , osv . osv ) :
2010-04-19 08:38:25 +00:00
_name = " project.issue "
_description = " Project Issue "
_order = " priority, id desc "
2011-03-18 13:44:19 +00:00
_inherit = [ ' email.thread ' ]
2010-04-19 08:38:25 +00:00
def case_open ( self , cr , uid , ids , * args ) :
"""
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
@param ids : List of case ' s Ids
@param * args : Give Tuple Value
"""
res = super ( project_issue , self ) . case_open ( cr , uid , ids , * args )
self . write ( cr , uid , ids , { ' date_open ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) } )
2010-07-08 10:14:24 +00:00
for ( id , name ) in self . name_get ( cr , uid , ids ) :
2010-10-17 17:30:00 +00:00
message = _ ( " Issue ' %s ' has been opened. " ) % name
2010-07-08 10:14:24 +00:00
self . log ( cr , uid , id , message )
2010-04-19 08:38:25 +00:00
return res
2010-07-08 10:14:24 +00:00
def case_close ( self , cr , uid , ids , * args ) :
"""
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
@param ids : List of case ' s Ids
@param * args : Give Tuple Value
"""
res = super ( project_issue , self ) . case_close ( cr , uid , ids , * args )
for ( id , name ) in self . name_get ( cr , uid , ids ) :
2010-10-17 17:30:00 +00:00
message = _ ( " Issue ' %s ' has been closed. " ) % name
2010-07-08 10:14:24 +00:00
self . log ( cr , uid , id , message )
return res
2010-09-20 06:11:01 +00:00
2010-07-02 14:37:06 +00:00
def _compute_day ( self , cr , uid , ids , fields , args , context = None ) :
2010-04-19 08:38:25 +00:00
"""
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
@param ids : List of Openday ’ s IDs
@return : difference between current date and log date
@param context : A standard dictionary for contextual values
"""
cal_obj = self . pool . get ( ' resource.calendar ' )
res_obj = self . pool . get ( ' resource.resource ' )
res = { }
2010-07-02 14:37:06 +00:00
for issue in self . browse ( cr , uid , ids , context = context ) :
2010-04-19 08:38:25 +00:00
for field in fields :
res [ issue . id ] = { }
duration = 0
ans = False
2010-06-04 10:49:47 +00:00
hours = 0
2010-06-09 05:49:31 +00:00
2010-06-04 10:49:47 +00:00
if field in [ ' working_hours_open ' , ' day_open ' ] :
2010-04-19 08:38:25 +00:00
if issue . date_open :
date_create = datetime . strptime ( issue . create_date , " % Y- % m- %d % H: % M: % S " )
date_open = datetime . strptime ( issue . date_open , " % Y- % m- %d % H: % M: % S " )
ans = date_open - date_create
date_until = issue . date_open
2010-06-07 14:32:47 +00:00
#Calculating no. of working hours to open the issue
2010-06-04 10:49:47 +00:00
hours = cal_obj . interval_hours_get ( cr , uid , issue . project_id . resource_calendar_id . id ,
2010-08-12 07:31:45 +00:00
datetime . strptime ( issue . create_date , ' % Y- % m- %d % H: % M: % S ' ) ,
datetime . strptime ( issue . date_open , ' % Y- % m- %d % H: % M: % S ' ) )
2010-06-04 10:49:47 +00:00
elif field in [ ' working_hours_close ' , ' day_close ' ] :
2010-04-19 08:38:25 +00:00
if issue . date_closed :
date_create = datetime . strptime ( issue . create_date , " % Y- % m- %d % H: % M: % S " )
date_close = datetime . strptime ( issue . date_closed , " % Y- % m- %d % H: % M: % S " )
date_until = issue . date_closed
ans = date_close - date_create
2010-06-07 14:32:47 +00:00
#Calculating no. of working hours to close the issue
2010-06-04 10:49:47 +00:00
hours = cal_obj . interval_hours_get ( cr , uid , issue . project_id . resource_calendar_id . id ,
2010-08-12 07:31:45 +00:00
datetime . strptime ( issue . create_date , ' % Y- % m- %d % H: % M: % S ' ) ,
datetime . strptime ( issue . date_closed , ' % Y- % m- %d % H: % M: % S ' ) )
2010-04-19 08:38:25 +00:00
if ans :
resource_id = False
if issue . user_id :
resource_ids = res_obj . search ( cr , uid , [ ( ' user_id ' , ' = ' , issue . user_id . id ) ] )
2010-04-20 05:57:54 +00:00
if resource_ids and len ( resource_ids ) :
resource_id = resource_ids [ 0 ]
2010-04-19 08:38:25 +00:00
duration = float ( ans . days )
2010-06-04 10:49:47 +00:00
if issue . project_id and issue . project_id . resource_calendar_id :
duration = float ( ans . days ) * 24
2010-08-12 07:31:45 +00:00
new_dates = cal_obj . interval_min_get ( cr , uid , issue . project_id . resource_calendar_id . id , datetime . strptime ( issue . create_date , ' % Y- % m- %d % H: % M: % S ' ) , duration , resource = resource_id )
2010-04-19 08:38:25 +00:00
no_days = [ ]
2010-08-12 07:31:45 +00:00
date_until = datetime . strptime ( date_until , ' % Y- % m- %d % H: % M: % S ' )
2010-04-19 08:38:25 +00:00
for in_time , out_time in new_dates :
if in_time . date not in no_days :
no_days . append ( in_time . date )
if out_time > date_until :
break
2010-06-04 10:49:47 +00:00
duration = len ( no_days )
if field in [ ' working_hours_open ' , ' working_hours_close ' ] :
res [ issue . id ] [ field ] = hours
else :
res [ issue . id ] [ field ] = abs ( float ( duration ) )
2010-04-19 08:38:25 +00:00
return res
2010-10-12 13:12:05 +00:00
def _get_issue_task ( self , cr , uid , ids , context = None ) :
issues = [ ]
issue_pool = self . pool . get ( ' project.issue ' )
for task in self . pool . get ( ' project.task ' ) . browse ( cr , uid , ids , context = context ) :
2011-02-07 05:51:57 +00:00
issues + = issue_pool . search ( cr , uid , [ ( ' task_id ' , ' = ' , task . id ) ] )
2010-10-12 13:12:05 +00:00
return issues
def _get_issue_work ( self , cr , uid , ids , context = None ) :
issues = [ ]
issue_pool = self . pool . get ( ' project.issue ' )
for work in self . pool . get ( ' project.task.work ' ) . browse ( cr , uid , ids , context = context ) :
if work . task_id :
issues + = issue_pool . search ( cr , uid , [ ( ' task_id ' , ' = ' , work . task_id . id ) ] )
return issues
def _hours_get ( self , cr , uid , ids , field_names , args , context = None ) :
task_pool = self . pool . get ( ' project.task ' )
res = { }
for issue in self . browse ( cr , uid , ids , context = context ) :
progress = 0.0
if issue . task_id :
progress = task_pool . _hours_get ( cr , uid , [ issue . task_id . id ] , field_names , args , context = context ) [ issue . task_id . id ] [ ' progress ' ]
2011-02-07 05:51:57 +00:00
res [ issue . id ] = { ' progress ' : progress }
return res
2010-10-13 07:51:20 +00:00
2010-04-19 08:38:25 +00:00
_columns = {
2010-06-09 05:49:31 +00:00
' id ' : fields . integer ( ' ID ' ) ,
2010-10-04 19:41:46 +00:00
' name ' : fields . char ( ' Issue ' , size = 128 , required = True ) ,
2010-06-09 05:49:31 +00:00
' active ' : fields . boolean ( ' Active ' , required = False ) ,
2011-01-17 13:12:57 +00:00
' create_date ' : fields . datetime ( ' Creation Date ' , readonly = True , select = True ) ,
2010-07-02 14:37:06 +00:00
' write_date ' : fields . datetime ( ' Update Date ' , readonly = True ) ,
2010-05-27 14:18:54 +00:00
' date_deadline ' : fields . date ( ' Deadline ' ) ,
2010-05-12 07:30:22 +00:00
' section_id ' : fields . many2one ( ' crm.case.section ' , ' Sales Team ' , \
select = True , help = ' Sales team to which Case belongs to. \
2010-06-09 05:49:31 +00:00
Define Responsible user and Email account for mail gateway . ' ),
2010-05-27 14:18:54 +00:00
' user_id ' : fields . many2one ( ' res.users ' , ' Responsible ' ) ,
' partner_id ' : fields . many2one ( ' res.partner ' , ' Partner ' ) ,
2010-05-12 07:30:22 +00:00
' partner_address_id ' : fields . many2one ( ' res.partner.address ' , ' Partner Contact ' , \
2010-06-09 05:49:31 +00:00
domain = " [( ' partner_id ' , ' = ' ,partner_id)] " ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' ) ,
' description ' : fields . text ( ' Description ' ) ,
2010-09-20 06:11:01 +00:00
' state ' : fields . selection ( [ ( ' draft ' , ' Draft ' ) , ( ' open ' , ' To Do ' ) , ( ' cancel ' , ' Cancelled ' ) , ( ' done ' , ' Closed ' ) , ( ' pending ' , ' Pending ' ) , ] , ' State ' , size = 16 , readonly = True ,
2010-05-12 07:30:22 +00:00
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 \' . \
2010-06-09 05:49:31 +00:00
\nIf the case needs to be reviewed then the state is set to \' Pending \' . ' ) ,
' email_from ' : fields . char ( ' Email ' , size = 128 , help = " These people will receive email. " ) ,
2010-07-19 11:49:25 +00:00
' email_cc ' : fields . char ( ' Watchers Emails ' , size = 256 , help = " These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma " ) ,
2011-01-17 13:12:57 +00:00
' date_open ' : fields . datetime ( ' Opened ' , readonly = True , select = True ) ,
2010-05-12 07:30:22 +00:00
# Project Issue fields
2011-01-17 13:12:57 +00:00
' date_closed ' : fields . datetime ( ' Closed ' , readonly = True , select = True ) ,
2010-04-19 08:38:25 +00:00
' date ' : fields . datetime ( ' Date ' ) ,
2010-07-02 14:37:06 +00:00
' canal_id ' : fields . many2one ( ' res.partner.canal ' , ' Channel ' , help = " The channels represent the different communication modes available with the customer. " \
2010-04-19 08:38:25 +00:00
" With each commercial opportunity, you can indicate the canall which is this opportunity source. " ) ,
2010-07-02 14:37:06 +00:00
' categ_id ' : fields . many2one ( ' crm.case.categ ' , ' Category ' , domain = " [( ' object_id.model ' , ' = ' , ' crm.project.bug ' )] " ) ,
2010-10-12 10:25:37 +00:00
' priority ' : fields . selection ( crm . AVAILABLE_PRIORITIES , ' Priority ' ) ,
2010-09-28 12:50:08 +00:00
' version_id ' : fields . many2one ( ' project.issue.version ' , ' Version ' ) ,
2010-04-19 08:38:25 +00:00
' partner_name ' : fields . char ( " Employee ' s Name " , size = 64 ) ,
' partner_mobile ' : fields . char ( ' Mobile ' , size = 32 ) ,
' partner_phone ' : fields . char ( ' Phone ' , size = 32 ) ,
2010-10-12 12:42:23 +00:00
' type_id ' : fields . many2one ( ' project.task.type ' , ' Resolution ' ) ,
2010-04-19 08:38:25 +00:00
' project_id ' : fields . many2one ( ' project.project ' , ' Project ' ) ,
' duration ' : fields . float ( ' Duration ' ) ,
' task_id ' : fields . many2one ( ' project.task ' , ' Task ' , domain = " [( ' project_id ' , ' = ' ,project_id)] " ) ,
' day_open ' : fields . function ( _compute_day , string = ' Days to Open ' , \
2010-05-12 12:40:48 +00:00
method = True , multi = ' day_open ' , type = " float " , store = True ) ,
2010-04-19 08:38:25 +00:00
' day_close ' : fields . function ( _compute_day , string = ' Days to Close ' , \
2010-05-12 12:40:48 +00:00
method = True , multi = ' day_close ' , type = " float " , store = True ) ,
2010-09-30 14:41:19 +00:00
' assigned_to ' : fields . related ( ' task_id ' , ' user_id ' , string = ' Assigned to ' , type = " many2one " , relation = " res.users " , store = True , help = ' This is the current user to whom the related task have been assigned ' ) ,
2010-06-04 10:49:47 +00:00
' working_hours_open ' : fields . function ( _compute_day , string = ' Working Hours to Open the Issue ' , \
method = True , multi = ' working_days_open ' , type = " float " , store = True ) ,
' working_hours_close ' : fields . function ( _compute_day , string = ' Working Hours to Close the Issue ' , \
method = True , multi = ' working_days_close ' , type = " float " , store = True ) ,
2011-02-07 05:51:57 +00:00
' message_ids ' : fields . one2many ( ' email.message ' , ' res_id ' , ' Messages ' , domain = [ ( ' model ' , ' = ' , _name ) ] ) ,
2010-06-25 14:21:59 +00:00
' date_action_last ' : fields . datetime ( ' Last Action ' , readonly = 1 ) ,
' date_action_next ' : fields . datetime ( ' Next Action ' , readonly = 1 ) ,
2010-10-12 13:12:05 +00:00
' progress ' : fields . function ( _hours_get , method = True , string = ' Progress ( % ) ' , multi = ' hours ' , group_operator = " avg " , help = " Computed as: Time Spent / Total Time. " ,
store = {
' project.issue ' : ( lambda self , cr , uid , ids , c = { } : ids , [ ' task_id ' ] , 10 ) ,
' project.task ' : ( _get_issue_task , [ ' progress ' ] , 10 ) ,
' project.task.work ' : ( _get_issue_work , [ ' hours ' ] , 10 ) ,
} ) ,
2010-04-19 08:38:25 +00:00
}
2010-06-09 05:49:31 +00:00
2010-11-22 10:37:53 +00:00
def _get_project ( self , cr , uid , context = None ) :
2010-06-29 09:22:36 +00:00
user = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context = context )
if user . context_project_id :
return user . context_project_id . id
return False
2010-04-19 08:38:25 +00:00
2010-05-20 06:16:37 +00:00
_defaults = {
2010-07-02 14:37:06 +00:00
' active ' : 1 ,
2010-06-09 05:49:31 +00:00
' user_id ' : crm . crm_case . _get_default_user ,
' partner_id ' : crm . crm_case . _get_default_partner ,
' partner_address_id ' : crm . crm_case . _get_default_partner_address ,
' email_from ' : crm . crm_case . _get_default_email ,
2010-07-02 14:37:06 +00:00
' state ' : ' draft ' ,
2010-06-09 05:49:31 +00:00
' section_id ' : crm . crm_case . _get_section ,
' company_id ' : lambda s , cr , uid , c : s . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' crm.helpdesk ' , context = c ) ,
2010-07-02 14:37:06 +00:00
' priority ' : crm . AVAILABLE_PRIORITIES [ 2 ] [ 0 ] ,
2010-05-20 06:16:37 +00:00
' project_id ' : _get_project ,
}
2010-04-19 08:38:25 +00:00
def convert_issue_task ( self , cr , uid , ids , context = None ) :
case_obj = self . pool . get ( ' project.issue ' )
data_obj = self . pool . get ( ' ir.model.data ' )
task_obj = self . pool . get ( ' project.task ' )
if context is None :
context = { }
result = data_obj . _get_id ( cr , uid , ' project ' , ' view_task_search_form ' )
res = data_obj . read ( cr , uid , result , [ ' res_id ' ] )
id2 = data_obj . _get_id ( cr , uid , ' project ' , ' view_task_form2 ' )
id3 = data_obj . _get_id ( cr , uid , ' project ' , ' view_task_tree2 ' )
if id2 :
id2 = data_obj . browse ( cr , uid , id2 , context = context ) . res_id
if id3 :
id3 = data_obj . browse ( cr , uid , id3 , context = context ) . res_id
for bug in case_obj . browse ( cr , uid , ids , context = context ) :
new_task_id = task_obj . create ( cr , uid , {
' name ' : bug . name ,
' partner_id ' : bug . partner_id . id ,
' description ' : bug . description ,
' date ' : bug . date ,
2010-07-02 14:37:06 +00:00
' project_id ' : bug . project_id . id ,
' priority ' : bug . priority ,
' user_id ' : bug . assigned_to . id ,
2010-04-19 08:38:25 +00:00
' planned_hours ' : 0.0 ,
} )
vals = {
' task_id ' : new_task_id ,
2010-10-14 10:24:49 +00:00
' state ' : ' pending '
2010-06-29 09:22:36 +00:00
}
2010-04-19 08:38:25 +00:00
case_obj . write ( cr , uid , [ bug . id ] , vals )
return {
' name ' : _ ( ' Tasks ' ) ,
' view_type ' : ' form ' ,
' view_mode ' : ' form,tree ' ,
' res_model ' : ' project.task ' ,
' res_id ' : int ( new_task_id ) ,
' view_id ' : False ,
' views ' : [ ( id2 , ' form ' ) , ( id3 , ' tree ' ) , ( False , ' calendar ' ) , ( False , ' graph ' ) ] ,
' type ' : ' ir.actions.act_window ' ,
' search_view_id ' : res [ ' res_id ' ] ,
' nodestroy ' : True
}
def _convert ( self , cr , uid , ids , xml_id , context = None ) :
data_obj = self . pool . get ( ' ir.model.data ' )
id2 = data_obj . _get_id ( cr , uid , ' project_issue ' , xml_id )
categ_id = False
if id2 :
categ_id = data_obj . browse ( cr , uid , id2 , context = context ) . res_id
if categ_id :
self . write ( cr , uid , ids , { ' categ_id ' : categ_id } )
return True
def convert_to_feature ( self , cr , uid , ids , context = None ) :
return self . _convert ( cr , uid , ids , ' feature_request_categ ' , context = context )
def convert_to_bug ( self , cr , uid , ids , context = None ) :
return self . _convert ( cr , uid , ids , ' bug_categ ' , context = context )
2010-10-04 23:57:26 +00:00
def next_type ( self , cr , uid , ids , * args ) :
for task in self . browse ( cr , uid , ids ) :
typeid = task . type_id . id
types = map ( lambda x : x . id , task . project_id . type_ids or [ ] )
if types :
if not typeid :
self . write ( cr , uid , task . id , { ' type_id ' : types [ 0 ] } )
elif typeid and typeid in types and types . index ( typeid ) != len ( types ) - 1 :
index = types . index ( typeid )
self . write ( cr , uid , task . id , { ' type_id ' : types [ index + 1 ] } )
return True
def prev_type ( self , cr , uid , ids , * args ) :
for task in self . browse ( cr , uid , ids ) :
typeid = task . type_id . id
types = map ( lambda x : x . id , task . project_id and task . project_id . type_ids or [ ] )
if types :
if typeid and typeid in types :
index = types . index ( typeid )
self . write ( cr , uid , task . id , { ' type_id ' : index and types [ index - 1 ] or False } )
return True
2010-10-04 13:10:33 +00:00
2010-09-29 15:07:02 +00:00
def onchange_task_id ( self , cr , uid , ids , task_id , context = None ) :
2010-10-12 10:25:37 +00:00
result = { }
2010-09-29 15:07:02 +00:00
if not task_id :
return { ' value ' : { } }
2010-11-22 10:37:53 +00:00
task = self . pool . get ( ' project.task ' ) . browse ( cr , uid , task_id , context = context )
2010-09-29 15:07:02 +00:00
return { ' value ' : { ' assigned_to ' : task . user_id . id , } }
2010-06-09 05:49:31 +00:00
2010-05-27 14:18:54 +00:00
def case_escalate ( self , cr , uid , ids , * args ) :
""" Escalates case to top level
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
@param ids : List of case Ids
@param * args : Tuple Value for additional Params
"""
cases = self . browse ( cr , uid , ids )
for case in cases :
data = { }
if case . project_id . project_escalation_id :
data [ ' project_id ' ] = case . project_id . project_escalation_id . id
2010-06-09 05:49:31 +00:00
if case . project_id . project_escalation_id . user_id :
data [ ' user_id ' ] = case . project_id . project_escalation_id . user_id . id
2010-07-13 21:09:48 +00:00
if case . task_id :
self . pool . get ( ' project.task ' ) . write ( cr , uid , [ case . task_id . id ] , { ' project_id ' : data [ ' project_id ' ] , ' user_id ' : False } )
2010-05-27 14:18:54 +00:00
else :
2010-06-09 05:49:31 +00:00
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' You cannot escalate this issue. \n The relevant Project has not configured the Escalation Project! ' ) )
2010-05-27 14:18:54 +00:00
self . write ( cr , uid , [ case . id ] , data )
2010-09-30 14:41:19 +00:00
self . _history ( cr , uid , cases , _ ( ' Escalate ' ) )
2010-06-09 05:49:31 +00:00
return True
2010-04-19 08:38:25 +00:00
2010-11-22 10:37:53 +00:00
def message_new ( self , cr , uid , msg , context = None ) :
2010-06-24 19:53:32 +00:00
"""
Automatically calls when new email message arrives
2010-07-02 14:37:06 +00:00
2010-06-24 19:53:32 +00:00
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks
"""
2011-02-07 05:51:57 +00:00
if context is None :
2010-12-13 06:43:09 +00:00
context = { }
2011-03-18 13:44:19 +00:00
thread_pool = self . pool . get ( ' email.thread ' )
2010-06-24 19:53:32 +00:00
2010-08-24 11:20:57 +00:00
subject = msg . get ( ' subject ' ) or _ ( ' No Title ' )
2010-06-24 19:53:32 +00:00
body = msg . get ( ' body ' )
msg_from = msg . get ( ' from ' )
priority = msg . get ( ' priority ' )
2010-07-02 14:37:06 +00:00
2010-06-24 19:53:32 +00:00
vals = {
' name ' : subject ,
' email_from ' : msg_from ,
' email_cc ' : msg . get ( ' cc ' ) ,
' description ' : body ,
' user_id ' : False ,
}
if msg . get ( ' priority ' , False ) :
vals [ ' priority ' ] = priority
2010-07-02 14:37:06 +00:00
2011-03-18 13:44:19 +00:00
res = thread_pool . get_partner ( cr , uid , msg . get ( ' from ' ) )
2010-06-24 19:53:32 +00:00
if res :
vals . update ( res )
2010-08-24 11:20:57 +00:00
context . update ( { ' state_to ' : ' draft ' } )
2010-11-22 10:37:53 +00:00
res = self . create ( cr , uid , vals , context = context )
2010-06-25 08:04:10 +00:00
self . convert_to_bug ( cr , uid , [ res ] , context = context )
2010-07-02 14:37:06 +00:00
2010-06-24 19:53:32 +00:00
attachents = msg . get ( ' attachments ' , [ ] )
for attactment in attachents or [ ] :
data_attach = {
' name ' : attactment ,
2010-07-02 14:37:06 +00:00
' datas ' : binascii . b2a_base64 ( str ( attachents . get ( attactment ) ) ) ,
2010-06-24 19:53:32 +00:00
' datas_fname ' : attactment ,
' description ' : ' Mail attachment ' ,
' res_model ' : self . _name ,
' res_id ' : res ,
}
self . pool . get ( ' ir.attachment ' ) . create ( cr , uid , data_attach )
return res
2011-01-14 13:16:22 +00:00
def message_update ( self , cr , uid , ids , vals = None , msg = " " , default_act = ' pending ' , context = None ) :
2010-07-02 14:37:06 +00:00
"""
2010-06-24 19:53:32 +00:00
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
2010-07-02 14:37:06 +00:00
@param ids : List of update mail ’ s IDs
2010-06-24 19:53:32 +00:00
"""
2010-07-02 14:37:06 +00:00
2011-01-14 13:16:22 +00:00
if vals is None :
vals = { }
2010-06-24 19:53:32 +00:00
if isinstance ( ids , ( str , int , long ) ) :
ids = [ ids ]
2010-07-02 14:37:06 +00:00
2010-06-24 19:53:32 +00:00
vals . update ( {
' description ' : msg [ ' body ' ]
} )
if msg . get ( ' priority ' , False ) :
vals [ ' priority ' ] = msg . get ( ' priority ' )
maps = {
2010-07-02 14:37:06 +00:00
' cost ' : ' planned_cost ' ,
2010-06-24 19:53:32 +00:00
' revenue ' : ' planned_revenue ' ,
2010-07-02 14:37:06 +00:00
' probability ' : ' probability '
2010-06-24 19:53:32 +00:00
}
2011-01-14 13:16:22 +00:00
# Reassign the 'open' state to the case if this one is in pending or done
for record in self . browse ( cr , uid , ids , context = context ) :
if record . state in ( ' pending ' , ' done ' ) :
record . write ( { ' state ' : ' open ' } )
2010-06-24 19:53:32 +00:00
vls = { }
for line in msg [ ' body ' ] . split ( ' \n ' ) :
line = line . strip ( )
res = tools . misc . command_re . match ( line )
if res and maps . get ( res . group ( 1 ) . lower ( ) , False ) :
key = maps . get ( res . group ( 1 ) . lower ( ) )
vls [ key ] = res . group ( 2 ) . lower ( )
2010-07-02 14:37:06 +00:00
2010-06-24 19:53:32 +00:00
vals . update ( vls )
res = self . write ( cr , uid , ids , vals )
return res
2010-09-29 15:07:02 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
issue = self . read ( cr , uid , id , [ ' name ' ] , context = context )
if not default :
default = { }
default = default . copy ( )
default [ ' name ' ] = issue [ ' name ' ] + _ ( ' (copy) ' )
return super ( project_issue , self ) . copy ( cr , uid , id , default = default ,
context = context )
2010-06-24 19:53:32 +00:00
2010-04-19 08:38:25 +00:00
project_issue ( )
2010-06-25 08:46:21 +00:00
class project ( osv . osv ) :
_inherit = " project.project "
_columns = {
2010-07-29 05:31:04 +00:00
' resource_calendar_id ' : fields . many2one ( ' resource.calendar ' , ' Working Time ' , help = " Timetable working hours to adjust the gantt diagram report " , states = { ' close ' : [ ( ' readonly ' , True ) ] , ' cancelled ' : [ ( ' readonly ' , True ) ] } ) ,
' 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 ) ] } ) ,
2010-07-26 09:41:14 +00:00
' reply_to ' : fields . char ( ' Reply-To Email Address ' , size = 256 )
2010-06-25 08:46:21 +00:00
}
2010-09-20 06:11:01 +00:00
2010-11-19 13:48:01 +00:00
def _check_escalation ( self , cr , uid , ids , context = None ) :
project_obj = self . browse ( cr , uid , ids [ 0 ] , context = context )
2010-07-26 09:41:14 +00:00
if project_obj . project_escalation_id :
if project_obj . project_escalation_id . id == project_obj . id :
return False
return True
_constraints = [
( _check_escalation , ' Error! You cannot assign escalation to the same project! ' , [ ' project_escalation_id ' ] )
]
2010-06-25 08:46:21 +00:00
project ( )
2010-07-02 14:37:06 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: