1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as
9 # published by the Free Software Foundation, either version 3 of the
10 # License, or (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ##############################################################################
23 # Error treatment: exception, request, ... -> send request to user_id
26 from osv import fields,osv
27 from tools.translate import _
29 class subscription_document(osv.osv):
30 _name = "subscription.document"
31 _description = "Subscription Document"
33 'name': fields.char('Name', size=60, required=True),
34 'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the subscription document without removing it."),
35 'model': fields.many2one('ir.model', 'Object', required=True),
36 'field_ids': fields.one2many('subscription.document.fields', 'document_id', 'Fields')
39 'active' : lambda *a: True,
41 subscription_document()
43 class subscription_document_fields(osv.osv):
44 _name = "subscription.document.fields"
45 _description = "Subscription Document Fields"
48 'field': fields.many2one('ir.model.fields', 'Field', domain="[('model_id', '=', parent.model)]", required=True),
49 'value': fields.selection([('false','False'),('date','Current Date')], 'Default Value', size=40, help="Default value is considered for field when new document is generated."),
50 'document_id': fields.many2one('subscription.document', 'Subscription Document', ondelete='cascade'),
53 subscription_document_fields()
55 def _get_document_types(self, cr, uid, context=None):
56 cr.execute('select m.model, s.name from subscription_document s, ir_model m WHERE s.model = m.id order by s.name')
59 class subscription_subscription(osv.osv):
60 _name = "subscription.subscription"
61 _description = "Subscription"
63 'name': fields.char('Name', size=60, required=True),
64 'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the subscription without removing it."),
65 'partner_id': fields.many2one('res.partner', 'Partner'),
66 'notes': fields.text('Notes'),
67 'user_id': fields.many2one('res.users', 'User', required=True),
68 'interval_number': fields.integer('Interval Qty'),
69 'interval_type': fields.selection([('days', 'Days'), ('weeks', 'Weeks'), ('months', 'Months')], 'Interval Unit'),
70 'exec_init': fields.integer('Number of documents'),
71 'date_init': fields.datetime('First Date'),
72 'state': fields.selection([('draft','Draft'),('running','Running'),('done','Done')], 'Status'),
73 'doc_source': fields.reference('Source Document', required=True, selection=_get_document_types, size=128, help="User can choose the source document on which he wants to create documents"),
74 'doc_lines': fields.one2many('subscription.subscription.history', 'subscription_id', 'Documents created', readonly=True),
75 'cron_id': fields.many2one('ir.cron', 'Cron Job', help="Scheduler which runs on subscription"),
76 'note': fields.text('Notes', help="Description or Summary of Subscription"),
79 'date_init': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
80 'user_id': lambda obj,cr,uid,context: uid,
81 'active': lambda *a: True,
82 'interval_number': lambda *a: 1,
83 'interval_type': lambda *a: 'months',
84 'doc_source': lambda *a: False,
85 'state': lambda *a: 'draft'
88 def set_process(self, cr, uid, ids, context=None):
89 for row in self.read(cr, uid, ids, context=context):
90 mapping = {'name':'name','interval_number':'interval_number','interval_type':'interval_type','exec_init':'numbercall','date_init':'nextcall'}
91 res = {'model':'subscription.subscription', 'args': repr([[row['id']]]), 'function':'model_copy', 'priority':6, 'user_id':row['user_id'] and row['user_id'][0]}
92 for key,value in mapping.items():
94 id = self.pool.get('ir.cron').create(cr, uid, res)
95 self.write(cr, uid, [row['id']], {'cron_id':id, 'state':'running'})
98 def model_copy(self, cr, uid, ids, context=None):
99 for row in self.read(cr, uid, ids, context=context):
100 if not row.get('cron_id',False):
102 cron_ids = [row['cron_id'][0]]
103 remaining = self.pool.get('ir.cron').read(cr, uid, cron_ids, ['numbercall'])[0]['numbercall']
105 (model_name, id) = row['doc_source'].split(',')
107 model = self.pool.get(model_name)
109 raise osv.except_osv(_('Wrong Source Document !'), _('Please provide another source document.\nThis one does not exist !'))
111 default = {'state':'draft'}
112 doc_obj = self.pool.get('subscription.document')
113 document_ids = doc_obj.search(cr, uid, [('model.model','=',model_name)])
114 doc = doc_obj.browse(cr, uid, document_ids)[0]
115 for f in doc.field_ids:
117 value = time.strftime('%Y-%m-%d')
120 default[f.field.name] = value
124 # if there was only one remaining document to generate
125 # the subscription is over and we mark it as being done
128 id = self.pool.get(model_name).copy(cr, uid, id, default, context)
129 self.pool.get('subscription.subscription.history').create(cr, uid, {'subscription_id': row['id'], 'date':time.strftime('%Y-%m-%d %H:%M:%S'), 'document_id': model_name+','+str(id)})
130 self.write(cr, uid, [row['id']], {'state':state})
133 def unlink(self, cr, uid, ids, context=None):
134 for record in self.browse(cr, uid, ids, context or {}):
135 if record.state=="running":
136 raise osv.except_osv(_('Error!'),_('You cannot delete an active subscription !'))
137 return super(subscription_subscription, self).unlink(cr, uid, ids, context)
139 def set_done(self, cr, uid, ids, context=None):
140 res = self.read(cr,uid, ids, ['cron_id'])
141 ids2 = [x['cron_id'][0] for x in res if x['id']]
142 self.pool.get('ir.cron').write(cr, uid, ids2, {'active':False})
143 self.write(cr, uid, ids, {'state':'done'})
146 def set_draft(self, cr, uid, ids, context=None):
147 self.write(cr, uid, ids, {'state':'draft'})
149 subscription_subscription()
151 class subscription_subscription_history(osv.osv):
152 _name = "subscription.subscription.history"
153 _description = "Subscription history"
156 'date': fields.datetime('Date'),
157 'subscription_id': fields.many2one('subscription.subscription', 'Subscription', ondelete='cascade'),
158 'document_id': fields.reference('Source Document', required=True, selection=_get_document_types, size=128),
160 subscription_subscription_history()
163 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: