From 9500765ab16a62713aead9e32df947173b0ab22d Mon Sep 17 00:00:00 2001 From: Lorenzo Battistini Date: Fri, 7 Dec 2012 18:35:12 +0100 Subject: [PATCH] [ADD] super_calendar module moved from https://code.launchpad.net/~domsense/domsense-agilebg-addons/6.1 --- super_calendar/AUTHORS.txt | 1 + super_calendar/__init__.py | 22 +++ super_calendar/__openerp__.py | 46 ++++++ super_calendar/cron_data.xml | 15 ++ super_calendar/security/ir.model.access.csv | 4 + super_calendar/super_calendar.py | 135 ++++++++++++++++++ super_calendar/super_calendar_view.xml | 146 ++++++++++++++++++++ 7 files changed, 369 insertions(+) create mode 100644 super_calendar/AUTHORS.txt create mode 100644 super_calendar/__init__.py create mode 100644 super_calendar/__openerp__.py create mode 100644 super_calendar/cron_data.xml create mode 100755 super_calendar/security/ir.model.access.csv create mode 100644 super_calendar/super_calendar.py create mode 100644 super_calendar/super_calendar_view.xml diff --git a/super_calendar/AUTHORS.txt b/super_calendar/AUTHORS.txt new file mode 100644 index 000000000..7106ca0eb --- /dev/null +++ b/super_calendar/AUTHORS.txt @@ -0,0 +1 @@ +Lorenzo Battistini diff --git a/super_calendar/__init__.py b/super_calendar/__init__.py new file mode 100644 index 000000000..294e4affa --- /dev/null +++ b/super_calendar/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2012 Agile Business Group sagl () +# Copyright (C) 2012 Domsense srl () +# All Rights Reserved +# +# 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 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 super_calendar diff --git a/super_calendar/__openerp__.py b/super_calendar/__openerp__.py new file mode 100644 index 000000000..81d6a736d --- /dev/null +++ b/super_calendar/__openerp__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2012 Agile Business Group sagl () +# Copyright (C) 2012 Domsense srl () +# All Rights Reserved +# +# 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 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 . +# +############################################################################## +{ + 'name': "Super Calendar", + 'version': '0.1', + 'category': 'Generic Modules/Others', + 'description': """ + This module allows to create configurable calendars. + + Through the 'calendar configurator' object, you can specify which models have to be merged in the super calendar. For each model, you have to define the 'description' and 'date_start' fields at least. Then you can define 'duration' and the 'user_id' fields. + + The 'super.calendar' object contains the the merged calendars. The 'super.calendar' can be updated by 'ir.cron' or manually. + """, + 'author': 'Agile Business Group & Domsense', + 'website': 'http://www.agilebg.com', + 'license': 'AGPL-3', + "depends" : ['base'], + "init_xml" : [], + "update_xml" : [ + 'super_calendar_view.xml', + 'cron_data.xml', + 'security/ir.model.access.csv', + ], + "demo_xml" : [], + "active": False, + "installable": True +} diff --git a/super_calendar/cron_data.xml b/super_calendar/cron_data.xml new file mode 100644 index 000000000..2c59125ca --- /dev/null +++ b/super_calendar/cron_data.xml @@ -0,0 +1,15 @@ + + + + + Generate Calendar Records + 10 + minutes + -1 + + + + + + + diff --git a/super_calendar/security/ir.model.access.csv b/super_calendar/security/ir.model.access.csv new file mode 100755 index 000000000..0281b5739 --- /dev/null +++ b/super_calendar/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_model_super_calendar_configurator,access_model_super_calendar_configurator,model_super_calendar_configurator,base.group_system,1,1,1,1 +access_model_super_calendar_configurator_line,access_model_super_calendar_configurator_line,model_super_calendar_configurator_line,base.group_system,1,1,1,1 +access_model_super_calendar,access_model_super_calendar,model_super_calendar,base.group_user,1,0,0,0 diff --git a/super_calendar/super_calendar.py b/super_calendar/super_calendar.py new file mode 100644 index 000000000..4285bfabb --- /dev/null +++ b/super_calendar/super_calendar.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2012 Agile Business Group sagl () +# Copyright (C) 2012 Domsense srl () +# All Rights Reserved +# +# 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 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 . +# +############################################################################## + +from osv import fields, osv +from tools.translate import _ +import netsvc +from mako.template import Template +from datetime import datetime +from openerp import tools + +def _models_get(self, cr, uid, context={}): + obj = self.pool.get('ir.model') + ids = obj.search(cr, uid, []) + res = obj.read(cr, uid, ids, ['model', 'name'], context) + return [(r['model'], r['name']) for r in res] + +class super_calendar_configurator(osv.osv): + _logger = netsvc.Logger() + _name = 'super.calendar.configurator' + _columns = { + 'name': fields.char('Name', size=64, required=True), + 'line_ids': fields.one2many('super.calendar.configurator.line', 'configurator_id', 'Lines'), + } + + def generate_calendar_records(self, cr, uid, ids, context=None): + configurator_ids = self.search(cr, uid, []) + super_calendar_pool = self.pool.get('super.calendar') + + # removing old records + super_calendar_ids = super_calendar_pool.search(cr, uid, []) + super_calendar_pool.unlink(cr, uid, super_calendar_ids) + + for configurator_id in configurator_ids: + configurator = self.browse(cr, uid, configurator_id) + for line in configurator.line_ids: + current_pool = self.pool.get(line.name.model) + current_record_ids = current_pool.search(cr, uid, line.domain and eval(line.domain) or []) + for current_record_id in current_record_ids: + current_record = current_pool.browse(cr, uid, current_record_id) + if line.user_field_id and \ + current_record[line.user_field_id.name] and current_record[line.user_field_id.name]._table_name != 'res.users': + raise osv.except_osv(_('Error'), + _("The 'User' field of record %s (%s) does not refer to res.users") + % (current_record[line.description_field_id.name], line.name.model)) + if ((line.description_field_id and current_record[line.description_field_id.name]) or line.description_code) \ + and current_record[line.date_start_field_id.name]: + duration = False + if not line.duration_field_id and line.date_stop_field_id and current_record[line.date_start_field_id.name] and current_record[line.date_stop_field_id.name]: + date_start= datetime.strptime(current_record[line.date_start_field_id.name], tools.DEFAULT_SERVER_DATETIME_FORMAT) + date_stop= datetime.strptime(current_record[line.date_stop_field_id.name], tools.DEFAULT_SERVER_DATETIME_FORMAT) + duration = (date_stop - date_start).total_seconds() / 3600 + elif line.duration_field_id: + duration = current_record[line.duration_field_id.name] + if line.description_type != 'code': + name = current_record[line.description_field_id.name] + else: + parse_dict = {'o': current_record} + mytemplate = Template(line.description_code) + name= mytemplate.render(**parse_dict) + super_calendar_values = { + 'name': name, + 'model_description': line.description, + 'date_start': current_record[line.date_start_field_id.name], + 'duration': duration, + 'user_id': line.user_field_id and current_record[line.user_field_id.name] and current_record[line.user_field_id.name].id or False, + 'configurator_id': configurator.id, + 'res_id': line.name.model+','+str(current_record['id']), + 'model_id': line.name.id, + } + super_calendar_pool.create(cr, uid, super_calendar_values) + self._logger.notifyChannel('super_calendar', netsvc.LOG_INFO, "Calendar generated") + return True + +super_calendar_configurator() + +class super_calendar_configurator_line(osv.osv): + _name = 'super.calendar.configurator.line' + _columns = { + 'name': fields.many2one('ir.model', 'Model', required=True), + 'description': fields.char('Description', size=128, required=True), + 'domain': fields.char('Domain', size=512), + 'configurator_id': fields.many2one('super.calendar.configurator', 'Configurator'), + 'description_type': fields.selection([ + ('field', 'Field'), + ('code', 'Code'), + ], string="Description Type"), + 'description_field_id': fields.many2one('ir.model.fields', 'Description field', + domain="[('model_id', '=', name),('ttype', '=', 'char')]"), + 'description_code': fields.text('Description field', help="Use '${o}' to refer to the involved object. E.g.: '${o.project_id.name}'"), + 'date_start_field_id': fields.many2one('ir.model.fields', 'Start date field', + domain="['&','|',('ttype', '=', 'datetime'),('ttype', '=', 'date'),('model_id', '=', name)]", + required=True), + 'date_stop_field_id': fields.many2one('ir.model.fields', 'End date field', + domain="['&',('ttype', '=', 'datetime'),('model_id', '=', name)]"), + 'duration_field_id': fields.many2one('ir.model.fields', 'Duration field', + domain="['&',('ttype', '=', 'float'),('model_id', '=', name)]"), + 'user_field_id': fields.many2one('ir.model.fields', 'User field', + domain="['&',('ttype', '=', 'many2one'),('model_id', '=', name)]"), + } + +super_calendar_configurator_line() + +class super_calendar(osv.osv): + _name = 'super.calendar' + _columns = { + 'name': fields.char('Description', size=512, required=True), + 'model_description': fields.char('Model Description', size=128, required=True), + 'date_start':fields.datetime('Start date', required=True), + #'date_stop':fields.datetime('End date'), # to be removed? + 'duration':fields.float('Duration'), + 'user_id': fields.many2one('res.users', 'User'), + 'configurator_id': fields.many2one('super.calendar.configurator', 'Configurator'), + 'res_id': fields.reference('Resource', selection=_models_get, size=128), + 'model_id': fields.many2one('ir.model', 'Model'), + } +super_calendar() diff --git a/super_calendar/super_calendar_view.xml b/super_calendar/super_calendar_view.xml new file mode 100644 index 000000000..924e8ca90 --- /dev/null +++ b/super_calendar/super_calendar_view.xml @@ -0,0 +1,146 @@ + + + + + + + + super_calendar_configurator_tree + super.calendar.configurator + tree + + + + + + + + super_calendar_configurator_form + super.calendar.configurator + form + +
+ + + + + + + + + + + + + + + + + + + + + + + + +