Version 16.230

This commit is contained in:
Antonio Cañas Vargas 2017-05-30 21:43:05 +02:00
parent b9f049c97f
commit 4fc74a80ad
15 changed files with 400 additions and 208 deletions

View File

@ -5186,7 +5186,7 @@ void Act_AdjustCurrentAction (void)
/* If there are some group types with mandatory enrolment and groups in this course, /* If there are some group types with mandatory enrolment and groups in this course,
and I don't belong to any of those groups, and I don't belong to any of those groups,
the the only action possible is show a form to register in groups */ the the only action possible is show a form to register in groups */
if (Grp_NumGrpTypesMandatIDontBelong ()) // To do: if this query is too slow ==> put it only when login. if (Grp_NumGrpTypesMandatIDontBelongAsStd ()) // To do: if this query is too slow ==> put it only when login.
{ {
Gbl.Action.Act = ActReqSelGrp; Gbl.Action.Act = ActReqSelGrp;
Tab_SetCurrentTab (); Tab_SetCurrentTab ();

View File

@ -2518,8 +2518,7 @@ static void Ctr_PutHeadCentresForSeeing (bool OrderSelectable)
extern const char *Txt_Place; extern const char *Txt_Place;
extern const char *Txt_Degrees_ABBREVIATION; extern const char *Txt_Degrees_ABBREVIATION;
extern const char *Txt_Courses_ABBREVIATION; extern const char *Txt_Courses_ABBREVIATION;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
Ctr_Order_t Order; Ctr_Order_t Order;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -2567,7 +2566,8 @@ static void Ctr_PutHeadCentresForSeeing (bool OrderSelectable)
Txt_Place, Txt_Place,
Txt_Degrees_ABBREVIATION, Txt_Degrees_ABBREVIATION,
Txt_Courses_ABBREVIATION, Txt_Courses_ABBREVIATION,
Txt_Teachers_ABBREVIATION,Txt_Students_ABBREVIATION); Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD]);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2583,8 +2583,7 @@ static void Ctr_PutHeadCentresForEdition (void)
extern const char *Txt_WWW; extern const char *Txt_WWW;
extern const char *Txt_Users; extern const char *Txt_Users;
extern const char *Txt_Degrees_ABBREVIATION; extern const char *Txt_Degrees_ABBREVIATION;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
extern const char *Txt_Requester; extern const char *Txt_Requester;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -2627,7 +2626,8 @@ static void Ctr_PutHeadCentresForEdition (void)
Txt_WWW, Txt_WWW,
Txt_Users, Txt_Users,
Txt_Degrees_ABBREVIATION, Txt_Degrees_ABBREVIATION,
Txt_Teachers_ABBREVIATION,Txt_Students_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD],
Txt_Requester); Txt_Requester);
} }

View File

@ -231,13 +231,14 @@
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.229.1 (2017-05-30)" #define Log_PLATFORM_VERSION "SWAD 16.230 (2017-05-30)"
#define CSS_FILE "swad16.226.css" #define CSS_FILE "swad16.226.css"
#define JS_FILE "swad16.206.3.js" #define JS_FILE "swad16.206.3.js"
// 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 16.230: May 30, 2017 Number of teachers and non-editing teachers in list of groups. (220953 lines)
Version 16.229.1: May 30, 2017 Code refactoring in selection of groups. Version 16.229.1: May 30, 2017 Code refactoring in selection of groups.
Fixed bug when printing list of teachers. (220762 lines) Fixed bug when printing list of teachers. (220762 lines)
Version 16.229: May 30, 2017 Selection of groups also for listing of teachers. (220748 lines) Version 16.229: May 30, 2017 Selection of groups also for listing of teachers. (220748 lines)

View File

