* migrate userlist to templating.
authorWilfried Göesgens <willi@citadel.org>
Sun, 28 Sep 2008 12:17:30 +0000 (12:17 +0000)
committerWilfried Göesgens <willi@citadel.org>
Sun, 28 Sep 2008 12:17:30 +0000 (12:17 +0000)
webcit/static/t/box_edituser_select.html [new file with mode: 0644]
webcit/static/t/edituser_add.html [new file with mode: 0644]
webcit/static/t/edituser_select.html [new file with mode: 0644]
webcit/static/t/section_userlist_select.html [new file with mode: 0644]
webcit/static/t/subject_box_edituser_select.html [new file with mode: 0644]
webcit/static/t/subject_edituser_add.html [new file with mode: 0644]
webcit/subst.c
webcit/useredit.c
webcit/webcit.h

diff --git a/webcit/static/t/box_edituser_select.html b/webcit/static/t/box_edituser_select.html
new file mode 100644 (file)
index 0000000..193037e
--- /dev/null
@@ -0,0 +1,15 @@
+<?_("To edit an existing user account, select the user name from the list and click 'Edit'.")>
+<br /><br />
+<center>
+  <form method="POST" action="display_edituser">
+   <input type="hidden" name="nonce" value="<?NONCE>">
+   <select name="username" size=10 style="width:100%%">
+<?ITERATE("USERLIST", "section_userlist_select")>
+</select><br />
+<input type="submit" name="edit_config_button" value="<?_("Edit configuration")>">
+<input type="submit" name="edit_abe_button" value="<?_("Edit address book entry")>">
+<input type="submit" name="delete_button" value="<?_("Delete user")>"
+       onClick="return confirm('<?_("Delete this user?")>');">
+</form></center>
diff --git a/webcit/static/t/edituser_add.html b/webcit/static/t/edituser_add.html
new file mode 100644 (file)
index 0000000..d4ffa91
--- /dev/null
@@ -0,0 +1,8 @@
+<?_("To create a new user account, enter the desired user name in the box below and click 'Create'.")>
+<br /><br />
+ <center><form method="POST" action="create_user">
+ <input type="hidden" name="nonce" value="<?NONCE>">
+   <?_("New user: ")>
+  <input type="text" name="username"><br />
+  <input type="submit" name="create_button" value="<?_("Create")>">
+</form></center>
diff --git a/webcit/static/t/edituser_select.html b/webcit/static/t/edituser_select.html
new file mode 100644 (file)
index 0000000..2282d49
--- /dev/null
@@ -0,0 +1,25 @@
+<?=("head")>
+<?=("important_msg")>
+<?ICONBAR>
+<div id="banner">
+  <img src="static/usermanag_48x.gif">
+  <h1><??("COND:AIDE", 1)><?_("Edit or delete users")><??("X", 1)></h1>
+</div>
+
+<div id="content" class="service"> 
+<div class="fix_scrollbar_bug">
+<?!("COND:AIDE", 1)><?_("You need to be aide to view this.")><?!("X", 1)>
+<??("COND:AIDE", 2)>
+<!--- TODO if (message != NULL) message); -->
+
+<table border=0 cellspacing=10>
+<tr valign=top><td>
+  <?DOBOXED("edituser_add", "subject_edituser_add")>
+</td><td>
+ <?DOBOXED("box_edituser_select", "subject_box_edituser_select")>
+</td></tr>
+</table>
+<??("X", 2)>
+</div>
+<?=("trailing")>
diff --git a/webcit/static/t/section_userlist_select.html b/webcit/static/t/section_userlist_select.html
new file mode 100644 (file)
index 0000000..56612fc
--- /dev/null
@@ -0,0 +1 @@
+<option "<?USERLIST:USERNAME>"<?%("COND:USERNAME", 1, 1, 1, " selected", "")>><?USERLIST:USERNAME("X")></option>
diff --git a/webcit/static/t/subject_box_edituser_select.html b/webcit/static/t/subject_box_edituser_select.html
new file mode 100644 (file)
index 0000000..722bc93
--- /dev/null
@@ -0,0 +1 @@
+<?_("Edit or Delete users")>
diff --git a/webcit/static/t/subject_edituser_add.html b/webcit/static/t/subject_edituser_add.html
new file mode 100644 (file)
index 0000000..7035214
--- /dev/null
@@ -0,0 +1 @@
+<?_("Add users")>
index 2d9b27086d3e65bf76524c6829cb150c95209789..d5297d14c89f88a1c12b37ffff965adcae5ddf36 100644 (file)
@@ -1379,7 +1379,8 @@ void tmpl_iterate_subtmpl(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, vo
                         (oddeven) ? "odd" : "even");
                svprintf(HKEY("ITERATE:KEY"), WCS_STRING, "%s", Key);
 
