diff --git a/swad_action_list.c b/swad_action_list.c index b72b3487..df7c0900 100644 --- a/swad_action_list.c +++ b/swad_action_list.c @@ -94,6 +94,7 @@ #include "swad_program.h" #include "swad_program_resource.h" #include "swad_project.h" +#include "swad_project_config.h" #include "swad_project_resource.h" #include "swad_question_import.h" #include "swad_QR.h" diff --git a/swad_browser.c b/swad_browser.c index 82636f10..e263c56a 100644 --- a/swad_browser.c +++ b/swad_browser.c @@ -8293,93 +8293,90 @@ void Brw_ChgFileMetadata (void) { /***** Check if I can change file metadata *****/ IAmTheOwner = Brw_CheckIfIAmOwnerOfFile (FileMetadata.PublisherUsrCod); - if (Brw_CheckIfICanEditFileMetadata (IAmTheOwner)) - { - /* Check if the file was public before the edition */ - PublicFileBeforeEdition = FileMetadata.IsPublic; + if (!Brw_CheckIfICanEditFileMetadata (IAmTheOwner)) + Err_NoPermissionExit (); - /***** Get the new file privacy and license from form *****/ + /***** Check if the file was public before the edition *****/ + PublicFileBeforeEdition = FileMetadata.IsPublic; + + /***** Get the new file privacy and license from form *****/ + switch (Gbl.FileBrowser.Type) + { + case Brw_ADMI_DOC_INS: + case Brw_ADMI_SHR_INS: + case Brw_ADMI_DOC_CTR: + case Brw_ADMI_SHR_CTR: + case Brw_ADMI_DOC_DEG: + case Brw_ADMI_SHR_DEG: + case Brw_ADMI_DOC_CRS: + case Brw_ADMI_SHR_CRS: + PublicFileAfterEdition = Brw_GetParPublicFile (); + License = Brw_GetParLicense (); + break; + case Brw_ADMI_DOC_GRP: + case Brw_ADMI_TCH_CRS: + case Brw_ADMI_TCH_GRP: + case Brw_ADMI_SHR_GRP: + case Brw_ADMI_ASG_USR: + case Brw_ADMI_ASG_CRS: + case Brw_ADMI_WRK_USR: + case Brw_ADMI_WRK_CRS: + case Brw_ADMI_DOC_PRJ: + case Brw_ADMI_ASS_PRJ: + case Brw_ADMI_BRF_USR: + PublicFileAfterEdition = false; // Files in these zones can not be public + License = Brw_GetParLicense (); + break; + default: + PublicFileAfterEdition = false; // Files in other zones can not be public + License = Brw_LICENSE_DEFAULT; + break; + } + + /***** Change file metadata *****/ + Brw_DB_ChangeFilePublic (&FileMetadata,PublicFileAfterEdition,License); + + /***** Remove the affected clipboards *****/ + Brw_DB_RemoveAffectedClipboards (Gbl.FileBrowser.Type, + Gbl.Usrs.Me.UsrDat.UsrCod, + Gbl.Usrs.Other.UsrDat.UsrCod); + + /***** Insert file into public social activity *****/ + if (!PublicFileBeforeEdition && + PublicFileAfterEdition) // Only if file has changed from private to public switch (Gbl.FileBrowser.Type) { case Brw_ADMI_DOC_INS: - case Brw_ADMI_SHR_INS: - case Brw_ADMI_DOC_CTR: - case Brw_ADMI_SHR_CTR: - case Brw_ADMI_DOC_DEG: - case Brw_ADMI_SHR_DEG: - case Brw_ADMI_DOC_CRS: - case Brw_ADMI_SHR_CRS: - PublicFileAfterEdition = Brw_GetParPublicFile (); - License = Brw_GetParLicense (); + TmlNot_StoreAndPublishNote (TmlNot_INS_DOC_PUB_FILE,FileMetadata.FilCod); break; - case Brw_ADMI_DOC_GRP: - case Brw_ADMI_TCH_CRS: - case Brw_ADMI_TCH_GRP: - case Brw_ADMI_SHR_GRP: - case Brw_ADMI_ASG_USR: - case Brw_ADMI_ASG_CRS: - case Brw_ADMI_WRK_USR: - case Brw_ADMI_WRK_CRS: - case Brw_ADMI_DOC_PRJ: - case Brw_ADMI_ASS_PRJ: - case Brw_ADMI_BRF_USR: - PublicFileAfterEdition = false; // Files in these zones can not be public - License = Brw_GetParLicense (); + case Brw_ADMI_SHR_INS: + TmlNot_StoreAndPublishNote (TmlNot_INS_SHA_PUB_FILE,FileMetadata.FilCod); + break; + case Brw_ADMI_DOC_CTR: + TmlNot_StoreAndPublishNote (TmlNot_CTR_DOC_PUB_FILE,FileMetadata.FilCod); + break; + case Brw_ADMI_SHR_CTR: + TmlNot_StoreAndPublishNote (TmlNot_CTR_SHA_PUB_FILE,FileMetadata.FilCod); + break; + case Brw_ADMI_DOC_DEG: + TmlNot_StoreAndPublishNote (TmlNot_DEG_DOC_PUB_FILE,FileMetadata.FilCod); + break; + case Brw_ADMI_SHR_DEG: + TmlNot_StoreAndPublishNote (TmlNot_DEG_SHA_PUB_FILE,FileMetadata.FilCod); + break; + case Brw_ADMI_DOC_CRS: + TmlNot_StoreAndPublishNote (TmlNot_CRS_DOC_PUB_FILE,FileMetadata.FilCod); + break; + case Brw_ADMI_SHR_CRS: + TmlNot_StoreAndPublishNote (TmlNot_CRS_SHA_PUB_FILE,FileMetadata.FilCod); break; default: - PublicFileAfterEdition = false; // Files in other zones can not be public - License = Brw_LICENSE_DEFAULT; break; } - /***** Change file metadata *****/ - Brw_DB_ChangeFilePublic (&FileMetadata,PublicFileAfterEdition,License); - - /***** Remove the affected clipboards *****/ - Brw_DB_RemoveAffectedClipboards (Gbl.FileBrowser.Type, - Gbl.Usrs.Me.UsrDat.UsrCod, - Gbl.Usrs.Other.UsrDat.UsrCod); - - /***** Insert file into public social activity *****/ - if (!PublicFileBeforeEdition && - PublicFileAfterEdition) // Only if file has changed from private to public - switch (Gbl.FileBrowser.Type) - { - case Brw_ADMI_DOC_INS: - TmlNot_StoreAndPublishNote (TmlNot_INS_DOC_PUB_FILE,FileMetadata.FilCod); - break; - case Brw_ADMI_SHR_INS: - TmlNot_StoreAndPublishNote (TmlNot_INS_SHA_PUB_FILE,FileMetadata.FilCod); - break; - case Brw_ADMI_DOC_CTR: - TmlNot_StoreAndPublishNote (TmlNot_CTR_DOC_PUB_FILE,FileMetadata.FilCod); - break; - case Brw_ADMI_SHR_CTR: - TmlNot_StoreAndPublishNote (TmlNot_CTR_SHA_PUB_FILE,FileMetadata.FilCod); - break; - case Brw_ADMI_DOC_DEG: - TmlNot_StoreAndPublishNote (TmlNot_DEG_DOC_PUB_FILE,FileMetadata.FilCod); - break; - case Brw_ADMI_SHR_DEG: - TmlNot_StoreAndPublishNote (TmlNot_DEG_SHA_PUB_FILE,FileMetadata.FilCod); - break; - case Brw_ADMI_DOC_CRS: - TmlNot_StoreAndPublishNote (TmlNot_CRS_DOC_PUB_FILE,FileMetadata.FilCod); - break; - case Brw_ADMI_SHR_CRS: - TmlNot_StoreAndPublishNote (TmlNot_CRS_SHA_PUB_FILE,FileMetadata.FilCod); - break; - default: - break; - } - - /***** Write sucess message *****/ - Ale_ShowAlert (Ale_SUCCESS,Txt_The_properties_of_file_X_have_been_saved, - FileMetadata.FilFolLnk.Name); - } - else - /***** Write error message and exit *****/ - Err_NoPermissionExit (); + /***** Write sucess message *****/ + Ale_ShowAlert (Ale_SUCCESS,Txt_The_properties_of_file_X_have_been_saved, + FileMetadata.FilFolLnk.Name); } /***** Show again the file browser *****/ diff --git a/swad_changelog.h b/swad_changelog.h index db34d8ba..7002665a 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -629,10 +629,11 @@ TODO: Emilce Barrera Mesa: Podr TODO: Emilce Barrera Mesa: Mis estudiantes presentan muchas dificultades a la hora de poner la foto porque la plataforma es muy exigente respecto al fondo de la imagen. */ -#define Log_PLATFORM_VERSION "SWAD 22.92.3 (2023-04-06)" +#define Log_PLATFORM_VERSION "SWAD 22.93 (2023-04-10)" #define CSS_FILE "swad22.88.css" #define JS_FILE "swad22.49.js" /* + Version 22.93: Apr 10, 2023 Changes in configuration of projects. (338417 lines) Version 22.92.3: Apr 06, 2023 Code refactoring in resources. (338493 lines) Version 22.92.2: Apr 06, 2023 Code refactoring in resources. (338500 lines) Version 22.92.1: Apr 06, 2023 Removed unused code in resources. (338514 lines) diff --git a/swad_course.c b/swad_course.c index 1e75d363..03fcc812 100644 --- a/swad_course.c +++ b/swad_course.c @@ -1580,30 +1580,27 @@ void Crs_RemoveCourse (void) /***** Get data of the course from database *****/ Crs_GetCourseDataByCod (Crs_EditingCrs); - - if (Crs_CheckIfICanEdit (Crs_EditingCrs)) - { - /***** Check if this course has users *****/ - if (Enr_GetNumUsrsInCrss (HieLvl_CRS,Crs_EditingCrs->CrsCod, - 1 << Rol_STD | - 1 << Rol_NET | - 1 << Rol_TCH)) // Course has users ==> don't remove - Ale_ShowAlert (Ale_WARNING, - Txt_To_remove_a_course_you_must_first_remove_all_users_in_the_course); - else // Course has no users ==> remove it - { - /***** Remove course *****/ - Crs_RemoveCourseCompletely (Crs_EditingCrs->CrsCod); - - /***** Write message to show the change made *****/ - Ale_ShowAlert (Ale_SUCCESS,Txt_Course_X_removed, - Crs_EditingCrs->FullName); - - Crs_EditingCrs->CrsCod = -1L; // To not showing button to go to course - } - } - else + if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) Err_NoPermissionExit (); + + /***** Check if this course has users *****/ + if (Enr_GetNumUsrsInCrss (HieLvl_CRS,Crs_EditingCrs->CrsCod, + 1 << Rol_STD | + 1 << Rol_NET | + 1 << Rol_TCH)) // Course has users ==> don't remove + Ale_ShowAlert (Ale_WARNING, + Txt_To_remove_a_course_you_must_first_remove_all_users_in_the_course); + else // Course has no users ==> remove it + { + /***** Remove course *****/ + Crs_RemoveCourseCompletely (Crs_EditingCrs->CrsCod); + + /***** Write message to show the change made *****/ + Ale_ShowAlert (Ale_SUCCESS,Txt_Course_X_removed, + Crs_EditingCrs->FullName); + + Crs_EditingCrs->CrsCod = -1L; // To not showing button to go to course + } } /*****************************************************************************/ @@ -1822,25 +1819,22 @@ void Crs_ChangeInsCrsCod (void) /* Get data of the course */ Crs_GetCourseDataByCod (Crs_EditingCrs); - - if (Crs_CheckIfICanEdit (Crs_EditingCrs)) - { - /***** Change the institutional course code *****/ - if (strcmp (NewInstitutionalCrsCod,Crs_EditingCrs->InstitutionalCrsCod)) - { - Crs_UpdateInstitutionalCrsCod (Crs_EditingCrs,NewInstitutionalCrsCod); - Ale_CreateAlert (Ale_SUCCESS,NULL, - Txt_The_institutional_code_of_the_course_X_has_changed_to_Y, - Crs_EditingCrs->ShrtName, - NewInstitutionalCrsCod); - } - else // The same institutional code - Ale_CreateAlert (Ale_INFO,NULL, - Txt_The_institutional_code_of_the_course_X_has_not_changed, - Crs_EditingCrs->ShrtName); - } - else + if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) Err_NoPermissionExit (); + + /***** Change the institutional course code *****/ + if (strcmp (NewInstitutionalCrsCod,Crs_EditingCrs->InstitutionalCrsCod)) + { + Crs_UpdateInstitutionalCrsCod (Crs_EditingCrs,NewInstitutionalCrsCod); + Ale_CreateAlert (Ale_SUCCESS,NULL, + Txt_The_institutional_code_of_the_course_X_has_changed_to_Y, + Crs_EditingCrs->ShrtName, + NewInstitutionalCrsCod); + } + else // The same institutional code + Ale_CreateAlert (Ale_INFO,NULL, + Txt_The_institutional_code_of_the_course_X_has_not_changed, + Crs_EditingCrs->ShrtName); } /*****************************************************************************/ @@ -1867,43 +1861,41 @@ void Crs_ChangeCrsYear (void) Par_GetParText ("OthCrsYear",YearStr,2); NewYear = Deg_ConvStrToYear (YearStr); + /* Get data of the course */ Crs_GetCourseDataByCod (Crs_EditingCrs); - - if (Crs_CheckIfICanEdit (Crs_EditingCrs)) - { - if (NewYear <= Deg_MAX_YEARS_PER_DEGREE) // If year is valid - { - /***** If name of course was in database in the new year... *****/ - if (Crs_DB_CheckIfCrsNameExistsInYearOfDeg ("ShortName",Crs_EditingCrs->ShrtName, - -1L,Crs_EditingCrs->DegCod,NewYear)) - Ale_CreateAlert (Ale_WARNING,NULL, - Txt_The_course_X_already_exists_in_year_Y, - Crs_EditingCrs->ShrtName, - Txt_YEAR_OF_DEGREE[NewYear]); - else if (Crs_DB_CheckIfCrsNameExistsInYearOfDeg ("FullName",Crs_EditingCrs->FullName, - -1L,Crs_EditingCrs->DegCod,NewYear)) - Ale_CreateAlert (Ale_WARNING,NULL, - Txt_The_course_X_already_exists_in_year_Y, - Crs_EditingCrs->FullName, - Txt_YEAR_OF_DEGREE[NewYear]); - else // Update year in database - { - /***** Update year in table of courses *****/ - Crs_UpdateCrsYear (Crs_EditingCrs,NewYear); - - /***** Create message to show the change made *****/ - Ale_CreateAlert (Ale_SUCCESS,NULL, - Txt_The_year_of_the_course_X_has_changed, - Crs_EditingCrs->ShrtName); - } - } - else // Year not valid - Ale_CreateAlert (Ale_WARNING,NULL, - Txt_The_year_X_is_not_allowed, - NewYear); - } - else + if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) Err_NoPermissionExit (); + + if (NewYear <= Deg_MAX_YEARS_PER_DEGREE) // If year is valid + { + /***** If name of course was in database in the new year... *****/ + if (Crs_DB_CheckIfCrsNameExistsInYearOfDeg ("ShortName",Crs_EditingCrs->ShrtName, + -1L,Crs_EditingCrs->DegCod,NewYear)) + Ale_CreateAlert (Ale_WARNING,NULL, + Txt_The_course_X_already_exists_in_year_Y, + Crs_EditingCrs->ShrtName, + Txt_YEAR_OF_DEGREE[NewYear]); + else if (Crs_DB_CheckIfCrsNameExistsInYearOfDeg ("FullName",Crs_EditingCrs->FullName, + -1L,Crs_EditingCrs->DegCod,NewYear)) + Ale_CreateAlert (Ale_WARNING,NULL, + Txt_The_course_X_already_exists_in_year_Y, + Crs_EditingCrs->FullName, + Txt_YEAR_OF_DEGREE[NewYear]); + else // Update year in database + { + /***** Update year in table of courses *****/ + Crs_UpdateCrsYear (Crs_EditingCrs,NewYear); + + /***** Create message to show the change made *****/ + Ale_CreateAlert (Ale_SUCCESS,NULL, + Txt_The_year_of_the_course_X_has_changed, + Crs_EditingCrs->ShrtName); + } + } + else // Year not valid + Ale_CreateAlert (Ale_WARNING,NULL, + Txt_The_year_X_is_not_allowed, + NewYear); } /*****************************************************************************/ @@ -1995,45 +1987,42 @@ void Crs_RenameCourse (struct Crs_Course *Crs,Cns_ShrtOrFullName_t ShrtOrFullNam /***** Get from the database the data of the degree *****/ Crs_GetCourseDataByCod (Crs); + if (!Crs_CheckIfICanEdit (Crs)) + Err_NoPermissionExit (); - if (Crs_CheckIfICanEdit (Crs)) + /***** Check if new name is empty *****/ + if (NewCrsName[0]) { - /***** Check if new name is empty *****/ - if (NewCrsName[0]) - { - /***** Check if old and new names are the same - (this happens when return is pressed without changes) *****/ - if (strcmp (CurrentCrsName,NewCrsName)) // Different names - { - /***** If course was in database... *****/ - if (Crs_DB_CheckIfCrsNameExistsInYearOfDeg (ParName,NewCrsName,Crs->CrsCod, - Crs->DegCod,Crs->Year)) - Ale_CreateAlert (Ale_WARNING,NULL, - Txt_The_course_X_already_exists, - NewCrsName); - else - { - /* Update the table changing old name by new name */ - Crs_DB_UpdateCrsName (Crs->CrsCod,FldName,NewCrsName); + /***** Check if old and new names are the same + (this happens when return is pressed without changes) *****/ + if (strcmp (CurrentCrsName,NewCrsName)) // Different names + { + /***** If course was in database... *****/ + if (Crs_DB_CheckIfCrsNameExistsInYearOfDeg (ParName,NewCrsName,Crs->CrsCod, + Crs->DegCod,Crs->Year)) + Ale_CreateAlert (Ale_WARNING,NULL, + Txt_The_course_X_already_exists, + NewCrsName); + else + { + /* Update the table changing old name by new name */ + Crs_DB_UpdateCrsName (Crs->CrsCod,FldName,NewCrsName); - /* Create alert to show the change made */ - Ale_CreateAlert (Ale_SUCCESS,NULL, - Txt_The_course_X_has_been_renamed_as_Y, - CurrentCrsName,NewCrsName); + /* Create alert to show the change made */ + Ale_CreateAlert (Ale_SUCCESS,NULL, + Txt_The_course_X_has_been_renamed_as_Y, + CurrentCrsName,NewCrsName); - /* Change current course name in order to display it properly */ - Str_Copy (CurrentCrsName,NewCrsName,MaxBytes); - } - } - else // The same name - Ale_CreateAlert (Ale_INFO,NULL, - Txt_The_name_X_has_not_changed,CurrentCrsName); - } - else - Ale_CreateAlertYouCanNotLeaveFieldEmpty (); + /* Change current course name in order to display it properly */ + Str_Copy (CurrentCrsName,NewCrsName,MaxBytes); + } + } + else // The same name + Ale_CreateAlert (Ale_INFO,NULL, + Txt_The_name_X_has_not_changed,CurrentCrsName); } else - Err_NoPermissionExit (); + Ale_CreateAlertYouCanNotLeaveFieldEmpty (); } /*****************************************************************************/ diff --git a/swad_forum.c b/swad_forum.c index 57d89272..6c2c21f6 100644 --- a/swad_forum.c +++ b/swad_forum.c @@ -3085,30 +3085,29 @@ void For_RemoveThread (void) /***** Get parameters related to forum *****/ For_GetParsForums (&Forums); - if (PermissionThreadDeletion[Forums.Forum.Type] & - (1 << Gbl.Usrs.Me.Role.Logged)) // If I have permission to remove thread in this forum... + /***** Check if I have permission to remove thread in this forum *****/ + if (!(PermissionThreadDeletion[Forums.Forum.Type] & + (1 << Gbl.Usrs.Me.Role.Logged))) + Err_NoPermissionExit (); + + /***** Get subject of thread to delete *****/ + For_DB_GetThrSubject (Forums.Thread.Current,Subject); + + /***** Remove the thread and all its posts *****/ + For_RemoveThreadAndItsPsts (Forums.Thread.Current); + + /***** Show forum list again *****/ + For_ShowForumList (&Forums); + + /***** Show the threads again *****/ + if (Subject[0]) { - /***** Get subject of thread to delete *****/ - For_DB_GetThrSubject (Forums.Thread.Current,Subject); - - /***** Remove the thread and all its posts *****/ - For_RemoveThreadAndItsPsts (Forums.Thread.Current); - - /***** Show forum list again *****/ - For_ShowForumList (&Forums); - - /***** Show the threads again *****/ - if (Subject[0]) - { - snprintf (Message,sizeof (Message), - Txt_Thread_X_removed,Subject); - For_ShowForumThreadsHighlightingOneThread (&Forums,Ale_SUCCESS,Message); - } - else - For_ShowForumThreadsHighlightingOneThread (&Forums,Ale_SUCCESS,Txt_Thread_removed); + snprintf (Message,sizeof (Message), + Txt_Thread_X_removed,Subject); + For_ShowForumThreadsHighlightingOneThread (&Forums,Ale_SUCCESS,Message); } else - Err_NoPermissionExit (); + For_ShowForumThreadsHighlightingOneThread (&Forums,Ale_SUCCESS,Txt_Thread_removed); } /*****************************************************************************/ diff --git a/swad_game.c b/swad_game.c index f09be20b..1687f533 100644 --- a/swad_game.c +++ b/swad_game.c @@ -1410,41 +1410,37 @@ void Gam_ReceiveFormGame (void) /***** Get parameters *****/ ItsANewGame = ((Games.Game.GamCod = Gam_GetPars (&Games)) <= 0); - /***** If I can edit games ==> receive game from form *****/ - if (Gam_CheckIfICanEditGames ()) + /***** Receive game from form *****/ + Gam_ReceiveGameFieldsFromForm (&Games.Game,Txt); + if (Gam_CheckGameFieldsReceivedFromForm (&Games.Game)) { - Gam_ReceiveGameFieldsFromForm (&Games.Game,Txt); - if (Gam_CheckGameFieldsReceivedFromForm (&Games.Game)) - { - /***** Create a new game or update an existing one *****/ - if (ItsANewGame) - Gam_CreateGame (&Games.Game,Txt); // Add new game to database - else - Gam_UpdateGame (&Games.Game,Txt); // Update game data in database - - /***** Put forms to edit the game created or updated *****/ - Gam_PutFormsEditionGame (&Games,Txt, - false); // No new game - - /***** Show questions of the game ready to be edited ******/ - Gam_ListGameQuestions (&Games); - } + /***** Create a new game or update an existing one *****/ + if (ItsANewGame) + Gam_CreateGame (&Games.Game,Txt); // Add new game to database else - { - /***** Put forms to create/edit the game *****/ - Gam_PutFormsEditionGame (&Games,Txt,ItsANewGame); + Gam_UpdateGame (&Games.Game,Txt); // Update game data in database - /***** Show games or questions *****/ - if (ItsANewGame) - /* Show games again */ - Gam_ListAllGames (&Games); - else - /* Show questions of the game ready to be edited */ - Gam_ListGameQuestions (&Games); - } + /***** Put forms to edit the game created or updated *****/ + Gam_PutFormsEditionGame (&Games,Txt, + false); // No new game + + /***** Show questions of the game ready to be edited ******/ + Gam_ListGameQuestions (&Games); } else - Err_NoPermissionExit (); + { + /***** Put forms to create/edit the game *****/ + Gam_PutFormsEditionGame (&Games,Txt,ItsANewGame); + + /***** Show games or questions *****/ + if (ItsANewGame) + /* Show games again */ + Gam_ListAllGames (&Games); + else + /* Show questions of the game ready to be edited */ + Gam_ListGameQuestions (&Games); + } + } static void Gam_ReceiveGameFieldsFromForm (struct Gam_Game *Game, diff --git a/swad_match.c b/swad_match.c index 5a1e814d..6e3616dd 100644 --- a/swad_match.c +++ b/swad_match.c @@ -2044,12 +2044,10 @@ static void Mch_ShowMatchStatusForTch (struct Mch_Match *Match) static void Mch_ShowMatchStatusForStd (struct Mch_Match *Match,Mch_Update_t Update) { - bool ICanPlayThisMatchBasedOnGrps; struct Mch_UsrAnswer UsrAnswer; /***** Can I play this match? *****/ - ICanPlayThisMatchBasedOnGrps = Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match); - if (!ICanPlayThisMatchBasedOnGrps) + if (!Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match)) Err_NoPermissionExit (); /***** Get student's answer to this question diff --git a/swad_match_result.c b/swad_match_result.c index 9e897a02..4b829f75 100644 --- a/swad_match_result.c +++ b/swad_match_result.c @@ -1104,190 +1104,187 @@ void MchRes_ShowOneMchResult (void) /***** Check if I can view this match result and score *****/ MchRes_CheckIfICanSeeMatchResult (&Games.Game,&Match,UsrDat->UsrCod,&ICanView); - - if (ICanView.Result) // I am allowed to view this match result - { - /***** Get questions and user's answers of the match result from database *****/ - Mch_GetMatchQuestionsFromDB (&Print); - - /***** Begin box *****/ - Box_BoxBegin (NULL,Match.Title, - NULL,NULL, - Hlp_ASSESSMENT_Games_results,Box_NOT_CLOSABLE); - Lay_WriteHeaderClassPhoto (false,false, - Gbl.Hierarchy.Ins.InsCod, - Gbl.Hierarchy.Deg.DegCod, - Gbl.Hierarchy.Crs.CrsCod); - - /***** Begin table *****/ - HTM_TABLE_BeginWideMarginPadding (10); - - /***** User *****/ - /* Get data of the user who answer the match */ - if (!Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (UsrDat, - Usr_DONT_GET_PREFS, - Usr_GET_ROLE_IN_CURRENT_CRS)) - Err_WrongUserExit (); - if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat)) - Err_NoPermissionExit (); - - /* Get if user has accepted enrolment */ - UsrDat->Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (UsrDat); - - /* User */ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_ROLES_SINGUL_Abc[UsrDat->Roles.InCurrentCrs][UsrDat->Sex]); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - ID_WriteUsrIDs (UsrDat,NULL); - HTM_TxtF (" %s",UsrDat->Surname1); - if (UsrDat->Surname2[0]) - HTM_TxtF (" %s",UsrDat->Surname2); - if (UsrDat->FrstName[0]) - HTM_TxtF (", %s",UsrDat->FrstName); - HTM_BR (); - Pho_ShowUsrPhotoIfAllowed (UsrDat, - ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Start/end time (for user in this match) *****/ - for (StartEndTime = (Dat_StartEndTime_t) 0; - StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); - StartEndTime++) - { - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_START_END_TIME[StartEndTime]); - HTM_TD_End (); - - if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0) - Err_NotEnoughMemoryExit (); - HTM_TD_Begin ("id=\"%s\" class=\"LB DAT_%s\"", - Id,The_GetSuffix ()); - Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime], - Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA, - true,true,true,0x7); - HTM_TD_End (); - free (Id); - - HTM_TR_End (); - } - - /***** Number of questions *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Questions); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - HTM_Unsigned (Print.NumQsts.All); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Number of answers *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Answers); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - HTM_Unsigned (Print.NumQsts.NotBlank); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Score *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Score); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - if (ICanView.Score) - { - HTM_STRONG_Begin (); - HTM_Double2Decimals (Print.Score); - HTM_Txt ("/"); - HTM_Unsigned (Print.NumQsts.All); - HTM_STRONG_End (); - } - else - Ico_PutIconNotVisible (); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Grade *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Grade); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - if (ICanView.Score) - { - HTM_STRONG_Begin (); - TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade); - HTM_STRONG_End (); - } - else - Ico_PutIconNotVisible (); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Tags present in this result *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Tags); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - Gam_ShowTstTagsPresentInAGame (Match.GamCod); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Write answers and solutions *****/ - TstPrn_ShowPrintAnswers (UsrDat, - Print.NumQsts.All, - Print.PrintedQuestions, - Print.TimeUTC, - Games.Game.Visibility); - - /***** End table *****/ - HTM_TABLE_End (); - - /***** End box *****/ - Box_BoxEnd (); - } - else // I am not allowed to view this match result + if (!ICanView.Result) Err_NoPermissionExit (); + + /***** Get questions and user's answers of the match result from database *****/ + Mch_GetMatchQuestionsFromDB (&Print); + + /***** Begin box *****/ + Box_BoxBegin (NULL,Match.Title, + NULL,NULL, + Hlp_ASSESSMENT_Games_results,Box_NOT_CLOSABLE); + Lay_WriteHeaderClassPhoto (false,false, + Gbl.Hierarchy.Ins.InsCod, + Gbl.Hierarchy.Deg.DegCod, + Gbl.Hierarchy.Crs.CrsCod); + + /***** Begin table *****/ + HTM_TABLE_BeginWideMarginPadding (10); + + /***** User *****/ + /* Get data of the user who answer the match */ + if (!Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (UsrDat, + Usr_DONT_GET_PREFS, + Usr_GET_ROLE_IN_CURRENT_CRS)) + Err_WrongUserExit (); + if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat)) + Err_NoPermissionExit (); + + /* Get if user has accepted enrolment */ + UsrDat->Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (UsrDat); + + /* User */ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_ROLES_SINGUL_Abc[UsrDat->Roles.InCurrentCrs][UsrDat->Sex]); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + ID_WriteUsrIDs (UsrDat,NULL); + HTM_TxtF (" %s",UsrDat->Surname1); + if (UsrDat->Surname2[0]) + HTM_TxtF (" %s",UsrDat->Surname2); + if (UsrDat->FrstName[0]) + HTM_TxtF (", %s",UsrDat->FrstName); + HTM_BR (); + Pho_ShowUsrPhotoIfAllowed (UsrDat, + ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Start/end time (for user in this match) *****/ + for (StartEndTime = (Dat_StartEndTime_t) 0; + StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); + StartEndTime++) + { + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_START_END_TIME[StartEndTime]); + HTM_TD_End (); + + if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0) + Err_NotEnoughMemoryExit (); + HTM_TD_Begin ("id=\"%s\" class=\"LB DAT_%s\"", + Id,The_GetSuffix ()); + Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime], + Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA, + true,true,true,0x7); + HTM_TD_End (); + free (Id); + + HTM_TR_End (); + } + + /***** Number of questions *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Questions); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + HTM_Unsigned (Print.NumQsts.All); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Number of answers *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Answers); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + HTM_Unsigned (Print.NumQsts.NotBlank); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Score *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Score); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + if (ICanView.Score) + { + HTM_STRONG_Begin (); + HTM_Double2Decimals (Print.Score); + HTM_Txt ("/"); + HTM_Unsigned (Print.NumQsts.All); + HTM_STRONG_End (); + } + else + Ico_PutIconNotVisible (); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Grade *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Grade); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + if (ICanView.Score) + { + HTM_STRONG_Begin (); + TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade); + HTM_STRONG_End (); + } + else + Ico_PutIconNotVisible (); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Tags present in this result *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Tags); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + Gam_ShowTstTagsPresentInAGame (Match.GamCod); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Write answers and solutions *****/ + TstPrn_ShowPrintAnswers (UsrDat, + Print.NumQsts.All, + Print.PrintedQuestions, + Print.TimeUTC, + Games.Game.Visibility); + + /***** End table *****/ + HTM_TABLE_End (); + + /***** End box *****/ + Box_BoxEnd (); } /*****************************************************************************/ diff --git a/swad_project.c b/swad_project.c index 19f146ab..1246d37b 100644 --- a/swad_project.c +++ b/swad_project.c @@ -196,7 +196,7 @@ static Usr_Who_t Prj_GetParWho (void); static void Prj_ShowProjectsHead (struct Prj_Projects *Projects); static void Prj_ShowTableAllProjectsHead (void); -static bool Prj_CheckIfICanCreateProjects (void); +static bool Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects); static void Prj_PutIconToCreateNewPrj (struct Prj_Projects *Projects); static void Prj_PutButtonToCreateNewPrj (struct Prj_Projects *Projects); static void Prj_PutIconToShowAllData (struct Prj_Projects *Projects); @@ -318,29 +318,34 @@ long Prj_GetPrjCod (void) } /*****************************************************************************/ -/******************************* Reset projects ******************************/ +/*********** Reset projects and read configuration from database *************/ /*****************************************************************************/ -void Prj_ResetProjects (struct Prj_Projects *Projects) +void Prj_ResetPrjsAndReadConfig (struct Prj_Projects *Projects) { - Projects->Config.Editable = PrjCfg_EDITABLE_DEFAULT; - Projects->Filter.Who = Prj_FILTER_WHO_DEFAULT; - Projects->Filter.Assign = Prj_FILTER_ASSIGNED_DEFAULT | - Prj_FILTER_NONASSIG_DEFAULT; - Projects->Filter.Hidden = Prj_FILTER_HIDDEN_DEFAULT | - Prj_FILTER_VISIBL_DEFAULT; - Projects->Filter.Faulti = Prj_FILTER_FAULTY_DEFAULT | - Prj_FILTER_FAULTLESS_DEFAULT; - Projects->Filter.Review = Prj_FILTER_UNREVIEWED_DEFAULT | - Prj_FILTER_UNAPPROVED_DEFAULT | - Prj_FILTER_APPROVED_DEFAULT; - Projects->Filter.DptCod = Prj_FILTER_DPT_DEFAULT; - Projects->LstIsRead = false; // List is not read - Projects->Num = 0; - Projects->LstPrjCods = NULL; - Projects->SelectedOrder = Prj_ORDER_DEFAULT; - Projects->CurrentPage = 0; - Projects->Prj.PrjCod = -1L; + /***** Filters *****/ + Projects->Filter.Who = Prj_FILTER_WHO_DEFAULT; + Projects->Filter.Assign = Prj_FILTER_ASSIGNED_DEFAULT | + Prj_FILTER_NONASSIG_DEFAULT; + Projects->Filter.Hidden = Prj_FILTER_HIDDEN_DEFAULT | + Prj_FILTER_VISIBL_DEFAULT; + Projects->Filter.Faulti = Prj_FILTER_FAULTY_DEFAULT | + Prj_FILTER_FAULTLESS_DEFAULT; + Projects->Filter.Review = Prj_FILTER_UNREVIEWED_DEFAULT | + Prj_FILTER_UNAPPROVED_DEFAULT | + Prj_FILTER_APPROVED_DEFAULT; + Projects->Filter.DptCod = Prj_FILTER_DPT_DEFAULT; + + /***** Project list *****/ + Projects->LstIsRead = false; // List is not read + Projects->Num = 0; + Projects->LstPrjCods = NULL; + Projects->SelectedOrder = Prj_ORDER_DEFAULT; + Projects->CurrentPage = 0; + Projects->Prj.PrjCod = -1L; + + /***** Read project configuration from database *****/ + PrjCfg_GetConfig (Projects); } /*****************************************************************************/ @@ -352,7 +357,7 @@ void Prj_ListUsrsToSelect (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Get parameters *****/ Prj_GetPars (&Projects); @@ -386,7 +391,7 @@ void Prj_SeeProjects (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Get parameters *****/ Prj_GetPars (&Projects); @@ -440,7 +445,7 @@ void Prj_ShowTableSelectedPrjs (void) unsigned NumPrj; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Get parameters *****/ Prj_GetPars (&Projects); @@ -591,7 +596,7 @@ static void Prj_ShowPrjsInCurrentPage (void *Projects) Ale_ShowAlert (Ale_INFO,Txt_No_projects); /***** Button to create a new project *****/ - if (Prj_CheckIfICanCreateProjects ()) + if (Prj_CheckIfICanCreateProjects ((struct Prj_Projects *) Projects)) Prj_PutButtonToCreateNewPrj ((struct Prj_Projects *) Projects); /***** End box *****/ @@ -1211,23 +1216,18 @@ static void Prj_ShowTableAllProjectsHead (void) /********************** Check if I can create projects ***********************/ /*****************************************************************************/ -static bool Prj_CheckIfICanCreateProjects (void) +static bool Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects) { - static const bool ICanCreateProjects[Rol_NUM_ROLES] = + switch (Gbl.Usrs.Me.Role.Logged) { - [Rol_UNK ] = false, - [Rol_GST ] = false, - [Rol_USR ] = false, - [Rol_STD ] = false, - [Rol_NET ] = true, - [Rol_TCH ] = true, - [Rol_DEG_ADM] = true, - [Rol_CTR_ADM] = true, - [Rol_INS_ADM] = true, - [Rol_SYS_ADM] = true, - }; - - return ICanCreateProjects[Gbl.Usrs.Me.Role.Logged]; + case Rol_NET: + return Projects->Config.NETCanCreate; + case Rol_TCH: + case Rol_SYS_ADM: + return true; + default: + return false; + } } /*****************************************************************************/ @@ -1243,7 +1243,7 @@ void Prj_PutIconsListProjects (void *Projects) ICanConfigAllProjects = PrjCfg_CheckIfICanConfig (); /***** Put icon to create a new project *****/ - if (Prj_CheckIfICanCreateProjects ()) + if (Prj_CheckIfICanCreateProjects ((struct Prj_Projects *) Projects)) Prj_PutIconToCreateNewPrj ((struct Prj_Projects *) Projects); if (((struct Prj_Projects *) Projects)->Num) @@ -1317,7 +1317,7 @@ void Prj_ShowOneProject (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Get parameters *****/ Prj_GetPars (&Projects); @@ -1406,7 +1406,7 @@ void Prj_PrintOneProject (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -2807,7 +2807,7 @@ void Prj_ReqAddStds (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); Prj_FormToSelectStds (&Projects); } @@ -2817,7 +2817,7 @@ void Prj_ReqAddTuts (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); Prj_FormToSelectTuts (&Projects); } @@ -2827,7 +2827,7 @@ void Prj_ReqAddEvls (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); Prj_FormToSelectEvls (&Projects); } @@ -2938,7 +2938,7 @@ static void Prj_AddUsrsToProject (Prj_RoleInProject_t RoleInPrj) const char *Ptr; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Get parameters *****/ Prj_GetPars (&Projects); @@ -2988,7 +2988,7 @@ void Prj_ReqRemStd (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_STD); } @@ -2998,7 +2998,7 @@ void Prj_ReqRemTut (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_TUT); } @@ -3008,7 +3008,7 @@ void Prj_ReqRemEvl (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_EVL); } @@ -3110,7 +3110,7 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInPrj) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -3494,7 +3494,7 @@ void Prj_ReqRemProject (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -3506,16 +3506,17 @@ void Prj_ReqRemProject (void) /***** Get data of the project from database *****/ Prj_GetProjectDataByCod (&Projects.Prj); - if (Prj_CheckIfICanEditProject (&Projects.Prj)) - /***** Show question and button to remove the project *****/ - Ale_ShowAlertAndButton (ActRemPrj,NULL,NULL, - Prj_PutCurrentPars,&Projects, - Btn_REMOVE_BUTTON,Txt_Remove_project, - Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_project_X, - Projects.Prj.Title); - else + /***** Check if I can edit this project *****/ + if (!Prj_CheckIfICanEditProject (&Projects.Prj)) Err_NoPermissionExit (); + /***** Show question and button to remove the project *****/ + Ale_ShowAlertAndButton (ActRemPrj,NULL,NULL, + Prj_PutCurrentPars,&Projects, + Btn_REMOVE_BUTTON,Txt_Remove_project, + Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_project_X, + Projects.Prj.Title); + /***** Free memory of the project *****/ Prj_FreeMemProject (&Projects.Prj); @@ -3534,7 +3535,7 @@ void Prj_RemoveProject (void) char PathRelPrj[PATH_MAX + 1]; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -3546,33 +3547,32 @@ void Prj_RemoveProject (void) /***** Get data of the project from database *****/ Prj_GetProjectDataByCod (&Projects.Prj); // Inside this function, the course is checked to be the current one - if (Prj_CheckIfICanEditProject (&Projects.Prj)) - { - /***** Remove users in project *****/ - Prj_DB_RemoveUsrsFromPrj (Projects.Prj.PrjCod); - - /***** Flush cache *****/ - Prj_FlushCacheMyRolesInProject (); - - /***** Remove project *****/ - Prj_DB_RemovePrj (Projects.Prj.PrjCod); - - /***** Remove information related to files in project *****/ - Brw_DB_RemovePrjFiles (Projects.Prj.PrjCod); - - /***** Remove directory of the project *****/ - snprintf (PathRelPrj,sizeof (PathRelPrj),"%s/%ld/%s/%02u/%ld", - Cfg_PATH_CRS_PRIVATE,Projects.Prj.CrsCod,Cfg_FOLDER_PRJ, - (unsigned) (Projects.Prj.PrjCod % 100),Projects.Prj.PrjCod); - Fil_RemoveTree (PathRelPrj); - - /***** Write message to show the change made *****/ - Ale_ShowAlert (Ale_SUCCESS,Txt_Project_X_removed, - Projects.Prj.Title); - } - else + /***** Check if I can edit this project *****/ + if (!Prj_CheckIfICanEditProject (&Projects.Prj)) Err_NoPermissionExit (); + /***** Remove users in project *****/ + Prj_DB_RemoveUsrsFromPrj (Projects.Prj.PrjCod); + + /***** Flush cache *****/ + Prj_FlushCacheMyRolesInProject (); + + /***** Remove project *****/ + Prj_DB_RemovePrj (Projects.Prj.PrjCod); + + /***** Remove information related to files in project *****/ + Brw_DB_RemovePrjFiles (Projects.Prj.PrjCod); + + /***** Remove directory of the project *****/ + snprintf (PathRelPrj,sizeof (PathRelPrj),"%s/%ld/%s/%02u/%ld", + Cfg_PATH_CRS_PRIVATE,Projects.Prj.CrsCod,Cfg_FOLDER_PRJ, + (unsigned) (Projects.Prj.PrjCod % 100),Projects.Prj.PrjCod); + Fil_RemoveTree (PathRelPrj); + + /***** Write message to show the change made *****/ + Ale_ShowAlert (Ale_SUCCESS,Txt_Project_X_removed, + Projects.Prj.Title); + /***** Free memory of the project *****/ Prj_FreeMemProject (&Projects.Prj); @@ -3589,7 +3589,7 @@ void Prj_HideProject (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -3601,12 +3601,13 @@ void Prj_HideProject (void) /***** Get data of the project from database *****/ Prj_GetProjectDataByCod (&Projects.Prj); - /***** Hide project *****/ - if (Prj_CheckIfICanEditProject (&Projects.Prj)) - Prj_DB_HideOrUnhideProject (Projects.Prj.PrjCod,true); - else + /***** Check if I can edit this project *****/ + if (!Prj_CheckIfICanEditProject (&Projects.Prj)) Err_NoPermissionExit (); + /***** Hide project *****/ + Prj_DB_HideOrUnhideProject (Projects.Prj.PrjCod,true); + /***** Free memory of the project *****/ Prj_FreeMemProject (&Projects.Prj); @@ -3623,7 +3624,7 @@ void Prj_UnhideProject (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -3635,12 +3636,13 @@ void Prj_UnhideProject (void) /***** Get data of the project from database *****/ Prj_GetProjectDataByCod (&Projects.Prj); - /***** Unhide project *****/ - if (Prj_CheckIfICanEditProject (&Projects.Prj)) - Prj_DB_HideOrUnhideProject (Projects.Prj.PrjCod,false); - else + /***** Check if I can edit this project *****/ + if (!Prj_CheckIfICanEditProject (&Projects.Prj)) Err_NoPermissionExit (); + /***** Unhide project *****/ + Prj_DB_HideOrUnhideProject (Projects.Prj.PrjCod,false); + /***** Free memory of the project *****/ Prj_FreeMemProject (&Projects.Prj); @@ -3657,7 +3659,11 @@ void Prj_ReqCreatePrj (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Check if I can create new projects *****/ + if (!Prj_CheckIfICanCreateProjects (&Projects)) + Err_NoPermissionExit (); /***** Get parameters *****/ Prj_GetPars (&Projects); @@ -3672,7 +3678,7 @@ void Prj_ReqEditPrj (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Get parameters *****/ Prj_GetPars (&Projects); @@ -4017,7 +4023,7 @@ void Prj_ReceiveFormProject (void) bool NewProjectIsCorrect = true; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -4031,7 +4037,7 @@ void Prj_ReceiveFormProject (void) /* Reset project data */ Prj_ResetProject (&Projects.Prj); - ICanEditProject = true; + ICanEditProject = Prj_CheckIfICanCreateProjects (&Projects); } else { @@ -4041,79 +4047,78 @@ void Prj_ReceiveFormProject (void) ICanEditProject = Prj_CheckIfICanEditProject (&Projects.Prj); } - if (ICanEditProject) + /* Check if I can create/edit project */ + if (!ICanEditProject) + Err_NoPermissionExit (); + + /* Get project title */ + Par_GetParText ("Title",Projects.Prj.Title,Prj_MAX_BYTES_TITLE); + + /* Get department */ + Projects.Prj.DptCod = ParCod_GetPar (ParCod_Dpt); + + /* Get whether the project is assigned */ + Projects.Prj.Assigned = (Par_GetParBool ("Assigned")) ? Prj_ASSIGNED : + Prj_NONASSIG; + + /* Get number of students */ + Projects.Prj.NumStds = (unsigned) + Par_GetParUnsignedLong ("NumStds", + 0, + UINT_MAX, + 1); + + /* Get status */ + Projects.Prj.Proposal = (Prj_Proposal_t) + Par_GetParUnsignedLong ("Proposal", + 0, + Prj_NUM_PROPOSAL_TYPES - 1, + (unsigned long) Prj_PROPOSAL_DEFAULT); + + /* Get project description, required knowledge and required materials */ + Par_GetParHTML ("Description",Projects.Prj.Description,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) + Par_GetParHTML ("Knowledge" ,Projects.Prj.Knowledge ,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) + Par_GetParHTML ("Materials" ,Projects.Prj.Materials ,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) + + /* Get degree WWW */ + Par_GetParText ("URL",Projects.Prj.URL,Cns_MAX_BYTES_WWW); + + /***** Check if title is correct *****/ + if (!Projects.Prj.Title[0]) // If there is not a project title { - /* Get project title */ - Par_GetParText ("Title",Projects.Prj.Title,Prj_MAX_BYTES_TITLE); + NewProjectIsCorrect = false; + Ale_ShowAlertYouMustSpecifyTheTitle (); + } - /* Get department */ - Projects.Prj.DptCod = ParCod_GetPar (ParCod_Dpt); - - /* Get whether the project is assigned */ - Projects.Prj.Assigned = (Par_GetParBool ("Assigned")) ? Prj_ASSIGNED : - Prj_NONASSIG; - - /* Get number of students */ - Projects.Prj.NumStds = (unsigned) - Par_GetParUnsignedLong ("NumStds", - 0, - UINT_MAX, - 1); - - /* Get status */ - Projects.Prj.Proposal = (Prj_Proposal_t) - Par_GetParUnsignedLong ("Proposal", - 0, - Prj_NUM_PROPOSAL_TYPES - 1, - (unsigned long) Prj_PROPOSAL_DEFAULT); - - /* Get project description, required knowledge and required materials */ - Par_GetParHTML ("Description",Projects.Prj.Description,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) - Par_GetParHTML ("Knowledge" ,Projects.Prj.Knowledge ,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) - Par_GetParHTML ("Materials" ,Projects.Prj.Materials ,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) - - /* Get degree WWW */ - Par_GetParText ("URL",Projects.Prj.URL,Cns_MAX_BYTES_WWW); - - /***** Check if title is correct *****/ - if (!Projects.Prj.Title[0]) // If there is not a project title + /***** Create a new project or update an existing one *****/ + if (NewProjectIsCorrect) + { + if (ItsANewProject) { - NewProjectIsCorrect = false; - Ale_ShowAlertYouMustSpecifyTheTitle (); - } + /* Create project */ + Prj_CreateProject (&Projects.Prj); // Add new project to database - /***** Create a new project or update an existing one *****/ - if (NewProjectIsCorrect) + /* Write success message */ + Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_project_X, + Projects.Prj.Title); + } + else if (NewProjectIsCorrect) { - if (ItsANewProject) - { - /* Create project */ - Prj_CreateProject (&Projects.Prj); // Add new project to database + /* Update project */ + Prj_UpdateProject (&Projects.Prj); - /* Write success message */ - Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_project_X, - Projects.Prj.Title); - } - else if (NewProjectIsCorrect) - { - /* Update project */ - Prj_UpdateProject (&Projects.Prj); - - /* Write success message */ - Ale_ShowAlert (Ale_SUCCESS,Txt_The_project_has_been_modified); - } + /* Write success message */ + Ale_ShowAlert (Ale_SUCCESS,Txt_The_project_has_been_modified); } - else - Prj_PutFormProject (&Projects,ItsANewProject); - - /***** Show again form to edit project *****/ - Prj_ReqCreatOrEditPrj (&Projects); } else - Err_NoPermissionExit (); + Prj_PutFormProject (&Projects,ItsANewProject); /***** Free memory of the project *****/ Prj_FreeMemProject (&Projects.Prj); + + /***** Show again form to edit project *****/ + Prj_ReqCreatOrEditPrj (&Projects); } /*****************************************************************************/ @@ -4178,32 +4183,31 @@ void Prj_ReqLockSelectedPrjsEdition (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Check if I can configure projects *****/ + if (!PrjCfg_CheckIfICanConfig ()) + Err_NoPermissionExit (); /***** Get parameters *****/ Prj_GetPars (&Projects); /***** Show question and button to lock all selected projects *****/ - if (PrjCfg_CheckIfICanConfig ()) - { - /* Get list of projects */ - Prj_GetListProjects (&Projects); + /* Get list of projects */ + Prj_GetListProjects (&Projects); - /* Show question and button */ - if (Projects.Num) - Ale_ShowAlertAndButton (ActLckAllPrj,NULL,NULL, - Prj_PutCurrentPars,&Projects, - Btn_REMOVE_BUTTON,Txt_Lock_editing, - Ale_QUESTION,Txt_Do_you_want_to_lock_the_editing_of_the_X_selected_projects, - Projects.Num); - else // No projects found - Ale_ShowAlert (Ale_INFO,Txt_No_projects); + /* Show question and button */ + if (Projects.Num) + Ale_ShowAlertAndButton (ActLckAllPrj,NULL,NULL, + Prj_PutCurrentPars,&Projects, + Btn_REMOVE_BUTTON,Txt_Lock_editing, + Ale_QUESTION,Txt_Do_you_want_to_lock_the_editing_of_the_X_selected_projects, + Projects.Num); + else // No projects found + Ale_ShowAlert (Ale_INFO,Txt_No_projects); - /* Free list of projects */ - Prj_FreeListProjects (&Projects); - } - else - Err_NoPermissionExit (); + /* Free list of projects */ + Prj_FreeListProjects (&Projects); /***** Show projects again *****/ Prj_ShowProjects (&Projects); @@ -4217,32 +4221,31 @@ void Prj_ReqUnloSelectedPrjsEdition (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Check if I can configure projects *****/ + if (!PrjCfg_CheckIfICanConfig ()) + Err_NoPermissionExit (); /***** Get parameters *****/ Prj_GetPars (&Projects); /***** Show question and button to unlock all selected projects *****/ - if (PrjCfg_CheckIfICanConfig ()) - { - /* Get list of projects */ - Prj_GetListProjects (&Projects); + /* Get list of projects */ + Prj_GetListProjects (&Projects); - /* Show question and button */ - if (Projects.Num) - Ale_ShowAlertAndButton (ActUnlAllPrj,NULL,NULL, - Prj_PutCurrentPars,&Projects, - Btn_CREATE_BUTTON,Txt_Unlock_editing, - Ale_QUESTION,Txt_Do_you_want_to_unlock_the_editing_of_the_X_selected_projects, - Projects.Num); - else // No projects found - Ale_ShowAlert (Ale_INFO,Txt_No_projects); + /* Show question and button */ + if (Projects.Num) + Ale_ShowAlertAndButton (ActUnlAllPrj,NULL,NULL, + Prj_PutCurrentPars,&Projects, + Btn_CREATE_BUTTON,Txt_Unlock_editing, + Ale_QUESTION,Txt_Do_you_want_to_unlock_the_editing_of_the_X_selected_projects, + Projects.Num); + else // No projects found + Ale_ShowAlert (Ale_INFO,Txt_No_projects); - /* Free list of projects */ - Prj_FreeListProjects (&Projects); - } - else - Err_NoPermissionExit (); + /* Free list of projects */ + Prj_FreeListProjects (&Projects); /***** Show projects again *****/ Prj_ShowProjects (&Projects); @@ -4259,31 +4262,30 @@ void Prj_LockSelectedPrjsEdition (void) unsigned NumPrj; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Check if I can configure projects *****/ + if (!PrjCfg_CheckIfICanConfig ()) + Err_NoPermissionExit (); /***** Get parameters *****/ Prj_GetPars (&Projects); /***** Lock all selected projects *****/ - if (PrjCfg_CheckIfICanConfig ()) - { - /* Get list of projects */ - Prj_GetListProjects (&Projects); + /* Get list of projects */ + Prj_GetListProjects (&Projects); - /* Lock projects */ - if (Projects.Num) - for (NumPrj = 0; - NumPrj < Projects.Num; - NumPrj++) - Prj_DB_LockProjectEdition (Projects.LstPrjCods[NumPrj]); - else // No projects found - Ale_ShowAlert (Ale_INFO,Txt_No_projects); + /* Lock projects */ + if (Projects.Num) + for (NumPrj = 0; + NumPrj < Projects.Num; + NumPrj++) + Prj_DB_LockProjectEdition (Projects.LstPrjCods[NumPrj]); + else // No projects found + Ale_ShowAlert (Ale_INFO,Txt_No_projects); - /* Free list of projects */ - Prj_FreeListProjects (&Projects); - } - else - Err_NoPermissionExit (); + /* Free list of projects */ + Prj_FreeListProjects (&Projects); /***** Show projects again *****/ Prj_ShowProjects (&Projects); @@ -4296,31 +4298,30 @@ void Prj_UnloSelectedPrjsEdition (void) unsigned NumPrj; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Check if I can configure projects *****/ + if (!PrjCfg_CheckIfICanConfig ()) + Err_NoPermissionExit (); /***** Get parameters *****/ Prj_GetPars (&Projects); /***** Unlock all selected projects *****/ - if (PrjCfg_CheckIfICanConfig ()) - { - /* Get list of projects */ - Prj_GetListProjects (&Projects); + /* Get list of projects */ + Prj_GetListProjects (&Projects); - /* Unlock projects */ - if (Projects.Num) - for (NumPrj = 0; - NumPrj < Projects.Num; - NumPrj++) - Prj_DB_UnlockProjectEdition (Projects.LstPrjCods[NumPrj]); - else // No projects found - Ale_ShowAlert (Ale_INFO,Txt_No_projects); + /* Unlock projects */ + if (Projects.Num) + for (NumPrj = 0; + NumPrj < Projects.Num; + NumPrj++) + Prj_DB_UnlockProjectEdition (Projects.LstPrjCods[NumPrj]); + else // No projects found + Ale_ShowAlert (Ale_INFO,Txt_No_projects); - /* Free list of projects */ - Prj_FreeListProjects (&Projects); - } - else - Err_NoPermissionExit (); + /* Free list of projects */ + Prj_FreeListProjects (&Projects); /***** Show projects again *****/ Prj_ShowProjects (&Projects); @@ -4387,7 +4388,11 @@ void Prj_LockProjectEdition (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Check if I can configure projects *****/ + if (!PrjCfg_CheckIfICanConfig ()) + Err_NoPermissionExit (); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -4399,17 +4404,12 @@ void Prj_LockProjectEdition (void) /***** Get data of the project from database *****/ Prj_GetProjectDataByCod (&Projects.Prj); - if (Prj_CheckIfICanEditProject (&Projects.Prj)) - { - /***** Lock project edition *****/ - Prj_DB_LockProjectEdition (Projects.Prj.PrjCod); - Projects.Prj.Locked = Prj_LOCKED; + /***** Lock project edition *****/ + Prj_DB_LockProjectEdition (Projects.Prj.PrjCod); + Projects.Prj.Locked = Prj_LOCKED; - /***** Show updated form and icon *****/ - Prj_FormLockUnlock (&Projects.Prj); - } - else - Err_NoPermissionExit (); + /***** Show updated form and icon *****/ + Prj_FormLockUnlock (&Projects.Prj); /***** Free memory of the project *****/ Prj_FreeMemProject (&Projects.Prj); @@ -4424,7 +4424,11 @@ void Prj_UnloProjectEdition (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Check if I can configure projects *****/ + if (!PrjCfg_CheckIfICanConfig ()) + Err_NoPermissionExit (); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -4436,17 +4440,12 @@ void Prj_UnloProjectEdition (void) /***** Get data of the project from database *****/ Prj_GetProjectDataByCod (&Projects.Prj); - if (Prj_CheckIfICanEditProject (&Projects.Prj)) - { - /***** Unlock project edition *****/ - Prj_DB_UnlockProjectEdition (Projects.Prj.PrjCod); - Projects.Prj.Locked = Prj_UNLOCKED; + /***** Unlock project edition *****/ + Prj_DB_UnlockProjectEdition (Projects.Prj.PrjCod); + Projects.Prj.Locked = Prj_UNLOCKED; - /***** Show updated form and icon *****/ - Prj_FormLockUnlock (&Projects.Prj); - } - else - Err_NoPermissionExit (); + /***** Show updated form and icon *****/ + Prj_FormLockUnlock (&Projects.Prj); /***** Free memory of the project *****/ Prj_FreeMemProject (&Projects.Prj); @@ -4461,7 +4460,11 @@ void Prj_ChangeReviewStatus (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Check if I can review projects *****/ + if (!Prj_CheckIfICanReviewProjects ()) + Err_NoPermissionExit (); /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Projects.Prj); @@ -4473,15 +4476,10 @@ void Prj_ChangeReviewStatus (void) /***** Get data of the project from database *****/ Prj_GetProjectDataByCod (&Projects.Prj); - /***** Hide project *****/ - if (Prj_CheckIfICanReviewProjects ()) - { - Projects.Prj.Review.Status = Prj_GetParReviewStatus (); - Par_GetParHTML ("ReviewTxt",Projects.Prj.Review.Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) - Prj_DB_UpdateReview (&Projects.Prj); - } - else - Err_NoPermissionExit (); + /***** Update review *****/ + Projects.Prj.Review.Status = Prj_GetParReviewStatus (); + Par_GetParHTML ("ReviewTxt",Projects.Prj.Review.Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) + Prj_DB_UpdateReview (&Projects.Prj); /***** Free memory of the project *****/ Prj_FreeMemProject (&Projects.Prj); diff --git a/swad_project.h b/swad_project.h index 3155d04b..a073c947 100644 --- a/swad_project.h +++ b/swad_project.h @@ -37,7 +37,7 @@ /*****************************************************************************/ /***** Configuration *****/ -#define PrjCfg_EDITABLE_DEFAULT true +#define PrjCfg_NET_CAN_CREATE_DEFAULT true /***** Filters to list projects *****/ /* Whose projects */ @@ -187,7 +187,7 @@ struct Prj_Projects Prj_ProjectView_t View; struct { - bool Editable; + bool NETCanCreate; } Config; struct Prj_Filter Filter; bool LstIsRead; // Is the list already read from database, or it needs to be read? @@ -206,7 +206,7 @@ struct Prj_Projects void Prj_SetPrjCod (long PrjCod); long Prj_GetPrjCod (void); -void Prj_ResetProjects (struct Prj_Projects *Projects); +void Prj_ResetPrjsAndReadConfig (struct Prj_Projects *Projects); void Prj_ListUsrsToSelect (void); void Prj_SeeProjects (void); @@ -264,8 +264,6 @@ void Prj_UnhideProject (void); void Prj_ReceiveFormProject (void); -void PrjCfg_ShowFormConfig (void); -void PrjCfg_ReceiveConfig (void); void Prj_ReqLockSelectedPrjsEdition (void); void Prj_ReqUnloSelectedPrjsEdition (void); void Prj_LockSelectedPrjsEdition (void); diff --git a/swad_project_config.c b/swad_project_config.c index 4e5e05ef..5e8ad934 100644 --- a/swad_project_config.c +++ b/swad_project_config.c @@ -47,12 +47,29 @@ extern struct Globals Gbl; /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static void PrjCfg_ShowFormConfigEditableByNET (const struct Prj_Projects *Projects); +static void PrjCfg_ShowFormNETCanCreate (const struct Prj_Projects *Projects); -static void PrjCfg_GetCrsPrjsConfig (struct Prj_Projects *Projects); static void PrjCfg_GetConfigDataFromRow (MYSQL_RES *mysql_res, struct Prj_Projects *Projects); -static bool PrjCfg_GetEditableFromForm (void); +static bool PrjCfg_GetIfNETCanCreateFromForm (void); + +/*****************************************************************************/ +/************** Get configuration of projects for current course *************/ +/*****************************************************************************/ + +void PrjCfg_GetConfig (struct Prj_Projects *Projects) + { + MYSQL_RES *mysql_res; + + /***** Get configuration of projects for current course from database *****/ + if (Prj_DB_GetConfig (&mysql_res)) + PrjCfg_GetConfigDataFromRow (mysql_res,Projects); + else + Projects->Config.NETCanCreate = PrjCfg_NET_CAN_CREATE_DEFAULT; + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + } /*****************************************************************************/ /************************ Can I configure all projects? **********************/ @@ -81,10 +98,7 @@ void PrjCfg_ShowFormConfig (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); - - /***** Read projects configuration from database *****/ - PrjCfg_GetCrsPrjsConfig (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Begin box *****/ Box_BoxBegin (NULL,Txt_Configure_projects, @@ -97,7 +111,7 @@ void PrjCfg_ShowFormConfig (void) HTM_TABLE_BeginCenterPadding (2); /***** Projects are editable by non-editing teachers? *****/ - PrjCfg_ShowFormConfigEditableByNET (&Projects); + PrjCfg_ShowFormNETCanCreate (&Projects); HTM_TABLE_End (); @@ -112,49 +126,37 @@ void PrjCfg_ShowFormConfig (void) } /*****************************************************************************/ -/************** Projects are editable by non-editing teachers? ***************/ +/*************** Cam non-editing teachers create new projects? ***************/ /*****************************************************************************/ -static void PrjCfg_ShowFormConfigEditableByNET (const struct Prj_Projects *Projects) +static void PrjCfg_ShowFormNETCanCreate (const struct Prj_Projects *Projects) { - extern const char *Txt_Editable; - extern const char *Txt_Editable_by_non_editing_teachers; + extern const char *Txt_Create_project; + extern const char *Txt_Non_editing_teachers_can_create_new_projects; HTM_TR_Begin (NULL); /***** Label *****/ - Frm_LabelColumn ("RT","Editable",Txt_Editable); + HTM_TD_Begin ("class=\"RT FORM_IN_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Create_project); + HTM_TD_End (); /***** Data *****/ HTM_TD_Begin ("class=\"LT\""); - HTM_INPUT_CHECKBOX ("Editable",HTM_DONT_SUBMIT_ON_CHANGE, - "id=\"Editable\" value=\"Y\"%s", - Projects->Config.Editable ? " checked=\"checked\"" : - ""); - HTM_Txt (Txt_Editable_by_non_editing_teachers); + HTM_LABEL_Begin ("class=\"DAT_%s\"", + The_GetSuffix ()); + HTM_INPUT_CHECKBOX ("NETCanCreate",HTM_DONT_SUBMIT_ON_CHANGE, + "id=\"NETCanCreate\" value=\"Y\"%s", + Projects->Config.NETCanCreate ? " checked=\"checked\"" : + ""); + HTM_Txt (Txt_Non_editing_teachers_can_create_new_projects); + HTM_LABEL_End (); HTM_TD_End (); HTM_TR_End (); } -/*****************************************************************************/ -/************** Get configuration of projects for current course *************/ -/*****************************************************************************/ - -static void PrjCfg_GetCrsPrjsConfig (struct Prj_Projects *Projects) - { - MYSQL_RES *mysql_res; - - /***** Get configuration of projects for current course from database *****/ - if (Prj_DB_GetCrsPrjsConfig (&mysql_res)) - PrjCfg_GetConfigDataFromRow (mysql_res,Projects); - else - Projects->Config.Editable = PrjCfg_EDITABLE_DEFAULT; - - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); - } - /*****************************************************************************/ /************ Get configuration values from a database table row *************/ /*****************************************************************************/ @@ -167,8 +169,8 @@ static void PrjCfg_GetConfigDataFromRow (MYSQL_RES *mysql_res, /***** Get row *****/ row = mysql_fetch_row (mysql_res); - /***** Get whether project are visible via plugins or not *****/ - Projects->Config.Editable = (row[0][0] == 'Y'); + /***** Get whether non-editing teachers can create new projects or not *****/ + Projects->Config.NETCanCreate = (row[0][0] == 'Y'); } /*****************************************************************************/ @@ -181,13 +183,13 @@ void PrjCfg_ReceiveConfig (void) struct Prj_Projects Projects; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); - /***** Get whether projects are editable by non-editing teachers or not *****/ - Projects.Config.Editable = PrjCfg_GetEditableFromForm (); + /***** Get non-editing teachers can create new projects or not *****/ + Projects.Config.NETCanCreate = PrjCfg_GetIfNETCanCreateFromForm (); /***** Update database *****/ - Prj_DB_UpdateCrsPrjsConfig (Projects.Config.Editable); + Prj_DB_UpdateCrsPrjsConfig (Projects.Config.NETCanCreate); /***** Show confirmation message *****/ Ale_ShowAlert (Ale_SUCCESS,Txt_The_configuration_of_the_projects_has_been_updated); @@ -197,10 +199,10 @@ void PrjCfg_ReceiveConfig (void) } /*****************************************************************************/ -/****** Get if projects are editable by non-editing teachers from form *******/ +/****** Get if projects are creatable by non-editing teachers from form *******/ /*****************************************************************************/ -static bool PrjCfg_GetEditableFromForm (void) +static bool PrjCfg_GetIfNETCanCreateFromForm (void) { - return Par_GetParBool ("Editable"); + return Par_GetParBool ("NETCanCreate"); } diff --git a/swad_project_config.h b/swad_project_config.h index e7945dd3..ab5429cd 100644 --- a/swad_project_config.h +++ b/swad_project_config.h @@ -32,14 +32,15 @@ /*****************************************************************************/ /***** Configuration *****/ -#define PrjCfg_EDITABLE_DEFAULT true +#define PrjCfg_NET_CAN_CREATE_DEFAULT true /*****************************************************************************/ /***************************** Public prototypes *****************************/ /*****************************************************************************/ -bool PrjCfg_CheckIfICanConfig (void); +void PrjCfg_GetConfig (struct Prj_Projects *Projects); +bool PrjCfg_CheckIfICanConfig (void); void PrjCfg_ShowFormConfig (void); void PrjCfg_ReceiveConfig (void); diff --git a/swad_project_database.c b/swad_project_database.c index 4bda0c25..fab42c49 100644 --- a/swad_project_database.c +++ b/swad_project_database.c @@ -551,10 +551,10 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, /************** Get configuration of projects for current course *************/ /*****************************************************************************/ -unsigned Prj_DB_GetCrsPrjsConfig (MYSQL_RES **mysql_res) +unsigned Prj_DB_GetConfig (MYSQL_RES **mysql_res) { return (unsigned) - DB_QuerySELECT (mysql_res,"can not get configuration of test", + DB_QuerySELECT (mysql_res,"can not get project configuration", "SELECT Editable" // row[0] " FROM prj_config" " WHERE CrsCod=%ld", diff --git a/swad_project_database.h b/swad_project_database.h index b960325e..782753aa 100644 --- a/swad_project_database.h +++ b/swad_project_database.h @@ -46,7 +46,7 @@ void Prj_DB_UpdateReview (const struct Prj_Project *Prj); unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, const struct Prj_Projects *Projects, const char *UsrsSubQuery); // NULL if no users -unsigned Prj_DB_GetCrsPrjsConfig (MYSQL_RES **mysql_res); +unsigned Prj_DB_GetConfig (MYSQL_RES **mysql_res); unsigned Prj_DB_GetProjectDataByCod (MYSQL_RES **mysql_res,long PrjCod); void Prj_DB_GetProjectTitle (long PrjCod,char *Title,size_t TitleSize); unsigned Prj_DB_GetPrjDataToCheckFaults (MYSQL_RES **mysql_res,long PrjCod); diff --git a/swad_project_resource.c b/swad_project_resource.c index 073f2417..a1643b03 100644 --- a/swad_project_resource.c +++ b/swad_project_resource.c @@ -46,7 +46,7 @@ void PrjRsc_GetLinkToProject (void) char Title[Prj_MAX_BYTES_TITLE + 1]; /***** Reset projects *****/ - Prj_ResetProjects (&Projects); + Prj_ResetPrjsAndReadConfig (&Projects); /***** Get parameters *****/ Prj_GetPars (&Projects); diff --git a/swad_record.c b/swad_record.c index 8004d911..77250f35 100644 --- a/swad_record.c +++ b/swad_record.c @@ -1590,39 +1590,37 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView, switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: // I am a student - if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - { - switch (TypeOfView) - { - case Rec_CRS_LIST_ONE_RECORD: - case Rec_CRS_LIST_SEVERAL_RECORDS: - // When listing records, I can see only my record as student - TypeOfView = Rec_CRS_MY_RECORD_AS_STUDENT_FORM; - break; - case Rec_CRS_MY_RECORD_AS_STUDENT_FORM: - case Rec_CRS_MY_RECORD_AS_STUDENT_CHECK: - case Rec_CRS_PRINT_ONE_RECORD: - case Rec_CRS_PRINT_SEVERAL_RECORDS: - break; - default: - Err_NoPermissionExit (); - break; - } - - if (TypeOfView == Rec_CRS_MY_RECORD_AS_STUDENT_FORM) - /* Check if I can edit any of the record fields */ - for (NumField = 0; - NumField < Gbl.Crs.Records.LstFields.Num; - NumField++) - if (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD) - { - ICanEdit = true; - Frm_BeginForm (ActRcvRecCrs); - break; - } - } - else // Not me ==> I am a student trying to do something forbidden + if (Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER) // Not me ==> I am a student trying to do something forbidden Err_NoPermissionExit (); + + switch (TypeOfView) + { + case Rec_CRS_LIST_ONE_RECORD: + case Rec_CRS_LIST_SEVERAL_RECORDS: + // When listing records, I can see only my record as student + TypeOfView = Rec_CRS_MY_RECORD_AS_STUDENT_FORM; + break; + case Rec_CRS_MY_RECORD_AS_STUDENT_FORM: + case Rec_CRS_MY_RECORD_AS_STUDENT_CHECK: + case Rec_CRS_PRINT_ONE_RECORD: + case Rec_CRS_PRINT_SEVERAL_RECORDS: + break; + default: + Err_NoPermissionExit (); + break; + } + + if (TypeOfView == Rec_CRS_MY_RECORD_AS_STUDENT_FORM) + /* Check if I can edit any of the record fields */ + for (NumField = 0; + NumField < Gbl.Crs.Records.LstFields.Num; + NumField++) + if (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD) + { + ICanEdit = true; + Frm_BeginForm (ActRcvRecCrs); + break; + } break; case Rol_NET: break; diff --git a/swad_rubric_criteria.c b/swad_rubric_criteria.c index 426db4d7..d0dbb430 100644 --- a/swad_rubric_criteria.c +++ b/swad_rubric_criteria.c @@ -331,10 +331,6 @@ void RubCri_ChangeTitle (void) struct RubCri_Criterion Criterion; char NewTitle[RubCri_MAX_BYTES_TITLE + 1]; - /***** Check if I can edit rubrics *****/ - if (!Rub_CheckIfICanEditRubrics ()) - Err_NoPermissionExit (); - /***** Reset rubrics context *****/ Rub_ResetRubrics (&Rubrics); Rub_ResetRubric (&Rubrics.Rubric); @@ -383,10 +379,6 @@ static void RubCri_ChangeValueCriterion (RubCri_ValueRange_t ValueRange) struct RubCri_Criterion Criterion; char ValueStr[64]; - /***** Check if I can edit rubrics *****/ - if (!Rub_CheckIfICanEditRubrics ()) - Err_NoPermissionExit (); - /***** Reset rubrics context *****/ Rub_ResetRubrics (&Rubrics); Rub_ResetRubric (&Rubrics.Rubric); @@ -427,10 +419,6 @@ void RubCri_ChangeWeight (void) struct RubCri_Criterion Criterion; char WeightStr[64]; - /***** Check if I can edit rubrics *****/ - if (!Rub_CheckIfICanEditRubrics ()) - Err_NoPermissionExit (); - /***** Reset rubrics context *****/ Rub_ResetRubrics (&Rubrics); Rub_ResetRubric (&Rubrics.Rubric); diff --git a/swad_test_print.c b/swad_test_print.c index ded35abc..41befe6e 100644 --- a/swad_test_print.c +++ b/swad_test_print.c @@ -2212,193 +2212,190 @@ void TstPrn_ShowOnePrint (void) /***** Get test data *****/ TstPrn_GetPrintDataByPrnCod (&Print); - /***** Get if I can see print result and score *****/ + /***** Check if I can see print result and score *****/ if (Gbl.Usrs.Me.Role.Logged == Rol_STD) TstCfg_GetConfig (); // To get visibility TstRes_CheckIfICanSeePrintResult (&Print,Gbl.Usrs.Other.UsrDat.UsrCod,&ICanView); - - if (ICanView.Result) // I am allowed to view this test print result - { - /***** Get questions and user's answers of the test from database *****/ - if (!TstPrn_GetPrintQuestionsFromDB (&Print)) - Err_WrongExamExit (); - - /***** Begin box *****/ - Box_BoxBegin (NULL,Txt_Result, - NULL,NULL, - Hlp_ASSESSMENT_Tests_results,Box_NOT_CLOSABLE); - Lay_WriteHeaderClassPhoto (false,false, - Gbl.Hierarchy.Ins.InsCod, - Gbl.Hierarchy.Deg.DegCod, - Gbl.Hierarchy.Crs.CrsCod); - - /***** Begin table *****/ - HTM_TABLE_BeginWideMarginPadding (10); - - /***** User *****/ - /* Get data of the user who made the test */ - if (!Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, - Usr_DONT_GET_PREFS, - Usr_DONT_GET_ROLE_IN_CURRENT_CRS)) - Err_WrongUserExit (); - if (!Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) - Err_NoPermissionExit (); - - /* User */ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_ROLES_SINGUL_Abc[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs][Gbl.Usrs.Other.UsrDat.Sex]); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); - ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat,NULL); - HTM_TxtF (" %s",Gbl.Usrs.Other.UsrDat.Surname1); - if (Gbl.Usrs.Other.UsrDat.Surname2[0]) - HTM_TxtF (" %s",Gbl.Usrs.Other.UsrDat.Surname2); - if (Gbl.Usrs.Other.UsrDat.FrstName[0]) - HTM_TxtF (", %s",Gbl.Usrs.Other.UsrDat.FrstName); - HTM_BR (); - Pho_ShowUsrPhotoIfAllowed (&Gbl.Usrs.Other.UsrDat, - ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Start/end time (for user in this test print) *****/ - for (StartEndTime = (Dat_StartEndTime_t) 0; - StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); - StartEndTime++) - { - if (asprintf (&Id,"tst_date_%u",(unsigned) StartEndTime) < 0) - Err_NotEnoughMemoryExit (); - - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_START_END_TIME[StartEndTime]); - HTM_TD_End (); - - HTM_TD_Begin ("id=\"%s\" class=\"LB DAT_%s\"", - Id,The_GetSuffix ()); - Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime], - Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA, - true,true,true,0x7); - HTM_TD_End (); - - HTM_TR_End (); - - free (Id); - } - - /***** Number of questions *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Questions); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - HTM_Unsigned (Print.NumQsts.All); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Number of answers *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Answers); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - HTM_Unsigned (Print.NumQsts.NotBlank); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Score *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Score); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - if (ICanView.Score) - { - HTM_STRONG_Begin (); - HTM_Double2Decimals (Print.Score); - HTM_Txt ("/"); - HTM_Unsigned (Print.NumQsts.All); - HTM_STRONG_End (); - } - else - Ico_PutIconNotVisible (); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Grade *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Grade); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - if (ICanView.Score) - { - HTM_STRONG_Begin (); - TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX); - HTM_STRONG_End (); - } - else - Ico_PutIconNotVisible (); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Tags present in this test *****/ - HTM_TR_Begin (NULL); - - HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", - The_GetSuffix ()); - HTM_TxtColon (Txt_Tags); - HTM_TD_End (); - - HTM_TD_Begin ("class=\"LB DAT_%s\"", - The_GetSuffix ()); - TstPrn_ShowTagsPresentInAPrint (Print.PrnCod); - HTM_TD_End (); - - HTM_TR_End (); - - /***** Write answers and solutions *****/ - TstPrn_ShowPrintAnswers (&Gbl.Usrs.Other.UsrDat, - Print.NumQsts.All, - Print.PrintedQuestions, - Print.TimeUTC, - TstCfg_GetConfigVisibility ()); - - /***** End table *****/ - HTM_TABLE_End (); - - /***** End box *****/ - Box_BoxEnd (); - } - else // I am not allowed to view this test + if (!ICanView.Result) // I am not allowed to view this test Err_NoPermissionExit (); + + /***** Get questions and user's answers of the test from database *****/ + if (!TstPrn_GetPrintQuestionsFromDB (&Print)) + Err_WrongExamExit (); + + /***** Begin box *****/ + Box_BoxBegin (NULL,Txt_Result, + NULL,NULL, + Hlp_ASSESSMENT_Tests_results,Box_NOT_CLOSABLE); + Lay_WriteHeaderClassPhoto (false,false, + Gbl.Hierarchy.Ins.InsCod, + Gbl.Hierarchy.Deg.DegCod, + Gbl.Hierarchy.Crs.CrsCod); + + /***** Begin table *****/ + HTM_TABLE_BeginWideMarginPadding (10); + + /***** User *****/ + /* Get data of the user who made the test */ + if (!Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, + Usr_DONT_GET_PREFS, + Usr_DONT_GET_ROLE_IN_CURRENT_CRS)) + Err_WrongUserExit (); + if (!Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + Err_NoPermissionExit (); + + /* User */ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_ROLES_SINGUL_Abc[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs][Gbl.Usrs.Other.UsrDat.Sex]); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); + ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat,NULL); + HTM_TxtF (" %s",Gbl.Usrs.Other.UsrDat.Surname1); + if (Gbl.Usrs.Other.UsrDat.Surname2[0]) + HTM_TxtF (" %s",Gbl.Usrs.Other.UsrDat.Surname2); + if (Gbl.Usrs.Other.UsrDat.FrstName[0]) + HTM_TxtF (", %s",Gbl.Usrs.Other.UsrDat.FrstName); + HTM_BR (); + Pho_ShowUsrPhotoIfAllowed (&Gbl.Usrs.Other.UsrDat, + ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Start/end time (for user in this test print) *****/ + for (StartEndTime = (Dat_StartEndTime_t) 0; + StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1); + StartEndTime++) + { + if (asprintf (&Id,"tst_date_%u",(unsigned) StartEndTime) < 0) + Err_NotEnoughMemoryExit (); + + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_START_END_TIME[StartEndTime]); + HTM_TD_End (); + + HTM_TD_Begin ("id=\"%s\" class=\"LB DAT_%s\"", + Id,The_GetSuffix ()); + Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime], + Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA, + true,true,true,0x7); + HTM_TD_End (); + + HTM_TR_End (); + + free (Id); + } + + /***** Number of questions *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Questions); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + HTM_Unsigned (Print.NumQsts.All); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Number of answers *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Answers); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + HTM_Unsigned (Print.NumQsts.NotBlank); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Score *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Score); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + if (ICanView.Score) + { + HTM_STRONG_Begin (); + HTM_Double2Decimals (Print.Score); + HTM_Txt ("/"); + HTM_Unsigned (Print.NumQsts.All); + HTM_STRONG_End (); + } + else + Ico_PutIconNotVisible (); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Grade *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Grade); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + if (ICanView.Score) + { + HTM_STRONG_Begin (); + TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX); + HTM_STRONG_End (); + } + else + Ico_PutIconNotVisible (); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Tags present in this test *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"", + The_GetSuffix ()); + HTM_TxtColon (Txt_Tags); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"LB DAT_%s\"", + The_GetSuffix ()); + TstPrn_ShowTagsPresentInAPrint (Print.PrnCod); + HTM_TD_End (); + + HTM_TR_End (); + + /***** Write answers and solutions *****/ + TstPrn_ShowPrintAnswers (&Gbl.Usrs.Other.UsrDat, + Print.NumQsts.All, + Print.PrintedQuestions, + Print.TimeUTC, + TstCfg_GetConfigVisibility ()); + + /***** End table *****/ + HTM_TABLE_End (); + + /***** End box *****/ + Box_BoxEnd (); } /*****************************************************************************/ diff --git a/swad_text.c b/swad_text.c index f3d40b2e..6dc0a1fd 100644 --- a/swad_text.c +++ b/swad_text.c @@ -12031,50 +12031,27 @@ const char *Txt_Edit_rich_text = "Edit rich text"; // Çeviri lazim! #endif -const char *Txt_Editable = +const char *Txt_Non_editing_teachers_can_create_new_projects = #if L==1 // ca - "Editables"; + "Els professors no editors poden crear nous projectes"; #elif L==2 // de - "Bearbeitbare"; + "Nicht bearbeitende Lehrern können neue Projekte erstellen"; #elif L==3 // en - "Editable"; + "Non-editing teachers can create new projects"; #elif L==4 // es - "Editables"; + "Los profesores no editores pueden crear nuevos proyectos"; #elif L==5 // fr - "Éditables"; + "Les enseignants non éditeurs peuvent créer de nouveaux projets"; #elif L==6 // gn - "Ojeeditákuaa"; + "Mbo'eháa ndaha'éiva editor ikatu omoheñói proyecto pyahu"; #elif L==7 // it - "Modificabili"; + "Gli insegnanti non editori possono creare nuovi progetti"; #elif L==8 // pl - "Edytowalne"; + "Nauczyciele nieedytujący mogą tworzyć nowe projekty"; #elif L==9 // pt - "Editáveis"; + "Professores não editores podem criar novos projetos"; #elif L==10 // tr - "Düzenlenebilir"; -#endif - -const char *Txt_Editable_by_non_editing_teachers = -#if L==1 // ca - "Editables per professors no editors"; -#elif L==2 // de - "Bearbeitbare von nicht bearbeitenden Lehrern"; -#elif L==3 // en - "Editable by non-editing teachers"; -#elif L==4 // es - "Editables por profesores no editores"; -#elif L==5 // fr - "Éditables par des enseignants non-éditeurs"; -#elif L==6 // gn - "Omohendakuaa mbo'ehára ndaha'éiva edición"; -#elif L==7 // it - "Modificabili da professori non-editing"; -#elif L==8 // pl - "Edytowalne przez nauczycieli, którzy nie dokonali edycji"; -#elif L==9 // pt - "Editáveis por professores não editores"; -#elif L==10 // tr - "Düzenleme yapmayan öğretmenler tarafından düzenlenebilir"; + "Editör olmayan öğretmenler yeni projeler oluşturabilir"; #endif const char *Txt_eg_A_B = @@ -21415,7 +21392,7 @@ const char *Txt_MENU_TITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] = #elif L==5 // fr "Plugins" #elif L==6 // gn - "Complementos" // Okoteve traducción + "Complementos" #elif L==7 // it "Plugin" #elif L==8 // pl @@ -32144,7 +32121,7 @@ const char *Txt_Plugins = #elif L==5 // fr "Plugins"; #elif L==6 // gn - "Complementos"; // Okoteve traducción + "Complementos"; #elif L==7 // it "Plugin"; #elif L==8 // pl @@ -32152,7 +32129,7 @@ const char *Txt_Plugins = #elif L==9 // pt "Plugins"; #elif L==10 // tr - "Plugins"; // Çeviri lazim! + "Eklentiler"; #endif const char *Txt_Possibly_duplicate_users =