mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-13 04:04:35 +02:00
Version 22.93: Apr 10, 2023 Changes in configuration of projects.
This commit is contained in:
parent
479179e82c
commit
cfddb5c174
|
@ -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"
|
||||||
|
|
151
swad_browser.c
151
swad_browser.c
|
@ -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 *****/
|
||||||
|
|
|
@ -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)
|
||||||
|
|
207
swad_course.c
207
swad_course.c
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
41
swad_forum.c
41
swad_forum.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
56
swad_game.c
56
swad_game.c
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 (" %s",UsrDat->Surname1);
|
|
||||||
if (UsrDat->Surname2[0])
|
|
||||||
HTM_TxtF (" %s",UsrDat->Surname2);
|
|
||||||
if (UsrDat->FrstName[0])
|
|
||||||
HTM_TxtF (", %s",UsrDat->FrstName);
|
|
||||||
HTM_BR ();
|
|
||||||
Pho_ShowUsrPhotoIfAllowed (UsrDat,
|
|
||||||
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Start/end time (for user in this match) *****/
|
|
||||||
for (StartEndTime = (Dat_StartEndTime_t) 0;
|
|
||||||
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
|
|
||||||
StartEndTime++)
|
|
||||||
{
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_START_END_TIME[StartEndTime]);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
HTM_TD_Begin ("id=\"%s\" class=\"LB DAT_%s\"",
|
|
||||||
Id,The_GetSuffix ());
|
|
||||||
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
|
|
||||||
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
|
|
||||||
true,true,true,0x7);
|
|
||||||
HTM_TD_End ();
|
|
||||||
free (Id);
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Number of questions *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Questions);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_Unsigned (Print.NumQsts.All);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Number of answers *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Answers);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_Unsigned (Print.NumQsts.NotBlank);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Score *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Score);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
if (ICanView.Score)
|
|
||||||
{
|
|
||||||
HTM_STRONG_Begin ();
|
|
||||||
HTM_Double2Decimals (Print.Score);
|
|
||||||
HTM_Txt ("/");
|
|
||||||
HTM_Unsigned (Print.NumQsts.All);
|
|
||||||
HTM_STRONG_End ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Ico_PutIconNotVisible ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Grade *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Grade);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
if (ICanView.Score)
|
|
||||||
{
|
|
||||||
HTM_STRONG_Begin ();
|
|
||||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade);
|
|
||||||
HTM_STRONG_End ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Ico_PutIconNotVisible ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Tags present in this result *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Tags);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
Gam_ShowTstTagsPresentInAGame (Match.GamCod);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Write answers and solutions *****/
|
|
||||||
TstPrn_ShowPrintAnswers (UsrDat,
|
|
||||||
Print.NumQsts.All,
|
|
||||||
Print.PrintedQuestions,
|
|
||||||
Print.TimeUTC,
|
|
||||||
Games.Game.Visibility);
|
|
||||||
|
|
||||||
/***** End table *****/
|
|
||||||
HTM_TABLE_End ();
|
|
||||||
|
|
||||||
/***** End box *****/
|
|
||||||
Box_BoxEnd ();
|
|
||||||
}
|
|
||||||
else // I am not allowed to view this match result
|
|
||||||
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 (" %s",UsrDat->Surname1);
|
||||||
|
if (UsrDat->Surname2[0])
|
||||||
|
HTM_TxtF (" %s",UsrDat->Surname2);
|
||||||
|
if (UsrDat->FrstName[0])
|
||||||
|
HTM_TxtF (", %s",UsrDat->FrstName);
|
||||||
|
HTM_BR ();
|
||||||
|
Pho_ShowUsrPhotoIfAllowed (UsrDat,
|
||||||
|
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Start/end time (for user in this match) *****/
|
||||||
|
for (StartEndTime = (Dat_StartEndTime_t) 0;
|
||||||
|
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
|
||||||
|
StartEndTime++)
|
||||||
|
{
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_START_END_TIME[StartEndTime]);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
HTM_TD_Begin ("id=\"%s\" class=\"LB DAT_%s\"",
|
||||||
|
Id,The_GetSuffix ());
|
||||||
|
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
|
||||||
|
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
|
||||||
|
true,true,true,0x7);
|
||||||
|
HTM_TD_End ();
|
||||||
|
free (Id);
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Number of questions *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Questions);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_Unsigned (Print.NumQsts.All);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Number of answers *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Answers);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_Unsigned (Print.NumQsts.NotBlank);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Score *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Score);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
if (ICanView.Score)
|
||||||
|
{
|
||||||
|
HTM_STRONG_Begin ();
|
||||||
|
HTM_Double2Decimals (Print.Score);
|
||||||
|
HTM_Txt ("/");
|
||||||
|
HTM_Unsigned (Print.NumQsts.All);
|
||||||
|
HTM_STRONG_End ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ico_PutIconNotVisible ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Grade *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Grade);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
if (ICanView.Score)
|
||||||
|
{
|
||||||
|
HTM_STRONG_Begin ();
|
||||||
|
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade);
|
||||||
|
HTM_STRONG_End ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ico_PutIconNotVisible ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Tags present in this result *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Tags);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
Gam_ShowTstTagsPresentInAGame (Match.GamCod);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Write answers and solutions *****/
|
||||||
|
TstPrn_ShowPrintAnswers (UsrDat,
|
||||||
|
Print.NumQsts.All,
|
||||||
|
Print.PrintedQuestions,
|
||||||
|
Print.TimeUTC,
|
||||||
|
Games.Game.Visibility);
|
||||||
|
|
||||||
|
/***** End table *****/
|
||||||
|
HTM_TABLE_End ();
|
||||||
|
|
||||||
|
/***** End box *****/
|
||||||
|
Box_BoxEnd ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
532
swad_project.c
532
swad_project.c
|
@ -196,7 +196,7 @@ static Usr_Who_t Prj_GetParWho (void);
|
||||||
|
|
||||||
static void Prj_ShowProjectsHead (struct Prj_Projects *Projects);
|
static void Prj_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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 (" %s",Gbl.Usrs.Other.UsrDat.Surname1);
|
|
||||||
if (Gbl.Usrs.Other.UsrDat.Surname2[0])
|
|
||||||
HTM_TxtF (" %s",Gbl.Usrs.Other.UsrDat.Surname2);
|
|
||||||
if (Gbl.Usrs.Other.UsrDat.FrstName[0])
|
|
||||||
HTM_TxtF (", %s",Gbl.Usrs.Other.UsrDat.FrstName);
|
|
||||||
HTM_BR ();
|
|
||||||
Pho_ShowUsrPhotoIfAllowed (&Gbl.Usrs.Other.UsrDat,
|
|
||||||
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Start/end time (for user in this test print) *****/
|
|
||||||
for (StartEndTime = (Dat_StartEndTime_t) 0;
|
|
||||||
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
|
|
||||||
StartEndTime++)
|
|
||||||
{
|
|
||||||
if (asprintf (&Id,"tst_date_%u",(unsigned) StartEndTime) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_START_END_TIME[StartEndTime]);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("id=\"%s\" class=\"LB DAT_%s\"",
|
|
||||||
Id,The_GetSuffix ());
|
|
||||||
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
|
|
||||||
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
|
|
||||||
true,true,true,0x7);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
free (Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Number of questions *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Questions);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_Unsigned (Print.NumQsts.All);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Number of answers *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Answers);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_Unsigned (Print.NumQsts.NotBlank);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Score *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Score);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
if (ICanView.Score)
|
|
||||||
{
|
|
||||||
HTM_STRONG_Begin ();
|
|
||||||
HTM_Double2Decimals (Print.Score);
|
|
||||||
HTM_Txt ("/");
|
|
||||||
HTM_Unsigned (Print.NumQsts.All);
|
|
||||||
HTM_STRONG_End ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Ico_PutIconNotVisible ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Grade *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Grade);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
if (ICanView.Score)
|
|
||||||
{
|
|
||||||
HTM_STRONG_Begin ();
|
|
||||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
|
|
||||||
HTM_STRONG_End ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Ico_PutIconNotVisible ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Tags present in this test *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
HTM_TxtColon (Txt_Tags);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
|
||||||
The_GetSuffix ());
|
|
||||||
TstPrn_ShowTagsPresentInAPrint (Print.PrnCod);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Write answers and solutions *****/
|
|
||||||
TstPrn_ShowPrintAnswers (&Gbl.Usrs.Other.UsrDat,
|
|
||||||
Print.NumQsts.All,
|
|
||||||
Print.PrintedQuestions,
|
|
||||||
Print.TimeUTC,
|
|
||||||
TstCfg_GetConfigVisibility ());
|
|
||||||
|
|
||||||
/***** End table *****/
|
|
||||||
HTM_TABLE_End ();
|
|
||||||
|
|
||||||
/***** End box *****/
|
|
||||||
Box_BoxEnd ();
|
|
||||||
}
|
|
||||||
else // I am not allowed to view this test
|
|
||||||
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 (" %s",Gbl.Usrs.Other.UsrDat.Surname1);
|
||||||
|
if (Gbl.Usrs.Other.UsrDat.Surname2[0])
|
||||||
|
HTM_TxtF (" %s",Gbl.Usrs.Other.UsrDat.Surname2);
|
||||||
|
if (Gbl.Usrs.Other.UsrDat.FrstName[0])
|
||||||
|
HTM_TxtF (", %s",Gbl.Usrs.Other.UsrDat.FrstName);
|
||||||
|
HTM_BR ();
|
||||||
|
Pho_ShowUsrPhotoIfAllowed (&Gbl.Usrs.Other.UsrDat,
|
||||||
|
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Start/end time (for user in this test print) *****/
|
||||||
|
for (StartEndTime = (Dat_StartEndTime_t) 0;
|
||||||
|
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
|
||||||
|
StartEndTime++)
|
||||||
|
{
|
||||||
|
if (asprintf (&Id,"tst_date_%u",(unsigned) StartEndTime) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_START_END_TIME[StartEndTime]);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("id=\"%s\" class=\"LB DAT_%s\"",
|
||||||
|
Id,The_GetSuffix ());
|
||||||
|
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
|
||||||
|
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
|
||||||
|
true,true,true,0x7);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
free (Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Number of questions *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Questions);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_Unsigned (Print.NumQsts.All);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Number of answers *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Answers);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_Unsigned (Print.NumQsts.NotBlank);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Score *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Score);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
if (ICanView.Score)
|
||||||
|
{
|
||||||
|
HTM_STRONG_Begin ();
|
||||||
|
HTM_Double2Decimals (Print.Score);
|
||||||
|
HTM_Txt ("/");
|
||||||
|
HTM_Unsigned (Print.NumQsts.All);
|
||||||
|
HTM_STRONG_End ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ico_PutIconNotVisible ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Grade *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Grade);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
if (ICanView.Score)
|
||||||
|
{
|
||||||
|
HTM_STRONG_Begin ();
|
||||||
|
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
|
||||||
|
HTM_STRONG_End ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ico_PutIconNotVisible ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Tags present in this test *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"RT DAT_STRONG_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
HTM_TxtColon (Txt_Tags);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||||
|
The_GetSuffix ());
|
||||||
|
TstPrn_ShowTagsPresentInAPrint (Print.PrnCod);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/***** Write answers and solutions *****/
|
||||||
|
TstPrn_ShowPrintAnswers (&Gbl.Usrs.Other.UsrDat,
|
||||||
|
Print.NumQsts.All,
|
||||||
|
Print.PrintedQuestions,
|
||||||
|
Print.TimeUTC,
|
||||||
|
TstCfg_GetConfigVisibility ());
|
||||||
|
|
||||||
|
/***** End table *****/
|
||||||
|
HTM_TABLE_End ();
|
||||||
|
|
||||||
|
/***** End box *****/
|
||||||
|
Box_BoxEnd ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
51
swad_text.c
51
swad_text.c
|
@ -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ö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
|
||||||
"Éditables";
|
"Les enseignants non éditeurs peuvent créer de nouveaux projets";
|
||||||
#elif L==6 // gn
|
#elif L==6 // gn
|
||||||
"Ojeeditákuaa";
|
"Mbo'eháa ndaha'éiva editor ikatu omoheñó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ący mogą tworzyć nowe projekty";
|
||||||
#elif L==9 // pt
|
#elif L==9 // pt
|
||||||
"Editáveis";
|
"Professores não editores podem criar novos projetos";
|
||||||
#elif L==10 // tr
|
#elif L==10 // tr
|
||||||
"Düzenlenebilir";
|
"Editör olmayan öğretmenler yeni projeler oluş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
|
|
||||||
"Éditables par des enseignants non-éditeurs";
|
|
||||||
#elif L==6 // gn
|
|
||||||
"Omohendakuaa mbo'ehára ndaha'éiva edición";
|
|
||||||
#elif L==7 // it
|
|
||||||
"Modificabili da professori non-editing";
|
|
||||||
#elif L==8 // pl
|
|
||||||
"Edytowalne przez nauczycieli, którzy nie dokonali edycji";
|
|
||||||
#elif L==9 // pt
|
|
||||||
"Editáveis por professores não editores";
|
|
||||||
#elif L==10 // tr
|
|
||||||
"Düzenleme yapmayan öğretmenler tarafından düzenlenebilir";
|
|
||||||
#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 =
|
||||||
|
|
Loading…
Reference in New Issue
Block a user