diff --git a/addons/project_long_term/__init__.py b/addons/project_long_term/__init__.py index 33adeb520b9..5a6ad27710f 100644 --- a/addons/project_long_term/__init__.py +++ b/addons/project_long_term/__init__.py @@ -20,6 +20,7 @@ ############################################################################## import project +import wizard # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_long_term/__terp__.py b/addons/project_long_term/__terp__.py index 1b5dfa348ad..23a1b2a6297 100644 --- a/addons/project_long_term/__terp__.py +++ b/addons/project_long_term/__terp__.py @@ -33,7 +33,8 @@ "demo_xml" : [#"project_demo.xml" ], "update_xml": [ - "project_view.xml", + "project_view.xml", + "project_wizard.xml" ], 'installable': True, 'active': False, diff --git a/addons/project_long_term/project_wizard.xml b/addons/project_long_term/project_wizard.xml index 109a003da4a..5fb0b101fa6 100644 --- a/addons/project_long_term/project_wizard.xml +++ b/addons/project_long_term/project_wizard.xml @@ -1,8 +1,16 @@ - + + + + diff --git a/addons/project_long_term/wizard/__init__.py b/addons/project_long_term/wizard/__init__.py new file mode 100644 index 00000000000..a38c9720ebc --- /dev/null +++ b/addons/project_long_term/wizard/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (). +# +# 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 . +# +############################################################################## + +import compute_phases_date + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/project_long_term/wizard/compute_phases_date.py b/addons/project_long_term/wizard/compute_phases_date.py new file mode 100644 index 00000000000..c8838d00b3d --- /dev/null +++ b/addons/project_long_term/wizard/compute_phases_date.py @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (). +# +# 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 . +# +############################################################################## + +import wizard +import pooler +from tools.translate import _ +import datetime +from resource.faces import * + +compute_form = """ +
+ + + +""" + +compute_fields = { + 'project_id': {'string':'Project', 'type':'many2one', 'relation': 'project.project', 'required':'True'}, + +} +def timeformat_convert(cr, uid, time_string, context={}): + strg = str(time_string)[-2:] + last_strg = str(time_string)[0:-2] + if strg != '.0': + if '.' not in strg: + strg = '.' + strg + last_strg = str(time_string)[:-3] + + new_strg = round(float(strg) / 0.016666667) + converted_strg = last_strg + ':' + str(new_strg)[:-2] + else: + converted_strg = last_strg + ':00' + + return converted_strg + +class wizard_compute_phases(wizard.interface): + + def _compute_date(self, cr, uid, data, context): + project_id = data['form']['project_id'] + project = pooler.get_pool(cr.dbname).get('project.project').browse(cr,uid,project_id) + phase_ids = pooler.get_pool(cr.dbname).get('project.phase').search(cr,uid,[('project_id','=',project_id)]) + if phase_ids: + phase_obj = pooler.get_pool(cr.dbname).get('project.phase').browse(cr,uid,phase_ids) + phase_1 = phase_obj[0] + if phase_1.date_start: + date_dt = datetime.datetime.strptime(phase_1.date_start,"%Y-%m-%d %H:%M:%S") + else: + date_dt = datetime.datetime.strptime(project.date_start,"%Y-%m-%d") + dt = datetime.datetime.strftime(date_dt,"%Y-%m-%d %H:%M") + + for i in range(len(phase_obj)): + final_lst = [] + leaves = [] +# if phase_obj[i].user_id.id: +# resource_id = pooler.get_pool(cr.dbname).get('resource.resource').search(cr,uid,[('user_id','=',task_obj[i].user_id.id)]) +# resource_obj = pooler.get_pool(cr.dbname).get('resource.resource').browse(cr,uid,resource_id)[0] + if project.resource_calendar_id: + non_working = "" + time_range = "8:00-8:00" + wk = {"0":"mon","1":"tue","2":"wed","3":"thu","4":"fri"} + wk_days = {} + wk_time = {} + tlist = [] + hours = [] + hr = 0 + + week_ids = pooler.get_pool(cr.dbname).get('resource.calendar.week').search(cr,uid,[('calendar_id','=',project.resource_calendar_id.id)]) + week_obj = pooler.get_pool(cr.dbname).get('resource.calendar.week').read(cr,uid,week_ids,['dayofweek','hour_from','hour_to']) + + for week in week_obj: + res_str = "" + if wk.has_key(week['dayofweek']): + day = wk[week['dayofweek']] + wk_days[week['dayofweek']] = wk[week['dayofweek']] + + hour_from_str = timeformat_convert(cr,uid,week['hour_from']) + hour_to_str = timeformat_convert(cr,uid,week['hour_to']) + hours.append(week['hour_from']) + hours.append(week['hour_to']) + res_str = hour_from_str + '-' + hour_to_str + tlist.append((day,res_str)) + + for item in tlist: + if wk_time.has_key(item[0]): + wk_time[item[0]].append(item[1]) + else: + wk_time[item[0]] = [item[0]] + wk_time[item[0]].append(item[1]) + + for k,v in wk_time.items(): + final_lst.append(tuple(v)) + print 'final Dictionary List:::',final_lst + + for k,v in wk_days.items(): + if wk.has_key(k): + wk.pop(k) + for v in wk.itervalues(): + non_working += v + ',' + if non_working: + final_lst.append((non_working[:-1],time_range)) + print 'Final list After Adding Non-Working:::',final_lst + + leave_ids = pooler.get_pool(cr.dbname).get('resource.calendar.leaves').search(cr,uid,[('calendar_id','=',project.resource_calendar_id.id)]) + if leave_ids: + res_leaves = pooler.get_pool(cr.dbname).get('resource.calendar.leaves').read(cr,uid,leave_ids,['date_from','date_to']) + for leave in range(len(res_leaves)): + dt_start = datetime.datetime.strptime(res_leaves[leave]['date_from'],'%Y-%m-%d %H:%M:%S') + dt_end = datetime.datetime.strptime(res_leaves[leave]['date_to'],'%Y-%m-%d %H:%M:%S') + no = dt_end - dt_start + leave_days = no.days + 1 + [leaves.append((dt_start + datetime.timedelta(days=x)).strftime('%Y-%m-%d')) for x in range(int(leave_days))] + leaves.sort() + print 'Dt_leavess::',leaves,tuple(leaves) + + for hour in range(0,4): + if hour%2 ==0: + hr += float(hours[hour+1]) - float(hours[hour]) + + man_days = str(phase_obj[i].duration * hr)[:-2] + 'H' + print 'Man-Days:::',man_days + + if i == 0: + new_dt = dt + else: + data = pooler.get_pool(cr.dbname).get('project.phase').read(cr,uid,[phase_obj[i-1].id],['date_end'])[0] + if phase_obj[i].constraint_date_start and data['date_end'] < phase_obj[i].constraint_date_start: + new_dt = phase_obj[i].constraint_date_start[0:16] + else: + new_dt = data['date_end'][0:16] + + class user(Resource): + pass + + def Project_1(): + resource = user + title = project.name + start = new_dt + effort = man_days + + if final_lst or leaves: + working_days = final_lst + vacation = tuple(leaves) + + def phase1(): + start = new_dt + effort = man_days + title = phase_obj[i].name + + project_1 = BalancedProject(Project_1) + start_date = project_1.calendar.WorkingDate(project_1.phase1.start).to_datetime() + e_date = project_1.calendar.WorkingDate(project_1.phase1.end).to_datetime() + if phase_obj[i].constraint_date_end and str(e_date) > phase_obj[i].constraint_date_end: + end_date = phase_obj[i].constraint_date_end + else: + end_date = e_date + + print 'Start Date::::',start_date,phase_obj[i].name + print 'End Date::::',end_date,phase_obj[i].name + pooler.get_pool(cr.dbname).get('project.phase').write(cr,uid,[phase_obj[i].id],{'date_start':start_date,'date_end':end_date}) + + return {} + states = { + 'init': { + 'actions': [], + 'result': {'type':'form', 'arch':compute_form, 'fields':compute_fields, 'state':[ + ('end', 'Cancel'), + ('ok', 'Ok') + + ]}, + }, + 'ok': { + 'actions': [_compute_date], + 'result': {'type':'state', 'state':'end'}, + } + } +wizard_compute_phases('wizard.compute.phases') + + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + + + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +