From b421a967d6057884dcd5a106b237036ca7a285ea Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Mon, 26 Jan 2009 20:53:46 +0000 Subject: [PATCH] checkpoint --- planetlab/persons/person.php | 4 +- planetlab/persons/persons.php | 534 ++++++++-------------------------- 2 files changed, 121 insertions(+), 417 deletions(-) diff --git a/planetlab/persons/person.php b/planetlab/persons/person.php index 322f98f..2bde056 100644 --- a/planetlab/persons/person.php +++ b/planetlab/persons/person.php @@ -11,7 +11,9 @@ global $plc, $api; // Print header require_once 'plc_drupal.php'; -include 'plc_header.php'; +require_once 'plc_minitabs.php'; +require_once 'plc_tables.php'; + // Common functions require_once 'plc_functions.php'; diff --git a/planetlab/persons/persons.php b/planetlab/persons/persons.php index b35c675..37d5d0a 100644 --- a/planetlab/persons/persons.php +++ b/planetlab/persons/persons.php @@ -11,460 +11,162 @@ global $plc, $api; // Print header require_once 'plc_drupal.php'; -// set default -drupal_set_title('People'); include 'plc_header.php'; // Common functions require_once 'plc_functions.php'; -require_once 'plc_sorts.php'; +require_once 'plc_minitabs.php'; +require_once 'plc_tables.php'; //fix the memory limit for this page ini_set("memory_limit","48M"); -// find person roles -$_person= $plc->person; -$_roles= $_person['role_ids']; - +// -------------------- +// recognized URL arguments +$peerscope=$_GET['peerscope']; +$pattern=$_GET['pattern']; +$site_id=intval($_GET['site_id']); +$slice_id=intval($_GET['slice_id']); + +// --- decoration +$title="Accounts"; +$tabs=array(); +$mysite_id=plc_my_site_id(); +$tabs['My accounts'] = array('url'=>l_persons(), + 'values'=>array('site_id'=>plc_my_site_id()), + 'bubble'=>'Lists accounts on site ' . $mysite_id); +// -------------------- +$peer_filter=array(); +$person_filter=array(); //////////////////// -// The set of columns to fetch -// and the filter applied for fetching sites -if ( !in_array( '10', $_roles ) ) { - $columns = array("person_id", "first_name", "last_name", "email", "roles" , "peer_id"); - // PIs can see users not yet enabled - if ( ! in_array ('20', $_roles) ) { - $filter = array ("enabled" => TRUE); - } else { - $filter = array(); - } - } else { - $columns = array("person_id", "first_name", "last_name", "email", "roles" , "peer_id", "key_ids", "enabled","slice_ids" ); - $filter = array (); - } +function person_status ($person) { -////////////////// -// perform post-processing on site objects as returned by GetSites -// performs sanity check and summarize the result in a single column -// performs in-place replacement, so passes a reference -function layout_person ($person) { - - // we need the 'key_ids' field to do this - // so regular users wont run this - if ( ! array_key_exists ('key_ids', $person)) - return $person ; - $messages=array(); - // do all this stuff on local persons only if ( $person['peer_id'] ) { $class='plc-foreign'; } else { $class='plc-warning'; - // check that the person has keys, but dont do that for admins - if ( ! in_array ('admin',$person['roles']) && count($person['key_ids']) == 0) + // check that the person has keys + if ( count($person['key_ids']) == 0) $messages [] = "No Key"; + if ( ! $person['enabled'] ) + $messages[] = "Disabled"; + //detect tech-only people involved in slices. } - if ( ! $person['enabled'] ) - $messages[] = "Disabled"; - // but always cleanup $person columns - unset ($person['key_ids']); - unset ($person['enabled']); - //detect tech already involved on some slices. if( ( count($person['roles'])==1 ) && ( in_array('tech',$person['roles']) ) && (! empty($person["slice_ids"])) ) { $messages[]="Tech involved in a Slice"; } - // cleanup $person columns - unset ($person['slice_ids']); - //display the extra status column - $person['status'] = plc_vertical_table($messages,$class); - return $person; -} - -// if emailpattern or peerscope is set then search for Persons. -// we use GET rather than POST so paginate can display the right contents on subsequent pages -// can be useful for writing bookmarkable URL's as well -if( $_GET['emailpattern'] || $_GET['peerscope']) { - $emailpattern= $_GET['emailpattern']; - if (empty($emailpattern)) { - $emailpattern="*"; - } - $filter = array_merge (array( "email"=>$emailpattern ), $filter); - switch ($_GET['peerscope']) { - case '': - $peer_label="all peers"; - break; - case 'local': - $filter=array_merge(array("peer_id"=>NULL),$filter); - $peer_label="local peer"; - break; - case 'foreign': - $filter=array_merge(array("~peer_id"=>NULL),$filter); - $peer_label="foreign peers"; - break; - default: - $peer_id=intval($_GET['peerscope']); - $filter=array_merge(array("peer_id"=>$peer_id),$filter); - $peer=$api->GetPeers(array("peer_id"=>$peer_id)); - $peer_label='peer "' . $peer[0]['peername'] . '"'; - break; - } - // need to use a hash filter for patterns to be properly handled - $persons= $api->GetPersons($filter , $columns ); - $persons= array_map(layout_person,$persons); - $person_count = count ($persons); - if ( $person_count == 1) { - header( "location: index.php?id=". $persons[0]['person_id'] ); - exit(); - } else if ( $person_count == 0) { - echo " No person whose email matches $emailpattern "; - } else { - drupal_set_title ("Users matching $emailpattern on ". $peer_label); - sort_persons ($persons); - echo paginate( $persons, "person_id", "Persons", 25, "email"); - } - } -// if a site_id is given, display the site persons only -else if( $_GET['site_id'] ) { - $site_id= $_GET['site_id']; - // Get site info - $site_info= $api->GetSites( array( intval( $site_id ) ), array( "name", "person_ids" ) ); - drupal_set_title("People with " . $site_info[0]['name']); - // Get site nodes - $persons= $api->GetPersons( array_merge (array("person_id"=>$site_info[0]['person_ids']),$filter), $columns ); - $persons= array_map(layout_person,$persons); - sort_persons( $persons ); - - echo paginate( $persons, "person_id", "Persons", 25, "email" ); - + return plc_vertical_table($messages,$class); } -// if a slice_id is given,display the persons involved in this slice -else if( $_GET['slice_id'] ) { - $slice_id= $_GET['slice_id']; - // Get slice infos - $slice_info= $api->GetSlices( array( intval( $slice_id ) ), array( "name", "person_ids" ) ); - drupal_set_title("People In " . $slice_info[0]['name']); - // Get slice persons - $persons= $api->GetPersons( array_merge (array("person_id"=>$slice_info[0]['person_ids']),$filter), $columns ); - if ( empty ($persons) ) { - echo "No persons to display"; - } else { - $persons= array_map(layout_person,$persons); - sort_persons( $persons ); - echo paginate( $persons, "person_id", "Persons", 25, "email" ); - echo "

