class Resources(APIBase): # context = [{ # "@context": { # "id": "@id", # "type": "@type", # "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", # "rdfs": "http://www.w3.org/2000/01/rdf-schema#", # "crm": "http://www.cidoc-crm.org/cidoc-crm/", # "la": "https://linked.art/ns/terms/", # "Right": "crm:E30_Right", # "LinguisticObject": "crm:E33_Linguistic_Object", # "Name": "la:Name", # "Identifier": "crm:E42_Identifier", # "Language": "crm:E56_Language", # "Type": "crm:E55_Type", # "label": "rdfs:label", # "value": "rdf:value", # "classified_as": "crm:P2_has_type", # "referred_to_by": "crm:P67i_is_referred_to_by", # "language": "crm:P72_has_language", # "includes": "crm:P106_is_composed_of", # "identified_by": "crm:P1_is_identified_by" # } # },{ # "@context": "https://linked.art/ns/v1/linked-art.json" # }] @method_decorator(can_read_resource_instance()) def get(self, request, resourceid=None): format = request.GET.get('format', 'json-ld') try: indent = int(request.GET.get('indent', None)) except: indent = None if resourceid: try: exporter = ResourceExporter(format=format) output = exporter.writer.write_resources( resourceinstanceids=[resourceid], indent=indent, user=request.user) out = output[0]['outputfile'].getvalue() except models.ResourceInstance.DoesNotExist: return JSONResponse(status=404) except: return JSONResponse(status=500) else: # # The following commented code would be what you would use if you wanted to use the rdflib module, # the problem with using this is that items in the "ldp:contains" array don't maintain a consistent order # # archesproject = Namespace(settings.ARCHES_NAMESPACE_FOR_DATA_EXPORT) # ldp = Namespace('https://www.w3.org/ns/ldp/') # g = Graph() # g.bind('archesproject', archesproject, False) # g.add((archesproject['resources'], RDF.type, ldp['BasicContainer'])) # base_url = "%s%s" % (settings.ARCHES_NAMESPACE_FOR_DATA_EXPORT, reverse('resources',args=['']).lstrip('/')) # for resourceid in list(Resource.objects.values_list('pk', flat=True).order_by('pk')[:10]): # g.add((archesproject['resources'], ldp['contains'], URIRef("%s%s") % (base_url, resourceid) )) # value = g.serialize(format='nt') # out = from_rdf(str(value), options={format:'application/nquads'}) # framing = { # "@omitDefault": True # } # out = frame(out, framing) # context = { # "@context": { # 'ldp': 'https://www.w3.org/ns/ldp/', # 'arches': settings.ARCHES_NAMESPACE_FOR_DATA_EXPORT # } # } # out = compact(out, context, options={'skipExpansion':False, 'compactArrays': False}) page_size = settings.API_MAX_PAGE_SIZE try: page = int(request.GET.get('page', None)) except: page = 1 start = ((page - 1) * page_size) + 1 end = start + page_size base_url = "%s%s" % (settings.ARCHES_NAMESPACE_FOR_DATA_EXPORT, reverse('resources', args=['']).lstrip('/')) out = { "@context": "https://www.w3.org/ns/ldp/", "@id": "", "@type": "ldp:BasicContainer", # Here we actually mean the name #"label": str(model.name), "ldp:contains": [ "%s%s" % (base_url, resourceid) for resourceid in list( Resource.objects.values_list('pk', flat=True).order_by( 'pk')[start:end]) ] } return JSONResponse(out, indent=indent) def put(self, request, resourceid): if user_can_edit_resources(user=request.user): data = JSONDeserializer().deserialize(request.body) #print data reader = JsonLdReader() reader.read_resource(data) else: return JSONResponse(status=500) return JSONResponse(self.get(request, resourceid))
return HttpResponseNotFound() @method_decorator(can_edit_resource_instance(), name='dispatch') class ResourceData(View): def get(self, request, resourceid=None, formid=None): if formid is not None: form = Form(resourceid=resourceid, formid=formid, user=request.user) return JSONResponse(form) return HttpResponseNotFound() @method_decorator(can_read_resource_instance(), name='dispatch') class ResourceTiles(View): def get(self, request, resourceid=None, include_display_values=True): datatype_factory = DataTypeFactory() nodeid = request.GET.get('nodeid', None) permitted_tiles = [] perm = 'read_nodegroup' tiles = models.TileModel.objects.filter(resourceinstance_id=resourceid) if nodeid is not None: node = models.Node.objects.get(pk=nodeid) tiles = tiles.filter(nodegroup=node.nodegroup) for tile in tiles: if request.user.has_perm(perm, tile.nodegroup): tile = Tile.objects.get(pk=tile.tileid) tile.filter_by_perm(request.user, perm)
return render(request, view_template, context) return HttpResponseNotFound() @method_decorator(can_edit_resource_instance(), name='dispatch') class ResourceData(View): def get(self, request, resourceid=None, formid=None): if formid is not None: form = Form(resourceid=resourceid, formid=formid, user=request.user) return JSONResponse(form) return HttpResponseNotFound() @method_decorator(can_read_resource_instance(), name='dispatch') class ResourceTiles(View): def get(self, request, resourceid=None, include_display_values=True): datatype_factory = DataTypeFactory() nodeid = request.GET.get('nodeid', None) permitted_tiles = [] perm = 'read_nodegroup' tiles = models.TileModel.objects.filter(resourceinstance_id=resourceid) if nodeid is not None: node = models.Node.objects.get(pk=nodeid) tiles = tiles.filter(nodegroup=node.nodegroup) for tile in tiles: if request.user.has_perm(perm, tile.nodegroup): tile = Tile.objects.get(pk=tile.tileid) tile.filter_by_perm(request.user, perm)