Beispiel #1
0
    def test_tile_deletion(self):
        """
        Tests that a tile is deleted when a user is a reviewer or owner.

        """

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "TEST 1"
            }
        }

        owner = User.objects.create_user(username='******',
                                         password='******')
        reviewer = User.objects.get(username='******')

        tile1 = Tile(json)
        owner_request = HttpRequest()
        owner_request.user = owner
        tile1.save(index=False, request=owner_request)
        tile1.delete(request=owner_request)

        tile2 = Tile(json)
        reviewer_request = HttpRequest()
        reviewer_request.user = reviewer
        tile2.save(index=False, request=reviewer_request)
        tile2.delete(request=reviewer_request)

        self.assertEqual(len(Tile.objects.all()), 0)
Beispiel #2
0
    def test_tile_cardinality(self):
        """
        Tests that the tile is not saved if the cardinality is violated
        by testin to save a tile with the same values as existing one

        """

        self.user = User.objects.get(username="******")
        first_json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": "",
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "AUTHORITATIVE"
            },
        }
        first_tile = Tile(first_json)
        request = HttpRequest()
        request.user = self.user
        first_tile.save(index=False, request=request)

        second_json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": "",
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "AUTHORITATIVE"
            },
        }
        second_tile = Tile(second_json)

        with self.assertRaises(TileCardinalityError):
            second_tile.save(index=False, request=request)
Beispiel #3
0
                        def update_or_create_tile(src_tile):
                            tile = None
                            src_tile["parenttile_id"] = uuid.UUID(str(src_tile["parenttile_id"])) if src_tile["parenttile_id"] else None
                            defaults = {
                                "resourceinstance": resourceinstance,
                                "parenttile_id": str(src_tile["parenttile_id"]) if src_tile["parenttile_id"] else None,
                                "nodegroup_id": str(src_tile["nodegroup_id"]) if src_tile["nodegroup_id"] else None,
                                "data": src_tile["data"],
                            }
                            new_values = {"tileid": uuid.UUID(str(src_tile["tileid"]))}
                            new_values.update(defaults)
                            if overwrite == "overwrite":
                                tile = Tile(**new_values)
                            else:
                                try:
                                    tile = Tile.objects.get(tileid=uuid.UUID(str(src_tile["tileid"])))
                                    for key, value in defaults.items():
                                        setattr(tile, key, value)
                                except Tile.DoesNotExist:
                                    tile = Tile(**new_values)
                            if tile is not None:
                                resourceinstance.tiles.append(tile)
                                reporter.update_tiles_saved()

                            for child in src_tile["tiles"]:
                                update_or_create_tile(child)
Beispiel #4
0
    def post(self, request):
        if self.action == 'update_tile':
            json = request.POST.get('data', None)
            if json != None:
                data = JSONDeserializer().deserialize(json)
                tile_id = data['tileid']
                if tile_id != None and tile_id != '':
                    old_tile = Tile.objects.get(pk=tile_id)
                    clean_resource_cache(old_tile)
                tile = Tile(data)
                if tile.filter_by_perm(request.user, 'write_nodegroup'):
                    with transaction.atomic():
                        try:
                            tile.save(request=request)
                        except ValidationError as e:
                            return JSONResponse(
                                {
                                    'status': 'false',
                                    'message': e.args
                                },
                                status=500)
                        tile.after_update_all()
                        clean_resource_cache(tile)
                        update_system_settings_cache(tile)
                    return JSONResponse(tile)
                else:
                    return JSONResponse(
                        {
                            'status':
                            'false',
                            'message':
                            [_('Request Failed'),
                             _('Permission Denied')]
                        },
                        status=500)

        if self.action == 'reorder_tiles':
            json = request.body
            if json != None:
                data = JSONDeserializer().deserialize(json)

                if 'tiles' in data and len(data['tiles']) > 0:
                    sortorder = 0
                    with transaction.atomic():
                        for tile in data['tiles']:
                            t = Tile(tile)
                            if t.filter_by_perm(request.user,
                                                'write_nodegroup'):
                                t.sortorder = sortorder
                                t.save(update_fields=['sortorder'],
                                       request=request)
                                sortorder = sortorder + 1

                    return JSONResponse(data)

        return HttpResponseNotFound()