GetPersons( empty($filter) ? NULL : $filter, $columns ); - $persons= array_map(layout_person,$persons); - sort_persons( $persons ); - - drupal_set_html_head(' - - '); - echo "

\n -
\n"; - //if( $emailpattern ) echo "'$emailpattern' is not a valid person email.\n"; - echo "\n -\n -\n -\n - -\n -\n -
\n -
\n"; - echo paginate( $persons, "person_id" , "Persons", 25, "email"); - echo "\n"; +// server-side selection on peerscope +list ( $peer_filter, $peer_label) = plc_peer_info($api,$_GET['peerscope']); +$person_filter=array_merge($person_filter,$peer_filter); + +if ($site_id) { + $sites=$api->GetSites(array($site_id),array("name","login_base","person_ids")); + $site=$sites[0]; + $name=$site['name']; + $login_base=$site['login_base']; + $title .= t_site($site); + $tabs = array_merge($tabs,tabs_site($site)); + $person_filter['person_id']=$site['person_ids']; } -else { - // get the person_id from the URL - $person_id= intval( $_GET['id'] ); - // GetPersons API call for this person - $person_info= $api->GetPersons( array( $person_id ) ); - if( empty( $person_info ) ) { - echo "No such person."; - } else { - // vars from api - $first_name= $person_info[0]['first_name']; - $last_name= $person_info[0]['last_name']; - $title= $person_info[0]['title']; - $url= $person_info[0]['url']; - $phone= $person_info[0]['phone']; - $email= $person_info[0]['email']; - $enabled= $person_info[0]['enabled']; - $peer_id=$person_info[0]['peer_id']; - - // arrays from api - $role_ids= $person_info[0]['role_ids']; - $roles= $person_info[0]['roles']; - $site_ids= $person_info[0]['site_ids']; - $slice_ids= $person_info[0]['slice_ids']; - $key_ids= $person_info[0]['key_ids']; - - // gets more data from API calls - $site_info= $api->GetSites( $site_ids, array( "site_id", "name" ) ); - $slice_info= $api->GetSlices( $slice_ids, array( "slice_id", "name" ) ); - $key_info= $api->GetKeys( $key_ids ); - - drupal_set_title("$first_name $last_name Account Information"); - - // start form - if ( ! $peer_id ) { - echo "
\n"; - } else { - echo "
"; - } - echo "\n"; - - if ( ! $peer_id ) { - if( in_array( 10, $_roles ) || ( in_array( 20, $_roles ) && in_array( $site_ids[0], $_person['site_ids'] ) ) ) { - // list to take person action - echo "
"; +if ($slice_id) { + $slices=$api->GetSlices(array($slice_id),array('person_ids','name')); + $slice=$slices[0]; + $title .= t_slice($slice); + $tabs = array_merge($tabs,tabs_slice($slice)); + $person_filter['person_id'] = $slice['person_ids']; + } - if (in_array( 10, $_roles )) { - echo plc_event_button("Person","person",$person_id); - echo ""; - } +// go +$persons=$api->GetPersons($person_filter,$person_columns); - echo "\n"; +// fetch related sites +$site_columns=array('site_id','login_base'); +$site_filter=array('site_id'=>$site_ids); +$sites=$api->GetSites($site_filter,$site_columns); - if( $enabled == false ) { - echo ""; - echo "   <- This user is not enabled. Choose here to enable or delete."; - } - echo "
"; - } +// hash on site_id +$site_hash=array(); +foreach ($sites as $site) { + $site_hash[$site['site_id']]=$site; +} - } - - // basic person info - echo "
"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "
First Name: $first_name
Last Name: $last_name
Title: $title
Email: $email
Phone: $phone
URL: $url
\n"; - - if( in_array( 10, $_roles ) || $_person['person_id'] == $person_id ) - echo "
Update info\n"; - - echo "
\n"; - - // keys - $can_manage_keys = ( ( ! $peer_id ) && (in_array( "10", $_roles ) || $person_id == $_person['person_id'])); - echo "