@ -104,8 +104,7 @@ void Cht_ShowListOfAvailableChatRooms (void)
extern const char *Txt_SEX_PLURAL_Abc[Usr_NUM_SEXS]; extern const char *Txt_SEX_PLURAL_Abc[Usr_NUM_SEXS];
extern const char *Txt_SEX_PLURAL_abc[Usr_NUM_SEXS]; extern const char *Txt_SEX_PLURAL_abc[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_Students_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Teachers_ABBREVIATION;
extern const char *Txt_Degree; extern const char *Txt_Degree;
extern const char *Txt_Course; extern const char *Txt_Course;
bool IsLastItemInLevel[1 + Cht_CHAT_MAX_LEVELS]; bool IsLastItemInLevel[1 + Cht_CHAT_MAX_LEVELS];
@ -158,7 +157,7 @@ void Cht_ShowListOfAvailableChatRooms (void)
case Rol_STD: case Rol_STD:
sprintf (ThisRoomFullName,"%s (%s)", sprintf (ThisRoomFullName,"%s (%s)",
Txt_General,Txt_ROLES_PLURAL_abc[Rol_STD][Usr_SEX_ALL]); Txt_General,Txt_ROLES_PLURAL_abc[Rol_STD][Usr_SEX_ALL]);
Cht_WriteLinkToChat1 ("GBL_STD",Txt_Students_ABBREVIATION,ThisRoomFullName,1,IsLastItemInLevel); Cht_WriteLinkToChat1 ("GBL_STD",Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD],ThisRoomFullName,1,IsLastItemInLevel);
fprintf (Gbl.F.Out,"<img src=\"%s/chat64x64.gif\"" fprintf (Gbl.F.Out,"<img src=\"%s/chat64x64.gif\""
" alt=\"%s\" title=\"%s\"" " alt=\"%s\" title=\"%s\""
" class=\"ICO20x20\" />", " class=\"ICO20x20\" />",
@ -170,7 +169,7 @@ void Cht_ShowListOfAvailableChatRooms (void)
case Rol_TCH: case Rol_TCH:
sprintf (ThisRoomFullName,"%s (%s)", sprintf (ThisRoomFullName,"%s (%s)",
Txt_General,Txt_ROLES_PLURAL_abc[Rol_TCH][Usr_SEX_ALL]); Txt_General,Txt_ROLES_PLURAL_abc[Rol_TCH][Usr_SEX_ALL]);
Cht_WriteLinkToChat1 ("GBL_TCH",Txt_Teachers_ABBREVIATION,ThisRoomFullName,1,IsLastItemInLevel); Cht_WriteLinkToChat1 ("GBL_TCH",Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],ThisRoomFullName,1,IsLastItemInLevel);
fprintf (Gbl.F.Out,"<img src=\"%s/chat64x64.gif\"" fprintf (Gbl.F.Out,"<img src=\"%s/chat64x64.gif\""
" alt=\"%s\" title=\"%s\"" " alt=\"%s\" title=\"%s\""
" class=\"ICO20x20\" />", " class=\"ICO20x20\" />",
@ -392,8 +391,7 @@ void Cht_OpenChatWindow (void)
extern const char *Txt_SEX_PLURAL_abc[Usr_NUM_SEXS]; extern const char *Txt_SEX_PLURAL_abc[Usr_NUM_SEXS];
extern const char *Txt_General; extern const char *Txt_General;
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_Students_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Teachers_ABBREVIATION;
extern const char *Txt_Degree; extern const char *Txt_Degree;
extern const char *Txt_Course; extern const char *Txt_Course;
char RoomCode[Cht_MAX_BYTES_ROOM_CODE + 1]; char RoomCode[Cht_MAX_BYTES_ROOM_CODE + 1];
@ -471,7 +469,7 @@ void Cht_OpenChatWindow (void)
Str_Concat (ListRoomCodes,"|#GBL_STD", Str_Concat (ListRoomCodes,"|#GBL_STD",
Cht_MAX_BYTES_ROOM_CODES); Cht_MAX_BYTES_ROOM_CODES);
sprintf (RoomShrtName,"|%s",Txt_Students_ABBREVIATION); sprintf (RoomShrtName,"|%s",Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD]);
Str_Concat (ListRoomShrtNames,RoomShrtName, Str_Concat (ListRoomShrtNames,RoomShrtName,
Cht_MAX_BYTES_ROOM_SHRT_NAMES); Cht_MAX_BYTES_ROOM_SHRT_NAMES);
@ -488,7 +486,7 @@ void Cht_OpenChatWindow (void)
Str_Concat (ListRoomCodes,"|#GBL_TCH", Str_Concat (ListRoomCodes,"|#GBL_TCH",
Cht_MAX_BYTES_ROOM_CODES); Cht_MAX_BYTES_ROOM_CODES);
sprintf (RoomShrtName,"|%s",Txt_Teachers_ABBREVIATION); sprintf (RoomShrtName,"|%s",Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH]);
Str_Concat (ListRoomShrtNames,RoomShrtName, Str_Concat (ListRoomShrtNames,RoomShrtName,
Cht_MAX_BYTES_ROOM_SHRT_NAMES); Cht_MAX_BYTES_ROOM_SHRT_NAMES);

View File

@ -620,8 +620,7 @@ static void Cty_PutHeadCountriesForSeeing (bool OrderSelectable)
extern const char *Txt_Centres_ABBREVIATION; extern const char *Txt_Centres_ABBREVIATION;
extern const char *Txt_Degrees_ABBREVIATION; extern const char *Txt_Degrees_ABBREVIATION;
extern const char *Txt_Courses_ABBREVIATION; extern const char *Txt_Courses_ABBREVIATION;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
Cty_Order_t Order; Cty_Order_t Order;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -671,7 +670,8 @@ static void Cty_PutHeadCountriesForSeeing (bool OrderSelectable)
Txt_Centres_ABBREVIATION, Txt_Centres_ABBREVIATION,
Txt_Degrees_ABBREVIATION, Txt_Degrees_ABBREVIATION,
Txt_Courses_ABBREVIATION, Txt_Courses_ABBREVIATION,
Txt_Teachers_ABBREVIATION,Txt_Students_ABBREVIATION); Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD]);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -1724,8 +1724,7 @@ static void Crs_PutHeadCoursesForSeeing (void)
extern const char *Txt_Institutional_BR_code; extern const char *Txt_Institutional_BR_code;
extern const char *Txt_Year_OF_A_DEGREE; extern const char *Txt_Year_OF_A_DEGREE;
extern const char *Txt_Course; extern const char *Txt_Course;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<th class=\"BM\"></th>" "<th class=\"BM\"></th>"
@ -1750,8 +1749,8 @@ static void Crs_PutHeadCoursesForSeeing (void)
Txt_Institutional_BR_code, Txt_Institutional_BR_code,
Txt_Year_OF_A_DEGREE, Txt_Year_OF_A_DEGREE,
Txt_Course, Txt_Course,
Txt_Teachers_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_Students_ABBREVIATION); Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD]);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1766,8 +1765,7 @@ static void Crs_PutHeadCoursesForEdition (void)
extern const char *Txt_Year_OF_A_DEGREE; extern const char *Txt_Year_OF_A_DEGREE;
extern const char *Txt_Short_name_of_the_course; extern const char *Txt_Short_name_of_the_course;
extern const char *Txt_Full_name_of_the_course; extern const char *Txt_Full_name_of_the_course;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
extern const char *Txt_Requester; extern const char *Txt_Requester;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -1804,8 +1802,8 @@ static void Crs_PutHeadCoursesForEdition (void)
Txt_Year_OF_A_DEGREE, Txt_Year_OF_A_DEGREE,
Txt_Short_name_of_the_course, Txt_Short_name_of_the_course,
Txt_Full_name_of_the_course, Txt_Full_name_of_the_course,
Txt_Teachers_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_Students_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD],
Txt_Requester); Txt_Requester);
} }
@ -2963,8 +2961,7 @@ void Crs_GetAndWriteCrssOfAUsr (const struct UsrData *UsrDat,Rol_Role_t Role)
extern const char *Txt_Degree; extern const char *Txt_Degree;
extern const char *Txt_Year_OF_A_DEGREE; extern const char *Txt_Year_OF_A_DEGREE;
extern const char *Txt_Course; extern const char *Txt_Course;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
char SubQuery[32]; char SubQuery[32];
char Query[1024]; char Query[1024];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
@ -3023,8 +3020,8 @@ void Crs_GetAndWriteCrssOfAUsr (const struct UsrData *UsrDat,Rol_Role_t Role)
Txt_Degree, Txt_Degree,
Txt_Year_OF_A_DEGREE, Txt_Year_OF_A_DEGREE,
Txt_Course, Txt_Course,
Txt_Teachers_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_Students_ABBREVIATION); Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD]);
/* Write courses */ /* Write courses */
for (NumCrs = 1; for (NumCrs = 1;
@ -3058,8 +3055,7 @@ unsigned Crs_ListCrssFound (const char *Query)
extern const char *Txt_Degree; extern const char *Txt_Degree;
extern const char *Txt_Year_OF_A_DEGREE; extern const char *Txt_Year_OF_A_DEGREE;
extern const char *Txt_Course; extern const char *Txt_Course;
extern const char *Txt_Students_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Teachers_ABBREVIATION;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumCrss; unsigned NumCrss;
@ -3100,8 +3096,8 @@ unsigned Crs_ListCrssFound (const char *Query)
Txt_Degree, Txt_Degree,
Txt_Year_OF_A_DEGREE, Txt_Year_OF_A_DEGREE,
Txt_Course, Txt_Course,
Txt_Students_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD],
Txt_Teachers_ABBREVIATION); Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH]);
/* Write courses */ /* Write courses */
for (NumCrs = 1; for (NumCrs = 1;

View File

@ -973,7 +973,7 @@ static void Dpt_PutHeadDepartments (void)
extern const char *Txt_Short_name; extern const char *Txt_Short_name;
extern const char *Txt_Full_name; extern const char *Txt_Full_name;
extern const char *Txt_WWW; extern const char *Txt_WWW;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<th class=\"CENTER_MIDDLE\">" "<th class=\"CENTER_MIDDLE\">"
@ -1002,7 +1002,7 @@ static void Dpt_PutHeadDepartments (void)
Txt_Short_name, Txt_Short_name,
Txt_Full_name, Txt_Full_name,
Txt_WWW, Txt_WWW,
Txt_Teachers_ABBREVIATION); Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH]);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -2265,7 +2265,7 @@ static void Enr_ShowEnrolmentRequestsGivenRoles (unsigned RolesSelected)
extern const char *Txt_Scope; extern const char *Txt_Scope;
extern const char *Txt_Users; extern const char *Txt_Users;
extern const char *Txt_Course; extern const char *Txt_Course;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Requester; extern const char *Txt_Requester;
extern const char *Txt_Role; extern const char *Txt_Role;
extern const char *Txt_Date; extern const char *Txt_Date;
@ -2802,7 +2802,7 @@ static void Enr_ShowEnrolmentRequestsGivenRoles (unsigned RolesSelected)
"<th></th>" "<th></th>"
"</tr>", "</tr>",
Txt_Course, Txt_Course,
Txt_Teachers_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_Requester, Txt_Requester,
Txt_Role, Txt_Role,
Txt_Date); Txt_Date);

