@ -19,7 +19,7 @@
#
##############################################################################
from openerp.osv import fields , osv , o rm
from openerp.osv import fields , orm
from openerp.tools.translate import _
import logging
from mako.template import Template
@ -27,19 +27,21 @@ from datetime import datetime
from openerp import tools
from openerp.tools.safe_eval import safe_eval
def _models_get ( self , cr , uid , context = None ) :
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 ( orm . Model ) :
_logger = logging . getLogger ( ' super.calendar ' )
_name = ' super.calendar.configurator '
_columns = {
_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 , [ ] )
@ -59,20 +61,30 @@ class super_calendar_configurator(orm.Model):
context = context )
for current_record_id in current_record_ids :
current_record = current_pool . browse ( cr , uid , current_record_id , context = context )
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 ' ) ,
current_record = current_pool . browse ( cr , uid , current_record_id , context = context )
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 orm . except_orm (
_ ( ' 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 ] ) :
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 )
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 ]
@ -81,13 +93,18 @@ class super_calendar_configurator(orm.Model):
else :
parse_dict = { ' o ' : current_record }
mytemplate = Template ( line . description_code )
name = mytemplate . render ( * * parse_dict )
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 ,
' 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 ,
@ -99,7 +116,7 @@ class super_calendar_configurator(orm.Model):
class super_calendar_configurator_line ( orm . Model ) :
_name = ' super.calendar.configurator.line '
_columns = {
_columns = {
' name ' : fields . many2one ( ' ir.model ' , ' Model ' , required = True ) ,
' description ' : fields . char ( ' Description ' , size = 128 , required = True ) ,
' domain ' : fields . char ( ' Domain ' , size = 512 ) ,
@ -108,30 +125,39 @@ class super_calendar_configurator_line(orm.Model):
( ' field ' , ' Field ' ) ,
( ' code ' , ' Code ' ) ,
] , string = " Description Type " ) ,
' description_field_id ' : fields . many2one ( ' ir.model.fields ' , ' Description field ' ,
' 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 ' ,
' 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 ' ,
' 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 ' ,
' user_field_id ' : fields . many2one (
' ir.model.fields ' , ' User field ' ,
domain = " [ ' & ' ,( ' ttype ' , ' = ' , ' many2one ' ),( ' model_id ' , ' = ' , name)] " ) ,
}
}
class super_calendar ( orm . Model ) :
_name = ' super.calendar '
_columns = {
_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 ) ,
' duration ' : fields . float ( ' Duration ' ) ,
' date_start ' : fields . datetime ( ' Start date ' , required = True ) ,
' 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 ' ) ,
}
}