-               It->DoSubTemplate(SubBuf, vContext, Tokens);
+               if (It->DoSubTemplate != NULL)
+                       It->DoSubTemplate(SubBuf, vContext, Tokens);
                DoTemplate(Tokens->Params[1]->Start,
                           Tokens->Params[1]->len,
                           vContext, SubBuf, 
index f392d3997a420c5ec8f0a46f1ead58a7344575b2..19cbbf001dd7276e05c5f6c30f0fab8532666253 100644 (file)
  * \param preselect which user should be selected in the browser
  */
 void select_user_to_edit(char *message, char *preselect)
-{
+{/*
        char buf[SIZ];
        char username[SIZ];
+ */
+       output_headers(1, 0, 0, 0, 1, 0);
+       do_template("edituser_select", NULL);
+        end_burst();
+
+/*
 
        output_headers(1, 1, 2, 0, 0, 0);
        wprintf("<div id=\"banner\">\n");
@@ -91,10 +97,296 @@ void select_user_to_edit(char *message, char *preselect)
        wprintf("</td></tr></table>\n");
 
        wDumpContent(1);
+*/
+}
+
+
+typedef struct _UserListEntry {
+       StrBuf *UserName;
+       int AccessLevel;
+       int UID;
+       StrBuf *LastLogon;
+       time_t LastLogonT;
+       int nLogons;
+       int nPosts;
+       StrBuf *Passvoid;
+} UserListEntry;
+
+void DeleteUserListEntry(void *vUserList)
+{
+       UserListEntry *ul = (UserListEntry*) vUserList;
+       FreeStrBuf(&ul->UserName);
+       FreeStrBuf(&ul->LastLogon);
+       FreeStrBuf(&ul->Passvoid);
+       free(ul);
+}
+
+UserListEntry* NewUserListEntry(StrBuf *SerializedUserList)
+{
+       UserListEntry *ul;
+
+       if (StrLength(SerializedUserList) < 8) 
+               return NULL;
+
+       ul = (UserListEntry*) malloc(sizeof(UserListEntry));
+       ul->UserName = NewStrBuf();
+       ul->LastLogon = NewStrBuf();
+       ul->Passvoid = NewStrBuf();
+
+       StrBufExtract_token(ul->UserName, SerializedUserList, 0, '|');
+       ul->AccessLevel = StrBufExtract_int(SerializedUserList, 1, '|');
+       ul->UID = StrBufExtract_int(SerializedUserList, 2, '|');
+       StrBufExtract_token(ul->LastLogon, SerializedUserList, 3, '|');
+       /// TODO: ul->LastLogon -> ulLastLogonT
+       ul->nLogons = StrBufExtract_int(SerializedUserList, 4, '|');
+       ul->nPosts = StrBufExtract_int(SerializedUserList, 5, '|');
+       StrBufExtract_token(ul->Passvoid, SerializedUserList, 6, '|');
+
+       return ul;
+}
+
+/*
+ * Sort by Username
+ */
+int CompareUserListName(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return strcmp(ChrPtr(u1->UserName), ChrPtr(u2->UserName));
+}
+int CompareUserListNameRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+       return strcmp(ChrPtr(u2->UserName), ChrPtr(u1->UserName));
+}
+
+/*
+ * Sort by AccessLevel
+ */
+int CompareAccessLevel(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u1->AccessLevel > u2->AccessLevel);
+}
+int CompareAccessLevelRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->AccessLevel > u1->AccessLevel);
+}
+
+
+/*
+ * Sort by UID
+ */
+int CompareUID(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u1->UID > u2->UID);
+}
+int CompareUIDRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->UID > u1->UID);
+}
+
+/*
+ * Sort By Date /// TODO!
+ */
+int CompareLastLogon(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u1->LastLogonT > u2->LastLogonT);
+}
+int CompareLastLogonRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->LastLogonT > u1->LastLogonT);
+}
+
+/*
+ * Sort By Number of Logons
+ */
+int ComparenLogons(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u1->nLogons > u2->nLogons);
+}
+int ComparenLogonsRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->nLogons > u1->nLogons);
+}
+
+/*
+ * Sort By Number of Posts
+ */
+int ComparenPosts(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u1->nPosts > u2->nPosts);
+}
+int ComparenPostsRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) vUser1;
+       UserListEntry *u2 = (UserListEntry*) vUser2;
+
+       return (u2->nPosts > u1->nPosts);
+}
+
+
+HashList *iterate_load_userlist(WCTemplateToken *Token)
+{
+       HashList *Hash;
+       char buf[SIZ];
+       StrBuf *Buf;
+       UserListEntry* ul;
+       char nnn[64];
+       int nUsed;
+       int Order;
+       int len;
+       
+        serv_puts("LIST");
+        serv_getln(buf, sizeof buf);
+        if (buf[0] == '1') {
+               Hash = NewHash(1, NULL);
+
+               Buf = NewStrBuf();
+               while ((len = StrBuf_ServGetln(Buf),
+                       strcmp(ChrPtr(Buf), "000"))) {
+                       ul = NewUserListEntry(Buf);
+                       if (ul == NULL)
+                               continue;
+                       nUsed = GetCount(Hash);
+                       nUsed = snprintf(nnn, sizeof(nnn), "%d", nUsed+1);
+                       Put(Hash, nnn, nUsed, ul, DeleteUserListEntry); 
+               }
+               FreeStrBuf(&Buf);
+               Order = ibstr("SortOrder");
+               switch (ibstr("SortBy")){
+               case 1: /*NAME*/
+                       SortByPayload(Hash, (Order)? 
+                                     CompareUserListName:
+                                     CompareUserListNameRev);
+                       break;
+               case 2: /*AccessLevel*/
+                       SortByPayload(Hash, (Order)? 
+                                     CompareAccessLevel:
+                                     CompareAccessLevelRev);
+                       break;
+               case 3: /*nLogons*/
+                       SortByPayload(Hash, (Order)? 
+                                     ComparenLogons:
+                                     ComparenLogonsRev);
+                       break;
+               case 4: /*UID*/
+                       SortByPayload(Hash, (Order)? 
+                                     CompareUID:
+                                     CompareUIDRev);
+                       break;
+               case 5: /*LastLogon*/
+                       SortByPayload(Hash, (Order)? 
+                                     CompareLastLogon:
+                                     CompareLastLogonRev);
+                       break;
+               case 6: /* nLogons */
+                       SortByPayload(Hash, (Order)? 
+                                     ComparenLogons:
+                                     ComparenLogonsRev);
+                       break;
+               case 7: /* Posts */
+                       SortByPayload(Hash, (Order)? 
+                                     ComparenPosts:
+                                     ComparenPostsRev);
+                       break;
+               }
+               return Hash;
+        }
+       return NULL;
 }
 
 