Beispiel #5
0
    def copy(self):
        """
        Returns a copy of this resource instance including a copy of all tiles associated with this resource instance

        """
        # need this here to prevent a circular import error
        from arches.app.models.tile import Tile

        id_map = {}
        new_resource = Resource()
        new_resource.graph = self.graph

        if len(self.tiles) == 0:
            self.tiles = Tile.objects.filter(resourceinstance=self)

        for tile in self.tiles:
            new_tile = Tile()
            new_tile.data = tile.data
            new_tile.nodegroup = tile.nodegroup
            new_tile.parenttile = tile.parenttile
            new_tile.resourceinstance = new_resource
            new_tile.sortorder = tile.sortorder

            new_resource.tiles.append(new_tile)
            id_map[tile.pk] = new_tile

        for tile in new_resource.tiles:
            if tile.parenttile:
                tile.parenttile = id_map[tile.parenttile_id]

        with transaction.atomic():
            new_resource.save()

        return new_resource
Beispiel #6
0
    def test_simple_get(self):
        """
        Test that we can get a Tile object

        """

        json = {
            "tiles": {},
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "20000000-0000-0000-0000-000000000001",
            "tileid": "",
            "data": {
                "20000000-0000-0000-0000-000000000004": "TEST 1"
            }
        }

        t = Tile(json)
        t.save()

        t2 = Tile.get(tileid=t.tileid)

        self.assertEqual(t.tileid, t2.tileid)
        self.assertEqual(t2.data["20000000-0000-0000-0000-000000000004"],
                         "TEST 1")
Beispiel #7
0
    def test_create_new_provisional(self):
        """
        Test that a new provisional tile is created when a user IS NOT a reviwer.

        """

        self.user = User.objects.create_user(username="******",
                                             password="******")

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": "",
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "PROVISIONAL"
            },
        }

        provisional_tile = Tile(json)
        request = HttpRequest()
        request.user = self.user
        provisional_tile.save(index=False, request=request)

        self.assertEqual(provisional_tile.is_provisional(), True)
Beispiel #8
0
    def test_provisional_deletion(self):
        """
        Tests that a tile is NOT deleted if a user does not have the
        privlages to delete a tile and that the proper provisionaledit is
        applied.

        """

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "TEST 1"
            }
        }

        provisional_user = User.objects.create_user(
            username='******', password='******')
        reviewer = User.objects.get(username='******')

        tile = Tile(json)
        reviewer_request = HttpRequest()
        reviewer_request.user = reviewer
        tile.save(index=False, request=reviewer_request)

        provisional_request = HttpRequest()
        provisional_request.user = provisional_user
        tile.delete(request=provisional_request)

        self.assertEqual(len(Tile.objects.all()), 1)
Beispiel #9
0
 def addNodeWithoutValue(cls):
     cls.test_resource_no_value = Resource(
         graph_id=cls.search_model_graphid)
     tile = Tile(data={cls.search_model_cultural_period_nodeid: ''},
                 nodegroup_id=cls.search_model_cultural_period_nodeid)
     cls.test_resource_no_value.tiles.append(tile)
     cls.test_resource_no_value.save()
Beispiel #10
0
    def test_apply_provisional_edit(self):
        """
        Tests that provisional edit data is properly created

        """

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "TEST 1"
            }
        }

        user = User.objects.create_user(username='******',
                                        password='******')
        provisional_tile = Tile(json)
        request = HttpRequest()
        request.user = user
        provisional_tile.save(index=False, request=request)
        provisional_tile.apply_provisional_edit(user, {"test": "test"},
                                                'update')
        provisionaledits = JSONDeserializer().deserialize(
            provisional_tile.provisionaledits)
        userid = str(user.id)
        self.assertEqual(provisionaledits[userid]['action'], 'update')
        self.assertEqual(provisionaledits[userid]['reviewer'], None)
        self.assertEqual(provisionaledits[userid]['value'], {"test": "test"})
        self.assertEqual(provisionaledits[userid]['status'], "review")
        self.assertEqual(provisionaledits[userid]['reviewtimestamp'], None)
