def test_mapping_control_through_snapshot(self): "Test for add mapping control on assessment" audit = factories.AuditFactory() assessment = factories.AssessmentFactory(audit=audit) factories.RelationshipFactory(source=audit, destination=assessment) control = factories.ControlFactory() revision = models.Revision.query.filter( models.Revision.resource_id == control.id, models.Revision.resource_type == control.__class__.__name__).order_by( models.Revision.id.desc()).first() factories.SnapshotFactory(parent=audit, child_id=control.id, child_type=control.__class__.__name__, revision_id=revision.id) db.session.commit() self.assertFalse( db.session.query( models.Relationship.get_related_query( assessment, models.Snapshot()).exists()).first()[0]) self.import_data( OrderedDict([ ("object_type", "Assessment"), ("Code*", assessment.slug), ("map:control", control.slug), ])) self.assertTrue( db.session.query( models.Relationship.get_related_query( assessment, models.Snapshot()).exists()).first()[0])
def snapshoted_instances_query(self): """Property, return query of mapping objects It should be related to row instance over snapshot relation""" if self.row_converter.obj.id is None: # For new object query should be empty return self.mapping_object.query.filter( self.mapping_object.id.is_(None)) rel_snapshots = models.Relationship.get_related_query( self.row_converter.obj, models.Snapshot(), ).subquery("snapshot_rel") case_statement = sqlalchemy.case( [ ( rel_snapshots.c.destination_type == models.Snapshot.__name__, rel_snapshots.c.destination_id, ), ], else_=rel_snapshots.c.source_id, ) snapshot = models.Snapshot.query.filter( models.Snapshot.id == case_statement, models.Snapshot.child_type == self.mapping_object.__name__, ).options(load_only(models.Snapshot.child_id)).subquery('snapshots') return self.mapping_object.query.filter( self.mapping_object.id == snapshot.c.child_id)
def generate_relationship_snapshots(obj): """Generate needed snapshots for a given relationship. If we post a relationship for a snapshotable object and an Audit, we will map that object to audits program, make a snapshot for it and map the snapshot to the Audit. NOTE: this function will be deprecated soon. Args: obj: Relationship object. """ from ggrc.snapshotter import rules as snapshot_rules parent = None child = None if "Audit" in obj.source_type: parent = obj.source child = obj.destination elif "Audit" in obj.destination_type: parent = obj.destination child = obj.source if parent and child.type in snapshot_rules.Types.all: db.session.add( models.Snapshot(parent=parent, child_id=child.id, child_type=child.type, update_revision="new", context=parent.context, modified_by=get_current_user()))
def test_create_new_assessment_with_mapped_control(self): "Test for creation assessment with mapped controls" with factories.single_commit(): audit = factories.AuditFactory() control = factories.ControlFactory() revision = models.Revision.query.filter( models.Revision.resource_id == control.id, models.Revision.resource_type == control.__class__.__name__ ).order_by( models.Revision.id.desc() ).first() factories.SnapshotFactory( parent=audit, child_id=control.id, child_type=control.__class__.__name__, revision_id=revision.id ) db.session.commit() self.assertFalse(db.session.query( models.Relationship.get_related_query( models.Assessment(), models.Snapshot() ).exists()).first()[0]) slug = "TestAssessment" response = self.import_data(OrderedDict([ ("object_type", "Assessment"), ("Code*", slug), ("Audit*", audit.slug), ("Assignees*", models.Person.query.all()[0].email), ("Creators", models.Person.query.all()[0].email), ("Title", "Strange title"), ("map:Control versions", control.slug), ])) self._check_csv_response(response, {}) assessment = models.Assessment.query.filter( models.Assessment.slug == slug ).first() self.assertTrue(db.session.query(models.Relationship.get_related_query( assessment, models.Snapshot()).exists()).first()[0] )