Version19.148

This commit is contained in:
acanas 2020-03-17 00:35:11 +01:00
parent adbad19129
commit 5d14676c39
16 changed files with 945 additions and 576 deletions

View File

@ -635,9 +635,11 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActImpTstQst ] = {1008,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_BRW_1ST_TAB,NULL ,TsI_ImportQstsFromXML ,NULL},
[ActLstTstQst ] = { 132,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ListQuestionsToEdit ,NULL},
[ActRcvTstQst ] = { 126,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_BRW_1ST_TAB,NULL ,Tst_ReceiveQst ,NULL},
[ActReqRemTstQst ] = {1523,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RequestRemoveQst ,NULL},
[ActRemTstQst ] = { 133,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RemoveQst ,NULL},
[ActShfTstQst ] = { 455,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ChangeShuffleQst ,NULL},
[ActReqRemSevTstQst ] = {1835,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RequestRemoveSelectedQsts ,NULL},
[ActRemSevTstQst ] = {1836,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RemoveSelectedQsts ,NULL},
[ActReqRemOneTstQst ] = {1523,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RequestRemoveOneQst ,NULL},
[ActRemOneTstQst ] = { 133,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RemoveOneQst ,NULL},
[ActChgShfTstQst ] = { 455,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ChangeShuffleQst ,NULL},
[ActCfgTst ] = { 451,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowFormConfig ,NULL},
[ActEnableTag ] = { 453,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_EnableTag ,NULL},
@ -1862,7 +1864,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
-1, // #130 (obsolete action)
-1, // #131 (obsolete action)
ActLstTstQst, // #132
ActRemTstQst, // #133
ActRemOneTstQst, // #133
-1, // #134 (obsolete action)
-1, // #135 (obsolete action)
-1, // #136 (obsolete action)
@ -2184,7 +2186,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActDisableTag, // #452
ActEnableTag, // #453
ActRcvCfgTst, // #454
ActShfTstQst, // #455
ActChgShfTstQst, // #455
-1, // #456 (obsolete action)
-1, // #457 (obsolete action)
-1, // #458 (obsolete action)
@ -3252,7 +3254,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActSeeSocPrf, // #1520
ActFrmLogIn, // #1521
ActUpdSignUpReq, // #1522
ActReqRemTstQst, // #1523
ActReqRemOneTstQst, // #1523
ActReqRemSvyQst, // #1524
ActAdmTchCrsGrp, // #1525
ActChgToAdmTch, // #1526
@ -3564,6 +3566,8 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActDwnPrgItm, // #1833
ActRgtPrgItm, // #1833
ActLftPrgItm, // #1834
ActReqRemSevTstQst, // #1835
ActRemSevTstQst, // #1836
};
/*****************************************************************************/

View File