Beispiel #11
0
    def test_apply_provisional_edit(self):
        """
        Tests that provisional edit data is properly created

        """

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": "",
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "TEST 1"
            },
        }

        user = User.objects.create_user(username="******",
                                        password="******")
        provisional_tile = Tile(json)
        request = HttpRequest()
        request.user = user
        provisional_tile.save(index=False, request=request)
        provisional_tile.apply_provisional_edit(user, {"test": "test"},
                                                "update")
        provisionaledits = provisional_tile.provisionaledits
        userid = str(user.id)
        self.assertEqual(provisionaledits[userid]["action"], "update")
        self.assertEqual(provisionaledits[userid]["reviewer"], None)
        self.assertEqual(provisionaledits[userid]["value"], {"test": "test"})
        self.assertEqual(provisionaledits[userid]["status"], "review")
        self.assertEqual(provisionaledits[userid]["reviewtimestamp"], None)
Beispiel #12
0
    def test_save(self):
        """
        Test that we can save a Tile object back to the database

        """
        login = self.client.login(username='******', password='******')

        json = {
            "tiles": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": [{
                    "tiles": {},
                    "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
                    "parenttile_id": '',
                    "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
                    "tileid": "",
                    "data": {
                      "72048cb3-adbc-11e6-9ccf-14109fd34195": "TEST 1"
                    }
                }]
            },
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "7204869c-adbc-11e6-8bec-14109fd34195",
            "tileid": "",
            "data": {}
        }

        t = Tile(json)
        t.save(index=False)

        tiles = Tile.objects.filter(resourceinstance_id="40000000-0000-0000-0000-000000000000")

        self.assertEqual(tiles.count(), 2)
Beispiel #13
0
                            def update_or_create_tile(src_tile):
                                src_tile['parenttile_id'] = uuid.UUID(
                                    str(src_tile['parenttile_id'])
                                ) if src_tile['parenttile_id'] else None

                                tile, created = Tile.objects.update_or_create(
                                    tileid=uuid.UUID(str(src_tile['tileid'])),
                                    defaults={
                                        'resourceinstance':
                                        resourceinstance,
                                        'parenttile':
                                        Tile(
                                            uuid.UUID(
                                                str(src_tile['parenttile_id']))
                                        )
                                        if src_tile['parenttile_id'] else None,
                                        'nodegroup':
                                        NodeGroup(
                                            uuid.UUID(
                                                str(src_tile['nodegroup_id'])))
                                        if src_tile['nodegroup_id'] else None,
                                        'data':
                                        src_tile['data']
                                    })
                                try:
                                    if len(
                                            Tile.objects.filter(
                                                tileid=tile.tileid)) == 1:
                                        errors = tile.validate(self.errors)
                                        reporter.update_tiles_saved()
                                except TileValidationError as e:
                                    print(e)
                                for child in src_tile['tiles']:
                                    update_or_create_tile(child)
Beispiel #14
0
    def test_save_provisional_from_athoritative(self):
        """
        Test that a provisional edit is created when a user that is not a
        reviewer edits an athoritative tile

        """

        json = {
            "tiles": [{
                "tiles": [],
                "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
                "parenttile_id": '',
                "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
                "tileid": "",
                "data": {
                    "72048cb3-adbc-11e6-9ccf-14109fd34195": "AUTHORITATIVE"
                }
            }],
            "resourceinstance_id":
            "40000000-0000-0000-0000-000000000000",
            "parenttile_id":
            '',
            "nodegroup_id":
            "7204869c-adbc-11e6-8bec-14109fd34195",
            "tileid":
            "",
            "data": {}
        }

        t = Tile(json)
        t.save(index=False)
        self.user = User.objects.create_user(username='******',
                                             password='******')
        login = self.client.login(username='******',
                                  password='******')
        tiles = Tile.objects.filter(
            resourceinstance_id="40000000-0000-0000-0000-000000000000")

        provisional_tile = None
        for tile in tiles:
            provisional_tile = tile
            provisional_tile.data[
                "72048cb3-adbc-11e6-9ccf-14109fd34195"] = 'PROVISIONAL'
        request = HttpRequest()
        request.user = self.user
        provisional_tile.save(index=False, request=request)
        tiles = Tile.objects.filter(
            resourceinstance_id="40000000-0000-0000-0000-000000000000")

        provisionaledits = provisional_tile.provisionaledits
        self.assertEqual(tiles.count(), 2)
        self.assertEqual(
            provisional_tile.data["72048cb3-adbc-11e6-9ccf-14109fd34195"],
            'AUTHORITATIVE')
        self.assertEqual(provisionaledits[str(self.user.id)]['action'],
                         'update')
        self.assertEqual(provisionaledits[str(self.user.id)]['status'],
                         'review')
