Version19.184

This commit is contained in:
acanas 2020-04-14 11:08:23 +02:00
parent 23c7e8baf5
commit d0c4d46c0a
5 changed files with 107 additions and 78 deletions

View File

@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.183.2 (2020-04-14)"
#define Log_PLATFORM_VERSION "SWAD 19.184 (2020-04-14)"
#define CSS_FILE "swad19.146.css"
#define JS_FILE "swad19.172.1.js"
/*
@ -548,6 +548,7 @@ Funci
// TODO: Oresti Baños: cambiar ojos por candados en descriptores para prohibir/permitir y dejar los ojos para poder elegir descriptores
// TODO: Integrar pull requests con traducciones del alemán del usuario eruedin en GitHub
Version 19.184: Apr 14, 2020 Code refactoring in classrooms. (285706 lines)
Version 19.183.2: Apr 14, 2020 Fixed bug in test exams. (285684 lines)
Version 19.183.1: Apr 14, 2020 Fixed bug in forums, reported by Javier Fernández Baldomero. (285677 lines)
Version 19.183: Apr 13, 2020 Code refactoring in holidays. (285689 lines)

View File

@ -54,13 +54,13 @@ extern struct Globals Gbl;
/***************************** Private variables *****************************/
/*****************************************************************************/
static struct Classroom *Cla_EditingCla = NULL; // Static variable to keep the classroom being edited
static struct Cla_Classroom *Cla_EditingCla = NULL; // Static variable to keep the classroom being edited
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static void Cla_GetParamClaOrder (void);
static Cla_Order_t Cla_GetParamClaOrder (void);
static bool Cla_CheckIfICanCreateClassrooms (void);
static void Cla_PutIconsListingClassrooms (__attribute__((unused)) void *Args);
static void Cla_PutIconToEditClassrooms (void);
@ -68,7 +68,7 @@ static void Cla_PutIconsEditingClassrooms (__attribute__((unused)) void *Args);
static void Cla_EditClassroomsInternal (void);
static void Cla_ListClassroomsForEdition (void);
static void Cla_ListClassroomsForEdition (const struct Cla_Classrooms *Classrooms);
static void Cla_PutParamClaCod (long ClaCod);
static void Cla_RenameClassroom (Cns_ShrtOrFullName_t ShrtOrFullName);
@ -79,16 +79,25 @@ static void Cla_WriteCapacity (char Str[Cns_MAX_DECIMAL_DIGITS_UINT + 1],unsigne
static void Cla_PutFormToCreateClassroom (void);
static void Cla_PutHeadClassrooms (void);
static void Cla_CreateClassroom (struct Classroom *Cla);
static void Cla_CreateClassroom (struct Cla_Classroom *Cla);
static void Cla_EditingClassroomConstructor (void);
static void Cla_EditingClassroomDestructor (void);
/*****************************************************************************/
/************************* List all the classrooms ***************************/
/************************* Reset classrooms context **************************/
/*****************************************************************************/
#define A SIZE_MAX
void Cla_ResetClassrooms (struct Cla_Classrooms *Classrooms)
{
Classrooms->Num = 0; // Number of classrooms
Classrooms->Lst = NULL; // List of classrooms
Classrooms->SelectedOrder = Cla_ORDER_DEFAULT;
}
/*****************************************************************************/
/************************* List all the classrooms ***************************/
/*****************************************************************************/
void Cla_SeeClassrooms (void)
{
@ -97,6 +106,7 @@ void Cla_SeeClassrooms (void)
extern const char *Txt_CLASSROOMS_HELP_ORDER[Cla_NUM_ORDERS];
extern const char *Txt_CLASSROOMS_ORDER[Cla_NUM_ORDERS];
extern const char *Txt_New_classroom;
struct Cla_Classrooms Classrooms;
Cla_Order_t Order;
unsigned NumCla;
unsigned RowEvenOdd;
@ -106,11 +116,14 @@ void Cla_SeeClassrooms (void)
if (Gbl.Hierarchy.Ctr.CtrCod <= 0) // No centre selected
return;
/***** Reset classrooms context *****/
Cla_ResetClassrooms (&Classrooms);
/***** Get parameter with the type of order in the list of classrooms *****/
Cla_GetParamClaOrder ();
Classrooms.SelectedOrder = Cla_GetParamClaOrder ();
/***** Get list of classrooms *****/
Cla_GetListClassrooms (Cla_ALL_DATA);
Cla_GetListClassrooms (&Classrooms,Cla_ALL_DATA);
/***** Table head *****/
Box_BoxBegin (NULL,Txt_Classrooms,
@ -126,10 +139,10 @@ void Cla_SeeClassrooms (void)
Frm_StartForm (ActSeeCla);
Par_PutHiddenParamUnsigned (NULL,"Order",(unsigned) Order);
HTM_BUTTON_SUBMIT_Begin (Txt_CLASSROOMS_HELP_ORDER[Order],"BT_LINK TIT_TBL",NULL);
if (Order == Gbl.Classrooms.SelectedOrder)
if (Order == Classrooms.SelectedOrder)
HTM_U_Begin ();
HTM_Txt (Txt_CLASSROOMS_ORDER[Order]);
if (Order == Gbl.Classrooms.SelectedOrder)
if (Order == Classrooms.SelectedOrder)
HTM_U_End ();
HTM_BUTTON_End ();
Frm_EndForm ();
@ -139,30 +152,30 @@ void Cla_SeeClassrooms (void)
/***** Write list of classrooms *****/
for (NumCla = 0, RowEvenOdd = 1;
NumCla < Gbl.Classrooms.Num;
NumCla < Classrooms.Num;
NumCla++, RowEvenOdd = 1 - RowEvenOdd)
{
HTM_TR_Begin (NULL);
/* Short name */
HTM_TD_Begin ("class=\"DAT LM %s\"",Gbl.ColorRows[RowEvenOdd]);
HTM_Txt (Gbl.Classrooms.Lst[NumCla].ShrtName);
HTM_Txt (Classrooms.Lst[NumCla].ShrtName);
HTM_TD_End ();
/* Full name */
HTM_TD_Begin ("class=\"DAT LM %s\"",Gbl.ColorRows[RowEvenOdd]);
HTM_Txt (Gbl.Classrooms.Lst[NumCla].FullName);
HTM_Txt (Classrooms.Lst[NumCla].FullName);
HTM_TD_End ();
/* Capacity */
HTM_TD_Begin ("class=\"DAT RM %s\"",Gbl.ColorRows[RowEvenOdd]);
Cla_WriteCapacity (StrCapacity,Gbl.Classrooms.Lst[NumCla].Capacity);
Cla_WriteCapacity (StrCapacity,Classrooms.Lst[NumCla].Capacity);
HTM_Txt (StrCapacity);
HTM_TD_End ();
/* Location */
HTM_TD_Begin ("class=\"DAT LM %s\"",Gbl.ColorRows[RowEvenOdd]);
HTM_Txt (Gbl.Classrooms.Lst[NumCla].Location);
HTM_Txt (Classrooms.Lst[NumCla].Location);
HTM_TD_End ();
HTM_TR_End ();
@ -183,20 +196,19 @@ void Cla_SeeClassrooms (void)
Box_BoxEnd ();
/***** Free list of classrooms *****/
Cla_FreeListClassrooms ();
Cla_FreeListClassrooms (&Classrooms);
}
/*****************************************************************************/
/******** Get parameter with the type or order in list of classrooms *********/
/*****************************************************************************/
static void Cla_GetParamClaOrder (void)
static Cla_Order_t Cla_GetParamClaOrder (void)
{
Gbl.Classrooms.SelectedOrder = (Cla_Order_t)
Par_GetParToUnsignedLong ("Order",
0,
Cla_NUM_ORDERS - 1,
(unsigned long) Cla_ORDER_DEFAULT);
return (Cla_Order_t) Par_GetParToUnsignedLong ("Order",
0,
Cla_NUM_ORDERS - 1,
(unsigned long) Cla_ORDER_DEFAULT);
}
/*****************************************************************************/
@ -249,9 +261,13 @@ static void Cla_EditClassroomsInternal (void)
{
extern const char *Hlp_CENTRE_Classrooms_edit;
extern const char *Txt_Classrooms;
struct Cla_Classrooms Classrooms;
/***** Reset classrooms context *****/
Cla_ResetClassrooms (&Classrooms);
/***** Get list of classrooms *****/
Cla_GetListClassrooms (Cla_ALL_DATA);
Cla_GetListClassrooms (&Classrooms,Cla_ALL_DATA);
/***** Begin box *****/
Box_BoxBegin (NULL,Txt_Classrooms,
@ -262,14 +278,14 @@ static void Cla_EditClassroomsInternal (void)
Cla_PutFormToCreateClassroom ();
/***** Forms to edit current classrooms *****/
if (Gbl.Classrooms.Num)
Cla_ListClassroomsForEdition ();
if (Classrooms.Num)
Cla_ListClassroomsForEdition (&Classrooms);
/***** End box *****/
Box_BoxEnd ();
/***** Free list of classrooms *****/
Cla_FreeListClassrooms ();
Cla_FreeListClassrooms (&Classrooms);
}
/*****************************************************************************/
@ -300,7 +316,8 @@ void Cla_PutIconToViewClassrooms (void)
/************************** List all the classrooms **************************/
/*****************************************************************************/
void Cla_GetListClassrooms (Cla_WhichData_t WhichData)
void Cla_GetListClassrooms (struct Cla_Classrooms *Classrooms,
Cla_WhichData_t WhichData)
{
static const char *OrderBySubQuery[Cla_NUM_ORDERS] =
{
@ -313,7 +330,7 @@ void Cla_GetListClassrooms (Cla_WhichData_t WhichData)
MYSQL_ROW row;
unsigned long NumRows;
unsigned NumCla;
struct Classroom *Cla;
struct Cla_Classroom *Cla;
/***** Get classrooms from database *****/
switch (WhichData)
@ -329,7 +346,7 @@ void Cla_GetListClassrooms (Cla_WhichData_t WhichData)
" WHERE CtrCod=%ld"
" ORDER BY %s",
Gbl.Hierarchy.Ctr.CtrCod,
OrderBySubQuery[Gbl.Classrooms.SelectedOrder]);
OrderBySubQuery[Classrooms->SelectedOrder]);
break;
case Cla_ONLY_SHRT_NAME:
default:
@ -346,18 +363,20 @@ void Cla_GetListClassrooms (Cla_WhichData_t WhichData)
/***** Count number of rows in result *****/
if (NumRows) // Classrooms found...
{
Gbl.Classrooms.Num = (unsigned) NumRows;
Classrooms->Num = (unsigned) NumRows;
/***** Create list with courses in centre *****/
if ((Gbl.Classrooms.Lst = (struct Classroom *) calloc (NumRows,sizeof (struct Classroom))) == NULL)
if ((Classrooms->Lst = (struct Cla_Classroom *)
calloc (NumRows,
sizeof (struct Cla_Classroom))) == NULL)
Lay_NotEnoughMemoryExit ();
/***** Get the classrooms *****/
for (NumCla = 0;
NumCla < Gbl.Classrooms.Num;
NumCla < Classrooms->Num;
NumCla++)
{
Cla = &(Gbl.Classrooms.Lst[NumCla]);
Cla = &Classrooms->Lst[NumCla];
/* Get next classroom */
row = mysql_fetch_row (mysql_res);
@ -387,7 +406,7 @@ void Cla_GetListClassrooms (Cla_WhichData_t WhichData)
}
}
else
Gbl.Classrooms.Num = 0;
Classrooms->Num = 0;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@ -397,7 +416,7 @@ void Cla_GetListClassrooms (Cla_WhichData_t WhichData)
/************************** Get classroom full name **************************/
/*****************************************************************************/
void Cla_GetDataOfClassroomByCod (struct Classroom *Cla)
void Cla_GetDataOfClassroomByCod (struct Cla_Classroom *Cla)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@ -454,14 +473,14 @@ void Cla_GetDataOfClassroomByCod (struct Classroom *Cla)
/************************** Free list of classrooms **************************/
/*****************************************************************************/
void Cla_FreeListClassrooms (void)
void Cla_FreeListClassrooms (struct Cla_Classrooms *Classrooms)
{
if (Gbl.Classrooms.Lst)
if (Classrooms->Lst)
{
/***** Free memory used by the list of classrooms in institution *****/
free (Gbl.Classrooms.Lst);
Gbl.Classrooms.Lst = NULL;
Gbl.Classrooms.Num = 0;
free (Classrooms->Lst);
Classrooms->Lst = NULL;
Classrooms->Num = 0;
}
}
@ -469,10 +488,10 @@ void Cla_FreeListClassrooms (void)
/************************* List all the classrooms ***************************/
/*****************************************************************************/
static void Cla_ListClassroomsForEdition (void)
static void Cla_ListClassroomsForEdition (const struct Cla_Classrooms *Classrooms)
{
unsigned NumCla;
struct Classroom *Cla;
struct Cla_Classroom *Cla;
char StrCapacity[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
/***** Write heading *****/
@ -481,10 +500,10 @@ static void Cla_ListClassroomsForEdition (void)
/***** Write all the classrooms *****/
for (NumCla = 0;
NumCla < Gbl.Classrooms.Num;
NumCla < Classrooms->Num;
NumCla++)
{
Cla = &Gbl.Classrooms.Lst[NumCla];
Cla = &Classrooms->Lst[NumCla];
HTM_TR_Begin (NULL);
@ -1022,7 +1041,7 @@ void Cla_RecFormNewClassroom (void)
/************************** Create a new classroom ***************************/
/*****************************************************************************/
static void Cla_CreateClassroom (struct Classroom *Cla)
static void Cla_CreateClassroom (struct Cla_Classroom *Cla)
{
/***** Create a new classroom *****/
DB_QueryINSERT ("can not create classroom",
@ -1045,7 +1064,7 @@ static void Cla_EditingClassroomConstructor (void)
Lay_ShowErrorAndExit ("Error initializing classroom.");
/***** Allocate memory for classroom *****/
if ((Cla_EditingCla = (struct Classroom *) malloc (sizeof (struct Classroom))) == NULL)
if ((Cla_EditingCla = (struct Cla_Classroom *) malloc (sizeof (struct Cla_Classroom))) == NULL)
Lay_ShowErrorAndExit ("Error allocating memory for classroom.");
/***** Reset classroom *****/

View File

@ -46,7 +46,7 @@
#define Cla_MAX_CHARS_LOCATION (128 - 1) // 127
#define Cla_MAX_BYTES_LOCATION ((Cla_MAX_CHARS_LOCATION + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
struct Classroom
struct Cla_Classroom
{
long ClaCod;
long InsCod;
@ -73,19 +73,29 @@ typedef enum
Cla_ONLY_SHRT_NAME,
} Cla_WhichData_t;
struct Cla_Classrooms
{
unsigned Num; // Number of classrooms
struct Cla_Classroom *Lst; // List of classrooms
Cla_Order_t SelectedOrder;
};
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Cla_ResetClassrooms (struct Cla_Classrooms *Classrooms);
void Cla_SeeClassrooms (void);
void Cla_EditClassrooms (void);
void Cla_PutIconToViewClassrooms (void);
void Cla_GetListClassrooms (Cla_WhichData_t WhichData);
void Cla_FreeListClassrooms (void);
void Cla_GetListClassrooms (struct Cla_Classrooms *Classrooms,
Cla_WhichData_t WhichData);
void Cla_FreeListClassrooms (struct Cla_Classrooms *Classrooms);
void Cla_GetListClassroomsInThisCtr (void);
void Cla_GetDataOfClassroomByCod (struct Classroom *Cla);
void Cla_GetDataOfClassroomByCod (struct Cla_Classroom *Cla);
long Cla_GetParamClaCod (void);
void Cla_RemoveClassroom (void);

View File

@ -226,12 +226,6 @@ struct Globals
unsigned Num; // Number of degree types
struct DegreeType *Lst; // List of degree types
} DegTypes;
struct
{
unsigned Num; // Number of classrooms
struct Classroom *Lst; // List of classrooms
Cla_Order_t SelectedOrder;
} Classrooms;
struct
{
unsigned Num; // Number of mail domains

View File

@ -96,7 +96,7 @@ static void Grp_ReqEditGroupsInternal2 (Ale_AlertType_t AlertTypeGroups,
const char *AlertTextGroups);
static void Grp_EditGroupTypes (void);
static void Grp_EditGroups (void);
static void Grp_EditGroups (const struct Cla_Classrooms *Classrooms);
static void Grp_PutIconsEditingGroups (__attribute__((unused)) void *Args);
static void Grp_PutIconToCreateNewGroup (void);
@ -116,7 +116,7 @@ static void Grp_PutIconToViewGroups (void);
static void Grp_PutIconToCreateNewGroupType (void);
static void Grp_WriteHeadingGroupTypes (void);
static void Grp_ListGroupsForEdition (void);
static void Grp_ListGroupsForEdition (const struct Cla_Classrooms *Classrooms);
static void Grp_WriteHeadingGroups (void);
static void Grp_PutIconToEditGroups (__attribute__((unused)) void *Args);
@ -129,7 +129,7 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp,
static void Grp_WriteGrpHead (struct GroupType *GrpTyp);
static void Grp_WriteRowGrp (struct Group *Grp,bool Highlight);
static void Grp_PutFormToCreateGroupType (void);
static void Grp_PutFormToCreateGroup (void);
static void Grp_PutFormToCreateGroup (const struct Cla_Classrooms *Classrooms);
static unsigned Grp_CountNumGrpsInThisCrsOfType (long GrpTypCod);
static void Grp_GetDataOfGroupTypeByCod (struct GroupType *GrpTyp);
static bool Grp_GetMultipleEnrolmentOfAGroupType (long GrpTypCod);
@ -235,9 +235,6 @@ static void Grp_ReqEditGroupsInternal1 (Ale_AlertType_t AlertTypeGroupTypes,
/***** Get list of groups types and groups in this course *****/
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ALL_GROUP_TYPES);
/***** Get list of classrooms in this centre *****/
Cla_GetListClassrooms (Cla_ONLY_SHRT_NAME);
/***** Show optional alert *****/
if (AlertTextGroupTypes)
if (AlertTextGroupTypes[0])
@ -256,20 +253,28 @@ static void Grp_ReqEditGroupsInternal1 (Ale_AlertType_t AlertTypeGroupTypes,
static void Grp_ReqEditGroupsInternal2 (Ale_AlertType_t AlertTypeGroups,
const char *AlertTextGroups)
{
struct Cla_Classrooms Classrooms;
/***** Reset classrooms context *****/
Cla_ResetClassrooms (&Classrooms);
/***** Show optional alert *****/
if (AlertTextGroups)
if (AlertTextGroups[0])
Ale_ShowAlert (AlertTypeGroups,AlertTextGroups);
/***** Get list of classrooms in this centre *****/
Cla_GetListClassrooms (&Classrooms,Cla_ONLY_SHRT_NAME);
/***** Put form to edit groups *****/
if (Gbl.Crs.Grps.GrpTypes.Num) // If there are group types...
Grp_EditGroups ();
Grp_EditGroups (&Classrooms);
/***** End groups section *****/
HTM_SECTION_End ();
/***** Free list of classrooms in this centre *****/
Cla_FreeListClassrooms ();
Cla_FreeListClassrooms (&Classrooms);
/***** Free list of groups types and groups in this course *****/
Grp_FreeListGrpTypesAndGrps ();
@ -308,7 +313,7 @@ static void Grp_EditGroupTypes (void)
/**************************** Put forms to edit groups ***********************/
/*****************************************************************************/
static void Grp_EditGroups (void)
static void Grp_EditGroups (const struct Cla_Classrooms *Classrooms)
{
extern const char *Hlp_USERS_Groups;
extern const char *Txt_Groups;
@ -320,11 +325,11 @@ static void Grp_EditGroups (void)
Hlp_USERS_Groups,Box_NOT_CLOSABLE);
/***** Put a form to create a new group *****/
Grp_PutFormToCreateGroup ();
Grp_PutFormToCreateGroup (Classrooms);
/***** Forms to edit current groups *****/
if (Gbl.Crs.Grps.GrpTypes.NumGrpsTotal) // If there are groups...
Grp_ListGroupsForEdition ();
Grp_ListGroupsForEdition (Classrooms);
else // There are group types, but there aren't groups
Ale_ShowAlert (Ale_INFO,Txt_No_groups_have_been_created_in_the_course_X,
Gbl.Hierarchy.Crs.ShrtName);
@ -1468,7 +1473,7 @@ static void Grp_WriteHeadingGroupTypes (void)
/********************** List current groups for edition **********************/
/*****************************************************************************/
static void Grp_ListGroupsForEdition (void)
static void Grp_ListGroupsForEdition (const struct Cla_Classrooms *Classrooms)
{
extern const char *Txt_Group_X_open_click_to_close_it;
extern const char *Txt_Group_X_closed_click_to_open_it;
@ -1595,11 +1600,11 @@ static void Grp_ListGroupsForEdition (void)
/* Options for classrooms */
for (NumCla = 0;
NumCla < Gbl.Classrooms.Num;
NumCla < Classrooms->Num;
NumCla++)
HTM_OPTION (HTM_Type_LONG,&Gbl.Classrooms.Lst[NumCla].ClaCod,
Gbl.Classrooms.Lst[NumCla].ClaCod == Grp->Classroom.ClaCod,false,
"%s",Gbl.Classrooms.Lst[NumCla].ShrtName);
HTM_OPTION (HTM_Type_LONG,&Classrooms->Lst[NumCla].ClaCod,
Classrooms->Lst[NumCla].ClaCod == Grp->Classroom.ClaCod,false,
"%s",Classrooms->Lst[NumCla].ShrtName);
/* End selector */
HTM_SELECT_End ();
@ -2569,7 +2574,7 @@ static void Grp_PutFormToCreateGroupType (void)
/*********************** Put a form to create a new group ********************/
/*****************************************************************************/
static void Grp_PutFormToCreateGroup (void)
static void Grp_PutFormToCreateGroup (const struct Cla_Classrooms *Classrooms)
{
extern const char *Txt_New_group;
extern const char *Txt_Group_closed;
@ -2651,11 +2656,11 @@ static void Grp_PutFormToCreateGroup (void)
/* Options for classrooms */
for (NumCla = 0;
NumCla < Gbl.Classrooms.Num;
NumCla < Classrooms->Num;
NumCla++)
HTM_OPTION (HTM_Type_LONG,&Gbl.Classrooms.Lst[NumCla].ClaCod,
Gbl.Classrooms.Lst[NumCla].ClaCod == Gbl.Crs.Grps.ClaCod,false,
"%s",Gbl.Classrooms.Lst[NumCla].ShrtName);
HTM_OPTION (HTM_Type_LONG,&Classrooms->Lst[NumCla].ClaCod,
Classrooms->Lst[NumCla].ClaCod == Gbl.Crs.Grps.ClaCod,false,
"%s",Classrooms->Lst[NumCla].ShrtName);
/* End selector */
HTM_SELECT_End ();