changeset 942:dd896321faee

subserver can get a snapshot from vidref and display it on the sub Ignore-this: 9ea0a172869922d22d8c5cf6ee4bf3da
author drewp@bigasterisk.com
date Thu, 13 Jun 2013 01:31:16 +0000
parents 1d9547f90737
children 3aae87f6777a
files bin/subserver light9/namespaces.py light9/subserver/gui.coffee light9/subserver/index.jade pydeps
diffstat 5 files changed, 54 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/bin/subserver	Thu Jun 13 00:46:52 2013 +0000
+++ b/bin/subserver	Thu Jun 13 01:31:16 2013 +0000
@@ -4,17 +4,18 @@
 dragging them into CC
 """
 from run_local import log
-from twisted.internet import reactor
-import twisted.internet.error
-import sys, optparse, logging, json, os, subprocess
+import sys, optparse, logging, json, subprocess, datetime
+from dateutil.tz import tzlocal
+from twisted.internet import reactor, defer
 import cyclone.web, cyclone.httpclient, cyclone.websocket
+from rdflib import RDF, URIRef, Literal
+import pyjade.utils
 from light9.rdfdb.syncedgraph import SyncedGraph
-from rdflib import RDF
-from light9.namespaces import L9
-import pyjade.utils
+from light9.rdfdb.patch import Patch
+from light9.namespaces import L9, DCTERMS
+from light9 import networking, showconfig
 
 try:
-    import sys
     sys.path.append("../homeauto/lib")
     sys.path.append("/home/drewp/projects/homeauto/lib")
     from cycloneerr import PrettyErrorHandler
@@ -67,6 +68,35 @@
     def responseStaticCoffee(self, src):
         self.write(subprocess.check_output([
             '/usr/bin/coffee', '--compile', '--print', src]))
+
+class Snapshot(PrettyErrorHandler, cyclone.web.RequestHandler):
+    @defer.inlineCallbacks
+    def post(self):
+        about = URIRef(self.get_argument("about"))
+        response = yield cyclone.httpclient.fetch(networking.vidref.path("snapshot"), method="POST")
+
+        snapUri = URIRef(json.loads(response.body)['snapshot'])
+        # vidref could write about when it was taken, etc. would it be
+        # better for us to tell vidref where to attach the result in
+        # the graph, and then it doesn't even have to return anything?
+
+        ctx = showconfig.showUri() + "/snapshots"
+        
+        self.settings.graph.patch(Patch(addQuads=[
+            (about, L9['image'], snapUri, ctx),
+            (snapUri, DCTERMS['created'],
+             Literal(datetime.datetime.now(tzlocal())), ctx),
+            ]))
+        
+        self.write(json.dumps({'snapshot': snapUri}))
+
+def newestImage(subject):
+    newest = (None, None)
+    for img in graph.objects(subject, L9['image']):
+        created = graph.value(img, DCTERMS['created'])
+        if created > newest[0]:
+            newest = (created, img)
+    return newest[1]
         
 if __name__ == "__main__":
     parser = optparse.OptionParser()
@@ -80,13 +110,13 @@
 
     d = {}
     def updateSubs():
-
         subs = []
-        for sub in graph.subjects(RDF.type, L9['Submaster']):
+        for sub in sorted(graph.subjects(RDF.type, L9['Submaster'])):
             rec = {'uri' : sub}
             rec['isLocal'] = graph.contains((sub, RDF.type,
                                              L9['LocalSubmaster']))
             rec['label'] = graph.label(sub)
+            rec['img'] = newestImage(sub)
             subs.append(rec)
         
         d.clear()
@@ -101,6 +131,7 @@
     port = 8052
     reactor.listenTCP(port, cyclone.web.Application(handlers=[
         (r'/live', Live),
+        (r'/snapshot', Snapshot),
         (r'/(.*)', Static,
          {"path" : "light9/subserver",
           "default_filename" : "index.jade"}),
--- a/light9/namespaces.py	Thu Jun 13 00:46:52 2013 +0000
+++ b/light9/namespaces.py	Thu Jun 13 01:31:16 2013 +0000
@@ -3,3 +3,4 @@
 L9 = Namespace("http://light9.bigasterisk.com/")
 MUS = Namespace("http://light9.bigasterisk.com/music/")
 XSD = Namespace("http://www.w3.org/2001/XMLSchema#")
+DCTERMS = Namespace("http://purl.org/dc/terms/")
--- a/light9/subserver/gui.coffee	Thu Jun 13 00:46:52 2013 +0000
+++ b/light9/subserver/gui.coffee	Thu Jun 13 01:31:16 2013 +0000
@@ -3,6 +3,13 @@
     @subs = ko.observable([])
     @showLocal = ko.observable(false)
 
+  snapshot: (sub) =>
+    $.ajax({
+      url: "snapshot"
+      type: "POST"
+      data: {about: sub.uri}
+    })
+
 model = new Model()
 
 # this sort of works to stop clicks in <input> from following the
--- a/light9/subserver/index.jade	Thu Jun 13 00:46:52 2013 +0000
+++ b/light9/subserver/index.jade	Thu Jun 13 01:31:16 2013 +0000
@@ -19,7 +19,11 @@
           | Label
           input(type="text", data-bind="value: label")
         div
-          img()
+          img(data-bind="attr: {src: img}")
+        div
+          button(data-bind="click: $root.snapshot")
+            New snapshot
+            
       // /ko
 
     #status
--- a/pydeps	Thu Jun 13 00:46:52 2013 +0000
+++ b/pydeps	Thu Jun 13 01:31:16 2013 +0000
@@ -14,3 +14,4 @@
 git+git://github.com/drewp/python-coloredlogs@9803112ddf7d4cd7dd001912ad1aa482fb8383f6
 genshi==0.7
 pyjade==2.0.2
+python-dateutil==2.1
\ No newline at end of file