Beispiel #15
0
    def test_create_new_provisional(self):
        """
        Test that a new provisional tile is created when a user IS NOT a reviwer
        and that an authoritative tile is created when a user IS a reviwer.

        """

        self.user = User.objects.get(username='******')

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "AUTHORITATIVE"
            }
        }

        authoritative_tile = Tile(json)
        request = HttpRequest()
        request.user = self.user
        authoritative_tile.save(index=False, request=request)

        self.user = User.objects.create_user(username='******',
                                             password='******')

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "PROVISIONAL"
            }
        }

        provisional_tile = Tile(json)
        request = HttpRequest()
        request.user = self.user
        provisional_tile.save(index=False, request=request)

        self.assertEqual(provisional_tile.is_provisional(), True)
        self.assertEqual(authoritative_tile.is_provisional(), False)
Beispiel #16
0
    def import_business_data_without_mapping(self, business_data, reporter):
        errors = []
        for resource in business_data['resources']:
            if resource['resourceinstance'] != None:
                if models.GraphModel.objects.filter(graphid=str(
                        resource['resourceinstance']['graph_id'])).count() > 0:
                    resourceinstance, created = ResourceInstance.objects.update_or_create(
                        resourceinstanceid=uuid.UUID(
                            str(resource['resourceinstance']
                                ['resourceinstanceid'])),
                        defaults={
                            'graph_id':
                            uuid.UUID(
                                str(resource['resourceinstance']['graph_id'])),
                            'legacyid':
                            resource['resourceinstance']['legacyid']
                        })

                    if len(
                            ResourceInstance.objects.filter(
                                resourceinstanceid=resource['resourceinstance']
                                ['resourceinstanceid'])) == 1:
                        reporter.update_resources_saved()

                        if resource['tiles'] != []:
                            reporter.update_tiles(len(resource['tiles']))
                            for tile in sorted(
                                    resource['tiles'],
                                    key=lambda k: k['parenttile_id']):
                                tile['parenttile_id'] = uuid.UUID(
                                    str(tile['parenttile_id'])
                                ) if tile['parenttile_id'] else None

                                tile, created = Tile.objects.update_or_create(
                                    tileid=uuid.UUID(str(tile['tileid'])),
                                    defaults={
                                        'resourceinstance':
                                        resourceinstance,
                                        'parenttile':
                                        Tile(
                                            uuid.UUID(
                                                str(tile['parenttile_id'])))
                                        if tile['parenttile_id'] else None,
                                        'nodegroup':
                                        NodeGroup(
                                            uuid.UUID(str(
                                                tile['nodegroup_id'])))
                                        if tile['nodegroup_id'] else None,
                                        'data':
                                        tile['data']
                                    })
                                if len(Tile.objects.filter(
                                        tileid=tile.tileid)) == 1:
                                    errors = tile.validate(self.errors)
                                    reporter.update_tiles_saved()
Beispiel #17
0
    def test_load_from_python_dict(self):
        """
        Test that we can initialize a Tile object from a Python dictionary

        """

        json = {
            "tiles": {
                "19999999-0000-0000-0000-000000000000": [{
                    "tiles": {},
                    "resourceinstance_id":
                    "40000000-0000-0000-0000-000000000000",
                    "parenttile_id":
                    '',
                    "nodegroup_id":
                    "19999999-0000-0000-0000-000000000000",
                    "tileid":
                    "",
                    "data": {
                        "20000000-0000-0000-0000-000000000004": "TEST 1",
                        "20000000-0000-0000-0000-000000000002": "TEST 2",
                        "20000000-0000-0000-0000-000000000003": "TEST 3"
                    }
                }],
                "32999999-0000-0000-0000-000000000000": [{
                    "tiles": {},
                    "resourceinstance_id":
                    "40000000-0000-0000-0000-000000000000",
                    "parenttile_id":
                    '',
                    "nodegroup_id":
                    "32999999-0000-0000-0000-000000000000",
                    "tileid":
                    "",
                    "data": {
                        "20000000-0000-0000-0000-000000000004": "TEST 4",
                        "20000000-0000-0000-0000-000000000002": "TEST 5",
                    }
                }]
            },
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "20000000-0000-0000-0000-000000000001",
            "tileid": "",
            "data": {}
        }

        t = Tile(json)
        subTiles = t.tiles["19999999-0000-0000-0000-000000000000"]

        self.assertEqual(t.resourceinstance_id,
                         "40000000-0000-0000-0000-000000000000")
        self.assertEqual(t.data, {})
        self.assertEqual(
            subTiles[0].data["20000000-0000-0000-0000-000000000004"], "TEST 1")
