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)
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)
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)
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()
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
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")
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)
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)
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()
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)
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)
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)
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)
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')
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)
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()
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")
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)
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
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()
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'])
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()
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")
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()}")
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
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)
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")
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)
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()
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]