mirror of
https://github.com/acanas/swad-core.git
synced 2024-09-20 00:02:42 +02:00
Version 15.68.1
This commit is contained in:
parent
f4ac8cd22a
commit
3c484f727e
|
@ -119,12 +119,13 @@
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 15.68 (2015/12/19)"
|
#define Log_PLATFORM_VERSION "SWAD 15.68.1 (2015/12/20)"
|
||||||
#define CSS_FILE "swad15.65.1.css"
|
#define CSS_FILE "swad15.65.1.css"
|
||||||
|
|
||||||
// Number of lines (includes comments but not blank lines) has been got with the following command:
|
// 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
|
// 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.1: Dec 20, 2015 Fixed bugs in connected users. (187171 lines)
|
||||||
Version 15.68: Dec 19, 2015 Show guests in connected users.
|
Version 15.68: Dec 19, 2015 Show guests in connected users.
|
||||||
Optimization in queries about connected users. (187158 lines)
|
Optimization in queries about connected users. (187158 lines)
|
||||||
Version 15.67.1: Dec 15, 2015 Changed some messages. (187141 lines)
|
Version 15.67.1: Dec 15, 2015 Changed some messages. (187141 lines)
|
||||||
|
|
272
swad_connected.c
272
swad_connected.c
|
@ -52,13 +52,14 @@ extern struct Globals Gbl;
|
||||||
/*************************** Internal prototypes *****************************/
|
/*************************** Internal prototypes *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Con_ComputeConnectedUsrsOfTypeBelongingToCurrentCrs (Rol_Role_t Role);
|
static void Con_ComputeConnectedUsrsWithARoleBelongingToCurrentCrs (Rol_Role_t Role);
|
||||||
|
|
||||||
static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone (Rol_Role_t Role);
|
static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone (Rol_Role_t Role);
|
||||||
static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_Role_t Role);
|
static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_Role_t Role);
|
||||||
static unsigned Con_GetConnectedGuestsTotal (void);
|
static unsigned Con_GetConnectedGuestsTotal (void);
|
||||||
static unsigned Con_GetConnectedStdsTotal (void);
|
static unsigned Con_GetConnectedStdsTotal (void);
|
||||||
static unsigned Con_GetConnectedTchsTotal (void);
|
static unsigned Con_GetConnectedTchsTotal (void);
|
||||||
static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,Usr_Sex_t *UsrSex);
|
static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,struct ConnectedUsrs *Usrs);
|
||||||
static void Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Rol_Role_t Role);
|
static void Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Rol_Role_t Role);
|
||||||
static void Con_ShowConnectedUsrsCurrentCrsOneByOneOnRightColumn (Rol_Role_t Role);
|
static void Con_ShowConnectedUsrsCurrentCrsOneByOneOnRightColumn (Rol_Role_t Role);
|
||||||
static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role);
|
static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role);
|
||||||
|
@ -118,8 +119,8 @@ void Con_ShowConnectedUsrs (void)
|
||||||
/* Number of connected users in the whole platform */
|
/* Number of connected users in the whole platform */
|
||||||
Con_ShowGlobalConnectedUsrs ();
|
Con_ShowGlobalConnectedUsrs ();
|
||||||
|
|
||||||
/* Show connected users in the current course */
|
/* Show connected users in the current location */
|
||||||
Con_ShowConnectedUsrsBelongingToScope ();
|
Con_ShowConnectedUsrsBelongingToLocation ();
|
||||||
|
|
||||||
/***** End frame *****/
|
/***** End frame *****/
|
||||||
Lay_EndRoundFrame ();
|
Lay_EndRoundFrame ();
|
||||||
|
@ -392,27 +393,47 @@ void Con_ShowGlobalConnectedUsrs (void)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Con_ComputeConnectedUsrsBelongingToCurrentCrs (void)
|
void Con_ComputeConnectedUsrsBelongingToCurrentCrs (void)
|
||||||
|
{
|
||||||
|
if ((Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN) && // Right column visible
|
||||||
|
Gbl.CurrentCrs.Crs.CrsCod > 0 && // There is a course selected
|
||||||
|
(Gbl.Usrs.Me.IBelongToCurrentCrs || // I can view users
|
||||||
|
Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM))
|
||||||
{
|
{
|
||||||
Gbl.Usrs.Connected.NumUsrs = 0;
|
Gbl.Usrs.Connected.NumUsrs = 0;
|
||||||
Gbl.Usrs.Connected.NumUsrsToList = 0;
|
Gbl.Usrs.Connected.NumUsrsToList = 0;
|
||||||
|
Gbl.Scope.Current = Sco_SCOPE_CRS;
|
||||||
|
|
||||||
/***** Number of teachers *****/
|
/***** Number of teachers *****/
|
||||||
Con_ComputeConnectedUsrsOfTypeBelongingToCurrentCrs (Rol_TEACHER);
|
Con_ComputeConnectedUsrsWithARoleBelongingToCurrentCrs (Rol_TEACHER);
|
||||||
|
|
||||||
/***** Number of students *****/
|
/***** Number of students *****/
|
||||||
Con_ComputeConnectedUsrsOfTypeBelongingToCurrentCrs (Rol_STUDENT);
|
Con_ComputeConnectedUsrsWithARoleBelongingToCurrentCrs (Rol_STUDENT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******** Show number of connected users who belong to current course ********/
|
/** Compute number of connected users of a type who belong to current course */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Con_ShowConnectedUsrsBelongingToScope (void)
|
static void Con_ComputeConnectedUsrsWithARoleBelongingToCurrentCrs (Rol_Role_t Role)
|
||||||
|
{
|
||||||
|
/***** Get number of connected users who belong to current course *****/
|
||||||
|
Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&Gbl.Usrs.Connected.Usrs[Role]);
|
||||||
|
|
||||||
|
/***** Get list connected users belonging to this course *****/
|
||||||
|
Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Role);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****** Show number of connected users who belong to current location ********/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Con_ShowConnectedUsrsBelongingToLocation (void)
|
||||||
{
|
{
|
||||||
extern const char *The_ClassConnected[The_NUM_THEMES];
|
extern const char *The_ClassConnected[The_NUM_THEMES];
|
||||||
extern const char *Txt_from;
|
extern const char *Txt_from;
|
||||||
char LocationName[Deg_MAX_LENGTH_LOCATION_SHORT_NAME_SPEC_CHAR+1];
|
char LocationName[Deg_MAX_LENGTH_LOCATION_SHORT_NAME_SPEC_CHAR+1];
|
||||||
Usr_Sex_t UsrSex;
|
struct ConnectedUsrs Usrs;
|
||||||
|
|
||||||
switch (Gbl.Scope.Current)
|
switch (Gbl.Scope.Current)
|
||||||
{
|
{
|
||||||
|
@ -443,7 +464,7 @@ void Con_ShowConnectedUsrsBelongingToScope (void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Number of connected users who belong to current course *****/
|
/***** Number of connected users who belong to scope *****/
|
||||||
switch (Gbl.Scope.Current)
|
switch (Gbl.Scope.Current)
|
||||||
{
|
{
|
||||||
case Sco_SCOPE_SYS: // Show connected users in the whole platform
|
case Sco_SCOPE_SYS: // Show connected users in the whole platform
|
||||||
|
@ -478,9 +499,10 @@ void Con_ShowConnectedUsrsBelongingToScope (void)
|
||||||
Str_ReplaceSpecialCharByCodes (LocationName,Deg_MAX_LENGTH_LOCATION_SHORT_NAME_SPEC_CHAR);
|
Str_ReplaceSpecialCharByCodes (LocationName,Deg_MAX_LENGTH_LOCATION_SHORT_NAME_SPEC_CHAR);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_UNKNOWN,&Usrs);
|
||||||
fprintf (Gbl.F.Out,"<span class=\"%s\">%u %s %s</span>",
|
fprintf (Gbl.F.Out,"<span class=\"%s\">%u %s %s</span>",
|
||||||
The_ClassConnected[Gbl.Prefs.Theme],
|
The_ClassConnected[Gbl.Prefs.Theme],
|
||||||
Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_UNKNOWN,&UsrSex),
|
Usrs.NumUsrs,
|
||||||
Txt_from,
|
Txt_from,
|
||||||
LocationName);
|
LocationName);
|
||||||
|
|
||||||
|
@ -511,8 +533,6 @@ void Con_ShowConnectedUsrsBelongingToScope (void)
|
||||||
Gbl.Usrs.Connected.NumUsrsToList = 0;
|
Gbl.Usrs.Connected.NumUsrsToList = 0;
|
||||||
Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_TEACHER);
|
Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_TEACHER);
|
||||||
Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_STUDENT);
|
Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_STUDENT);
|
||||||
if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
|
|
||||||
Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol__GUEST_);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -521,33 +541,6 @@ void Con_ShowConnectedUsrsBelongingToScope (void)
|
||||||
"</div>");
|
"</div>");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/** Compute number of connected users of a type who belong to current course */
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Con_ComputeConnectedUsrsOfTypeBelongingToCurrentCrs (Rol_Role_t Role)
|
|
||||||
{
|
|
||||||
Gbl.Scope.Current = Sco_SCOPE_CRS;
|
|
||||||
|
|
||||||
/***** Get number of connected users who belong to current course *****/
|
|
||||||
switch (Role)
|
|
||||||
{
|
|
||||||
case Rol_TEACHER:
|
|
||||||
Gbl.Usrs.Connected.NumTchs = Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&Gbl.Usrs.Connected.SexTchs);
|
|
||||||
break;
|
|
||||||
case Rol_STUDENT:
|
|
||||||
Gbl.Usrs.Connected.NumStds = Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&Gbl.Usrs.Connected.SexStds);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** List connected users belonging to this course *****/
|
|
||||||
if (Gbl.Usrs.Me.IBelongToCurrentCrs ||
|
|
||||||
Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
|
|
||||||
Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Role);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Show number of connected users with a role who belong to current location */
|
/* Show number of connected users with a role who belong to current location */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -556,19 +549,18 @@ static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone (
|
||||||
{
|
{
|
||||||
extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||||
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||||
unsigned NumUsrsThisRole;
|
struct ConnectedUsrs Usrs;
|
||||||
Usr_Sex_t UsrSex;
|
|
||||||
|
|
||||||
/***** Write number of connected users who belong to current course *****/
|
/***** Write number of connected users who belong to current course *****/
|
||||||
NumUsrsThisRole = Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&UsrSex);
|
Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&Usrs);
|
||||||
fprintf (Gbl.F.Out,"<tr>"
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
"<td colspan=\"3\" class=\"CENTER_TOP\">"
|
"<td colspan=\"3\" class=\"CENTER_TOP\">"
|
||||||
"%u %s"
|
"%u %s"
|
||||||
"</td>"
|
"</td>"
|
||||||
"</tr>",
|
"</tr>",
|
||||||
NumUsrsThisRole,
|
Usrs.NumUsrs,
|
||||||
(NumUsrsThisRole == 1) ? Txt_ROLES_SINGUL_abc[Role][UsrSex] :
|
(Usrs.NumUsrs == 1) ? Txt_ROLES_SINGUL_abc[Role][Usrs.Sex] :
|
||||||
Txt_ROLES_PLURAL_abc [Role][UsrSex]);
|
Txt_ROLES_PLURAL_abc[Role][Usrs.Sex]);
|
||||||
|
|
||||||
/***** List connected users belonging to this location *****/
|
/***** List connected users belonging to this location *****/
|
||||||
switch (Gbl.Scope.Current)
|
switch (Gbl.Scope.Current)
|
||||||
|
@ -613,27 +605,15 @@ static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColum
|
||||||
extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||||
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||||
extern const char *Txt_Connected_users;
|
extern const char *Txt_Connected_users;
|
||||||
unsigned NumUsrsThisRole;
|
unsigned NumUsrsThisRole = Gbl.Usrs.Connected.Usrs[Role].NumUsrs;
|
||||||
Usr_Sex_t UsrSex;
|
Usr_Sex_t UsrSex = Gbl.Usrs.Connected.Usrs[Role].Sex;
|
||||||
|
|
||||||
/***** Write number of connected users who belong to current course *****/
|
/***** Write number of connected users who belong to current course *****/
|
||||||
switch (Role)
|
|
||||||
{
|
|
||||||
case Rol_TEACHER:
|
|
||||||
NumUsrsThisRole = Gbl.Usrs.Connected.NumTchs;
|
|
||||||
UsrSex = Gbl.Usrs.Connected.SexTchs;
|
|
||||||
break;
|
|
||||||
case Rol_STUDENT:
|
|
||||||
NumUsrsThisRole = Gbl.Usrs.Connected.NumStds;
|
|
||||||
UsrSex = Gbl.Usrs.Connected.SexStds;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Gbl.Usrs.Connected.NumUsrs += NumUsrsThisRole;
|
Gbl.Usrs.Connected.NumUsrs += NumUsrsThisRole;
|
||||||
Gbl.Usrs.Connected.NumUsrsToList += NumUsrsThisRole;
|
Gbl.Usrs.Connected.NumUsrsToList += NumUsrsThisRole;
|
||||||
if (Gbl.Usrs.Connected.NumUsrsToList > Cfg_MAX_CONNECTED_SHOWN)
|
if (Gbl.Usrs.Connected.NumUsrsToList > Cfg_MAX_CONNECTED_SHOWN)
|
||||||
Gbl.Usrs.Connected.NumUsrsToList = Cfg_MAX_CONNECTED_SHOWN;
|
Gbl.Usrs.Connected.NumUsrsToList = Cfg_MAX_CONNECTED_SHOWN;
|
||||||
|
|
||||||
fprintf (Gbl.F.Out,"<tr>"
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
"<td colspan=\"3\" class=\"CENTER_TOP LEFT_RIGHT_CONTENT_WIDTH\">"
|
"<td colspan=\"3\" class=\"CENTER_TOP LEFT_RIGHT_CONTENT_WIDTH\">"
|
||||||
"%u %s"
|
"%u %s"
|
||||||
|
@ -791,35 +771,30 @@ static unsigned Con_GetConnectedTchsTotal (void)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
// Return user's sex in UsrSex
|
// Return user's sex in UsrSex
|
||||||
|
|
||||||
static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,Usr_Sex_t *UsrSex)
|
static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,struct ConnectedUsrs *Usrs)
|
||||||
{
|
{
|
||||||
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
|
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
|
||||||
char Query[512];
|
char Query[512];
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
unsigned NumUsrs;
|
|
||||||
unsigned NumSexs;
|
unsigned NumSexs;
|
||||||
Usr_Sex_t Sex;
|
Usr_Sex_t Sex;
|
||||||
|
|
||||||
/***** Get number of connected users who belong to current course from database *****/
|
/***** Get number of connected users who belong to current course from database *****/
|
||||||
|
switch (Role)
|
||||||
|
{
|
||||||
|
case Rol_UNKNOWN: // Here Rol_ROLE_UNKNOWN means "any role"
|
||||||
switch (Gbl.Scope.Current)
|
switch (Gbl.Scope.Current)
|
||||||
{
|
{
|
||||||
case Sco_SCOPE_SYS: // Show connected users in the whole platform
|
case Sco_SCOPE_SYS: // Show connected users in the whole platform
|
||||||
if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
" FROM connected,usr_data"
|
" FROM connected,usr_data"
|
||||||
" WHERE connected.UsrCod=usr_data.UsrCod");
|
" WHERE connected.UsrCod=usr_data.UsrCod");
|
||||||
else
|
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
|
||||||
" FROM connected,crs_usr,usr_data"
|
|
||||||
" WHERE connected.UsrCod=crs_usr.UsrCod"
|
|
||||||
" AND crs_usr.Role='%u'"
|
|
||||||
" AND connected.UsrCod=usr_data.UsrCod",
|
|
||||||
(unsigned) Role);
|
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_CTY: // Show connected users in the current country
|
case Sco_SCOPE_CTY: // Show connected users in the current country
|
||||||
if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
" FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data"
|
" FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data"
|
||||||
" WHERE institutions.CtyCod='%ld'"
|
" WHERE institutions.CtyCod='%ld'"
|
||||||
" AND institutions.InsCod=centres.InsCod"
|
" AND institutions.InsCod=centres.InsCod"
|
||||||
|
@ -829,8 +804,77 @@ static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Ro
|
||||||
" AND crs_usr.UsrCod=connected.UsrCod"
|
" AND crs_usr.UsrCod=connected.UsrCod"
|
||||||
" AND connected.UsrCod=usr_data.UsrCod",
|
" AND connected.UsrCod=usr_data.UsrCod",
|
||||||
Gbl.CurrentCty.Cty.CtyCod);
|
Gbl.CurrentCty.Cty.CtyCod);
|
||||||
else
|
break;
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
case Sco_SCOPE_INS: // Show connected users in the current institution
|
||||||
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
|
" 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.UsrCod=connected.UsrCod"
|
||||||
|
" AND connected.UsrCod=usr_data.UsrCod",
|
||||||
|
Gbl.CurrentIns.Ins.InsCod);
|
||||||
|
break;
|
||||||
|
case Sco_SCOPE_CTR: // Show connected users in the current centre
|
||||||
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
|
" 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.UsrCod=connected.UsrCod"
|
||||||
|
" AND connected.UsrCod=usr_data.UsrCod",
|
||||||
|
Gbl.CurrentCtr.Ctr.CtrCod);
|
||||||
|
break;
|
||||||
|
case Sco_SCOPE_DEG: // Show connected users in the current degree
|
||||||
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
|
" FROM courses,crs_usr,connected,usr_data"
|
||||||
|
" WHERE courses.DegCod='%ld'"
|
||||||
|
" AND courses.CrsCod=crs_usr.CrsCod"
|
||||||
|
" AND crs_usr.UsrCod=connected.UsrCod"
|
||||||
|
" AND connected.UsrCod=usr_data.UsrCod",
|
||||||
|
Gbl.CurrentDeg.Deg.DegCod);
|
||||||
|
break;
|
||||||
|
case Sco_SCOPE_CRS: // Show connected users in the current course
|
||||||
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
|
" FROM crs_usr,connected,usr_data"
|
||||||
|
" WHERE crs_usr.CrsCod='%ld'"
|
||||||
|
" AND crs_usr.UsrCod=connected.UsrCod"
|
||||||
|
" AND connected.UsrCod=usr_data.UsrCod",
|
||||||
|
Gbl.CurrentCrs.Crs.CrsCod);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Lay_ShowErrorAndExit ("Wrong scope.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Rol__GUEST_:
|
||||||
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
|
" FROM connected,usr_data"
|
||||||
|
" WHERE connected.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)"
|
||||||
|
" AND connected.UsrCod=usr_data.UsrCod");
|
||||||
|
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 COUNT(DISTINCT connected.UsrCod),"
|
||||||
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
|
" FROM connected,crs_usr,usr_data"
|
||||||
|
" WHERE connected.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND connected.UsrCod=usr_data.UsrCod",
|
||||||
|
(unsigned) Role);
|
||||||
|
break;
|
||||||
|
case Sco_SCOPE_CTY: // Show connected users in the current country
|
||||||
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
" FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data"
|
" FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data"
|
||||||
" WHERE institutions.CtyCod='%ld'"
|
" WHERE institutions.CtyCod='%ld'"
|
||||||
" AND institutions.InsCod=centres.InsCod"
|
" AND institutions.InsCod=centres.InsCod"
|
||||||
|
@ -844,18 +888,8 @@ static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Ro
|
||||||
(unsigned) Role);
|
(unsigned) Role);
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_INS: // Show connected users in the current institution
|
case Sco_SCOPE_INS: // Show connected users in the current institution
|
||||||
if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
" 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.UsrCod=connected.UsrCod"
|
|
||||||
" AND connected.UsrCod=usr_data.UsrCod",
|
|
||||||
Gbl.CurrentIns.Ins.InsCod);
|
|
||||||
else
|
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
|
||||||
" FROM centres,degrees,courses,crs_usr,connected,usr_data"
|
" FROM centres,degrees,courses,crs_usr,connected,usr_data"
|
||||||
" WHERE centres.InsCod='%ld'"
|
" WHERE centres.InsCod='%ld'"
|
||||||
" AND centres.CtrCod=degrees.CtrCod"
|
" AND centres.CtrCod=degrees.CtrCod"
|
||||||
|
@ -868,17 +902,8 @@ static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Ro
|
||||||
(unsigned) Role);
|
(unsigned) Role);
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_CTR: // Show connected users in the current centre
|
case Sco_SCOPE_CTR: // Show connected users in the current centre
|
||||||
if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
" 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.UsrCod=connected.UsrCod"
|
|
||||||
" AND connected.UsrCod=usr_data.UsrCod",
|
|
||||||
Gbl.CurrentCtr.Ctr.CtrCod);
|
|
||||||
else
|
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
|
||||||
" FROM degrees,courses,crs_usr,connected,usr_data"
|
" FROM degrees,courses,crs_usr,connected,usr_data"
|
||||||
" WHERE degrees.CtrCod='%ld'"
|
" WHERE degrees.CtrCod='%ld'"
|
||||||
" AND degrees.DegCod=courses.DegCod"
|
" AND degrees.DegCod=courses.DegCod"
|
||||||
|
@ -890,16 +915,8 @@ static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Ro
|
||||||
(unsigned) Role);
|
(unsigned) Role);
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_DEG: // Show connected users in the current degree
|
case Sco_SCOPE_DEG: // Show connected users in the current degree
|
||||||
if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
" FROM courses,crs_usr,connected,usr_data"
|
|
||||||
" WHERE courses.DegCod='%ld'"
|
|
||||||
" AND courses.CrsCod=crs_usr.CrsCod"
|
|
||||||
" AND crs_usr.UsrCod=connected.UsrCod"
|
|
||||||
" AND connected.UsrCod=usr_data.UsrCod",
|
|
||||||
Gbl.CurrentDeg.Deg.DegCod);
|
|
||||||
else
|
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
|
||||||
" FROM courses,crs_usr,connected,usr_data"
|
" FROM courses,crs_usr,connected,usr_data"
|
||||||
" WHERE courses.DegCod='%ld'"
|
" WHERE courses.DegCod='%ld'"
|
||||||
" AND courses.CrsCod=crs_usr.CrsCod"
|
" AND courses.CrsCod=crs_usr.CrsCod"
|
||||||
|
@ -910,15 +927,8 @@ static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Ro
|
||||||
(unsigned) Role);
|
(unsigned) Role);
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_CRS: // Show connected users in the current course
|
case Sco_SCOPE_CRS: // Show connected users in the current course
|
||||||
if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
|
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
"COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
||||||
" FROM crs_usr,connected,usr_data"
|
|
||||||
" WHERE crs_usr.CrsCod='%ld'"
|
|
||||||
" AND crs_usr.UsrCod=connected.UsrCod"
|
|
||||||
" AND connected.UsrCod=usr_data.UsrCod",
|
|
||||||
Gbl.CurrentCrs.Crs.CrsCod);
|
|
||||||
else
|
|
||||||
sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
|
|
||||||
" FROM crs_usr,connected,usr_data"
|
" FROM crs_usr,connected,usr_data"
|
||||||
" WHERE crs_usr.CrsCod='%ld'"
|
" WHERE crs_usr.CrsCod='%ld'"
|
||||||
" AND crs_usr.Role='%u'"
|
" AND crs_usr.Role='%u'"
|
||||||
|
@ -931,34 +941,37 @@ static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Ro
|
||||||
Lay_ShowErrorAndExit ("Wrong scope.");
|
Lay_ShowErrorAndExit ("Wrong scope.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DB_QuerySELECT (Query,&mysql_res,"can not get number of connected users who belong to this course");
|
break;
|
||||||
|
default:
|
||||||
|
Lay_ShowErrorAndExit ("Wrong role.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DB_QuerySELECT (Query,&mysql_res,"can not get number of connected users who belong to this location");
|
||||||
|
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
/***** Get number of users (row[0]) *****/
|
/***** Get number of users (row[0]) *****/
|
||||||
if (sscanf (row[0],"%u",&NumUsrs) != 1)
|
if (sscanf (row[0],"%u",&(Usrs->NumUsrs)) != 1)
|
||||||
Lay_ShowErrorAndExit ("Error when getting number of connected users who belong to this course.");
|
Lay_ShowErrorAndExit ("Error when getting number of connected users who belong to this location.");
|
||||||
|
|
||||||
/***** Get number of distinct sexs (row[1]) *****/
|
/***** Get number of distinct sexs (row[1]) *****/
|
||||||
if (sscanf (row[1],"%u",&NumSexs) != 1)
|
if (sscanf (row[1],"%u",&NumSexs) != 1)
|
||||||
Lay_ShowErrorAndExit ("Error when getting number of sexs in connected users who belong to this course.");
|
Lay_ShowErrorAndExit ("Error when getting number of sexs in connected users who belong to this location.");
|
||||||
|
|
||||||
/***** Get users' sex (row[2]) *****/
|
/***** Get users' sex (row[2]) *****/
|
||||||
*UsrSex = Usr_SEX_UNKNOWN;
|
Usrs->Sex = Usr_SEX_UNKNOWN;
|
||||||
if (NumSexs == 1)
|
if (NumSexs == 1)
|
||||||
for (Sex = (Usr_Sex_t) 0;
|
for (Sex = (Usr_Sex_t) 0;
|
||||||
Sex < Usr_NUM_SEXS;
|
Sex < Usr_NUM_SEXS;
|
||||||
Sex++)
|
Sex++)
|
||||||
if (!strcasecmp (row[2],Usr_StringsSexDB[Sex]))
|
if (!strcasecmp (row[2],Usr_StringsSexDB[Sex]))
|
||||||
{
|
{
|
||||||
*UsrSex = Sex;
|
Usrs->Sex = Sex;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
mysql_free_result (mysql_res);
|
mysql_free_result (mysql_res);
|
||||||
|
|
||||||
return NumUsrs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -976,11 +989,12 @@ static void Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Rol_Role_t Role
|
||||||
/***** Get connected users who belong to current course from database *****/
|
/***** Get connected users who belong to current course from database *****/
|
||||||
sprintf (Query,"SELECT connected.UsrCod,connected.LastCrsCod,"
|
sprintf (Query,"SELECT connected.UsrCod,connected.LastCrsCod,"
|
||||||
"UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif"
|
"UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif"
|
||||||
" FROM connected,crs_usr,usr_data"
|
" FROM connected,crs_usr"
|
||||||
" WHERE crs_usr.CrsCod='%ld' AND crs_usr.Role='%u'"
|
" WHERE crs_usr.CrsCod='%ld' AND crs_usr.Role='%u'"
|
||||||
" AND crs_usr.UsrCod=connected.UsrCod"
|
" AND crs_usr.UsrCod=connected.UsrCod"
|
||||||
" AND crs_usr.UsrCod=usr_data.UsrCod ORDER BY Dif",
|
" ORDER BY Dif",
|
||||||
Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Role);
|
Gbl.CurrentCrs.Crs.CrsCod,
|
||||||
|
(unsigned) Role);
|
||||||
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get list of connected users who belong to this course");
|
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get list of connected users who belong to this course");
|
||||||
Gbl.Usrs.Connected.NumUsrs += (unsigned) NumRows;
|
Gbl.Usrs.Connected.NumUsrs += (unsigned) NumRows;
|
||||||
Gbl.Usrs.Connected.NumUsrsToList += (unsigned) NumRows;
|
Gbl.Usrs.Connected.NumUsrsToList += (unsigned) NumRows;
|
||||||
|
|
|
@ -43,6 +43,12 @@ typedef enum
|
||||||
Con_SHOW_ON_RIGHT_COLUMN = 1,
|
Con_SHOW_ON_RIGHT_COLUMN = 1,
|
||||||
} Con_WhereToShow_t;
|
} Con_WhereToShow_t;
|
||||||
|
|
||||||
|
struct ConnectedUsrs
|
||||||
|
{
|
||||||
|
unsigned NumUsrs;
|
||||||
|
Usr_Sex_t Sex;
|
||||||
|
};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************************** Public prototypes *****************************/
|
/***************************** Public prototypes *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -53,7 +59,7 @@ void Con_ShowLastClicks (void);
|
||||||
void Con_GetAndShowLastClicks (void);
|
void Con_GetAndShowLastClicks (void);
|
||||||
void Con_ShowGlobalConnectedUsrs (void);
|
void Con_ShowGlobalConnectedUsrs (void);
|
||||||
void Con_ComputeConnectedUsrsBelongingToCurrentCrs (void);
|
void Con_ComputeConnectedUsrsBelongingToCurrentCrs (void);
|
||||||
void Con_ShowConnectedUsrsBelongingToScope (void);
|
void Con_ShowConnectedUsrsBelongingToLocation (void);
|
||||||
void Con_UpdateMeInConnectedList (void);
|
void Con_UpdateMeInConnectedList (void);
|
||||||
void Con_RemoveOldConnected (void);
|
void Con_RemoveOldConnected (void);
|
||||||
|
|
||||||
|
|
|
@ -365,13 +365,10 @@ struct Globals
|
||||||
{
|
{
|
||||||
Con_WhereToShow_t WhereToShow;
|
Con_WhereToShow_t WhereToShow;
|
||||||
unsigned long TimeToRefreshInMs;
|
unsigned long TimeToRefreshInMs;
|
||||||
unsigned NumTchs;
|
|
||||||
unsigned NumStds;
|
|
||||||
unsigned SexTchs;
|
|
||||||
unsigned SexStds;
|
|
||||||
unsigned NumUsr;
|
unsigned NumUsr;
|
||||||
unsigned NumUsrs;
|
unsigned NumUsrs;
|
||||||
unsigned NumUsrsToList;
|
unsigned NumUsrsToList;
|
||||||
|
struct ConnectedUsrs Usrs[Rol_NUM_ROLES];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
long UsrCod;
|
long UsrCod;
|
||||||
|
|
|
@ -117,11 +117,7 @@ void Lay_WriteStartOfPage (void)
|
||||||
Gbl.Layout.HTMLStartWritten)
|
Gbl.Layout.HTMLStartWritten)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/***** Compute connected users *****/
|
/***** Compute connected users to be displayed in right columns *****/
|
||||||
if (Gbl.CurrentAct == ActLstCon ||
|
|
||||||
((Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN) &&
|
|
||||||
Gbl.CurrentCrs.Crs.CrsCod > 0))
|
|
||||||
// Right column visible && There is a course selected
|
|
||||||
Con_ComputeConnectedUsrsBelongingToCurrentCrs ();
|
Con_ComputeConnectedUsrsBelongingToCurrentCrs ();
|
||||||
|
|
||||||
/***** Send head width the file type for the HTTP protocol *****/
|
/***** Send head width the file type for the HTTP protocol *****/
|
||||||
|
@ -888,7 +884,7 @@ static void Lay_ShowRightColumn (void)
|
||||||
if (Gbl.CurrentCrs.Crs.CrsCod > 0) // There is a course selected
|
if (Gbl.CurrentCrs.Crs.CrsCod > 0) // There is a course selected
|
||||||
{
|
{
|
||||||
Gbl.Scope.Current = Sco_SCOPE_CRS;
|
Gbl.Scope.Current = Sco_SCOPE_CRS;
|
||||||
Con_ShowConnectedUsrsBelongingToScope ();
|
Con_ShowConnectedUsrsBelongingToLocation ();
|
||||||
}
|
}
|
||||||
fprintf (Gbl.F.Out,"</div>"); // Used for AJAX based refresh
|
fprintf (Gbl.F.Out,"</div>"); // Used for AJAX based refresh
|
||||||
|
|
||||||
|
@ -1432,7 +1428,7 @@ void Lay_RefreshNotifsAndConnected (void)
|
||||||
if (ShowConnected)
|
if (ShowConnected)
|
||||||
{
|
{
|
||||||
Gbl.Scope.Current = Sco_SCOPE_CRS;
|
Gbl.Scope.Current = Sco_SCOPE_CRS;
|
||||||
Con_ShowConnectedUsrsBelongingToScope ();
|
Con_ShowConnectedUsrsBelongingToLocation ();
|
||||||
}
|
}
|
||||||
fprintf (Gbl.F.Out,"|");
|
fprintf (Gbl.F.Out,"|");
|
||||||
if (ShowConnected)
|
if (ShowConnected)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user