View File

@ -104,7 +104,7 @@ static unsigned Grp_CountNumGrpsInThisCrsOfType (long GrpTypCod);
static void Grp_GetDataOfGroupTypeByCod (struct GroupType *GrpTyp); static void Grp_GetDataOfGroupTypeByCod (struct GroupType *GrpTyp);
static bool Grp_GetMultipleEnrolmentOfAGroupType (long GrpTypCod); static bool Grp_GetMultipleEnrolmentOfAGroupType (long GrpTypCod);
static long Grp_GetTypeOfGroupOfAGroup (long GrpCod); static long Grp_GetTypeOfGroupOfAGroup (long GrpCod);
static unsigned Grp_CountNumStdsInNoGrpsOfType (long GrpTypCod); static unsigned Grp_CountNumUsrsInNoGrpsOfType (Rol_Role_t Role,long GrpTypCod);
static long Grp_GetFirstCodGrpStdBelongsTo (long GrpTypCod,long UsrCod); static long Grp_GetFirstCodGrpStdBelongsTo (long GrpTypCod,long UsrCod);
static bool Grp_GetIfGrpIsAvailable (long GrpTypCod); static bool Grp_GetIfGrpIsAvailable (long GrpTypCod);
static void Grp_GetLstCodGrpsUsrBelongs (long CrsCod,long GrpTypCod,long UsrCod, static void Grp_GetLstCodGrpsUsrBelongs (long CrsCod,long GrpTypCod,long UsrCod,
@ -136,7 +136,7 @@ void Grp_WriteNamesOfSelectedGrps (void)
{ {
extern const char *Txt_Group; extern const char *Txt_Group;
extern const char *Txt_Groups; extern const char *Txt_Groups;
extern const char *Txt_students_with_no_group; extern const char *Txt_users_with_no_group;
extern const char *Txt_and; extern const char *Txt_and;
long GrpCod; long GrpCod;
unsigned NumGrpSel; unsigned NumGrpSel;
@ -164,7 +164,7 @@ void Grp_WriteNamesOfSelectedGrps (void)
Grp_GetDataOfGroupTypeByCod (&Gbl.CurrentCrs.Grps.GrpTyp); Grp_GetDataOfGroupTypeByCod (&Gbl.CurrentCrs.Grps.GrpTyp);
fprintf (Gbl.F.Out,"%s (%s)", fprintf (Gbl.F.Out,"%s (%s)",
Gbl.CurrentCrs.Grps.GrpTyp.GrpTypName, Gbl.CurrentCrs.Grps.GrpTyp.GrpTypName,
Txt_students_with_no_group); Txt_users_with_no_group);
} }
if (Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps >= 2) if (Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps >= 2)
@ -772,7 +772,7 @@ bool Grp_ChangeMyGrpsAtomically (struct ListCodGrps *LstGrpsIWant)
if (!((GrpTyp->LstGrps[NumGrpThisType]).Open)) if (!((GrpTyp->LstGrps[NumGrpThisType]).Open))
ITryToRegisterInAClosedGroup = true; ITryToRegisterInAClosedGroup = true;
/* Check if the group is full */ /* Check if the group is full */
else if ((GrpTyp->LstGrps[NumGrpThisType]).NumStudents >= else if ((GrpTyp->LstGrps[NumGrpThisType]).NumUsrs[Rol_STD] >=
(GrpTyp->LstGrps[NumGrpThisType]).MaxStudents) (GrpTyp->LstGrps[NumGrpThisType]).MaxStudents)
ITryToRegisterInFullGroup = true; ITryToRegisterInFullGroup = true;
} }
@ -1412,6 +1412,7 @@ static void Grp_ListGroupsForEdition (void)
struct GroupType *GrpTyp; struct GroupType *GrpTyp;
struct GroupType *GrpTypAux; struct GroupType *GrpTypAux;
struct Group *Grp; struct Group *Grp;
Rol_Role_t Role;
/***** Write heading *****/ /***** Write heading *****/
Lay_StartTableWide (2); Lay_StartTableWide (2);
@ -1512,6 +1513,15 @@ static void Grp_ListGroupsForEdition (void)
Act_FormEnd (); Act_FormEnd ();
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/* Current number of users in this group */
for (Role = Rol_TCH;
Role >= Rol_STD;
Role--)
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE\">"
"%d"
"</td>",
Grp->NumUsrs[Role]);
/* Maximum number of students of the group (row[3]) */ /* Maximum number of students of the group (row[3]) */
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">"); fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Act_FormStartAnchor (ActChgMaxStdGrp,Grp_GROUPS_SECTION_ID); Act_FormStartAnchor (ActChgMaxStdGrp,Grp_GROUPS_SECTION_ID);
@ -1522,14 +1532,8 @@ static void Grp_ListGroupsForEdition (void)
fprintf (Gbl.F.Out,"\" onchange=\"document.getElementById('%s').submit();\" />", fprintf (Gbl.F.Out,"\" onchange=\"document.getElementById('%s').submit();\" />",
Gbl.Form.Id); Gbl.Form.Id);
Act_FormEnd (); Act_FormEnd ();
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>"
"</tr>");
/* Current number of students in this group */
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE\">"
"%d"
"</td>"
"</tr>",
Grp->NumStudents);
} }
} }
@ -1546,8 +1550,9 @@ static void Grp_WriteHeadingGroups (void)
extern const char *Txt_Type_BR_of_group; extern const char *Txt_Type_BR_of_group;
extern const char *Txt_Group_name; extern const char *Txt_Group_name;
extern const char *Txt_eg_A_B; extern const char *Txt_eg_A_B;
extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Max_BR_students; extern const char *Txt_Max_BR_students;
extern const char *Txt_Students_ABBREVIATION; Rol_Role_t Role;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<th class=\"BM\"></th>" "<th class=\"BM\"></th>"
@ -1558,18 +1563,21 @@ static void Grp_WriteHeadingGroups (void)
"</th>" "</th>"
"<th class=\"CENTER_MIDDLE\">" "<th class=\"CENTER_MIDDLE\">"
"%s<br />(%s)" "%s<br />(%s)"
"</th>" "</th>",
"<th class=\"CENTER_MIDDLE\">" Txt_Type_BR_of_group,
"%s" Txt_Group_name,Txt_eg_A_B);
"</th>" for (Role = Rol_TCH;
"<th class=\"CENTER_MIDDLE\">" Role >= Rol_STD;
Role--)
fprintf (Gbl.F.Out,"<th class=\"CENTER_MIDDLE\">"
"%s"
"</th>",
Txt_ROLES_PLURAL_BRIEF_Abc[Role]);
fprintf (Gbl.F.Out,"<th class=\"CENTER_MIDDLE\">"
"%s" "%s"
"</th>" "</th>"
"</tr>", "</tr>",
Txt_Type_BR_of_group, Txt_Max_BR_students);
Txt_Group_name,Txt_eg_A_B,
Txt_Max_BR_students,
Txt_Students_ABBREVIATION);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1857,7 +1865,7 @@ static bool Grp_ListGrpsForChange (struct GroupType *GrpTyp,
if (Grp->Open) // If group is open if (Grp->Open) // If group is open
{ {
if (IBelongToThisGroup || // I belong to group if (IBelongToThisGroup || // I belong to group
Grp->NumStudents < Grp->MaxStudents) // Group is not full Grp->NumUsrs[Rol_STD] < Grp->MaxStudents) // Group is not full
ICanChangeMySelection = true; // I can register/unregister in this group ICanChangeMySelection = true; // I can register/unregister in this group
else // I don't belong to group and it's full else // I don't belong to group and it's full
fprintf (Gbl.F.Out," disabled=\"disabled\""); // I can not register in this group fprintf (Gbl.F.Out," disabled=\"disabled\""); // I can not register in this group
@ -1990,12 +1998,13 @@ static void Grp_ListGrpsToAddOrRemUsrs (struct GroupType *GrpTyp,long UsrCod)
static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp) static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp)
{ {
extern const char *Txt_students_with_no_group; extern const char *Txt_users_with_no_group;
unsigned NumGrpThisType; unsigned NumGrpThisType;
unsigned NumGrpSel; unsigned NumGrpSel;
struct ListCodGrps LstGrpsIBelong; struct ListCodGrps LstGrpsIBelong;
bool IBelongToThisGroup; bool IBelongToThisGroup;
struct Group *Grp; struct Group *Grp;
Rol_Role_t Role;
/***** Write heading *****/ /***** Write heading *****/
Grp_WriteGrpHead (GrpTyp); Grp_WriteGrpHead (GrpTyp);
@ -2071,20 +2080,24 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp)
"</td>"); "</td>");
/* Group name = students with no group */ /* Group name = students with no group */
fprintf (Gbl.F.Out,"<td colspan=\"2\" class=\"DAT LEFT_MIDDLE\">" fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE\">"
"<label for=\"Grp%ld\">%s</label>" "<label for=\"Grp%ld\">%s</label>"
"</td>", "</td>",
-(GrpTyp->GrpTypCod),Txt_students_with_no_group); -(GrpTyp->GrpTypCod),Txt_users_with_no_group);
/* Number of students who don't belong to any group of this type */ /* Number of students who don't belong to any group of this type */
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE\">" for (Role = Rol_TCH;
"%u" Role >= Rol_STD;
"</td>", Role--)
Grp_CountNumStdsInNoGrpsOfType (GrpTyp->GrpTypCod)); fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE\">"
"%u"
"</td>",
Grp_CountNumUsrsInNoGrpsOfType (Role,GrpTyp->GrpTypCod));
/* Last column */ /* Last void columns for max. students and vacants */
fprintf (Gbl.F.Out,"<td></td>" fprintf (Gbl.F.Out,"<td></td>"
"</tr>"); "<td></td>"
"</tr>");
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2097,9 +2110,10 @@ static void Grp_WriteGrpHead (struct GroupType *GrpTyp)
extern const char *Txt_Today; extern const char *Txt_Today;
extern const char *Txt_Group; extern const char *Txt_Group;
extern const char *Txt_Max_BR_students; extern const char *Txt_Max_BR_students;
extern const char *Txt_Students_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Vacants; extern const char *Txt_Vacants;
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
Rol_Role_t Role;
/***** Name of group type *****/ /***** Name of group type *****/
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -2128,20 +2142,23 @@ static void Grp_WriteGrpHead (struct GroupType *GrpTyp)
"<th colspan=\"2\"></th>" "<th colspan=\"2\"></th>"
"<th class=\"LEFT_MIDDLE\">" "<th class=\"LEFT_MIDDLE\">"
"%s" "%s"
"</th>" "</th>",
"<th class=\"CENTER_MIDDLE\">" Txt_Group);
"%s" for (Role = Rol_TCH;
"</th>" Role >= Rol_STD;
"<th class=\"CENTER_MIDDLE\">" Role--)
fprintf (Gbl.F.Out,"<th class=\"CENTER_MIDDLE\">"
"%s"
"</th>",
Txt_ROLES_PLURAL_BRIEF_Abc[Role]);
fprintf (Gbl.F.Out,"<th class=\"CENTER_MIDDLE\">"
"%s" "%s"
"</th>" "</th>"
"<th class=\"CENTER_MIDDLE\">" "<th class=\"CENTER_MIDDLE\">"
"%s" "%s"
"</th>" "</th>"
"</tr>", "</tr>",
Txt_Group,
Txt_Max_BR_students, Txt_Max_BR_students,
Txt_Students_ABBREVIATION,
Txt_Vacants); Txt_Vacants);
} }
@ -2154,6 +2171,7 @@ static void Grp_WriteRowGrp (struct Group *Grp,bool Highlight)
extern const char *Txt_Group_X_open; extern const char *Txt_Group_X_open;
extern const char *Txt_Group_X_closed; extern const char *Txt_Group_X_closed;
int Vacant; int Vacant;
Rol_Role_t Role;
/***** Write icon to show if group is open or closed *****/ /***** Write icon to show if group is open or closed *****/
sprintf (Gbl.Title,Grp->Open ? Txt_Group_X_open : sprintf (Gbl.Title,Grp->Open ? Txt_Group_X_open :
@ -2184,6 +2202,20 @@ static void Grp_WriteRowGrp (struct Group *Grp,bool Highlight)
Grp->GrpCod, Grp->GrpCod,
Grp->GrpName); Grp->GrpName);
/***** Current number of users in this group *****/
for (Role = Rol_TCH;
Role >= Rol_STD;
Role--)
{
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE");
if (Highlight)
fprintf (Gbl.F.Out," LIGHT_BLUE");
fprintf (Gbl.F.Out,"\">"
"%d"
"</td>",
Grp->NumUsrs[Role]);
}
/***** Max. number of students in this group *****/ /***** Max. number of students in this group *****/
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE"); fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE");
if (Highlight) if (Highlight)
@ -2193,25 +2225,14 @@ static void Grp_WriteRowGrp (struct Group *Grp,bool Highlight)
fprintf (Gbl.F.Out,"&nbsp;" fprintf (Gbl.F.Out,"&nbsp;"
"</td>"); "</td>");
/***** Current number of students in this group *****/
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE");
if (Highlight)
fprintf (Gbl.F.Out," LIGHT_BLUE");
fprintf (Gbl.F.Out,"\">"
"%d"
"</td>",
Grp->NumStudents);
/***** Vacants in this group *****/ /***** Vacants in this group *****/
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE"); fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE");
if (Highlight) if (Highlight)
fprintf (Gbl.F.Out," LIGHT_BLUE"); fprintf (Gbl.F.Out," LIGHT_BLUE");
fprintf (Gbl.F.Out,"\">"); fprintf (Gbl.F.Out,"\">");
if (Grp->MaxStudents > Grp_MAX_STUDENTS_IN_A_GROUP) if (Grp->MaxStudents <= Grp_MAX_STUDENTS_IN_A_GROUP)
fprintf (Gbl.F.Out,"-");
else
{ {
Vacant = (int) Grp->MaxStudents - (int) Grp->NumStudents; Vacant = (int) Grp->MaxStudents - (int) Grp->NumUsrs[Rol_STD];
fprintf (Gbl.F.Out,"%u", fprintf (Gbl.F.Out,"%u",
Vacant > 0 ? (unsigned) Vacant : Vacant > 0 ? (unsigned) Vacant :
0); 0);
@ -2346,6 +2367,7 @@ static void Grp_PutFormToCreateGroup (void)
extern const char *Txt_File_zones_disabled; extern const char *Txt_File_zones_disabled;
extern const char *Txt_Create_group; extern const char *Txt_Create_group;
unsigned NumGrpTyp; unsigned NumGrpTyp;
Rol_Role_t Role;
/***** Start form *****/ /***** Start form *****/
Lay_StartSection (Grp_NEW_GROUP_SECTION_ID); Lay_StartSection (Grp_NEW_GROUP_SECTION_ID);
@ -2402,19 +2424,22 @@ static void Grp_PutFormToCreateGroup (void)
"</td>", "</td>",
Grp_MAX_CHARS_GROUP_NAME,Gbl.CurrentCrs.Grps.GrpName); Grp_MAX_CHARS_GROUP_NAME,Gbl.CurrentCrs.Grps.GrpName);
/***** Current number of users in this group *****/
for (Role = Rol_TCH;
Role >= Rol_STD;
Role--)
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE\">"
"0"
"</td>");
/***** Maximum number of students *****/ /***** Maximum number of students *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">" fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">"
"<input type=\"text\" name=\"MaxStudents\"" "<input type=\"text\" name=\"MaxStudents\""
" size=\"3\" maxlength=\"10\" value=\""); " size=\"3\" maxlength=\"10\" value=\"");
Grp_WriteMaxStdsGrp (Gbl.CurrentCrs.Grps.MaxStudents); Grp_WriteMaxStdsGrp (Gbl.CurrentCrs.Grps.MaxStudents);
fprintf (Gbl.F.Out,"\" />" fprintf (Gbl.F.Out,"\" />"
"</td>"); "</td>"
"</tr>");
/***** Current number of students in this group *****/
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_MIDDLE\">"
"0" // It's a new group ==> 0 students
"</td>"
"</tr>");
/***** Send button and end frame *****/ /***** Send button and end frame *****/
Lay_EndRoundFrameTableWithButton (Lay_CREATE_BUTTON,Txt_Create_group); Lay_EndRoundFrameTableWithButton (Lay_CREATE_BUTTON,Txt_Create_group);
@ -2600,6 +2625,7 @@ void Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_WhichGroupTypes_t WhichGroupTypes)
unsigned long NumRows; unsigned long NumRows;
struct GroupType *GrpTyp; struct GroupType *GrpTyp;
struct Group *Grp; struct Group *Grp;
Rol_Role_t Role;
/***** First we get the list of group types *****/ /***** First we get the list of group types *****/
Grp_GetListGrpTypesInThisCrs (WhichGroupTypes); Grp_GetListGrpTypesInThisCrs (WhichGroupTypes);
@ -2640,9 +2666,14 @@ void Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_WhichGroupTypes_t WhichGroupTypes)
Str_Copy (Grp->GrpName,row[1], Str_Copy (Grp->GrpName,row[1],
Grp_MAX_BYTES_GROUP_NAME); Grp_MAX_BYTES_GROUP_NAME);
/* Get max number of students of group (row[2]) and number of current students */ /* Get max number of students of group (row[2]) */
Grp->MaxStudents = Grp_ConvertToNumMaxStdsGrp (row[2]); Grp->MaxStudents = Grp_ConvertToNumMaxStdsGrp (row[2]);
Grp->NumStudents = Grp_CountNumStdsInGrp (Grp->GrpCod);
/* Get number of current users in group */
for (Role = Rol_TCH;
Role >= Rol_STD;
Role--)
Grp->NumUsrs[Role] = Grp_CountNumUsrsInGrp (Role,Grp->GrpCod);
/* Get whether group is open ('Y') or closed ('N') (row[3]) */ /* Get whether group is open ('Y') or closed ('N') (row[3]) */
Grp->Open = (row[3][0] == 'Y'); Grp->Open = (row[3][0] == 'Y');
@ -2938,10 +2969,10 @@ bool Grp_CheckIfGroupBelongsToCourse (long GrpCod,long CrsCod)
} }
/*****************************************************************************/ /*****************************************************************************/
/******************** Count number of students in a group ********************/ /********************* Count number of users in a group **********************/
/*****************************************************************************/ /*****************************************************************************/
unsigned Grp_CountNumStdsInGrp (long GrpCod) unsigned Grp_CountNumUsrsInGrp (Rol_Role_t Role,long GrpCod)
{ {
char Query[512]; char Query[512];
@ -2954,23 +2985,23 @@ unsigned Grp_CountNumStdsInGrp (long GrpCod)
" AND crs_grp_types.CrsCod=crs_usr.CrsCod" " AND crs_grp_types.CrsCod=crs_usr.CrsCod"
" AND crs_grp_usr.UsrCod=crs_usr.UsrCod" " AND crs_grp_usr.UsrCod=crs_usr.UsrCod"
" AND crs_usr.Role=%u", " AND crs_usr.Role=%u",
GrpCod,(unsigned) Rol_STD); GrpCod,(unsigned) Role);
return (unsigned) DB_QueryCOUNT (Query, return (unsigned) DB_QueryCOUNT (Query,
"can not get number of students in a group"); "can not get number of users in a group");
} }
/*****************************************************************************/ /*****************************************************************************/
/** Count # of students of current course not belonging to groups of a type **/ /*** Count # of users of current course not belonging to groups of a type ****/
/*****************************************************************************/ /*****************************************************************************/
static unsigned Grp_CountNumStdsInNoGrpsOfType (long GrpTypCod) static unsigned Grp_CountNumUsrsInNoGrpsOfType (Rol_Role_t Role,long GrpTypCod)
{ {
char Query[512]; char Query[512];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumStds; unsigned NumUsrs;
/***** Get number of students not belonging to groups of a type from database ******/ /***** Get number of users not belonging to groups of a type ******/
sprintf (Query,"SELECT COUNT(UsrCod) FROM crs_usr" sprintf (Query,"SELECT COUNT(UsrCod) FROM crs_usr"
" WHERE CrsCod=%ld AND Role=%u" " WHERE CrsCod=%ld AND Role=%u"
" AND UsrCod NOT IN" " AND UsrCod NOT IN"
@ -2978,18 +3009,20 @@ static unsigned Grp_CountNumStdsInNoGrpsOfType (long GrpTypCod)
" FROM crs_grp,crs_grp_usr" " FROM crs_grp,crs_grp_usr"
" WHERE crs_grp.GrpTypCod=%ld" " WHERE crs_grp.GrpTypCod=%ld"
" AND crs_grp.GrpCod=crs_grp_usr.GrpCod)", " AND crs_grp.GrpCod=crs_grp_usr.GrpCod)",
Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Rol_STD,GrpTypCod); Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Role,GrpTypCod);
DB_QuerySELECT (Query,&mysql_res,"can not get the number of students not belonging to groups of a type"); DB_QuerySELECT (Query,&mysql_res,"can not get the number of users"
" not belonging to groups of a type");
/***** Get the number of students (row[0]) *****/ /***** Get the number of users (row[0]) *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%u",&NumStds) != 1) if (sscanf (row[0],"%u",&NumUsrs) != 1)
Lay_ShowErrorAndExit ("Error when getting the number of students not belonging to groups of a type."); Lay_ShowErrorAndExit ("Error when getting the number of users"
" not belonging to groups of a type.");
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);
return NumStds; return NumUsrs;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -3053,12 +3086,13 @@ bool Grp_GetIfIBelongToGrp (long GrpCod)
/**** and I don't belong to any of these groups as student *****/ /**** and I don't belong to any of these groups as student *****/
/*****************************************************************************/ /*****************************************************************************/
unsigned Grp_NumGrpTypesMandatIDontBelong (void) unsigned Grp_NumGrpTypesMandatIDontBelongAsStd (void)
{ {
char Query[4096]; char Query[4096];
unsigned NumGrpTypes; unsigned NumGrpTypes;
/***** Get the number of types of groups with mandatory enrolment which I don't belong to, from database *****/ /***** Get the number of types of groups with mandatory enrolment
which I don't belong to as student, from database *****/
sprintf (Query,"SELECT COUNT(DISTINCT GrpTypCod) FROM" sprintf (Query,"SELECT COUNT(DISTINCT GrpTypCod) FROM"
" (SELECT crs_grp_types.GrpTypCod AS GrpTypCod," " (SELECT crs_grp_types.GrpTypCod AS GrpTypCod,"
"COUNT(*) AS NumStudents," "COUNT(*) AS NumStudents,"
@ -3086,7 +3120,9 @@ unsigned Grp_NumGrpTypesMandatIDontBelong (void)
(unsigned) Rol_STD, (unsigned) Rol_STD,
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod); Gbl.Usrs.Me.UsrDat.UsrCod);
NumGrpTypes = DB_QueryCOUNT (Query,"can not get the number of types of group of mandatory registration to which you don't belong to"); NumGrpTypes = DB_QueryCOUNT (Query,"can not get the number of types of group"
" of mandatory registration"
" to which you don't belong to");
return NumGrpTypes; return NumGrpTypes;
} }
@ -3586,7 +3622,7 @@ static void Grp_AskConfirmRemGrp (void)
Grp_GetDataOfGroupByCod (&GrpDat); Grp_GetDataOfGroupByCod (&GrpDat);
/***** Count number of students in group *****/ /***** Count number of students in group *****/
NumStds = Grp_CountNumStdsInGrp (Gbl.CurrentCrs.Grps.GrpCod); NumStds = Grp_CountNumUsrsInGrp (Rol_STD,Gbl.CurrentCrs.Grps.GrpCod);
/***** Show the form to edit group types again *****/ /***** Show the form to edit group types again *****/
Grp_ReqEditGroupsInternal0 (); Grp_ReqEditGroupsInternal0 ();
@ -4149,9 +4185,7 @@ void Grp_ChangeMaxStdsGrp (void)
static void Grp_WriteMaxStdsGrp (unsigned MaxStudents) static void Grp_WriteMaxStdsGrp (unsigned MaxStudents)
{ {
if (MaxStudents > Grp_MAX_STUDENTS_IN_A_GROUP) if (MaxStudents <= Grp_MAX_STUDENTS_IN_A_GROUP)
fprintf (Gbl.F.Out,"-");
else
fprintf (Gbl.F.Out,"%u",MaxStudents); fprintf (Gbl.F.Out,"%u",MaxStudents);
} }

View File

@ -73,8 +73,8 @@ struct Group
{ {
long GrpCod; // Code of group long GrpCod; // Code of group
char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1]; // Name of group char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1]; // Name of group
unsigned NumUsrs[Rol_NUM_ROLES]; // Number of users in the group
unsigned MaxStudents; unsigned MaxStudents;
unsigned NumStudents; // Number of students in the group
bool Open; // Group is open? bool Open; // Group is open?
bool FileZones; // Group has file zones? bool FileZones; // Group has file zones?
bool ShowFileZone; // Show file zone of this group? bool ShowFileZone; // Show file zone of this group?
@ -165,9 +165,9 @@ unsigned long Grp_GetGrpsOfType (long GrpTypCod,MYSQL_RES **mysql_res);
void Grp_GetDataOfGroupByCod (struct GroupData *GrpDat); void Grp_GetDataOfGroupByCod (struct GroupData *GrpDat);
bool Grp_CheckIfGroupExists (long GrpCod); bool Grp_CheckIfGroupExists (long GrpCod);
bool Grp_CheckIfGroupBelongsToCourse (long GrpCod,long CrsCod); bool Grp_CheckIfGroupBelongsToCourse (long GrpCod,long CrsCod);
unsigned Grp_CountNumStdsInGrp (long GrpCod); unsigned Grp_CountNumUsrsInGrp (Rol_Role_t Role,long GrpCod);
bool Grp_GetIfIBelongToGrp (long GrpCod); bool Grp_GetIfIBelongToGrp (long GrpCod);
unsigned Grp_NumGrpTypesMandatIDontBelong (void); unsigned Grp_NumGrpTypesMandatIDontBelongAsStd (void);
void Grp_GetLstCodGrpsWithFileZonesIBelong (struct ListCodGrps *LstGrps); void Grp_GetLstCodGrpsWithFileZonesIBelong (struct ListCodGrps *LstGrps);
void Grp_GetNamesGrpsStdBelongsTo (long GrpTypCod,long UsrCod,char *GrpNames); void Grp_GetNamesGrpsStdBelongsTo (long GrpTypCod,long UsrCod,char *GrpNames);
void Grp_RecFormNewGrpTyp (void); void Grp_RecFormNewGrpTyp (void);

View File

@ -677,8 +677,7 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
extern const char *Txt_Course; extern const char *Txt_Course;
extern const char *Txt_Institutional_BR_code; extern const char *Txt_Institutional_BR_code;
extern const char *Txt_Web_page_of_the_course; extern const char *Txt_Web_page_of_the_course;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
extern const char *Txt_Indicators; extern const char *Txt_Indicators;
extern const char *Txt_No_INDEX; extern const char *Txt_No_INDEX;
extern const char *Txt_Syllabus_of_the_course; extern const char *Txt_Syllabus_of_the_course;
@ -930,8 +929,8 @@ static void Ind_ShowTableOfCoursesWithIndicators (Ind_IndicatorsLayout_t Indicat
Txt_Course, Txt_Course,
Txt_Institutional_BR_code, Txt_Institutional_BR_code,
Txt_Web_page_of_the_course, Txt_Web_page_of_the_course,
Txt_Teachers_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_Students_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD],
Txt_Indicators, Txt_Indicators,
Txt_No_INDEX, Txt_No_INDEX,

View File

@ -828,8 +828,7 @@ static void Ins_PutHeadInstitutionsForSeeing (bool OrderSelectable)
{ {
extern const char *Txt_INSTITUTIONS_HELP_ORDER[2]; extern const char *Txt_INSTITUTIONS_HELP_ORDER[2];
extern const char *Txt_INSTITUTIONS_ORDER[2]; extern const char *Txt_INSTITUTIONS_ORDER[2];
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
extern const char *Txt_Centres_ABBREVIATION; extern const char *Txt_Centres_ABBREVIATION;
extern const char *Txt_Degrees_ABBREVIATION; extern const char *Txt_Degrees_ABBREVIATION;
extern const char *Txt_Courses_ABBREVIATION; extern const char *Txt_Courses_ABBREVIATION;
@ -885,7 +884,8 @@ static void Ins_PutHeadInstitutionsForSeeing (bool OrderSelectable)
Txt_Degrees_ABBREVIATION, Txt_Degrees_ABBREVIATION,
Txt_Courses_ABBREVIATION, Txt_Courses_ABBREVIATION,
Txt_Departments_ABBREVIATION, Txt_Departments_ABBREVIATION,
Txt_Teachers_ABBREVIATION,Txt_Students_ABBREVIATION); Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD]);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2240,8 +2240,7 @@ static void Ins_PutHeadInstitutionsForEdition (void)
extern const char *Txt_WWW; extern const char *Txt_WWW;
extern const char *Txt_Users; extern const char *Txt_Users;
extern const char *Txt_Centres_ABBREVIATION; extern const char *Txt_Centres_ABBREVIATION;
extern const char *Txt_Teachers_ABBREVIATION; extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
extern const char *Txt_Students_ABBREVIATION;
extern const char *Txt_Requester; extern const char *Txt_Requester;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -2280,7 +2279,8 @@ static void Ins_PutHeadInstitutionsForEdition (void)
Txt_WWW, Txt_WWW,
Txt_Users, Txt_Users,
Txt_Centres_ABBREVIATION, Txt_Centres_ABBREVIATION,
Txt_Teachers_ABBREVIATION,Txt_Students_ABBREVIATION, Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH],
Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD],
Txt_Requester); Txt_Requester);
} }