Beispiel #18
0
    def test_save(self):
        """
        Test that we can save a Tile object back to the database

        """

        json = {
            "tiles": {
                "19999999-0000-0000-0000-000000000000": [{
                    "tiles": {},
                    "resourceinstance_id":
                    "40000000-0000-0000-0000-000000000000",
                    "parenttile_id":
                    '',
                    "nodegroup_id":
                    "19999999-0000-0000-0000-000000000000",
                    "tileid":
                    "",
                    "data": {
                        "20000000-0000-0000-0000-000000000004": "TEST 1",
                        "20000000-0000-0000-0000-000000000002": "TEST 2",
                        "20000000-0000-0000-0000-000000000003": "TEST 3"
                    }
                }],
                "32999999-0000-0000-0000-000000000000": [{
                    "tiles": {},
                    "resourceinstance_id":
                    "40000000-0000-0000-0000-000000000000",
                    "parenttile_id":
                    '',
                    "nodegroup_id":
                    "32999999-0000-0000-0000-000000000000",
                    "tileid":
                    "",
                    "data": {
                        "20000000-0000-0000-0000-000000000004": "TEST 4",
                        "20000000-0000-0000-0000-000000000002": "TEST 5",
                    }
                }]
            },
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "20000000-0000-0000-0000-000000000001",
            "tileid": "",
            "data": {}
        }

        t = Tile(json)
        t.save()

        tiles = models.Tile.objects.filter(
            resourceinstance_id="40000000-0000-0000-0000-000000000000")
        self.assertEqual(tiles.count(), 3)
Beispiel #19
0
 def push_edits_to_db(self):
     # read all docs that have changes
     # save back to postgres db
     db = self.couch.create_db('project_' + str(self.id))
     ret = []
     for row in db.view('_all_docs', include_docs=True):
         ret.append(row)
         if 'tileid' in row.doc:
             tile = Tile(row.doc)
             #if tile.filter_by_perm(request.user, 'write_nodegroup'):
             with transaction.atomic():
                 tile.save()
             #tile = models.TileModel.objects.get(pk=row.doc.tileid).update(**row.doc)
     return ret
Beispiel #20
0
    def test_get_not_existing_value_from_concept(self):
        """
        Query a concept node without a value
        """

        test_resource_no_value = Resource(graph_id=self.search_model_graphid)
        tile = Tile(data={self.search_model_cultural_period_nodeid: ""}, nodegroup_id=self.search_model_cultural_period_nodeid)
        test_resource_no_value.tiles.append(tile)
        test_resource_no_value.save()

        node_name = "Cultural Period Concept"
        result = test_resource_no_value.get_node_values(node_name)
        self.assertEqual(None, result[0])
        test_resource_no_value.delete()
Beispiel #21
0
    def test_validation(self):
        """
        Test that we can get a Tile object

        """

        json = {
            "tiles": {},
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "20000000-0000-0000-0000-000000000001",
            "tileid": "",
            "data": {
                "20000000-0000-0000-0000-000000000004": "TEST 1"
            }
        }

        t = Tile(json)
        self.assertTrue(t.validate()['is_valid'])

        json['data']['20000000-0000-0000-0000-000000000004'] = ''

        t2 = Tile(json)
        self.assertFalse(t2.validate()['is_valid'])
Beispiel #22
0
    def post(self, request):
        if self.action == 'update_tile':
            json = request.POST.get('data', None)
            if json != None:
                data = JSONDeserializer().deserialize(json)
                tile = Tile(data)
                with transaction.atomic():
                    try:
                        tile.save(request=request)
                    except ValidationError as e:
                        return JSONResponse(
                            {
                                'status': 'false',
                                'message': e.args
                            }, status=500)

                return JSONResponse(tile)

        if self.action == 'reorder_tiles':
            json = request.body
            if json != None:
                data = JSONDeserializer().deserialize(json)

                if 'tiles' in data and len(data['tiles']) > 0:
                    sortorder = 0
                    with transaction.atomic():
                        for tile in data['tiles']:
                            t = Tile(tile)
                            t.sortorder = sortorder
                            t.save(update_fields=['sortorder'],
                                   request=request)
                            sortorder = sortorder + 1

                    return JSONResponse(data)

        return HttpResponseNotFound()