+void tmplput_USERLIST_UserName(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
+{
+       UserListEntry *ul = (UserListEntry*) Context;
+/// TODO: X
+       StrBufAppendBuf(Target, ul->UserName, 0);
+}
 
+void tmplput_USERLIST_AccessLevelNo(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
+{
+       UserListEntry *ul = (UserListEntry*) Context;
+
+       StrBufAppendPrintf(Target, "%d", ul->AccessLevel, 0);
+}
+
+void tmplput_USERLIST_AccessLevelStr(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
+{
+       UserListEntry *ul = (UserListEntry*) Context;
+       
+       StrBufAppendBufPlain(Target, _(axdefs[ul->AccessLevel]), -1, 0);
+}
+
+void tmplput_USERLIST_UID(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
+{
+       UserListEntry *ul = (UserListEntry*) Context;
+
+       StrBufAppendPrintf(Target, "%d", ul->UID, 0);
+}
+
+void tmplput_USERLIST_LastLogon(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
+{
+       UserListEntry *ul = (UserListEntry*) Context;
+
+       StrBufAppendBuf(Target, ul->LastLogon, 0);
+}
+
+void tmplput_USERLIST_nLogons(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
+{
+       UserListEntry *ul = (UserListEntry*) Context;
+
+       StrBufAppendPrintf(Target, "%d", ul->nLogons, 0);
+}
+
+void tmplput_USERLIST_nPosts(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType)
+{
+       UserListEntry *ul = (UserListEntry*) Context;
+
+       StrBufAppendPrintf(Target, "%d", ul->nPosts, 0);
+}
+
+int ConditionalUser(WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+       UserListEntry *ul = (UserListEntry*) Context;
+       if (havebstr("usernum")) {
+               return ibstr("usernum") == ul->UID;
+       }
+       else if (havebstr("username")) {
+               return strcmp(bstr("username"), ChrPtr(ul->UserName)) == 0;
+       }
+       else 
+               return 0;
+}
 /**
  * \brief Locate the message number of a user's vCard in the current room
  * \param username the plaintext name of the user
@@ -540,5 +832,16 @@ InitModule_USEREDIT
        WebcitAddUrlHandler(HKEY("display_edituser"), _display_edituser, 0);
        WebcitAddUrlHandler(HKEY("edituser"), edituser, 0);
        WebcitAddUrlHandler(HKEY("create_user"), create_user, 0);
+
+       RegisterNamespace("USERLIST:USERNAME",  0, 1, tmplput_USERLIST_UserName, CTX_USERLIST);
+       RegisterNamespace("USERLIST:ACCLVLNO",  0, 0, tmplput_USERLIST_AccessLevelNo, CTX_USERLIST);
+       RegisterNamespace("USERLIST:ACCLVLSTR", 0, 0, tmplput_USERLIST_AccessLevelStr, CTX_USERLIST);
+       RegisterNamespace("USERLIST:UID",       0, 0, tmplput_USERLIST_UID, CTX_USERLIST);
+       RegisterNamespace("USERLIST:LASTLOGON", 0, 0, tmplput_USERLIST_LastLogon, CTX_USERLIST);
+       RegisterNamespace("USERLIST:NLOGONS",   0, 0, tmplput_USERLIST_nLogons, CTX_USERLIST);
+       RegisterNamespace("USERLIST:NPOSTS",    0, 0, tmplput_USERLIST_nPosts, CTX_USERLIST);
+
+       RegisterConditional(HKEY("COND:USERNAME"), 0, ConditionalUser, CTX_USERLIST);
+       RegisterIterator("USERLIST", 0, NULL, iterate_load_userlist, NULL, DeleteHash, CTX_USERLIST);
 }
 /*@}*/
index 468d1ae79e1b96ef722222e34ff1952363006214..9ba816a3c5c43c1e33aa73eeb144b60069849d28 100644 (file)
@@ -305,7 +305,7 @@ typedef struct _wcsubst {
 #define CTX_WHO 5
 #define CTX_PREF 6
 #define CTX_NODECONF 7
-
+#define CTX_USERLIST 8
 
 void RegisterNS(const char *NSName, long len, 
                int nMinArgs,