@ -64,7 +64,7 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_MAX_ACTION_COD 1834
#define Act_MAX_ACTION_COD 1836
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@ -613,97 +613,99 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActImpTstQst (ActChgCrsTT1stDay + 102)
#define ActLstTstQst (ActChgCrsTT1stDay + 103)
#define ActRcvTstQst (ActChgCrsTT1stDay + 104)
#define ActReqRemTstQst (ActChgCrsTT1stDay + 105)
#define ActRemTstQst (ActChgCrsTT1stDay + 106)
#define ActShfTstQst (ActChgCrsTT1stDay + 107)
#define ActCfgTst (ActChgCrsTT1stDay + 108)
#define ActEnableTag (ActChgCrsTT1stDay + 109)
#define ActDisableTag (ActChgCrsTT1stDay + 110)
#define ActRenTag (ActChgCrsTT1stDay + 111)
#define ActRcvCfgTst (ActChgCrsTT1stDay + 112)
#define ActReqRemSevTstQst (ActChgCrsTT1stDay + 105)
#define ActRemSevTstQst (ActChgCrsTT1stDay + 106)
#define ActReqRemOneTstQst (ActChgCrsTT1stDay + 107)
#define ActRemOneTstQst (ActChgCrsTT1stDay + 108)
#define ActChgShfTstQst (ActChgCrsTT1stDay + 109)
#define ActCfgTst (ActChgCrsTT1stDay + 110)
#define ActEnableTag (ActChgCrsTT1stDay + 111)
#define ActDisableTag (ActChgCrsTT1stDay + 112)
#define ActRenTag (ActChgCrsTT1stDay + 113)
#define ActRcvCfgTst (ActChgCrsTT1stDay + 114)
#define ActReqSeeMyTstRes (ActChgCrsTT1stDay + 113)
#define ActSeeMyTstRes (ActChgCrsTT1stDay + 114)
#define ActSeeOneTstResMe (ActChgCrsTT1stDay + 115)
#define ActReqSeeUsrTstRes (ActChgCrsTT1stDay + 116)
#define ActSeeUsrTstRes (ActChgCrsTT1stDay + 117)
#define ActSeeOneTstResOth (ActChgCrsTT1stDay + 118)
#define ActReqSeeMyTstRes (ActChgCrsTT1stDay + 115)
#define ActSeeMyTstRes (ActChgCrsTT1stDay + 116)
#define ActSeeOneTstResMe (ActChgCrsTT1stDay + 117)
#define ActReqSeeUsrTstRes (ActChgCrsTT1stDay + 118)
#define ActSeeUsrTstRes (ActChgCrsTT1stDay + 119)
#define ActSeeOneTstResOth (ActChgCrsTT1stDay + 120)
#define ActSeeGam (ActChgCrsTT1stDay + 119)
#define ActReqRemMch (ActChgCrsTT1stDay + 120)
#define ActRemMch (ActChgCrsTT1stDay + 121)
#define ActReqNewMch (ActChgCrsTT1stDay + 122)
#define ActNewMch (ActChgCrsTT1stDay + 123)
#define ActResMch (ActChgCrsTT1stDay + 124)
#define ActBckMch (ActChgCrsTT1stDay + 125)
#define ActPlyPauMch (ActChgCrsTT1stDay + 126)
#define ActFwdMch (ActChgCrsTT1stDay + 127)
#define ActChgNumColMch (ActChgCrsTT1stDay + 128)
#define ActChgVisResMchQst (ActChgCrsTT1stDay + 129)
#define ActMchCntDwn (ActChgCrsTT1stDay + 130)
#define ActRefMchTch (ActChgCrsTT1stDay + 131)
#define ActSeeGam (ActChgCrsTT1stDay + 121)
#define ActReqRemMch (ActChgCrsTT1stDay + 122)
#define ActRemMch (ActChgCrsTT1stDay + 123)
#define ActReqNewMch (ActChgCrsTT1stDay + 124)
#define ActNewMch (ActChgCrsTT1stDay + 125)
#define ActResMch (ActChgCrsTT1stDay + 126)
#define ActBckMch (ActChgCrsTT1stDay + 127)
#define ActPlyPauMch (ActChgCrsTT1stDay + 128)
#define ActFwdMch (ActChgCrsTT1stDay + 129)
#define ActChgNumColMch (ActChgCrsTT1stDay + 130)
#define ActChgVisResMchQst (ActChgCrsTT1stDay + 131)
#define ActMchCntDwn (ActChgCrsTT1stDay + 132)
#define ActRefMchTch (ActChgCrsTT1stDay + 133)
#define ActJoiMch (ActChgCrsTT1stDay + 132)
#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 133)
#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 134)
#define ActAnsMchQstStd (ActChgCrsTT1stDay + 135)
#define ActRefMchStd (ActChgCrsTT1stDay + 136)
#define ActJoiMch (ActChgCrsTT1stDay + 134)
#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 135)
#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 136)
#define ActAnsMchQstStd (ActChgCrsTT1stDay + 137)
#define ActRefMchStd (ActChgCrsTT1stDay + 138)
#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 137)
#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 138)
#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 139)
#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 140)
#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 139)
#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 140)
#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 141)
#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 142)
#define ActReqSeeAllMchRes (ActChgCrsTT1stDay + 141)
#define ActSeeAllMchResCrs (ActChgCrsTT1stDay + 142)
#define ActSeeAllMchResGam (ActChgCrsTT1stDay + 143)
#define ActSeeAllMchResMch (ActChgCrsTT1stDay + 144)
#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 145)
#define ActReqSeeAllMchRes (ActChgCrsTT1stDay + 143)
#define ActSeeAllMchResCrs (ActChgCrsTT1stDay + 144)
#define ActSeeAllMchResGam (ActChgCrsTT1stDay + 145)
#define ActSeeAllMchResMch (ActChgCrsTT1stDay + 146)
#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 147)
#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 146)
#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 148)
#define ActFrmNewGam (ActChgCrsTT1stDay + 147)
#define ActEdiOneGam (ActChgCrsTT1stDay + 148)
#define ActNewGam (ActChgCrsTT1stDay + 149)
#define ActChgGam (ActChgCrsTT1stDay + 150)
#define ActReqRemGam (ActChgCrsTT1stDay + 151)
#define ActRemGam (ActChgCrsTT1stDay + 152)
#define ActHidGam (ActChgCrsTT1stDay + 153)
#define ActShoGam (ActChgCrsTT1stDay + 154)
#define ActAddOneGamQst (ActChgCrsTT1stDay + 155)
#define ActGamLstTstQst (ActChgCrsTT1stDay + 156)
#define ActAddTstQstToGam (ActChgCrsTT1stDay + 157)
#define ActReqRemGamQst (ActChgCrsTT1stDay + 158)
#define ActRemGamQst (ActChgCrsTT1stDay + 159)
#define ActUp_GamQst (ActChgCrsTT1stDay + 160)
#define ActDwnGamQst (ActChgCrsTT1stDay + 161)
#define ActFrmNewGam (ActChgCrsTT1stDay + 149)
#define ActEdiOneGam (ActChgCrsTT1stDay + 150)
#define ActNewGam (ActChgCrsTT1stDay + 151)
#define ActChgGam (ActChgCrsTT1stDay + 152)
#define ActReqRemGam (ActChgCrsTT1stDay + 153)
#define ActRemGam (ActChgCrsTT1stDay + 154)
#define ActHidGam (ActChgCrsTT1stDay + 155)
#define ActShoGam (ActChgCrsTT1stDay + 156)
#define ActAddOneGamQst (ActChgCrsTT1stDay + 157)
#define ActGamLstTstQst (ActChgCrsTT1stDay + 158)
#define ActAddTstQstToGam (ActChgCrsTT1stDay + 159)
#define ActReqRemGamQst (ActChgCrsTT1stDay + 160)
#define ActRemGamQst (ActChgCrsTT1stDay + 161)
#define ActUp_GamQst (ActChgCrsTT1stDay + 162)
#define ActDwnGamQst (ActChgCrsTT1stDay + 163)
#define ActSeeSvy (ActChgCrsTT1stDay + 162)
#define ActAnsSvy (ActChgCrsTT1stDay + 163)
#define ActFrmNewSvy (ActChgCrsTT1stDay + 164)
#define ActEdiOneSvy (ActChgCrsTT1stDay + 165)
#define ActNewSvy (ActChgCrsTT1stDay + 166)
#define ActChgSvy (ActChgCrsTT1stDay + 167)
#define ActReqRemSvy (ActChgCrsTT1stDay + 168)
#define ActRemSvy (ActChgCrsTT1stDay + 169)
#define ActReqRstSvy (ActChgCrsTT1stDay + 170)
#define ActRstSvy (ActChgCrsTT1stDay + 171)
#define ActHidSvy (ActChgCrsTT1stDay + 172)
#define ActShoSvy (ActChgCrsTT1stDay + 173)
#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 174)
#define ActRcvSvyQst (ActChgCrsTT1stDay + 175)
#define ActReqRemSvyQst (ActChgCrsTT1stDay + 176)
#define ActRemSvyQst (ActChgCrsTT1stDay + 177)
#define ActSeeSvy (ActChgCrsTT1stDay + 164)
#define ActAnsSvy (ActChgCrsTT1stDay + 165)
#define ActFrmNewSvy (ActChgCrsTT1stDay + 166)
#define ActEdiOneSvy (ActChgCrsTT1stDay + 167)
#define ActNewSvy (ActChgCrsTT1stDay + 168)
#define ActChgSvy (ActChgCrsTT1stDay + 169)
#define ActReqRemSvy (ActChgCrsTT1stDay + 170)
#define ActRemSvy (ActChgCrsTT1stDay + 171)
#define ActReqRstSvy (ActChgCrsTT1stDay + 172)
#define ActRstSvy (ActChgCrsTT1stDay + 173)
#define ActHidSvy (ActChgCrsTT1stDay + 174)
#define ActShoSvy (ActChgCrsTT1stDay + 175)
#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 176)
#define ActRcvSvyQst (ActChgCrsTT1stDay + 177)
#define ActReqRemSvyQst (ActChgCrsTT1stDay + 178)
#define ActRemSvyQst (ActChgCrsTT1stDay + 179)
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 178)
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 179)
#define ActEdiExaAnn (ActChgCrsTT1stDay + 180)
#define ActRcvExaAnn (ActChgCrsTT1stDay + 181)
#define ActPrnExaAnn (ActChgCrsTT1stDay + 182)
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 183)
#define ActRemExaAnn (ActChgCrsTT1stDay + 184)
#define ActHidExaAnn (ActChgCrsTT1stDay + 185)
#define ActShoExaAnn (ActChgCrsTT1stDay + 186)
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 180)
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 181)
#define ActEdiExaAnn (ActChgCrsTT1stDay + 182)
#define ActRcvExaAnn (ActChgCrsTT1stDay + 183)
#define ActPrnExaAnn (ActChgCrsTT1stDay + 184)
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 185)
#define ActRemExaAnn (ActChgCrsTT1stDay + 186)
#define ActHidExaAnn (ActChgCrsTT1stDay + 187)
#define ActShoExaAnn (ActChgCrsTT1stDay + 188)
/*****************************************************************************/
/******************************** Files tab **********************************/

View File

