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])
Ejemplo n.º 2
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)
Ejemplo n.º 3
0
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()))
Ejemplo n.º 4
0
 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]
   )