diff --git a/swad_changelog.h b/swad_changelog.h index b2367ca5e..b6a99666d 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -94,7 +94,6 @@ ----------Otros ....Etc..... */ -// TODO: Show guests in connected users. // TODO: A teacher should may confirm a student ID? In what conditions? (Necessary in order to a student can view his/her marks) // TODO: Put headers Content-type and Content-disposition when redirecting with Location: // TODO: When a new assignment/attendance/survey is incorrect, the second time the form is shown, it should be filled with partial data, now is always empty @@ -120,12 +119,14 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.67.1 (2015/12/15)" +#define Log_PLATFORM_VERSION "SWAD 15.68 (2015/12/19)" #define CSS_FILE "swad15.65.1.css" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* + Version 15.68: Dec 19, 2015 Show guests in connected users. + Optimization in queries about connected users. (187158 lines) Version 15.67.1: Dec 15, 2015 Changed some messages. (187141 lines) Version 15.67: Dec 15, 2015 Fixed bugs in queries of enrollment requests. (187140 lines) Version 15.66.3: Dec 15, 2015 Changes in some small icons. diff --git a/swad_connected.c b/swad_connected.c index 8dc0c2eaf..093a394ec 100644 --- a/swad_connected.c +++ b/swad_connected.c @@ -95,11 +95,10 @@ void Con_ShowConnectedUsrs (void) Gbl.Now.Date.Day, Gbl.Now.Time.Hour, Gbl.Now.Time.Minute); - Lay_StartRoundFrameTable (NULL,0,Gbl.Title); + Lay_StartRoundFrame (NULL,Gbl.Title); /***** Put form to update connected users *****/ - fprintf (Gbl.F.Out,"" - ""); Act_FormStart (ActLstCon); Gbl.Scope.Current = Sco_SCOPE_CRS; @@ -114,11 +113,7 @@ void Con_ShowConnectedUsrs (void) Sco_PutSelectorScope (true); } Act_FormEnd (); - - fprintf (Gbl.F.Out,"" - "" - "" - ""); + fprintf (Gbl.F.Out,""); /* Number of connected users in the whole platform */ Con_ShowGlobalConnectedUsrs (); @@ -126,11 +121,8 @@ void Con_ShowConnectedUsrs (void) /* Show connected users in the current course */ Con_ShowConnectedUsrsBelongingToScope (); - fprintf (Gbl.F.Out,"" - ""); - /***** End frame *****/ - Lay_EndRoundFrameTable (); + Lay_EndRoundFrame (); } /*****************************************************************************/ @@ -510,6 +502,8 @@ void Con_ShowConnectedUsrsBelongingToScope (void) case Con_SHOW_ON_MAIN_ZONE: Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone (Rol_TEACHER); Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone (Rol_STUDENT); + if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM) + Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone (Rol__GUEST_); break; case Con_SHOW_ON_RIGHT_COLUMN: Gbl.Usrs.Connected.NumUsr = 0; @@ -517,6 +511,8 @@ void Con_ShowConnectedUsrsBelongingToScope (void) Gbl.Usrs.Connected.NumUsrsToList = 0; Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_TEACHER); Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_STUDENT); + if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM) + Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol__GUEST_); break; } @@ -1119,86 +1115,103 @@ static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t R Gbl.Scope.Current == Sco_SCOPE_CRS); /***** Get connected users who belong to current location from database *****/ - switch (Gbl.Scope.Current) + switch (Role) { - case Sco_SCOPE_SYS: // Show connected users in the whole platform - sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM connected,crs_usr,usr_data" - " WHERE connected.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND connected.UsrCod=usr_data.UsrCod ORDER BY Dif", - (unsigned) Role); - break; - case Sco_SCOPE_CTY: // Show connected users in the current country - sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data" - " WHERE institutions.CtyCod='%ld'" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND crs_usr.UsrCod=usr_data.UsrCod ORDER BY Dif", - Gbl.CurrentCty.Cty.CtyCod, - (unsigned) Role); - break; - case Sco_SCOPE_INS: // Show connected users in the current institution - sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM centres,degrees,courses,crs_usr,connected,usr_data" - " WHERE centres.InsCod='%ld'" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND crs_usr.UsrCod=usr_data.UsrCod ORDER BY Dif", - Gbl.CurrentIns.Ins.InsCod, - (unsigned) Role); - break; - case Sco_SCOPE_CTR: // Show connected users in the current centre - sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM degrees,courses,crs_usr,connected,usr_data" - " WHERE degrees.CtrCod='%ld'" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND crs_usr.UsrCod=usr_data.UsrCod ORDER BY Dif", - Gbl.CurrentCtr.Ctr.CtrCod, - (unsigned) Role); - break; - case Sco_SCOPE_DEG: // Show connected users in the current degree - sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM courses,crs_usr,connected,usr_data" - " WHERE courses.DegCod='%ld'" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND crs_usr.UsrCod=usr_data.UsrCod ORDER BY Dif", - Gbl.CurrentDeg.Deg.DegCod, - (unsigned) Role); - break; - case Sco_SCOPE_CRS: // Show connected users in the current course - sprintf (Query,"SELECT connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM crs_usr,connected,usr_data" - " WHERE crs_usr.CrsCod='%ld'" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND crs_usr.UsrCod=usr_data.UsrCod ORDER BY Dif", - Gbl.CurrentCrs.Crs.CrsCod, - (unsigned) Role); - break; + case Rol__GUEST_: + sprintf (Query,"SELECT UsrCod,LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(LastTime) AS Dif" + " FROM connected" + " WHERE UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" + " ORDER BY Dif"); + break; + case Rol_STUDENT: + case Rol_TEACHER: + switch (Gbl.Scope.Current) + { + case Sco_SCOPE_SYS: // Show connected users in the whole platform + sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM connected,crs_usr" + " WHERE connected.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role='%u'" + " ORDER BY Dif", + (unsigned) Role); + break; + case Sco_SCOPE_CTY: // Show connected users in the current country + sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM institutions,centres,degrees,courses,crs_usr,connected" + " WHERE institutions.CtyCod='%ld'" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role='%u'" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentCty.Cty.CtyCod, + (unsigned) Role); + break; + case Sco_SCOPE_INS: // Show connected users in the current institution + sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM centres,degrees,courses,crs_usr,connected" + " WHERE centres.InsCod='%ld'" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role='%u'" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentIns.Ins.InsCod, + (unsigned) Role); + break; + case Sco_SCOPE_CTR: // Show connected users in the current centre + sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM degrees,courses,crs_usr,connected" + " WHERE degrees.CtrCod='%ld'" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role='%u'" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentCtr.Ctr.CtrCod, + (unsigned) Role); + break; + case Sco_SCOPE_DEG: // Show connected users in the current degree + sprintf (Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM courses,crs_usr,connected" + " WHERE courses.DegCod='%ld'" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role='%u'" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentDeg.Deg.DegCod, + (unsigned) Role); + break; + case Sco_SCOPE_CRS: // Show connected users in the current course + sprintf (Query,"SELECT connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM crs_usr,connected" + " WHERE crs_usr.CrsCod='%ld'" + " AND crs_usr.Role='%u'" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentCrs.Crs.CrsCod, + (unsigned) Role); + break; + default: + Lay_ShowErrorAndExit ("Wrong scope."); + break; + } + break; default: - Lay_ShowErrorAndExit ("Wrong scope."); + Lay_ShowErrorAndExit ("Wrong role."); break; } + NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get list of connected users who belong to this location"); if (NumUsrs) @@ -1215,56 +1228,57 @@ static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t R /* Get user's data */ UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]); - Usr_GetAllUsrDataFromUsrCod (&UsrDat); - - /* Get course code (row[1]) */ - ThisCrs = (Str_ConvertStrCodToLongCod (row[1]) == Gbl.CurrentCrs.Crs.CrsCod); - Font = (ThisCrs ? "CON_CRS" : - "CON"); - - /* Compute time from last access */ - if (sscanf (row[2],"%ld",&TimeDiff) != 1) - TimeDiff = (time_t) 0; - - /***** Show photo *****/ - fprintf (Gbl.F.Out,"" - "", - Gbl.RowEvenOdd); - ShowPhoto = Pho_ShowUsrPhotoIsAllowed (&UsrDat,PhotoURL); - Pho_ShowUsrPhoto (&UsrDat,ShowPhoto ? PhotoURL : - NULL, - "PHOTO21x28",Pho_ZOOM); - fprintf (Gbl.F.Out,""); - - /***** Write full name and link *****/ - fprintf (Gbl.F.Out,"", - Font,Gbl.RowEvenOdd); - if (PutLinkToRecord) + if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // Existing user { - Act_FormStart ((Role == Rol_STUDENT) ? ActSeeRecOneStd : - ActSeeRecOneTch); - Usr_PutParamUsrCodEncrypted (UsrDat.EncryptedUsrCod); - Act_LinkFormSubmit (UsrDat.FullName,Font); - } - Usr_RestrictLengthAndWriteName (&UsrDat,40); - if (PutLinkToRecord) - { - fprintf (Gbl.F.Out,""); - Act_FormEnd (); - } - fprintf (Gbl.F.Out,""); + /* Get course code (row[1]) */ + ThisCrs = (Str_ConvertStrCodToLongCod (row[1]) == Gbl.CurrentCrs.Crs.CrsCod); + Font = (ThisCrs ? "CON_CRS" : + "CON"); - /***** Write time from last access *****/ - fprintf (Gbl.F.Out,"", - Font,Gbl.RowEvenOdd); - Con_WriteHoursMinutesSecondsFromSeconds (TimeDiff); - fprintf (Gbl.F.Out,"" - ""); + /* Compute time from last access */ + if (sscanf (row[2],"%ld",&TimeDiff) != 1) + TimeDiff = (time_t) 0; - Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd; + /***** Show photo *****/ + fprintf (Gbl.F.Out,"" + "", + Gbl.RowEvenOdd); + ShowPhoto = Pho_ShowUsrPhotoIsAllowed (&UsrDat,PhotoURL); + Pho_ShowUsrPhoto (&UsrDat,ShowPhoto ? PhotoURL : + NULL, + "PHOTO21x28",Pho_ZOOM); + fprintf (Gbl.F.Out,""); + + /***** Write full name and link *****/ + fprintf (Gbl.F.Out,"", + Font,Gbl.RowEvenOdd); + if (PutLinkToRecord) + { + Act_FormStart ((Role == Rol_STUDENT) ? ActSeeRecOneStd : + ActSeeRecOneTch); + Usr_PutParamUsrCodEncrypted (UsrDat.EncryptedUsrCod); + Act_LinkFormSubmit (UsrDat.FullName,Font); + } + Usr_RestrictLengthAndWriteName (&UsrDat,40); + if (PutLinkToRecord) + { + fprintf (Gbl.F.Out,""); + Act_FormEnd (); + } + fprintf (Gbl.F.Out,""); + + /***** Write time from last access *****/ + fprintf (Gbl.F.Out,"", + Font,Gbl.RowEvenOdd); + Con_WriteHoursMinutesSecondsFromSeconds (TimeDiff); + fprintf (Gbl.F.Out,"" + ""); + + Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd; + } } /***** Free memory used for user's data *****/