diff options
| author | sbh (Open ERP) <sbh@tinyerp.com> | 2010-11-01 11:43:43 +0530 |
|---|---|---|
| committer | sbh (Open ERP) <sbh@tinyerp.com> | 2010-11-01 11:43:43 +0530 |
| commit | aaa0b610b1017ff4f9df9add2ee6cc5af5ade421 (patch) | |
| tree | b371309cd97bccb9d5195813189e3c42a244b789 /addons/project_long_term/wizard | |
| parent | 263091c0e454f4de86de49310a8b50d565969fc7 (diff) | |
| parent | 9d44b90544bc1636e493c9be7301dbda69e1921f (diff) | |
[MERGE] Merge with trunk-dev-addons1
bzr revid: sbh@tinyerp.com-20101101061343-oefsywzw2l441hub
Diffstat (limited to 'addons/project_long_term/wizard')
8 files changed, 72 insertions, 471 deletions
diff --git a/addons/project_long_term/wizard/__init__.py b/addons/project_long_term/wizard/__init__.py index fb8a29449f7..c1e6d838111 100644 --- a/addons/project_long_term/wizard/__init__.py +++ b/addons/project_long_term/wizard/__init__.py @@ -22,7 +22,5 @@ import project_compute_phases import project_compute_tasks import project_schedule_tasks -import working_calendar # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/project_long_term/wizard/project_compute_phases.py b/addons/project_long_term/wizard/project_compute_phases.py index 5353db25be6..ade1da5c9d9 100644 --- a/addons/project_long_term/wizard/project_compute_phases.py +++ b/addons/project_long_term/wizard/project_compute_phases.py @@ -18,17 +18,10 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -import datetime -from resource.faces import * -from new import classobj - from tools.translate import _ from osv import fields, osv -import working_calendar as wkcal - class project_compute_phases(osv.osv_memory): - _name = 'project.compute.phases' _description = 'Project Compute Phases' _columns = { @@ -37,124 +30,33 @@ class project_compute_phases(osv.osv_memory): ], 'Schedule', required = True), 'project_id': fields.many2one('project.project', 'Project') - } + } _defaults = { 'target_project': 'all' - } + } def check_selection(self, cr, uid, ids, context=None): - data_select = self.read(cr, uid, ids, ['target_project'])[0] return self.compute_date(cr, uid, ids, context=context) - def _phase_schedule(self, cr, uid, phase, start_date, calendar_id=False, context=None): - """Schedule phase with the start date till all the next phases are completed. - - Arguements: start_dsate -- start date for the phase - calendar_id -- working calendar of the project - - """ - phase_obj = self.pool.get('project.phase') - 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: - leaves = [] - time_efficiency = 1.0 - resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)]) - - if resource_id: - # Create a new resource object with - # all the attributes of the Resource Class - resource = resource_obj.browse(cr, uid, resource_id, context=context)[0] - time_efficiency = resource.time_efficiency - leaves = wkcal.compute_leaves(cr, uid, calendar_id , resource.id, resource.calendar_id.id) - phase_resource_obj = classobj((phase.responsible_id.name.encode('utf8')), (Resource,), - {'__doc__': phase.responsible_id.name, - '__name__': phase.responsible_id.name, - 'vacation': tuple(leaves), - 'efficiency': time_efficiency - }) - default_uom_id = uom_obj.search(cr, uid, [('name','=','Hour')])[0] - avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) - duration = str(avg_hours) + 'H' - # Create a new project for each phase - def Project(): - start = start_date - minimum_time_unit = 1 - resource = phase_resource_obj - # If project has working calendar then that - # else the default one would be considered - if calendar_id: - working_days = wkcal.compute_working_calendar(cr, uid, calendar_id, context=context) - vacation = tuple(wkcal.compute_leaves(cr, uid, calendar_id)) - - def phase(): - effort = duration - - project = BalancedProject(Project) - s_date = project.phase.start.to_datetime() - e_date = project.phase.end.to_datetime() - # Recalculate date_start and date_end - # according to constraints on date start and date end on phase - if phase.constraint_date_start and str(s_date) < phase.constraint_date_start: - start_date = datetime.datetime.strptime(phase.constraint_date_start, '%Y-%m-%d %H:%M:%S') - else: - start_date = s_date - if phase.constraint_date_end and str(e_date) > phase.constraint_date_end: - end_date= datetime.datetime.strptime(phase.constraint_date_end, '%Y-%m-%d %H:%M:%S') - date_start = phase.constraint_date_end[:-3] - else: - end_date = e_date - date_start = end_date - # Write the calculated dates back - ctx = context.copy() - ctx.update({'scheduler': True}) - phase_obj.write(cr, uid, [phase.id], {'date_start': start_date.strftime('%Y-%m-%d %H:%M:%S'), - 'date_end': end_date.strftime('%Y-%m-%d %H:%M:%S')}, - context=ctx) - # Recursive call till all the next phases scheduled - for phase in phase.next_phase_ids: - if phase.state in ['draft','open','pending']: - id_cal = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False - self._phase_schedule(cr, uid, phase, date_start, id_cal, context=context) - else: - continue - + def compute_date(self, cr, uid, ids, context=None): """ Compute the phases for scheduling. """ - if context is None: context = {} - project_obj = self.pool.get('project.project') - phase_obj = self.pool.get('project.phase') + project_pool = self.pool.get('project.project') 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), - ('state', 'in', ['draft', 'open', 'pending']), - ('previous_phase_ids', '=', False) - ]) + project_ids = [data['project_id']] else: # Else take all the draft,open,pending states phases - phase_ids = phase_obj.search(cr, uid,[('state', 'in', ['draft', 'open', 'pending']), - ('previous_phase_ids', '=', False) - ], context=context) - phase_ids.sort() - phases = phase_obj.browse(cr, uid, phase_ids, context=context) - for phase in phases: - start_date = phase.project_id.date_start - if not phase.project_id.date_start: - start_date = datetime.datetime.now().strftime("%Y-%m-%d") - start_dt = datetime.datetime.strftime((datetime.datetime.strptime(start_date, "%Y-%m-%d")), "%Y-%m-%d %H:%M") - calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False - self._phase_schedule(cr, uid, phase, start_dt, calendar_id, context=context) + project_ids = project_pool.search(cr, uid, [], context=context) + + project_pool.schedule_phases(cr, uid, project_ids, context=context) return self._open_phases_list(cr, uid, data, context=context) def _open_phases_list(self, cr, uid, data, context=None): @@ -165,13 +67,10 @@ class project_compute_phases(osv.osv_memory): context = {} mod_obj = self.pool.get('ir.model.data') act_obj = self.pool.get('ir.actions.act_window') - result = mod_obj._get_id(cr, uid, 'project_long_term', 'act_project_phase') + result = mod_obj._get_id(cr, uid, 'project_long_term', 'act_project_phase_list') id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id'] result = act_obj.read(cr, uid, [id], context=context)[0] - result['domain'] = [('state', 'not in', ['cancelled','done'])] - if data['project_id']: - result['domain'] = [('project_id', '=', data['project_id']), - ('state', 'not in', ['cancelled','done'])] + result['context'] = {"search_default_project_id":data['project_id'], "search_default_responsible_id":uid, "search_default_current": 1} return result project_compute_phases() 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 0a3b2e12336..9d5754af09c 100644 --- a/addons/project_long_term/wizard/project_compute_phases_view.xml +++ b/addons/project_long_term/wizard/project_compute_phases_view.xml @@ -8,22 +8,18 @@ <field name="type">form</field> <field name="arch" type="xml"> <form string="Compute Scheduling of Phases"> - <group height="170" width="500"> - <group colspan="4" col="4"> - <label colspan="4" string="This wizard will schedule phases for all or specified project" /> - <newline /> - <field name="target_project" colspan="4"/> - </group> - <newline /> - <group colspan="4" col="6" attrs="{'invisible':[('target_project','=','all')]}"> - <field name="project_id"/> - </group> - <separator colspan="4"/> - <group colspan="4" col="6"> <!-- Improve me --> - <button icon="gtk-cancel" special="cancel" string="_Cancel"/> - <button icon="gtk-ok" name="check_selection" string="_Compute" type="object"/> - </group> - </group> + <group colspan="4" col="4"> + <separator colspan="4" string="Compute Scheduling of phases for all or specified project" /> + <field name="target_project" colspan="4"/> + <field name="project_id" widget="selection" colspan="4" attrs="{'invisible':[('target_project','=','all')], 'required':[('target_project','!=','all')]}"/> + <separator colspan="4"/> + <group colspan="2" col="2"> + </group> + <group colspan="2" col="2"> <!-- Improve me --> + <button icon="gtk-cancel" special="cancel" string="_Cancel"/> + <button icon="gtk-ok" name="check_selection" string="C_ompute" type="object"/> + </group> + </group> </form> </field> </record> @@ -35,12 +31,14 @@ <field name="view_type">form</field> <field name="view_mode">form</field> <field name="view_id" ref="view_project_compute_phases_select"/> - <field name="context">{'record_id' : active_id}</field> + <field name="context">{'record_id': active_id}</field> <field name="target">new</field> + <field name="help">To schedule phases of all or a specified project. It then open a gantt view. + </field> </record> <menuitem id="menu_compute_phase" name="Compute Phase Scheduling" parent="menu_phase_schedule" action="action_project_compute_phases"/> </data> -</openerp>
\ No newline at end of file +</openerp> diff --git a/addons/project_long_term/wizard/project_compute_tasks.py b/addons/project_long_term/wizard/project_compute_tasks.py index 9f2eb707c60..0d5fa22e6a8 100644 --- a/addons/project_long_term/wizard/project_compute_tasks.py +++ b/addons/project_long_term/wizard/project_compute_tasks.py @@ -18,125 +18,47 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -import datetime -from resource.faces import * -from new import classobj -import operator -from tools.translate import _ from osv import osv, fields -import working_calendar as wkcal - class project_compute_tasks(osv.osv_memory): _name = 'project.compute.tasks' _description = 'Project Compute Tasks' _columns = { 'project_id': fields.many2one('project.project', 'Project', required=True) - } + } def compute_date(self, cr, uid, ids, context=None): """ Schedule the tasks according to resource available and priority. """ - project_obj = self.pool.get('project.project') + project_pool = self.pool.get('project.project') task_pool = self.pool.get('project.task') - resource_obj = self.pool.get('resource.resource') - user_obj = self.pool.get('res.users') - if context is None: context = {} - + context['compute_by'] = 'project' data = self.read(cr, uid, ids, [])[0] project_id = data['project_id'] - project = project_obj.browse(cr, uid, project_id, context=context) - task_ids = task_pool.search(cr, uid, [('project_id', '=', project_id), - ('state', 'in', ['draft', 'open', 'pending']) - ]) - if task_ids: - task_ids.sort() - tasks = task_pool.browse(cr, uid, task_ids, context=context) - calendar_id = project.resource_calendar_id and project.resource_calendar_id.id or False - start_date = project.date_start - if not project.date_start: - start_date = datetime.datetime.now().strftime("%Y-%m-%d") - date_start = datetime.datetime.strftime(datetime.datetime.strptime(start_date, "%Y-%m-%d"), "%Y-%m-%d %H:%M") - # Create Resource Class objects which are the Project Members - resources = [] - for user in project.members: - leaves = [] - time_efficiency = 1.0 - resource_id = resource_obj.search(cr, uid, [('user_id', '=', user.id)], context=context) - if resource_id: -# resource = resource_obj.browse(cr, uid, resource_id, context=context)[0] - resource = resource_obj.read(cr, uid, resource_id, ['calendar_id','time_efficiency'], context=context)[0] - if resource.get('calendar_id', False): - leaves = wkcal.compute_leaves(cr, uid, calendar_id , resource_id[0], resource['calendar_id'] and resource['calendar_id'][0] or False) - time_efficiency = resource.get('time_efficiency') - resources.append(classobj((user.name.encode('utf8')), (Resource,), {'__doc__': user.name, - '__name__': user.name, - 'vacation': tuple(leaves), - 'efficiency': time_efficiency - })) - priority_dict = {'0': 1000, '1': 800, '2': 500, '3': 300,'4': 100} - # Create dynamic no of tasks with the resource specified - def create_tasks(j, eff, priorty=500, obj=None): - def task(): - """ - task is a dynamic method! - """ - effort = eff - if obj: - resource = obj - priority = priorty - task.__doc__ = "TaskNO%d" %j - task.__name__ = "task%d" %j - return task + project_pool.schedule_tasks(cr, uid, [project_id], context=context) + return self._open_task_list(cr, uid, data, context=context) - # Create a 'Faces' project with all the tasks and resources - def Project(): - title = project.name - start = date_start - try: - resource = reduce(operator.or_, resources) - except: - raise osv.except_osv(_('Error'), _('Project must have members assigned !')) - minimum_time_unit = 1 - if calendar_id: # If project has calendar - working_days = wkcal.compute_working_calendar(cr, uid, calendar_id) - vacation = tuple(wkcal.compute_leaves(cr, uid, calendar_id)) - # Dynamic Creation of tasks - i = 0 - for each_task in tasks: - hours = str(each_task.planned_hours / each_task.occupation_rate)+ 'H' - if each_task.priority in priority_dict.keys(): - priorty = priority_dict[each_task.priority] - if each_task.user_id: - for resource in resources: - if resource.__name__ == each_task.user_id.name: # check me!! - task = create_tasks(i, hours, priorty, resource) - else: - task = create_tasks(i, hours, priorty) - i += 1 - - project = BalancedProject(Project) - loop_no = 0 - # Write back the computed dates - for t in project: - s_date = t.start.to_datetime() - e_date = t.end.to_datetime() - if loop_no == 0: - project_obj.write(cr, uid, [project_id], {'date' : e_date}, context=context) - else: - ctx = context.copy() - ctx.update({'scheduler': True}) - user_id = user_obj.search(cr, uid, [('name', '=', t.booked_resource[0].__name__)]) - task_pool.write(cr, uid, [tasks[loop_no-1].id], {'date_start': s_date.strftime('%Y-%m-%d %H:%M:%S'), - 'date_end': e_date.strftime('%Y-%m-%d %H:%M:%S'), - 'user_id': user_id[0]}, - context=ctx) - loop_no +=1 - return {} + def _open_task_list(self, cr, uid, data, context=None): + """ + Return the scheduled task list. + """ + if context is None: + context = {} + mod_obj = self.pool.get('ir.model.data') + act_obj = self.pool.get('ir.actions.act_window') + result = mod_obj._get_id(cr, uid, 'project', 'action_view_task') + id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id'] + result = {} + if not id: + return result + result = act_obj.read(cr, uid, [id], context=context)[0] + result['context'] = {"search_default_project_id":data['project_id'], "search_default_user_id":uid, "search_default_current": 1} + return result project_compute_tasks() -# 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/project_long_term/wizard/project_compute_tasks_view.xml b/addons/project_long_term/wizard/project_compute_tasks_view.xml index eff475b4f11..e6540fafff9 100644 --- a/addons/project_long_term/wizard/project_compute_tasks_view.xml +++ b/addons/project_long_term/wizard/project_compute_tasks_view.xml @@ -7,12 +7,16 @@ <field name="model">project.compute.tasks</field> <field name="type">form</field> <field name="arch" type="xml"> - <form string="Compute Scheduling of Phases"> - <group colspan="4" height="100" width="500"> - <field name="project_id"/> - <group colspan="4" col="6"> + <form string="Compute Scheduling of Task"> + <group colspan="4"> + <separator colspan="4" string="Compute Scheduling of Task for specified project." /> + <field name="project_id" widget="selection" colspan="4"/> + <separator colspan="4"/> + <group colspan="2" col="2"> + </group> + <group colspan="2" col="2"> <button icon="gtk-cancel" special="cancel" string="_Cancel"/> - <button icon="gtk-ok" name="compute_date" string="Compute" type="object"/> + <button icon="gtk-ok" name="compute_date" string="C_ompute" type="object"/> </group> </group> </form> @@ -34,4 +38,4 @@ parent="menu_phase_schedule" action="action_project_compute_tasks"/> </data> -</openerp>
\ No newline at end of file +</openerp> diff --git a/addons/project_long_term/wizard/project_schedule_tasks.py b/addons/project_long_term/wizard/project_schedule_tasks.py index 8ec2d4c16e0..48039112e86 100644 --- a/addons/project_long_term/wizard/project_schedule_tasks.py +++ b/addons/project_long_term/wizard/project_schedule_tasks.py @@ -18,142 +18,36 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -import datetime -from resource.faces import * -from new import classobj -import operator -from tools.translate import _ -from osv import osv, fields - -import working_calendar as wkcal +from osv import fields, osv class project_schedule_task(osv.osv_memory): - _name = "project.schedule.tasks" _description = 'project.schedule.tasks' _columns = { 'msg': fields.char('Message', size=64) - } + } _defaults = { 'msg': 'Task Scheduling Completed Successfully' - } + } def default_get(self, cr, uid, fields_list, context=None): + if context is None: + context = {} res = super(project_schedule_task, self).default_get(cr, uid, fields_list, context) self.compute_date(cr, uid, context=context) return res - - def create_resources(self, cr, uid, phase, context=None): - """ - Return a list of Resource Class objects for the resources allocated to the phase. - """ - resource_objs = [] - - if context is None: - context = {} - - for resource in phase.resource_ids: - res = resource.resource_id - leaves = [] - resource_eff = res.time_efficiency - resource_cal = res.calendar_id.id - if resource_cal: - cal_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False - leaves = wkcal.compute_leaves(cr, uid, cal_id, res.id, resource_cal, context=context) - resource_objs.append(classobj(res.user_id.name.encode('utf8'), (Resource,), - {'__doc__': res.user_id.name, - '__name__': res.user_id.name, - 'vacation': tuple(leaves), - 'efficiency': resource_eff, - })) - return resource_objs - + def compute_date(self, cr, uid, context=None): """ Schedule the tasks according to resource available and priority. """ - - phase_obj = self.pool.get('project.phase') - task_obj = self.pool.get('project.task') - user_obj = self.pool.get('res.users') - + phase_pool = self.pool.get('project.phase') if context is None: context = {} - if not 'active_id' in context: return {} - phase = phase_obj.browse(cr, uid, context['active_id'], context=context) - task_ids = map(lambda x : x.id, (filter(lambda x : x.state in ['open', 'draft', 'pending'] , phase.task_ids))) - if task_ids: - task_ids.sort() - tasks = task_obj.browse(cr, uid, task_ids, context=context) - start_date = str(phase.date_start)[:-9] - if not phase.date_start: - if not phase.project_id.date_start: - start_date = datetime.datetime.now().strftime("%Y-%m-%d") - else: - start_date = phase.project_id.date_start - date_start = datetime.datetime.strftime(datetime.datetime.strptime(start_date, "%Y-%m-%d"), "%Y-%m-%d %H:%M") - calendar_id = phase.project_id.resource_calendar_id.id - resources = self.create_resources(cr, uid, phase) - priority_dict = {'0': 1000, '1': 800, '2': 500, '3': 300, '4': 100} - # Create dynamic no of tasks with the resource specified - def create_tasks(j, eff, priorty=500, obj=False): - def task(): - """ - task is a dynamic method! - """ - effort = eff - if obj: - resource = obj - priority = priorty - task.__doc__ = "TaskNO%d" %j - task.__name__ = "task%d" %j - return task - - # Create a 'Faces' project with all the tasks and resources - def Project(): - title = "Project" - start = date_start - try: - resource = reduce(operator.or_, resources) - except: - raise osv.except_osv(_('Error'), _('Phase must have resources assigned !')) - minimum_time_unit = 1 - if calendar_id: # If project has working calendar - working_days = wkcal.compute_working_calendar(cr, uid, calendar_id) - vacation = tuple(wkcal.compute_leaves(cr, uid, calendar_id)) - # Dynamic creation of tasks - i = 0 - for each_task in tasks: - hours = str(each_task.planned_hours / each_task.occupation_rate)+ 'H' - if each_task.priority in priority_dict.keys(): - priorty = priority_dict[each_task.priority] - if each_task.user_id: - for resource in resources: - if resource.__name__ == each_task.user_id.name: - task = create_tasks(i, hours, priorty, resource) - else: - task = create_tasks(i, hours, priorty) - i += 1 - - project = BalancedProject(Project) - loop_no = 0 - # Write back the computed dates - for t in project: - s_date = t.start.to_datetime() - e_date = t.end.to_datetime() - if loop_no > 0: - ctx = context.copy() - ctx.update({'scheduler': True}) - user_id = user_obj.search(cr, uid, [('name', '=', t.booked_resource[0].__name__)]) - task_obj.write(cr, uid, [tasks[loop_no-1].id], {'date_start': s_date.strftime('%Y-%m-%d %H:%M:%S'), - 'date_end': e_date.strftime('%Y-%m-%d %H:%M:%S'), - 'user_id': user_id[0]}, - context=ctx) - loop_no +=1 - return {} - + return phase_pool.schedule_tasks(cr, uid, [context['active_id']], context=context) project_schedule_task() + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_long_term/wizard/project_schedule_tasks_view.xml b/addons/project_long_term/wizard/project_schedule_tasks_view.xml index f17d573185d..f8e2f2d828b 100644 --- a/addons/project_long_term/wizard/project_schedule_tasks_view.xml +++ b/addons/project_long_term/wizard/project_schedule_tasks_view.xml @@ -8,7 +8,7 @@ <field name="type">form</field> <field name="arch" type="xml"> <form string="Schedule Tasks"> - <group height="90" width="250"> + <group height="90" width="275"> <label string="Task Scheduling completed successfully."/> <group colspan="4" col="6"> <button icon="gtk-ok" colspan="4" special="cancel" string="_Ok"/> @@ -25,9 +25,9 @@ <field name="view_type">form</field> <field name="view_mode">form</field> <field name="view_id" ref="view_project_schedule_tasks"/> - <field name="context">{'record_id' : active_id}</field> + <field name="context">{'record_id': active_id}</field> <field name="target">new</field> </record> </data> -</openerp>
\ No newline at end of file +</openerp> diff --git a/addons/project_long_term/wizard/working_calendar.py b/addons/project_long_term/wizard/working_calendar.py deleted file mode 100644 index ba8ec7db150..00000000000 --- a/addons/project_long_term/wizard/working_calendar.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 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 datetime - -import pooler - -def convert_timeformat(cr, uid, time_string, context={}): - """ Convert input time string: 8.5 to output time string 8:30.""" - - split_list = str(time_string).split('.') - hour_part = split_list[0] - mins_part = split_list[1] - round_mins = int(round(float(mins_part) * 60,-2)) - converted_string = hour_part + ':' + str(round_mins)[0:2] - return converted_string - -def compute_leaves(cr, uid, calendar_id, resource_id=False, resource_calendar=False, context={}): - - """Compute the leaves from the working calendar of the resource. - - Arguements: calendar_id -- working calendar of the project - resource_id -- resource working on phase/task - resource_calendar -- working calendar of the resource - - """ - - pool = pooler.get_pool(cr.dbname) - resource_calendar_leaves_obj = pool.get('resource.calendar.leaves') - leave_list = [] - if resource_id: - leave_ids = resource_calendar_leaves_obj.search(cr, uid, ['|', ('calendar_id', '=', calendar_id), - ('calendar_id', '=', resource_calendar), - ('resource_id', '=', resource_id) - ], context=context) - else: - leave_ids = resource_calendar_leaves_obj.search(cr, uid, [('calendar_id', '=', calendar_id), - ('resource_id', '=', False) - ], context=context) - leaves = resource_calendar_leaves_obj.read(cr, uid, leave_ids, ['date_from', 'date_to'], context=context) - for i in range(len(leaves)): - dt_start = datetime.datetime.strptime(leaves[i]['date_from'], '%Y-%m-%d %H:%M:%S') - dt_end = datetime.datetime.strptime(leaves[i]['date_to'], '%Y-%m-%d %H:%M:%S') - no = dt_end - dt_start - [leave_list.append((dt_start + datetime.timedelta(days=x)).strftime('%Y-%m-%d')) for x in range(int(no.days + 1))] - leave_list.sort() - return leave_list - -def compute_working_calendar(cr, uid, calendar_id, context={}): - - """Change the format of working calendar from 'Openerp' format to bring it into 'Faces' format. - - Arguement: calendar_id -- working calendar of the project - - """ - - pool = pooler.get_pool(cr.dbname) - resource_week_obj = pool.get('resource.calendar.week') - time_range = "8:00-8:00" - non_working = "" - week_days = {"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_obj.search(cr, uid, [('calendar_id', '=', calendar_id)], context=context) - weeks = resource_week_obj.read(cr, uid, week_ids, ['dayofweek', 'hour_from', 'hour_to'], context=context) - # Convert time formats into appropriate format required - # and create a list like [('mon', '8:00-12:00'), ('mon', '13:00-18:00')] - for week in weeks: - res_str = "" - if week_days.has_key(week['dayofweek']): - day = week_days[week['dayofweek']] - wk_days[week['dayofweek']] = week_days[week['dayofweek']] - hour_from_str = convert_timeformat(cr, uid, week['hour_from']) - hour_to_str = convert_timeformat(cr, uid, week['hour_to']) - res_str = hour_from_str + '-' + hour_to_str - wktime_list.append((day, res_str)) - # Convert into format like [('mon', '8:00-12:00', '13:00-18:00')] - for item in wktime_list: - 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(): - wktime_cal.append(tuple(v)) - # Add for the non-working days like: [('sat, sun', '8:00-8:00')] - for k,v in wk_days.items(): - if week_days.has_key(k): - week_days.pop(k) - for v in week_days.itervalues(): - non_working += v + ',' - if non_working: - 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 |
