[Gd-chatter] r10775 - in trunk/libraries: koala/sources/examples/wiki koala/www/wiki web-framework

hannes at gwydiondylan.org hannes at gwydiondylan.org
Sat Jun 3 02:26:52 CEST 2006


Author: hannes
Date: Sat Jun  3 02:26:49 2006
New Revision: 10775

Added:
   trunk/libraries/koala/sources/examples/wiki/admin.dylan   (contents, props changed)
   trunk/libraries/koala/www/wiki/admin.dsp   (contents, props changed)
Modified:
   trunk/libraries/koala/sources/examples/wiki/classes.dylan
   trunk/libraries/koala/sources/examples/wiki/library.dylan
   trunk/libraries/koala/sources/examples/wiki/parser.dylan
   trunk/libraries/koala/sources/examples/wiki/wiki.dylan
   trunk/libraries/koala/sources/examples/wiki/wiki.lid
   trunk/libraries/koala/www/wiki/index.dsp
   trunk/libraries/koala/www/wiki/recent.dsp
   trunk/libraries/web-framework/library.dylan
   trunk/libraries/web-framework/users.dylan
Log:
Bug: 7219
*some user management stuff
*it is now not integer-based, but symbol-based
*data structure <user> changed (slot access <integer> => <list>)

Added: trunk/libraries/koala/sources/examples/wiki/admin.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/koala/sources/examples/wiki/admin.dylan	Sat Jun  3 02:26:49 2006
@@ -0,0 +1,149 @@
+module: wiki
+
+define method respond-to-post
+ (page :: <admin-page>, request :: <request>, response :: <response>)
+  if (logged-in?(request))
+    let action = as(<symbol>, get-query-value("action"));
+    if (any?(method(x) action = x end, current-user().access))
+      select (action)
+        #"undo" => undo(get-query-value("title"));
+        #"rename" => rename-page(get-query-value("oldtitle"), get-query-value("title"));
+        #"remove" => remove-page(get-query-value("title"));
+        #"change-privileges" => change-privileges();
+      end;
+    end;
+  end;
+  respond-to-get(page, request, response);
+end;
+
+define method change-privileges ()
+  //this is evil and should be done better!
+  for (user in storage(<user>))
+    for (privilege in $privileges)
+      let was = any?(method(x) x = privilege end, user.access);
+      let should-be = get-query-value(concatenate(user.username, ":", as(<string>, privilege)));
+      if (should-be & ~was)
+        user.access := pair(privilege, user.access);
+      end;
+      if (~should-be & was)
+        remove!(user.access, privilege);
+      end;
+    end;
+  end;
+end;
+define method remove-page (title)
+  save(make(<wiki-page-diff>,
+            content: "",
+            comment: "removed",
+            page-version: 0,
+            wiki-page-content: storage(<wiki-page-content>)[title]));
+  remove-key!(storage(<wiki-page-content>), title);
+end;
+
+define method rename-page (old-title, new-title)
+  let page = find-page(old-title);
+  page.page-title := new-title;
+  storage(<wiki-page-content>)[new-title] := page;
+  remove-key!(storage(<wiki-page-content>), old-title);
+  //fix backlinks
+  let comment = concatenate("Page ", old-title, " has been moved to ", new-title, ".");
+  for (ele in find-backlinks(old-title))
+    let new-version = make(<wiki-page-diff>,
+                           page-version: ele.revisions.size + 1,
+                           content: substring-replace(latest-text(ele),
+                                                      concatenate("[[", old-title, "]]"),
+                                                      concatenate("[[", new-title, "]]")),
+                           comment: comment,
+                           wiki-page-content: ele);
+    add!(ele.revisions, new-version);
+  end;
+  save(make(<wiki-page-diff>,
+            content: "",
+            comment: comment,
+            page-version: page.revisions.size,
+            wiki-page-content: page));
+end;
+
+//undo last change
+define method undo (title)
+  let page = find-page(title);
+  if (page)
+    let previous-version = page.revisions[page.revisions.size - 2];
+    save-page(title, previous-version.content, comment: "reverted to previous version");
+  end;
+end;
+
+define body tag privilege in wiki
+  (page :: <wiki-page>, response :: <response>, do-body :: <function>)
+  (value :: <string>)
+  let user = *user* | current-user();
+  if (user & any?(method(x) x = as(<symbol>, value) end, user.access))
+    do-body()
+  end;
+end;
+
+
+define named-method privilege? in wiki
+  (page :: <wiki-page>, request :: <request>)
+  *user* & *privilege* & any?(method(x) x = *privilege* end, *user*.access)
+end;
+
+define constant $privileges = #(#"remove", #"rename", #"undo", #"change-privileges");
+
+define thread variable *privilege* = #f;
+
+define body tag show-privileges in wiki
+  (page :: <wiki-page>, response :: <response>, do-body :: <function>)
+  ()
+  for (privilege in $privileges)
+    dynamic-bind(*privilege* = privilege)
+      do-body()
+    end;
+  end;
+end;
+
+define thread variable *user* = #f;
+
+define tag show-privilege in wiki
+  (page :: <wiki-page>, response :: <response>)
+  ()
+  write(output-stream(response), as(<string>, *privilege*));
+end;
+
+
+define body tag show-users in wiki
+  (page :: <wiki-page>, response :: <response>, do-body :: <function>)
+  ()
+  for (user in storage(<user>))
+    dynamic-bind(*user* = user)
+      do-body()
+    end;
+  end;
+end;
+
+define tag show-user in wiki
+  (page :: <wiki-page>, response :: <response>)
+  ()
+  write(output-stream(response), *user*.username);
+end;
+
+define body tag show-recent-changes in wiki
+  (page :: <wiki-page>, response :: <response>, do-body :: <function>)
+  (count :: <string>)
+  let count = string-to-integer(count);
+  let done = make(<list>);
+  block(ret)
+    for (change in reverse(storage(<wiki-page-diff>)))
+      if (count = size(done))
+        ret()
+      end;
+      unless (any?(method(x) x = change.wiki-page-content end, done))
+        dynamic-bind(*change* = change)
+          do-body();
+          done := pair(change.wiki-page-content, done);
+        end;
+      end;
+    end;
+  end;
+end;
+

