예제 #1
0
    def __init__(self, obj, filter_fields=None, exclude_fields=None, start_date=None, end_date=None, **kwargs):
        self.object = obj
        self.filter_fields = filter_fields
        self.exclude_fields = exclude_fields
        self.start_date = start_date
        self.end_date = end_date

        if isinstance(obj, Model):
            #it's a django model, search by content_type
            key = [obj.__class__.__name__, str(obj.id)]
        elif isinstance(obj, Document):
            #it's a couchdbkit document, search by __class__
            key = [obj.__class__.__name__, obj._id]
        elif isinstance(obj, dict):
            #it's a couchdbkit document, search by __class__
            key = [obj['doc_type'], obj['_id']]


        final_fields = []
        if len(filter_fields) > 0:
            final_fields = filter_fields[:]
        else:
            pass
        self.final_fields = final_fields

        revisions=ModelActionAudit.view('auditcare/model_actions_by_id', key=key, reduce=False, include_docs=True).all()
        #need a better view to filter by date

        #todo: filter by date ranges
        #return sorted(revisions, key=lambda x: x.event_date, reverse=True)

        self.revisions=sorted(ModelActionAudit.view('auditcare/model_actions_by_id', key=key, reduce=False, include_docs=True).all(), key=lambda x: x.event_date)
예제 #2
0
    def testModelEventChanges(self):
        """
        Test that django model events do change.  A single change
        """
        model_count = ModelActionAudit.view("auditcare/model_actions_by_id",
                                            include_docs=True,
                                            reduce=False).count()

        self.user.email = '*****@*****.**'
        time.sleep(1)
        self.user.save()
        time.sleep(1)

        model_count2 = ModelActionAudit.view("auditcare/model_actions_by_id",
                                             include_docs=True,
                                             reduce=False).count()
        self.assertEqual(model_count + 1, model_count2)

        #Filter for email and see if it shows up
        email_wrapper = history_for_doc(self.user, filter_fields=['email'])
        email_narratives = email_wrapper.change_narratives()
        self.assertEqual(1, len(email_narratives))

        #exclude for email and see if it doesn't show up
        exclude_wrapper = history_for_doc(self.user, exclude_fields=['email'])
        exclude_narratives = exclude_wrapper.change_narratives()
        self.assertEqual(0, len(exclude_narratives))

        #exclude and filter for email and see if it doesn't show up
        exclude_wrapper = history_for_doc(self.user,
                                          filter_fields=['email'],
                                          exclude_fields=['email'])
        exclude_narratives = exclude_wrapper.change_narratives()
        self.assertEqual(0, len(exclude_narratives))

        #Filter for email and see if it shows up
        new_last_name = 'alksjflajdsflkjsadf'
        self.user.last_name = new_last_name
        time.sleep(1)
        self.user.save()

        name_change_wrapper = history_for_doc(
            self.user, filter_fields=['email', 'first_name', 'last_name'])
        name_change_narratives = name_change_wrapper.change_narratives()

        change_generator = name_change_narratives[-1]['changes']

        seen_last_name = False
        seen_old_value = False
        seen_new_value = False
        for ctuple in change_generator:
            if ctuple[0] == 'last_name':
                seen_last_name = True
            if ctuple[1][0] == 'mock':
                seen_old_value = True
            if ctuple[1][1] == new_last_name:
                seen_new_value = True
        self.assertTrue(seen_last_name)
        self.assertTrue(seen_old_value)
        self.assertTrue(seen_new_value)
