Fixed search presentations by adding a PREPARE somthing method. too tired to explain...
authorDrew Crampsie <drewc@tech.coop>
Mon, 4 Jul 2005 11:20:24 +0000 (04:20 -0700)
committerDrew Crampsie <drewc@tech.coop>
Mon, 4 Jul 2005 11:20:24 +0000 (04:20 -0700)
darcs-hash:20050704112024-5417e-5f30f5ac9d0b39e9ccae4c2c0150314efceb24a0.gz

src/backend/clsql.lisp
src/meta-model.lisp
src/mewa/presentations.lisp
src/mewa/slot-presentations.lisp

index a6e9c68..e4e8353 100644 (file)
@@ -269,6 +269,10 @@ creates a clsql view-class"
        ,(append table-slots join-slots)
        ,@(when model-name (list :model-name model-name))))))
 
+
+(defmethod prepare-slot-name-for-select ((i standard-db-object) slot-name)
+  (clsql:sql-expression :attribute slot-name))
+
 (def-compare-expr standard-db-object expr-= sql-=)
 (def-compare-expr standard-db-object expr-< sql-<)        
 (def-compare-expr standard-db-object expr-> sql->)
index 2fbe4b5..598debf 100644 (file)
@@ -212,14 +212,18 @@ most of the below functions expect this method to exist"
 (defgeneric select-instances (instance &rest args)
   (:documentation "Select instances in backend dependent way"))
 
+(defgeneric prepare-slot-name-for-select (instance slot-name)
+  (:method (i s) s))
+
 (defmacro def-compare-expr (instance-type name expr &key value-format)
   `(defmethod ,name ((instance ,instance-type) slot-name value)
      (declare (ignore instance))
-     (,expr slot-name ,(typecase value-format
+     (,expr (prepare-slot-name-for-select instance slot-name) ,(typecase value-format
                                  (null 'value)
                                  (string `(format nil ,value-format value))
                                  (t `(,value-format value))))))
 
+
 (defmacro def-logical-expr (instance-type name expr)
   `(defmethod ,name ((instance ,instance-type) &rest args)
      (declare (ignore instance))
index 39a6647..396b4d0 100644 (file)
 
 (defmethod ok ((self mewa-presentation-search) &optional arg)
   (declare (ignore arg))
-  (setf (ucw::list-presentation self) (valid-instances self))
+  (setf (ucw::instances (ucw::list-presentation self)) (valid-instances self))
   (setf (display-results-p self) t))
 
 (defmethod render-on ((res response) (self mewa-presentation-search))
index 4e69bd8..571e9dd 100644 (file)
@@ -106,7 +106,7 @@ When T, only the default value for primary keys and the joins are updated."))
                             (mewa:make-presentation finstance 
                                                     :type :listing)))))
       (setf (slot-value instance (slot-name slot)) (slot-value new-instance foreign-slot-name))
-      (meta-model:sync-instance instance :fill-gaps-only t))))
+      (meta-model:sync-instance instance :fill-gaps-only-p (fill-gaps-only-p self)))))
 
 (defaction create-record ((slot mewa-relation-slot-presentation) instance)
   (multiple-value-bindf (finstance foreign-slot-name)
@@ -148,18 +148,24 @@ When T, only the default value for primary keys and the joins are updated."))
 
 
 (defmethod  present-slot :around ((slot foreign-key-slot-presentation) instance)
-  (setf (foreign-instance slot) (when (presentation-slot-value slot instance) (meta-model:explode-foreign-key instance (slot-name slot))))
-  (flet ((render () (call-next-method)))
-    (cond 
-      ((editablep slot)
-       (render)
-       (<ucw:submit :action  (search-records slot instance) :value "Search" :style "display:inline")
-       (<ucw:submit :action  (create-record slot instance) :value "Add New" :style "display:inline"))
-      ((linkedp slot)
-       (<ucw:a :action (view-instance slot (foreign-instance slot)) 
-              (render)))
-      (t       
-       (render)))))
+  (setf (foreign-instance slot) 
+       (when (presentation-slot-value slot instance) 
+         (meta-model:explode-foreign-key instance (slot-name slot))))
+  
+  (flet ((render () (when (foreign-instance slot)(call-next-method))))
+    (if (slot-boundp slot 'place)
+        (cond 
+          ((editablep slot)
+           (render)
+           (<ucw:submit :action  (search-records slot instance) :value "Search" :style "display:inline")
+           (<ucw:submit :action  (create-record slot instance) :value "Add New" :style "display:inline"))
+          ((linkedp slot)
+           (<ucw:a :action (view-instance slot (foreign-instance slot)) 
+                   (render)))
+          (t       
+           (render)))
+       ;; presentation is used only for rendering
+        (render))))
 
 ;;;; HAS MANY 
 (defslot-presentation has-many-slot-presentation (mewa-relation-slot-presentation)
@@ -178,9 +184,10 @@ When T, only the default value for primary keys and the joins are updated."))
       (meta-model:sync-instance instance))))
 
 (defmethod present-slot ((slot has-many-slot-presentation) instance)
-  (<ucw:submit :action (add-to-has-many slot instance) :value (add-new-label slot))
-  (let ((i (get-foreign-instances slot instance))
-       (linkedp (linkedp slot)))
+  (when (slot-boundp slot 'place)
+    (<ucw:submit :action (add-to-has-many slot instance) :value (add-new-label slot)))
+  (let ((i (get-foreign-instances slot instance)))
+       
     (<:ul 
      (dolist (s i)
        (let ((s s))
@@ -219,13 +226,16 @@ When T, only the default value for primary keys and the joins are updated."))
 
 (defmethod present-slot ((slot has-very-many-slot-presentation) instance)
   ;;(<:as-html "isance: " instance)
-  (<ucw:a :action (list-prev slot) (<:as-html "<<"))
-  (let ((self (parent slot)))
-    (<ucw:a :action (call-component self (mewa:make-presentation (car (slot-value instance (slot-name slot))) :type :listing :initargs (list :instances (instances slot))))
-           (<:as-html  (label slot) (format nil " ~a-~a " (current slot) (+ (current slot) (number-to-display slot))))))
-  (<ucw:a :action (list-next slot) (<:as-html ">>"))
-  (call-next-method)
-  (<:as-html "total :" (len slot))) 
+  (if (slot-boundp slot 'place)
+      (progn
+        (<ucw:a :action (list-prev slot) (<:as-html "<<"))
+        (let ((self (parent slot)))
+          (<ucw:a :action (call-component self (mewa:make-presentation (car (slot-value instance (slot-name slot))) :type :listing :initargs (list :instances (instances slot))))
+               (<:as-html  (label slot) (format nil " ~a-~a " (current slot) (+ (current slot) (number-to-display slot))))))
+        (<ucw:a :action (list-next slot) (<:as-html ">>"))
+        (call-next-method)
+        (<:as-html "total :" (len slot)))
+      (call-next-method)))
 
 (defmethod get-foreign-instances :around ((slot has-very-many-slot-presentation) instance)
   (let ((f (call-next-method)))