Pārlūkot izejas kodu

Prettier resource browser page.

* No crash after 150K SPARQL queries.
Stefano Cossu 6 gadi atpakaļ
vecāks
revīzija
810b94ddd9

+ 9 - 10
lakesuperior/endpoints/ldp.py

@@ -138,13 +138,14 @@ def get_resource(uid, force_rdf=False):
         return _tombstone_response(e, uid)
     else:
         out_headers.update(_headers_from_metadata(rsrc))
+        uri = g.tbox.uid_to_uri(uid)
         if (
                 isinstance(rsrc, LdpRs)
                 or is_accept_hdr_rdf_parsable()
                 or force_rdf):
-            gr = g.tbox.globalize_graph(rsrc.out_graph)
-            gr.namespace_manager = nsm
-            return _negotiate_content(gr, out_headers)
+            ggr = g.tbox.globalize_graph(rsrc.out_graph)
+            ggr.namespace_manager = nsm
+            return _negotiate_content(ggr, out_headers, uid=uid, uri=uri)
         else:
             logger.info('Streaming out binary content.')
             rsp = make_response(send_file(
@@ -152,7 +153,6 @@ def get_resource(uid, force_rdf=False):
                     attachment_filename=rsrc.filename,
                     mimetype=rsrc.mimetype))
             logger.debug('Out headers: {}'.format(out_headers))
-            uri = g.tbox.uid_to_uri(uid)
             rsp.headers.add('Link',
                     '<{}/fcr:metadata>; rel="describedby"'.format(uri))
             for link in out_headers['Link']:
@@ -446,19 +446,18 @@ def patch_version(uid, ver_uid):
 
 ## PRIVATE METHODS ##
 
-def _negotiate_content(rsp, headers=None):
+def _negotiate_content(gr, headers=None, **vw_kwargs):
     '''
     Return HTML or serialized RDF depending on accept headers.
     '''
     if request.accept_mimetypes.best == 'text/html':
-        rsrc = rsp.resource(request.path)
         return render_template(
-                'resource.html', rsrc=rsrc, nsm=nsm,
-                blacklist = vw_blacklist)
+                'resource.html', gr=gr, nsc=nsc, nsm=nsm,
+                blacklist=vw_blacklist, arrow=arrow, **vw_kwargs)
     else:
         for p in vw_blacklist:
-            rsp.remove((None, p, None))
-        return (rsp.serialize(format='turtle'), headers)
+            gr.remove((None, p, None))
+        return (gr.serialize(format='turtle'), headers)
 
 
 def _bistream_from_req():

+ 4 - 1
lakesuperior/endpoints/templates/base.html

@@ -10,10 +10,11 @@
 
         <link href="{{url_for('ldp.static', filename='assets/css/bootstrap.min.css')}}" rel="stylesheet">
         <link href="{{url_for('ldp.static', filename='assets/css/bootstrap-theme.min.css')}}" rel="stylesheet">
-    {% endblock %}
     {% block extra_js %}{% endblock %}
+    {% endblock %}
     </head>
     <body>
+    {% block navbar%}
         <nav class="navbar navbar-default">
           <div class="container-fluid">
             <!-- Brand and toggle get grouped for better mobile display -->
@@ -47,7 +48,9 @@
             </div><!-- /.navbar-collapse -->
           </div><!-- /.container-fluid -->
         </nav>
+    {% endblock %}
         <main class="container">
+            {% block breadcrumbs %}{% endblock %}
             <h1>{{ self.title() }}</h1>
             {% block content %}{% endblock %}
         </main>

+ 85 - 5
lakesuperior/endpoints/templates/resource.html

@@ -1,20 +1,57 @@
 {% extends 'base.html' %}
-{% block title %}{{ rsrc.identifier }}{% endblock %}
+{% block title %}
+    Resource:&nbsp;{{ uid }}
+{% endblock %}
+{% block breadcrumbs %}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item">
+            <a href="/ldp/">Root</a>
+        </li>
+        {% set frags = uid.strip('/').split('/') %}
+        {% for frag in frags %}
+            {% set href = '/' + '/'.join(frags[:loop.index]) %}
+            {% if href == uid %}
+            <li class="breadcrumb-item active" aria-current="page">{{frag}}
+            {% else %}
+            <li class="breadcrumb-item">
+                <a href="/ldp{{ href }}">{{frag}}</a>
+            {% endif %}
+            </li>
+        {% endfor %}
+    </ol>
+</nav>
+{% endblock %}
 {% block content %}