Beispiel #23
0
    def test_load_from_JSON(self):
        """
        Test that we can initialize a Tile object from JSON

        """

        json = '{"tiles": {"99999999-0000-0000-0000-000000000000": [], "99999999-0000-0000-0000-000000000001": [{"parenttile_id": null, "nodegroup_id": "99999999-0000-0000-0000-000000000001", "resourceinstance_id": "40000000-0000-0000-0000-000000000000", "tileid": "985da56d-316a-4f2e-8759-8e17b6cad918", "data": {"20000000-0000-0000-0000-000000000004": "TEST 2", "20000000-0000-0000-0000-000000000002": "TEST 1"}}]}, "resourceinstance_id": "40000000-0000-0000-0000-000000000000", "parenttile_id": null, "nodegroup_id": "21111111-0000-0000-0000-000000000000", "tileid": "", "data": null}'

        t = Tile(json)
        subTiles = t.tiles["99999999-0000-0000-0000-000000000001"]

        self.assertEqual(t.resourceinstance_id,
                         "40000000-0000-0000-0000-000000000000")
        self.assertEqual(t.data, {})
        self.assertEqual(
            subTiles[0].data["20000000-0000-0000-0000-000000000002"], "TEST 1")
Beispiel #24
0
    def handle(self, *args, **options):

        if options["set_empty"]:
            value = None
        elif options["set_value"]:
            value = options["set_value"]

        try:
            id = uuid.UUID(options["node"])
            nodes = Node.objects.filter(nodeid=id)
        except ValueError:
            nodes = Node.objects.filter(name=options["node"])
        if len(nodes) == 0:
            print("cancelling, no nodes match this name.")
            exit()
        elif len(nodes) > 1:
            print("multiple nodes match this name:")
            for node in nodes:
                print(f"{node.name} - {node.pk} - {node.graph.name}")
            print("\nAll of these nodes will be updated. To choose a specific "\
                  "one, rerun this command using the node id instead of name.")
            if not input("\nproceed? y/N ").lower().startswith("y"):
                print("cancelled")
                exit()

        for node in nodes:

            print(f"{node.name} - {node.pk} - {node.graph.name}")
            tiles = Tile.objects.filter(nodegroup_id=node.nodegroup)

            nodeid = str(node.pk)
            for t in tiles:
                old_value = t.data.get(nodeid, "<no previously saved value>")

                if options["set_empty"] or options["set_value"]:
                    if options["set_empty"]:
                        new_value = None
                    elif options["set_value"]:
                        new_value = options["set_value"]
                    Tile().update_node_value(nodeid, new_value, tileid=t.tileid)
                    print(f"{t.resourceinstance_id}: {old_value} --> {new_value}")
                else:
                    print(f"{t.resourceinstance_id}: {old_value}")

            print(f"  tiles: {tiles.count()}")
Beispiel #25
0
def get_nodegroup_tilegroup(v4_node_name, nodes, resource_id, verbose=False):

    # get the corresponding v4 node and then get the tile for its nodegroup
    v4_node = nodes.get(name=v4_node_name)
    ng_tile = Tile().get_blank_tile(v4_node.nodegroup_id,
                                    resourceid=resource_id)

    if verbose:
        print "  ", ng_tile.data
        print "  ", ng_tile.tiles

    # if there are child tiles, then the ng_tile.tileid needs to be set
    # (not sure why this is the case, but it is)
    if ng_tile.tileid is None:
        ng_tile.tileid = uuid.uuid4()

    # create a raw json representation of the node group tile and its children
    # and put these into a flat list of tiles that is returned
    tile_json = {
        "resourceinstance_id": resource_id,
        "provisionaledits": None,
        "parenttile_id": ng_tile.parenttile_id,
        "nodegroup_id": ng_tile.nodegroup_id,
        "sortorder": 0,
        "data": ng_tile.data,
        "tileid": ng_tile.tileid,
    }
    output_tiles = [tile_json]
    for tile in ng_tile.tiles:
        child_tile_json = {
            "tileid": tile.tileid,
            "resourceinstance_id": resource_id,
            "nodegroup_id": tile.nodegroup_id,
            "sortorder": 0,
            "provisionaledits": None,
            "parenttile_id": ng_tile.tileid,
            "data": tile.data,
        }
        output_tiles.append(child_tile_json)

    return output_tiles