예제 #3
0
    def __init__(self, obj, filter_fields=None, exclude_fields=None, start_date=None, end_date=None, **kwargs):
        self.object = obj
        self.filter_fields = filter_fields or []
        self.exclude_fields = exclude_fields or []
        self.start_date = start_date
        self.end_date = end_date

        if isinstance(obj, Model):
            #it's a django model, search by content_type
            key = [obj.__class__.__name__, str(obj.id)]
        elif isinstance(obj, Document):
            #it's a couchdbkit document, search by __class__
            key = [obj.__class__.__name__, obj._id]
        elif isinstance(obj, dict):
            #it's a couchdbkit document, search by __class__
            key = [obj['doc_type'], obj['_id']]

        final_fields = []
        if len(self.filter_fields) > 0:
            final_fields = filter_fields[:]
        self.final_fields = final_fields

        revisions=ModelActionAudit.view('auditcare/model_actions_by_id', key=key, reduce=False, include_docs=True).all()
        #need a better view to filter by date

        #todo: filter by date ranges
        #return sorted(revisions, key=lambda x: x.event_date, reverse=True)

        self.revisions=sorted(ModelActionAudit.view('auditcare/model_actions_by_id', key=key, reduce=False, include_docs=True).all(), key=lambda x: x.event_date)
예제 #4
0
    def testModelEventChanges(self):
        """
        Test that django model events do change.  A single change
        """
        model_count = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()

        self.user.email='*****@*****.**'
        time.sleep(1)
        self.user.save()
        time.sleep(1)

        model_count2 = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        self.assertEqual(model_count+1, model_count2)


        #Filter for email and see if it shows up
        email_wrapper = history_for_doc(self.user, filter_fields=['email'])
        email_narratives = email_wrapper.change_narratives()
        self.assertEqual(1, len(email_narratives))

        #exclude for email and see if it doesn't show up
        exclude_wrapper = history_for_doc(self.user, exclude_fields=['email'])
        exclude_narratives = exclude_wrapper.change_narratives()
        self.assertEqual(0, len(exclude_narratives))

        #exclude and filter for email and see if it doesn't show up
        exclude_wrapper = history_for_doc(self.user, filter_fields=['email'], exclude_fields=['email'])
        exclude_narratives = exclude_wrapper.change_narratives()
        self.assertEqual(0, len(exclude_narratives))


        #Filter for email and see if it shows up
        new_last_name = 'alksjflajdsflkjsadf'
        self.user.last_name= new_last_name
        time.sleep(1)
        self.user.save()

        name_change_wrapper = history_for_doc(self.user, filter_fields=['email', 'first_name', 'last_name'])
        name_change_narratives = name_change_wrapper.change_narratives()

        change_generator = name_change_narratives[-1]['changes']

        seen_last_name = False
        seen_old_value = False
        seen_new_value = False
        for ctuple in change_generator:
            if ctuple[0] == 'last_name':
                seen_last_name = True
            if ctuple[1][0] == 'mock':
                seen_old_value = True
            if ctuple[1][1] == new_last_name:
                seen_new_value = True
        self.assertTrue(seen_last_name)
        self.assertTrue(seen_old_value)
        self.assertTrue(seen_new_value)
예제 #5
0
 def testModifyUser(self):
     model_count = ModelActionAudit.view("auditcare/model_actions").count()
     total_count = AuditEvent.view("auditcare/all_events").count()
     
     usr = User.objects.get(username='******')
     usr.first_name='aklsjfl'
     usr.save()
     
     model_count2 = ModelActionAudit.view("auditcare/model_actions").count()
     total_count2 = AuditEvent.view("auditcare/all_events").count()
             
     self.assertEqual(model_count+1, model_count2)    
     self.assertEqual(total_count+1, total_count2)
예제 #6
0
파일: auth.py 프로젝트: dimagi/auditcare
    def testModifyUser(self):
        model_count = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count = AuditEvent.view("auditcare/all_events").count()
        
        usr = User.objects.get(username='******')
        usr.first_name='aklsjfl'
        time.sleep(1)
        usr.save()
        time.sleep(1)

        model_count2 = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count2 = AuditEvent.view("auditcare/all_events").count()
                
        self.assertEqual(model_count+1, model_count2)    
        self.assertEqual(total_count+1, total_count2)
예제 #7
0
파일: auth.py 프로젝트: xbryanc/commcare-hq
    def testModifyUser(self):
        model_count = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count = AuditEvent.view("auditcare/all_events").count()
        
        usr = User.objects.get(username='******')
        usr.first_name='aklsjfl'
        time.sleep(1)
        usr.save()
        time.sleep(1)

        model_count2 = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count2 = AuditEvent.view("auditcare/all_events").count()
                
        self.assertEqual(model_count+1, model_count2)    
        self.assertEqual(total_count+1, total_count2)