View File

@ -629,7 +629,7 @@ void Mrk_ShowMyMarks (void)
/* Select a random student from the course */ /* Select a random student from the course */
if (Gbl.CurrentCrs.Grps.GrpCod > 0) // Group zone if (Gbl.CurrentCrs.Grps.GrpCod > 0) // Group zone
{ {
if (Grp_CountNumStdsInGrp (Gbl.CurrentCrs.Grps.GrpCod)) if (Grp_CountNumUsrsInGrp (Rol_STD,Gbl.CurrentCrs.Grps.GrpCod))
{ {
Gbl.Usrs.Other.UsrDat.UsrCod = Usr_GetRamdomStdFromGrp (Gbl.CurrentCrs.Grps.GrpCod); Gbl.Usrs.Other.UsrDat.UsrCod = Usr_GetRamdomStdFromGrp (Gbl.CurrentCrs.Grps.GrpCod);
UsrDat = &Gbl.Usrs.Other.UsrDat; UsrDat = &Gbl.Usrs.Other.UsrDat;

View File

@ -17852,23 +17852,23 @@ const char *Txt_Max_levels =
const char *Txt_Max_BR_students = const char *Txt_Max_BR_students =
#if L==1 #if L==1
"M&agrave;xim<br />d'estud."; "M&agrave;xim<br />d'est.";
#elif L==2 #elif L==2
"Max.<br />Stud."; "Max.<br />Stud.";
#elif L==3 #elif L==3
"Max.<br />stud."; "Max.<br />stud.";
#elif L==4 #elif L==4
"M&aacute;x.<br />estud."; "M&aacute;x.<br />estu.";
#elif L==5 #elif L==5
"Max.<br />&eacute;tud."; "Max.<br />&eacute;tud.";
#elif L==6 #elif L==6
"M&aacute;x.<br />estud."; // Okoteve traducción "M&aacute;x.<br />estu."; // Okoteve traducción
#elif L==7 #elif L==7
"Max.<br />stud."; "Max.<br />stud.";
#elif L==8 #elif L==8
"Max.<br />stud."; "Max.<br />stud.";
#elif L==9 #elif L==9
"M&aacute;x.<br />estud."; "M&aacute;x.<br />estu.";
#endif #endif
const char *Txt_maximum = const char *Txt_maximum =
@ -34589,7 +34589,212 @@ const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS] =
#elif L==9 #elif L==9
"Superutilizadores" "Superutilizadores"
#endif #endif
} }; }
};
const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES] =
{
#if L==1 // Rol_UNK
"Desc."
#elif L==2
"Unbe."
#elif L==3
"Unkn."
#elif L==4
"Desc."
#elif L==5
"Inco."
#elif L==6
"Desc." // Okoteve traducción
#elif L==7
"Scon."
#elif L==8
"Niez."
#elif L==9
"Desc."
#endif
,
#if L==1 // Rol_GST
"Conv."
#elif L==2
"Eing."
#elif L==3
"Gues."
#elif L==4
"Invi."
#elif L==5
"Invi."
#elif L==6
"Invi." // Okoteve traducción
#elif L==7
"Ospi."
#elif L==8
"Zapr."
#elif L==9
"Conv."
#endif
,
#if L==1 // Rol_USR
"Usua."
#elif L==2
"Benu."
#elif L==3
"Users"
#elif L==4
"Usua."
#elif L==5
"Util."
#elif L==6
"Puru."
#elif L==7
"Uten."
#elif L==8
"U&zdot;yt."
#elif L==9
"Util."
#endif
,
#if L==1 // Rol_STD
"Estu."
#elif L==2
"Stud."
#elif L==3
"Stud."
#elif L==4
"Estu."
#elif L==5
"&Eacute;tu."
#elif L==6
"Temi."
#elif L==7
"Stud."
#elif L==8
"Stud."
#elif L==9
"Estu."
#endif
,
#if L==1 // Rol_NET
"Prof.n.e."
#elif L==2
"N.b.Lehr."
#elif L==3
"N.e.teac."
#elif L==4
"Prof.n.e."
#elif L==5
"Ense.n.&eacute;."
#elif L==6
"Mbo'e.n.e." // Okoteve traducción
#elif L==7
"Prof.n.e."
#elif L==8
"Nauc.n.e."
#elif L==9
"Prof.n.e."
#endif
,
#if L==1 // Rol_TCH
"Prof."
#elif L==2
"Lehr."
#elif L==3
"Teac."
#elif L==4
"Prof."
#elif L==5
"Ense."
#elif L==6
"Mbo'e."
#elif L==7
"Prof."
#elif L==8
"Nauc."
#elif L==9
"Prof."
#endif
,
#if L==1 // Rol_DEG_ADM
"Admi."
#elif L==2
"Admi."
#elif L==3
"Admi."
#elif L==4
"Admi."
#elif L==5
"Admi."
#elif L==6
"&Ntilde;ang."
#elif L==7
"Ammi."
#elif L==8
"Admi."
#elif L==9
"Admi."
#endif
,
#if L==1 // Rol_CTR_ADM
"Admi."
#elif L==2
"Admi."
#elif L==3
"Admi."
#elif L==4
"Admi."
#elif L==5
"Admi."
#elif L==6
"&Ntilde;ang."
#elif L==7
"Ammi."
#elif L==8
"Admi."
#elif L==9
"Admi."
#endif
,
#if L==1 // Rol_INS_ADM
"Admi."
#elif L==2
"Admi."
#elif L==3
"Admi."
#elif L==4
"Admi."
#elif L==5
"Admi."
#elif L==6
"&Ntilde;ang."
#elif L==7
"Ammi."
#elif L==8
"Admi."
#elif L==9
"Admi."
#endif
,
#if L==1 // Rol_SYS_ADM
"Supe."
#elif L==2
"Supe."
#elif L==3
"Supe."
#elif L==4
"Supe."
#elif L==5
"Supe."
#elif L==6
"Supe." // Okoteve traducción
#elif L==7
"Supe."
#elif L==8
"Supe."
#elif L==9
"Supe."
#endif
};
const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS] = const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS] =
{ {
@ -35402,7 +35607,8 @@ const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS] =
#elif L==9 #elif L==9
"superutilizadores" "superutilizadores"
#endif #endif
} }; }
};
const char *Txt_Rooms_with_users = const char *Txt_Rooms_with_users =
#if L==1 #if L==1
@ -40166,27 +40372,6 @@ const char *Txt_Student_comment =
"Coment&aacute;rio do estudante"; "Coment&aacute;rio do estudante";
#endif #endif
const char *Txt_Students_ABBREVIATION = // Abbreviation of "Students"
#if L==1
"Estu.";
#elif L==2
"Stud.";
#elif L==3
"Stud.";
#elif L==4
"Estu.";
#elif L==5
"&Eacute;tu.";
#elif L==6
"Temi.";
#elif L==7
"Stud.";
#elif L==8
"Stud."; // Potrzebujesz tlumaczenie
#elif L==9
"Estu.";
#endif
const char *Txt_students_ABBREVIATION = // Abbreviation of "students" const char *Txt_students_ABBREVIATION = // Abbreviation of "students"
#if L==1 #if L==1
"estu."; "estu.";
@ -40352,27 +40537,6 @@ const char *Txt_X_students_who_have_accepted_and_who_have_email = // Warning: it
" e que t&ecirc;m email (%.1f%% dos %u estudantes)"; " e que t&ecirc;m email (%.1f%% dos %u estudantes)";
#endif #endif
const char *Txt_students_with_no_group =
#if L==1
"estudiantes en ning&uacute;n grupo"; // Necessita traduccio
#elif L==2
"Studente mit nicht-Gruppe";
#elif L==3
"students with no group";
#elif L==4
"estudiantes en ning&uacute;n grupo";
#elif L==5
"&eacute;tudiants avec aucun groupe";
#elif L==6
"estudiantes en ning&uacute;n grupo"; // Okoteve traducción
#elif L==7
"studenti con nessun gruppo";
#elif L==8
"students with no group"; // Potrzebujesz tlumaczenie
#elif L==9
"estudantes com nenhum grupo";
#endif
const char *Txt_Surname_1 = const char *Txt_Surname_1 =
#if L==1 #if L==1
"Primer cognom"; "Primer cognom";
@ -41485,27 +41649,6 @@ const char *Txt_Take_a_test =
"Fazer um teste"; "Fazer um teste";
#endif #endif
const char *Txt_Teachers_ABBREVIATION = // Abbreviation of "Teachers"
#if L==1
"Prof.";
#elif L==2
"Lehr.";
#elif L==3
"Teac.";
#elif L==4
"Prof.";
#elif L==5
"Ense.";
#elif L==6
"Prof."; // Okoteve traducción
#elif L==7
"Prof.";
#elif L==8
"Nauc.";
#elif L==9
"Prof.";
#endif
const char *Txt_teachers_ABBREVIATION = // Abbreviation of "Teachers" const char *Txt_teachers_ABBREVIATION = // Abbreviation of "Teachers"
#if L==1 #if L==1
"prof."; "prof.";
@ -50435,6 +50578,27 @@ const char *Txt_Users_of_the_institution =
"Utilizadores da institu&ccedil;&atilde;o"; "Utilizadores da institu&ccedil;&atilde;o";
#endif #endif
const char *Txt_users_with_no_group =
#if L==1
"usuaris en cap grup";
#elif L==2
"Benutzer mit nicht-Gruppe";
#elif L==3
"users with no group";
#elif L==4
"usuarios en ning&uacute;n grupo";
#elif L==5
"utilisateurs avec aucun groupe";
#elif L==6
"usuarios en ning&uacute;n grupo"; // Okoteve traducción
#elif L==7
"utenti con nessun gruppo";
#elif L==8
"u&zdot;ytkownik&oacute;w w ka&zdot;dej grupie";
#elif L==9
"utilizadores com nenhum grupo";
#endif
const char *Txt_usr = // Abbreviation of user (three characters + dot) const char *Txt_usr = // Abbreviation of user (three characters + dot)
#if L==1 #if L==1
"usr."; // Necessita traduccio "usr."; // Necessita traduccio
@ -50517,7 +50681,7 @@ const char *Txt_Vacants =
#elif L==7 #elif L==7
"Liberi"; "Liberi";
#elif L==8 #elif L==8
"Vacants"; // Potrzebujesz tlumaczenie "Wolne";
#elif L==9 #elif L==9
"Desocupados"; "Desocupados";
#endif #endif

