diff demo/more/conference.ur @ 1012:32dbb5636ae7

Setting and updating your own review
author Adam Chlipala <adamc@hcoop.net>
date Thu, 22 Oct 2009 16:25:31 -0400
parents 16f7cb0891b6
children e47303e5d73d
line wrap: on
line diff
--- a/demo/more/conference.ur	Thu Oct 22 16:15:56 2009 -0400
+++ b/demo/more/conference.ur	Thu Oct 22 16:25:31 2009 -0400
@@ -250,55 +250,73 @@
         </body></xml>
 
     and one id =
-        me <- getLogin;
-        checkPaper id;
-        ro <- oneOrNoRows (SELECT paper.{{map fst M.paper}}, octet_length(paper.Document) AS N
-                           FROM paper
-                           WHERE paper.Id = {[id]});
-        authors <- queryX (SELECT user.Nam
-                           FROM authorship
-                             JOIN user ON authorship.User = user.Id
-                           WHERE authorship.Paper = {[id]})
-                   (fn r => <xml><li>{[r.User.Nam]}</li></xml>);
-        myReview <- oneOrNoRows1 (SELECT review.{{map fst M.review}}
-                                  FROM review
-                                  WHERE review.User = {[me.Id]}
-                                    AND review.Paper = {[id]});
-        case ro of
-            None => error <xml>Paper not found!</xml>
-          | Some r => return <xml><body>
-            <h1>Paper #{[id]}</h1>
+        let
+            fun newReview r =
+                me <- getLogin;
+                checkPaper id;
+                dml (insert review ({Paper = sql_inject id, User = sql_inject me.Id}
+                                        ++ ensql M.review r M.reviewFolder));
+                one id
 
-            <h3>Authors:</h3>
-            <ul>
-              {authors}
-            </ul>
+            fun saveReview r =
+                me <- getLogin;
+                checkPaper id;
+                dml (update [map fst M.review] ! (ensql M.review r M.reviewFolder)
+                            review (WHERE T.Paper = {[id]} AND T.User = {[me.Id]}));
+                one id
+        in
+            me <- getLogin;
+            checkPaper id;
+            ro <- oneOrNoRows (SELECT paper.{{map fst M.paper}}, octet_length(paper.Document) AS N
+                               FROM paper
+                               WHERE paper.Id = {[id]});
+            authors <- queryX (SELECT user.Nam
+                               FROM authorship
+                                 JOIN user ON authorship.User = user.Id
+                               WHERE authorship.Paper = {[id]})
+                              (fn r => <xml><li>{[r.User.Nam]}</li></xml>);
+            myReview <- oneOrNoRows1 (SELECT review.{{map fst M.review}}
+                                      FROM review
+                                      WHERE review.User = {[me.Id]}
+                                        AND review.Paper = {[id]});
+            case ro of
+                None => error <xml>Paper not found!</xml>
+              | Some r => return <xml><body>
+                <h1>Paper #{[id]}</h1>
 
-            {allContent M.paper r.Paper M.paperFolder}<br/>
+                <h3>Authors:</h3>
+                <ul>
+                  {authors}
+                </ul>
 
-            {if r.N = 0 then
-                 <xml><div>No paper uploaded yet.</div></xml>
-             else
-                 <xml><a link={download id}>Download paper</a> ({[r.N]} bytes)</xml>}
+                {allContent M.paper r.Paper M.paperFolder}<br/>
 
-            <hr/>
+                {if r.N = 0 then
+                     <xml><div>No paper uploaded yet.</div></xml>
+                 else
+                     <xml><a link={download id}>Download paper</a> ({[r.N]} bytes)</xml>}
 
-            {case myReview of
-                 None => <xml>
-                   <h2>Add Your Review</h2>
-           
-                   <form>
-                     {allWidgets M.review M.reviewFolder}
-                   </form>
-                 </xml>
-               | Some myReview => <xml>
-                 <h2>Edit Your Review</h2>
+                <hr/>
 
-                 <form>
-                   {allPopulated M.review myReview M.reviewFolder}
-                 </form>
-               </xml>}
-          </body></xml>
+                {case myReview of
+                     None => <xml>
+                       <h2>Add Your Review</h2>
+                       
+                       <form>
+                         {allWidgets M.review M.reviewFolder}
+                         <submit value="Add" action={newReview}/>
+                       </form>
+                     </xml>
+                   | Some myReview => <xml>
+                     <h2>Edit Your Review</h2>
+
+                     <form>
+                       {allPopulated M.review myReview M.reviewFolder}
+                       <submit value="Save" action={saveReview}/>
+                     </form>
+                   </xml>}
+              </body></xml>
+        end
 
     and download id =
         checkPaper id;