예제 #8
0
파일: auth.py 프로젝트: dimagi/auditcare
    def _createUser(self):
        model_count = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count = AuditEvent.view("auditcare/all_events").count()
        
        usr = User()
        usr.username = '******'
        usr.set_password('mockmock')
        usr.first_name='mocky'
        usr.last_name = 'mock'
        usr.save()

        model_count2 = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count2 = AuditEvent.view("auditcare/all_events").count()
        
        self.assertEqual(model_count+1, model_count2)    
        self.assertEqual(total_count+1, total_count2)
예제 #9
0
파일: auth.py 프로젝트: xbryanc/commcare-hq
    def _createUser(self):
        model_count = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count = AuditEvent.view("auditcare/all_events").count()
        
        usr = User()
        usr.username = '******'
        usr.set_password('mockmock')
        usr.first_name='mocky'
        usr.last_name = 'mock'
        usr.save()

        model_count2 = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count2 = AuditEvent.view("auditcare/all_events").count()
        
        self.assertEqual(model_count+1, model_count2)    
        self.assertEqual(total_count+1, total_count2)
예제 #10
0
    def _createUser(self):
        model_count = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count = AuditEvent.view("auditcare/all_events").count()

        usr = User()
        usr.username = "******"
        usr.set_password("mockmock")
        usr.first_name = "mocky"
        usr.last_name = "mock"
        usr.email = "*****@*****.**"
        usr.save()

        self.user = usr

        model_count2 = ModelActionAudit.view("auditcare/model_actions_by_id", include_docs=True, reduce=False).count()
        total_count2 = AuditEvent.view("auditcare/all_events").count()

        self.assertEqual(model_count + 1, model_count2)
        self.assertEqual(total_count + 1, total_count2)
        return usr
예제 #11
0
    def _createUser(self):
        model_count = ModelActionAudit.view("auditcare/model_actions").count()
        total_count = AuditEvent.view("auditcare/all_events").count()

        usr = User()
        usr.username = '******'
        usr.set_password('mockmock')
        usr.first_name='mocky'
        usr.last_name = 'mock'
        usr.email = '*****@*****.**'
        usr.save()

        self.user = usr

        model_count2 = ModelActionAudit.view("auditcare/model_actions").count()
        total_count2 = AuditEvent.view("auditcare/all_events").count()

        self.assertEqual(model_count+1, model_count2)
        self.assertEqual(total_count+1, total_count2)
        return usr
예제 #12
0
    def handle(self, **options):
        recompute = options['recompute']
        print recompute
        db = AccessAudit.get_db()
        vals = db.view('auditcare/model_actions_by_id',
                       group=True,
                       group_level=1).all()

        #get all model types
        #python 2.7 dict comprehension
        #model_dict= {x['key'][0]: x['value'] for x in vals}
        model_dict = dict((x['key'][0], x['value']) for x in vals)

        for model, count in model_dict.items():
            #for each model type, query ALL audit instances.
            print "### %s" % (model)
            model_counts = db.view('auditcare/model_actions_by_id',
                                   group=True,
                                   startkey=[model, u''],
                                   endkey=[model, u'z']).all()
            #within a given model, query ALL instances

            #sort the models by id, then by rev descending
            #{u'value': <num>, u'key': [u'model', u'uuid']}
            for mc in model_counts:
                num = mc['value']
                model_uuid = mc['key'][1]
                #now for each model uuid, do a query again to get all the rev numbers
                item_revs = db.view('auditcare/model_actions_by_id',
                                    reduce=False,
                                    startkey=[model, model_uuid],
                                    endkey=[model, model_uuid]).all()
                revs = sorted([(x['id'], x['value']) for x in item_revs],
                              key=lambda y: y[1],
                              reverse=True)
                #tuples of (audit_id, rev_id)
                #print "%s:%s -> %s" % (model, model_uuid, revs)

                #ok, for each arr of revs, if it's length greater than 1, then do it
                #we're going backwards, so...yeah
                if len(revs) > 1:
                    for i, t in enumerate(revs):
                        audit_id = t[0]
                        current = ModelActionAudit.get(audit_id)

                        if i + 1 == len(revs):
                            current.prev_id = None
                            current.save()
                            break

                        prev_audit_id = revs[i + 1][0]
                        prev_rev = ModelActionAudit.get(prev_audit_id)

                        if i == 0:
                            current.next_id = None

                        if current.prev_id != prev_rev._id:
                            current.prev_id = prev_rev._id
                            #current saves later
                        if prev_rev.next_id != current._id:
                            prev_rev.next_id = current._id
                            prev_rev.save()

