120
120
], 'Directionality', required = True,),
121
121
'domain':fields.text('Domain', required = False),
122
122
'owner_field':fields.char('Owner Field', size = 64, required = False),
123
'sequence_number': fields.integer('Sequence', required = True),
123
'sequence_number': fields.integer('Sequence', required = True, group_operator="count"),
124
124
'included_fields_sel': fields.many2many('ir.model.fields', 'ir_model_fields_rules_rel', 'field', 'name', 'Select Fields'),
125
125
'included_fields':fields.text('Fields to include', required = False),
126
126
'forced_values_sel': fields.one2many('sync_server.sync_rule.forced_values', 'sync_rule_id', 'Select Forced Values'),
328
328
values['model_ref'] = model_ids[0]
330
return super(sync_rule, self).create(cr, uid, values, context=context)
330
new_id = super(sync_rule, self).create(cr, uid, values, context=context)
331
check = self.validate_rules(cr, uid, [new_id], context=context)
332
if check['state'] != 'valid':
333
raise osv.except_osv(_("Warning"), check['message'])
332
337
def write(self, cr, uid, ids, values, context=None):
333
338
if 'included_fields_sel' in values and values.get('included_fields_sel')[0][2]:
336
341
if not isinstance(ids, (list, tuple)):
339
for rule_data in self.read(cr, uid, ids, ['model_id', 'domain', 'sequence_number','included_fields'], context=context):
345
for rule_data in self.read(cr, uid, ids, ['model_id', 'domain', 'sequence_number','included_fields','status'], context=context):
341
347
for k in rule_data.keys():
342
348
if k in values and values[k] != rule_data[k]:
346
values.update({'active' : False, 'status' : 'invalid'})
352
rule_to_check.append(rule_data['id'])
353
#values.update({'active' : False, 'status' : 'invalid'})
348
355
if 'applies_to_type' in values:
349
356
if values['applies_to_type']:
352
359
values['type_id'] = False
354
return super(sync_rule, self).write(cr, uid, ids, values, context=context)
361
res = super(sync_rule, self).write(cr, uid, ids, values, context=context)
363
check = self.validate_rules(cr, uid, rule_to_check, context=context)
364
if check['state'] != 'valid':
365
raise osv.except_osv(_("Warning"), check['message'])
356
368
def unlink(self, cr, uid, ids, context=None):
357
369
cr.execute("""SAVEPOINT unlink_rule""")
459
471
check_domain = check_domain
461
def validate(self, cr, uid, ids, context=None):
473
def validate_rules(self, cr, uid, ids, context=None):
464
476
for rec in self.browse(cr, uid, ids, context=context):
469
481
mess, err = self.check_fields(cr, uid, rec, title="* Included fields syntax... ", context=context)
470
482
error = err or error
471
483
message.append(mess)
484
# Check for valid status
485
message.append(_("* Valid status... "))
486
if rec.status == 'invalid':
487
message.append('failed! Rule has status=invalid\n')
490
message.append('pass.\n')
472
491
# Check force values syntax (can be empty)
473
492
mess, err = self.check_forced_values(cr, uid, rec, context)
474
493
error = err or error
490
509
message.append("pass.\n")
492
message_header = 'This rule is valid:\n\n' if not error else 'This rule cannot be validated for the following reason:\n\n'
493
message_body = ''.join(message)
494
message_data = {'state': 'valid' if not error else 'invalid',
495
'message' : message_header + message_body,
496
'sync_rule' : rec.id}
511
message_header = 'This rule is valid:\n\n' if not error else 'This rule cannot be validated for the following reason:\n\n'
512
message_body = ''.join(message)
514
'state': 'valid' if not error else 'invalid',
515
'message' : message_header + message_body,
519
def validate(self, cr, uid, ids, context=None):
520
message_data = self.validate_rules(cr, uid, ids, context=context)
497
521
wiz_id = self.pool.get('sync_server.rule.validation.message').create(cr, uid, message_data, context=context)
499
523
'name': 'Rule Validation Message',
542
566
'type_name': fields.related('type_id', 'name', type='char', string='Group Name'),
543
567
'domain': fields.text('Domain', required = False),
544
568
'filter_method' : fields.char('Filter Method', size=64, help='The method to use to find target records instead of a domain.'),
545
'sequence_number': fields.integer('Sequence', required = True),
569
'sequence_number': fields.integer('Sequence', required = True, group_operator="count"),
546
570
'remote_call': fields.text('Method to call', required = True),
547
571
'arguments': fields.text('Arguments of the method', required = True),
548
572
'destination_name': fields.char('Field to extract destination', size=256, required = True),
615
639
return { 'value' : {'active' : False, 'status' : 'invalid', 'model_id' : model} }
641
def create(self, cr, uid, values, context=None):
642
new_id = super(message_rule, self).create(cr, uid, values, context=context)
643
check = self.validate_rules(cr, uid, [new_id], context=context)
644
if check['state'] != 'valid':
645
raise osv.except_osv(_("Warning"), check['message'])
617
648
def write(self, cr, uid, ids, values, context=None):
618
649
if 'included_fields_sel' in values:
619
650
values['included_fields'] = self._compute_included_field(cr, uid, ids, values['included_fields_sel'][0][2], context)
621
652
if not isinstance(ids, (list, tuple)):
624
for rule_data in self.read(cr, uid, ids, ['model_id', 'domain', 'sequence_number','remote_call', 'arguments', 'destination_name'], context=context):
656
for rule_data in self.read(cr, uid, ids, ['model_id', 'domain', 'sequence_number','remote_call', 'arguments', 'destination_name', 'status'], context=context):
626
658
for k in rule_data.keys():
627
659
if k in values and values[k] != rule_data[k]:
630
values.update({'active' : False, 'status' : 'invalid'})
631
return super(message_rule, self).write(cr, uid, ids, values, context=context)
662
rule_to_check.append(rule_data['id'])
663
#values.update({'active' : False, 'status' : 'invalid'})
664
res = super(message_rule, self).write(cr, uid, ids, values, context=context)
666
check = self.validate_rules(cr, uid, rule_to_check, context=context)
667
if check['state'] != 'valid':
668
raise osv.except_osv(_("Warning"), check['message'])
633
671
## Checkers & Validator ##################################################
664
702
return (message, error)
666
def validate(self, cr, uid, ids, context=None):
705
def validate_rules(self, cr, uid, ids, context=None):
669
708
for rec in self.browse(cr, uid, ids, context=context):
684
723
error = err or error
685
724
message.append(mess)
686
725
elif not hasattr(self.pool.get(rec.model_id), rec.filter_method):
687
message.append('Filter Method %s does not exist on object %s' % (rec.filter_method, rec.model_id))
726
message.append('Filter Method %s does not exist on object %s\n' % (rec.filter_method, rec.model_id))
729
message.append(_("* Valid status... "))
730
if rec.status == 'invalid':
731
message.append('failed! Rule has status=invalid\n')
734
message.append('pass.\n')
690
736
# Remote Call Possible
691
737
call_tree = rec.remote_call.split('.')
717
763
message.append("pass.\n")
719
message_header = 'This rule is valid:\n\n' if not error else 'This rule cannot be validated for the following reason:\n\n'
720
message_body = ' '.join(message)
721
message_data = {'state': 'valid' if not error else 'invalid',
722
'message' : message_header + message_body,
723
'message_rule' : rec.id}
765
message_header = 'This rule is valid:\n\n' if not error else 'This rule cannot be validated for the following reason:\n\n'
766
message_body = ' '.join(message)
768
'state': 'valid' if not error else 'invalid',
769
'message' : message_header + message_body,
770
'message_rule' : rec.id
773
def validate(self, cr, uid, ids, context=None):
774
message_data = self.validate_rules(cr, uid, ids, context=context)
724
775
wiz_id = self.pool.get('sync_server.rule.validation.message').create(cr, uid, message_data, context=context)
726
777
'name': 'Rule Validation Message',