diff --git a/Makefile b/Makefile index fd9f9cf6f..ec0d8e6c8 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ OBJS = swad_account.o swad_action.o swad_agenda.o swad_alert.o \ swad_database.o swad_date.o swad_degree.o swad_degree_config.o \ swad_degree_type.o swad_department.o swad_duplicate.o \ swad_enrolment.o swad_exam.o swad_exam_announcement.o \ - swad_exam_event.o swad_exam_result.o swad_exam_set.o \ + swad_exam_event.o swad_exam_print.o swad_exam_result.o swad_exam_set.o \ swad_figure.o swad_figure_cache.o swad_file.o swad_file_browser.o \ swad_file_extension.o swad_file_MIME.o swad_firewall.o swad_follow.o \ swad_form.o swad_forum.o \ diff --git a/sql/swad.sql b/sql/swad.sql index 49e4ce88e..1a8b6e101 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -549,7 +549,7 @@ CREATE TABLE IF NOT EXISTS exa_sets ( SetCod INT NOT NULL AUTO_INCREMENT, ExaCod INT NOT NULL, SetInd INT NOT NULL, - NumQstsToExam INT NOT NULL DEFAULT 0, + NumQstsToPrint INT NOT NULL DEFAULT 0, Title VARCHAR(2047) NOT NULL, UNIQUE INDEX(SetCod), UNIQUE INDEX(ExaCod,SetInd)); diff --git a/swad_action.c b/swad_action.c index d3ce9f213..bb4b9c8bb 100644 --- a/swad_action.c +++ b/swad_action.c @@ -49,6 +49,7 @@ #include "swad_exam.h" #include "swad_exam_announcement.h" #include "swad_exam_event.h" +#include "swad_exam_print.h" #include "swad_exam_result.h" #include "swad_exam_set.h" #include "swad_enrolment.h" @@ -739,6 +740,8 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActReqRemSetQst ] = {1888,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaSet_RequestRemoveQstFromSet ,NULL}, [ActRemExaQst ] = {1889,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaSet_RemoveQstFromSet ,NULL}, + [ActSeeExaPrn ] = {1904,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaPrn_ShowNewExamPrint ,NULL}, + [ActSeeGam ] = {1650,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_SeeOneGame ,NULL}, [ActReqRemMch ] = {1783,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mch_RequestRemoveMatch ,NULL}, @@ -3720,6 +3723,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un ActShoExaEvt, // #1901 ActEdiOneExaEvt, // #1902 ActChgExaEvt, // #1903 + ActSeeExaPrn, // #1904 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index c0f92b0fd..48cb5a201 100644 --- a/swad_action.h +++ b/swad_action.h @@ -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 1903 +#define Act_MAX_ACTION_COD 1904 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 @@ -704,81 +704,83 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to #define ActReqRemSetQst (ActChgCrsTT1stDay + 174) #define ActRemExaQst (ActChgCrsTT1stDay + 175) -#define ActSeeGam (ActChgCrsTT1stDay + 176) -#define ActReqRemMch (ActChgCrsTT1stDay + 177) -#define ActRemMch (ActChgCrsTT1stDay + 178) -#define ActReqNewMch (ActChgCrsTT1stDay + 179) -#define ActNewMch (ActChgCrsTT1stDay + 180) -#define ActResMch (ActChgCrsTT1stDay + 181) -#define ActBckMch (ActChgCrsTT1stDay + 182) -#define ActPlyPauMch (ActChgCrsTT1stDay + 183) -#define ActFwdMch (ActChgCrsTT1stDay + 184) -#define ActChgNumColMch (ActChgCrsTT1stDay + 185) -#define ActChgVisResMchQst (ActChgCrsTT1stDay + 186) -#define ActMchCntDwn (ActChgCrsTT1stDay + 187) -#define ActRefMchTch (ActChgCrsTT1stDay + 188) +#define ActSeeExaPrn (ActChgCrsTT1stDay + 176) -#define ActJoiMch (ActChgCrsTT1stDay + 189) -#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 190) -#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 191) -#define ActAnsMchQstStd (ActChgCrsTT1stDay + 192) -#define ActRefMchStd (ActChgCrsTT1stDay + 193) +#define ActSeeGam (ActChgCrsTT1stDay + 177) +#define ActReqRemMch (ActChgCrsTT1stDay + 178) +#define ActRemMch (ActChgCrsTT1stDay + 179) +#define ActReqNewMch (ActChgCrsTT1stDay + 180) +#define ActNewMch (ActChgCrsTT1stDay + 181) +#define ActResMch (ActChgCrsTT1stDay + 182) +#define ActBckMch (ActChgCrsTT1stDay + 183) +#define ActPlyPauMch (ActChgCrsTT1stDay + 184) +#define ActFwdMch (ActChgCrsTT1stDay + 185) +#define ActChgNumColMch (ActChgCrsTT1stDay + 186) +#define ActChgVisResMchQst (ActChgCrsTT1stDay + 187) +#define ActMchCntDwn (ActChgCrsTT1stDay + 188) +#define ActRefMchTch (ActChgCrsTT1stDay + 189) -#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 194) -#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 195) -#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 196) -#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 197) +#define ActJoiMch (ActChgCrsTT1stDay + 190) +#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 191) +#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 192) +#define ActAnsMchQstStd (ActChgCrsTT1stDay + 193) +#define ActRefMchStd (ActChgCrsTT1stDay + 194) -#define ActReqSeeAllMchRes (ActChgCrsTT1stDay + 198) -#define ActSeeAllMchResCrs (ActChgCrsTT1stDay + 199) -#define ActSeeAllMchResGam (ActChgCrsTT1stDay + 200) -#define ActSeeAllMchResMch (ActChgCrsTT1stDay + 201) -#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 202) +#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 195) +#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 196) +#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 197) +#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 198) -#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 203) +#define ActReqSeeAllMchRes (ActChgCrsTT1stDay + 199) +#define ActSeeAllMchResCrs (ActChgCrsTT1stDay + 200) +#define ActSeeAllMchResGam (ActChgCrsTT1stDay + 201) +#define ActSeeAllMchResMch (ActChgCrsTT1stDay + 202) +#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 203) -#define ActFrmNewGam (ActChgCrsTT1stDay + 204) -#define ActEdiOneGam (ActChgCrsTT1stDay + 205) -#define ActNewGam (ActChgCrsTT1stDay + 206) -#define ActChgGam (ActChgCrsTT1stDay + 207) -#define ActReqRemGam (ActChgCrsTT1stDay + 208) -#define ActRemGam (ActChgCrsTT1stDay + 209) -#define ActHidGam (ActChgCrsTT1stDay + 210) -#define ActShoGam (ActChgCrsTT1stDay + 211) -#define ActAddOneGamQst (ActChgCrsTT1stDay + 212) -#define ActGamLstTstQst (ActChgCrsTT1stDay + 213) -#define ActAddTstQstToGam (ActChgCrsTT1stDay + 214) -#define ActReqRemGamQst (ActChgCrsTT1stDay + 215) -#define ActRemGamQst (ActChgCrsTT1stDay + 216) -#define ActUp_GamQst (ActChgCrsTT1stDay + 217) -#define ActDwnGamQst (ActChgCrsTT1stDay + 218) +#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 204) -#define ActSeeSvy (ActChgCrsTT1stDay + 219) -#define ActAnsSvy (ActChgCrsTT1stDay + 220) -#define ActFrmNewSvy (ActChgCrsTT1stDay + 221) -#define ActEdiOneSvy (ActChgCrsTT1stDay + 222) -#define ActNewSvy (ActChgCrsTT1stDay + 223) -#define ActChgSvy (ActChgCrsTT1stDay + 224) -#define ActReqRemSvy (ActChgCrsTT1stDay + 225) -#define ActRemSvy (ActChgCrsTT1stDay + 226) -#define ActReqRstSvy (ActChgCrsTT1stDay + 227) -#define ActRstSvy (ActChgCrsTT1stDay + 228) -#define ActHidSvy (ActChgCrsTT1stDay + 229) -#define ActShoSvy (ActChgCrsTT1stDay + 230) -#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 231) -#define ActRcvSvyQst (ActChgCrsTT1stDay + 232) -#define ActReqRemSvyQst (ActChgCrsTT1stDay + 233) -#define ActRemSvyQst (ActChgCrsTT1stDay + 234) +#define ActFrmNewGam (ActChgCrsTT1stDay + 205) +#define ActEdiOneGam (ActChgCrsTT1stDay + 206) +#define ActNewGam (ActChgCrsTT1stDay + 207) +#define ActChgGam (ActChgCrsTT1stDay + 208) +#define ActReqRemGam (ActChgCrsTT1stDay + 209) +#define ActRemGam (ActChgCrsTT1stDay + 210) +#define ActHidGam (ActChgCrsTT1stDay + 211) +#define ActShoGam (ActChgCrsTT1stDay + 212) +#define ActAddOneGamQst (ActChgCrsTT1stDay + 213) +#define ActGamLstTstQst (ActChgCrsTT1stDay + 214) +#define ActAddTstQstToGam (ActChgCrsTT1stDay + 215) +#define ActReqRemGamQst (ActChgCrsTT1stDay + 216) +#define ActRemGamQst (ActChgCrsTT1stDay + 217) +#define ActUp_GamQst (ActChgCrsTT1stDay + 218) +#define ActDwnGamQst (ActChgCrsTT1stDay + 219) -#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 235) -#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 236) -#define ActEdiExaAnn (ActChgCrsTT1stDay + 237) -#define ActRcvExaAnn (ActChgCrsTT1stDay + 238) -#define ActPrnExaAnn (ActChgCrsTT1stDay + 239) -#define ActReqRemExaAnn (ActChgCrsTT1stDay + 240) -#define ActRemExaAnn (ActChgCrsTT1stDay + 241) -#define ActHidExaAnn (ActChgCrsTT1stDay + 242) -#define ActShoExaAnn (ActChgCrsTT1stDay + 243) +#define ActSeeSvy (ActChgCrsTT1stDay + 220) +#define ActAnsSvy (ActChgCrsTT1stDay + 221) +#define ActFrmNewSvy (ActChgCrsTT1stDay + 222) +#define ActEdiOneSvy (ActChgCrsTT1stDay + 223) +#define ActNewSvy (ActChgCrsTT1stDay + 224) +#define ActChgSvy (ActChgCrsTT1stDay + 225) +#define ActReqRemSvy (ActChgCrsTT1stDay + 226) +#define ActRemSvy (ActChgCrsTT1stDay + 227) +#define ActReqRstSvy (ActChgCrsTT1stDay + 228) +#define ActRstSvy (ActChgCrsTT1stDay + 229) +#define ActHidSvy (ActChgCrsTT1stDay + 230) +#define ActShoSvy (ActChgCrsTT1stDay + 231) +#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 232) +#define ActRcvSvyQst (ActChgCrsTT1stDay + 233) +#define ActReqRemSvyQst (ActChgCrsTT1stDay + 234) +#define ActRemSvyQst (ActChgCrsTT1stDay + 235) + +#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 236) +#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 237) +#define ActEdiExaAnn (ActChgCrsTT1stDay + 238) +#define ActRcvExaAnn (ActChgCrsTT1stDay + 239) +#define ActPrnExaAnn (ActChgCrsTT1stDay + 240) +#define ActReqRemExaAnn (ActChgCrsTT1stDay + 241) +#define ActRemExaAnn (ActChgCrsTT1stDay + 242) +#define ActHidExaAnn (ActChgCrsTT1stDay + 243) +#define ActShoExaAnn (ActChgCrsTT1stDay + 244) /*****************************************************************************/ /******************************** Files tab **********************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 167b22009..62af05110 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -548,10 +548,14 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.215 (2020-05-07)" +#define Log_PLATFORM_VERSION "SWAD 19.216 (2020-05-07)" #define CSS_FILE "swad19.193.1.css" #define JS_FILE "swad19.193.1.js" /* + Version 19.216: May 07, 2020 New module exam_print to generate new exam prints. (301949 lines) + 1 change necessary in database: +ALTER TABLE exa_sets CHANGE COLUMN NumQstsToExam NumQstsToPrint INT NOT NULL DEFAULT 0; + Version 19.215: May 07, 2020 New module exam_set for set of questions. (301695 lines) Version 19.214.1: May 07, 2020 Change color of dates on current exam event. (301597 lines) Version 19.214: May 06, 2020 New API function getLocations. (301568 lines) diff --git a/swad_database.c b/swad_database.c index 29be70382..4df25a9e3 100644 --- a/swad_database.c +++ b/swad_database.c @@ -1204,22 +1204,22 @@ mysql> DESCRIBE exa_results; /***** Table exa_sets *****/ /* mysql> DESCRIBE exa_sets; -+---------------+---------------+------+-----+---------+----------------+ -| Field | Type | Null | Key | Default | Extra | -+---------------+---------------+------+-----+---------+----------------+ -| SetCod | int(11) | NO | PRI | NULL | auto_increment | -| ExaCod | int(11) | NO | | NULL | | -| SetInd | int(11) | NO | | NULL | | -| NumQstsToExam | int(11) | NO | | 0 | | -| Title | varchar(2047) | NO | | NULL | | -+---------------+---------------+------+-----+---------+----------------+ ++----------------+---------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++----------------+---------------+------+-----+---------+----------------+ +| SetCod | int(11) | NO | PRI | NULL | auto_increment | +| ExaCod | int(11) | NO | | NULL | | +| SetInd | int(11) | NO | | NULL | | +| NumQstsToPrint | int(11) | NO | | 0 | | +| Title | varchar(2047) | NO | | NULL | | ++----------------+---------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_sets (" "SetCod INT NOT NULL AUTO_INCREMENT," "ExaCod INT NOT NULL," "SetInd INT NOT NULL," - "NumQstsToExam INT NOT NULL DEFAULT 0," + "NumQstsToPrint INT NOT NULL DEFAULT 0," "Title VARCHAR(2047) NOT NULL," // ExaSet_MAX_BYTES_TITLE "UNIQUE INDEX(SetCod)," "UNIQUE INDEX(ExaCod,SetInd))"); diff --git a/swad_exam_event.c b/swad_exam_event.c index 9713f7648..6e0ffedfb 100644 --- a/swad_exam_event.c +++ b/swad_exam_event.c @@ -121,7 +121,8 @@ static void ExaEvt_ListOneOrMoreEventsIcons (struct Exa_Exams *Exams, const char *Anchor); static void ExaEvt_ListOneOrMoreEventsAuthor (const struct ExaEvt_Event *Event); static void ExaEvt_ListOneOrMoreEventsTimes (const struct ExaEvt_Event *Event,unsigned UniqueId); -static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Event, +static void ExaEvt_ListOneOrMoreEventsTitleGrps (struct Exa_Exams *Exams, + const struct ExaEvt_Event *Event, const char *Anchor); static void ExaEvt_GetAndWriteNamesOfGrpsAssociatedToEvent (const struct ExaEvt_Event *Event); static void ExaEvt_ListOneOrMoreEventsNumParticipants (const struct ExaEvt_Event *Event); @@ -550,7 +551,7 @@ static void ExaEvt_ListOneOrMoreEvents (struct Exa_Exams *Exams, ExaEvt_ListOneOrMoreEventsTimes (&Event,UniqueId); /* Title and groups */ - ExaEvt_ListOneOrMoreEventsTitleGrps (&Event,Anchor); + ExaEvt_ListOneOrMoreEventsTitleGrps (Exams,&Event,Anchor); /* Number of participants who have answered any question in the exam event */ ExaEvt_ListOneOrMoreEventsNumParticipants (&Event); @@ -734,7 +735,8 @@ static void ExaEvt_ListOneOrMoreEventsTimes (const struct ExaEvt_Event *Event,un /*************** Put a column for exam event title and grous *****************/ /*****************************************************************************/ -static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Event, +static void ExaEvt_ListOneOrMoreEventsTitleGrps (struct Exa_Exams *Exams, + const struct ExaEvt_Event *Event, const char *Anchor) { extern const char *Txt_Play; @@ -744,8 +746,8 @@ static void ExaEvt_ListOneOrMoreEventsTitleGrps (const struct ExaEvt_Event *Even /***** Event title *****/ HTM_ARTICLE_Begin (Anchor); - Frm_StartForm (Gbl.Usrs.Me.Role.Logged == Rol_STD ? ActJoiExaEvt : - ActResExaEvt); + Frm_StartForm (ActSeeExaPrn); + Exa_PutParams (Exams); ExaEvt_PutParamEvtCod (Event->EvtCod); HTM_BUTTON_SUBMIT_Begin (Gbl.Usrs.Me.Role.Logged == Rol_STD ? Txt_Play : Txt_Resume, diff --git a/swad_exam_set.c b/swad_exam_set.c index 63e5e1030..b6c8af417 100644 --- a/swad_exam_set.c +++ b/swad_exam_set.c @@ -96,7 +96,7 @@ static void ExaSet_UpdateSet (const struct ExaSet_Set *Set); static void ExaSet_UpdateSetTitleDB (const struct ExaSet_Set *Set, const char NewTitle[ExaSet_MAX_BYTES_TITLE + 1]); static void ExaSet_UpdateNumQstsToExamDB (const struct ExaSet_Set *Set, - unsigned NumQstsToExam); + unsigned NumQstsToPrint); static void ExaSet_PutParamSetCod (long SetCod); @@ -202,7 +202,7 @@ void ExaSet_GetDataOfSetByCod (struct ExaSet_Set *Set) if (DB_QuerySELECT (&mysql_res,"can not get set data", "SELECT SetCod," // row[0] "SetInd," // row[1] - "NumQstsToExam," // row[2] + "NumQstsToPrint," // row[2] "Title" // row[3] " FROM exa_sets" " WHERE SetCod=%ld" @@ -214,7 +214,7 @@ void ExaSet_GetDataOfSetByCod (struct ExaSet_Set *Set) /* row[0] SetCod row[1] SetInd - row[2] NumQstsToExam + row[2] NumQstsToPrint row[3] Title */ /* Get set code (row[0]) */ @@ -227,7 +227,7 @@ void ExaSet_GetDataOfSetByCod (struct ExaSet_Set *Set) Set->SetInd); /* Get set index (row[2]) */ - Set->NumQstsToExam = Str_ConvertStrToUnsigned (row[2]); + Set->NumQstsToPrint = Str_ConvertStrToUnsigned (row[2]); /* Get the title of the set (row[3]) */ Str_Copy (Set->Title,row[3], @@ -314,7 +314,7 @@ static void ExaSet_PutFormNewSet (struct Exa_Exams *Exams, /***** Number of questions to appear in the exam *****/ HTM_TD_Begin ("class=\"RM\""); - HTM_INPUT_LONG ("NumQstsToExam",0,UINT_MAX,(long) Set->NumQstsToExam, + HTM_INPUT_LONG ("NumQstsToPrint",0,UINT_MAX,(long) Set->NumQstsToPrint, HTM_DONT_SUBMIT_ON_CHANGE,false, "class=\"INPUT_LONG\" required=\"required\""); HTM_TD_End (); @@ -382,11 +382,11 @@ static void ExaSet_ReceiveSetFieldsFromForm (struct ExaSet_Set *Set) /***** Get set title *****/ Par_GetParToText ("Title",Set->Title,ExaSet_MAX_BYTES_TITLE); - /***** Get number of questions in set to appear in exam *****/ - Set->NumQstsToExam = (unsigned) Par_GetParToUnsignedLong ("NumQstsToExam", - 0, - UINT_MAX, - 0); + /***** Get number of questions in set to appear in exam print *****/ + Set->NumQstsToPrint = (unsigned) Par_GetParToUnsignedLong ("NumQstsToPrint", + 0, + UINT_MAX, + 0); } static bool ExaSet_CheckSetTitleReceivedFromForm (const struct ExaSet_Set *Set, @@ -485,7 +485,7 @@ void ExaSet_ChangeNumQstsToExam (void) struct Exa_Exams Exams; struct Exa_Exam Exam; struct ExaSet_Set Set; - unsigned NumQstsToExam; + unsigned NumQstsToPrint; /***** Check if I can edit exams *****/ if (!Exa_CheckIfICanEditExams ()) @@ -512,20 +512,20 @@ void ExaSet_ChangeNumQstsToExam (void) ExaSet_GetDataOfSetByCod (&Set); Exams.SetCod = Set.SetCod; - /***** Get number of questions in set to appear in exam *****/ - NumQstsToExam = (unsigned) Par_GetParToUnsignedLong ("NumQstsToExam", - 0, - UINT_MAX, - 0); + /***** Get number of questions in set to appear in exam print *****/ + NumQstsToPrint = (unsigned) Par_GetParToUnsignedLong ("NumQstsToPrint", + 0, + UINT_MAX, + 0); /***** Check if title should be changed *****/ - if (NumQstsToExam != Set.NumQstsToExam) + if (NumQstsToPrint != Set.NumQstsToPrint) { /* Update the table changing old number by new number */ - ExaSet_UpdateNumQstsToExamDB (&Set,NumQstsToExam); + ExaSet_UpdateNumQstsToExamDB (&Set,NumQstsToPrint); /* Update title */ - Set.NumQstsToExam = NumQstsToExam; + Set.NumQstsToPrint = NumQstsToPrint; } /***** Show current exam and its sets *****/ @@ -549,12 +549,12 @@ static void ExaSet_CreateSet (struct ExaSet_Set *Set) Set->SetCod = DB_QueryINSERTandReturnCode ("can not create new set of questions", "INSERT INTO exa_sets" - " (ExaCod,SetInd,NumQstsToExam,Title)" + " (ExaCod,SetInd,NumQstsToPrint,Title)" " VALUES" " (%ld,%u,%u,'%s')", Set->ExaCod, MaxSetInd + 1, - Set->NumQstsToExam, + Set->NumQstsToPrint, Set->Title); /***** Write success message *****/ @@ -575,12 +575,12 @@ static void ExaSet_UpdateSet (const struct ExaSet_Set *Set) "UPDATE exa_sets" " SET ExaCod=%ld," "SetInd=%u," - "NumQstsToExam=%u," + "NumQstsToPrint=%u," "Title='%s'" " WHERE SetCod=%ld", Set->ExaCod, Set->SetInd, - Set->NumQstsToExam, + Set->NumQstsToPrint, Set->Title, Set->SetCod); @@ -605,18 +605,18 @@ static void ExaSet_UpdateSetTitleDB (const struct ExaSet_Set *Set, } /*****************************************************************************/ -/********* Update number of questions to appear in exam in database **********/ +/****** Update number of questions to appear in exam print in database *******/ /*****************************************************************************/ static void ExaSet_UpdateNumQstsToExamDB (const struct ExaSet_Set *Set, - unsigned NumQstsToExam) + unsigned NumQstsToPrint) { /***** Update set of questions changing old number by new number *****/ - DB_QueryUPDATE ("can not update the number of questions to appear in exam", - "UPDATE exa_sets SET NumQstsToExam=%u" + DB_QueryUPDATE ("can not update the number of questions to appear in exam print", + "UPDATE exa_sets SET NumQstsToPrint=%u" " WHERE SetCod=%ld" " AND ExaCod=%ld", // Extra check - NumQstsToExam, + NumQstsToPrint, Set->SetCod,Set->ExaCod); } @@ -644,9 +644,9 @@ unsigned ExaSet_GetNumQstsExam (long ExaCod) MYSQL_ROW row; unsigned NumQsts = 0; - /***** Get total number of questions to appear in exam *****/ - if (!DB_QuerySELECT (&mysql_res,"can not get number of questions in an exam", - "SELECT SUM(NumQstsToExam) FROM exa_sets" + /***** Get total number of questions to appear in exam print *****/ + if (!DB_QuerySELECT (&mysql_res,"can not get number of questions in an exam print", + "SELECT SUM(NumQstsToPrint) FROM exa_sets" " WHERE ExaCod=%ld", ExaCod)) Lay_ShowErrorAndExit ("Error: wrong question index."); @@ -997,7 +997,7 @@ void ExaSet_ListExamSets (struct Exa_Exams *Exams, DB_QuerySELECT (&mysql_res,"can not get sets of questions", "SELECT SetCod," // row[0] "SetInd," // row[1] - "NumQstsToExam," // row[2] + "NumQstsToPrint," // row[2] "Title" // row[3] " FROM exa_sets" " WHERE ExaCod=%ld" @@ -1121,7 +1121,7 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, /* row[0] SetCod row[1] SetInd - row[2] NumQstsToExam + row[2] NumQstsToPrint row[3] Title */ /* Get set code (row[0]) */ @@ -1133,8 +1133,8 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, "%u", Set.SetInd); - /* Get set index (row[2]) */ - Set.NumQstsToExam = Str_ConvertStrToUnsigned (row[2]); + /* Get number of questions to exam (row[2]) */ + Set.NumQstsToPrint = Str_ConvertStrToUnsigned (row[2]); /* Get the title of the set (row[3]) */ Str_Copy (Set.Title,row[3], @@ -1215,11 +1215,11 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, HTM_Unsigned (ExaSet_GetNumQstsInSet (Set.SetCod)); HTM_TD_End (); - /***** Number of questions to appear in exam *****/ + /***** Number of questions to appear in exam print *****/ HTM_TD_Begin ("class=\"RT COLOR%u\"",Gbl.RowEvenOdd); Frm_StartFormAnchor (ActChgNumQstExaSet,Anchor); ExaSet_PutParamsOneSet (Exams); - HTM_INPUT_LONG ("NumQstsToExam",0,UINT_MAX,(long) Set.NumQstsToExam, + HTM_INPUT_LONG ("NumQstsToPrint",0,UINT_MAX,(long) Set.NumQstsToPrint, HTM_SUBMIT_ON_CHANGE,false, "class=\"INPUT_LONG\" required=\"required\""); Frm_EndForm (); @@ -1285,7 +1285,7 @@ void ExaSet_ResetSet (struct ExaSet_Set *Set) Set->SetCod = -1L; Set->SetInd = 0; Set->Title[0] = '\0'; - Set->NumQstsToExam = 0; + Set->NumQstsToPrint = 0; } /*****************************************************************************/ diff --git a/swad_exam_type.h b/swad_exam_type.h index 5844152ac..e29c1e4ff 100644 --- a/swad_exam_type.h +++ b/swad_exam_type.h @@ -81,6 +81,24 @@ struct Exa_Exams long QstCod; // Current question code }; +/* Student 1 + +----------------+ +-----------+ +--------------+ +--------------+ + | Exam 1 |--+--| Event 1 |--+--| Print 1 | | Result 1 | + |+--------------+| | | * Start | | | * Question 2 | | * Question 2 | + || Set 1 || | | * End | | |--------------|-->|--------------| + || * Question 1 || | | * Groups | | | * Question 5 | | * Question 5 | + || * Question 2 || | +-----------+ | | * Question 3 | | * Question 3 | + |+--------------+| | +-----------+ | +--------------+ +--------------+ + |+--------------+| +--| Event 2 | | Student 2 + || Set 2 || | * Start | | +--------------+ +--------------+ + || * Question 3 || | * End | +--| Print 2 | | Result 2 | + || * Question 4 || | * Groups | | * Question 1 | | * Question 1 | + || * Question 5 || +-----------+ |--------------|-->|--------------| + || * Question 6 || ... | * Question 6 | | * Question 6 | + |+--------------+| | * Question 5 | | * Question 5 | + +----------------+ +--------------+ +--------------+ + ... ... */ + struct Exa_Exam { long ExaCod; // Exam code @@ -104,7 +122,8 @@ struct ExaSet_Set long ExaCod; // Exam code long SetCod; // Set code unsigned SetInd; // Set index (position in the exam) - unsigned NumQstsToExam; // Number of questions in this set taht will appear in the exam + unsigned NumQstsToPrint; // Number of questions in this set + // that will appear in each exam print char Title[ExaSet_MAX_BYTES_TITLE + 1]; // Title of the set }; diff --git a/swad_media.h b/swad_media.h index 075eb5cf6..e44272c5e 100644 --- a/swad_media.h +++ b/swad_media.h @@ -27,6 +27,8 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#include // To access MySQL databases + /*****************************************************************************/ /***************************** Public constants ******************************/ /*****************************************************************************/ diff --git a/swad_text_action.c b/swad_text_action.c index e32caaf5d..caccab47d 100644 --- a/swad_text_action.c +++ b/swad_text_action.c @@ -11051,9 +11051,9 @@ const char *Txt_Actions[Act_NUM_ACTIONS] = #elif L==2 // de "" // Need Übersetzung #elif L==3 // en - "Change number of questions in set to appear in exam" + "Change number of questions from set to each exam print" #elif L==4 // es - "Cambiar número de preguntas del conjunto que aparecerán en el examen" + "Cambiar nº de preguntas del conjunto en cada examen impreso" #elif L==5 // fr "" // Besoin de traduction #elif L==6 // gn @@ -11169,6 +11169,27 @@ const char *Txt_Actions[Act_NUM_ACTIONS] = "" // Potrzebujesz tlumaczenie #elif L==9 // pt "" // Precisa de tradução +#endif + , + [ActSeeExaPrn] = +#if L==1 // ca + "" // Necessita traducció +#elif L==2 // de + "" // Need Übersetzung +#elif L==3 // en + "See exam print" +#elif L==4 // es + "Ver impresión de examen" +#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 , [ActSeeGam] =