Version 22.93: Apr 10, 2023 Changes in configuration of projects.

This commit is contained in:
acanas 2023-04-10 14:41:20 +02:00
parent 479179e82c
commit cfddb5c174
19 changed files with 948 additions and 1011 deletions

View File

@ -94,6 +94,7 @@
#include "swad_program.h" #include "swad_program.h"
#include "swad_program_resource.h" #include "swad_program_resource.h"
#include "swad_project.h" #include "swad_project.h"
#include "swad_project_config.h"
#include "swad_project_resource.h" #include "swad_project_resource.h"
#include "swad_question_import.h" #include "swad_question_import.h"
#include "swad_QR.h" #include "swad_QR.h"

View File

@ -8293,93 +8293,90 @@ void Brw_ChgFileMetadata (void)
{ {
/***** Check if I can change file metadata *****/ /***** Check if I can change file metadata *****/
IAmTheOwner = Brw_CheckIfIAmOwnerOfFile (FileMetadata.PublisherUsrCod); IAmTheOwner = Brw_CheckIfIAmOwnerOfFile (FileMetadata.PublisherUsrCod);
if (Brw_CheckIfICanEditFileMetadata (IAmTheOwner)) if (!Brw_CheckIfICanEditFileMetadata (IAmTheOwner))
{ Err_NoPermissionExit ();
/* Check if the file was public before the edition */
PublicFileBeforeEdition = FileMetadata.IsPublic;
/***** 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) switch (Gbl.FileBrowser.Type)
{ {
case Brw_ADMI_DOC_INS: case Brw_ADMI_DOC_INS:
case Brw_ADMI_SHR_INS: TmlNot_StoreAndPublishNote (TmlNot_INS_DOC_PUB_FILE,FileMetadata.FilCod);
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; break;
case Brw_ADMI_DOC_GRP: case Brw_ADMI_SHR_INS:
case Brw_ADMI_TCH_CRS: TmlNot_StoreAndPublishNote (TmlNot_INS_SHA_PUB_FILE,FileMetadata.FilCod);
case Brw_ADMI_TCH_GRP: break;
case Brw_ADMI_SHR_GRP: case Brw_ADMI_DOC_CTR:
case Brw_ADMI_ASG_USR: TmlNot_StoreAndPublishNote (TmlNot_CTR_DOC_PUB_FILE,FileMetadata.FilCod);
case Brw_ADMI_ASG_CRS: break;
case Brw_ADMI_WRK_USR: case Brw_ADMI_SHR_CTR:
case Brw_ADMI_WRK_CRS: TmlNot_StoreAndPublishNote (TmlNot_CTR_SHA_PUB_FILE,FileMetadata.FilCod);
case Brw_ADMI_DOC_PRJ: break;
case Brw_ADMI_ASS_PRJ: case Brw_ADMI_DOC_DEG:
case Brw_ADMI_BRF_USR: TmlNot_StoreAndPublishNote (TmlNot_DEG_DOC_PUB_FILE,FileMetadata.FilCod);
PublicFileAfterEdition = false; // Files in these zones can not be public break;
License = Brw_GetParLicense (); 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; break;
default: default:
PublicFileAfterEdition = false; // Files in other zones can not be public
License = Brw_LICENSE_DEFAULT;
break; break;
} }
/***** Change file metadata *****/ /***** Write sucess message *****/
Brw_DB_ChangeFilePublic (&FileMetadata,PublicFileAfterEdition,License); Ale_ShowAlert (Ale_SUCCESS,Txt_The_properties_of_file_X_have_been_saved,
FileMetadata.FilFolLnk.Name);
/***** 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 ();
} }
/***** Show again the file browser *****/ /***** Show again the file browser *****/

View File

@ -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. 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 CSS_FILE "swad22.88.css"
#define JS_FILE "swad22.49.js" #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.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.2: Apr 06, 2023 Code refactoring in resources. (338500 lines)
Version 22.92.1: Apr 06, 2023 Removed unused code in resources. (338514 lines) Version 22.92.1: Apr 06, 2023 Removed unused code in resources. (338514 lines)

View File

@ -1580,30 +1580,27 @@ void Crs_RemoveCourse (void)
/***** Get data of the course from database *****/ /***** Get data of the course from database *****/
Crs_GetCourseDataByCod (Crs_EditingCrs); Crs_GetCourseDataByCod (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (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
Err_NoPermissionExit (); 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 */ /* Get data of the course */
Crs_GetCourseDataByCod (Crs_EditingCrs); Crs_GetCourseDataByCod (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (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
Err_NoPermissionExit (); 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); Par_GetParText ("OthCrsYear",YearStr,2);
NewYear = Deg_ConvStrToYear (YearStr); NewYear = Deg_ConvStrToYear (YearStr);
/* Get data of the course */
Crs_GetCourseDataByCod (Crs_EditingCrs); Crs_GetCourseDataByCod (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (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
Err_NoPermissionExit (); 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 *****/ /***** Get from the database the data of the degree *****/
Crs_GetCourseDataByCod (Crs); 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 *****/ /***** Check if old and new names are the same
if (NewCrsName[0]) (this happens when return is pressed without changes) *****/
{ if (strcmp (CurrentCrsName,NewCrsName)) // Different names
/***** Check if old and new names are the same {
(this happens when return is pressed without changes) *****/ /***** If course was in database... *****/
if (strcmp (CurrentCrsName,NewCrsName)) // Different names if (Crs_DB_CheckIfCrsNameExistsInYearOfDeg (ParName,NewCrsName,Crs->CrsCod,
{ Crs->DegCod,Crs->Year))
/***** If course was in database... *****/ Ale_CreateAlert (Ale_WARNING,NULL,
if (Crs_DB_CheckIfCrsNameExistsInYearOfDeg (ParName,NewCrsName,Crs->CrsCod, Txt_The_course_X_already_exists,
Crs->DegCod,Crs->Year)) NewCrsName);
Ale_CreateAlert (Ale_WARNING,NULL, else
Txt_The_course_X_already_exists, {
NewCrsName); /* Update the table changing old name by new name */
else Crs_DB_UpdateCrsName (Crs->CrsCod,FldName,NewCrsName);
{
/* Update the table changing old name by new name */
Crs_DB_UpdateCrsName (Crs->CrsCod,FldName,NewCrsName);
/* Create alert to show the change made */ /* Create alert to show the change made */
Ale_CreateAlert (Ale_SUCCESS,NULL, Ale_CreateAlert (Ale_SUCCESS,NULL,
Txt_The_course_X_has_been_renamed_as_Y, Txt_The_course_X_has_been_renamed_as_Y,
CurrentCrsName,NewCrsName); CurrentCrsName,NewCrsName);
/* Change current course name in order to display it properly */ /* Change current course name in order to display it properly */
Str_Copy (CurrentCrsName,NewCrsName,MaxBytes); Str_Copy (CurrentCrsName,NewCrsName,MaxBytes);
} }
} }
else // The same name else // The same name
Ale_CreateAlert (Ale_INFO,NULL, Ale_CreateAlert (Ale_INFO,NULL,
Txt_The_name_X_has_not_changed,CurrentCrsName); Txt_The_name_X_has_not_changed,CurrentCrsName);
}
else
Ale_CreateAlertYouCanNotLeaveFieldEmpty ();
} }
else else
Err_NoPermissionExit (); Ale_CreateAlertYouCanNotLeaveFieldEmpty ();
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -3085,30 +3085,29 @@ void For_RemoveThread (void)
/***** Get parameters related to forum *****/ /***** Get parameters related to forum *****/
For_GetParsForums (&Forums); For_GetParsForums (&Forums);
if (PermissionThreadDeletion[Forums.Forum.Type] & /***** Check if I have permission to remove thread in this forum *****/
(1 << Gbl.Usrs.Me.Role.Logged)) // 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 *****/ snprintf (Message,sizeof (Message),
For_DB_GetThrSubject (Forums.Thread.Current,Subject); Txt_Thread_X_removed,Subject);
For_ShowForumThreadsHighlightingOneThread (&Forums,Ale_SUCCESS,Message);
/***** 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);
} }
else else
Err_NoPermissionExit (); For_ShowForumThreadsHighlightingOneThread (&Forums,Ale_SUCCESS,Txt_Thread_removed);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -1410,41 +1410,37 @@ void Gam_ReceiveFormGame (void)
/***** Get parameters *****/ /***** Get parameters *****/
ItsANewGame = ((Games.Game.GamCod = Gam_GetPars (&Games)) <= 0); ItsANewGame = ((Games.Game.GamCod = Gam_GetPars (&Games)) <= 0);
/***** If I can edit games ==> receive game from form *****/ /***** Receive game from form *****/
if (Gam_CheckIfICanEditGames ()) Gam_ReceiveGameFieldsFromForm (&Games.Game,Txt);
if (Gam_CheckGameFieldsReceivedFromForm (&Games.Game))
{ {
Gam_ReceiveGameFieldsFromForm (&Games.Game,Txt); /***** Create a new game or update an existing one *****/
if (Gam_CheckGameFieldsReceivedFromForm (&Games.Game)) if (ItsANewGame)
{ Gam_CreateGame (&Games.Game,Txt); // Add new game to database
/***** 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);
}
else else
{ Gam_UpdateGame (&Games.Game,Txt); // Update game data in database
/***** Put forms to create/edit the game *****/
Gam_PutFormsEditionGame (&Games,Txt,ItsANewGame);
/***** Show games or questions *****/ /***** Put forms to edit the game created or updated *****/
if (ItsANewGame) Gam_PutFormsEditionGame (&Games,Txt,
/* Show games again */ false); // No new game
Gam_ListAllGames (&Games);
else /***** Show questions of the game ready to be edited ******/
/* Show questions of the game ready to be edited */ Gam_ListGameQuestions (&Games);
Gam_ListGameQuestions (&Games);
}
} }
else 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, static void Gam_ReceiveGameFieldsFromForm (struct Gam_Game *Game,

View File

@ -2044,12 +2044,10 @@ static void Mch_ShowMatchStatusForTch (struct Mch_Match *Match)
static void Mch_ShowMatchStatusForStd (struct Mch_Match *Match,Mch_Update_t Update) static void Mch_ShowMatchStatusForStd (struct Mch_Match *Match,Mch_Update_t Update)
{ {
bool ICanPlayThisMatchBasedOnGrps;
struct Mch_UsrAnswer UsrAnswer; struct Mch_UsrAnswer UsrAnswer;
/***** Can I play this match? *****/ /***** Can I play this match? *****/
ICanPlayThisMatchBasedOnGrps = Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match); if (!Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match))
if (!ICanPlayThisMatchBasedOnGrps)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get student's answer to this question /***** Get student's answer to this question

View File

@ -1104,190 +1104,187 @@ void MchRes_ShowOneMchResult (void)
/***** Check if I can view this match result and score *****/ /***** Check if I can view this match result and score *****/
MchRes_CheckIfICanSeeMatchResult (&Games.Game,&Match,UsrDat->UsrCod,&ICanView); MchRes_CheckIfICanSeeMatchResult (&Games.Game,&Match,UsrDat->UsrCod,&ICanView);
if (!ICanView.Result)
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 ("&nbsp;%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
HTM_TxtF ("&nbsp;%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
Err_NoPermissionExit (); 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 ("&nbsp;%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
HTM_TxtF ("&nbsp;%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 ();
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -196,7 +196,7 @@ static Usr_Who_t Prj_GetParWho (void);
static void Prj_ShowProjectsHead (struct Prj_Projects *Projects); static void Prj_ShowProjectsHead (struct Prj_Projects *Projects);
static void Prj_ShowTableAllProjectsHead (void); 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_PutIconToCreateNewPrj (struct Prj_Projects *Projects);
static void Prj_PutButtonToCreateNewPrj (struct Prj_Projects *Projects); static void Prj_PutButtonToCreateNewPrj (struct Prj_Projects *Projects);
static void Prj_PutIconToShowAllData (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; /***** Filters *****/
Projects->Filter.Who = Prj_FILTER_WHO_DEFAULT; Projects->Filter.Who = Prj_FILTER_WHO_DEFAULT;
Projects->Filter.Assign = Prj_FILTER_ASSIGNED_DEFAULT | Projects->Filter.Assign = Prj_FILTER_ASSIGNED_DEFAULT |
Prj_FILTER_NONASSIG_DEFAULT; Prj_FILTER_NONASSIG_DEFAULT;
Projects->Filter.Hidden = Prj_FILTER_HIDDEN_DEFAULT | Projects->Filter.Hidden = Prj_FILTER_HIDDEN_DEFAULT |
Prj_FILTER_VISIBL_DEFAULT; Prj_FILTER_VISIBL_DEFAULT;
Projects->Filter.Faulti = Prj_FILTER_FAULTY_DEFAULT | Projects->Filter.Faulti = Prj_FILTER_FAULTY_DEFAULT |
Prj_FILTER_FAULTLESS_DEFAULT; Prj_FILTER_FAULTLESS_DEFAULT;
Projects->Filter.Review = Prj_FILTER_UNREVIEWED_DEFAULT | Projects->Filter.Review = Prj_FILTER_UNREVIEWED_DEFAULT |
Prj_FILTER_UNAPPROVED_DEFAULT | Prj_FILTER_UNAPPROVED_DEFAULT |
Prj_FILTER_APPROVED_DEFAULT; Prj_FILTER_APPROVED_DEFAULT;
Projects->Filter.DptCod = Prj_FILTER_DPT_DEFAULT; Projects->Filter.DptCod = Prj_FILTER_DPT_DEFAULT;
Projects->LstIsRead = false; // List is not read
Projects->Num = 0; /***** Project list *****/
Projects->LstPrjCods = NULL; Projects->LstIsRead = false; // List is not read
Projects->SelectedOrder = Prj_ORDER_DEFAULT; Projects->Num = 0;
Projects->CurrentPage = 0; Projects->LstPrjCods = NULL;
Projects->Prj.PrjCod = -1L; 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; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
@ -386,7 +391,7 @@ void Prj_SeeProjects (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
@ -440,7 +445,7 @@ void Prj_ShowTableSelectedPrjs (void)
unsigned NumPrj; unsigned NumPrj;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
@ -591,7 +596,7 @@ static void Prj_ShowPrjsInCurrentPage (void *Projects)
Ale_ShowAlert (Ale_INFO,Txt_No_projects); Ale_ShowAlert (Ale_INFO,Txt_No_projects);
/***** Button to create a new project *****/ /***** Button to create a new project *****/
if (Prj_CheckIfICanCreateProjects ()) if (Prj_CheckIfICanCreateProjects ((struct Prj_Projects *) Projects))
Prj_PutButtonToCreateNewPrj ((struct Prj_Projects *) Projects); Prj_PutButtonToCreateNewPrj ((struct Prj_Projects *) Projects);
/***** End box *****/ /***** End box *****/
@ -1211,23 +1216,18 @@ static void Prj_ShowTableAllProjectsHead (void)
/********************** Check if I can create projects ***********************/ /********************** 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, case Rol_NET:
[Rol_GST ] = false, return Projects->Config.NETCanCreate;
[Rol_USR ] = false, case Rol_TCH:
[Rol_STD ] = false, case Rol_SYS_ADM:
[Rol_NET ] = true, return true;
[Rol_TCH ] = true, default:
[Rol_DEG_ADM] = true, return false;
[Rol_CTR_ADM] = true, }
[Rol_INS_ADM] = true,
[Rol_SYS_ADM] = true,
};
return ICanCreateProjects[Gbl.Usrs.Me.Role.Logged];
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1243,7 +1243,7 @@ void Prj_PutIconsListProjects (void *Projects)
ICanConfigAllProjects = PrjCfg_CheckIfICanConfig (); ICanConfigAllProjects = PrjCfg_CheckIfICanConfig ();
/***** Put icon to create a new project *****/ /***** Put icon to create a new project *****/
if (Prj_CheckIfICanCreateProjects ()) if (Prj_CheckIfICanCreateProjects ((struct Prj_Projects *) Projects))
Prj_PutIconToCreateNewPrj ((struct Prj_Projects *) Projects); Prj_PutIconToCreateNewPrj ((struct Prj_Projects *) Projects);
if (((struct Prj_Projects *) Projects)->Num) if (((struct Prj_Projects *) Projects)->Num)
@ -1317,7 +1317,7 @@ void Prj_ShowOneProject (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
@ -1406,7 +1406,7 @@ void Prj_PrintOneProject (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -2807,7 +2807,7 @@ void Prj_ReqAddStds (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
Prj_FormToSelectStds (&Projects); Prj_FormToSelectStds (&Projects);
} }
@ -2817,7 +2817,7 @@ void Prj_ReqAddTuts (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
Prj_FormToSelectTuts (&Projects); Prj_FormToSelectTuts (&Projects);
} }
@ -2827,7 +2827,7 @@ void Prj_ReqAddEvls (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
Prj_FormToSelectEvls (&Projects); Prj_FormToSelectEvls (&Projects);
} }
@ -2938,7 +2938,7 @@ static void Prj_AddUsrsToProject (Prj_RoleInProject_t RoleInPrj)
const char *Ptr; const char *Ptr;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
@ -2988,7 +2988,7 @@ void Prj_ReqRemStd (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_STD); Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_STD);
} }
@ -2998,7 +2998,7 @@ void Prj_ReqRemTut (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_TUT); Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_TUT);
} }
@ -3008,7 +3008,7 @@ void Prj_ReqRemEvl (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_EVL); Prj_ReqRemUsrFromPrj (&Projects,Prj_ROLE_EVL);
} }
@ -3110,7 +3110,7 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInPrj)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -3494,7 +3494,7 @@ void Prj_ReqRemProject (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -3506,16 +3506,17 @@ void Prj_ReqRemProject (void)
/***** Get data of the project from database *****/ /***** Get data of the project from database *****/
Prj_GetProjectDataByCod (&Projects.Prj); Prj_GetProjectDataByCod (&Projects.Prj);
if (Prj_CheckIfICanEditProject (&Projects.Prj)) /***** Check if I can edit this project *****/
/***** Show question and button to remove the project *****/ if (!Prj_CheckIfICanEditProject (&Projects.Prj))
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
Err_NoPermissionExit (); 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 *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Projects.Prj); Prj_FreeMemProject (&Projects.Prj);
@ -3534,7 +3535,7 @@ void Prj_RemoveProject (void)
char PathRelPrj[PATH_MAX + 1]; char PathRelPrj[PATH_MAX + 1];
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -3546,33 +3547,32 @@ void Prj_RemoveProject (void)
/***** Get data of the project from database *****/ /***** Get data of the project from database *****/
Prj_GetProjectDataByCod (&Projects.Prj); // Inside this function, the course is checked to be the current one Prj_GetProjectDataByCod (&Projects.Prj); // Inside this function, the course is checked to be the current one
if (Prj_CheckIfICanEditProject (&Projects.Prj)) /***** Check if I can edit this project *****/
{ 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
Err_NoPermissionExit (); 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 *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Projects.Prj); Prj_FreeMemProject (&Projects.Prj);
@ -3589,7 +3589,7 @@ void Prj_HideProject (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -3601,12 +3601,13 @@ void Prj_HideProject (void)
/***** Get data of the project from database *****/ /***** Get data of the project from database *****/
Prj_GetProjectDataByCod (&Projects.Prj); Prj_GetProjectDataByCod (&Projects.Prj);
/***** Hide project *****/ /***** Check if I can edit this project *****/
if (Prj_CheckIfICanEditProject (&Projects.Prj)) if (!Prj_CheckIfICanEditProject (&Projects.Prj))
Prj_DB_HideOrUnhideProject (Projects.Prj.PrjCod,true);
else
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Hide project *****/
Prj_DB_HideOrUnhideProject (Projects.Prj.PrjCod,true);
/***** Free memory of the project *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Projects.Prj); Prj_FreeMemProject (&Projects.Prj);
@ -3623,7 +3624,7 @@ void Prj_UnhideProject (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -3635,12 +3636,13 @@ void Prj_UnhideProject (void)
/***** Get data of the project from database *****/ /***** Get data of the project from database *****/
Prj_GetProjectDataByCod (&Projects.Prj); Prj_GetProjectDataByCod (&Projects.Prj);
/***** Unhide project *****/ /***** Check if I can edit this project *****/
if (Prj_CheckIfICanEditProject (&Projects.Prj)) if (!Prj_CheckIfICanEditProject (&Projects.Prj))
Prj_DB_HideOrUnhideProject (Projects.Prj.PrjCod,false);
else
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Unhide project *****/
Prj_DB_HideOrUnhideProject (Projects.Prj.PrjCod,false);
/***** Free memory of the project *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Projects.Prj); Prj_FreeMemProject (&Projects.Prj);
@ -3657,7 +3659,11 @@ void Prj_ReqCreatePrj (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can create new projects *****/
if (!Prj_CheckIfICanCreateProjects (&Projects))
Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
@ -3672,7 +3678,7 @@ void Prj_ReqEditPrj (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
@ -4017,7 +4023,7 @@ void Prj_ReceiveFormProject (void)
bool NewProjectIsCorrect = true; bool NewProjectIsCorrect = true;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -4031,7 +4037,7 @@ void Prj_ReceiveFormProject (void)
/* Reset project data */ /* Reset project data */
Prj_ResetProject (&Projects.Prj); Prj_ResetProject (&Projects.Prj);
ICanEditProject = true; ICanEditProject = Prj_CheckIfICanCreateProjects (&Projects);
} }
else else
{ {
@ -4041,79 +4047,78 @@ void Prj_ReceiveFormProject (void)
ICanEditProject = Prj_CheckIfICanEditProject (&Projects.Prj); 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 */ NewProjectIsCorrect = false;
Par_GetParText ("Title",Projects.Prj.Title,Prj_MAX_BYTES_TITLE); Ale_ShowAlertYouMustSpecifyTheTitle ();
}
/* Get department */ /***** Create a new project or update an existing one *****/
Projects.Prj.DptCod = ParCod_GetPar (ParCod_Dpt); if (NewProjectIsCorrect)
{
/* Get whether the project is assigned */ if (ItsANewProject)
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
{ {
NewProjectIsCorrect = false; /* Create project */
Ale_ShowAlertYouMustSpecifyTheTitle (); Prj_CreateProject (&Projects.Prj); // Add new project to database
}
/***** Create a new project or update an existing one *****/ /* Write success message */
if (NewProjectIsCorrect) Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_project_X,
Projects.Prj.Title);
}
else if (NewProjectIsCorrect)
{ {
if (ItsANewProject) /* Update project */
{ Prj_UpdateProject (&Projects.Prj);
/* Create project */
Prj_CreateProject (&Projects.Prj); // Add new project to database
/* Write success message */ /* Write success message */
Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_project_X, Ale_ShowAlert (Ale_SUCCESS,Txt_The_project_has_been_modified);
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);
}
} }
else
Prj_PutFormProject (&Projects,ItsANewProject);
/***** Show again form to edit project *****/
Prj_ReqCreatOrEditPrj (&Projects);
} }
else else
Err_NoPermissionExit (); Prj_PutFormProject (&Projects,ItsANewProject);
/***** Free memory of the project *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Projects.Prj); 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; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ())
Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
/***** Show question and button to lock all selected 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 */ /* Show question and button */
if (Projects.Num) if (Projects.Num)
Ale_ShowAlertAndButton (ActLckAllPrj,NULL,NULL, Ale_ShowAlertAndButton (ActLckAllPrj,NULL,NULL,
Prj_PutCurrentPars,&Projects, Prj_PutCurrentPars,&Projects,
Btn_REMOVE_BUTTON,Txt_Lock_editing, Btn_REMOVE_BUTTON,Txt_Lock_editing,
Ale_QUESTION,Txt_Do_you_want_to_lock_the_editing_of_the_X_selected_projects, Ale_QUESTION,Txt_Do_you_want_to_lock_the_editing_of_the_X_selected_projects,
Projects.Num); Projects.Num);
else // No projects found else // No projects found
Ale_ShowAlert (Ale_INFO,Txt_No_projects); Ale_ShowAlert (Ale_INFO,Txt_No_projects);
/* Free list of projects */ /* Free list of projects */
Prj_FreeListProjects (&Projects); Prj_FreeListProjects (&Projects);
}
else
Err_NoPermissionExit ();
/***** Show projects again *****/ /***** Show projects again *****/
Prj_ShowProjects (&Projects); Prj_ShowProjects (&Projects);
@ -4217,32 +4221,31 @@ void Prj_ReqUnloSelectedPrjsEdition (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ())
Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
/***** Show question and button to unlock all selected 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 */ /* Show question and button */
if (Projects.Num) if (Projects.Num)
Ale_ShowAlertAndButton (ActUnlAllPrj,NULL,NULL, Ale_ShowAlertAndButton (ActUnlAllPrj,NULL,NULL,
Prj_PutCurrentPars,&Projects, Prj_PutCurrentPars,&Projects,
Btn_CREATE_BUTTON,Txt_Unlock_editing, Btn_CREATE_BUTTON,Txt_Unlock_editing,
Ale_QUESTION,Txt_Do_you_want_to_unlock_the_editing_of_the_X_selected_projects, Ale_QUESTION,Txt_Do_you_want_to_unlock_the_editing_of_the_X_selected_projects,
Projects.Num); Projects.Num);
else // No projects found else // No projects found
Ale_ShowAlert (Ale_INFO,Txt_No_projects); Ale_ShowAlert (Ale_INFO,Txt_No_projects);
/* Free list of projects */ /* Free list of projects */
Prj_FreeListProjects (&Projects); Prj_FreeListProjects (&Projects);
}
else
Err_NoPermissionExit ();
/***** Show projects again *****/ /***** Show projects again *****/
Prj_ShowProjects (&Projects); Prj_ShowProjects (&Projects);
@ -4259,31 +4262,30 @@ void Prj_LockSelectedPrjsEdition (void)
unsigned NumPrj; unsigned NumPrj;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ())
Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
/***** Lock all selected projects *****/ /***** Lock all selected projects *****/
if (PrjCfg_CheckIfICanConfig ()) /* Get list of projects */
{ Prj_GetListProjects (&Projects);
/* Get list of projects */
Prj_GetListProjects (&Projects);
/* Lock projects */ /* Lock projects */
if (Projects.Num) if (Projects.Num)
for (NumPrj = 0; for (NumPrj = 0;
NumPrj < Projects.Num; NumPrj < Projects.Num;
NumPrj++) NumPrj++)
Prj_DB_LockProjectEdition (Projects.LstPrjCods[NumPrj]); Prj_DB_LockProjectEdition (Projects.LstPrjCods[NumPrj]);
else // No projects found else // No projects found
Ale_ShowAlert (Ale_INFO,Txt_No_projects); Ale_ShowAlert (Ale_INFO,Txt_No_projects);
/* Free list of projects */ /* Free list of projects */
Prj_FreeListProjects (&Projects); Prj_FreeListProjects (&Projects);
}
else
Err_NoPermissionExit ();
/***** Show projects again *****/ /***** Show projects again *****/
Prj_ShowProjects (&Projects); Prj_ShowProjects (&Projects);
@ -4296,31 +4298,30 @@ void Prj_UnloSelectedPrjsEdition (void)
unsigned NumPrj; unsigned NumPrj;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ())
Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);
/***** Unlock all selected projects *****/ /***** Unlock all selected projects *****/
if (PrjCfg_CheckIfICanConfig ()) /* Get list of projects */
{ Prj_GetListProjects (&Projects);
/* Get list of projects */
Prj_GetListProjects (&Projects);
/* Unlock projects */ /* Unlock projects */
if (Projects.Num) if (Projects.Num)
for (NumPrj = 0; for (NumPrj = 0;
NumPrj < Projects.Num; NumPrj < Projects.Num;
NumPrj++) NumPrj++)
Prj_DB_UnlockProjectEdition (Projects.LstPrjCods[NumPrj]); Prj_DB_UnlockProjectEdition (Projects.LstPrjCods[NumPrj]);
else // No projects found else // No projects found
Ale_ShowAlert (Ale_INFO,Txt_No_projects); Ale_ShowAlert (Ale_INFO,Txt_No_projects);
/* Free list of projects */ /* Free list of projects */
Prj_FreeListProjects (&Projects); Prj_FreeListProjects (&Projects);
}
else
Err_NoPermissionExit ();
/***** Show projects again *****/ /***** Show projects again *****/
Prj_ShowProjects (&Projects); Prj_ShowProjects (&Projects);
@ -4387,7 +4388,11 @@ void Prj_LockProjectEdition (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset 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 *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -4399,17 +4404,12 @@ void Prj_LockProjectEdition (void)
/***** Get data of the project from database *****/ /***** Get data of the project from database *****/
Prj_GetProjectDataByCod (&Projects.Prj); Prj_GetProjectDataByCod (&Projects.Prj);
if (Prj_CheckIfICanEditProject (&Projects.Prj)) /***** Lock project edition *****/
{ Prj_DB_LockProjectEdition (Projects.Prj.PrjCod);
/***** Lock project edition *****/ Projects.Prj.Locked = Prj_LOCKED;
Prj_DB_LockProjectEdition (Projects.Prj.PrjCod);
Projects.Prj.Locked = Prj_LOCKED;
/***** Show updated form and icon *****/ /***** Show updated form and icon *****/
Prj_FormLockUnlock (&Projects.Prj); Prj_FormLockUnlock (&Projects.Prj);
}
else
Err_NoPermissionExit ();
/***** Free memory of the project *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Projects.Prj); Prj_FreeMemProject (&Projects.Prj);
@ -4424,7 +4424,11 @@ void Prj_UnloProjectEdition (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset 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 *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -4436,17 +4440,12 @@ void Prj_UnloProjectEdition (void)
/***** Get data of the project from database *****/ /***** Get data of the project from database *****/
Prj_GetProjectDataByCod (&Projects.Prj); Prj_GetProjectDataByCod (&Projects.Prj);
if (Prj_CheckIfICanEditProject (&Projects.Prj)) /***** Unlock project edition *****/
{ Prj_DB_UnlockProjectEdition (Projects.Prj.PrjCod);
/***** Unlock project edition *****/ Projects.Prj.Locked = Prj_UNLOCKED;
Prj_DB_UnlockProjectEdition (Projects.Prj.PrjCod);
Projects.Prj.Locked = Prj_UNLOCKED;
/***** Show updated form and icon *****/ /***** Show updated form and icon *****/
Prj_FormLockUnlock (&Projects.Prj); Prj_FormLockUnlock (&Projects.Prj);
}
else
Err_NoPermissionExit ();
/***** Free memory of the project *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Projects.Prj); Prj_FreeMemProject (&Projects.Prj);
@ -4461,7 +4460,11 @@ void Prj_ChangeReviewStatus (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset 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 *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Projects.Prj); Prj_AllocMemProject (&Projects.Prj);
@ -4473,15 +4476,10 @@ void Prj_ChangeReviewStatus (void)
/***** Get data of the project from database *****/ /***** Get data of the project from database *****/
Prj_GetProjectDataByCod (&Projects.Prj); Prj_GetProjectDataByCod (&Projects.Prj);
/***** Hide project *****/ /***** Update review *****/
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)
Projects.Prj.Review.Status = Prj_GetParReviewStatus (); Prj_DB_UpdateReview (&Projects.Prj);
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 ();
/***** Free memory of the project *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Projects.Prj); Prj_FreeMemProject (&Projects.Prj);

View File

@ -37,7 +37,7 @@
/*****************************************************************************/ /*****************************************************************************/
/***** Configuration *****/ /***** Configuration *****/
#define PrjCfg_EDITABLE_DEFAULT true #define PrjCfg_NET_CAN_CREATE_DEFAULT true
/***** Filters to list projects *****/ /***** Filters to list projects *****/
/* Whose projects */ /* Whose projects */
@ -187,7 +187,7 @@ struct Prj_Projects
Prj_ProjectView_t View; Prj_ProjectView_t View;
struct struct
{ {
bool Editable; bool NETCanCreate;
} Config; } Config;
struct Prj_Filter Filter; struct Prj_Filter Filter;
bool LstIsRead; // Is the list already read from database, or it needs to be read? 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); void Prj_SetPrjCod (long PrjCod);
long Prj_GetPrjCod (void); long Prj_GetPrjCod (void);
void Prj_ResetProjects (struct Prj_Projects *Projects); void Prj_ResetPrjsAndReadConfig (struct Prj_Projects *Projects);
void Prj_ListUsrsToSelect (void); void Prj_ListUsrsToSelect (void);
void Prj_SeeProjects (void); void Prj_SeeProjects (void);
@ -264,8 +264,6 @@ void Prj_UnhideProject (void);
void Prj_ReceiveFormProject (void); void Prj_ReceiveFormProject (void);
void PrjCfg_ShowFormConfig (void);
void PrjCfg_ReceiveConfig (void);
void Prj_ReqLockSelectedPrjsEdition (void); void Prj_ReqLockSelectedPrjsEdition (void);
void Prj_ReqUnloSelectedPrjsEdition (void); void Prj_ReqUnloSelectedPrjsEdition (void);
void Prj_LockSelectedPrjsEdition (void); void Prj_LockSelectedPrjsEdition (void);