@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.147 (2020-03-14)"
#define Log_PLATFORM_VERSION "SWAD 19.148 (2020-03-17)"
#define CSS_FILE "swad19.146.css"
#define JS_FILE "swad19.91.1.js"
/*
@ -521,10 +521,13 @@ Param
// TODO: No se puede entrar con DNI '1' suponiendo que no tenga password ¿por qué?
// TODO: En la lista de conectados central, poner el logo de la institución a la que pertenece el usuario
// TODO: Miguel Damas: al principio de los exámenes tendría que poner cuánto resta cada pregunta
// TODO: Si el alumno ha marcado "Permitir que los profesores...", entonces pedir confirmación al pulsar el botón azul, para evitar que se envíe por error antes de tiempo
// TODO: Oresti Baños: cambiar ojos por candados en descriptores para prohibir/permitir y dejar los ojos para poder elegir descriptores
// TODO: Si el alumno ha marcado "Permitir que los profesores...", entonces pedir confirmación al pulsar el botón azul, para evitar que se envíe por error antes de tiempo
Version 19.148: Mar 17, 2020 Code refactoring in tests.
New actions to remove several test questions. (282868 lines)
Version 19.147: Mar 14, 2020 Change MathJax to version 3.0.1. (282550 lines)
Install MathJax 3.0.1
Copy the following JavaScript file to public directory:
sudo cp js/mathjax-config.js /var/www/html/swad/

View File

@ -3906,7 +3906,7 @@ void For_ReceiveForumPost (void)
Media.Width = For_IMAGE_SAVED_MAX_WIDTH;
Media.Height = For_IMAGE_SAVED_MAX_HEIGHT;
Media.Quality = For_IMAGE_SAVED_QUALITY;
Med_GetMediaFromForm (-1,&Media,NULL,
Med_GetMediaFromForm (-1L,-1L,-1,&Media,NULL,
For_FORUM_POSTS_SECTION_ID); // Alerts will be shown later in posts section
/***** Create a new message *****/

View File

