Quellcode durchsuchen

Complete POST version and version metadata in separate graphs.

Stefano Cossu vor 7 Jahren
Ursprung
Commit
003bab76dd

+ 32 - 20
lakesuperior/model/ldpr.py

@@ -397,14 +397,14 @@ class Ldpr(metaclass=ABCMeta):
             return self.rdfly.ask_rsrc_exists(self.urn)
 
 
-    @property
-    def has_versions(self):
-        '''
-        Whether if a current resource has versions.
+    #@property
+    #def has_versions(self):
+    #    '''
+    #    Whether if a current resource has versions.
 
-        @return boolean
-        '''
-        return bool(self.imr.value(nsc['fcrepo'].hasVersions, any=False))
+    #    @return boolean
+    #    '''
+    #    return bool(self.imr.value(nsc['fcrepo'].hasVersions, any=False))
 
 
     @property
@@ -548,11 +548,12 @@ class Ldpr(metaclass=ABCMeta):
         @param label Version label. If already existing, an exception is
         raised.
         '''
-        add_gr = Graph()
+        # Create version resource from copying the current state.
+        ver_add_gr = Graph()
         vers_uuid = '{}/{}'.format(self.uuid, self.RES_VER_CONT_LABEL)
         ver_uuid = '{}/{}'.format(vers_uuid, label)
         ver_urn = nsc['fcres'][ver_uuid]
-        add_gr.add((ver_urn, RDF.type, nsc['fcrepo'].Version))
+        ver_add_gr.add((ver_urn, RDF.type, nsc['fcrepo'].Version))
         for t in self.imr.graph:
             if t[1] == RDF.type and t[2] in {
                 nsc['fcrepo'].Resource,
@@ -561,21 +562,31 @@ class Ldpr(metaclass=ABCMeta):
             }:
                 pass
             else:
-                add_gr.add((
+                ver_add_gr.add((
                         g.tbox.replace_term_domain(t[0], self.urn, ver_urn),
                         t[1], t[2]))
 
-        self.rdfly.modify_dataset(add_trp=add_gr)
+        self.rdfly.modify_dataset(
+                add_trp=ver_add_gr, types={nsc['fcrepo'].Version})
 
-        # Update current resource with version relationship.
-        add_gr = Graph()
-        add_gr.add((
+        # Add version metadata.
+        meta_add_gr = Graph()
+        meta_add_gr.add((
             self.urn, nsc['fcrepo'].hasVersion, ver_urn))
-        if not self.has_versions:
-            add_gr.add((
-                self.urn, nsc['fcrepo'].hasVersions, nsc['fcres'][vers_uuid]))
+        meta_add_gr.add(
+                (ver_urn, nsc['fcrepo'].created, g.timestamp_term))
+        meta_add_gr.add(
+                (ver_urn, nsc['fcrepo'].hasVersionLabel, Literal(label)))
 
-        self._modify_rsrc(self.RES_UPDATED, add_trp=add_gr)
+        self.rdfly.modify_dataset(
+                add_trp=meta_add_gr, types={nsc['fcrepo'].Metadata})
+
+        # Update resource.
+        rsrc_add_gr = Graph()
+        rsrc_add_gr.add((
+            self.urn, nsc['fcrepo'].hasVersions, nsc['fcres'][vers_uuid]))
+
+        self._modify_rsrc(self.RES_UPDATED, add_trp=rsrc_add_gr, notify=False)
 
         return g.tbox.uuid_to_uri(vers_uuid)
 
@@ -684,7 +695,8 @@ class Ldpr(metaclass=ABCMeta):
         self._modify_rsrc(self.RES_UPDATED, add_trp=add_gr)
 
 
-    def _modify_rsrc(self, ev_type, remove_trp=Graph(), add_trp=Graph()):
+    def _modify_rsrc(self, ev_type, remove_trp=Graph(), add_trp=Graph(),
+                     notify=True):
         '''
         Low-level method to modify a graph for a single resource.
 
@@ -715,7 +727,7 @@ class Ldpr(metaclass=ABCMeta):
 
         ret = self.rdfly.modify_dataset(remove_trp, add_trp)
 
-        if current_app.config.get('messaging'):
+        if notify and current_app.config.get('messaging'):
             request.changelog.append((set(remove_trp), set(add_trp), {
                 'ev_type' : ev_type,
                 'time' : g.timestamp,

+ 4 - 1
lakesuperior/store_layouts/ldp_rs/base_rdf_layout.py

@@ -121,7 +121,7 @@ class BaseRdfLayout(metaclass=ABCMeta):
 
     @abstractmethod
     def modify_dataset(self, remove_trp=Graph(), add_trp=Graph(),
-            metadata=None):
+            types=set()):
         '''
         Adds and/or removes triples from the persistent data set.
 
@@ -130,6 +130,9 @@ class BaseRdfLayout(metaclass=ABCMeta):
 
         @param remove_trp (rdflib.Graph) Triples to be removed.
         @param add_trp (rdflib.Graph) Triples to be added.
+        @param types (iterable(rdflib.term.URIRef)) RDF types of the resource
+        that may be relevant to the layout strategy. These can be anything
+        since they are just used to inform the layout and not actually stored.
         '''
         pass
 

+ 11 - 3
lakesuperior/store_layouts/ldp_rs/default_layout.py

@@ -114,7 +114,8 @@ class DefaultLayout(BaseRdfLayout):
                     's': urn, 'g': self.MAIN_GRAPH_URI}))
 
 
-    def modify_dataset(self, remove_trp=Graph(), add_trp=Graph()):
+    def modify_dataset(self, remove_trp=Graph(), add_trp=Graph(),
+            types={nsc['fcrepo'].Resource}):
         '''
         See base_rdf_layout.update_rsrc.
         '''
@@ -123,7 +124,14 @@ class DefaultLayout(BaseRdfLayout):
         self._logger.debug('Add triples: {}'.format(pformat(
                 set(add_trp))))
 
+        if nsc['fcrepo'].Metadata in types:
+            target_gr = self.ds.graph(self.META_GRAPH_URI)
+        elif nsc['fcrepo'].Version in types:
+            target_gr = self.ds.graph(self.HIST_GRAPH_URI)
+        else:
+            target_gr = self.ds.graph(self.MAIN_GRAPH_URI)
+
         for t in remove_trp:
-            self.ds.graph(self.MAIN_GRAPH_URI).remove(t)
+            target_gr.remove(t)
         for t in add_trp:
-            self.ds.graph(self.MAIN_GRAPH_URI).add(t)
+            target_gr.add(t)