X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fproject_issue%2Fproject_issue.py;h=8ec01ae06fbbce0b6c713f2d943111959bd86663;hb=413c489090c54893b0f90b0a07355aad0c2ab38d;hp=f566e357dfdb5de6e9d42d1ef8c784578ae91284;hpb=568eedfc95ba22b3eea2a190f3c3a4ee28bce5a2;p=odoo%2Fodoo.git diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index f566e35..8ec01ae 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -23,19 +23,20 @@ import base64 import os import re import time -import time +import mx.DateTime +from datetime import datetime, timedelta + import tools from crm import crm -from datetime import datetime, timedelta from osv import fields,osv,orm from osv.orm import except_orm from tools.translate import _ -class project_issue(osv.osv): +class project_issue(osv.osv, crm.crm_case): _name = "project.issue" _description = "Project Issue" _order = "priority, id desc" - _inherit = 'crm.case' + _inherit = ['mailgate.thread'] def case_open(self, cr, uid, ids, *args): """ @@ -46,15 +47,9 @@ class project_issue(osv.osv): @param *args: Give Tuple Value """ - cases = self.browse(cr, uid, ids) - for case in cases: - data = {'state': 'open', 'active': True} - if not case.user_id: - data['user_id'] = uid - data.update({'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) - self.write(cr, uid, ids, data) - self._action(cr, uid, cases, 'open') - return True + 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')}) + return res def _compute_day(self, cr, uid, ids, fields, args, context={}): """ @@ -64,39 +59,101 @@ class project_issue(osv.osv): @return: difference between current date and log date @param context: A standard dictionary for contextual values """ - log_obj = self.pool.get('crm.case.log') - model_obj = self.pool.get('ir.model') cal_obj = self.pool.get('resource.calendar') - - model_ids = model_obj.search(cr, uid, [('model', '=', self._name)]) - model_id = False - if len(model_ids): - model_id = model_ids[0] + res_obj = self.pool.get('resource.resource') res = {} - for project in self.browse(cr, uid, ids , context): + for issue in self.browse(cr, uid, ids, context): for field in fields: - res[project.id] = {} + res[issue.id] = {} duration = 0 - if field == 'day_open': - if project.date_open: - date_create = datetime.strptime(project.create_date, "%Y-%m-%d %H:%M:%S") - date_open = datetime.strptime(project.date_open, "%Y-%m-%d %H:%M:%S") + ans = False + hours = 0 + if field in ['working_hours_open','day_open']: + 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 - duration = float(ans.days) + (float(ans.seconds) / 86400) - - elif field == 'day_close': - if project.date_closed: - date_create = datetime.strptime(project.create_date, "%Y-%m-%d %H:%M:%S") - date_close = datetime.strptime(project.date_closed, "%Y-%m-%d %H:%M:%S") - + date_until = issue.date_open + #Calculating no. of working hours to open the issue + hours = cal_obj.interval_hours_get(cr, uid, issue.project_id.resource_calendar_id.id, + mx.DateTime.strptime(issue.create_date, '%Y-%m-%d %H:%M:%S'), + mx.DateTime.strptime(issue.date_open, '%Y-%m-%d %H:%M:%S')) + elif field in ['working_hours_close','day_close']: + 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 - duration = float(ans.days) + (float(ans.seconds) / 86400) - res[project.id][field] = abs(int(duration)) + #Calculating no. of working hours to close the issue + hours = cal_obj.interval_hours_get(cr, uid, issue.project_id.resource_calendar_id.id, + mx.DateTime.strptime(issue.create_date, '%Y-%m-%d %H:%M:%S'), + mx.DateTime.strptime(issue.date_closed, '%Y-%m-%d %H:%M:%S')) + if ans: + resource_id = False + if issue.user_id: + resource_ids = res_obj.search(cr, uid, [('user_id','=',issue.user_id.id)]) + if resource_ids and len(resource_ids): + resource_id = resource_ids[0] + duration = float(ans.days) + if issue.project_id and issue.project_id.resource_calendar_id: + duration = float(ans.days) * 24 + new_dates = cal_obj.interval_min_get(cr, + uid, + issue.project_id.resource_calendar_id.id, + mx.DateTime.strptime(issue.create_date, '%Y-%m-%d %H:%M:%S'), + duration, + resource=resource_id + ) + no_days = [] + date_until = mx.DateTime.strptime(date_until, '%Y-%m-%d %H:%M:%S') + 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 + 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)) return res _columns = { + 'id': fields.integer('ID'), + 'name': fields.char('Name', size=128, required=True), + 'active': fields.boolean('Active', required=False), + '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.'), + 'user_id': fields.many2one('res.users', 'Responsible'), + 'partner_id': fields.many2one('res.partner', 'Partner'), + 'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \ + 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, + 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\'.\ + \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."), + 'email_cc': fields.text('Watchers Emails', size=252 , help="These people\ + will receive a copy of the future" \ +" communication between partner and users by email"), + 'date_open': fields.datetime('Opened', readonly=True), + # Project Issue fields 'date_closed': fields.datetime('Closed', readonly=True), 'date': fields.datetime('Date'), 'canal_id': fields.many2one('res.partner.canal', 'Channel',help="The channels represent the different communication modes available with the customer." \ @@ -113,22 +170,91 @@ class project_issue(osv.osv): 'task_id': fields.many2one('project.task', 'Task', domain="[('project_id','=',project_id)]"), 'date_open': fields.datetime('Opened', readonly=True), 'day_open': fields.function(_compute_day, string='Days to Open', \ - method=True, multi='day_open', type="integer", store=True), + method=True, multi='day_open', type="float", store=True), 'day_close': fields.function(_compute_day, string='Days to Close', \ - method=True, multi='day_close', type="integer", store=True), - 'assigned_to' : fields.many2one('res.users', 'Assigned to'), - 'timesheet_ids' : fields.one2many('hr.analytic.timesheet', 'issue_id', 'Timesheets'), - 'analytic_account_id' : fields.many2one('account.analytic.account', 'Analytic Account', - domain="[('partner_id', '=', partner_id)]", - required=True), + method=True, multi='day_close', type="float", store=True), + 'assigned_to' : fields.many2one('res.users', 'Assigned to'), + '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), + 'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('history', '=', True),('model','=',_name)]), + 'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False),('model','=',_name)]), } def _get_project(self, cr, uid, context): - user = self.pool.get('res.users').browse(cr,uid,uid, context=context) + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) if user.context_project_id: - return user.context_project_id + return user.context_project_id.id return False + _defaults = { + 'active': lambda *a: 1, + '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, + 'state': lambda *a: 'draft', + '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), + 'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0], + 'project_id':_get_project, + } + + 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 = {} + +# for case in case_obj.browse(cr, uid, ids, context=context): +# if case.state != 'open': +# raise osv.except_osv(_('Warning !'), +# _('Issues or Feature Requests should be in \'Open\' state before converting into Task.')) + + 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, + 'project_id':bug.project_id.id, + 'priority':bug.priority, + 'user_id':bug.assigned_to.id, + 'planned_hours': 0.0, + }) + + new_task = task_obj.browse(cr, uid, new_task_id) + + vals = { + 'task_id': new_task_id, + } + 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) @@ -153,26 +279,33 @@ class project_issue(osv.osv): return {'value':{}} return {'value':{}} - _defaults = { - 'project_id':_get_project, - } + 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 + if case.project_id.project_escalation_id.user_id: + data['user_id'] = case.project_id.project_escalation_id.user_id.id + else: + raise osv.except_osv(_('Warning !'), _('You cannot escalate this issue.\nThe relevant Project has not configured the Escalation Project!')) + self.write(cr, uid, [case.id], data) + return True project_issue() -class account_analytic_line(osv.osv): - _inherit = 'account.analytic.line' - _columns = { - 'create_date' : fields.datetime('Create Date', readonly=True), - } - -account_analytic_line() - -class hr_analytic_issue(osv.osv): - _inherit = 'hr.analytic.timesheet' - +class project(osv.osv): + _inherit = "project.project" _columns = { - 'issue_id' : fields.many2one('project.issue', 'Issue'), + 'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report"), } +project() -hr_analytic_issue()