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_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"

View File

@ -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 *****/

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.
*/
#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)

View File

@ -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 ();
}
/*****************************************************************************/

View File

@ -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);
}
/*****************************************************************************/

View File

@ -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,

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)
{
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

View File

@ -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 ("&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
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 ("&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_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);

View File

@ -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);

View File

@ -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");
}

View File

@ -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);

View File

@ -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",

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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 ("&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
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 ("&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!
#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&ouml;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
"&Eacute;ditables";
"Les enseignants non &eacute;diteurs peuvent cr&eacute;er de nouveaux projets";
#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
"Modificabili";
"Gli insegnanti non editori possono creare nuovi progetti";
#elif L==8 // pl
"Edytowalne";
"Nauczyciele nieedytuj&aogon;cy mog&aogon; tworzy&cacute; nowe projekty";
#elif L==9 // pt
"Edit&aacute;veis";
"Professores n&atilde;o editores podem criar novos projetos";
#elif L==10 // tr
"D&uuml;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
"&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";
"Edit&ouml;r olmayan &ouml;&gbreve;retmenler yeni projeler olu&scedil;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 =