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)
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)
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)
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)
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)
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)
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)
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
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
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)
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)