Modified: trunk/libraries/koala/sources/examples/wiki/classes.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/classes.dylan	(original)
+++ trunk/libraries/koala/sources/examples/wiki/classes.dylan	Sat Jun  3 02:26:49 2006
@@ -37,25 +37,6 @@
   res;
 end;
 
-define method remove-page (title)
-  remove-key!(storage(<wiki-page-content>), title);
-end;
-
-define method rename-page (old-title, new-title)
-  let page = find-page(old-title);
-  storage(<wiki-page-content>)[new-title] := page;
-  //XXX write a changelog entry
-  remove-page(old-title);
-end;
-
-//undo last change
-define method undo (title)
-  let page = find-page(title);
-  if (page)
-    let previous-version = page.revisions[page.revisions.size - 2];
-    save-page(title, previous-version, comment: "revert to previous version");
-  end;
-end;
 
 define method save-page (title, content, #key comment = "")
   let page = find-page(title);
@@ -75,3 +56,7 @@
   end;
 end;
 
+begin
+  main()
+end;
+

Modified: trunk/libraries/koala/sources/examples/wiki/library.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/library.dylan	(original)
+++ trunk/libraries/koala/sources/examples/wiki/library.dylan	Sat Jun  3 02:26:49 2006
@@ -18,6 +18,7 @@
   use web-framework;
   use xml-parser;
   use collection-extensions, import: { sequence-diff };
+  use string-extensions, import: { substring-search };
   //use meta;
   export wiki;
 end;
@@ -44,6 +45,7 @@
   use storage;
   use simple-xml;
   use sequence-diff;
+  use substring-search;
 end;
 
 

Modified: trunk/libraries/koala/sources/examples/wiki/parser.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/parser.dylan	(original)
+++ trunk/libraries/koala/sources/examples/wiki/parser.dylan	Sat Jun  3 02:26:49 2006
@@ -86,6 +86,7 @@
       // Find next line with no leading whitespace...
       let (epos, #rest xs) = regexp-position(markup, "\n\\S", start: start + 1) | markup.size;
       write(out, "<pre>");
+      //XXX escape <, > and & here!
       write(out, markup, start: start, end: epos);
       write(out, "</pre>");
       epos

Modified: trunk/libraries/koala/sources/examples/wiki/wiki.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/wiki.dylan	(original)
+++ trunk/libraries/koala/sources/examples/wiki/wiki.dylan	Sat Jun  3 02:26:49 2006
@@ -443,9 +443,10 @@
 define tag username in wiki
     (page :: <wiki-page>, response :: <response>)
     ()
-  let session = get-session(get-request(response));
-  session & write(output-stream(response),
-                  get-attribute(session, #"username"));
+  let user = current-user();
+  if (user)
+    write(output-stream(response), user.username);
+  end;
 end;  
 
 define body tag show-index in wiki
@@ -473,7 +474,7 @@
 define method respond-to-get
     (page :: <diff-page>, request :: <request>, response :: <response>)
   dynamic-bind (*title* = get-query-value("title"),
-                *version* = string-to-integer(get-query-value("version")),
+                *version* = ignore-errors(string-to-integer(get-query-value("version"))),
                 *other-version* = ignore-errors(string-to-integer(get-query-value("otherversion"))) | *version* - 1)
     next-method();
   end;
@@ -502,10 +503,11 @@
 define tag show-diff in wiki
   (page :: <diff-page>, response :: <response>)
   ()
-  let page = find-page(*title*);
-  let version = *version* - 1;
-  let otherversion = *other-version* - 1;
-  if (version < page.revisions.size & otherversion < page.revisions.size)
+  let page = *title* & find-page(*title*);
+  let version = *version* & *version* - 1;
+  let otherversion = *other-version* & *other-version* - 1;
+  //this needs to be refactored
+  if (version & otherversion & page & version < page.revisions.size & otherversion < page.revisions.size & otherversion >= -1)
     let target = split(page.revisions[version].content, separator: "\n");
     let source = if (otherversion = -1) #() else split(page.revisions[otherversion].content, separator: "\n") end;
     print-diffs(output-stream(response), sequence-diff(source, target), source, target);
@@ -521,7 +523,7 @@
 define thread variable *change* = #f;
 
 define body tag gen-recent-changes in wiki
-    (page :: <recent-changes-page>, response :: <response>, do-body :: <function>)
+    (page :: <wiki-page>, response :: <response>, do-body :: <function>)
     (count)
   let count = string-to-integer(get-query-value("count") | count);
   for (i from 0 below count,
@@ -555,45 +557,38 @@
 end;
 
 define tag show-change-timestamp in wiki
-    (page :: <recent-changes-page>, response :: <response>)
+    (page :: <wiki-page>, response :: <response>)
     ()
   write(output-stream(response), print-date(*change*.timestamp));
 end;
 
 define tag show-change-title in wiki
-    (page :: <recent-changes-page>, response :: <response>)
+    (page :: <wiki-page>, response :: <response>)
     ()
   write(output-stream(response), *change*.wiki-page-content.page-title);
 end;
 
 define tag show-change-version in wiki
-    (page :: <recent-changes-page>, response :: <response>)
+    (page :: <wiki-page>, response :: <response>)
     ()
   write(output-stream(response), integer-to-string(*change*.page-version));
 end;
 
 define tag show-change-author in wiki
-    (page :: <recent-changes-page>, response :: <response>)
+    (page :: <wiki-page>, response :: <response>)
     ()
   write(output-stream(response), *change*.author);
 end;
 
 define tag show-change-comment in wiki
-    (page :: <recent-changes-page>, response :: <response>)
+    (page :: <wiki-page>, response :: <response>)
     ()
   write(output-stream(response), *change*.comment);
 end;
 
-define responder worker-responder ("/worker")
- (request, response)
-  if (logged-in?(request) & current-user().access <= 23)
-    let action = as(<symbol>, get-query-value("action"));
-    select (action)
-      #"undo" => undo(get-query-value("title"));
-      #"rename" => rename-page(get-query-value("oldtitle"), get-query-value("title"));
-      #"remove" => remove-page(get-query-value("title"));
-    end;
-  end;
+define page admin-page (<wiki-page>)
+    (url: "/wiki/admin.dsp",
+    source: "wiki/admin.dsp")
 end;
 
 define function main
@@ -607,7 +602,4 @@
   start-server(config-file: config-file);
 end;
 
-begin
-  main()
-end;
 

Modified: trunk/libraries/koala/sources/examples/wiki/wiki.lid
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/wiki.lid	(original)
+++ trunk/libraries/koala/sources/examples/wiki/wiki.lid	Sat Jun  3 02:26:49 2006
@@ -2,4 +2,5 @@
 files: library
        parser
        wiki
+       admin
        classes

Added: trunk/libraries/koala/www/wiki/admin.dsp
==============================================================================
--- (empty file)
+++ trunk/libraries/koala/www/wiki/admin.dsp	Sat Jun  3 02:26:49 2006
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<%dsp:taglib name="wiki"/>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>Dylan Wiki: Administration</title>
+  <link  rel="stylesheet" href="/wiki/wiki.css"/>
+</head>
+
+<body>
+  <%dsp:include url="header.dsp"/>
+
+  <div id="form-notes">
+  <dsp:show-form-notes/>
+  </div>
+  <div id="content">
+    <h1>Dylan Wiki Administration</h1>
+    <wiki:privilege value="remove">
+      <form action="/wiki/admin.dsp" method="post">
+        <div id="edit">
+          <select name="title" size="10">
+            <wiki:show-index>
+              <option><wiki:show-title/></option>
+            </wiki:show-index>
+          </select>
+          <input type="hidden" name="action" value="remove">
+          <input type="submit" value="Remove">
+        </div>
+      </form>
+    </wiki:privilege>
+    <wiki:privilege value="rename">
+      <form action="/wiki/admin.dsp" method="post">
+        <div id="edit">
+          <select name="oldtitle" size="10">
+            <wiki:show-index>
+              <option><wiki:show-title/></option>
+            </wiki:show-index>
+          </select>
+          <input type="hidden" name="action" value="rename">
+          rename to <input type="text" name="title">
+          <input type="submit" value="Save"/>
+        </div>
+      </form>
+    </wiki:privilege>
+    <wiki:privilege value="undo">
+      <form action="/wiki/admin.dsp" method="post">
+        <div id="edit">
+          <select name="title" size="10">
+            <wiki:show-recent-changes count="20">
+              <option><wiki:show-change-title/></option>
+            </wiki:show-recent-changes>
+          </select>
+          <input type="hidden" name="action" value="undo">
+          <input type="submit" value="revert">
+        </div>
+      </form>
+    </wiki:privilege>
+    <wiki:privilege value="change-privileges">
+      <form action="/wiki/admin.dsp" method="post">
+        <div id="edit">
+          <table>
+            <tr>
+              <th>Username</th>
+              <wiki:show-privileges>
+                <th><wiki:show-privilege/></th>
+              </wiki:show-privileges>
+            </tr>
+            <wiki:show-users>
+              <tr>
+                <td><wiki:show-user/></td>
+                <wiki:show-privileges>
+                  <td><input type="checkbox"
+                             name="<wiki:show-user/>:<wiki:show-privilege/>"
+                             <dsp:when test="privilege?">checked="checked"</dsp:when>/>
+                  </td>
+                </wiki:show-privileges>
+              </tr>
+            </wiki:show-users>
+          </table>
+          <input type="hidden" name="action" value="change-privileges">
+          <input type="submit" value="Change privileges">
+        </div>
+      </form>
+    </wiki:privilege>
+  </div>
+  <%dsp:include url="footer.dsp"/>
+
+</body>
+</html>

Modified: trunk/libraries/koala/www/wiki/index.dsp
==============================================================================
--- trunk/libraries/koala/www/wiki/index.dsp	(original)
+++ trunk/libraries/koala/www/wiki/index.dsp	Sat Jun  3 02:26:49 2006
@@ -13,14 +13,6 @@
     <h1>Index</h1>
     <wiki:show-index>
 	<a href="/wiki/view.dsp?title=<wiki:show-title/>"><wiki:show-title/></a>
-      <dsp:when test="admin?">
-        <a href="/worker?title=<wiki:show-title/>&action=remove">remove</a>
-        <form action="/worker" method="get">
-          <input type="hidden" name="oldtitle" value="<wiki:show-title/>">
-          <input type="hidden" name="action" value="rename">
-          rename to <input type="text" name="title"><input type="submit" value="Save"/>
-        </form>
-      </dsp:when>
       <br/>
     </wiki:show-index>
   </div>

Modified: trunk/libraries/koala/www/wiki/recent.dsp
==============================================================================
--- trunk/libraries/koala/www/wiki/recent.dsp	(original)
+++ trunk/libraries/koala/www/wiki/recent.dsp	Sat Jun  3 02:26:49 2006
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <title>Dylan Wiki: Recent Changes</title>
-  <link  rel="stylesheet" href="/wiki/wiki.css"/>
+  <link rel="stylesheet" href="/wiki/wiki.css"/>
 </head>
 
 <body>
@@ -14,11 +14,7 @@
     <h3>Recent Changes</h3>
     <ul>
     <wiki:gen-recent-changes count="50">
-      <li><wiki:show-change-timestamp/> <a href="/wiki/view.dsp?title=<wiki:show-change-title/>&v=<wiki:show-change-version/>"><wiki:show-change-title/></a> version <wiki:show-change-version/> <a href="/wiki/diff.dsp?title=<wiki:show-change-title/>&version=<wiki:show-change-version/>">diff</a> by <wiki:show-change-author/> Comment <wiki:show-change-comment/>
-      <dsp:when test="admin?">
-        <a href="/worker?title=<wiki:show-change-title/>&action=undo">revert</a>
-      </dsp:when>
-      </li>
+      <li><wiki:show-change-timestamp/> <a href="/wiki/view.dsp?title=<wiki:show-change-title/>"><wiki:show-change-title/></a> version <wiki:show-change-version/> <a href="/wiki/diff.dsp?title=<wiki:show-change-title/>&version=<wiki:show-change-version/>">diff</a> by <wiki:show-change-author/> Comment <wiki:show-change-comment/></li>
     </wiki:gen-recent-changes>
     </ul>
   </div>

Modified: trunk/libraries/web-framework/library.dylan
==============================================================================
--- trunk/libraries/web-framework/library.dylan	(original)
+++ trunk/libraries/web-framework/library.dylan	Sat Jun  3 02:26:49 2006
@@ -95,8 +95,11 @@
   export <user>,
     username,
     password,
+    password-setter,
     email,
+    email-setter,
     access,
+    access-setter,
     current-user,
     login,
     logged-in?;

Modified: trunk/libraries/web-framework/users.dylan
==============================================================================
--- trunk/libraries/web-framework/users.dylan	(original)
+++ trunk/libraries/web-framework/users.dylan	Sat Jun  3 02:26:49 2006
@@ -5,7 +5,7 @@
   data username :: <string>;
   data password :: <string>;
   data email :: <string>;
-  data access :: <integer> = 999;
+  data access :: <list> = make(<list>);
 end;
 
 define method initialize (user :: <user>, #rest rest, #key, #all-keys)



More information about the chatter mailing list