From: Wilfried Göesgens Date: Sun, 28 Sep 2008 12:17:30 +0000 (+0000) Subject: * migrate userlist to templating. X-Git-Tag: v7.86~1901 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=b52cf7ba50bb7d2e47c284653ce3d779f9ee77d5 * migrate userlist to templating. --- diff --git a/webcit/static/t/box_edituser_select.html b/webcit/static/t/box_edituser_select.html new file mode 100644 index 000000000..193037ecd --- /dev/null +++ b/webcit/static/t/box_edituser_select.html @@ -0,0 +1,15 @@ + +

+ +
+
+ +
+ +"> +"> +" + onClick="return confirm('');"> +
diff --git a/webcit/static/t/edituser_add.html b/webcit/static/t/edituser_add.html new file mode 100644 index 000000000..d4ffa9103 --- /dev/null +++ b/webcit/static/t/edituser_add.html @@ -0,0 +1,8 @@ + +

+
+ + +
+ "> +
diff --git a/webcit/static/t/edituser_select.html b/webcit/static/t/edituser_select.html new file mode 100644 index 000000000..2282d490a --- /dev/null +++ b/webcit/static/t/edituser_select.html @@ -0,0 +1,25 @@ + + + + + +
+
+ + + + + + + +
+ + + +
+ +
+ diff --git a/webcit/static/t/section_userlist_select.html b/webcit/static/t/section_userlist_select.html new file mode 100644 index 000000000..56612fca5 --- /dev/null +++ b/webcit/static/t/section_userlist_select.html @@ -0,0 +1 @@ + diff --git a/webcit/static/t/subject_box_edituser_select.html b/webcit/static/t/subject_box_edituser_select.html new file mode 100644 index 000000000..722bc93ef --- /dev/null +++ b/webcit/static/t/subject_box_edituser_select.html @@ -0,0 +1 @@ + diff --git a/webcit/static/t/subject_edituser_add.html b/webcit/static/t/subject_edituser_add.html new file mode 100644 index 000000000..703521496 --- /dev/null +++ b/webcit/static/t/subject_edituser_add.html @@ -0,0 +1 @@ + diff --git a/webcit/subst.c b/webcit/subst.c index 2d9b27086..d5297d14c 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -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, diff --git a/webcit/useredit.c b/webcit/useredit.c index f392d3997..19cbbf001 100644 --- a/webcit/useredit.c +++ b/webcit/useredit.c @@ -18,9 +18,15 @@ * \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("
\n"); @@ -91,10 +97,296 @@ void select_user_to_edit(char *message, char *preselect) wprintf("\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); } /*@}*/ diff --git a/webcit/webcit.h b/webcit/webcit.h index 468d1ae79..9ba816a3c 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -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,