-<h2>Resource</h2>
+{% set created_ts = arrow.get(
+    gr.value(gr.identifier, nsc['fcrepo'].created)).replace(
+    tzinfo='local') %}
+{% set updated_ts = arrow.get(
+    gr.value(gr.identifier, nsc['fcrepo'].lastModified)).replace(
+    tzinfo='local') %}
+<p><strong>Created on:</strong>&nbsp;{{ created_ts }}&nbsp;
+({{created_ts.humanize() }})</p>
+<p><strong>Last updated on:</strong>&nbsp;{{ updated_ts }}&nbsp;
+({{updated_ts.humanize() }})</p>
+<p><strong>Types:</strong>
+{% for t in gr[gr.identifier : nsc['rdf'].type :] | sort %}
+    <span class="label label-primary">{{ t.n3(namespace_manager=nsm) }}</span>
+{% endfor %}
+</p>
+<h2>Properties</h2>
 <table class="table table-striped">
     <thead>
         <tr>
             <!--
             <td>Subject</td>
-            -->
             <td>Predicate</td>
             <td>Object</td>
+            -->
         </tr>
     </thead>
     <tbody>
-    {% for t in rsrc.graph | sort %}
-        {% if t[1] not in blacklist %}
+    {% for t in gr | sort %}
+        {% if t[0] == uri and t[1] not in blacklist %}
         <tr>
             <!--
             <td>
@@ -31,6 +68,49 @@
             <td>
             {% if 'Literal' in t[2].__class__.__name__ %}
             "{{ t[2] }}"
+            {% if t[2].datatype %}
+                <span class="label label-primary">
+                    {{ t[2].datatype.n3(namespace_manager=nsm) }}
+                </span>
+            {% endif %}
+            {% else %}
+                <a href="{{ t[2] }}">
+                    {{ t[2].n3(namespace_manager=nsm) }}
+                </a>
+            {% endif %}
+            </td>
+        </tr>
+        {% endif %}
+    {% endfor %}
+    </tbody>
+</table>
+
+<h2>Other subjects</h2>
+<table class="table table-striped">
+    <thead>
+        <tr>
+            <td>Subject</td>
+            <td>Predicate</td>
+            <td>Object</td>
+        </tr>
+    </thead>
+    <tbody>
+    {% for t in gr | sort %}
+        {% if t[0] != uri and t[1] not in blacklist %}
+        <tr>
+            <td>
+                <a href="{{ t[0] }}">
+                    {{ t[0].n3(namespace_manager=nsm) }}
+                </a>
+            </td>
+            <td>
+                <a href="{{ t[1] }}">
+                    {{ t[1].n3(namespace_manager=nsm) }}
+                </a>
+            </td>
+            <td>
+            {% if 'Literal' in t[2].__class__.__name__ %}
+            "{{ t[2] }}"
             {% if t[2].datatype %}
             <span class="label label-primary">{{ t[2].datatype.n3(namespace_manager=nsm) }}</span>
             {% endif %}

+ 1 - 1
lakesuperior/model/ldpr.py

@@ -243,7 +243,7 @@ class Ldpr(metaclass=ABCMeta):
         '''
         Retun a graph of the resource's IMR formatted for output.
         '''
-        out_gr = Graph()
+        out_gr = Graph(identifier=self.uri)
 
         for t in self.imr.graph:
             if (

+ 4 - 2
lakesuperior/toolbox.py

@@ -102,7 +102,8 @@ class Toolbox:
         '''
         Localize a graph.
         '''
-        l_gr = Graph()
+        l_id = self.localize_term(gr.identifier)
+        l_gr = Graph(identifier=l_id)
         for trp in gr:
             l_gr.add(self.localize_triple(trp))
 
@@ -197,7 +198,8 @@ class Toolbox:
         '''
         Globalize a graph.
         '''
-        g_gr = Graph()
+        g_id = self.globalize_term(gr.identifier)
+        g_gr = Graph(identifier=g_id)
         for trp in gr:
             g_gr.add(self.globalize_triple(trp))