View File

@ -47,12 +47,29 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/ /***************************** 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, static void PrjCfg_GetConfigDataFromRow (MYSQL_RES *mysql_res,
struct Prj_Projects *Projects); 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? **********************/ /************************ Can I configure all projects? **********************/
@ -81,10 +98,7 @@ void PrjCfg_ShowFormConfig (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Read projects configuration from database *****/
PrjCfg_GetCrsPrjsConfig (&Projects);
/***** Begin box *****/ /***** Begin box *****/
Box_BoxBegin (NULL,Txt_Configure_projects, Box_BoxBegin (NULL,Txt_Configure_projects,
@ -97,7 +111,7 @@ void PrjCfg_ShowFormConfig (void)
HTM_TABLE_BeginCenterPadding (2); HTM_TABLE_BeginCenterPadding (2);
/***** Projects are editable by non-editing teachers? *****/ /***** Projects are editable by non-editing teachers? *****/
PrjCfg_ShowFormConfigEditableByNET (&Projects); PrjCfg_ShowFormNETCanCreate (&Projects);
HTM_TABLE_End (); 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_Create_project;
extern const char *Txt_Editable_by_non_editing_teachers; extern const char *Txt_Non_editing_teachers_can_create_new_projects;
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/***** Label *****/ /***** 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 *****/ /***** Data *****/
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_INPUT_CHECKBOX ("Editable",HTM_DONT_SUBMIT_ON_CHANGE, HTM_LABEL_Begin ("class=\"DAT_%s\"",
"id=\"Editable\" value=\"Y\"%s", The_GetSuffix ());
Projects->Config.Editable ? " checked=\"checked\"" : HTM_INPUT_CHECKBOX ("NETCanCreate",HTM_DONT_SUBMIT_ON_CHANGE,
""); "id=\"NETCanCreate\" value=\"Y\"%s",
HTM_Txt (Txt_Editable_by_non_editing_teachers); Projects->Config.NETCanCreate ? " checked=\"checked\"" :
"");
HTM_Txt (Txt_Non_editing_teachers_can_create_new_projects);
HTM_LABEL_End ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_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 *************/ /************ Get configuration values from a database table row *************/
/*****************************************************************************/ /*****************************************************************************/
@ -167,8 +169,8 @@ static void PrjCfg_GetConfigDataFromRow (MYSQL_RES *mysql_res,
/***** Get row *****/ /***** Get row *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/***** Get whether project are visible via plugins or not *****/ /***** Get whether non-editing teachers can create new projects or not *****/
Projects->Config.Editable = (row[0][0] == 'Y'); Projects->Config.NETCanCreate = (row[0][0] == 'Y');
} }
/*****************************************************************************/ /*****************************************************************************/
@ -181,13 +183,13 @@ void PrjCfg_ReceiveConfig (void)
struct Prj_Projects Projects; struct Prj_Projects Projects;
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Get whether projects are editable by non-editing teachers or not *****/ /***** Get non-editing teachers can create new projects or not *****/
Projects.Config.Editable = PrjCfg_GetEditableFromForm (); Projects.Config.NETCanCreate = PrjCfg_GetIfNETCanCreateFromForm ();
/***** Update database *****/ /***** Update database *****/
Prj_DB_UpdateCrsPrjsConfig (Projects.Config.Editable); Prj_DB_UpdateCrsPrjsConfig (Projects.Config.NETCanCreate);
/***** Show confirmation message *****/ /***** Show confirmation message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_The_configuration_of_the_projects_has_been_updated); 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");
} }

View File

@ -32,14 +32,15 @@
/*****************************************************************************/ /*****************************************************************************/
/***** Configuration *****/ /***** Configuration *****/
#define PrjCfg_EDITABLE_DEFAULT true #define PrjCfg_NET_CAN_CREATE_DEFAULT true
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
bool PrjCfg_CheckIfICanConfig (void); void PrjCfg_GetConfig (struct Prj_Projects *Projects);
bool PrjCfg_CheckIfICanConfig (void);
void PrjCfg_ShowFormConfig (void); void PrjCfg_ShowFormConfig (void);
void PrjCfg_ReceiveConfig (void); void PrjCfg_ReceiveConfig (void);

View File

@ -551,10 +551,10 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
/************** Get configuration of projects for current course *************/ /************** 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) 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] "SELECT Editable" // row[0]
" FROM prj_config" " FROM prj_config"
" WHERE CrsCod=%ld", " WHERE CrsCod=%ld",

View File

@ -46,7 +46,7 @@ void Prj_DB_UpdateReview (const struct Prj_Project *Prj);
unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
const struct Prj_Projects *Projects, const struct Prj_Projects *Projects,
const char *UsrsSubQuery); // NULL if no users 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); unsigned Prj_DB_GetProjectDataByCod (MYSQL_RES **mysql_res,long PrjCod);
void Prj_DB_GetProjectTitle (long PrjCod,char *Title,size_t TitleSize); void Prj_DB_GetProjectTitle (long PrjCod,char *Title,size_t TitleSize);
unsigned Prj_DB_GetPrjDataToCheckFaults (MYSQL_RES **mysql_res,long PrjCod); unsigned Prj_DB_GetPrjDataToCheckFaults (MYSQL_RES **mysql_res,long PrjCod);

View File

@ -46,7 +46,7 @@ void PrjRsc_GetLinkToProject (void)
char Title[Prj_MAX_BYTES_TITLE + 1]; char Title[Prj_MAX_BYTES_TITLE + 1];
/***** Reset projects *****/ /***** Reset projects *****/
Prj_ResetProjects (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Get parameters *****/ /***** Get parameters *****/
Prj_GetPars (&Projects); Prj_GetPars (&Projects);

View File

@ -1590,39 +1590,37 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: // I am a student case Rol_STD: // I am a student
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER) // Not me ==> I am a student trying to do something forbidden
{
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
Err_NoPermissionExit (); 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; break;
case Rol_NET: case Rol_NET:
break; break;

View File

@ -331,10 +331,6 @@ void RubCri_ChangeTitle (void)
struct RubCri_Criterion Criterion; struct RubCri_Criterion Criterion;
char NewTitle[RubCri_MAX_BYTES_TITLE + 1]; char NewTitle[RubCri_MAX_BYTES_TITLE + 1];
/***** Check if I can edit rubrics *****/
if (!Rub_CheckIfICanEditRubrics ())
Err_NoPermissionExit ();
/***** Reset rubrics context *****/ /***** Reset rubrics context *****/
Rub_ResetRubrics (&Rubrics); Rub_ResetRubrics (&Rubrics);
Rub_ResetRubric (&Rubrics.Rubric); Rub_ResetRubric (&Rubrics.Rubric);
@ -383,10 +379,6 @@ static void RubCri_ChangeValueCriterion (RubCri_ValueRange_t ValueRange)
struct RubCri_Criterion Criterion; struct RubCri_Criterion Criterion;
char ValueStr[64]; char ValueStr[64];
/***** Check if I can edit rubrics *****/
if (!Rub_CheckIfICanEditRubrics ())
Err_NoPermissionExit ();
/***** Reset rubrics context *****/ /***** Reset rubrics context *****/
Rub_ResetRubrics (&Rubrics); Rub_ResetRubrics (&Rubrics);
Rub_ResetRubric (&Rubrics.Rubric); Rub_ResetRubric (&Rubrics.Rubric);
@ -427,10 +419,6 @@ void RubCri_ChangeWeight (void)
struct RubCri_Criterion Criterion; struct RubCri_Criterion Criterion;
char WeightStr[64]; char WeightStr[64];
/***** Check if I can edit rubrics *****/
if (!Rub_CheckIfICanEditRubrics ())
Err_NoPermissionExit ();
/***** Reset rubrics context *****/ /***** Reset rubrics context *****/
Rub_ResetRubrics (&Rubrics); Rub_ResetRubrics (&Rubrics);
Rub_ResetRubric (&Rubrics.Rubric); Rub_ResetRubric (&Rubrics.Rubric);

View File

@ -2212,193 +2212,190 @@ void TstPrn_ShowOnePrint (void)
/***** Get test data *****/ /***** Get test data *****/
TstPrn_GetPrintDataByPrnCod (&Print); 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) if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
TstCfg_GetConfig (); // To get visibility TstCfg_GetConfig (); // To get visibility
TstRes_CheckIfICanSeePrintResult (&Print,Gbl.Usrs.Other.UsrDat.UsrCod,&ICanView); TstRes_CheckIfICanSeePrintResult (&Print,Gbl.Usrs.Other.UsrDat.UsrCod,&ICanView);
if (!ICanView.Result) // I am not allowed to view this test
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 ("&nbsp;%s",Gbl.Usrs.Other.UsrDat.Surname1);
if (Gbl.Usrs.Other.UsrDat.Surname2[0])
HTM_TxtF ("&nbsp;%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
Err_NoPermissionExit (); 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 ("&nbsp;%s",Gbl.Usrs.Other.UsrDat.Surname1);
if (Gbl.Usrs.Other.UsrDat.Surname2[0])
HTM_TxtF ("&nbsp;%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 ();
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -12031,50 +12031,27 @@ const char *Txt_Edit_rich_text =
"Edit rich text"; // Çeviri lazim! "Edit rich text"; // Çeviri lazim!
#endif #endif
const char *Txt_Editable = const char *Txt_Non_editing_teachers_can_create_new_projects =
#if L==1 // ca #if L==1 // ca
"Editables"; "Els professors no editors poden crear nous projectes";
#elif L==2 // de #elif L==2 // de
"Bearbeitbare"; "Nicht bearbeitende Lehrern k&ouml;nnen neue Projekte erstellen";
#elif L==3 // en #elif L==3 // en
"Editable"; "Non-editing teachers can create new projects";
#elif L==4 // es #elif L==4 // es
"Editables"; "Los profesores no editores pueden crear nuevos proyectos";
#elif L==5 // fr #elif L==5 // fr
"&Eacute;ditables"; "Les enseignants non &eacute;diteurs peuvent cr&eacute;er de nouveaux projets";
#elif L==6 // gn #elif L==6 // gn
"Ojeedit&aacute;kuaa"; "Mbo'eh&aacute;a ndaha'&eacute;iva editor ikatu omohe&ntilde;&oacute;i proyecto pyahu";
#elif L==7 // it #elif L==7 // it
"Modificabili"; "Gli insegnanti non editori possono creare nuovi progetti";
#elif L==8 // pl #elif L==8 // pl
"Edytowalne"; "Nauczyciele nieedytuj&aogon;cy mog&aogon; tworzy&cacute; nowe projekty";
#elif L==9 // pt #elif L==9 // pt
"Edit&aacute;veis"; "Professores n&atilde;o editores podem criar novos projetos";
#elif L==10 // tr #elif L==10 // tr
"D&uuml;zenlenebilir"; "Edit&ouml;r olmayan &ouml;&gbreve;retmenler yeni projeler olu&scedil;turabilir";
#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
"&Eacute;ditables par des enseignants non-&eacute;diteurs";
#elif L==6 // gn
"Omohendakuaa mbo'eh&aacute;ra ndaha'&eacute;iva edici&oacute;n";
#elif L==7 // it
"Modificabili da professori non-editing";
#elif L==8 // pl
"Edytowalne przez nauczycieli, kt&oacute;rzy nie dokonali edycji";
#elif L==9 // pt
"Edit&aacute;veis por professores n&atilde;o editores";
#elif L==10 // tr
"D&uuml;zenleme yapmayan &ouml;&gbreve;retmenler taraf&inodot;ndan d&uuml;zenlenebilir";
#endif #endif
const char *Txt_eg_A_B = 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 #elif L==5 // fr
"Plugins" "Plugins"
#elif L==6 // gn #elif L==6 // gn
"Complementos" // Okoteve traducción "Complementos"
#elif L==7 // it #elif L==7 // it
"Plugin" "Plugin"
#elif L==8 // pl #elif L==8 // pl
@ -32144,7 +32121,7 @@ const char *Txt_Plugins =
#elif L==5 // fr #elif L==5 // fr
"Plugins"; "Plugins";
#elif L==6 // gn #elif L==6 // gn
"Complementos"; // Okoteve traducción "Complementos";
#elif L==7 // it #elif L==7 // it
"Plugin"; "Plugin";
#elif L==8 // pl #elif L==8 // pl
@ -32152,7 +32129,7 @@ const char *Txt_Plugins =
#elif L==9 // pt #elif L==9 // pt
"Plugins"; "Plugins";
#elif L==10 // tr #elif L==10 // tr
"Plugins"; // Çeviri lazim! "Eklentiler";
#endif #endif
const char *Txt_Possibly_duplicate_users = const char *Txt_Possibly_duplicate_users =