#                        #sanity check
#                        if prev_rev.revision_checksum == current.revision_checksum:
#                            continue
#
#                        if (current.archived_data.get('doc_type', None) =='XFormInstance' and prev_rev.archived_data.get('doc_type', None) == 'XFormInstance'):
#                            #it's an xforminstance
#                            removed, added, changed = utils.dict_diff(current.archived_data['form'], prev_rev.archived_data['form'])
#                        else:
#                            removed, added, changed = utils.dict_diff(current.archived_data, prev_rev.archived_data)
#                        current.removed = removed
#                        current.added = added
#                        current.changed = changed
#                        current.save()
                        current.compute_changes(save=True)
예제 #13
0
    def handle(self, **options):
        recompute = options['recompute']
        print recompute
        db = AccessAudit.get_db()
        vals = db.view('auditcare/model_actions_by_id', group=True, group_level=1).all()

        #get all model types
        #python 2.7 dict comprehension
        #model_dict= {x['key'][0]: x['value'] for x in vals}
        model_dict= dict((x['key'][0], x['value']) for x in vals)

        for model, count in model_dict.items():
            #for each model type, query ALL audit instances.
            print "### %s" % (model)
            model_counts = db.view('auditcare/model_actions_by_id', group=True, startkey=[model,u''], endkey=[model,u'z']).all()
            #within a given model, query ALL instances

            #sort the models by id, then by rev descending
            #{u'value': <num>, u'key': [u'model', u'uuid']}
            for mc in model_counts:
                num = mc['value']
                model_uuid = mc['key'][1]
                #now for each model uuid, do a query again to get all the rev numbers
                item_revs = db.view('auditcare/model_actions_by_id', reduce=False, startkey=[model,model_uuid], endkey=[model,model_uuid]).all()
                revs = sorted([(x['id'], x['value']) for x in item_revs], key=lambda y: y[1], reverse=True)
                #tuples of (audit_id, rev_id)
                #print "%s:%s -> %s" % (model, model_uuid, revs)


                #ok, for each arr of revs, if it's length greater than 1, then do it
                #we're going backwards, so...yeah
                if len(revs) > 1:
                    for i, t in enumerate(revs):
                        audit_id = t[0]
                        current = ModelActionAudit.get(audit_id)

                        if i+1 == len(revs):
                            current.prev_id = None
                            current.save()
                            break

                        prev_audit_id = revs[i+1][0]
                        prev_rev = ModelActionAudit.get(prev_audit_id)

                        if i == 0:
                            current.next_id = None

                        if current.prev_id != prev_rev._id:
                            current.prev_id = prev_rev._id
                            #current saves later
                        if prev_rev.next_id != current._id:
                            prev_rev.next_id = current._id
                            prev_rev.save()

#                        #sanity check
#                        if prev_rev.revision_checksum == current.revision_checksum:
#                            continue
#
#                        if (current.archived_data.get('doc_type', None) =='XFormInstance' and prev_rev.archived_data.get('doc_type', None) == 'XFormInstance'):
#                            #it's an xforminstance
#                            removed, added, changed = utils.dict_diff(current.archived_data['form'], prev_rev.archived_data['form'])
#                        else:
#                            removed, added, changed = utils.dict_diff(current.archived_data, prev_rev.archived_data)
#                        current.removed = removed
#                        current.added = added
#                        current.changed = changed
#                        current.save()
                        current.compute_changes(save=True)