[bknr-cvs] hans changed trunk/projects/bos/
BKNR Commits
bknr at bknr.net
Thu Nov 27 09:37:31 UTC 2008
Revision: 4085
Author: hans
URL: http://bknr.net/trac/changeset/4085
Add JSON encoding for POIs
U trunk/projects/bos/m2/bos.m2.asd
U trunk/projects/bos/m2/poi.lisp
U trunk/projects/bos/web/poi-handlers.lisp
Modified: trunk/projects/bos/m2/bos.m2.asd
===================================================================
--- trunk/projects/bos/m2/bos.m2.asd 2008-11-27 09:36:39 UTC (rev 4084)
+++ trunk/projects/bos/m2/bos.m2.asd 2008-11-27 09:37:31 UTC (rev 4085)
@@ -5,7 +5,8 @@
(asdf:defsystem :bos.m2
:depends-on (:bknr.datastore :bknr.modules :cl-smtp :cl-mime
:kmrcl :iterate :arnesi
- :cl-pdf :cl-pdf-parser :screamer :cl-fad)
+ :cl-pdf :cl-pdf-parser :screamer :cl-fad
+ :yason)
:components ((:file "packages")
(:file "geo-utm" :depends-on ("packages"))
(:file "geometry" :depends-on ("packages"))
Modified: trunk/projects/bos/m2/poi.lisp
===================================================================
--- trunk/projects/bos/m2/poi.lisp 2008-11-27 09:36:39 UTC (rev 4084)
+++ trunk/projects/bos/m2/poi.lisp 2008-11-27 09:37:31 UTC (rev 4085)
@@ -84,7 +84,9 @@
;;; poi-movie
(defpersistent-class poi-movie (poi-medium)
((url :accessor poi-movie-url :initarg :url :initform nil)
- (created :initform (get-universal-time) :reader poi-medium-creation-time)))
+ (created :initform (error "need :created initarg when creating poi-medium")
+ :initarg :created
+ :reader poi-medium-creation-time)))
;;; poi
(defpersistent-class poi (textual-attributes-mixin)
@@ -294,3 +296,55 @@
(warn "~s has a url of ~s" movie (poi-movie-url movie))))))
(mapc #'poi-sanity-check (class-instances 'poi))
(values)))
+
+(defvar *language* "en"
+ "Current language for JSON encoding")
+
+(defmethod json:encode ((object symbol) &optional stream)
+ (json:encode (string-downcase (symbol-name object)) stream))
+
+(defgeneric json-encode (object)
+ (:method-combination progn))
+
+(defmethod json-encode progn ((object store-object))
+ (json:encode-object-element "id" (store-object-id object)))
+
+(defmethod json-encode progn ((blob blob))
+ (json:encode-object-elements
+ "type" (blob-type blob)
+ "timestamp" (format-date-time (blob-timestamp blob) :mail-style t)))
+
+(defmethod json-encode progn ((image store-image))
+ (json:encode-object-elements
+ "name" (store-image-name image)
+ "width" (store-image-width image)
+ "height" (store-image-height image)))
+
+(defmethod json-encode progn ((object bos.m2::textual-attributes-mixin))
+ (dolist (field '(title subtitle description))
+ (let ((string (slot-string object field *language*)))
+ (unless (equal "" string)
+ (json:encode-object-element field string)))))
+
+(defmethod json-encode progn ((medium poi-medium))
+ (json:encode-object-element
+ "mediumType"
+ (cl-ppcre:regex-replace "^poi-" (string-downcase (class-name (class-of medium))) "")))
+
+(defmethod json-encode progn ((movie poi-movie))
+ (json:encode-object-elements
+ "url" (poi-movie-url movie)
+ "timestamp" (format-date-time (poi-medium-creation-time movie) :mail-style t)))
+
+(defun pois-as-json (language)
+ (let ((*language* language))
+ (json:with-array ()
+ (dolist (poi (class-instances 'poi))
+ (when (poi-complete poi language)
+ (json:with-object ()
+ (json-encode poi)
+ (json:with-object-element ("media")
+ (json:with-array ()
+ (dolist (medium (poi-media poi))
+ (json:with-object ()
+ (json-encode medium)))))))))))
Modified: trunk/projects/bos/web/poi-handlers.lisp
===================================================================
--- trunk/projects/bos/web/poi-handlers.lisp 2008-11-27 09:36:39 UTC (rev 4084)
+++ trunk/projects/bos/web/poi-handlers.lisp 2008-11-27 09:37:31 UTC (rev 4085)
@@ -346,7 +346,7 @@
(flet ((make-new-medium (new-medium-type poi)
(case new-medium-type
(poi-movie
- (make-instance 'poi-movie :poi poi :url (query-param "url")))
+ (make-instance 'poi-movie :poi poi :url (query-param "url") :created (get-universal-time)))
(otherwise
(let ((upload (request-uploaded-file "image-file")))
(unless upload
@@ -683,3 +683,4 @@
(store-object-id (nth image-index (poi-sat-images poi)))
imageproc-arguments))
(error "image index ~a out of bounds for poi ~a" image-index poi)))))
+
More information about the Bknr-cvs
mailing list