~simeon-blanc/+junk/sync_opti_offset_nofake_bf

« back to all changes in this revision

Viewing changes to sync_server/rules.py

  • Committer: jf
  • Date: 2015-11-23 08:47:03 UTC
  • mfrom: (606.2.4 sync_module_prod)
  • Revision ID: jfb@tempo-consulting.fr-20151123084703-cz67z1xz4ta5tu3j
SP-215 [FIX] Sync server rules import: do not inactive changed rules
lp:~fabien-morin/unifield-wm/sync-sp-215-fm

Show diffs side-by-side

added added

removed removed

Lines of Context:
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'),
327
327
            if model_ids:
328
328
                values['model_ref'] = model_ids[0]
329
329
 
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'])
 
334
 
 
335
        return new_id
331
336
 
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)):
337
342
            ids = [ids]
338
343
 
339
 
        for rule_data in self.read(cr, uid, ids, ['model_id', 'domain', 'sequence_number','included_fields'], context=context):
 
344
        rule_to_check = []
 
345
        for rule_data in self.read(cr, uid, ids, ['model_id', 'domain', 'sequence_number','included_fields','status'], context=context):
340
346
            dirty = False
341
347
            for k in rule_data.keys():
342
348
                if k in values and values[k] != rule_data[k]:
343
349
                    dirty = True
344
350
 
345
351
            if dirty:
346
 
                values.update({'active' : False, 'status' : 'invalid'})
 
352
                rule_to_check.append(rule_data['id'])
 
353
                #values.update({'active' : False, 'status' : 'invalid'})
347
354
 
348
355
        if 'applies_to_type' in values:
349
356
            if values['applies_to_type']:
351
358
            else:
352
359
                values['type_id'] = False
353
360
 
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)
 
362
        if rule_to_check:
 
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'])
 
366
        return res
355
367
 
356
368
    def unlink(self, cr, uid, ids, context=None):
357
369
        cr.execute("""SAVEPOINT unlink_rule""")
458
470
 
459
471
    check_domain = check_domain
460
472
 
461
 
    def validate(self, cr, uid, ids, context=None):
 
473
    def validate_rules(self, cr, uid, ids, context=None):
462
474
        error = False
463
475
        message = []
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')
 
488
                error=True
 
489
            else:
 
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
489
508
            else:
490
509
                message.append("pass.\n")
491
510
 
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)
 
513
        return {
 
514
            'state': 'valid' if not error else 'invalid',
 
515
            'message' : message_header + message_body,
 
516
            'sync_rule' : rec.id
 
517
        }
 
518
 
 
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)
498
522
        return {
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),
614
638
 
615
639
        return { 'value' : {'active' : False, 'status' : 'invalid', 'model_id' : model} }
616
640
 
 
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'])
 
646
        return new_id
 
647
 
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)):
622
653
            ids = [ids]
623
654
 
624
 
        for rule_data in self.read(cr, uid, ids, ['model_id', 'domain', 'sequence_number','remote_call', 'arguments', 'destination_name'], context=context):
 
655
        rule_to_check = []
 
656
        for rule_data in self.read(cr, uid, ids, ['model_id', 'domain', 'sequence_number','remote_call', 'arguments', 'destination_name', 'status'], context=context):
625
657
            dirty = False
626
658
            for k in rule_data.keys():
627
659
                if k in values and values[k] != rule_data[k]:
628
660
                    dirty = True
629
661
            if dirty:
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)
 
665
        if rule_to_check:
 
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'])
 
669
        return res
632
670
 
633
671
    ## Checkers & Validator ##################################################
634
672
 
663
701
 
664
702
        return (message, error)
665
703
 
666
 
    def validate(self, cr, uid, ids, context=None):
 
704
 
 
705
    def validate_rules(self, cr, uid, ids, context=None):
667
706
        error = False
668
707
        message = []
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))
688
 
                error = True
 
726
                message.append('Filter Method %s does not exist on object %s\n' % (rec.filter_method, rec.model_id))
 
727
                error = True
 
728
 
 
729
            message.append(_("* Valid status... "))
 
730
            if rec.status == 'invalid':
 
731
                message.append('failed! Rule has status=invalid\n')
 
732
                error = True
 
733
            else:
 
734
                message.append('pass.\n')
689
735
 
690
736
            # Remote Call Possible
691
737
            call_tree = rec.remote_call.split('.')
716
762
            else:
717
763
                message.append("pass.\n")
718
764
 
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)
 
767
        return {
 
768
            'state': 'valid' if not error else 'invalid',
 
769
            'message' : message_header + message_body,
 
770
            'message_rule' : rec.id
 
771
        }
 
772
 
 
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)
725
776
        return {
726
777
            'name': 'Rule Validation Message',