Keys

\n"; - if( !empty( $key_ids ) ) { - echo "

\n"; - echo ""; - if ( $can_manage_keys ) - echo ""; - echo "\n"; - - foreach( $key_info as $key ) { - $key_type= $key['key_type']; - $key_id= $key['key_id']; - $key_text= wordwrap( $key['key'], 70, "
\n", 1 ); - echo "\n"; - } - - echo "
TypeKeyRemove
$key_type$key_text"; - - if ( $can_manage_keys ) - echo ""; - - echo "
\n"; - if ($can_manage_keys) - echo "


\n"; - - } else { - echo " This user has no known key"; - } - - if( $can_manage_keys ){ - echo "
Upload new key: \n - \n -


\n"; - } - // sites - echo "

Sites

\n"; - if( !empty( $site_info ) ) { - echo "\n"; - - foreach( $site_info as $site ) { - $site_name= $site['name']; - $site_id= $site['site_id']; - - echo "\n"; - } - echo "
$site_name ( remove)
\n"; - echo "\n"; - - } else { - echo " This user is not affiliated with a site !!"; - } - - // diplay site select list to add another site for user - if( ! $peer_id && in_array( 10, $_roles ) ) { - // get site info - $full_site_info= $api->GetSites( NULL, array( "site_id", "name" ) ); - - if( $site_info ) - $person_site= arr_diff( $full_site_info, $site_info ); - else - $person_site= $full_site_info; - - sort_sites( $person_site ); - - echo "

