~extra-addons-commiter/openobject-extension/oerp6.1-stable

« back to all changes in this revision

Viewing changes to abstract_automatic_task/abstract_task.py

[MERGE] add abstract-automatic-task module

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
###############################################################################
 
3
#
 
4
#   abstract_automatic_task for OpenERP
 
5
#   Author: Benoît Guillot <benoit.guillot@akretion.com>
 
6
#   Copyright 2013 Akretion
 
7
#
 
8
#   This program is free software: you can redistribute it and/or modify
 
9
#   it under the terms of the GNU Affero General Public License as
 
10
#   published by the Free Software Foundation, either version 3 of the
 
11
#   License, or (at your option) any later version.
 
12
#
 
13
#   This program is distributed in the hope that it will be useful,
 
14
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
#   GNU Affero General Public License for more details.
 
17
#
 
18
#   You should have received a copy of the GNU Affero General Public License
 
19
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
20
#
 
21
###############################################################################
 
22
 
 
23
from openerp.osv import fields, orm
 
24
from collections import defaultdict
 
25
from datetime import datetime, timedelta
 
26
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
 
27
 
 
28
 
 
29
class automatic_task(orm.Model):
 
30
    _name = "automatic.task"
 
31
    _description = "Automatic Task"
 
32
 
 
33
    def _get_task_type(self, cr, uid, context=None):
 
34
        return self.get_task_type(cr, uid, context=context)
 
35
 
 
36
    def get_task_type(self, cr, uid, context=None):
 
37
        return []
 
38
 
 
39
    _columns = {
 
40
        'cron_ids': fields.many2many('ir.cron',
 
41
                                     'cron_automatic_task_rel',
 
42
                                     'cron_id',
 
43
                                     'task_id',
 
44
                                     'Cron Tasks'),
 
45
        'active': fields.boolean('Active'),
 
46
        'type': fields.selection(_get_task_type, 'Type'),
 
47
        #maybe use a fields.reference to various task to go easily from the automatic_task to the various task
 
48
        #in that case be careful that the relation is one2one between auto_task and the various task
 
49
    }
 
50
 
 
51
    _defaults = {
 
52
        'active': 1,
 
53
    }
 
54
 
 
55
    def _run_all_task_for_cron(self, cr, uid, cron_id, context=None):
 
56
        for name, model in self.pool.models.iteritems():
 
57
            if model._inherits.get('automatic.task') == 'automatic_task_id' \
 
58
               and name != 'abstrack.task':
 
59
                task_ids = model.search(cr, uid,
 
60
                                        [('cron_ids', 'in', [cron_id])],
 
61
                                        context=context)
 
62
                model.run(cr, uid, task_ids, context=context)
 
63
        return True
 
64
 
 
65
 
 
66
class abstract_task(orm.AbstractModel):
 
67
    _name = "abstrack.task"
 
68
    _description = "Abstrack Task"
 
69
    _inherits = {'automatic.task': 'automatic_task_id'}
 
70
 
 
71
    _columns ={
 
72
        'automatic_task_id': fields.many2one('automatic.task',
 
73
                                             string='Automatic Taks',
 
74
                                             required=True,
 
75
                                             ondelete="cascade"),
 
76
               }
 
77
 
 
78
    def create_cron_from_abstract(self, cr, uid, ids, context=None):
 
79
        model_data_obj = self.pool['ir.model.data']
 
80
        cron_obj = self.pool['ir.cron']
 
81
        cron_ids = []
 
82
        for task in self.browse(cr, uid, ids, context=context):
 
83
            nextcall = datetime.now() + timedelta(minutes=20)
 
84
            nextcall_fmt = datetime.strftime(nextcall,
 
85
                                             DEFAULT_SERVER_DATETIME_FORMAT)
 
86
            create_vals = {
 
87
                'auto_task_ids': [(4, task.automatic_task_id.id)],
 
88
                'active': True,
 
89
                'model': 'automatic.task',
 
90
                'function': '_run_all_task_for_cron',
 
91
                'name': task.name,
 
92
                'nextcall': nextcall_fmt,
 
93
                'doall': False,
 
94
                'numbercall': -1,
 
95
            }
 
96
            cron_id = cron_obj.create(cr, uid, create_vals, context=context)
 
97
            write_vals = {'args': '[%s]' % cron_id}
 
98
            cron_obj.write(cr, uid, [cron_id], write_vals, context=context)
 
99
            cron_ids.append(cron_id)
 
100
        #if several crons are created, open a tree view instead of a form
 
101
        #maybe useless because it's rare to call this button with several task_ids
 
102
        view_id = False
 
103
        if len(cron_ids) > 1:
 
104
            view_name = 'ir_cron_view_tree'
 
105
            view_mode = 'tree,form'
 
106
            res_id = cron_ids
 
107
            target = False
 
108
        else:
 
109
            view_name = 'automatic_cron_form_view'
 
110
            res_id = cron_ids[0]
 
111
            view_mode = 'form'
 
112
            target = 'new'
 
113
            model_data_id = model_data_obj.search(cr, uid,
 
114
                                                  [['model', '=', 'ir.ui.view'],
 
115
                                                   ['name', '=', 'automatic_cron_form_view']
 
116
                                                  ], context=context)
 
117
            if model_data_id:
 
118
                view_id = model_data_obj.read(cr, uid,
 
119
                                              model_data_id,
 
120
                                              fields=['res_id'])[0]['res_id']
 
121
        return {
 
122
            'name': 'Cron',
 
123
            'view_type': 'form',
 
124
            'view_mode': view_mode,
 
125
            'view_id': view_id and [view_id] or False,
 
126
            'res_model': 'ir.cron',
 
127
            'context': context,
 
128
            'type': 'ir.actions.act_window',
 
129
            'nodestroy': True,
 
130
            'target': target,
 
131
            'res_id': res_id,
 
132
        }
 
133
 
 
134
 
 
135
class ir_cron(orm.Model):
 
136
    _inherit = "ir.cron"
 
137
 
 
138
    _columns = {
 
139
        'auto_task_ids': fields.many2many('automatic.task',
 
140
                                          'cron_automatic_task_rel',
 
141
                                          'task_id',
 
142
                                          'cron_id',
 
143
                                          'Task'),
 
144
    }
 
145
 
 
146
    def save_and_close_cron(self, cr, uid, ids, context=None):
 
147
        return {'type': 'ir.actions.act_window_close'}
 
 
b'\\ No newline at end of file'