mirror of https://github.com/acanas/swad-core.git
Version20.9
This commit is contained in:
parent
9778f7c09b
commit
d8c06a6bc4
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser" keep-relative-paths="false" name="CDT GCC Build Output Parser" parameter="(g?cc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>
|
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser" keep-relative-paths="false" name="CDT GCC Build Output Parser" parameter="(g?cc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>
|
||||||
|
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-35536074215974130" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-35147440584966130" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
|
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
|
|
||||||
|
|
|
@ -728,9 +728,9 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
||||||
[ActHidExaSes ] = {1900,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaSes_HideSession ,NULL},
|
[ActHidExaSes ] = {1900,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaSes_HideSession ,NULL},
|
||||||
[ActUnhExaSes ] = {1901,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaSes_UnhideSession ,NULL},
|
[ActUnhExaSes ] = {1901,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaSes_UnhideSession ,NULL},
|
||||||
|
|
||||||
[ActSeeExaPrn ] = {1904,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaPrn_ShowExamPrint ,NULL},
|
[ActSeeExaPrn ] = {1904,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,ExaPrn_ShowExamPrint ,NULL},
|
||||||
[ActAnsExaPrn ] = {1906,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_NORMAL,NULL ,ExaPrn_ReceivePrintAnswer ,NULL},
|
[ActAnsExaPrn ] = {1906,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_NORMAL,NULL ,ExaPrn_ReceivePrintAnswer ,NULL},
|
||||||
[ActEndExaPrn ] = {1908,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowOneExaResult ,NULL},
|
[ActEndExaPrn ] = {1908,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,ExaRes_ShowOneExaResult ,NULL},
|
||||||
|
|
||||||
[ActSeeMyExaResCrs ] = {1867,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyResultsInCrs ,NULL},
|
[ActSeeMyExaResCrs ] = {1867,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyResultsInCrs ,NULL},
|
||||||
[ActSeeMyExaResExa ] = {1868,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyResultsInExa ,NULL},
|
[ActSeeMyExaResExa ] = {1868,-1,TabUnk,ActSeeAllExa ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaRes_ShowMyResultsInExa ,NULL},
|
||||||
|
|
|
@ -555,7 +555,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
|
||||||
En OpenSWAD:
|
En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
ps2pdf source.ps destination.pdf
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 20.8 (2020-12-15)"
|
#define Log_PLATFORM_VERSION "SWAD 20.9 (2021-01-20)"
|
||||||
#define CSS_FILE "swad20.8.css"
|
#define CSS_FILE "swad20.8.css"
|
||||||
#define JS_FILE "swad20.6.2.js"
|
#define JS_FILE "swad20.6.2.js"
|
||||||
/*
|
/*
|
||||||
|
@ -602,6 +602,8 @@ Juan Miguel.
|
||||||
TODO: Fix bug: un profesor editor no puede ver las carpetas de TFG (proyectos) de otros. Debería poder.
|
TODO: Fix bug: un profesor editor no puede ver las carpetas de TFG (proyectos) de otros. Debería poder.
|
||||||
TODO: DNI de un estudiante sale erróneamente como ******* en lugar de mostrarse al ver los accesos de un estudiante a la asignatura.
|
TODO: DNI de un estudiante sale erróneamente como ******* en lugar de mostrarse al ver los accesos de un estudiante a la asignatura.
|
||||||
|
|
||||||
|
Version 20.9: Jan 20, 2021 Exam print ready to be answered is displayed in a new tab.
|
||||||
|
Code refactoring in exam results. (304829 lines)
|
||||||
Version 20.8: Dec 15, 2020 Fixed bug in file browser. Reported by Javier Fernández Baldomero. (304711 lines)
|
Version 20.8: Dec 15, 2020 Fixed bug in file browser. Reported by Javier Fernández Baldomero. (304711 lines)
|
||||||
Version 20.7.4: Dec 01, 2020 Fixed bug in pagination of forums of a thread. Reported by Javier Fernández Baldomero. (304705 lines)
|
Version 20.7.4: Dec 01, 2020 Fixed bug in pagination of forums of a thread. Reported by Javier Fernández Baldomero. (304705 lines)
|
||||||
Version 20.7.3: Nov 26, 2020 Fixed bugs in pagination when editing assignments. (304706 lines)
|
Version 20.7.3: Nov 26, 2020 Fixed bugs in pagination when editing assignments. (304706 lines)
|
||||||
|
|
|
@ -306,20 +306,6 @@ void ExaLog_ShowExamLog (const struct ExaPrn_Print *Print)
|
||||||
char *UserAgent;
|
char *UserAgent;
|
||||||
const char *Class;
|
const char *Class;
|
||||||
|
|
||||||
/***** Check if I can view this print result *****/
|
|
||||||
switch (Gbl.Usrs.Me.Role.Logged)
|
|
||||||
{
|
|
||||||
case Rol_NET:
|
|
||||||
case Rol_TCH:
|
|
||||||
case Rol_DEG_ADM:
|
|
||||||
case Rol_CTR_ADM:
|
|
||||||
case Rol_INS_ADM:
|
|
||||||
case Rol_SYS_ADM:
|
|
||||||
break;
|
|
||||||
default: // Other users can not see log
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Get print log from database *****/
|
/***** Get print log from database *****/
|
||||||
NumClicks = (unsigned)
|
NumClicks = (unsigned)
|
||||||
DB_QuerySELECT (&mysql_res,"can not get exam print log",
|
DB_QuerySELECT (&mysql_res,"can not get exam print log",
|
||||||
|
|
|
@ -43,6 +43,8 @@
|
||||||
#include "swad_exam_type.h"
|
#include "swad_exam_type.h"
|
||||||
#include "swad_form.h"
|
#include "swad_form.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
|
#include "swad_ID.h"
|
||||||
|
#include "swad_photo.h"
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************** External global variables from others modules ****************/
|
/************** External global variables from others modules ****************/
|
||||||
|
@ -80,7 +82,7 @@ static void ExaPrn_CreatePrintInDB (struct ExaPrn_Print *Print);
|
||||||
|
|
||||||
static void ExaPrn_ShowExamPrintToFillIt (struct Exa_Exams *Exams,
|
static void ExaPrn_ShowExamPrintToFillIt (struct Exa_Exams *Exams,
|
||||||
const struct Exa_Exam *Exam,
|
const struct Exa_Exam *Exam,
|
||||||
const struct ExaPrn_Print *Print);
|
struct ExaPrn_Print *Print);
|
||||||
static void ExaPrn_GetAndWriteDescription (long ExaCod);
|
static void ExaPrn_GetAndWriteDescription (long ExaCod);
|
||||||
static void ExaPrn_ShowTableWithQstsToFill (struct Exa_Exams *Exams,
|
static void ExaPrn_ShowTableWithQstsToFill (struct Exa_Exams *Exams,
|
||||||
const struct ExaPrn_Print *Print);
|
const struct ExaPrn_Print *Print);
|
||||||
|
@ -202,7 +204,7 @@ void ExaPrn_ShowExamPrint (void)
|
||||||
/***** Get exam print data from database *****/
|
/***** Get exam print data from database *****/
|
||||||
ExaPrn_GetDataOfPrintBySesCodAndUsrCod (&Print);
|
ExaPrn_GetDataOfPrintBySesCodAndUsrCod (&Print);
|
||||||
|
|
||||||
if (Print.PrnCod <= 0) // Print does not exists ==> create it
|
if (Print.PrnCod <= 0) // Exam print does not exists ==> create it
|
||||||
{
|
{
|
||||||
/***** Set again basic data of exam print *****/
|
/***** Set again basic data of exam print *****/
|
||||||
Print.SesCod = Session.SesCod;
|
Print.SesCod = Session.SesCod;
|
||||||
|
@ -222,7 +224,7 @@ void ExaPrn_ShowExamPrint (void)
|
||||||
ExaLog_SetIfCanAnswer (true);
|
ExaLog_SetIfCanAnswer (true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // Print exists
|
else // Exam print exists
|
||||||
{
|
{
|
||||||
/***** Get exam print data from database *****/
|
/***** Get exam print data from database *****/
|
||||||
ExaPrn_GetDataOfPrintBySesCodAndUsrCod (&Print);
|
ExaPrn_GetDataOfPrintBySesCodAndUsrCod (&Print);
|
||||||
|
@ -666,20 +668,34 @@ void ExaPrn_GetPrintQuestionsFromDB (struct ExaPrn_Print *Print)
|
||||||
|
|
||||||
static void ExaPrn_ShowExamPrintToFillIt (struct Exa_Exams *Exams,
|
static void ExaPrn_ShowExamPrintToFillIt (struct Exa_Exams *Exams,
|
||||||
const struct Exa_Exam *Exam,
|
const struct Exa_Exam *Exam,
|
||||||
const struct ExaPrn_Print *Print)
|
struct ExaPrn_Print *Print)
|
||||||
{
|
{
|
||||||
extern const char *Hlp_ASSESSMENT_Exams;
|
extern const char *Hlp_ASSESSMENT_Exams_answer_exam;
|
||||||
|
|
||||||
/***** Begin box *****/
|
/***** Begin box *****/
|
||||||
Box_BoxBegin (NULL,Exam->Title,
|
Box_BoxBegin (NULL,Exam->Title,
|
||||||
NULL,NULL,
|
NULL,NULL,
|
||||||
Hlp_ASSESSMENT_Exams,Box_NOT_CLOSABLE);
|
Hlp_ASSESSMENT_Exams_answer_exam,Box_NOT_CLOSABLE);
|
||||||
|
|
||||||
/***** Heading *****/
|
/***** Heading *****/
|
||||||
|
/* Institution, degree and course */
|
||||||
Lay_WriteHeaderClassPhoto (false,false,
|
Lay_WriteHeaderClassPhoto (false,false,
|
||||||
Gbl.Hierarchy.Ins.InsCod,
|
Gbl.Hierarchy.Ins.InsCod,
|
||||||
Gbl.Hierarchy.Deg.DegCod,
|
Gbl.Hierarchy.Deg.DegCod,
|
||||||
Gbl.Hierarchy.Crs.CrsCod);
|
Gbl.Hierarchy.Crs.CrsCod);
|
||||||
|
|
||||||
|
|
||||||
|
/***** Show user and time *****/
|
||||||
|
/* Begin table */
|
||||||
|
HTM_TABLE_BeginWideMarginPadding (10);
|
||||||
|
|
||||||
|
/* User */
|
||||||
|
ExaRes_ShowExamResultUser (&Gbl.Usrs.Me.UsrDat);
|
||||||
|
|
||||||
|
/* End table */
|
||||||
|
HTM_TABLE_End ();
|
||||||
|
|
||||||
|
/* Exam description */
|
||||||
ExaPrn_GetAndWriteDescription (Exam->ExaCod);
|
ExaPrn_GetAndWriteDescription (Exam->ExaCod);
|
||||||
|
|
||||||
if (Print->NumQsts.All)
|
if (Print->NumQsts.All)
|
||||||
|
|
|
@ -124,7 +124,16 @@ static void ExaRes_CheckIfICanSeePrintResult (const struct Exa_Exam *Exam,
|
||||||
struct ExaRes_ICanView *ICanView);
|
struct ExaRes_ICanView *ICanView);
|
||||||
|
|
||||||
static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print);
|
static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print);
|
||||||
|
static void ExaRes_ShowExamResultTime (struct ExaPrn_Print *Print);
|
||||||
|
static void ExaRes_ShowExamResultNumQsts (struct ExaPrn_Print *Print,
|
||||||
|
const struct ExaRes_ICanView *ICanView);
|
||||||
|
static void ExaRes_ShowExamResultNumAnss (struct ExaPrn_Print *Print,
|
||||||
|
const struct ExaRes_ICanView *ICanView);
|
||||||
|
static void ExaRes_ShowExamResultScore (struct ExaPrn_Print *Print,
|
||||||
|
const struct ExaRes_ICanView *ICanView);
|
||||||
|
static void ExaRes_ShowExamResultGrade (const struct Exa_Exam *Exam,
|
||||||
|
struct ExaPrn_Print *Print,
|
||||||
|
const struct ExaRes_ICanView *ICanView);
|
||||||
static void ExaRes_ShowExamAnswers (struct UsrData *UsrDat,
|
static void ExaRes_ShowExamAnswers (struct UsrData *UsrDat,
|
||||||
struct ExaPrn_Print *Print,
|
struct ExaPrn_Print *Print,
|
||||||
unsigned Visibility);
|
unsigned Visibility);
|
||||||
|
@ -1371,7 +1380,19 @@ void ExaRes_ShowOneExaResult (void)
|
||||||
ExaRes_ShowExamResult (&Exam,&Session,&Print,UsrDat);
|
ExaRes_ShowExamResult (&Exam,&Session,&Print,UsrDat);
|
||||||
|
|
||||||
/***** Show exam log *****/
|
/***** Show exam log *****/
|
||||||
ExaLog_ShowExamLog (&Print);
|
switch (Gbl.Usrs.Me.Role.Logged)
|
||||||
|
{
|
||||||
|
case Rol_NET:
|
||||||
|
case Rol_TCH:
|
||||||
|
case Rol_DEG_ADM:
|
||||||
|
case Rol_CTR_ADM:
|
||||||
|
case Rol_INS_ADM:
|
||||||
|
case Rol_SYS_ADM:
|
||||||
|
ExaLog_ShowExamLog (&Print);
|
||||||
|
break;
|
||||||
|
default: // Other users can not see log
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1385,23 +1406,6 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
|
||||||
{
|
{
|
||||||
extern const char *Hlp_ASSESSMENT_Exams_results;
|
extern const char *Hlp_ASSESSMENT_Exams_results;
|
||||||
extern const char *Txt_The_user_does_not_exist;
|
extern const char *Txt_The_user_does_not_exist;
|
||||||
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
|
||||||
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
|
|
||||||
extern const char *Txt_Questions;
|
|
||||||
extern const char *Txt_QUESTIONS_valid;
|
|
||||||
extern const char *Txt_QUESTIONS_invalid;
|
|
||||||
extern const char *Txt_Valid_answers;
|
|
||||||
extern const char *Txt_ANSWERS_correct;
|
|
||||||
extern const char *Txt_ANSWERS_wrong;
|
|
||||||
extern const char *Txt_ANSWERS_blank;
|
|
||||||
extern const char *Txt_Score;
|
|
||||||
extern const char *Txt_valid_score;
|
|
||||||
extern const char *Txt_Grade;
|
|
||||||
extern const char *Txt_valid_grade;
|
|
||||||
bool ShowPhoto;
|
|
||||||
char PhotoURL[PATH_MAX + 1];
|
|
||||||
Dat_StartEndTime_t StartEndTime;
|
|
||||||
char *Id;
|
|
||||||
struct ExaRes_ICanView ICanView;
|
struct ExaRes_ICanView ICanView;
|
||||||
|
|
||||||
/***** Check if I can view this print result and its score *****/
|
/***** Check if I can view this print result and its score *****/
|
||||||
|
@ -1420,195 +1424,33 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
|
||||||
Gbl.Hierarchy.Deg.DegCod,
|
Gbl.Hierarchy.Deg.DegCod,
|
||||||
Gbl.Hierarchy.Crs.CrsCod);
|
Gbl.Hierarchy.Crs.CrsCod);
|
||||||
|
|
||||||
|
/***** Check user data *****/
|
||||||
/***** Begin table *****/
|
|
||||||
HTM_TABLE_BeginWideMarginPadding (10);
|
|
||||||
|
|
||||||
/***** User *****/
|
|
||||||
/* Get data of the user who answered the exam print */
|
/* Get data of the user who answered the exam print */
|
||||||
if (!Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (UsrDat,Usr_DONT_GET_PREFS))
|
if (!Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (UsrDat,Usr_DONT_GET_PREFS))
|
||||||
Lay_ShowErrorAndExit (Txt_The_user_does_not_exist);
|
Lay_ShowErrorAndExit (Txt_The_user_does_not_exist);
|
||||||
if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat))
|
if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat))
|
||||||
Lay_NoPermissionExit ();
|
Lay_NoPermissionExit ();
|
||||||
|
|
||||||
/* User */
|
/***** Begin table *****/
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TABLE_BeginWideMarginPadding (10);
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
/***** User *****/
|
||||||
HTM_TxtColon (Txt_ROLES_SINGUL_Abc[UsrDat->Roles.InCurrentCrs.Role][UsrDat->Sex]);
|
ExaRes_ShowExamResultUser (UsrDat);
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT LB\"");
|
|
||||||
ID_WriteUsrIDs (UsrDat,NULL);
|
|
||||||
HTM_TxtF (" %s",UsrDat->Surname1);
|
|
||||||
if (UsrDat->Surname2[0])
|
|
||||||
HTM_TxtF (" %s",UsrDat->Surname2);
|
|
||||||
if (UsrDat->FirstName[0])
|
|
||||||
HTM_TxtF (", %s",UsrDat->FirstName);
|
|
||||||
HTM_BR ();
|
|
||||||
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (UsrDat,PhotoURL);
|
|
||||||
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
|
|
||||||
NULL,
|
|
||||||
"PHOTO45x60",Pho_ZOOM,false);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Start/end time (for user in this exam print) *****/
|
/***** Start/end time (for user in this exam print) *****/
|
||||||
for (StartEndTime = (Dat_StartEndTime_t) 0;
|
ExaRes_ShowExamResultTime (Print);
|
||||||
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
|
|
||||||
StartEndTime++)
|
|
||||||
{
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
|
||||||
HTM_TxtColon (Txt_START_END_TIME[StartEndTime]);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0)
|
|
||||||
Lay_NotEnoughMemoryExit ();
|
|
||||||
HTM_TD_Begin ("id=\"%s\" class=\"DAT LB\"",Id);
|
|
||||||
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 *****/
|
/***** Number of questions *****/
|
||||||
HTM_TR_Begin (NULL);
|
ExaRes_ShowExamResultNumQsts (Print,&ICanView);
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
|
||||||
HTM_TxtColon (Txt_Questions);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT LB\"");
|
|
||||||
if (ICanView.Result)
|
|
||||||
{
|
|
||||||
HTM_TxtF ("%u",Print->NumQsts.All);
|
|
||||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
|
||||||
{
|
|
||||||
HTM_Txt (" (");
|
|
||||||
|
|
||||||
/* Valid questions */
|
|
||||||
HTM_SPAN_Begin ("class=\"DAT_GREEN\"");
|
|
||||||
HTM_TxtColonNBSP (Txt_QUESTIONS_valid);
|
|
||||||
HTM_Unsigned (Print->NumQsts.Valid.Total);
|
|
||||||
HTM_SPAN_End ();
|
|
||||||
|
|
||||||
HTM_TxtF ("; ");
|
|
||||||
|
|
||||||
/* Invalid questions */
|
|
||||||
HTM_SPAN_Begin ("class=\"DAT_RED\"");
|
|
||||||
HTM_TxtColonNBSP (Txt_QUESTIONS_invalid);
|
|
||||||
HTM_Unsigned (Print->NumQsts.All - Print->NumQsts.Valid.Total);
|
|
||||||
HTM_SPAN_End ();
|
|
||||||
|
|
||||||
HTM_Txt (")");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Ico_PutIconNotVisible ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Number of answers *****/
|
/***** Number of answers *****/
|
||||||
HTM_TR_Begin (NULL);
|
ExaRes_ShowExamResultNumAnss (Print,&ICanView);
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
|
||||||
HTM_TxtColon (Txt_Valid_answers);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT LB\"");
|
|
||||||
if (ICanView.Result)
|
|
||||||
HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1): %u; "
|
|
||||||
"%s(-1≤<em>p<sub>i</sub></em><0): %u; "
|
|
||||||
"%s(<em>p<sub>i</sub></em>=0): %u; "
|
|
||||||
"%s(0<<em>p<sub>i</sub></em><1): %u; "
|
|
||||||
"%s(<em>p<sub>i</sub></em>=0): %u",
|
|
||||||
Txt_ANSWERS_correct,Print->NumQsts.Valid.Correct,
|
|
||||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Negative,
|
|
||||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Zero,
|
|
||||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Positive,
|
|
||||||
Txt_ANSWERS_blank ,Print->NumQsts.Valid.Blank);
|
|
||||||
else
|
|
||||||
Ico_PutIconNotVisible ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Score *****/
|
/***** Score *****/
|
||||||
HTM_TR_Begin (NULL);
|
ExaRes_ShowExamResultScore (Print,&ICanView);
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
|
||||||
HTM_TxtColon (Txt_Score);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT LB\"");
|
|
||||||
if (ICanView.Score)
|
|
||||||
{
|
|
||||||
/* Score counting all questions */
|
|
||||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
|
||||||
HTM_STRONG_Begin ();
|
|
||||||
HTM_Double2Decimals (Print->Score.All);
|
|
||||||
HTM_Txt ("/");
|
|
||||||
HTM_Unsigned (Print->NumQsts.All);
|
|
||||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
|
||||||
HTM_STRONG_End ();
|
|
||||||
|
|
||||||
/* Scoure counting only valid questions */
|
|
||||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
|
||||||
{
|
|
||||||
HTM_Txt ("; ");
|
|
||||||
HTM_TxtColonNBSP (Txt_valid_score);
|
|
||||||
HTM_STRONG_Begin ();
|
|
||||||
HTM_Double2Decimals (Print->Score.Valid);
|
|
||||||
HTM_Txt ("/");
|
|
||||||
HTM_Unsigned (Print->NumQsts.Valid.Total);
|
|
||||||
HTM_STRONG_End ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Ico_PutIconNotVisible ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Grade *****/
|
/***** Grade *****/
|
||||||
HTM_TR_Begin (NULL);
|
ExaRes_ShowExamResultGrade (Exam,Print,&ICanView);
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
|
||||||
HTM_TxtColon (Txt_Grade);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"DAT LB\"");
|
|
||||||
if (ICanView.Score)
|
|
||||||
{
|
|
||||||
/* Grade counting all questions */
|
|
||||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
|
||||||
HTM_STRONG_Begin ();
|
|
||||||
TstPrn_ComputeAndShowGrade (Print->NumQsts.All,Print->Score.All,Exam->MaxGrade);
|
|
||||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
|
||||||
HTM_STRONG_End ();
|
|
||||||
|
|
||||||
/* Grade counting only valid questions */
|
|
||||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
|
||||||
{
|
|
||||||
HTM_Txt ("; ");
|
|
||||||
HTM_TxtColonNBSP (Txt_valid_grade);
|
|
||||||
HTM_STRONG_Begin ();
|
|
||||||
TstPrn_ComputeAndShowGrade (Print->NumQsts.Valid.Total,Print->Score.Valid,Exam->MaxGrade);
|
|
||||||
HTM_STRONG_End ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Ico_PutIconNotVisible ();
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/***** Write answers and solutions *****/
|
/***** Write answers and solutions *****/
|
||||||
if (ICanView.Result)
|
if (ICanView.Result)
|
||||||
|
@ -1746,6 +1588,273 @@ static void ExaRes_ComputeValidPrintScore (struct ExaPrn_Print *Print)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************ Show user row in exam result ***********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void ExaRes_ShowExamResultUser (struct UsrData *UsrDat)
|
||||||
|
{
|
||||||
|
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||||
|
bool ShowPhoto;
|
||||||
|
char PhotoURL[PATH_MAX + 1];
|
||||||
|
|
||||||
|
/***** Row begin *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
/***** Label *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
||||||
|
HTM_TxtColon (Txt_ROLES_SINGUL_Abc[UsrDat->Roles.InCurrentCrs.Role][UsrDat->Sex]);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** User's data *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT LB\"");
|
||||||
|
ID_WriteUsrIDs (UsrDat,NULL);
|
||||||
|
HTM_TxtF (" %s",UsrDat->Surname1);
|
||||||
|
if (UsrDat->Surname2[0])
|
||||||
|
HTM_TxtF (" %s",UsrDat->Surname2);
|
||||||
|
if (UsrDat->FirstName[0])
|
||||||
|
HTM_TxtF (", %s",UsrDat->FirstName);
|
||||||
|
HTM_BR ();
|
||||||
|
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (UsrDat,PhotoURL);
|
||||||
|
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
|
||||||
|
NULL,
|
||||||
|
"PHOTO45x60",Pho_ZOOM,false);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Row end *****/
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************* Show start/end time in exam print *********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void ExaRes_ShowExamResultTime (struct ExaPrn_Print *Print)
|
||||||
|
{
|
||||||
|
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
|
||||||
|
Dat_StartEndTime_t StartEndTime;
|
||||||
|
char *Id;
|
||||||
|
|
||||||
|
for (StartEndTime = (Dat_StartEndTime_t) 0;
|
||||||
|
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
|
||||||
|
StartEndTime++)
|
||||||
|
{
|
||||||
|
/***** Row begin *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
/***** Label *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
||||||
|
HTM_TxtColon (Txt_START_END_TIME[StartEndTime]);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Time *****/
|
||||||
|
if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
HTM_TD_Begin ("id=\"%s\" class=\"DAT LB\"",Id);
|
||||||
|
Dat_WriteLocalDateHMSFromUTC (Id,Print->TimeUTC[StartEndTime],
|
||||||
|
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
|
||||||
|
true,true,true,0x7);
|
||||||
|
HTM_TD_End ();
|
||||||
|
free (Id);
|
||||||
|
|
||||||
|
/***** Row end *****/
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Show number of questions in exam print ******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void ExaRes_ShowExamResultNumQsts (struct ExaPrn_Print *Print,
|
||||||
|
const struct ExaRes_ICanView *ICanView)
|
||||||
|
{
|
||||||
|
extern const char *Txt_Questions;
|
||||||
|
extern const char *Txt_QUESTIONS_valid;
|
||||||
|
extern const char *Txt_QUESTIONS_invalid;
|
||||||
|
|
||||||
|
/***** Row begin *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
/***** Label *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
||||||
|
HTM_TxtColon (Txt_Questions);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Number of questions *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT LB\"");
|
||||||
|
if (ICanView->Result)
|
||||||
|
{
|
||||||
|
HTM_TxtF ("%u",Print->NumQsts.All);
|
||||||
|
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||||
|
{
|
||||||
|
HTM_Txt (" (");
|
||||||
|
|
||||||
|
/* Valid questions */
|
||||||
|
HTM_SPAN_Begin ("class=\"DAT_GREEN\"");
|
||||||
|
HTM_TxtColonNBSP (Txt_QUESTIONS_valid);
|
||||||
|
HTM_Unsigned (Print->NumQsts.Valid.Total);
|
||||||
|
HTM_SPAN_End ();
|
||||||
|
|
||||||
|
HTM_TxtF ("; ");
|
||||||
|
|
||||||
|
/* Invalid questions */
|
||||||
|
HTM_SPAN_Begin ("class=\"DAT_RED\"");
|
||||||
|
HTM_TxtColonNBSP (Txt_QUESTIONS_invalid);
|
||||||
|
HTM_Unsigned (Print->NumQsts.All - Print->NumQsts.Valid.Total);
|
||||||
|
HTM_SPAN_End ();
|
||||||
|
|
||||||
|
HTM_Txt (")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ico_PutIconNotVisible ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Row end *****/
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************** Show number of answers in exam print *******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void ExaRes_ShowExamResultNumAnss (struct ExaPrn_Print *Print,
|
||||||
|
const struct ExaRes_ICanView *ICanView)
|
||||||
|
{
|
||||||
|
extern const char *Txt_Valid_answers;
|
||||||
|
extern const char *Txt_ANSWERS_correct;
|
||||||
|
extern const char *Txt_ANSWERS_wrong;
|
||||||
|
extern const char *Txt_ANSWERS_blank;
|
||||||
|
|
||||||
|
/***** Row begin *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
/***** Label *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
||||||
|
HTM_TxtColon (Txt_Valid_answers);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Number of answers *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT LB\"");
|
||||||
|
if (ICanView->Result)
|
||||||
|
HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1): %u; "
|
||||||
|
"%s(-1≤<em>p<sub>i</sub></em><0): %u; "
|
||||||
|
"%s(<em>p<sub>i</sub></em>=0): %u; "
|
||||||
|
"%s(0<<em>p<sub>i</sub></em><1): %u; "
|
||||||
|
"%s(<em>p<sub>i</sub></em>=0): %u",
|
||||||
|
Txt_ANSWERS_correct,Print->NumQsts.Valid.Correct,
|
||||||
|
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Negative,
|
||||||
|
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Zero,
|
||||||
|
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Positive,
|
||||||
|
Txt_ANSWERS_blank ,Print->NumQsts.Valid.Blank);
|
||||||
|
else
|
||||||
|
Ico_PutIconNotVisible ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Row end *****/
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************** Show score in exam print *************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void ExaRes_ShowExamResultScore (struct ExaPrn_Print *Print,
|
||||||
|
const struct ExaRes_ICanView *ICanView)
|
||||||
|
{
|
||||||
|
extern const char *Txt_Score;
|
||||||
|
extern const char *Txt_valid_score;
|
||||||
|
|
||||||
|
/***** Row begin *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
/***** Label *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
||||||
|
HTM_TxtColon (Txt_Score);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Score *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT LB\"");
|
||||||
|
if (ICanView->Score)
|
||||||
|
{
|
||||||
|
/* Score counting all questions */
|
||||||
|
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||||
|
HTM_STRONG_Begin ();
|
||||||
|
HTM_Double2Decimals (Print->Score.All);
|
||||||
|
HTM_Txt ("/");
|
||||||
|
HTM_Unsigned (Print->NumQsts.All);
|
||||||
|
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||||
|
HTM_STRONG_End ();
|
||||||
|
|
||||||
|
/* Scoure counting only valid questions */
|
||||||
|
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||||
|
{
|
||||||
|
HTM_Txt ("; ");
|
||||||
|
HTM_TxtColonNBSP (Txt_valid_score);
|
||||||
|
HTM_STRONG_Begin ();
|
||||||
|
HTM_Double2Decimals (Print->Score.Valid);
|
||||||
|
HTM_Txt ("/");
|
||||||
|
HTM_Unsigned (Print->NumQsts.Valid.Total);
|
||||||
|
HTM_STRONG_End ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ico_PutIconNotVisible ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Row end *****/
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************** Show grade in exam print *************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void ExaRes_ShowExamResultGrade (const struct Exa_Exam *Exam,
|
||||||
|
struct ExaPrn_Print *Print,
|
||||||
|
const struct ExaRes_ICanView *ICanView)
|
||||||
|
{
|
||||||
|
extern const char *Txt_Grade;
|
||||||
|
extern const char *Txt_valid_grade;
|
||||||
|
|
||||||
|
/***** Row begin *****/
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
/***** Label *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT_N RT\"");
|
||||||
|
HTM_TxtColon (Txt_Grade);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Grade *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT LB\"");
|
||||||
|
if (ICanView->Score)
|
||||||
|
{
|
||||||
|
/* Grade counting all questions */
|
||||||
|
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||||
|
HTM_STRONG_Begin ();
|
||||||
|
TstPrn_ComputeAndShowGrade (Print->NumQsts.All,Print->Score.All,Exam->MaxGrade);
|
||||||
|
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||||
|
HTM_STRONG_End ();
|
||||||
|
|
||||||
|
/* Grade counting only valid questions */
|
||||||
|
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||||
|
{
|
||||||
|
HTM_Txt ("; ");
|
||||||
|
HTM_TxtColonNBSP (Txt_valid_grade);
|
||||||
|
HTM_STRONG_Begin ();
|
||||||
|
TstPrn_ComputeAndShowGrade (Print->NumQsts.Valid.Total,Print->Score.Valid,Exam->MaxGrade);
|
||||||
|
HTM_STRONG_End ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ico_PutIconNotVisible ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Row end *****/
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************** Show user's and correct answers of a test exam ***************/
|
/************** Show user's and correct answers of a test exam ***************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -50,5 +50,6 @@ void ExaRes_ShowAllResultsInExa (void);
|
||||||
void ExaRes_ShowAllResultsInSes (void);
|
void ExaRes_ShowAllResultsInSes (void);
|
||||||
|
|
||||||
void ExaRes_ShowOneExaResult (void);
|
void ExaRes_ShowOneExaResult (void);
|
||||||
|
void ExaRes_ShowExamResultUser (struct UsrData *UsrDat);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1621,6 +1621,27 @@ const char *Hlp_ASSESSMENT_Exams_questions =
|
||||||
"ASSESSMENT.Exams.en#questions";
|
"ASSESSMENT.Exams.en#questions";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char *Hlp_ASSESSMENT_Exams_answer_exam =
|
||||||
|
#if L==1
|
||||||
|
"ASSESSMENT.Exams.es#responder-examen";
|
||||||
|
#elif L==2
|
||||||
|
"ASSESSMENT.Exams.en#answer-exam";
|
||||||
|
#elif L==3
|
||||||
|
"ASSESSMENT.Exams.en#answer-exam";
|
||||||
|
#elif L==4
|
||||||
|
"ASSESSMENT.Exams.es#responder-examen";
|
||||||
|
#elif L==5
|
||||||
|
"ASSESSMENT.Exams.en#answer-exam";
|
||||||
|
#elif L==6
|
||||||
|
"ASSESSMENT.Exams.es#responder-examen";
|
||||||
|
#elif L==7
|
||||||
|
"ASSESSMENT.Exams.en#answer-exam";
|
||||||
|
#elif L==8
|
||||||
|
"ASSESSMENT.Exams.en#answer-exam";
|
||||||
|
#elif L==9
|
||||||
|
"ASSESSMENT.Exams.en#answer-exam";
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *Hlp_ASSESSMENT_Exams_results =
|
const char *Hlp_ASSESSMENT_Exams_results =
|
||||||
#if L==1
|
#if L==1
|
||||||
"ASSESSMENT.Exams.es#resultados";
|
"ASSESSMENT.Exams.es#resultados";
|
||||||
|
|
19
swad_photo.c
19
swad_photo.c
|
@ -1598,8 +1598,8 @@ static void Pho_ComputeAveragePhoto (long DegCod,Usr_Sex_t Sex,Rol_Role_t Role,
|
||||||
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
|
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
|
||||||
unsigned NumUsr;
|
unsigned NumUsr;
|
||||||
char PathPrivRelPhoto[PATH_MAX + 1]; // Relative path to private photo, to calculate average face
|
char PathPrivRelPhoto[PATH_MAX + 1]; // Relative path to private photo, to calculate average face
|
||||||
char PathRelAvgPhoto[PATH_MAX + 1];
|
char *PathRelAvgPhoto;
|
||||||
char FileNamePhotoNames[PATH_MAX + 1];
|
char *FileNamePhotoNames;
|
||||||
FILE *FilePhotoNames = NULL; // Initialized to avoid warning
|
FILE *FilePhotoNames = NULL; // Initialized to avoid warning
|
||||||
char StrCallToProgram[3 * (PATH_MAX + 1)]; // Call to photo processing program
|
char StrCallToProgram[3 * (PATH_MAX + 1)]; // Call to photo processing program
|
||||||
int ReturnCode;
|
int ReturnCode;
|
||||||
|
@ -1615,18 +1615,18 @@ static void Pho_ComputeAveragePhoto (long DegCod,Usr_Sex_t Sex,Rol_Role_t Role,
|
||||||
*NumStds = *NumStdsWithPhoto = 0;
|
*NumStds = *NumStdsWithPhoto = 0;
|
||||||
|
|
||||||
/***** Build name for file with average photo *****/
|
/***** Build name for file with average photo *****/
|
||||||
snprintf (PathRelAvgPhoto,sizeof (PathRelAvgPhoto),
|
if (asprintf (&PathRelAvgPhoto,"%s/%ld_%s.jpg",
|
||||||
"%s/%ld_%s.jpg",
|
DirAvgPhotosRelPath,DegCod,Usr_StringsSexDB[Sex]) < 0)
|
||||||
DirAvgPhotosRelPath,DegCod,Usr_StringsSexDB[Sex]);
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
|
||||||
/***** Remove old file if exists *****/
|
/***** Remove old file if exists *****/
|
||||||
if (Fil_CheckIfPathExists (PathRelAvgPhoto)) // If file exists
|
if (Fil_CheckIfPathExists (PathRelAvgPhoto)) // If file exists
|
||||||
unlink (PathRelAvgPhoto);
|
unlink (PathRelAvgPhoto);
|
||||||
|
|
||||||
/***** Build names for text file with photo paths *****/
|
/***** Build names for text file with photo paths *****/
|
||||||
snprintf (FileNamePhotoNames,sizeof (FileNamePhotoNames),
|
if (asprintf (&FileNamePhotoNames,"%s/%ld.txt",
|
||||||
"%s/%ld.txt",
|
Cfg_PATH_PHOTO_TMP_PRIVATE,DegCod) < 0)
|
||||||
Cfg_PATH_PHOTO_TMP_PRIVATE,DegCod);
|
Lay_NotEnoughMemoryExit ();
|
||||||
if ((FilePhotoNames = fopen (FileNamePhotoNames,"wb")) == NULL)
|
if ((FilePhotoNames = fopen (FileNamePhotoNames,"wb")) == NULL)
|
||||||
Lay_ShowErrorAndExit ("Can not open file to compute average photo.");
|
Lay_ShowErrorAndExit ("Can not open file to compute average photo.");
|
||||||
|
|
||||||
|
@ -1667,6 +1667,9 @@ static void Pho_ComputeAveragePhoto (long DegCod,Usr_Sex_t Sex,Rol_Role_t Role,
|
||||||
Lay_ShowErrorAndExit ("The average photo has not been computed successfully.");
|
Lay_ShowErrorAndExit ("The average photo has not been computed successfully.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free (PathRelAvgPhoto);
|
||||||
|
free (FileNamePhotoNames);
|
||||||
|
|
||||||
/***** Time used to compute the stats of this degree *****/
|
/***** Time used to compute the stats of this degree *****/
|
||||||
if (gettimeofday (&tvEndComputingStat, &tz))
|
if (gettimeofday (&tvEndComputingStat, &tz))
|
||||||
// Error in gettimeofday
|
// Error in gettimeofday
|
||||||
|
|
|
@ -1456,7 +1456,8 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
|
||||||
Lay_ShowErrorAndExit ("Space allocated to string is full.");
|
Lay_ShowErrorAndExit ("Space allocated to string is full.");
|
||||||
|
|
||||||
/* Copy to appropiate place the special character string */
|
/* Copy to appropiate place the special character string */
|
||||||
strncpy (PtrDst,StrSpecialChar,LengthSpecStrDst);
|
// strncpy (PtrDst,StrSpecialChar,LengthSpecStrDst);
|
||||||
|
strcpy (PtrDst,StrSpecialChar);
|
||||||
|
|
||||||
/* Increment pointer to character after ';' */
|
/* Increment pointer to character after ';' */
|
||||||
PtrSrc += LengthSpecStrSrc;
|
PtrSrc += LengthSpecStrSrc;
|
||||||
|
|
57
swad_zip.c
57
swad_zip.c
|
@ -25,9 +25,11 @@
|
||||||
/*********************************** Headers *********************************/
|
/*********************************** Headers *********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE // For asprintf
|
||||||
#include <dirent.h> // For scandir, etc.
|
#include <dirent.h> // For scandir, etc.
|
||||||
#include <errno.h> // For errno
|
#include <errno.h> // For errno
|
||||||
#include <linux/limits.h> // For PATH_MAX
|
#include <linux/limits.h> // For PATH_MAX
|
||||||
|
#include <stdio.h> // For asprintf
|
||||||
#include <stdlib.h> // For system...
|
#include <stdlib.h> // For system...
|
||||||
#include <string.h> // For string functions...
|
#include <string.h> // For string functions...
|
||||||
#include <sys/stat.h> // For mkdir...
|
#include <sys/stat.h> // For mkdir...
|
||||||
|
@ -357,7 +359,7 @@ static void ZIP_CompressFolderIntoZIP (void)
|
||||||
NAME_MAX + 1 +
|
NAME_MAX + 1 +
|
||||||
NAME_MAX + 1];
|
NAME_MAX + 1];
|
||||||
int Result;
|
int Result;
|
||||||
char FileNameZIP[NAME_MAX + 1];
|
char *FileNameZIP;
|
||||||
char PathFileZIP[PATH_MAX + 1];
|
char PathFileZIP[PATH_MAX + 1];
|
||||||
struct stat FileStatus;
|
struct stat FileStatus;
|
||||||
char URLWithSpaces[PATH_MAX + 1];
|
char URLWithSpaces[PATH_MAX + 1];
|
||||||
|
@ -395,10 +397,10 @@ static void ZIP_CompressFolderIntoZIP (void)
|
||||||
Lay_ShowErrorAndExit ("Can not change to temporary folder for compression.");
|
Lay_ShowErrorAndExit ("Can not change to temporary folder for compression.");
|
||||||
|
|
||||||
/***** Create public zip file with the assignment and works *****/
|
/***** Create public zip file with the assignment and works *****/
|
||||||
snprintf (FileNameZIP,sizeof (FileNameZIP),
|
if (asprintf (&FileNameZIP,"%s.zip",
|
||||||
"%s.zip",
|
strcmp (Gbl.FileBrowser.FilFolLnk.Name,".") ? Gbl.FileBrowser.FilFolLnk.Name :
|
||||||
strcmp (Gbl.FileBrowser.FilFolLnk.Name,".") ? Gbl.FileBrowser.FilFolLnk.Name :
|
Txt_ROOT_FOLDER_EXTERNAL_NAMES[Gbl.FileBrowser.Type]) < 0)
|
||||||
Txt_ROOT_FOLDER_EXTERNAL_NAMES[Gbl.FileBrowser.Type]);
|
Lay_NotEnoughMemoryExit ();
|
||||||
snprintf (PathFileZIP,sizeof (PathFileZIP),
|
snprintf (PathFileZIP,sizeof (PathFileZIP),
|
||||||
"%s/%s/%s/%s",
|
"%s/%s/%s/%s",
|
||||||
Cfg_PATH_FILE_BROWSER_TMP_PUBLIC,
|
Cfg_PATH_FILE_BROWSER_TMP_PUBLIC,
|
||||||
|
@ -414,29 +416,30 @@ static void ZIP_CompressFolderIntoZIP (void)
|
||||||
if (chdir (Cfg_PATH_CGI_BIN))
|
if (chdir (Cfg_PATH_CGI_BIN))
|
||||||
Lay_ShowErrorAndExit ("Can not change to cgi-bin folder.");
|
Lay_ShowErrorAndExit ("Can not change to cgi-bin folder.");
|
||||||
|
|
||||||
/***** If the zip command has been sucessful, write the link to zip file *****/
|
/***** If the zip command has not been sucessful, abort *****/
|
||||||
if (Result == 0)
|
if (Result)
|
||||||
{
|
|
||||||
/***** Get file size *****/
|
|
||||||
if (lstat (PathFileZIP,&FileStatus)) // On success ==> 0 is returned
|
|
||||||
Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/***** Create URL pointing to ZIP file *****/
|
|
||||||
snprintf (URLWithSpaces,sizeof (URLWithSpaces),
|
|
||||||
"%s/%s/%s/%s",
|
|
||||||
Cfg_URL_FILE_BROWSER_TMP_PUBLIC,
|
|
||||||
Gbl.FileBrowser.TmpPubDir.L,
|
|
||||||
Gbl.FileBrowser.TmpPubDir.R,
|
|
||||||
FileNameZIP);
|
|
||||||
Str_CopyStrChangingSpaces (URLWithSpaces,URL,PATH_MAX); // In HTML, URL must have no spaces
|
|
||||||
|
|
||||||
/****** Link to download file *****/
|
|
||||||
ZIP_ShowLinkToDownloadZIP (FileNameZIP,URL,FileStatus.st_size,UncompressedSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Lay_ShowErrorAndExit ("Can not compress files into zip file.");
|
Lay_ShowErrorAndExit ("Can not compress files into zip file.");
|
||||||
|
|
||||||
|
/***** If the zip command has been sucessful, write the link to zip file *****/
|
||||||
|
/* Get file size */
|
||||||
|
if (lstat (PathFileZIP,&FileStatus)) // On success ==> 0 is returned
|
||||||
|
Lay_ShowErrorAndExit ("Can not get information about a file or folder.");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Create URL pointing to ZIP file */
|
||||||
|
snprintf (URLWithSpaces,sizeof (URLWithSpaces),
|
||||||
|
"%s/%s/%s/%s",
|
||||||
|
Cfg_URL_FILE_BROWSER_TMP_PUBLIC,
|
||||||
|
Gbl.FileBrowser.TmpPubDir.L,
|
||||||
|
Gbl.FileBrowser.TmpPubDir.R,
|
||||||
|
FileNameZIP);
|
||||||
|
Str_CopyStrChangingSpaces (URLWithSpaces,URL,PATH_MAX); // In HTML, URL must have no spaces
|
||||||
|
|
||||||
|
/** Link to download file */
|
||||||
|
ZIP_ShowLinkToDownloadZIP (FileNameZIP,URL,FileStatus.st_size,UncompressedSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
free (FileNameZIP);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Remove the directory of compression *****/
|
/***** Remove the directory of compression *****/
|
||||||
|
|
Loading…
Reference in New Issue