Select a site to add this user to: "; - echo ""; - - } - echo "


\n"; +// -------------------- +drupal_set_title($title); - // roles - echo "

Roles

\n"; - echo "

\n"; - echo ""; - if( in_array( "10", $_roles ) ) - echo ""; - echo "\n"; - - // construct role array - for( $n=0; $n$role_ids[$n], 'name'=>$roles[$n] ); - } - - $button_shown=0; - if ( !empty ($roles) ) { - foreach( $proles as $role ) { - $role_name= $role['name']; - $role_id= $role['role_id']; - - echo "\n"; - $button_shown=1; - } - } - - echo "\n"; - } - } else { - echo " This user has no known role !!"; - } - echo "
RoleRemove
$role_name"; - +plc_tabs($tabs); - if( in_array( 10, $_roles ) ) { - echo ""; - if ( ! $button_shown ) { - $rowspan=count($roles); - echo "
\n"; - - // if admin show roles to add - if( in_array( 10, $_roles ) ) { - $all_roles= $api->GetRoles(); - $addable_roles= arr_diff( $all_roles, $proles ); - ##when the proles array is empty strangely the method arr_diff($all_roles, $proles ) - ##return an empty array and the scrolling roles list is not displayed in this case - ##assign to addablerole all the roles - if (count($proles)==0) - $addable_roles=$all_roles; - - if( !empty( $addable_roles ) ) { - echo "

Add role: \n"; - - } - } - - echo "


\n"; - - // slices - echo "

Slices

\n"; - if( !empty( $slice_info ) ) { - - foreach( $slice_info as $slice ) { - $slice_name= $slice['name']; - $slice_id= $slice['slice_id']; - - echo "$slice_name
\n"; - } - - } else { - echo "No slices found for that user"; - } - - if ( ! $peer_id ) { - echo "\n"; - } else { - echo "
\n"; - } - - } - if( $peer_id ) - echo "
"; - - echo "

Back to persons list"; - +if ( ! $persons ) { + drupal_set_message ('No account found'); + return; } + +$columns = array ("Peer"=>"string", + "Roles"=>"string", + "First"=>"string", + "Last"=>"string", + "Email"=>"string", + "Site" => "string", + "Status"=>"string", + ); + +// initial sort on email +$table_options=array(); +plc_table_start("persons",$columns,5,$table_options); + +$peer_hash = plc_peer_get_hash ($api); +// write rows + +foreach ($persons as $person) { + $person_id=$person['person_id']; + $email=$person['email']; + $shortname = plc_peer_shortname ($peer_hash,$person['peer_id']); + $site_id=$person['site_ids'][0]; + $site=$site_hash[$site_id]; + $login_base = $site['login_base']; + $roles = plc_vertical_table ($person['roles']); + + plc_table_row_start($email); + + plc_table_cell($shortname); + plc_table_cell($roles); + plc_table_cell ($person['first_name']); + plc_table_cell ($person['last_name']); + plc_table_cell($email); + plc_table_cell($login_base); + plc_table_cell(person_status($person)); + plc_table_row_end(); + +} +plc_table_end($table_options); // Print footer include 'plc_footer.php'; -- 2.43.0