View File

@ -1821,7 +1821,7 @@ int swad__getGroups (struct soap *soap,
(int) MaxStudents; (int) MaxStudents;
/* Get number of current students */ /* Get number of current students */
getGroupsOut->groupsArray.__ptr[NumRow].numStudents = (int) Grp_CountNumStdsInGrp (GrpCod); getGroupsOut->groupsArray.__ptr[NumRow].numStudents = (int) Grp_CountNumUsrsInGrp (Rol_STD,GrpCod);
/* Get whether group is open ('Y') or closed ('N') (row[5]) */ /* Get whether group is open ('Y') or closed ('N') (row[5]) */
getGroupsOut->groupsArray.__ptr[NumRow].open = (row[5][0] == 'Y') ? 1 : getGroupsOut->groupsArray.__ptr[NumRow].open = (row[5][0] == 'Y') ? 1 :
@ -1983,7 +1983,7 @@ int swad__sendMyGroups (struct soap *soap,
(int) MaxStudents; (int) MaxStudents;
/* Get number of current students */ /* Get number of current students */
SendMyGroupsOut->groupsArray.__ptr[NumRow].numStudents = (int) Grp_CountNumStdsInGrp (GrpCod); SendMyGroupsOut->groupsArray.__ptr[NumRow].numStudents = (int) Grp_CountNumUsrsInGrp (Rol_STD,GrpCod);
/* Get whether group is open ('Y') or closed ('N') (row[5]) */ /* Get whether group is open ('Y') or closed ('N') (row[5]) */
SendMyGroupsOut->groupsArray.__ptr[NumRow].open = (row[5][0] == 'Y') ? 1 : SendMyGroupsOut->groupsArray.__ptr[NumRow].open = (row[5][0] == 'Y') ? 1 :