def _callback_handler(model, updated): # delete to_delete = None if updated.delete_ids is not None: to_delete = model.objects.filter( pk__in=updated.delete_ids) if updated.delete_qs is not None: to_delete = ( updated.delete_qs if to_delete is None else to_delete | updated.delete_qs) if to_delete is not None: delete.send( model, objects=to_delete) # create if updated.create is not None: create.send( model, objects=updated.create) # update should_update = ( updated.update_objects is not None or updated.updates is not None) if should_update: update.send( model, objects=updated.update_objects, updates=updated.updates, update_fields=updated.update_fields)
def update(self, keys=None): parents = list(self.parents.values_list("id", flat=True)) revisions = self.get_revisions(parents, keys=keys) missing_revisions = [] existing_ids = [] revision_map = { '%s-%s' % (x['object_id'], x['key']): x['id'] for x in revisions.values("id", "object_id", "key")} for parent in parents: for key in keys or [""]: id = '%s-%s' % (parent, key) if id in revision_map: existing_ids.append(revision_map[id]) else: missing_revisions.append(dict( object_id=parent, key=key)) new_revision = self.new_revision update.send( Revision, updates={ id: dict(value=new_revision) for id in existing_ids}) if missing_revisions: create.send( Revision, objects=list( self.create_missing_revisions( missing_revisions, new_revision)))
def update(self, keys=None): parents = list(self.parents.values_list("id", flat=True)) revisions = self.get_revisions(parents, keys=keys) missing_revisions = [] existing_ids = [] revision_map = { '%s-%s' % (x['object_id'], x['key']): x['id'] for x in revisions.values("id", "object_id", "key")} for parent in parents: for key in keys or [""]: id = '%s-%s' % (parent, key) if id in revision_map: existing_ids.append(revision_map[id]) else: missing_revisions.append(dict( object_id=parent, key=key)) new_revision = self.new_revision updates = { id: dict(value=new_revision) for id in existing_ids} if updates: update.send( Revision, updates=updates) if missing_revisions: create.send( Revision, objects=list( self.create_missing_revisions( missing_revisions, new_revision)))
def set(self, keys=None, value=None): """get a revision from db or set one if not set""" self.revision_context.filter(key__in=keys).delete() if value: revisions = [] for k in keys: revisions.append( Revision(content_type_id=self.content_type_id, object_id=self.context.pk, key=k, value=value)) create.send(Revision, objects=revisions)
def update(self, **kwargs): store_data = self.get_store_data(**kwargs) data_changed = set( filter(None, [ self.set_data(k, store_data[k]) for k in self.filter_fields(**kwargs) ])) # set the checks if "checks" in store_data: self.set_check_data(store_data) if not self.data.pk: create.send(self.data.__class__, instance=self.data) self.model.data = self.data elif data_changed: self.save_data(fields=data_changed)
def set(self, keys=None, value=None): """get a revision from db or set one if not set""" self.revision_context.filter(key__in=keys).delete() if value: revisions = [] for k in keys: revisions.append( Revision( content_type_id=self.content_type_id, object_id=self.context.pk, key=k, value=value)) create.send( Revision, objects=revisions)
def set_check_data(self, store_data=None): checks = {} existing_checks = self.model.check_data.values_list( "pk", "category", "name", "count") for pk, category, name, count in existing_checks: checks[(category, name)] = (pk, count) to_update = [] to_add = [] for check in store_data["checks"]: category = check["category"] name = check["name"] count = check["count"] check_exists = ( checks.get((category, name))) if not check_exists: to_add.append(check) continue elif checks[(category, name)][1] != count: to_update.append((checks[(category, name)][0], dict(count=count))) del checks[(category, name)] check_data = None for category, name in checks.keys(): if check_data is None: check_data = self.model.check_data.filter( category=category, name=name) else: check_data = check_data | self.model.check_data.filter( category=category, name=name) if checks: delete.send(check_data.model, objects=check_data) if to_update: to_update = dict(to_update) update.send( self.model.check_data.model, updates=to_update) if not to_add: return create.send( self.model.check_data.model, objects=[ self.check_data_field.related_model( **{self.related_name: self.model, "category": check["category"], "name": check["name"], "count": check["count"]}) for check in to_add])
def set_check_data(self, store_data=None): checks = {} existing_checks = self.model.check_data.values_list( "pk", "category", "name", "count") for pk, category, name, count in existing_checks: checks[(category, name)] = (pk, count) to_update = [] to_add = [] for check in store_data["checks"]: category = check["category"] name = check["name"] count = check["count"] check_exists = ( checks.get((category, name))) if not check_exists: to_add.append(check) continue elif checks[(category, name)][1] != count: to_update.append((checks[(category, name)][0], dict(count=count))) del checks[(category, name)] check_data = None for category, name in checks.keys(): if check_data is None: check_data = self.model.check_data.filter( category=category, name=name) else: check_data = check_data | self.model.check_data.filter( category=category, name=name) if checks: delete.send(check_data.model, objects=check_data) if to_update: to_update = dict(to_update) update.send( self.model.check_data.model, updates=to_update) if not to_add: return create.send( self.model.check_data.model, objects=[ self.check_data_field.related_model( **{self.related_name: self.model, "category": check["category"], "name": check["name"], "count": check["count"]}) for check in to_add])
def update(self, **kwargs): store_data = self.get_store_data(**kwargs) data_changed = set( filter( None, [self.set_data(k, store_data[k]) for k in self.filter_fields(**kwargs)])) # set the checks if "checks" in store_data: self.set_check_data(store_data) if not self.data.pk: create.send( self.data.__class__, instance=self.data) self.model.data = self.data elif data_changed: self.save_data(fields=data_changed)
def _create_data_events(unit): create_instances = [ StoreChecksData( store=unit.store, name="check-foo-%s" % i, count=i * 23) for i in range(0, 3)] for instance in create_instances: # add instances - these shouldnt appear in bulk operation create.send( StoreChecksData, instance=instance) create_objects = [ StoreChecksData( store=unit.store, name="check-bar-%s" % i, count=i * 23) for i in range(0, 3)] create_more_objects = [ StoreChecksData( store=unit.store, name="check-baz-%s" % i, count=i * 23) for i in range(0, 3)] # add 2 lots of objects create.send( StoreChecksData, objects=create_objects) create.send( StoreChecksData, objects=create_more_objects) return create_instances + create_objects + create_more_objects
def _create_qc_events(unit): create_instances = [ QualityCheck( name=("Foo%s" % i), category=2, unit=unit) for i in range(0, 3)] for instance in create_instances: create.send( QualityCheck, instance=instance) create_objects = [ QualityCheck( name=("Bar%s" % i), category=2, unit=unit) for i in range(0, 3)] create_more_objects = [ QualityCheck( name=("Baz%s" % i), category=2, unit=unit) for i in range(0, 3)] create.send( QualityCheck, objects=create_objects) create.send( QualityCheck, objects=create_more_objects) return create_instances + create_objects + create_more_objects
def clone_checks(self, source_store, target_store): """Clone checks from source store to target store.""" fields = ('unit__unitid_hash', 'category', 'name', 'false_positive', 'message') checks = QualityCheck.objects.filter( unit__store=source_store, unit__state__gt=OBSOLETE, ).values(*fields) unitid_hashes = [x['unit__unitid_hash'] for x in checks] units = target_store.units.filter(unitid_hash__in=unitid_hashes) unit_map = { x['unitid_hash']: x['id'] for x in units.values('id', 'unitid_hash')} cloned_checks = [] for check in checks: cloned_checks.append(QualityCheck( unit_id=unit_map[check['unit__unitid_hash']], category=check['category'], name=check['name'], false_positive=check['false_positive'], message=check['message'])) create.send(QualityCheck, objects=cloned_checks)
def update_checks(self): """Compare self.original_checks to the Units calculated QualityCheck failures. Removes members of self.original_checks as they have been compared. """ updated = False new_checks = [] for name in self.check_failures.iterkeys(): if name in self.original_checks: # if the check is valid remove from the list and continue del self.original_checks[name] continue # the check didnt exist previously - so create it new_checks.append( self.checks_qs.model( unit_id=self.unit.id, name=name, message=self.check_failures[name]['message'], category=self.check_failures[name]['category'])) updated = True if new_checks: create.send(self.checks_qs.model, objects=new_checks) return updated
def clone_checks(self, source_store, target_store): """Clone checks from source store to target store.""" fields = ('unit__unitid_hash', 'category', 'name', 'false_positive', 'message') checks = QualityCheck.objects.filter( unit__store=source_store, unit__state__gt=OBSOLETE, ).values(*fields) unitid_hashes = [x['unit__unitid_hash'] for x in checks] units = target_store.units.filter(unitid_hash__in=unitid_hashes) unit_map = { x['unitid_hash']: x['id'] for x in units.values('id', 'unitid_hash')} cloned_checks = [] for check in checks: cloned_checks.append(QualityCheck( unit_id=unit_map[check['unit__unitid_hash']], category=check['category'], name=check['name'], false_positive=check['false_positive'], message=check['message'])) create.send(QualityCheck, objects=cloned_checks)
def update_checks(self): """Compare self.original_checks to the Units calculated QualityCheck failures. Removes members of self.original_checks as they have been compared. """ updated = False new_checks = [] for name in self.check_failures.iterkeys(): if name in self.original_checks: # if the check is valid remove from the list and continue del self.original_checks[name] continue # the check didnt exist previously - so create it new_checks.append( self.checks_qs.model( unit_id=self.unit.id, name=name, message=self.check_failures[name]['message'], category=self.check_failures[name]['category'])) updated = True if new_checks: create.send(self.checks_qs.model, objects=new_checks) return updated
def create_scores(self, scores): created = list(self.new_scores(scores)) create.send(self.score_model, objects=created) return created
def create_scores(self, scores): created = list(self.new_scores(scores)) create.send( self.score_model, objects=created) return created