@ -156,7 +156,7 @@ static void Gam_ListGameQuestions (struct Game *Game);
static void Gam_ListOneOrMoreQuestionsForEdition (long GamCod,unsigned NumQsts,
MYSQL_RES *mysql_res,
bool ICanEditQuestions);
static void Gam_ListQuestionForEdition (const char *StrQstInd);
static void Gam_ListQuestionForEdition (long QstCod,const char *StrQstInd);
static void Gam_PutIconToAddNewQuestions (void);
static void Gam_PutButtonToAddNewQuestions (void);
@ -1873,6 +1873,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (long GamCod,unsigned NumQsts,
extern const char *Txt_Movement_not_allowed;
unsigned NumQst;
MYSQL_ROW row;
long QstCod;
unsigned QstInd;
unsigned MaxQstInd;
char StrQstInd[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
@ -1915,7 +1916,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (long GamCod,unsigned NumQsts,
QstInd);
/* Get question code (row[1]) */
Gbl.Test.QstCod = Str_ConvertStrCodToLongCod (row[1]);
QstCod = Str_ConvertStrCodToLongCod (row[1]);
/***** Icons *****/
Gam_SetCurrentGamCod (GamCod); // Used to pass parameter
@ -1962,12 +1963,15 @@ static void Gam_ListOneOrMoreQuestionsForEdition (long GamCod,unsigned NumQsts,
/* Put icon to edit the question */
if (ICanEditQuestions)
Ico_PutContextualIconToEdit (ActEdiOneTstQst,NULL,Tst_PutParamQstCod);
{
Tst_SetParamGblQstCod (QstCod);
Ico_PutContextualIconToEdit (ActEdiOneTstQst,NULL,Tst_PutParamGblQstCod);
}
HTM_TD_End ();
/***** Question *****/
Gam_ListQuestionForEdition (StrQstInd);
Gam_ListQuestionForEdition (QstCod,StrQstInd);
HTM_TR_End ();
@ -1983,7 +1987,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (long GamCod,unsigned NumQsts,
/********************** List game question for edition ***********************/
/*****************************************************************************/
static void Gam_ListQuestionForEdition (const char *StrQstInd)
static void Gam_ListQuestionForEdition (long QstCod,const char *StrQstInd)
{
extern const char *Txt_TST_STR_ANSWER_TYPES[Tst_NUM_ANS_TYPES];
extern const char *Txt_Question_removed;
@ -1992,7 +1996,7 @@ static void Gam_ListQuestionForEdition (const char *StrQstInd)
bool QstExists;
/***** Get question from database *****/
QstExists = Tst_GetOneQuestionByCod (Gbl.Test.QstCod,&mysql_res); // Question exists?
QstExists = Tst_GetOneQuestionByCod (QstCod,&mysql_res); // Question exists?
if (QstExists)
{
@ -2033,13 +2037,13 @@ static void Gam_ListQuestionForEdition (const char *StrQstInd)
/***** Write question code *****/
HTM_TD_Begin ("class=\"DAT_SMALL CT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TxtF ("%ld ",Gbl.Test.QstCod);
HTM_TxtF ("%ld ",QstCod);
HTM_TD_End ();
/***** Write the question tags *****/
HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd);
if (QstExists)
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
Tst_GetAndWriteTagsQst (QstCod);
HTM_TD_End ();
/***** Write stem and media (row[4]) *****/
@ -2063,7 +2067,7 @@ static void Gam_ListQuestionForEdition (const char *StrQstInd)
Tst_WriteQstFeedback (row[5],"TEST_EDI_LIGHT");
/* Show answers */
Tst_WriteAnswersEdit (Gbl.Test.QstCod);
Tst_WriteAnswersEdit (QstCod);
}
else
{

View File

@ -652,7 +652,6 @@ struct Globals
struct
{
struct Tst_Config Config;
long QstCod;
struct
{
unsigned Num;
@ -690,11 +689,6 @@ struct Globals
} Answer;
char ListAnsTypes[Tst_MAX_BYTES_LIST_ANSWER_TYPES + 1];
Tst_QuestionsOrder_t SelectedOrder;
struct
{
bool CreateXML; // Create an XML file and Export questions into it?
FILE *FileXML;
} XML;
} Test;
struct
{

View File

@ -504,11 +504,11 @@ static void Med_PutHiddenFormTypeMediaUploader (const char UniqueId[Frm_MAX_BYTE
/******************** Get media (image/video) from form **********************/
/*****************************************************************************/
// Media constructor must be called before calling this function
// If NumMediaInForm < 0, params have no suffix
// If NumMediaInForm < 0, params have no suffix
// If NumMediaInForm >= 0, the number is a suffix of the params
void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,
void (*GetMediaFromDB) (int NumMediaInForm,struct Media *Media),
void Med_GetMediaFromForm (long CrsCod,long QstCod,int NumMediaInForm,struct Media *Media,
void (*GetMediaFromDB) (long CrsCod,long QstCod,int NumMediaInForm,struct Media *Media),
const char *SectionForAlerts)
{
extern const char *Txt_Error_sending_or_processing_image_video;
@ -581,7 +581,7 @@ void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,
/***** Get media name *****/
if (GetMediaFromDB != NULL)
GetMediaFromDB (NumMediaInForm,Media);
GetMediaFromDB (CrsCod,QstCod,NumMediaInForm,Media);
break;
default: // Unknown action
Media->Action = Med_ACTION_NO_MEDIA;

View File

@ -141,8 +141,8 @@ void Med_ResetMedia (struct Media *Media);
void Med_GetMediaDataByCod (struct Media *Media);
void Med_PutMediaUploader (int NumMediaInForm,const char *ClassInput);
void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,
void (*GetMediaFromDB) (int NumMediaInForm,struct Media *Media),
void Med_GetMediaFromForm (long CrsCod,long QstCod,int NumMediaInForm,struct Media *Media,
void (*GetMediaFromDB) (long CrsCod,long QstCod,int NumMediaInForm,struct Media *Media),
const char *SectionForAlerts);
void Med_SetParamNames (struct ParamUploadMedia *ParamUploadMedia,int NumMediaInForm);

View File

@ -755,7 +755,7 @@ void Msg_RecMsgFromUsr (void)
Media.Width = Msg_IMAGE_SAVED_MAX_WIDTH;
Media.Height = Msg_IMAGE_SAVED_MAX_HEIGHT;
Media.Quality = Msg_IMAGE_SAVED_QUALITY;
Med_GetMediaFromForm (-1,&Media,NULL,NULL);
Med_GetMediaFromForm (-1L,-1L,-1,&Media,NULL,NULL);
Ale_ShowAlerts (NULL);
/***** Loop over the list Gbl.Usrs.Selected.List[Rol_UNK], that holds the list of the

File diff suppressed because it is too large Load Diff

View File

@ -193,13 +193,20 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void);
bool Tst_CheckIfQuestionExistsInDB (void);
long Tst_GetIntAnsFromStr (char *Str);
void Tst_RequestRemoveQst (void);
void Tst_RemoveQst (void);
void Tst_RequestRemoveSelectedQsts (void);
void Tst_RemoveSelectedQsts (void);
void Tst_RequestRemoveOneQst (void);
void Tst_RemoveOneQst (void);
void Tst_ChangeShuffleQst (void);
void Tst_PutParamQstCod (void);
void Tst_SetParamGblQstCod (long QstCod);
long Tst_GetParamGblQstCod (void);
void Tst_PutParamGblQstCod (void);
void Tst_PutParamQstCod (long QstCod);
void Tst_InsertOrUpdateQstTagsAnsIntoDB (void);
long Tst_InsertOrUpdateQstTagsAnsIntoDB (long QstCod);
void Tst_RemoveCrsTests (long CrsCod);

View File

@ -66,9 +66,12 @@ extern struct Globals Gbl;
/*****************************************************************************/
static void TsI_PutParamsExportQsts (void);
static void TsI_PutCreateXMLParam (void);
static void TsI_GetAndWriteTagsXML (long QstCod);
static void TsI_WriteAnswersOfAQstXML (long QstCod);
static void TsI_ExportQuestion (long QstCod,FILE *FileXML);
static void TsI_GetAndWriteTagsXML (long QstCod,FILE *FileXML);
static void TsI_WriteAnswersOfAQstXML (long QstCod,FILE *FileXML);
static void TsI_ReadQuestionsFromXMLFileAndStoreInDB (const char *FileNameXML);
static void TsI_ImportQuestionsFromXMLBuffer (const char *XMLBuffer);
static Tst_AnswerType_t TsI_ConvertFromStrAnsTypXMLToAnsTyp (const char *StrAnsTypeXML);
@ -102,9 +105,23 @@ static void TsI_PutParamsExportQsts (void)
Tst_WriteParamEditQst ();
Par_PutHiddenParamChar ("OnlyThisQst",'N');
Par_PutHiddenParamUnsigned (NULL,"Order",(unsigned) Gbl.Test.SelectedOrder);
TsI_PutCreateXMLParam ();
}
/*****************************************************************************/
/************************ Parameter to create XML file ***********************/
/*****************************************************************************/
static void TsI_PutCreateXMLParam (void)
{
Par_PutHiddenParamChar ("CreateXML",'Y');
}
bool TsI_GetCreateXMLParamFromForm (void)
{
return Par_GetParToBool ("CreateXML");
}
/*****************************************************************************/
/*************** Put a link (form) to import test questions ******************/
/*****************************************************************************/
@ -157,10 +174,10 @@ void TsI_ShowFormImportQstsFromXML (void)
void TsI_CreateXML (unsigned long NumRows,MYSQL_RES *mysql_res)
{
extern const char *The_ClassFormOutBoxBold[The_NUM_THEMES];
extern const char *Tst_StrAnswerTypesXML[Tst_NUM_ANS_TYPES];
extern const char *Txt_NEW_LINE;
extern const char *Txt_XML_file;
char PathPubFile[PATH_MAX + 1];
FILE *FileXML;
unsigned long NumRow;
MYSQL_ROW row;
long QstCod;
@ -175,77 +192,31 @@ void TsI_CreateXML (unsigned long NumRows,MYSQL_RES *mysql_res)
Cfg_PATH_FILE_BROWSER_TMP_PUBLIC,
Gbl.FileBrowser.TmpPubDir.L,
Gbl.FileBrowser.TmpPubDir.R);
if ((Gbl.Test.XML.FileXML = fopen (PathPubFile,"wb")) == NULL)
if ((FileXML = fopen (PathPubFile,"wb")) == NULL)
Lay_ShowErrorAndExit ("Can not open target file.");
/***** Start XML file *****/
XML_WriteStartFile (Gbl.Test.XML.FileXML,"test",false);
fprintf (Gbl.Test.XML.FileXML,"%s",Txt_NEW_LINE);
XML_WriteStartFile (FileXML,"test",false);
fprintf (FileXML,"%s",Txt_NEW_LINE);
/***** Write rows *****/
for (NumRow = 0;
NumRow < NumRows;
NumRow++)
{
/* Get question code (row[0]) */
row = mysql_fetch_row (mysql_res);
/*
row[0] QstCod
row[1] UNIX_TIMESTAMP(EditTime)
row[2] AnsType
row[3] Shuffle
row[4] Stem
row[5] Feedback
row[6] MedCod
row[7] NumHits
row[8] NumHitsNotBlank
row[9] Score
*/
/* row[0] holds the code of the question */
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
Lay_ShowErrorAndExit ("Wrong code of question.");
/* Write the question type (row[2]) */
Gbl.Test.AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[2]);
fprintf (Gbl.Test.XML.FileXML,"<question type=\"%s\">%s",
Tst_StrAnswerTypesXML[Gbl.Test.AnswerType],Txt_NEW_LINE);
/* Write the question tags */
fprintf (Gbl.Test.XML.FileXML,"<tags>%s",Txt_NEW_LINE);
TsI_GetAndWriteTagsXML (QstCod);
fprintf (Gbl.Test.XML.FileXML,"</tags>%s",Txt_NEW_LINE);
/* Write the stem (row[4]), that is in HTML format */
fprintf (Gbl.Test.XML.FileXML,"<stem>%s</stem>%s",
row[4],Txt_NEW_LINE);
/* Write the feedback (row[5]), that is in HTML format */
if (row[5])
if (row[5][0])
fprintf (Gbl.Test.XML.FileXML,"<feedback>%s</feedback>%s",
row[5],Txt_NEW_LINE);
/* Write the answers of this question.
Shuffle can be enabled or disabled (row[3]) */
fprintf (Gbl.Test.XML.FileXML,"<answer");
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE ||
Gbl.Test.AnswerType == Tst_ANS_MULTIPLE_CHOICE)
fprintf (Gbl.Test.XML.FileXML," shuffle=\"%s\"",
(row[3][0] == 'Y') ? "yes" :
"no");
fprintf (Gbl.Test.XML.FileXML,">");
TsI_WriteAnswersOfAQstXML (QstCod);
fprintf (Gbl.Test.XML.FileXML,"</answer>%s",Txt_NEW_LINE);
/* End question */
fprintf (Gbl.Test.XML.FileXML,"</question>%s%s",
Txt_NEW_LINE,Txt_NEW_LINE);
TsI_ExportQuestion (QstCod,FileXML);
}
/***** End XML file *****/
XML_WriteEndFile (Gbl.Test.XML.FileXML,"test");
XML_WriteEndFile (FileXML,"test");
/***** Close the XML file *****/
fclose (Gbl.Test.XML.FileXML);
fclose (FileXML);
/***** Return to start of query result *****/
mysql_data_seek (mysql_res,0);
@ -261,11 +232,77 @@ void TsI_CreateXML (unsigned long NumRows,MYSQL_RES *mysql_res)
HTM_A_End ();
}
/*****************************************************************************/
/****************** Write one question into the XML file *********************/
/*****************************************************************************/
static void TsI_ExportQuestion (long QstCod,FILE *FileXML)
{
extern const char *Tst_StrAnswerTypesXML[Tst_NUM_ANS_TYPES];
extern const char *Txt_NEW_LINE;
MYSQL_RES *mysql_res;
MYSQL_ROW row;
if (Tst_GetOneQuestionByCod (QstCod,&mysql_res))
{
/***** Get row *****/
row = mysql_fetch_row (mysql_res);
/*
row[0] QstCod
row[1] UNIX_TIMESTAMP(EditTime)
row[2] AnsType
row[3] Shuffle
row[4] Stem
row[5] Feedback
row[6] MedCod
row[7] NumHits
row[8] NumHitsNotBlank
row[9] Score
*/
/***** Write the question type (row[2]) *****/
Gbl.Test.AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[2]);
fprintf (FileXML,"<question type=\"%s\">%s",
Tst_StrAnswerTypesXML[Gbl.Test.AnswerType],Txt_NEW_LINE);
/***** Write the question tags *****/
fprintf (FileXML,"<tags>%s",Txt_NEW_LINE);
TsI_GetAndWriteTagsXML (QstCod,FileXML);
fprintf (FileXML,"</tags>%s",Txt_NEW_LINE);
/***** Write the stem (row[4]), that is in HTML format *****/
fprintf (FileXML,"<stem>%s</stem>%s",
row[4],Txt_NEW_LINE);
/***** Write the feedback (row[5]), that is in HTML format *****/
if (row[5])
if (row[5][0])
fprintf (FileXML,"<feedback>%s</feedback>%s",
row[5],Txt_NEW_LINE);
/***** Write the answers of this question.
Shuffle can be enabled or disabled (row[3]) *****/
fprintf (FileXML,"<answer");
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE ||
Gbl.Test.AnswerType == Tst_ANS_MULTIPLE_CHOICE)
fprintf (FileXML," shuffle=\"%s\"",
(row[3][0] == 'Y') ? "yes" :
"no");
fprintf (FileXML,">");
TsI_WriteAnswersOfAQstXML (QstCod,FileXML);
fprintf (FileXML,"</answer>%s",Txt_NEW_LINE);
/***** End question *****/
fprintf (FileXML,"</question>%s%s",
Txt_NEW_LINE,Txt_NEW_LINE);
}
}
/*****************************************************************************/
/************* Get and write tags of a question into the XML file ************/
/*****************************************************************************/
static void TsI_GetAndWriteTagsXML (long QstCod)
static void TsI_GetAndWriteTagsXML (long QstCod,FILE *FileXML)
{
extern const char *Txt_NEW_LINE;
unsigned long NumRow;
@ -280,7 +317,7 @@ static void TsI_GetAndWriteTagsXML (long QstCod)
NumRow++)
{
row = mysql_fetch_row (mysql_res);
fprintf (Gbl.Test.XML.FileXML,"<tag>%s</tag>%s",
fprintf (FileXML,"<tag>%s</tag>%s",
row[0],Txt_NEW_LINE);
}
@ -292,7 +329,7 @@ static void TsI_GetAndWriteTagsXML (long QstCod)
/**************** Get and write the answers of a test question ***************/
/*****************************************************************************/
static void TsI_WriteAnswersOfAQstXML (long QstCod)
static void TsI_WriteAnswersOfAQstXML (long QstCod,FILE *FileXML)
{
extern const char *Txt_NEW_LINE;
unsigned NumOpt;
@ -315,7 +352,7 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
case Tst_ANS_INT:
Tst_CheckIfNumberOfAnswersIsOne ();
row = mysql_fetch_row (mysql_res);
fprintf (Gbl.Test.XML.FileXML,"%ld",
fprintf (FileXML,"%ld",
Tst_GetIntAnsFromStr (row[1]));
break;
case Tst_ANS_FLOAT:
@ -329,9 +366,9 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
row = mysql_fetch_row (mysql_res);
FloatNum[i] = Str_GetDoubleFromStr (row[1]);
}
fprintf (Gbl.Test.XML.FileXML,"%s"
"<lower>%.15lg</lower>%s"
"<upper>%.15lg</upper>%s",
fprintf (FileXML,"%s"
"<lower>%.15lg</lower>%s"
"<upper>%.15lg</upper>%s",
Txt_NEW_LINE,
FloatNum[0],Txt_NEW_LINE,
FloatNum[1],Txt_NEW_LINE);
@ -339,14 +376,14 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
case Tst_ANS_TRUE_FALSE:
Tst_CheckIfNumberOfAnswersIsOne ();
row = mysql_fetch_row (mysql_res);
fprintf (Gbl.Test.XML.FileXML,"%s",
fprintf (FileXML,"%s",
row[1][0] == 'T' ? "true" :
"false");
break;
case Tst_ANS_UNIQUE_CHOICE:
case Tst_ANS_MULTIPLE_CHOICE:
case Tst_ANS_TEXT:
fprintf (Gbl.Test.XML.FileXML,"%s",Txt_NEW_LINE);
fprintf (FileXML,"%s",Txt_NEW_LINE);
for (NumOpt = 0;
NumOpt < Gbl.Test.Answer.NumOptions;
NumOpt++)
@ -354,28 +391,28 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
row = mysql_fetch_row (mysql_res);
/* Start answer */
fprintf (Gbl.Test.XML.FileXML,"<option");
fprintf (FileXML,"<option");
/* Write whether the answer is correct or not (row[4]) */
if (Gbl.Test.AnswerType != Tst_ANS_TEXT)
fprintf (Gbl.Test.XML.FileXML," correct=\"%s\"",
fprintf (FileXML," correct=\"%s\"",
(row[4][0] == 'Y') ? "yes" :
"no");
fprintf (Gbl.Test.XML.FileXML,">%s",Txt_NEW_LINE);
fprintf (FileXML,">%s",Txt_NEW_LINE);
/* Write the answer (row[1]), that is in HTML */
fprintf (Gbl.Test.XML.FileXML,"<text>%s</text>%s",
fprintf (FileXML,"<text>%s</text>%s",
row[1],Txt_NEW_LINE);
/* Write the feedback (row[2]) */
if (row[2])
if (row[2][0])
fprintf (Gbl.Test.XML.FileXML,"<feedback>%s</feedback>%s",
fprintf (FileXML,"<feedback>%s</feedback>%s",
row[2],Txt_NEW_LINE);
/* End answer */
fprintf (Gbl.Test.XML.FileXML,"</option>%s",
fprintf (FileXML,"</option>%s",
Txt_NEW_LINE);
}
break;
@ -438,17 +475,18 @@ void TsI_ImportQstsFromXML (void)
static void TsI_ReadQuestionsFromXMLFileAndStoreInDB (const char *FileNameXML)
{
FILE *FileXML;
char *XMLBuffer;
unsigned long FileSize;
/***** Open file *****/
if ((Gbl.Test.XML.FileXML = fopen (FileNameXML,"rb")) == NULL)
if ((FileXML = fopen (FileNameXML,"rb")) == NULL)
Lay_ShowErrorAndExit ("Can not open XML file.");
/***** Compute file size *****/
fseek (Gbl.Test.XML.FileXML,0L,SEEK_END);
FileSize = (unsigned long) ftell (Gbl.Test.XML.FileXML);
fseek (Gbl.Test.XML.FileXML,0L,SEEK_SET);
fseek (FileXML,0L,SEEK_END);
FileSize = (unsigned long) ftell (FileXML);
fseek (FileXML,0L,SEEK_SET);
/***** Allocate memory for XML buffer *****/
if ((XMLBuffer = (char *) malloc (FileSize + 1)) == NULL)
@ -456,7 +494,7 @@ static void TsI_ReadQuestionsFromXMLFileAndStoreInDB (const char *FileNameXML)
else
{
/***** Read file contents into XML buffer *****/
if (fread (XMLBuffer,sizeof (char),(size_t) FileSize,Gbl.Test.XML.FileXML))
if (fread (XMLBuffer,sizeof (char),(size_t) FileSize,FileXML))
XMLBuffer[FileSize] = '\0';
else
XMLBuffer[0] = '\0';
@ -468,7 +506,7 @@ static void TsI_ReadQuestionsFromXMLFileAndStoreInDB (const char *FileNameXML)
}
/***** Close file *****/
fclose (Gbl.Test.XML.FileXML);
fclose (FileXML);
}
/*****************************************************************************/
@ -647,10 +685,8 @@ static void TsI_ImportQuestionsFromXMLBuffer (const char *XMLBuffer)
/***** If a new question ==> insert question, tags and answer in the database *****/
if (!QuestionExists)
{
Gbl.Test.QstCod = -1L;
Tst_InsertOrUpdateQstTagsAnsIntoDB ();
}
if (Tst_InsertOrUpdateQstTagsAnsIntoDB (-1L) <= 0)
Lay_ShowErrorAndExit ("Can not create question.");
}
/***** Destroy test question *****/

View File

@ -40,6 +40,7 @@
/*****************************************************************************/
void TsI_PutFormToExportQuestions (void);
bool TsI_GetCreateXMLParamFromForm (void);
void TsI_PutFormToImportQuestions (void);
void TsI_CreateXML (unsigned long NumRows,MYSQL_RES *mysql_res);
void TsI_ShowFormImportQstsFromXML (void);

View File

@ -1818,7 +1818,7 @@ const char *Txt_Add_questions =
#elif L==8 // pl
"Dodaj pytania";
#elif L==9 // pt
"Adicionar quest&otilde;es";
"Adicionar perguntas";
#endif
const char *Txt_Add_this_ID =
@ -2496,7 +2496,7 @@ const char *Txt_Average_number_BR_of_questions_BR_per_survey =
#elif L==8 // pl
"&Sacute;rednia liczba<br />pyta&nacute;<br />na ankiety";
#elif L==9 // pt
"N&ordm; medio<br />de quest&otilde;es<br />por inqu&eacute;rito";
"N&ordm; medio<br />de perguntas<br />por inqu&eacute;rito";
#endif
const char *Txt_Average_BR_number_BR_of_test_BR_questions_BR_per_course =
@ -2517,7 +2517,7 @@ const char *Txt_Average_BR_number_BR_of_test_BR_questions_BR_per_course =
#elif L==8 // pl
"&Sacute;rednia liczba<br />pyta&nacute;<br />testowych<br />na kurs";
#elif L==9 // pt
"N&ordm; medio<br />de quest&otilde;es<br />de test por<br />disciplina";
"N&ordm; medio<br />de perguntas<br />de test por<br />disciplina";
#endif
const char *Txt_Average_number_BR_of_surveys_BR_per_course =
@ -6169,7 +6169,7 @@ const char *Txt_Create_question =
#elif L==8 // pl
"Utw&oacute;rz pytanie";
#elif L==9 // pt
"Criar quest&atilde;o";
"Criar pergunta";
#endif
const char *Txt_Create_record_field =
@ -9245,7 +9245,28 @@ const char *Txt_Do_you_really_want_to_remove_the_question_X = // Warning: it is
#elif L==8 // pl
"Czy na pewno chcesz usunac pytanie <strong>%ld</strong>?";
#elif L==9 // pt
"Voc&ecirc; realmente deseja remover a quest&atilde;o <strong>%ld</strong>?";
"Voc&ecirc; realmente deseja remover a pergunta <strong>%ld</strong>?";
#endif
const char *Txt_Do_you_really_want_to_remove_the_selected_questions =
#if L==1 // ca
"Realment voleu eliminar les preguntes seleccionades?";
#elif L==2 // de
"Wollen Sie die ausgew&auml;hlten Fragen wirklich entfernen?";
#elif L==3 // en
"Do you really want to remove the selected questions?";
#elif L==4 // es
"&iquest;Realmente desea eliminar las preguntas seleccionadas?";
#elif L==5 // fr
"Voulez-vous vraiment supprimer les questions s&eacute;lectionn&eacute;es?";
#elif L==6 // gn
"&iquest;Realmente desea eliminar las preguntas seleccionadas?"; // Okoteve traducción
#elif L==7 // it
"Vuoi realmente rimuovere le domande selezionate?";
#elif L==8 // pl
"Czy na pewno chcesz usun&aogon;&cacute; wybrane pytania?";
#elif L==9 // pt
"Voc&ecirc; realmente deseja remover as perguntas selecionadas?";
#endif
const char *Txt_Do_you_really_want_to_remove_the_survey_X = // Warning: it is very important to include %s in the following sentences
@ -11578,7 +11599,7 @@ const char *Txt_Existing_question =
#elif L==8 // pl
"Istniej&aogon;ca pytanie";
#elif L==9 // pt
"Quest&atilde;o existente";
"Pergunta existente";
#endif
const char *Txt_Expand =
@ -11604,9 +11625,9 @@ const char *Txt_Expand =
const char *Txt_Export_questions =
#if L==1 // ca
"Exportar preguntas"; // Necessita traduccio
"Exporta preguntes";
#elif L==2 // de
"Export questions"; // Need Übersetzung
"Fragen exportieren";
#elif L==3 // en
"Export questions";
#elif L==4 // es
@ -11616,9 +11637,9 @@ const char *Txt_Export_questions =
#elif L==6 // gn
"Exportar preguntas"; // Okoteve traducción
#elif L==7 // it
"Export questions"; // Bisogno di traduzione
"Esportare domande";
#elif L==8 // pl
"Export questions"; // Potrzebujesz tlumaczenie
"Eksportuj pytania";
#elif L==9 // pt
"Exportar perguntas";
#endif
@ -17775,7 +17796,7 @@ const char *Txt_List_edit_questions =
#elif L==8 // pl
"Wy&sacute;wietli&cacute; / edytowa&cacute; pytania";
#elif L==9 // pt
"Listar / editar quest&otilde;es";
"Listar / editar perguntas";
#endif
const char *Txt_List_of_detailed_clicks =
@ -22903,7 +22924,7 @@ const char *Txt_Minimum_time_seconds_per_question_between_two_tests =
#elif L==8 // pl
"Minimalny czas (w sekundach)<br />na pytanie miedzy<br />dwoma badaniami";
#elif L==9 // pt
"Tempo m&iacute;nimo (segundos)<br />por quest&atilde;o<br />entre dois testes";
"Tempo m&iacute;nimo (segundos)<br />por pergunta<br />entre dois testes";
#endif
const char *Txt_minute =
@ -24880,7 +24901,7 @@ const char *Txt_New_question =
#elif L==8 // pl
"Nowe pytanie";
#elif L==9 // pt
"Nova quest&atilde;o";
"Nova pergunta";
#endif
const char *Txt_New_record_field =
@ -26053,7 +26074,7 @@ const char *Txt_No_of_questions =
#elif L==8 // pl
"Liczba pyta&nacute;";
#elif L==9 // pt
"N&ordm; de quest&otilde;es";
"N&ordm; de perguntas";
#endif
const char *Txt_No_of_threads =
@ -26200,7 +26221,7 @@ const char *Txt_No_questions_found_matching_your_search_criteria =
#elif L==8 // pl
"Brak pyta&nacute; spelniajacych zadane kryteria wyszukiwania.";
#elif L==9 // pt
"N&atilde;o quest&otilde;es com os seus crit&eacute;rios de pesquisa selecionados.";
"N&atilde;o perguntas com os seus crit&eacute;rios de pesquisa selecionados.";
#endif
const char *Txt_No_questions_have_been_added =
@ -26347,7 +26368,7 @@ const char *Txt_No_test_questions =
#elif L==8 // pl
"Brak pyta&nacute; testowych.";
#elif L==9 // pt
"N&atilde;o existem quest&otilde;es de test.";
"N&atilde;o existem perguntas de test.";
#endif
const char *Txt_No_user_has_been_eliminated =
@ -26716,7 +26737,7 @@ const char *Txt_Non_blank_BR_questions =
#elif L==8 // pl
"Niepustych<br />pytania";
#elif L==9 // pt
"Quest&otilde;es<br />respondidas";
"Perguntas<br />respondidas";
#endif
const char *Txt_Not_applicable =
@ -28183,7 +28204,7 @@ const char *Txt_Number_of_BR_courses_with_BR_exportable_BR_test_BR_questions =
#elif L==8 // pl
"Liczba<br />kurs&oacute;w<br />z eksportowane<br />pyta&nacute;<br />testowych";
#elif L==9 // pt
"N&ordm; de<br />disciplinas<br />com<br />quest&otilde;es<br />de test<br />export&aacute;veis";
"N&ordm; de<br />disciplinas<br />com<br />perguntas<br />de test<br />export&aacute;veis";
#endif
const char *Txt_Number_of_BR_courses_with_BR_games =
@ -28267,7 +28288,7 @@ const char *Txt_Number_of_BR_courses_BR_with_test_BR_questions =
#elif L==8 // pl
"Liczba<br />kurs&oacute;w<br />z pyta&nacute;<br />testowych";
#elif L==9 // pt
"N&ordm; de<br />disciplinas<br />com<br />quest&otilde;es<br />de test";
"N&ordm; de<br />disciplinas<br />com<br />perguntas<br />de test";
#endif
const char *Txt_Number_of_BR_courses_with_BR_surveys =
@ -28456,7 +28477,7 @@ const char *Txt_Number_BR_of_test_BR_questions =
#elif L==8 // pl
"Liczba<br />pyta&nacute;<br />testowych";
#elif L==9 // pt
"N&ordm; de<br />quest&otilde;es<br />de test";
"N&ordm; de<br />perguntas<br />de test";
#endif
const char *Txt_Number_of_users =
@ -31944,7 +31965,7 @@ const char *Txt_Question =
#elif L==8 // pl
"Pytanie";
#elif L==9 // pt
"Quest&atilde;o";
"Pergunta";
#endif
const char *Txt_Question_code_X = // Warning: it is very important to include %ld in the following sentences
@ -31965,7 +31986,7 @@ const char *Txt_Question_code_X = // Warning: it is very important to include %l
#elif L==8 // pl
"Kodeks pytanie %ld";
#elif L==9 // pt
"Quest&atilde;o com c&oacute;digo %ld";
"Pergunta com c&oacute;digo %ld";
#endif
const char *Txt_Question_modified =
@ -31986,7 +32007,7 @@ const char *Txt_Question_modified =
#elif L==8 // pl
"Pytanie zmodyfikowane.";
#elif L==9 // pt
"Quest&atilde;o modificada.";
"Pergunta modificada.";
#endif
const char *Txt_Question_removed =
@ -32007,7 +32028,7 @@ const char *Txt_Question_removed =
#elif L==8 // pl
"Pytanie usuniete.";
#elif L==9 // pt
"Quest&atilde;o removioda.";
"Pergunta removida.";
#endif
const char *Txt_Questions =
@ -32028,7 +32049,7 @@ const char *Txt_Questions =
#elif L==8 // pl
"Pyta&nacute;";
#elif L==9 // pt
"Quest&otilde;es";
"Perguntas";
#endif
const char *Txt_Questions_and_problems =
@ -32049,7 +32070,28 @@ const char *Txt_Questions_and_problems =
#elif L==8 // pl
"Pytania i problemy";
#elif L==9 // pt
"Quest&otilde;es e problemas";
"Perguntas e problemas";
#endif
const char *Txt_Questions_removed_X = // Warning: it is very important to include %u in the following sentences
#if L==1 // ca
"Preguntas eliminadas: %u.";
#elif L==2 // de
"Fragen entfernt: %u.";
#elif L==3 // en
"Questions removed: %u.";
#elif L==4 // es
"Preguntas eliminadas: %u.";
#elif L==5 // fr
"Questions supprim&eacute;es: %u.";
#elif L==6 // gn
"Preguntas eliminadas: %u."; // Okoteve traducción
#elif L==7 // it
"Domande rimosse: %u.";
#elif L==8 // pl
"Pytania usuniete: %u.";
#elif L==9 // pt
"Perguntas removidas: %u.";
#endif
const char *Txt_Quota_exceeded =
@ -33394,7 +33436,7 @@ const char *Txt_Remove_question =
#if L==1 // ca
"Eliminar pregunta";
#elif L==2 // de
"Entfernen Frage";
"Frage entfernen";
#elif L==3 // en
"Remove question";
#elif L==4 // es
@ -33408,7 +33450,28 @@ const char *Txt_Remove_question =
#elif L==8 // pl
"Usu&nacute; pytanie";
#elif L==9 // pt
"Remover quest&atilde;o";
"Remover pergunta";
#endif
const char *Txt_Remove_questions =
#if L==1 // ca
"Eliminar preguntas";
#elif L==2 // de
"Fragen entfernen";
#elif L==3 // en
"Remove questions";
#elif L==4 // es
"Eliminar preguntas";
#elif L==5 // fr
"Supprimer questions";
#elif L==6 // gn
"Eliminar preguntas"; // Okoteve traducción
#elif L==7 // it
"Rimuovere domande";
#elif L==8 // pl
"Usu&nacute; pytania";
#elif L==9 // pt
"Remover perguntas";
#endif
const char *Txt_Remove_record_field =
@ -39158,7 +39221,7 @@ const char *Txt_Select_questions =
#elif L==8 // pl
"Wybierz pytania";
#elif L==9 // pt
"Selecionar quest&otilde;es";
"Selecionar perguntas";
#endif
const char *Txt_Select_the_groups_in_from_which_you_want_to_register_remove_users_ =
@ -40313,7 +40376,7 @@ const char *Txt_Show_questions =
#elif L==8 // pl
"Show questions"; // Potrzebujesz tlumaczenie
#elif L==9 // pt
"Mostrar quest&otilde;es";
"Mostrar perguntas";
#endif
const char *Txt_Show_statistic =
@ -47712,7 +47775,7 @@ const char *Txt_The_question_has_been_moved_down =
#elif L==8 // pl
"Pytanie zosta&lstrok;o przeniesione.";
#elif L==9 // pt
"A quest&atilde;o foi movida para baixo.";
"A pergunta foi movida para baixo.";
#endif
const char *Txt_The_question_has_been_moved_up =
@ -47733,7 +47796,7 @@ const char *Txt_The_question_has_been_moved_up =
#elif L==8 // pl
"Pytanie zosta&lstrok;o poruszone.";
#elif L==9 // pt
"A quest&atilde;o foi movida para cima.";
"A pergunta foi movida para cima.";
#endif
const char *Txt_The_record_field_X_already_exists = // Warning: it is very important to include %s in the following sentences
@ -51578,7 +51641,7 @@ const char *Txt_TST_STR_ORDER_FULL[Tst_NUM_TYPES_ORDER_QST] =
#elif L==8 // pl
"Sort by stem of the question" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"Classificar por formula&ccedil;&atilde;o da quest&atilde;o"
"Classificar por formula&ccedil;&atilde;o da pergunta"
#endif
,
[Tst_ORDER_NUM_HITS] =
@ -51599,7 +51662,7 @@ const char *Txt_TST_STR_ORDER_FULL[Tst_NUM_TYPES_ORDER_QST] =
#elif L==8 // pl
"Sort by number of times the question has been answered" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"Classificar por n&ordm; de vezes que a quest&atilde;o foi respondida"
"Classificar por n&ordm; de vezes que a pergunta foi respondida"
#endif
,
[Tst_ORDER_AVERAGE_SCORE] =
@ -51650,7 +51713,7 @@ const char *Txt_TST_STR_ORDER_FULL[Tst_NUM_TYPES_ORDER_QST] =
" has been answered (excluding blank answers)" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"Classificar por n&ordm; de vezes"
" que a quest&atilde;o foi respondida (n&atilde;o em branco)"
" que a pergunta foi respondida (n&atilde;o em branco)"
#endif
,
[Tst_ORDER_AVERAGE_SCORE_NOT_BLANK] =
@ -51695,7 +51758,7 @@ const char *Txt_TST_STR_ORDER_SHORT[Tst_NUM_TYPES_ORDER_QST] =
#elif L==8 // pl
"Pytanie"
#elif L==9 // pt
"Quest&atilde;o"
"Pergunta"
#endif
,
[Tst_ORDER_NUM_HITS] =

View File

@ -9512,15 +9512,15 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"" // Precisa de tradução
#endif
,
[ActReqRemTstQst] =
[ActReqRemSevTstQst] =
#if L==1 // ca
"" // Necessita traducció
#elif L==2 // de
"" // Need Übersetzung
#elif L==3 // en
"Request removing a self-assesment test question"
"Request removing several test questions"
#elif L==4 // es
""
"Solicitar eliminaci&oacute;n de varias preguntas de test"
#elif L==5 // fr
"" // Besoin de traduction
#elif L==6 // gn
@ -9533,15 +9533,15 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"" // Precisa de tradução
#endif
,
[ActRemTstQst] =
[ActRemSevTstQst] =
#if L==1 // ca
"" // Necessita traducció
#elif L==2 // de
"" // Need Übersetzung
#elif L==3 // en
"Remove a self-assesment test question"
"Remove several test questions"
#elif L==4 // es
""
"Eliminar varias preguntas de test"
#elif L==5 // fr
"" // Besoin de traduction
#elif L==6 // gn
@ -9554,7 +9554,49 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"" // Precisa de tradução
#endif
,
[ActShfTstQst] =
[ActReqRemOneTstQst] =
#if L==1 // ca
"" // Necessita traducció
#elif L==2 // de
"" // Need Übersetzung
#elif L==3 // en
"Request removing one test question"
#elif L==4 // es
"Solicitar eliminaci&oacute;n de una pregunta de test"
#elif L==5 // fr
"" // Besoin de traduction
#elif L==6 // gn
"" // Okoteve traducción
#elif L==7 // it
"" // Bisogno di traduzione
#elif L==8 // pl
"" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"" // Precisa de tradução
#endif
,
[ActRemOneTstQst] =
#if L==1 // ca
"" // Necessita traducció
#elif L==2 // de
"" // Need Übersetzung
#elif L==3 // en
"Remove a test question"
#elif L==4 // es
"Eliminar una pregunta de test"
#elif L==5 // fr
"" // Besoin de traduction
#elif L==6 // gn
"" // Okoteve traducción
#elif L==7 // it
"" // Bisogno di traduzione
#elif L==8 // pl
"" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"" // Precisa de tradução
#endif
,
[ActChgShfTstQst] =
#if L==1 // ca
"" // Necessita traducció
#elif L==2 // de

View File

@ -2474,7 +2474,7 @@ static long TL_ReceivePost (void)
Content.Media.Width = TL_IMAGE_SAVED_MAX_WIDTH;
Content.Media.Height = TL_IMAGE_SAVED_MAX_HEIGHT;
Content.Media.Quality = TL_IMAGE_SAVED_QUALITY;
Med_GetMediaFromForm (-1,&Content.Media,NULL,NULL);
Med_GetMediaFromForm (-1L,-1L,-1,&Content.Media,NULL,NULL);
Ale_ShowAlerts (NULL);
if (Content.Txt[0] || // Text not empty
@ -3405,7 +3405,7 @@ static long TL_ReceiveComment (void)
Content.Media.Width = TL_IMAGE_SAVED_MAX_WIDTH;
Content.Media.Height = TL_IMAGE_SAVED_MAX_HEIGHT;
Content.Media.Quality = TL_IMAGE_SAVED_QUALITY;
Med_GetMediaFromForm (-1,&Content.Media,NULL,NULL);
Med_GetMediaFromForm (-1L,-1L,-1,&Content.Media,NULL,NULL);
Ale_ShowAlerts (NULL);
if (Content.Txt[0] || // Text not empty