Beispiel #26
0
    def test_user_owns_provisional(self):
        """
        Tests that a user is the owner of a provisional edit

        """

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
              "72048cb3-adbc-11e6-9ccf-14109fd34195": "TEST 1"
            }
        }

        user = User.objects.create_user(username='******', password='******')
        provisional_tile = Tile(json)
        request = HttpRequest()
        request.user = user
        provisional_tile.save(index=False, request=request)

        self.assertEqual(provisional_tile.user_owns_provisional(user), True)
Beispiel #27
0
    def test_simple_get(self):
        """
        Test that we can get a Tile object

        """

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": '',
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
              "72048cb3-adbc-11e6-9ccf-14109fd34195": "TEST 1"
            }
        }

        t = Tile(json)
        t.save(index=False)

        t2 = Tile.objects.get(tileid=t.tileid)

        self.assertEqual(t.tileid, t2.tileid)
        self.assertEqual(t2.data["72048cb3-adbc-11e6-9ccf-14109fd34195"], "TEST 1")
Beispiel #28
0
    def test_create_new_authoritative(self):
        """
        Test that a new authoritative tile is created when a user IS a reviwer.

        """

        self.user = User.objects.get(username="******")

        json = {
            "resourceinstance_id": "40000000-0000-0000-0000-000000000000",
            "parenttile_id": "",
            "nodegroup_id": "72048cb3-adbc-11e6-9ccf-14109fd34195",
            "tileid": "",
            "data": {
                "72048cb3-adbc-11e6-9ccf-14109fd34195": "AUTHORITATIVE"
            },
        }

        authoritative_tile = Tile(json)
        request = HttpRequest()
        request.user = self.user
        authoritative_tile.save(index=False, request=request)

        self.assertEqual(authoritative_tile.is_provisional(), False)
Beispiel #29
0
    def push_edits_to_db(self, synclog=None, userid=None):
        # read all docs that have changes
        # save back to postgres db
        db = self.couch.create_db("project_" + str(self.id))
        user_lookup = {}
        is_reviewer = False
        sync_user = None
        sync_user_id = None
        if userid is not None:
            sync_user = User.objects.get(pk=userid)
            sync_user_id = str(sync_user.id)

        with transaction.atomic():
            couch_docs = self.couch.all_docs(db)
            for row in couch_docs:
                if row.doc["type"] == "resource":
                    if self.check_if_revision_exists(row.doc) is False:
                        if "provisional_resource" in row.doc and row.doc[
                                "provisional_resource"] == "true":
                            resourceinstance, created = ResourceInstance.objects.update_or_create(
                                resourceinstanceid=uuid.UUID(
                                    str(row.doc["resourceinstanceid"])),
                                defaults=dict(graph_id=uuid.UUID(
                                    str(row.doc["graph_id"]))),
                            )
                            if created is True:
                                self.save_revision_log(row.doc, synclog,
                                                       "create")
                            else:
                                self.save_revision_log(row.doc, synclog,
                                                       "update")

                            print("Resource {0} Saved".format(
                                row.doc["resourceinstanceid"]))
                    else:
                        print("{0}: already saved".format(row.doc["_rev"]))

            for row in couch_docs:
                if row.doc[
                        "type"] == "tile" and ResourceInstance.objects.filter(
                            pk=row.doc["resourceinstance_id"]).exists():
                    if self.check_if_revision_exists(row.doc) is False:
                        if "provisionaledits" in row.doc and row.doc[
                                "provisionaledits"] is not None:
                            action = "update"
                            try:
                                tile = Tile.objects.get(
                                    tileid=row.doc["tileid"])
                                prov_edit = self.get_provisional_edit(
                                    row.doc, tile, sync_user_id, db)
                                if prov_edit is not None:
                                    tile.data = prov_edit

                                # If there are conflicting documents, lets clear those out
                                if "_conflicts" in row.doc:
                                    for conflict_rev in row.doc["_conflicts"]:
                                        conflict_data = db.get(
                                            row.id, rev=conflict_rev)
                                        if conflict_data[
                                                "provisionaledits"] != "" and conflict_data[
                                                    "provisionaledits"] is not None:
                                            if sync_user_id in conflict_data[
                                                    "provisionaledits"]:
                                                tile.data = conflict_data[
                                                    "provisionaledits"][
                                                        sync_user_id]["value"]
                                        # Remove conflicted revision from couch
                                        db.delete(conflict_data)

                            except Tile.DoesNotExist:
                                action = "create"
                                tile = Tile(row.doc)
                                prov_edit = self.get_provisional_edit(
                                    row.doc, tile, sync_user_id, db)
                                if prov_edit is not None:
                                    tile.data = prov_edit

                            self.handle_reviewer_edits(sync_user, tile)
                            tile.save(user=sync_user)
                            self.save_revision_log(row.doc, synclog, action)
                            print("Tile {0} Saved".format(row.doc["tileid"]))
                            db.compact()
