#! /usr/bin/env tclsh # Create or modify a person with all information fields. # For persons with owner=NULL (from PUT), allow only adding and removing # from groups. source where.tcl set F(title) {"Title" 0 select {"" Mr. Mrs. Ms. Dr. Prof.}} set F(givenname) {"Given name" 1 text 30} set F(middlename) {"Middle name" 2 text 30} set F(surname) {"Surname" 3 text 30} set F(nickname) {"Nick name" 4 text 30} set F(jobtitle) {"Job title" 5 text 30} set F(organization) {"Organization" 6 text 30} set F(department) {"Department" 7 text 30} set F(url) {"URL" 8 text 30} set F(email) {"Email" 9 text 30} set F(email_alt) {"Email 2" 10 text 30} set F(birthday) {"Birthday" 11 text 10} set F(last_modified) {"Last modified" 12 skip 0} set F(photo) {"Photo" 13 text 30} set F(preferred) {"Preferred address" 14 select {""}} set F(sip) {"SIP" 15 text 30} set F(spouse) {"Spouse" 16 text 30} set F(access) {"Access" 17 select {private local public}} set F(bio) {"Bio" 18 textarea {5 72}} set F(id) {"ID" 99 skip 0} cgi_eval { set level [auth PersonEdit "Create or Modify Person" 2] cgi_body { import_default action # ID being edited import_default id # owner of address record import_default for # group identifier import_default gid # group name import_default groupname set canedit 1 set fieldlist [array names F] if {$id != ""} { sqlrecord "SELECT * FROM person WHERE id=$id AND (owner='$for' OR owner IS NULL)" V if {$V(id) == ""} { p "Person $id doesn't exist for owner $for." cgi_exit } if {$V(owner) == "" && $level < 3 && $V(email) != $for} { set canedit 0 } } else { # Add new entry; initialize the array with empty values. maparray {} $fieldlist V } if {$gid != ""} { set group [sql "SELECT owner,name FROM persongroup WHERE id=$gid"] maparray [lindex $group 0] {owner name} G if {$G(owner) != $for} { p "$for does not own group $gid." cgi_exit } } # After filling out form if {$canedit && $action == "Edit"} { set q [tableforminput F] if {$id != ""} { sql "UPDATE person SET [join $q ,] WHERE id=$id AND owner='$for'" h1 "Updated." } else { sql "INSERT person SET owner='$for',[join $q ,]" set id [sql "SELECT LAST_INSERT_ID()"] h1 "Inserted $id." } } elseif {$canedit && $action == "Delete"} { p "Are you sure you want to delete the address entry for $V(givenname) $V(surname)?" form PersonEdit { cgi_export id cgi_export for submit_button "action=Yes" submit_button "action=No" } set id "" } elseif {$canedit && $action == "Yes"} { if { $id != ""} { p "Person $V(givenname) $V(surname) deleted." sql "DELETE FROM person WHERE id=$id" } else { p "No id specified for deletion. Not deleted." cgi_exit } set id "" } elseif {$action == "AddToGroup"} { p "Added $V(givenname) $V(surname) to group $G(name)." sql "INSERT groupmember SET person=$id,persongroup=$gid" } elseif {$action == "DeleteFromGroup"} { p "Deleted $V(givenname) $V(surname) from group $G(name)." sql "DELETE FROM groupmember WHERE person=$id AND persongroup=$gid" } elseif {$action == "New Group"} { puts "Adding $V(givenname) $V(surname) to new group [bold $groupname]." cgi_br set gid [sql "SELECT id FROM persongroup WHERE name='[q $groupname]' AND owner='$for'"] if {$gid != ""} { puts "Group $groupname already existed." } else { sql "INSERT persongroup SET owner='$for',name='[q $groupname]'" } sql "INSERT groupmember SET person=$id,persongroup=LAST_INSERT_ID()" } # adding new addresses if {$canedit && $id != ""} { h2 "Addresses" # find address types currently in use set ac [sql "SELECT addressclass FROM address WHERE person=$id"] if {$ac != ""} { set F(preferred) [lreplace $F(preferred) 3 3 $ac] } else { set F(preferred) [lreplace $F(preferred) 2 2 skip] } cgi_bullet_list { foreach a $ac { cgi_li [url "Edit $a address" [cgi_cgi AddressEdit [cgi_set for $for] [cgi_set person $id] [cgi_set addressclass $a]]] } cgi_li [url "New address" [cgi_cgi AddressEdit [cgi_set for $for] [cgi_set person $id]]] } } # add and edit notes - can also be done for public records if {$id != ""} { h2 "Notes" if {$level < 3} { set notes [sql "SELECT id,DATE_FORMAT(last_modified,'%b %e, %Y %T'),owner FROM personnote WHERE person=$id AND owner='$for'"] } else { set notes [sql "SELECT id,DATE_FORMAT(last_modified,'%b %e, %Y %T'),owner FROM personnote WHERE person=$id"] } cgi_bullet_list { cgi_li [url "New note" [cgi_cgi PersonnoteEdit [cgi_set for $for] [cgi_set person $id]]] foreach n $notes { maplist $n noteid last_modified owner cgi_li [url "Edit $owner's note from $last_modified" [cgi_cgi PersonnoteEdit [cgi_set person $id] [cgi_set for $for] [cgi_set noteid $noteid]]] } } } # add and remove from groups if {$id != ""} { h2 "Groups" # find groups currently available set memberships [sql "SELECT persongroup.name,persongroup.id FROM persongroup,groupmember WHERE groupmember.person=$id and groupmember.persongroup=persongroup.id ORDER BY persongroup.name"] set IsMemberIn "" table { if {$memberships != ""} { table_row { td "Delete from" table_data { foreach g $memberships { maplist $g name gid puts [url "$name" [cgi_cgi PersonEdit [cgi_set action DeleteFromGroup] [cgi_set for $for] [cgi_set id $id] [cgi_set gid $gid]]] if {$g != [lindex $memberships end]} { puts "; " } lappend IsMemberIn $gid } } } } set allgroups [sql "SELECT DISTINCT persongroup.name,persongroup.id FROM persongroup,groupmember WHERE persongroup.owner='$for' AND groupmember.persongroup=persongroup.id"] set first 1 if {[llength $allgroups] <= 0} { table_row { td; td "You do not own any group" } } else { table_row { td "Add to" table_data { foreach g $allgroups { maplist $g name gid if {[lsearch $IsMemberIn $gid] < 0} { if {$first} {set first 0} {puts "; "} puts [url "$name" [cgi_cgi PersonEdit [cgi_set action AddToGroup] [cgi_set for $for] [cgi_set id $id] [cgi_set gid $gid]]] } } } } } table_row { td "Add to new group" table_data { form PersonEdit { cgi_export id cgi_export for cgi_text groupname= size=30 submit_button "action=New Group" } } } } } # add and remove this entry from conferences if {$id != ""} { h2 "Conferences" set uid $V(sip) if {$uid == ""} { set uid $V(email) } if {$uid == ""} { set uid $V(email_alt) } if {$uid != ""} { set confs [sql "SELECT url,summary FROM conferences \ LEFT JOIN eventgroup ON \ conferences.event_group=eventgroup.eventgroup \ WHERE owner='$for' ORDER BY url"] set inlist "" set outlist "" foreach c $confs { maparray $c {url description} C # check if already member set ismember [sql "SELECT user FROM confusers WHERE confurl='$C(url)' AND user='$uid'"] if {$ismember == ""} { lappend outlist [list $C(url) $C(description)] } else { lappend inlist [list $C(url) $C(description)] } } table { if {$outlist != ""} { table_row { td "Add to" table_data { set first 1 foreach c $outlist { if {$first} {set first 0} {puts "; "} puts [url [lindex $c 1] \ [cgi_cgi ConfMembers \ [cgi_set confurl [lindex $c 0]] \ [cgi_set op Add] \ [cgi_set user $uid]] \ target=ConfEdit] } } } } if {$inlist != ""} { table_row { td "Delete from" table_data { set first 1 foreach c $inlist { if {$first} {set first 0} {puts "; "} puts [url [lindex $c 1] \ [cgi_cgi ConfMembers \ [cgi_set confurl [lindex $c 0]] \ [cgi_set op Delete] \ [cgi_set user $uid]] \ target=ConfEdit] } } } } } } } # form if {$canedit && $action != "Edit"} { if {$id != ""} { h1 "Editing $V(givenname) $V(surname)" } else { h1 "Adding new address" if {![info exists V(email)]} { import_default email "" V(email) } } form PersonEdit { cgi_export id cgi_export for tableform {action=Edit action=Delete} F V } p [url "Import address book" [cgi_cgi PersonImportLDIF]] } sql disconnect } }