From 870f496b2496d85a63d939cba83508e732a98e3d Mon Sep 17 00:00:00 2001 From: acanas Date: Fri, 28 Oct 2022 20:07:14 +0200 Subject: [PATCH] Version 22.55: Oct 28, 2022 Code refactoring in degree types. --- swad_action.c | 2 +- swad_changelog.h | 3 +- swad_degree.c | 48 +++++++------- swad_degree_database.c | 74 +++++++++++++++++++++- swad_degree_database.h | 3 +- swad_degree_type.c | 139 ++++++++++++++++++++++------------------- swad_degree_type.h | 18 ++++-- swad_global.c | 4 -- swad_global.h | 5 -- 9 files changed, 188 insertions(+), 108 deletions(-) diff --git a/swad_action.c b/swad_action.c index f0417c18..7ee013a5 100644 --- a/swad_action.c +++ b/swad_action.c @@ -362,7 +362,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActChgCtrPhoAtt ] = {1159,-1,TabUnk,ActSeeCtrInf , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,CtrCfg_ChangeCtrPhotoAttr ,NULL}, [ActSeeDegTyp ] = {1013,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,DegTyp_SeeDegreeTypesInDegTab ,NULL}, - [ActEdiDegTyp ] = { 573,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,DegTyp_EditDegreeTypes ,NULL}, + [ActEdiDegTyp ] = { 573,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,DegTyp_GetAndEditDegreeTypes ,NULL}, [ActNewDegTyp ] = { 537,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,DegTyp_ReceiveFormNewDegreeType,DegTyp_ContEditAfterChgDegTyp ,NULL}, [ActRemDegTyp ] = { 545,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,DegTyp_RemoveDegreeType ,DegTyp_ContEditAfterChgDegTyp ,NULL}, [ActRenDegTyp ] = { 538,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,DegTyp_RenameDegreeType ,DegTyp_ContEditAfterChgDegTyp ,NULL}, diff --git a/swad_changelog.h b/swad_changelog.h index 96286c1a..138d2f16 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -605,7 +605,7 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate TODO: Attach pdf files in multimedia. */ -#define Log_PLATFORM_VERSION "SWAD 22.54 (2022-10-28)" +#define Log_PLATFORM_VERSION "SWAD 22.55 (2022-10-28)" #define CSS_FILE "swad22.49.4.css" #define JS_FILE "swad22.49.js" /* @@ -616,6 +616,7 @@ Que al subir un fichero por defecto est Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes... Exportar listas en CSV. + Version 22.55: Oct 28, 2022 Code refactoring in degree types. (333694 lines) Version 22.54: Oct 28, 2022 Code refactoring and bug fixing in institutional links. (333614 lines) Version 22.53: Oct 28, 2022 Code refactoring in mail domains. (333607 lines) Version 22.52: Oct 28, 2022 Code refactoring in plugins. (333589 lines) diff --git a/swad_degree.c b/swad_degree.c index b0b83ad0..845140ff 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -81,9 +81,9 @@ static struct Deg_Degree *Deg_EditingDeg = NULL; // Static variable to keep the /**************************** Private prototypes *****************************/ /*****************************************************************************/ -static void Deg_ListDegreesForEdition (void); +static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes); static bool Deg_CheckIfICanEditADegree (struct Deg_Degree *Deg); -static void Deg_PutFormToCreateDegree (void); +static void Deg_PutFormToCreateDegree (const struct DegTyp_DegTypes *DegTypes); static void Deg_PutHeadDegreesForSeeing (void); static void Deg_PutHeadDegreesForEdition (void); @@ -304,11 +304,11 @@ void Deg_ShowDegsOfCurrentCtr (void) /********************* List current degrees for edition **********************/ /*****************************************************************************/ -static void Deg_ListDegreesForEdition (void) +static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes) { extern const char *Txt_DEGREE_STATUS[Hie_NUM_STATUS_TXT]; unsigned NumDeg; - struct DegreeType *DegTyp; + struct DegTyp_DegreeType *DegTyp; struct Deg_Degree *Deg; unsigned NumDegTyp; char WWW[Cns_MAX_BYTES_WWW + 1]; @@ -406,10 +406,10 @@ static void Deg_ListDegreesForEdition (void) " class=\"HIE_SEL_NARROW INPUT_%s\"", The_GetSuffix ()); for (NumDegTyp = 0; - NumDegTyp < Gbl.DegTypes.Num; + NumDegTyp < DegTypes->Num; NumDegTyp++) { - DegTyp = &Gbl.DegTypes.Lst[NumDegTyp]; + DegTyp = &DegTypes->Lst[NumDegTyp]; HTM_OPTION (HTM_Type_LONG,&DegTyp->DegTypCod, // Gbl.Hierarchy.Deg.DegCod > 0 && DegTyp->DegTypCod == Deg->DegTypCod,false, @@ -420,10 +420,10 @@ static void Deg_ListDegreesForEdition (void) } else for (NumDegTyp = 0; - NumDegTyp < Gbl.DegTypes.Num; + NumDegTyp < DegTypes->Num; NumDegTyp++) - if (Gbl.DegTypes.Lst[NumDegTyp].DegTypCod == Deg->DegTypCod) - HTM_Txt (Gbl.DegTypes.Lst[NumDegTyp].DegTypName); + if (DegTypes->Lst[NumDegTyp].DegTypCod == Deg->DegTypCod) + HTM_Txt (DegTypes->Lst[NumDegTyp].DegTypName); HTM_TD_End (); /* Degree WWW */ @@ -503,11 +503,11 @@ static bool Deg_CheckIfICanEditADegree (struct Deg_Degree *Deg) /*********************** Put a form to create a new degree *******************/ /*****************************************************************************/ -static void Deg_PutFormToCreateDegree (void) +static void Deg_PutFormToCreateDegree (const struct DegTyp_DegTypes *DegTypes) { extern const char *Txt_New_degree; extern const char *Txt_Create_degree; - struct DegreeType *DegTyp; + struct DegTyp_DegreeType *DegTyp; unsigned NumDegTyp; /***** Begin form *****/ @@ -566,10 +566,10 @@ static void Deg_PutFormToCreateDegree (void) " class=\"HIE_SEL_NARROW INPUT_%s\"", The_GetSuffix ()); for (NumDegTyp = 0; - NumDegTyp < Gbl.DegTypes.Num; + NumDegTyp < DegTypes->Num; NumDegTyp++) { - DegTyp = &Gbl.DegTypes.Lst[NumDegTyp]; + DegTyp = &DegTypes->Lst[NumDegTyp]; HTM_OPTION (HTM_Type_LONG,&DegTyp->DegTypCod, DegTyp->DegTypCod == Deg_EditingDeg->DegTypCod,false, "%s",DegTyp->DegTypName); @@ -794,7 +794,7 @@ static void Deg_ListOneDegreeForSeeing (struct Deg_Degree *Deg,unsigned NumDeg) extern const char *Txt_DEGREE_With_courses; extern const char *Txt_DEGREE_Without_courses; extern const char *Txt_DEGREE_STATUS[Hie_NUM_STATUS_TXT]; - struct DegreeType DegTyp; + struct DegTyp_DegreeType DegTyp; const char *TxtClassNormal; const char *TxtClassStrong; const char *BgColor; @@ -891,14 +891,15 @@ static void Deg_EditDegreesInternal (void) extern const char *Hlp_CENTER_Degrees; extern const char *Txt_Degrees_of_CENTER_X; extern const char *Txt_No_types_of_degree; + struct DegTyp_DegTypes DegTypes; char *Title; + /***** Get list of degree types *****/ + DegTyp_GetListDegreeTypes (&DegTypes,HieLvl_SYS,DegTyp_ORDER_BY_DEGREE_TYPE); + /***** Get list of degrees in the current center *****/ Deg_GetListDegsInCurrentCtr (); - /***** Get list of degree types *****/ - DegTyp_GetListDegreeTypes (HieLvl_SYS,DegTyp_ORDER_BY_DEGREE_TYPE); - /***** Write menu to select country, institution and center *****/ Hie_WriteMenuHierarchy (); @@ -909,14 +910,14 @@ static void Deg_EditDegreesInternal (void) Hlp_CENTER_Degrees,Box_NOT_CLOSABLE); free (Title); - if (Gbl.DegTypes.Num) + if (Deg_DB_GetNumDegreeTypes (HieLvl_SYS)) { /***** Put a form to create a new degree *****/ - Deg_PutFormToCreateDegree (); + Deg_PutFormToCreateDegree (&DegTypes); /***** Forms to edit current degrees *****/ if (Gbl.Hierarchy.Degs.Num) - Deg_ListDegreesForEdition (); + Deg_ListDegreesForEdition (&DegTypes); } else // No degree types { @@ -925,17 +926,14 @@ static void Deg_EditDegreesInternal (void) /***** Form to create the first degree type *****/ if (DegTyp_CheckIfICanCreateDegreeTypes ()) - DegTyp_EditDegreeTypes (); + DegTyp_EditDegreeTypes (&DegTypes); } /***** End box *****/ Box_BoxEnd (); /***** Free list of degree types *****/ - DegTyp_FreeListDegreeTypes (); - - /***** Free list of degrees in the current center *****/ - Deg_FreeListDegs (&Gbl.Hierarchy.Degs); + DegTyp_FreeListDegreeTypes (&DegTypes); } /*****************************************************************************/ diff --git a/swad_degree_database.c b/swad_degree_database.c index e23526f8..0ea07b23 100644 --- a/swad_degree_database.c +++ b/swad_degree_database.c @@ -73,6 +73,78 @@ void Deg_DB_CreateDegree (struct Deg_Degree *Deg,Hie_Status_t Status) Deg->WWW); } +/*****************************************************************************/ +/************************* Get number of degree types ************************/ +/*****************************************************************************/ + +unsigned Deg_DB_GetNumDegreeTypes (HieLvl_Level_t Scope) + { + /***** Get number of types of degree from database *****/ + switch (Scope) + { + case HieLvl_SYS: + return (unsigned) + DB_QueryCOUNT ("can not get types of degree", + "SELECT COUNT(*)" + " FROM deg_types"); + case HieLvl_CTY: + /* Get only degree types with degrees in the current country */ + return (unsigned) + DB_QueryCOUNT ("can not get types of degree", + "SELECT COUNT(deg_types.*)" + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "deg_types" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegTypCod=deg_types.DegTypCod" + " GROUP BY deg_degrees.DegTypCod", + Gbl.Hierarchy.Cty.CtyCod); + case HieLvl_INS: + /* Get only degree types with degrees in the current institution */ + return (unsigned) + DB_QueryCOUNT ("can not get types of degree", + "SELECT COUNT(deg_types.*)" + " FROM ctr_centers," + "deg_degrees," + "deg_types" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegTypCod=deg_types.DegTypCod" + " GROUP BY deg_degrees.DegTypCod", + Gbl.Hierarchy.Ins.InsCod); + case HieLvl_CTR: + /* Get only degree types with degrees in the current center */ + return (unsigned) + DB_QueryCOUNT ("can not get types of degree", + "SELECT COUNT(deg_types.*)" + " FROM deg_degrees," + "deg_types" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegTypCod=deg_types.DegTypCod" + " GROUP BY deg_degrees.DegTypCod", + Gbl.Hierarchy.Ctr.CtrCod); + case HieLvl_DEG: + case HieLvl_CRS: + /* Get only degree types with degrees in the current degree */ + return (unsigned) + DB_QueryCOUNT ("can not get types of degree", + "SELECT COUNT(deg_types.*)" + " FROM deg_degrees," + "deg_types" + " FROM deg_degrees," + "deg_types" + " WHERE deg_degrees.DegCod=%ld" + " AND deg_degrees.DegTypCod=deg_types.DegTypCod", + Gbl.Hierarchy.Deg.DegCod); + default: + Err_WrongScopeExit (); + return 0; // Not reached + } + } + /*****************************************************************************/ /****************** Create a list with all degree types **********************/ /*****************************************************************************/ @@ -194,7 +266,7 @@ unsigned Deg_DB_GetDegreeTypes (MYSQL_RES **mysql_res, /************** Get the name of a type of degree from database ***************/ /*****************************************************************************/ -void Deg_DB_GetDegTypeNameByCod (struct DegreeType *DegTyp) +void Deg_DB_GetDegTypeNameByCod (struct DegTyp_DegreeType *DegTyp) { DB_QuerySELECTString (DegTyp->DegTypName,sizeof (DegTyp->DegTypName) - 1, "can not get the name of a type of degree", diff --git a/swad_degree_database.h b/swad_degree_database.h index db2cb2ba..f89768d2 100644 --- a/swad_degree_database.h +++ b/swad_degree_database.h @@ -40,9 +40,10 @@ void Deg_DB_CreateDegreeType (const char DegTypName[DegTyp_MAX_BYTES_DEGREE_TYPE_NAME + 1]); void Deg_DB_CreateDegree (struct Deg_Degree *Deg,Hie_Status_t Status); +unsigned Deg_DB_GetNumDegreeTypes (HieLvl_Level_t Scope); unsigned Deg_DB_GetDegreeTypes (MYSQL_RES **mysql_res, HieLvl_Level_t Scope,DegTyp_Order_t Order); -void Deg_DB_GetDegTypeNameByCod (struct DegreeType *DegTyp); +void Deg_DB_GetDegTypeNameByCod (struct DegTyp_DegreeType *DegTyp); unsigned Deg_DB_GetDataOfDegreeByCod (MYSQL_RES **mysql_res,long DegCod); long Deg_DB_GetInsCodOfDegreeByCod (long DegCod); long Deg_DB_GetCtrCodOfDegreeByCod (long DegCod); diff --git a/swad_degree_type.c b/swad_degree_type.c index fda9b527..1a229b59 100644 --- a/swad_degree_type.c +++ b/swad_degree_type.c @@ -57,7 +57,7 @@ extern struct Globals Gbl; /**************************** Private variables ******************************/ /*****************************************************************************/ -static struct DegreeType *DegTyp_EditingDegTyp = NULL; // Static variable to keep the degree type being edited +static struct DegTyp_DegreeType *DegTyp_EditingDegTyp = NULL; // Static variable to keep the degree type being edited /*****************************************************************************/ /*************************** Private prototypes ******************************/ @@ -67,17 +67,18 @@ static void DegTyp_SeeDegreeTypes (Act_Action_t NextAction,HieLvl_Level_t Scope, DegTyp_Order_t DefaultOrder); static DegTyp_Order_t DegTyp_GetParamDegTypOrder (DegTyp_Order_t DefaultOrder); -static void DegTyp_ListDegreeTypes (Act_Action_t NextAction, +static void DegTyp_ListDegreeTypes (const struct DegTyp_DegTypes *DegTypes, + Act_Action_t NextAction, HieLvl_Level_t Scope, DegTyp_Order_t SelectedOrder); -static void DegTyp_EditDegreeTypesInternal (void); +static void DegTyp_EditDegreeTypesInternal (const struct DegTyp_DegTypes *DegTypes); static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Args); -static void DegTyp_ListDegreeTypesForSeeing (void); +static void DegTyp_ListDegreeTypesForSeeing (const struct DegTyp_DegTypes *DegTypes); static void DegTyp_PutIconsListingDegTypes (__attribute__((unused)) void *Args); static void DegTyp_PutIconToEditDegTypes (__attribute__((unused)) void *Args); -static void DegTyp_ListDegreeTypesForEdition (void); +static void DegTyp_ListDegreeTypesForEdition (const struct DegTyp_DegTypes *DegTypes); static void DegTyp_PutFormToCreateDegreeType (void); @@ -100,11 +101,12 @@ static void DegTyp_EditingDegreeTypeDestructor (void); void DegTyp_WriteSelectorDegreeTypes (long SelectedDegTypCod) { extern const char *Txt_Any_type_of_degree; + struct DegTyp_DegTypes DegTypes; unsigned NumDegTyp; /***** Form to select degree types *****/ /* Get list of degree types */ - DegTyp_GetListDegreeTypes (HieLvl_SYS,DegTyp_ORDER_BY_DEGREE_TYPE); + DegTyp_GetListDegreeTypes (&DegTypes,HieLvl_SYS,DegTyp_ORDER_BY_DEGREE_TYPE); /* List degree types */ HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, @@ -115,15 +117,15 @@ void DegTyp_WriteSelectorDegreeTypes (long SelectedDegTypCod) SelectedDegTypCod == -1L,false, "%s",Txt_Any_type_of_degree); for (NumDegTyp = 0; - NumDegTyp < Gbl.DegTypes.Num; + NumDegTyp < DegTypes.Num; NumDegTyp++) - HTM_OPTION (HTM_Type_LONG,&Gbl.DegTypes.Lst[NumDegTyp].DegTypCod, - Gbl.DegTypes.Lst[NumDegTyp].DegTypCod == SelectedDegTypCod,false, - "%s",Gbl.DegTypes.Lst[NumDegTyp].DegTypName); + HTM_OPTION (HTM_Type_LONG,&DegTypes.Lst[NumDegTyp].DegTypCod, + DegTypes.Lst[NumDegTyp].DegTypCod == SelectedDegTypCod,false, + "%s",DegTypes.Lst[NumDegTyp].DegTypName); HTM_SELECT_End (); /***** Free list of degree types *****/ - DegTyp_FreeListDegreeTypes (); + DegTyp_FreeListDegreeTypes (&DegTypes); } /*****************************************************************************/ @@ -146,18 +148,19 @@ static void DegTyp_SeeDegreeTypes (Act_Action_t NextAction,HieLvl_Level_t Scope, DegTyp_Order_t DefaultOrder) { DegTyp_Order_t SelectedOrder; + struct DegTyp_DegTypes DegTypes; /***** Get parameter with the type of order in the list of degree types *****/ SelectedOrder = DegTyp_GetParamDegTypOrder (DefaultOrder); /***** Get list of degree types *****/ - DegTyp_GetListDegreeTypes (Scope,SelectedOrder); + DegTyp_GetListDegreeTypes (&DegTypes,Scope,SelectedOrder); /***** List degree types *****/ - DegTyp_ListDegreeTypes (NextAction,Scope,SelectedOrder); + DegTyp_ListDegreeTypes (&DegTypes,NextAction,Scope,SelectedOrder); /***** Free list of degree types *****/ - DegTyp_FreeListDegreeTypes (); + DegTyp_FreeListDegreeTypes (&DegTypes); } /*****************************************************************************/ @@ -179,7 +182,8 @@ static DegTyp_Order_t DegTyp_GetParamDegTypOrder (DegTyp_Order_t DefaultOrder) // - center tab => NextAction = ActSeeDegTyp // - statistic tab => NextAction = ActSeeUseGbl -static void DegTyp_ListDegreeTypes (Act_Action_t NextAction, +static void DegTyp_ListDegreeTypes (const struct DegTyp_DegTypes *DegTypes, + Act_Action_t NextAction, HieLvl_Level_t Scope, DegTyp_Order_t SelectedOrder) { @@ -207,7 +211,7 @@ static void DegTyp_ListDegreeTypes (Act_Action_t NextAction, return; } - if (Gbl.DegTypes.Num) + if (DegTypes->Num) { /***** Begin table *****/ HTM_TABLE_BeginWideMarginPadding (2); @@ -216,7 +220,7 @@ static void DegTyp_ListDegreeTypes (Act_Action_t NextAction, DegTyp_PutHeadDegreeTypesForSeeing (NextAction,Scope,SelectedOrder); /***** List current degree types for seeing *****/ - DegTyp_ListDegreeTypesForSeeing (); + DegTyp_ListDegreeTypesForSeeing (DegTypes); /***** End table *****/ HTM_TABLE_End (); @@ -228,8 +232,8 @@ static void DegTyp_ListDegreeTypes (Act_Action_t NextAction, if (DegTyp_CheckIfICanCreateDegreeTypes ()) { Frm_BeginForm (ActEdiDegTyp); - Btn_PutConfirmButton (Gbl.DegTypes.Num ? Txt_Create_another_type_of_degree : - Txt_Create_type_of_degree); + Btn_PutConfirmButton (DegTypes->Num ? Txt_Create_another_type_of_degree : + Txt_Create_type_of_degree); Frm_EndForm (); } @@ -241,26 +245,27 @@ static void DegTyp_ListDegreeTypes (Act_Action_t NextAction, /************************ Put forms to edit degree types *********************/ /*****************************************************************************/ -void DegTyp_EditDegreeTypes (void) +void DegTyp_GetAndEditDegreeTypes (void) + { + struct DegTyp_DegTypes DegTypes; + + DegTyp_GetListDegreeTypes (&DegTypes,HieLvl_SYS,DegTyp_ORDER_BY_DEGREE_TYPE); + DegTyp_EditDegreeTypes (&DegTypes); + DegTyp_FreeListDegreeTypes (&DegTypes); + } + +void DegTyp_EditDegreeTypes (const struct DegTyp_DegTypes *DegTypes) { - /***** Degree type constructor *****/ DegTyp_EditingDegreeTypeConstructor (); - - /***** Edit degree types *****/ - DegTyp_EditDegreeTypesInternal (); - - /***** Degree type destructor *****/ + DegTyp_EditDegreeTypesInternal (DegTypes); DegTyp_EditingDegreeTypeDestructor (); } -static void DegTyp_EditDegreeTypesInternal (void) +static void DegTyp_EditDegreeTypesInternal (const struct DegTyp_DegTypes *DegTypes) { extern const char *Hlp_CENTER_DegreeTypes_edit; extern const char *Txt_Types_of_degree; - /***** Get list of degree types *****/ - DegTyp_GetListDegreeTypes (HieLvl_SYS,DegTyp_ORDER_BY_DEGREE_TYPE); - /***** Begin box *****/ Box_BoxBegin (NULL,Txt_Types_of_degree, DegTyp_PutIconsEditingDegreeTypes,NULL, @@ -270,14 +275,11 @@ static void DegTyp_EditDegreeTypesInternal (void) DegTyp_PutFormToCreateDegreeType (); /***** Forms to edit current degree types *****/ - if (Gbl.DegTypes.Num) - DegTyp_ListDegreeTypesForEdition (); + if (DegTypes->Num) + DegTyp_ListDegreeTypesForEdition (DegTypes); /***** End box *****/ Box_BoxEnd (); - - /***** Free list of degree types *****/ - DegTyp_FreeListDegreeTypes (); } /*****************************************************************************/ @@ -311,17 +313,17 @@ void DegTyp_PutIconToViewDegreeTypes (void) /******************* List current degree types for seeing ********************/ /*****************************************************************************/ -static void DegTyp_ListDegreeTypesForSeeing (void) +static void DegTyp_ListDegreeTypesForSeeing (const struct DegTyp_DegTypes *DegTypes) { unsigned NumDegTyp; const char *BgColor; /***** List degree types with forms for edition *****/ for (NumDegTyp = 0, The_ResetRowColor (); - NumDegTyp < Gbl.DegTypes.Num; + NumDegTyp < DegTypes->Num; NumDegTyp++, The_ChangeRowColor ()) { - BgColor = (Gbl.DegTypes.Lst[NumDegTyp].DegTypCod == + BgColor = (DegTypes->Lst[NumDegTyp].DegTypCod == Gbl.Hierarchy.Deg.DegTypCod) ? "BG_HIGHLIGHT" : The_GetColorRows (); @@ -337,13 +339,13 @@ static void DegTyp_ListDegreeTypesForSeeing (void) /* Name of degree type */ HTM_TD_Begin ("class=\"LM DAT_STRONG_%s %s\"", The_GetSuffix (),BgColor); - HTM_Txt (Gbl.DegTypes.Lst[NumDegTyp].DegTypName); + HTM_Txt (DegTypes->Lst[NumDegTyp].DegTypName); HTM_TD_End (); /* Number of degrees of this type */ HTM_TD_Begin ("class=\"RM DAT_STRONG_%s %s\"", The_GetSuffix (),BgColor); - HTM_Unsigned (Gbl.DegTypes.Lst[NumDegTyp].NumDegs); + HTM_Unsigned (DegTypes->Lst[NumDegTyp].NumDegs); HTM_TD_End (); /* End table row */ @@ -383,7 +385,7 @@ static void DegTyp_PutIconToEditDegTypes (__attribute__((unused)) void *Args) /******************* List current degree types for edition *******************/ /*****************************************************************************/ -static void DegTyp_ListDegreeTypesForEdition (void) +static void DegTyp_ListDegreeTypesForEdition (const struct DegTyp_DegTypes *DegTypes) { unsigned NumDegTyp; @@ -395,7 +397,7 @@ static void DegTyp_ListDegreeTypesForEdition (void) /***** List degree types with forms for edition *****/ for (NumDegTyp = 0; - NumDegTyp < Gbl.DegTypes.Num; + NumDegTyp < DegTypes->Num; NumDegTyp++) { /* Begin table row */ @@ -403,24 +405,25 @@ static void DegTyp_ListDegreeTypesForEdition (void) /* Put icon to remove degree type */ HTM_TD_Begin ("class=\"BM\""); - if (Gbl.DegTypes.Lst[NumDegTyp].NumDegs) // Degree type has degrees => deletion forbidden + if (DegTypes->Lst[NumDegTyp].NumDegs) // Degree type has degrees => deletion forbidden Ico_PutIconRemovalNotAllowed (); else Ico_PutContextualIconToRemove (ActRemDegTyp,NULL, - DegTyp_PutParamOtherDegTypCod,&Gbl.DegTypes.Lst[NumDegTyp].DegTypCod); + DegTyp_PutParamOtherDegTypCod, + &DegTypes->Lst[NumDegTyp].DegTypCod); HTM_TD_End (); /* Degree type code */ HTM_TD_Begin ("class=\"DAT_%s CODE\"",The_GetSuffix ()); - HTM_Long (Gbl.DegTypes.Lst[NumDegTyp].DegTypCod); + HTM_Long (DegTypes->Lst[NumDegTyp].DegTypCod); HTM_TD_End (); /* Name of degree type */ HTM_TD_Begin ("class=\"LM\""); Frm_BeginForm (ActRenDegTyp); - DegTyp_PutParamOtherDegTypCod (&Gbl.DegTypes.Lst[NumDegTyp].DegTypCod); + DegTyp_PutParamOtherDegTypCod (&DegTypes->Lst[NumDegTyp].DegTypCod); HTM_INPUT_TEXT ("DegTypName",DegTyp_MAX_CHARS_DEGREE_TYPE_NAME, - Gbl.DegTypes.Lst[NumDegTyp].DegTypName, + DegTypes->Lst[NumDegTyp].DegTypName, HTM_SUBMIT_ON_CHANGE, "size=\"25\" class=\"INPUT_%s\"" " required=\"required\"", @@ -430,7 +433,7 @@ static void DegTyp_ListDegreeTypesForEdition (void) /* Number of degrees of this type */ HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); - HTM_Unsigned (Gbl.DegTypes.Lst[NumDegTyp].NumDegs); + HTM_Unsigned (DegTypes->Lst[NumDegTyp].NumDegs); HTM_TD_End (); /* End table row */ @@ -586,41 +589,43 @@ static void DegTyp_PutHeadDegreeTypesForEdition (void) /****************** Create a list with all degree types **********************/ /*****************************************************************************/ -void DegTyp_GetListDegreeTypes (HieLvl_Level_t Scope,DegTyp_Order_t Order) +void DegTyp_GetListDegreeTypes (struct DegTyp_DegTypes *DegTypes, + HieLvl_Level_t Scope,DegTyp_Order_t Order) { MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumTyp; /***** Get types of degree from database *****/ - Gbl.DegTypes.Num = Deg_DB_GetDegreeTypes (&mysql_res,Scope,Order); + DegTypes->Num = Deg_DB_GetDegreeTypes (&mysql_res,Scope,Order); + DegTypes->Lst = NULL; /***** Get degree types *****/ - if (Gbl.DegTypes.Num) + if (DegTypes->Num) { /***** Create a list of degree types *****/ - if ((Gbl.DegTypes.Lst = calloc (Gbl.DegTypes.Num, - sizeof (*Gbl.DegTypes.Lst))) == NULL) + if ((DegTypes->Lst = calloc ((size_t) DegTypes->Num, + sizeof (struct DegTyp_DegreeType))) == NULL) Err_NotEnoughMemoryExit (); /***** Get degree types *****/ for (NumTyp = 0; - NumTyp < Gbl.DegTypes.Num; + NumTyp < DegTypes->Num; NumTyp++) { /* Get next degree type */ row = mysql_fetch_row (mysql_res); /* Get degree type code (row[0]) */ - if ((Gbl.DegTypes.Lst[NumTyp].DegTypCod = Str_ConvertStrCodToLongCod (row[0])) <= 0) + if ((DegTypes->Lst[NumTyp].DegTypCod = Str_ConvertStrCodToLongCod (row[0])) <= 0) Err_WrongDegTypExit (); /* Get degree type name (row[1]) */ - Str_Copy (Gbl.DegTypes.Lst[NumTyp].DegTypName,row[1], - sizeof (Gbl.DegTypes.Lst[NumTyp].DegTypName) - 1); + Str_Copy (DegTypes->Lst[NumTyp].DegTypName,row[1], + sizeof (DegTypes->Lst[NumTyp].DegTypName) - 1); /* Number of degrees of this type (row[2]) */ - if (sscanf (row[2],"%u",&Gbl.DegTypes.Lst[NumTyp].NumDegs) != 1) + if (sscanf (row[2],"%u",&DegTypes->Lst[NumTyp].NumDegs) != 1) Err_ShowErrorAndExit ("Error when getting number of degrees of a type"); } } @@ -633,14 +638,14 @@ void DegTyp_GetListDegreeTypes (HieLvl_Level_t Scope,DegTyp_Order_t Order) /********* Free list of degree types and list of degrees of each type ********/ /*****************************************************************************/ -void DegTyp_FreeListDegreeTypes (void) +void DegTyp_FreeListDegreeTypes (struct DegTyp_DegTypes *DegTypes) { /***** Free memory used by the list of degree types *****/ - if (Gbl.DegTypes.Lst) + if (DegTypes->Num && DegTypes->Lst) { - free (Gbl.DegTypes.Lst); - Gbl.DegTypes.Lst = NULL; - Gbl.DegTypes.Num = 0; + free (DegTypes->Lst); + DegTypes->Lst = NULL; + DegTypes->Num = 0; } } @@ -745,7 +750,7 @@ long DegTyp_GetAndCheckParamOtherDegTypCod (long MinCodAllowed) /****************** Get data of a degree type from its code ******************/ /*****************************************************************************/ -bool DegTyp_GetDataOfDegreeTypeByCod (struct DegreeType *DegTyp) +bool DegTyp_GetDataOfDegreeTypeByCod (struct DegTyp_DegreeType *DegTyp) { /***** Trivial check: code of degree type should be >= 0 *****/ if (DegTyp->DegTypCod <= 0) @@ -871,11 +876,15 @@ void DegTyp_RenameDegreeType (void) void DegTyp_ContEditAfterChgDegTyp (void) { + struct DegTyp_DegTypes DegTypes; + /***** Show possible delayed alerts *****/ Ale_ShowAlerts (NULL); /***** Show the form again *****/ - DegTyp_EditDegreeTypesInternal (); + DegTyp_GetListDegreeTypes (&DegTypes,HieLvl_SYS,DegTyp_ORDER_BY_DEGREE_TYPE); + DegTyp_EditDegreeTypesInternal (&DegTypes); + DegTyp_FreeListDegreeTypes (&DegTypes); /***** Degree type destructor *****/ DegTyp_EditingDegreeTypeDestructor (); diff --git a/swad_degree_type.h b/swad_degree_type.h index ce40bbef..4ef225ec 100644 --- a/swad_degree_type.h +++ b/swad_degree_type.h @@ -40,13 +40,19 @@ /******************************* Public types ********************************/ /*****************************************************************************/ -struct DegreeType +struct DegTyp_DegreeType { long DegTypCod; // Degree type code char DegTypName[DegTyp_MAX_BYTES_DEGREE_TYPE_NAME + 1]; // Degree type name unsigned NumDegs; // Number of degrees of this type }; +struct DegTyp_DegTypes + { + unsigned Num; // Number of degree types + struct DegTyp_DegreeType *Lst; // List of degree types + }; + #define DegTyp_NUM_ORDERS 2 typedef enum { @@ -62,14 +68,16 @@ void DegTyp_WriteSelectorDegreeTypes (long SelectedDegTypCod); void DegTyp_SeeDegreeTypesInDegTab (void); void DegTyp_SeeDegreeTypesInStaTab (void); -void DegTyp_EditDegreeTypes (void); +void DegTyp_GetAndEditDegreeTypes (void); +void DegTyp_EditDegreeTypes (const struct DegTyp_DegTypes *DegTypes); void DegTyp_PutIconToViewDegreeTypes (void); bool DegTyp_CheckIfICanCreateDegreeTypes (void); -void DegTyp_GetListDegreeTypes (HieLvl_Level_t Scope,DegTyp_Order_t Order); -void DegTyp_FreeListDegreeTypes (void); +void DegTyp_GetListDegreeTypes (struct DegTyp_DegTypes *DegTypes, + HieLvl_Level_t Scope,DegTyp_Order_t Order); +void DegTyp_FreeListDegreeTypes (struct DegTyp_DegTypes *DegTypes); void DegTyp_ReceiveFormNewDegreeType (void); @@ -77,7 +85,7 @@ void DegTyp_RemoveDegreeType (void); long DegTyp_GetAndCheckParamOtherDegTypCod (long MinCodAllowed); -bool DegTyp_GetDataOfDegreeTypeByCod (struct DegreeType *DegTyp); +bool DegTyp_GetDataOfDegreeTypeByCod (struct DegTyp_DegreeType *DegTyp); void DegTyp_RenameDegreeType (void); void DegTyp_ContEditAfterChgDegTyp (void); diff --git a/swad_global.c b/swad_global.c index eaede7d9..3c32b5c4 100644 --- a/swad_global.c +++ b/swad_global.c @@ -191,9 +191,6 @@ void Gbl_InitializeGlobals (void) Gbl.Hierarchy.Crs.ShrtName[0] = Gbl.Hierarchy.Crs.FullName[0] = '\0'; - Gbl.DegTypes.Num = 0; - Gbl.DegTypes.Lst = NULL; - Gbl.Crs.Info.ShowMsgMustBeRead = 0; Gbl.Crs.Notices.HighlightNotCod = -1L; // No notice highlighted @@ -314,7 +311,6 @@ void Gbl_Cleanup (void) Grp_FreeListCodSelectedGrps (); Crs_FreeListCoursesInCurrentDegree (); Deg_FreeListDegs (&Gbl.Hierarchy.Degs); - DegTyp_FreeListDegreeTypes (); Ins_FreeListInstitutions (); Ctr_FreeListCenters (); Cty_FreeListCountries (); diff --git a/swad_global.h b/swad_global.h index 502bccc2..5fd2d1c9 100644 --- a/swad_global.h +++ b/swad_global.h @@ -100,11 +100,6 @@ struct Globals struct Crs_ListCourses Crss; // List of courses in current degree struct Crs_Course Crs; // Current course. Aditional info about course is stored in Gbl.Crs. } Hierarchy; - struct - { - unsigned Num; // Number of degree types - struct DegreeType *Lst; // List of degree types - } DegTypes; struct { Sch_WhatToSearch_t WhatToSearch;