Beispiel #30
0
    def load(self, resourceid, formid=None, user=None):
        tiles = Tile.objects.filter(
            resourceinstance_id=resourceid).order_by('sortorder')

        # get the form and card data
        if formid is not None:
            form = models.Form.objects.get(pk=formid)
            formxcards = form.formxcard_set.all()
            form_obj = {
                'id': form.pk,
                'title': form.title,
                'subtitle': form.subtitle
            }
            form_obj['cardgroups'] = []
            for formxcard in formxcards:
                card = Card.objects.get(cardid=formxcard.card_id)
                if card.filter_by_perm(user, 'read_nodegroup'):
                    card_obj = JSONSerializer().serializeToPython(card)
                    form_obj['cardgroups'].append(card_obj)
            self.forms = [form_obj]

        # get the actual tile data
        for form in self.forms:
            for cardgroup in form['cardgroups']:
                self.tiles[cardgroup['nodegroup_id']] = JSONSerializer(
                ).serializeToPython(
                    tiles.filter(nodegroup_id=cardgroup['nodegroup_id']))

                if len(self.tiles[cardgroup['nodegroup_id']]) > 0:
                    for parentTile in self.tiles[cardgroup['nodegroup_id']]:
                        parentTile['tiles'] = {}
                        for card in cardgroup['cards']:
                            parentTile['tiles'][card['nodegroup_id']] = []
                        for tile in JSONSerializer().serializeToPython(
                                tiles.filter(
                                    parenttile_id=parentTile['tileid'])):
                            # only append tiles that havn't been filtered out by user permissions
                            if str(tile['nodegroup_id']
                                   ) in parentTile['tiles']:
                                parentTile['tiles'][str(
                                    tile['nodegroup_id'])].append(tile)

        # get the blank tile data
        for form in self.forms:
            for cardgroup in form['cardgroups']:
                # add blank parent tile
                parentTile = JSONSerializer().serializeToPython(Tile())
                parentTile['tileid'] = ''
                parentTile['parenttile_id'] = None
                parentTile['resourceinstance_id'] = resourceid
                parentTile['nodegroup_id'] = cardgroup['nodegroup_id']
                parentTile['tiles'] = {}
                parentTile['data'] = {}
                for widget in cardgroup['widgets']:
                    parentTile['data'][widget['node_id']] = None

                # add a blank tile for the cardgroup
                self.blanks[parentTile['nodegroup_id']] = [parentTile]

                for card in cardgroup['cards']:
                    # make a blank tile
                    tile = JSONSerializer().serializeToPython(Tile())
                    tile['tileid'] = ''
                    tile['parenttile_id'] = None  # parentTile
                    tile['resourceinstance_id'] = resourceid
                    tile['nodegroup_id'] = card['nodegroup_id']
                    tile['tiles'] = {}
                    tile['data'] = {}
                    for widget in card['widgets']:
                        tile['data'][widget['node_id']] = None

                    if (card['cardinality'] == '1'):
                        parentTile['tiles'][card['nodegroup_id']] = [tile]
                    else:
                        parentTile['tiles'][card['nodegroup_id']] = []

                    # add a blank tile for each card
                    self.blanks[tile['nodegroup_id']] = [tile]