mirror of https://github.com/acanas/swad-core.git
Version19.8
This commit is contained in:
parent
8d53450993
commit
e727a66f68
12
sql/swad.sql
12
sql/swad.sql
|
@ -658,6 +658,18 @@ CREATE TABLE IF NOT EXISTS mch_players (
|
||||||
TS TIMESTAMP,
|
TS TIMESTAMP,
|
||||||
UNIQUE INDEX(MchCod,UsrCod));
|
UNIQUE INDEX(MchCod,UsrCod));
|
||||||
--
|
--
|
||||||
|
-- Table mch_results: stores the current match results
|
||||||
|
--
|
||||||
|
CREATE TABLE IF NOT EXISTS mch_results (
|
||||||
|
MchResCod INT NOT NULL AUTO_INCREMENT,
|
||||||
|
MchCod INT NOT NULL,
|
||||||
|
UsrCod INT NOT NULL,
|
||||||
|
NumQsts INT NOT NULL DEFAULT 0,
|
||||||
|
NumQstsNotBlank INT NOT NULL DEFAULT 0,
|
||||||
|
Score DOUBLE PRECISION NOT NULL DEFAULT 0,
|
||||||
|
UNIQUE INDEX(MchResCod),
|
||||||
|
UNIQUE INDEX(MchCod,UsrCod));
|
||||||
|
--
|
||||||
-- Table gam_questions: stores the questions in the games
|
-- Table gam_questions: stores the questions in the games
|
||||||
--
|
--
|
||||||
CREATE TABLE IF NOT EXISTS gam_questions (
|
CREATE TABLE IF NOT EXISTS gam_questions (
|
||||||
|
|
|
@ -2149,12 +2149,12 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
||||||
/* ActRenTag */{ 143,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RenameTag ,NULL},
|
/* ActRenTag */{ 143,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RenameTag ,NULL},
|
||||||
/* ActRcvCfgTst */{ 454,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ReceiveConfigTst ,NULL},
|
/* ActRcvCfgTst */{ 454,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ReceiveConfigTst ,NULL},
|
||||||
|
|
||||||
/* ActReqSeeMyTstRes */{1083,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Tst_SelDatesToSeeMyTestResults ,NULL},
|
/* ActReqSeeMyTstRes */{1083,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Tst_SelDatesToSeeMyTstResults ,NULL},
|
||||||
/* ActSeeMyTstRes */{1084,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowMyTestResults ,NULL},
|
/* ActSeeMyTstRes */{1084,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowMyTstResults ,NULL},
|
||||||
/* ActSeeOneTstResMe */{1085,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowOneTestResult ,NULL},
|
/* ActSeeOneTstResMe */{1085,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowOneTstResult ,NULL},
|
||||||
/* ActReqSeeUsrTstRes*/{1080,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Tst_SelUsrsToViewUsrsTstResults,NULL},
|
/* ActReqSeeUsrTstRes*/{1080,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Tst_SelUsrsToViewUsrsTstResults,NULL},
|
||||||
/* ActSeeUsrTstRes */{1081,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowUsrsTestResults ,NULL},
|
/* ActSeeUsrTstRes */{1081,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowUsrsTstResults ,NULL},
|
||||||
/* ActSeeOneTstResOth*/{1082,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowOneTestResult ,NULL},
|
/* ActSeeOneTstResOth*/{1082,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowOneTstResult ,NULL},
|
||||||
|
|
||||||
/* ActSeeGam */{1650,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_SeeOneGame ,NULL},
|
/* ActSeeGam */{1650,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_SeeOneGame ,NULL},
|
||||||
|
|
||||||
|
@ -2175,12 +2175,12 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
|
||||||
/* ActRefMchStd */{1782,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Mch_GetMatchBeingPlayed ,Mch_RefreshMatchStd ,NULL},
|
/* ActRefMchStd */{1782,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Mch_GetMatchBeingPlayed ,Mch_RefreshMatchStd ,NULL},
|
||||||
/* ActAnsMchQstStd */{1651,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_ReceiveQstAnsFromStd ,NULL},
|
/* ActAnsMchQstStd */{1651,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_ReceiveQstAnsFromStd ,NULL},
|
||||||
|
|
||||||
/* ActReqSeeMyMchRes */{1795,-1,TabUnk,ActSeeAllGam ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Tst_SelDatesToSeeMyTestResults ,NULL},
|
/* ActReqSeeMyMchRes */{1795,-1,TabUnk,ActSeeAllGam ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Mch_SelDatesToSeeMyMchResults ,NULL},
|
||||||
/* ActSeeMyMchRes */{1796,-1,TabUnk,ActSeeAllGam ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowMyTestResults ,NULL},
|
/* ActSeeMyMchRes */{1796,-1,TabUnk,ActSeeAllGam ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mch_ShowMyMchResults ,NULL},
|
||||||
/* ActSeeOneMchResMe */{1797,-1,TabUnk,ActSeeAllGam ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowOneTestResult ,NULL},
|
/* ActSeeOneMchResMe */{1797,-1,TabUnk,ActSeeAllGam ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mch_ShowOneMchResult ,NULL},
|
||||||
/* ActReqSeeUsrMchRes*/{1798,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Mch_SelUsrsToViewUsrsMchResults,NULL},
|
/* ActReqSeeUsrMchRes*/{1798,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Mch_SelUsrsToViewUsrsMchResults,NULL},
|
||||||
/* ActSeeUsrMchRes */{1799,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowUsrsTestResults ,NULL},
|
/* ActSeeUsrMchRes */{1799,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mch_ShowUsrsMchResults ,NULL},
|
||||||
/* ActSeeOneMchResOth*/{1800,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowOneTestResult ,NULL},
|
/* ActSeeOneMchResOth*/{1800,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mch_ShowOneMchResult ,NULL},
|
||||||
|
|
||||||
/* ActFrmNewGam */{1652,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestCreatOrEditGame ,NULL},
|
/* ActFrmNewGam */{1652,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestCreatOrEditGame ,NULL},
|
||||||
/* ActEdiOneGam */{1653,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestCreatOrEditGame ,NULL},
|
/* ActEdiOneGam */{1653,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestCreatOrEditGame ,NULL},
|
||||||
|
|
|
@ -441,6 +441,12 @@ Lo de mutear anuncios, en principio prefiero hacer una opci
|
||||||
|
|
||||||
// TODO: Al confirmar una inscripción, mostrar ficha de retroalimentación similar a la que se muestra cuando se crea un administrador. Tal y como está ahora crea confusión al usuario.
|
// TODO: Al confirmar una inscripción, mostrar ficha de retroalimentación similar a la que se muestra cuando se crea un administrador. Tal y como está ahora crea confusión al usuario.
|
||||||
|
|
||||||
|
// TODO: Suggested by Jose Luis Bernier Villamor: "Compartidos" debería inhabilitarse si el profesor lo quiere, porque algunos alumnos suben por error los trabajos
|
||||||
|
// Alternativa. Llamarle "Públicos" o algo así y poner la opción más alejada de Trabajos.
|
||||||
|
// TODO: Suggested by Jose Luis Bernier Villamor: Posibilidad de que los profesores decidan en la configuración
|
||||||
|
// de la asignatura si desean o no que se pueda solicitar
|
||||||
|
// inscripción en la asignatura
|
||||||
|
|
||||||
// TODO: En Eventos de asistencia, poner un icono de enlace a horario de la asignatura ¿y otro a grupos?
|
// TODO: En Eventos de asistencia, poner un icono de enlace a horario de la asignatura ¿y otro a grupos?
|
||||||
// TODO: Reportado por Javier Fernández Baldomero. Un profesor debería poder cambiar la foto de un estudiante confirmado. Sale el icono, pero luego dice ue no hay permiso
|
// TODO: Reportado por Javier Fernández Baldomero. Un profesor debería poder cambiar la foto de un estudiante confirmado. Sale el icono, pero luego dice ue no hay permiso
|
||||||
|
|
||||||
|
@ -462,12 +468,19 @@ 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 19.7.1 (2019-09-18)"
|
#define Log_PLATFORM_VERSION "SWAD 19.8 (2019-09-22)"
|
||||||
#define CSS_FILE "swad19.3.css"
|
#define CSS_FILE "swad19.3.css"
|
||||||
#define JS_FILE "swad18.130.2.js"
|
#define JS_FILE "swad18.130.2.js"
|
||||||
/*
|
/*
|
||||||
Version 19.7.1: Sep 17, 2019 Users' selection to view the matches results. (244768 lines)
|
Version 19.8: Sep 22, 2019 View matches results. Not finished.
|
||||||
Version 19.7: Sep 17, 2019 New actions to view the matches results. (244664 lines)
|
Help links related to test and match results changed. (245412 lines)
|
||||||
|
1 change necessary in database:
|
||||||
|
CREATE TABLE IF NOT EXISTS mch_results (MchResCod INT NOT NULL AUTO_INCREMENT,MchCod INT NOT NULL,UsrCod INT NOT NULL,NumQsts INT NOT NULL DEFAULT 0,NumQstsNotBlank INT NOT NULL DEFAULT 0,Score DOUBLE PRECISION NOT NULL DEFAULT 0,UNIQUE INDEX(MchResCod),UNIQUE INDEX(MchCod,UsrCod));
|
||||||
|
|
||||||
|
Version 19.7.3: Sep 19, 2019 View matches results. Not finished. (244858 lines)
|
||||||
|
Version 19.7.2: Sep 19, 2019 Users' selection to view my matches results. (244789 lines)
|
||||||
|
Version 19.7.1: Sep 18, 2019 Users' selection to view users' matches results. (244768 lines)
|
||||||
|
Version 19.7: Sep 18, 2019 New actions to view the matches results. (244664 lines)
|
||||||
6 changes necessary in database:
|
6 changes necessary in database:
|
||||||
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1795','es','N','Seleccionar fechas para mis result. partidas');
|
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1795','es','N','Seleccionar fechas para mis result. partidas');
|
||||||
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1796','es','N','Ver mis resultados de partidas');
|
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1796','es','N','Ver mis resultados de partidas');
|
||||||
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
// swad_cookies.c: user's preferences about cookies
|
||||||
|
|
||||||
|
/*
|
||||||
|
SWAD (Shared Workspace At a Distance),
|
||||||
|
is a web platform developed at the University of Granada (Spain),
|
||||||
|
and used to support university teaching.
|
||||||
|
|
||||||
|
This file is part of SWAD core.
|
||||||
|
Copyright (C) 1999-2019 Antonio Cañas Vargas
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************************* Headers ***********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include "swad_box.h"
|
||||||
|
#include "swad_cookie.h"
|
||||||
|
#include "swad_database.h"
|
||||||
|
#include "swad_form.h"
|
||||||
|
#include "swad_global.h"
|
||||||
|
#include "swad_layout.h"
|
||||||
|
#include "swad_setting.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************** External global variables from others modules ****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
extern struct Globals Gbl;
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************************** Public constants *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Private constants *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Private prototypes ****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Coo_PutIconsCookies (void);
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************* Edit my preferences on cookies ************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Coo_EditMyPrefsOnCookies (void)
|
||||||
|
{
|
||||||
|
extern const char *Hlp_PROFILE_Settings_cookies;
|
||||||
|
extern const char *Txt_Cookies;
|
||||||
|
extern const char *Txt_Accept_third_party_cookies_to_view_multimedia_content_from_other_websites;
|
||||||
|
|
||||||
|
/***** Start section with preferences about cookies *****/
|
||||||
|
Lay_StartSection (Coo_COOKIES_ID);
|
||||||
|
|
||||||
|
/***** Start box and table *****/
|
||||||
|
Box_StartBoxTable (NULL,Txt_Cookies,Coo_PutIconsCookies,
|
||||||
|
Hlp_PROFILE_Settings_cookies,Box_NOT_CLOSABLE,2);
|
||||||
|
|
||||||
|
/***** Edit my preference about cookies *****/
|
||||||
|
/* Start form */
|
||||||
|
Frm_StartFormAnchor (ActChgCooPrf,Coo_COOKIES_ID);
|
||||||
|
|
||||||
|
/* Start container */
|
||||||
|
fprintf (Gbl.F.Out,"<div class=\"%s\">",
|
||||||
|
(Gbl.Usrs.Me.UsrDat.Prefs.AcceptThirdPartyCookies) ? "DAT_N LIGHT_BLUE" :
|
||||||
|
"DAT");
|
||||||
|
/* Check box */
|
||||||
|
fprintf (Gbl.F.Out,"<label>"
|
||||||
|
"<input type=\"checkbox\""
|
||||||
|
" name=\"cookies\" value=\"Y\"");
|
||||||
|
if (Gbl.Usrs.Me.UsrDat.Prefs.AcceptThirdPartyCookies)
|
||||||
|
fprintf (Gbl.F.Out," checked=\"checked\"");
|
||||||
|
fprintf (Gbl.F.Out," onclick=\"document.getElementById('%s').submit();\" />"
|
||||||
|
"%s"
|
||||||
|
"</label>",
|
||||||
|
Gbl.Form.Id,
|
||||||
|
Txt_Accept_third_party_cookies_to_view_multimedia_content_from_other_websites);
|
||||||
|
|
||||||
|
/* End container */
|
||||||
|
fprintf (Gbl.F.Out,"</div>");
|
||||||
|
|
||||||
|
/***** End table and box *****/
|
||||||
|
Box_EndBoxTable ();
|
||||||
|
|
||||||
|
/***** End section with preferences about cookies *****/
|
||||||
|
Lay_EndSection ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************** Put contextual icons in cookies preference ****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Coo_PutIconsCookies (void)
|
||||||
|
{
|
||||||
|
/***** Put icon to show a figure *****/
|
||||||
|
Gbl.Figures.FigureType = Fig_COOKIES;
|
||||||
|
Fig_PutIconToShowFigure ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************** Change my preference about third party cookies ***************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Coo_ChangeMyPrefsCookies (void)
|
||||||
|
{
|
||||||
|
/***** Get param with preference about third party cookies *****/
|
||||||
|
Gbl.Usrs.Me.UsrDat.Prefs.AcceptThirdPartyCookies = Par_GetParToBool ("cookies");
|
||||||
|
|
||||||
|
/***** Store preference in database *****/
|
||||||
|
if (Gbl.Usrs.Me.Logged)
|
||||||
|
DB_QueryUPDATE ("can not update your preference about cookies",
|
||||||
|
"UPDATE usr_data SET ThirdPartyCookies='%c'"
|
||||||
|
" WHERE UsrCod=%ld",
|
||||||
|
Gbl.Usrs.Me.UsrDat.Prefs.AcceptThirdPartyCookies ? 'Y' :
|
||||||
|
'N',
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
|
||||||
|
/***** Show forms again *****/
|
||||||
|
Set_EditSettings ();
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
// swad_cookie.h: user's preferences about cookies
|
||||||
|
|
||||||
|
#ifndef _SWAD_COO
|
||||||
|
#define _SWAD_COO
|
||||||
|
/*
|
||||||
|
SWAD (Shared Workspace At a Distance in Spanish),
|
||||||
|
is a web platform developed at the University of Granada (Spain),
|
||||||
|
and used to support university teaching.
|
||||||
|
|
||||||
|
This file is part of SWAD core.
|
||||||
|
Copyright (C) 1999-2019 Antonio Cañas Vargas
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************************* Headers ***********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************* Public types and constants ************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define Coo_COOKIES_ID "cookies"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Public prototypes *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Coo_EditMyPrefsOnCookies (void);
|
||||||
|
void Coo_ChangeMyPrefsCookies (void);
|
||||||
|
|
||||||
|
#endif
|
|
@ -1433,6 +1433,31 @@ mysql> DESCRIBE mch_players;
|
||||||
"TS TIMESTAMP,"
|
"TS TIMESTAMP,"
|
||||||
"UNIQUE INDEX(MchCod,UsrCod))");
|
"UNIQUE INDEX(MchCod,UsrCod))");
|
||||||
|
|
||||||
|
/***** Table mch_results *****/
|
||||||
|
/*
|
||||||
|
mysql> DESCRIBE mch_results;
|
||||||
|
+-----------------+---------+------+-----+---------+----------------+
|
||||||
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
|
+-----------------+---------+------+-----+---------+----------------+
|
||||||
|
| MchResCod | int(11) | NO | PRI | NULL | auto_increment |
|
||||||
|
| MchCod | int(11) | NO | MUL | NULL | |
|
||||||
|
| UsrCod | int(11) | NO | | NULL | |
|
||||||
|
| NumQsts | int(11) | NO | | 0 | |
|
||||||
|
| NumQstsNotBlank | int(11) | NO | | 0 | |
|
||||||
|
| Score | double | NO | | 0 | |
|
||||||
|
+-----------------+---------+------+-----+---------+----------------+
|
||||||
|
6 rows in set (0.01 sec)
|
||||||
|
*/
|
||||||
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS mch_results ("
|
||||||
|
"MchResCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
|
"MchCod INT NOT NULL,"
|
||||||
|
"UsrCod INT NOT NULL,"
|
||||||
|
"NumQsts INT NOT NULL DEFAULT 0,"
|
||||||
|
"NumQstsNotBlank INT NOT NULL DEFAULT 0,"
|
||||||
|
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
|
||||||
|
"UNIQUE INDEX(MchResCod),"
|
||||||
|
"UNIQUE INDEX(MchCod,UsrCod))");
|
||||||
|
|
||||||
/***** Table gam_questions *****/
|
/***** Table gam_questions *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE gam_questions;
|
mysql> DESCRIBE gam_questions;
|
||||||
|
|
|
@ -1243,6 +1243,28 @@ const char *Hlp_ASSESSMENT_Tests_results =
|
||||||
"ASSESSMENT.Tests.en#test-results"; // TODO: Change to #results
|
"ASSESSMENT.Tests.en#test-results"; // TODO: Change to #results
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
const char *Hlp_ASSESSMENT_Games_results =
|
||||||
|
#if L==1
|
||||||
|
"ASSESSMENT.Games.es#resultados";
|
||||||
|
#elif L==2
|
||||||
|
"ASSESSMENT.Games.en#results";
|
||||||
|
#elif L==3
|
||||||
|
"ASSESSMENT.Games.en#results";
|
||||||
|
#elif L==4
|
||||||
|
"ASSESSMENT.Games.es#resultados";
|
||||||
|
#elif L==5
|
||||||
|
"ASSESSMENT.Games.en#results";
|
||||||
|
#elif L==6
|
||||||
|
"ASSESSMENT.Games.es#resultados";
|
||||||
|
#elif L==7
|
||||||
|
"ASSESSMENT.Games.en#results";
|
||||||
|
#elif L==8
|
||||||
|
"ASSESSMENT.Games.en#results";
|
||||||
|
#elif L==9
|
||||||
|
"ASSESSMENT.Games.en#results";
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *Hlp_ASSESSMENT_Surveys =
|
const char *Hlp_ASSESSMENT_Surveys =
|
||||||
#if L==1
|
#if L==1
|
||||||
"ASSESSMENT.Surveys.es";
|
"ASSESSMENT.Surveys.es";
|
||||||
|
|
680
swad_match.c
680
swad_match.c
|
@ -39,6 +39,7 @@
|
||||||
#include "swad_game.h"
|
#include "swad_game.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
#include "swad_group.h"
|
#include "swad_group.h"
|
||||||
|
#include "swad_ID.h"
|
||||||
#include "swad_match.h"
|
#include "swad_match.h"
|
||||||
#include "swad_pagination.h"
|
#include "swad_pagination.h"
|
||||||
#include "swad_parameter.h"
|
#include "swad_parameter.h"
|
||||||
|
@ -131,8 +132,9 @@ static void Mch_GetMatchDataFromRow (MYSQL_RES *mysql_res,
|
||||||
static Mch_Showing_t Mch_GetShowingFromStr (const char *Str);
|
static Mch_Showing_t Mch_GetShowingFromStr (const char *Str);
|
||||||
|
|
||||||
static void Mch_PutParamCurrentMchCod (void);
|
static void Mch_PutParamCurrentMchCod (void);
|
||||||
static void Mch_PutParamMatchCod (long MchCod);
|
static void Mch_PutParamMchCod (long MchCod);
|
||||||
static long Mch_GetParamMatchCod (void);
|
static long Mch_GetParamMchCod (void);
|
||||||
|
static long Mch_GetParamMchResCod (void);
|
||||||
|
|
||||||
static void Mch_PutButtonNewMatch (long GamCod);
|
static void Mch_PutButtonNewMatch (long GamCod);
|
||||||
|
|
||||||
|
@ -195,6 +197,15 @@ static unsigned Mch_GetNumUsrsWhoHaveChosenAns (long MchCod,unsigned QstInd,unsi
|
||||||
static unsigned Mch_GetNumUsrsWhoHaveAnswerMch (long MchCod);
|
static unsigned Mch_GetNumUsrsWhoHaveAnswerMch (long MchCod);
|
||||||
static void Mch_DrawBarNumUsrs (unsigned NumAnswerersAns,unsigned NumAnswerersQst,bool Correct);
|
static void Mch_DrawBarNumUsrs (unsigned NumAnswerersAns,unsigned NumAnswerersQst,bool Correct);
|
||||||
|
|
||||||
|
static void Mch_ShowHeaderMchResults (void);
|
||||||
|
static void Mch_ShowMchResults (struct UsrData *UsrDat);
|
||||||
|
static void Mch_GetMatchResultDataByMchCod (long MchResCod,
|
||||||
|
time_t *StartTimeUTC,
|
||||||
|
time_t *EndTimeUTC,
|
||||||
|
unsigned *NumQsts,
|
||||||
|
unsigned *NumQstsNotBlank,
|
||||||
|
double *Score);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************************* List the matches of a game ************************/
|
/************************* List the matches of a game ************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -416,7 +427,7 @@ static void Mch_ListOneOrMoreMatches (struct Game *Game,
|
||||||
|
|
||||||
/* Put icon to remove the match */
|
/* Put icon to remove the match */
|
||||||
Frm_StartForm (ActReqRemMchTch);
|
Frm_StartForm (ActReqRemMchTch);
|
||||||
Mch_PutParamMatchCod (Match.MchCod);
|
Mch_PutParamMchCod (Match.MchCod);
|
||||||
Ico_PutIconRemove ();
|
Ico_PutIconRemove ();
|
||||||
Frm_EndForm ();
|
Frm_EndForm ();
|
||||||
|
|
||||||
|
@ -691,7 +702,7 @@ void Mch_RequestRemoveMatchTch (void)
|
||||||
|
|
||||||
/***** Get parameters *****/
|
/***** Get parameters *****/
|
||||||
/* Get match code */
|
/* Get match code */
|
||||||
if ((Match.MchCod = Mch_GetParamMatchCod ()) == -1L)
|
if ((Match.MchCod = Mch_GetParamMchCod ()) == -1L)
|
||||||
Lay_ShowErrorAndExit ("Code of match is missing.");
|
Lay_ShowErrorAndExit ("Code of match is missing.");
|
||||||
|
|
||||||
/***** Get data of the match from database *****/
|
/***** Get data of the match from database *****/
|
||||||
|
@ -722,7 +733,7 @@ void Mch_RemoveMatchTch (void)
|
||||||
|
|
||||||
/***** Get parameters *****/
|
/***** Get parameters *****/
|
||||||
/* Get match code */
|
/* Get match code */
|
||||||
if ((Match.MchCod = Mch_GetParamMatchCod ()) == -1L)
|
if ((Match.MchCod = Mch_GetParamMchCod ()) == -1L)
|
||||||
Lay_ShowErrorAndExit ("Code of match is missing.");
|
Lay_ShowErrorAndExit ("Code of match is missing.");
|
||||||
|
|
||||||
/***** Get data of the match from database *****/
|
/***** Get data of the match from database *****/
|
||||||
|
@ -798,14 +809,14 @@ void Mch_RemoveMatchTch (void)
|
||||||
static void Mch_PutParamCurrentMchCod (void)
|
static void Mch_PutParamCurrentMchCod (void)
|
||||||
{
|
{
|
||||||
if (Mch_CurrentMchCod > 0)
|
if (Mch_CurrentMchCod > 0)
|
||||||
Mch_PutParamMatchCod (Mch_CurrentMchCod);
|
Mch_PutParamMchCod (Mch_CurrentMchCod);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************** Write parameter with code of match **********************/
|
/******************** Write parameter with code of match **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Mch_PutParamMatchCod (long MchCod)
|
static void Mch_PutParamMchCod (long MchCod)
|
||||||
{
|
{
|
||||||
Par_PutHiddenParamLong ("MchCod",MchCod);
|
Par_PutHiddenParamLong ("MchCod",MchCod);
|
||||||
}
|
}
|
||||||
|
@ -814,12 +825,22 @@ static void Mch_PutParamMatchCod (long MchCod)
|
||||||
/********************* Get parameter with code of match **********************/
|
/********************* Get parameter with code of match **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static long Mch_GetParamMatchCod (void)
|
static long Mch_GetParamMchCod (void)
|
||||||
{
|
{
|
||||||
/***** Get code of match *****/
|
/***** Get code of match *****/
|
||||||
return Par_GetParToLong ("MchCod");
|
return Par_GetParToLong ("MchCod");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************** Get parameter with code of match result ******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static long Mch_GetParamMchResCod (void)
|
||||||
|
{
|
||||||
|
/***** Get code of match *****/
|
||||||
|
return Par_GetParToLong ("MchResCod");
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************* Put button to create a new match **********************/
|
/********************* Put button to create a new match **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1727,7 +1748,7 @@ static void Mch_PutCheckboxResult (struct Match *Match)
|
||||||
|
|
||||||
/***** Start form *****/
|
/***** Start form *****/
|
||||||
Frm_StartForm (ActChgDisResMchTch);
|
Frm_StartForm (ActChgDisResMchTch);
|
||||||
Mch_PutParamMatchCod (Match->MchCod); // Current match being played
|
Mch_PutParamMchCod (Match->MchCod); // Current match being played
|
||||||
|
|
||||||
/***** Put icon with link *****/
|
/***** Put icon with link *****/
|
||||||
/* Submitting onmousedown instead of default onclick
|
/* Submitting onmousedown instead of default onclick
|
||||||
|
@ -1933,7 +1954,7 @@ static void Mch_ShowQuestionAndAnswersStd (struct Match *Match)
|
||||||
is necessary in order to be fast
|
is necessary in order to be fast
|
||||||
and not lose clicks due to refresh */
|
and not lose clicks due to refresh */
|
||||||
Frm_StartForm (ActAnsMchQstStd);
|
Frm_StartForm (ActAnsMchQstStd);
|
||||||
Mch_PutParamMatchCod (Match->MchCod); // Current match being played
|
Mch_PutParamMchCod (Match->MchCod); // Current match being played
|
||||||
Gam_PutParamQstInd (Match->Status.QstInd); // Current question index shown
|
Gam_PutParamQstInd (Match->Status.QstInd); // Current question index shown
|
||||||
Mch_PutParamAnswer (Index); // Index for this option
|
Mch_PutParamAnswer (Index); // Index for this option
|
||||||
fprintf (Gbl.F.Out,"<button type=\"submit\""
|
fprintf (Gbl.F.Out,"<button type=\"submit\""
|
||||||
|
@ -1999,7 +2020,7 @@ static void Mch_PutBigButton (Act_Action_t NextAction,long MchCod,
|
||||||
{
|
{
|
||||||
/***** Start form *****/
|
/***** Start form *****/
|
||||||
Frm_StartForm (NextAction);
|
Frm_StartForm (NextAction);
|
||||||
Mch_PutParamMatchCod (MchCod);
|
Mch_PutParamMchCod (MchCod);
|
||||||
|
|
||||||
/***** Put icon with link *****/
|
/***** Put icon with link *****/
|
||||||
/* Submitting onmousedown instead of default onclick
|
/* Submitting onmousedown instead of default onclick
|
||||||
|
@ -2151,7 +2172,7 @@ void Mch_ShowFinishedMatchResults (void)
|
||||||
void Mch_GetMatchBeingPlayed (void)
|
void Mch_GetMatchBeingPlayed (void)
|
||||||
{
|
{
|
||||||
/***** Get match code ****/
|
/***** Get match code ****/
|
||||||
if ((Gbl.Games.MchCodBeingPlayed = Mch_GetParamMatchCod ()) == -1L)
|
if ((Gbl.Games.MchCodBeingPlayed = Mch_GetParamMchCod ()) == -1L)
|
||||||
Lay_ShowErrorAndExit ("Code of match is missing.");
|
Lay_ShowErrorAndExit ("Code of match is missing.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2453,13 +2474,65 @@ void Mch_PutFormToViewMchResults (Act_Action_t Action)
|
||||||
fprintf (Gbl.F.Out,"</div>");
|
fprintf (Gbl.F.Out,"</div>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************** Select dates to show my matches results ******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Mch_SelDatesToSeeMyMchResults (void)
|
||||||
|
{
|
||||||
|
extern const char *Hlp_ASSESSMENT_Games_results;
|
||||||
|
extern const char *Txt_Results;
|
||||||
|
extern const char *Txt_View_matches_results;
|
||||||
|
|
||||||
|
/***** Start form *****/
|
||||||
|
Frm_StartForm (ActSeeMyMchRes);
|
||||||
|
|
||||||
|
/***** Start box and table *****/
|
||||||
|
Box_StartBoxTable (NULL,Txt_Results,NULL,
|
||||||
|
Hlp_ASSESSMENT_Games_results,Box_NOT_CLOSABLE,2);
|
||||||
|
Dat_PutFormStartEndClientLocalDateTimesWithYesterdayToday (false);
|
||||||
|
|
||||||
|
/***** End table, send button and end box *****/
|
||||||
|
Box_EndBoxTableWithButton (Btn_CONFIRM_BUTTON,Txt_View_matches_results);
|
||||||
|
|
||||||
|
/***** End form *****/
|
||||||
|
Frm_EndForm ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*************************** Show my matches results *************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Mch_ShowMyMchResults (void)
|
||||||
|
{
|
||||||
|
extern const char *Hlp_ASSESSMENT_Games_results;
|
||||||
|
extern const char *Txt_Results;
|
||||||
|
|
||||||
|
/***** Get starting and ending dates *****/
|
||||||
|
Dat_GetIniEndDatesFromForm ();
|
||||||
|
|
||||||
|
/***** Start box and table *****/
|
||||||
|
Box_StartBoxTable (NULL,Txt_Results,NULL,
|
||||||
|
Hlp_ASSESSMENT_Games_results,Box_NOT_CLOSABLE,2);
|
||||||
|
|
||||||
|
/***** Header of the table with the list of users *****/
|
||||||
|
Mch_ShowHeaderMchResults ();
|
||||||
|
|
||||||
|
/***** List my test results *****/
|
||||||
|
// Tst_GetConfigTstFromDB (); // To get feedback type // TODO: Change to matches results
|
||||||
|
Mch_ShowMchResults (&Gbl.Usrs.Me.UsrDat);
|
||||||
|
|
||||||
|
/***** End table and box *****/
|
||||||
|
Box_EndBoxTable ();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*********** Select users and dates to show their matches results ************/
|
/*********** Select users and dates to show their matches results ************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Mch_SelUsrsToViewUsrsMchResults (void)
|
void Mch_SelUsrsToViewUsrsMchResults (void)
|
||||||
{
|
{
|
||||||
extern const char *Hlp_ASSESSMENT_Tests_results; // TODO: Change to matches results
|
extern const char *Hlp_ASSESSMENT_Games_results;
|
||||||
extern const char *The_ClassFormInBox[The_NUM_THEMES];
|
extern const char *The_ClassFormInBox[The_NUM_THEMES];
|
||||||
extern const char *Txt_Results;
|
extern const char *Txt_Results;
|
||||||
extern const char *Txt_Users;
|
extern const char *Txt_Users;
|
||||||
|
@ -2484,7 +2557,7 @@ void Mch_SelUsrsToViewUsrsMchResults (void)
|
||||||
|
|
||||||
/***** Start box *****/
|
/***** Start box *****/
|
||||||
Box_StartBox (NULL,Txt_Results,NULL,
|
Box_StartBox (NULL,Txt_Results,NULL,
|
||||||
Hlp_ASSESSMENT_Tests_results,Box_NOT_CLOSABLE);
|
Hlp_ASSESSMENT_Games_results,Box_NOT_CLOSABLE);
|
||||||
|
|
||||||
/***** Show form to select the groups *****/
|
/***** Show form to select the groups *****/
|
||||||
Grp_ShowFormToSelectSeveralGroups (NULL,
|
Grp_ShowFormToSelectSeveralGroups (NULL,
|
||||||
|
@ -2554,3 +2627,582 @@ void Mch_SelUsrsToViewUsrsMchResults (void)
|
||||||
/***** Free memory for list of selected groups *****/
|
/***** Free memory for list of selected groups *****/
|
||||||
Grp_FreeListCodSelectedGrps ();
|
Grp_FreeListCodSelectedGrps ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************** Show matches results for several users *******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Mch_ShowUsrsMchResults (void)
|
||||||
|
{
|
||||||
|
extern const char *Hlp_ASSESSMENT_Games_results;
|
||||||
|
extern const char *Txt_Results;
|
||||||
|
extern const char *Txt_You_must_select_one_ore_more_users;
|
||||||
|
const char *Ptr;
|
||||||
|
|
||||||
|
/***** Get list of the selected users's IDs *****/
|
||||||
|
Usr_GetListsSelectedUsrsCods ();
|
||||||
|
|
||||||
|
/***** Get starting and ending dates *****/
|
||||||
|
Dat_GetIniEndDatesFromForm ();
|
||||||
|
|
||||||
|
/***** Check the number of users whose tests results will be shown *****/
|
||||||
|
if (Usr_CountNumUsrsInListOfSelectedUsrs ()) // If some users are selected...
|
||||||
|
{
|
||||||
|
/***** Start box and table *****/
|
||||||
|
Box_StartBoxTable (NULL,Txt_Results,NULL,
|
||||||
|
Hlp_ASSESSMENT_Games_results,Box_NOT_CLOSABLE,2);
|
||||||
|
|
||||||
|
/***** Header of the table with the list of users *****/
|
||||||
|
Mch_ShowHeaderMchResults ();
|
||||||
|
|
||||||
|
/***** List the test exams of the selected users *****/
|
||||||
|
Ptr = Gbl.Usrs.Selected.List[Rol_UNK];
|
||||||
|
while (*Ptr)
|
||||||
|
{
|
||||||
|
Par_GetNextStrUntilSeparParamMult (&Ptr,Gbl.Usrs.Other.UsrDat.EncryptedUsrCod,
|
||||||
|
Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64);
|
||||||
|
Usr_GetUsrCodFromEncryptedUsrCod (&Gbl.Usrs.Other.UsrDat);
|
||||||
|
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,Usr_DONT_GET_PREFS)) // Get of the database the data of the user
|
||||||
|
if (Usr_CheckIfICanViewTst (&Gbl.Usrs.Other.UsrDat)) // TODO: Change to matches results
|
||||||
|
/***** Show matches results *****/
|
||||||
|
Mch_ShowMchResults (&Gbl.Usrs.Other.UsrDat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** End table and box *****/
|
||||||
|
Box_EndBoxTable ();
|
||||||
|
}
|
||||||
|
else // If no users are selected...
|
||||||
|
{
|
||||||
|
// ...write warning alert
|
||||||
|
Ale_ShowAlert (Ale_WARNING,Txt_You_must_select_one_ore_more_users);
|
||||||
|
// ...and show again the form
|
||||||
|
Mch_SelUsrsToViewUsrsMchResults ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Free memory used by list of selected users' codes *****/
|
||||||
|
Usr_FreeListsSelectedUsrsCods ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************* Show header of my matches results *********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Mch_ShowHeaderMchResults (void)
|
||||||
|
{
|
||||||
|
extern const char *Txt_User[Usr_NUM_SEXS];
|
||||||
|
extern const char *Txt_Date;
|
||||||
|
extern const char *Txt_Questions;
|
||||||
|
extern const char *Txt_Non_blank_BR_questions;
|
||||||
|
extern const char *Txt_Total_BR_score;
|
||||||
|
extern const char *Txt_Average_BR_score_BR_per_question_BR_from_0_to_1;
|
||||||
|
extern const char *Txt_Score;
|
||||||
|
extern const char *Txt_out_of_PART_OF_A_SCORE;
|
||||||
|
|
||||||
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
"<th colspan=\"2\" class=\"CENTER_TOP\">"
|
||||||
|
"%s"
|
||||||
|
"</th>"
|
||||||
|
"<th class=\"RIGHT_TOP\">"
|
||||||
|
"%s"
|
||||||
|
"</th>"
|
||||||
|
"<th class=\"RIGHT_TOP\">"
|
||||||
|
"%s"
|
||||||
|
"</th>"
|
||||||
|
"<th class=\"RIGHT_TOP\">"
|
||||||
|
"%s"
|
||||||
|
"</th>"
|
||||||
|
"<th class=\"RIGHT_TOP\">"
|
||||||
|
"%s"
|
||||||
|
"</th>"
|
||||||
|
"<th class=\"RIGHT_TOP\">"
|
||||||
|
"%s"
|
||||||
|
"</th>"
|
||||||
|
"<th class=\"RIGHT_TOP\">"
|
||||||
|
"%s<br />%s<br />%u"
|
||||||
|
"</th>"
|
||||||
|
"<th></th>"
|
||||||
|
"</tr>",
|
||||||
|
Txt_User[Usr_SEX_UNKNOWN],
|
||||||
|
Txt_Date,
|
||||||
|
Txt_Questions,
|
||||||
|
Txt_Non_blank_BR_questions,
|
||||||
|
Txt_Total_BR_score,
|
||||||
|
Txt_Average_BR_score_BR_per_question_BR_from_0_to_1,
|
||||||
|
Txt_Score,Txt_out_of_PART_OF_A_SCORE,Tst_SCORE_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*********** Show the test results of a user in the current course ***********/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Mch_ShowMchResults (struct UsrData *UsrDat)
|
||||||
|
{
|
||||||
|
extern const char *Txt_Today;
|
||||||
|
extern const char *Txt_View_test;
|
||||||
|
MYSQL_RES *mysql_res;
|
||||||
|
MYSQL_ROW row;
|
||||||
|
unsigned NumExams;
|
||||||
|
unsigned NumTest;
|
||||||
|
static unsigned UniqueId = 0;
|
||||||
|
long TstCod;
|
||||||
|
unsigned NumQstsInThisTest;
|
||||||
|
unsigned NumQstsNotBlankInThisTest;
|
||||||
|
unsigned NumTotalQsts = 0;
|
||||||
|
unsigned NumTotalQstsNotBlank = 0;
|
||||||
|
double ScoreInThisTest;
|
||||||
|
double TotalScoreOfAllTests = 0.0;
|
||||||
|
unsigned NumExamsVisibleByTchs = 0;
|
||||||
|
bool ItsMe = Usr_ItsMe (UsrDat->UsrCod);
|
||||||
|
bool ICanViewTest;
|
||||||
|
bool ICanViewScore;
|
||||||
|
time_t TimeUTC;
|
||||||
|
char *ClassDat;
|
||||||
|
|
||||||
|
/***** Make database query *****/
|
||||||
|
NumExams =
|
||||||
|
(unsigned) DB_QuerySELECT (&mysql_res,"can not get test exams of a user",
|
||||||
|
"SELECT TstCod," // row[0]
|
||||||
|
"AllowTeachers," // row[1]
|
||||||
|
"UNIX_TIMESTAMP(TstTime)," // row[2]
|
||||||
|
"NumQsts," // row[3]
|
||||||
|
"NumQstsNotBlank," // row[4]
|
||||||
|
"Score" // row[5]
|
||||||
|
" FROM tst_exams"
|
||||||
|
" WHERE CrsCod=%ld AND UsrCod=%ld"
|
||||||
|
" AND TstTime>=FROM_UNIXTIME(%ld)"
|
||||||
|
" AND TstTime<=FROM_UNIXTIME(%ld)"
|
||||||
|
" ORDER BY TstCod",
|
||||||
|
Gbl.Hierarchy.Crs.CrsCod,
|
||||||
|
UsrDat->UsrCod,
|
||||||
|
(long) Gbl.DateRange.TimeUTC[0],
|
||||||
|
(long) Gbl.DateRange.TimeUTC[1]);
|
||||||
|
|
||||||
|
/***** Show user's data *****/
|
||||||
|
fprintf (Gbl.F.Out,"<tr>");
|
||||||
|
// Tst_ShowDataUsr (UsrDat,NumExams); // TODO: Change to matches results
|
||||||
|
|
||||||
|
/***** Get and print test results *****/
|
||||||
|
if (NumExams)
|
||||||
|
{
|
||||||
|
for (NumTest = 0;
|
||||||
|
NumTest < NumExams;
|
||||||
|
NumTest++)
|
||||||
|
{
|
||||||
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
|
/* Get test code (row[0]) */
|
||||||
|
if ((TstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
|
||||||
|
Lay_ShowErrorAndExit ("Wrong code of test result.");
|
||||||
|
|
||||||
|
/* Get if teachers are allowed to see this test result (row[1]) */
|
||||||
|
Gbl.Test.AllowTeachers = (row[1][0] == 'Y');
|
||||||
|
ClassDat = Gbl.Test.AllowTeachers ? "DAT" :
|
||||||
|
"DAT_LIGHT";
|
||||||
|
|
||||||
|
switch (Gbl.Usrs.Me.Role.Logged)
|
||||||
|
{
|
||||||
|
case Rol_STD:
|
||||||
|
ICanViewTest = ItsMe;
|
||||||
|
ICanViewScore = ItsMe &&
|
||||||
|
Gbl.Test.Config.Feedback != Tst_FEEDBACK_NOTHING;
|
||||||
|
break;
|
||||||
|
case Rol_NET:
|
||||||
|
case Rol_TCH:
|
||||||
|
case Rol_DEG_ADM:
|
||||||
|
case Rol_CTR_ADM:
|
||||||
|
case Rol_INS_ADM:
|
||||||
|
ICanViewTest =
|
||||||
|
ICanViewScore = ItsMe ||
|
||||||
|
Gbl.Test.AllowTeachers;
|
||||||
|
break;
|
||||||
|
case Rol_SYS_ADM:
|
||||||
|
ICanViewTest =
|
||||||
|
ICanViewScore = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ICanViewTest =
|
||||||
|
ICanViewScore = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NumTest)
|
||||||
|
fprintf (Gbl.F.Out,"<tr>");
|
||||||
|
|
||||||
|
/* Write date and time (row[2] holds UTC date-time) */
|
||||||
|
TimeUTC = Dat_GetUNIXTimeFromStr (row[2]);
|
||||||
|
UniqueId++;
|
||||||
|
fprintf (Gbl.F.Out,"<td id =\"tst_date_%u\" class=\"%s RIGHT_TOP COLOR%u\">"
|
||||||
|
"<script type=\"text/javascript\">"
|
||||||
|
"writeLocalDateHMSFromUTC('tst_date_%u',%ld,"
|
||||||
|
"%u,', ','%s',true,false,0x7);"
|
||||||
|
"</script>"
|
||||||
|
"</td>",
|
||||||
|
UniqueId,ClassDat,Gbl.RowEvenOdd,
|
||||||
|
UniqueId,(long) TimeUTC,
|
||||||
|
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
|
||||||
|
|
||||||
|
/* Get number of questions (row[3]) */
|
||||||
|
if (sscanf (row[3],"%u",&NumQstsInThisTest) != 1)
|
||||||
|
NumQstsInThisTest = 0;
|
||||||
|
if (Gbl.Test.AllowTeachers)
|
||||||
|
NumTotalQsts += NumQstsInThisTest;
|
||||||
|
|
||||||
|
/* Get number of questions not blank (row[4]) */
|
||||||
|
if (sscanf (row[4],"%u",&NumQstsNotBlankInThisTest) != 1)
|
||||||
|
NumQstsNotBlankInThisTest = 0;
|
||||||
|
if (Gbl.Test.AllowTeachers)
|
||||||
|
NumTotalQstsNotBlank += NumQstsNotBlankInThisTest;
|
||||||
|
|
||||||
|
/* Get score (row[5]) */
|
||||||
|
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
|
||||||
|
if (sscanf (row[5],"%lf",&ScoreInThisTest) != 1)
|
||||||
|
ScoreInThisTest = 0.0;
|
||||||
|
Str_SetDecimalPointToLocal (); // Return to local system
|
||||||
|
if (Gbl.Test.AllowTeachers)
|
||||||
|
TotalScoreOfAllTests += ScoreInThisTest;
|
||||||
|
|
||||||
|
/* Write number of questions */
|
||||||
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
|
||||||
|
ClassDat,Gbl.RowEvenOdd);
|
||||||
|
if (ICanViewTest)
|
||||||
|
fprintf (Gbl.F.Out,"%u",NumQstsInThisTest);
|
||||||
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
|
/* Write number of questions not blank */
|
||||||
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
|
||||||
|
ClassDat,Gbl.RowEvenOdd);
|
||||||
|
if (ICanViewTest)
|
||||||
|
fprintf (Gbl.F.Out,"%u",NumQstsNotBlankInThisTest);
|
||||||
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
|
/* Write score */
|
||||||
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
|
||||||
|
ClassDat,Gbl.RowEvenOdd);
|
||||||
|
if (ICanViewScore)
|
||||||
|
fprintf (Gbl.F.Out,"%.2lf",ScoreInThisTest);
|
||||||
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
|
/* Write average score per question */
|
||||||
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
|
||||||
|
ClassDat,Gbl.RowEvenOdd);
|
||||||
|
if (ICanViewScore)
|
||||||
|
fprintf (Gbl.F.Out,"%.2lf",
|
||||||
|
NumQstsInThisTest ? ScoreInThisTest / (double) NumQstsInThisTest :
|
||||||
|
0.0);
|
||||||
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
|
/* Write score over Tst_SCORE_MAX */
|
||||||
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
|
||||||
|
ClassDat,Gbl.RowEvenOdd);
|
||||||
|
if (ICanViewScore)
|
||||||
|
fprintf (Gbl.F.Out,"%.2lf",
|
||||||
|
NumQstsInThisTest ? ScoreInThisTest * Tst_SCORE_MAX / (double) NumQstsInThisTest :
|
||||||
|
0.0);
|
||||||
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
|
/* Link to show this result */
|
||||||
|
fprintf (Gbl.F.Out,"<td class=\"RIGHT_TOP COLOR%u\">",
|
||||||
|
Gbl.RowEvenOdd);
|
||||||
|
if (ICanViewTest)
|
||||||
|
{
|
||||||
|
Frm_StartForm (Gbl.Action.Act == ActSeeMyTstRes ? ActSeeOneTstResMe :
|
||||||
|
ActSeeOneTstResOth);
|
||||||
|
// Tst_PutParamTstCod (TstCod); // TODO: Change to matches results
|
||||||
|
Ico_PutIconLink ("tasks.svg",Txt_View_test);
|
||||||
|
Frm_EndForm ();
|
||||||
|
}
|
||||||
|
fprintf (Gbl.F.Out,"</td>"
|
||||||
|
"</tr>");
|
||||||
|
|
||||||
|
if (Gbl.Test.AllowTeachers)
|
||||||
|
NumExamsVisibleByTchs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Write totals for this user *****/
|
||||||
|
// Tst_ShowTestResultsSummaryRow (ItsMe,NumExamsVisibleByTchs,
|
||||||
|
// NumTotalQsts,NumTotalQstsNotBlank,
|
||||||
|
// TotalScoreOfAllTests); // TODO: Change to matches results
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fprintf (Gbl.F.Out,"<td class=\"COLOR%u\"></td>"
|
||||||
|
"<td class=\"COLOR%u\"></td>"
|
||||||
|
"<td class=\"COLOR%u\"></td>"
|
||||||
|
"<td class=\"COLOR%u\"></td>"
|
||||||
|
"<td class=\"COLOR%u\"></td>"
|
||||||
|
"<td class=\"COLOR%u\"></td>"
|
||||||
|
"<td class=\"COLOR%u\"></td>"
|
||||||
|
"</tr>",
|
||||||
|
Gbl.RowEvenOdd,
|
||||||
|
Gbl.RowEvenOdd,
|
||||||
|
Gbl.RowEvenOdd,
|
||||||
|
Gbl.RowEvenOdd,
|
||||||
|
Gbl.RowEvenOdd,
|
||||||
|
Gbl.RowEvenOdd,
|
||||||
|
Gbl.RowEvenOdd);
|
||||||
|
|
||||||
|
/***** Free structure that stores the query result *****/
|
||||||
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
||||||
|
Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Show one match result of another user *******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Mch_ShowOneMchResult (void)
|
||||||
|
{
|
||||||
|
extern const char *Hlp_ASSESSMENT_Games_results;
|
||||||
|
extern const char *Txt_Match_result;
|
||||||
|
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||||
|
extern const char *Txt_Date;
|
||||||
|
extern const char *Txt_Today;
|
||||||
|
extern const char *Txt_Questions;
|
||||||
|
extern const char *Txt_non_blank_QUESTIONS;
|
||||||
|
extern const char *Txt_Score;
|
||||||
|
extern const char *Txt_out_of_PART_OF_A_SCORE;
|
||||||
|
long MchResCod;
|
||||||
|
time_t StartTimeUTC = 0; // Match result UTC date-time, initialized to avoid warning
|
||||||
|
time_t EndTimeUTC = 0; // Match result UTC date-time, initialized to avoid warning
|
||||||
|
unsigned NumQstsNotBlank;
|
||||||
|
double TotalScore;
|
||||||
|
bool ShowPhoto;
|
||||||
|
char PhotoURL[PATH_MAX + 1];
|
||||||
|
bool ItsMe;
|
||||||
|
bool ICanViewTest;
|
||||||
|
bool ICanViewScore;
|
||||||
|
|
||||||
|
/***** Get the code of the test *****/
|
||||||
|
if ((MchResCod = Mch_GetParamMchResCod ()) == -1L)
|
||||||
|
Lay_ShowErrorAndExit ("Code of match result is missing.");
|
||||||
|
|
||||||
|
/***** Get test result data *****/
|
||||||
|
Mch_GetMatchResultDataByMchCod (MchResCod,
|
||||||
|
&StartTimeUTC,
|
||||||
|
&EndTimeUTC,
|
||||||
|
&Gbl.Test.NumQsts,
|
||||||
|
&NumQstsNotBlank,
|
||||||
|
&TotalScore);
|
||||||
|
Gbl.Test.Config.Feedback = Tst_FEEDBACK_FULL_FEEDBACK; // Initialize feedback to maximum
|
||||||
|
|
||||||
|
/***** Check if I can view this test result *****/
|
||||||
|
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
|
||||||
|
switch (Gbl.Usrs.Me.Role.Logged)
|
||||||
|
{
|
||||||
|
case Rol_STD:
|
||||||
|
ICanViewTest = ItsMe;
|
||||||
|
if (ItsMe)
|
||||||
|
{
|
||||||
|
Tst_GetConfigTstFromDB (); // To get feedback type
|
||||||
|
ICanViewScore = Gbl.Test.Config.Feedback != Tst_FEEDBACK_NOTHING;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ICanViewScore = false;
|
||||||
|
break;
|
||||||
|
case Rol_TCH:
|
||||||
|
case Rol_DEG_ADM:
|
||||||
|
case Rol_CTR_ADM:
|
||||||
|
case Rol_INS_ADM:
|
||||||
|
switch (Gbl.Action.Act)
|
||||||
|
{
|
||||||
|
case ActSeeOneTstResMe:
|
||||||
|
ICanViewTest =
|
||||||
|
ICanViewScore = ItsMe;
|
||||||
|
break;
|
||||||
|
case ActSeeOneTstResOth:
|
||||||
|
ICanViewTest =
|
||||||
|
ICanViewScore = ItsMe ||
|
||||||
|
Gbl.Test.AllowTeachers;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ICanViewTest =
|
||||||
|
ICanViewScore = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Rol_SYS_ADM:
|
||||||
|
ICanViewTest =
|
||||||
|
ICanViewScore = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ICanViewTest =
|
||||||
|
ICanViewScore = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ICanViewTest) // I am allowed to view this test result
|
||||||
|
{
|
||||||
|
/***** Get questions and user's answers of the test result from database *****/
|
||||||
|
// Tst_GetTestResultQuestionsFromDB (TstCod); // TODO: Change to matches results
|
||||||
|
|
||||||
|
/***** Start box *****/
|
||||||
|
Box_StartBox (NULL,Txt_Match_result,NULL,
|
||||||
|
Hlp_ASSESSMENT_Games_results,Box_NOT_CLOSABLE);
|
||||||
|
Lay_WriteHeaderClassPhoto (false,false,
|
||||||
|
Gbl.Hierarchy.Ins.InsCod,
|
||||||
|
Gbl.Hierarchy.Deg.DegCod,
|
||||||
|
Gbl.Hierarchy.Crs.CrsCod);
|
||||||
|
|
||||||
|
/***** Start table *****/
|
||||||
|
Tbl_StartTableWideMargin (10);
|
||||||
|
|
||||||
|
/***** Header row *****/
|
||||||
|
/* Get data of the user who made the test */
|
||||||
|
if (!Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,Usr_DONT_GET_PREFS))
|
||||||
|
Lay_ShowErrorAndExit ("User does not exists.");
|
||||||
|
if (!Usr_CheckIfICanViewTst (&Gbl.Usrs.Other.UsrDat))
|
||||||
|
Lay_ShowErrorAndExit ("You can not view this test result.");
|
||||||
|
|
||||||
|
/* User */
|
||||||
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
"<td class=\"DAT_N RIGHT_TOP\">"
|
||||||
|
"%s:"
|
||||||
|
"</td>"
|
||||||
|
"<td class=\"DAT LEFT_TOP\">",
|
||||||
|
Txt_ROLES_SINGUL_Abc[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs.Role][Gbl.Usrs.Other.UsrDat.Sex]);
|
||||||
|
ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat,NULL);
|
||||||
|
fprintf (Gbl.F.Out," %s",
|
||||||
|
Gbl.Usrs.Other.UsrDat.Surname1);
|
||||||
|
if (Gbl.Usrs.Other.UsrDat.Surname2[0])
|
||||||
|
fprintf (Gbl.F.Out," %s",
|
||||||
|
Gbl.Usrs.Other.UsrDat.Surname2);
|
||||||
|
if (Gbl.Usrs.Other.UsrDat.FirstName[0])
|
||||||
|
fprintf (Gbl.F.Out,", %s",
|
||||||
|
Gbl.Usrs.Other.UsrDat.FirstName);
|
||||||
|
fprintf (Gbl.F.Out,"<br />");
|
||||||
|
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (&Gbl.Usrs.Other.UsrDat,PhotoURL);
|
||||||
|
Pho_ShowUsrPhoto (&Gbl.Usrs.Other.UsrDat,ShowPhoto ? PhotoURL :
|
||||||
|
NULL,
|
||||||
|
"PHOTO45x60",Pho_ZOOM,false);
|
||||||
|
fprintf (Gbl.F.Out,"</td>"
|
||||||
|
"</tr>");
|
||||||
|
|
||||||
|
/* Test dates */
|
||||||
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
"<td class=\"DAT_N RIGHT_TOP\">"
|
||||||
|
"%s:"
|
||||||
|
"</td>"
|
||||||
|
"<td id=\"match_start\" class=\"DAT LEFT_TOP\">"
|
||||||
|
"<script type=\"text/javascript\">"
|
||||||
|
"writeLocalDateHMSFromUTC('match_start',%ld,"
|
||||||
|
"%u,', ','%s',true,true,0x7);"
|
||||||
|
"</script>"
|
||||||
|
"</td>"
|
||||||
|
"<td id=\"match_end\" class=\"DAT LEFT_TOP\">"
|
||||||
|
"<script type=\"text/javascript\">"
|
||||||
|
"writeLocalDateHMSFromUTC('match_end',%ld,"
|
||||||
|
"%u,', ','%s',true,true,0x7);"
|
||||||
|
"</script>"
|
||||||
|
"</td>"
|
||||||
|
"</tr>",
|
||||||
|
Txt_Date,
|
||||||
|
StartTimeUTC,(unsigned) Gbl.Prefs.DateFormat,Txt_Today,
|
||||||
|
EndTimeUTC ,(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
|
||||||
|
|
||||||
|
/* Number of questions */
|
||||||
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
"<td class=\"DAT_N RIGHT_TOP\">"
|
||||||
|
"%s:"
|
||||||
|
"</td>"
|
||||||
|
"<td class=\"DAT LEFT_TOP\">"
|
||||||
|
"%u (%u %s)"
|
||||||
|
"</td>"
|
||||||
|
"</tr>",
|
||||||
|
Txt_Questions,
|
||||||
|
Gbl.Test.NumQsts,NumQstsNotBlank,Txt_non_blank_QUESTIONS);
|
||||||
|
|
||||||
|
/* Score */
|
||||||
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
"<td class=\"DAT_N RIGHT_TOP\">"
|
||||||
|
"%s:"
|
||||||
|
"</td>"
|
||||||
|
"<td class=\"DAT LEFT_TOP\">",
|
||||||
|
Txt_Score);
|
||||||
|
if (ICanViewScore)
|
||||||
|
fprintf (Gbl.F.Out,"%.2lf (%.2lf",
|
||||||
|
TotalScore,
|
||||||
|
Gbl.Test.NumQsts ? TotalScore * Tst_SCORE_MAX / (double) Gbl.Test.NumQsts :
|
||||||
|
0.0);
|
||||||
|
else
|
||||||
|
fprintf (Gbl.F.Out,"? (?"); // No feedback
|
||||||
|
fprintf (Gbl.F.Out," %s %u)</td>"
|
||||||
|
"</tr>",
|
||||||
|
Txt_out_of_PART_OF_A_SCORE,Tst_SCORE_MAX);
|
||||||
|
|
||||||
|
/***** Write answers and solutions *****/
|
||||||
|
// Tst_ShowTestResult (TstTimeUTC); // TODO: Change to matches results
|
||||||
|
|
||||||
|
/***** Write total mark of test *****/
|
||||||
|
// if (ICanViewScore)
|
||||||
|
// Tst_ShowTstTotalMark (TotalScore); // TODO: Change to matches results
|
||||||
|
|
||||||
|
/***** End table *****/
|
||||||
|
Tbl_EndTable ();
|
||||||
|
|
||||||
|
/***** End box *****/
|
||||||
|
Box_EndBox ();
|
||||||
|
}
|
||||||
|
else // I am not allowed to view this match result
|
||||||
|
Lay_ShowErrorAndExit ("You can not view this match result.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************* Get data of a match result using its match code ***************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Mch_GetMatchResultDataByMchCod (long MchResCod,
|
||||||
|
time_t *StartTimeUTC,
|
||||||
|
time_t *EndTimeUTC,
|
||||||
|
unsigned *NumQsts,
|
||||||
|
unsigned *NumQstsNotBlank,
|
||||||
|
double *Score)
|
||||||
|
{
|
||||||
|
MYSQL_RES *mysql_res;
|
||||||
|
MYSQL_ROW row;
|
||||||
|
|
||||||
|
/***** Make database query *****/
|
||||||
|
if (DB_QuerySELECT (&mysql_res,"can not get data"
|
||||||
|
" of a test result of a user",
|
||||||
|
"SELECT mch_results.UsrCod," // row[0]
|
||||||
|
"UNIX_TIMESTAMP(mch_matches.StartTime)," // row[2]
|
||||||
|
"UNIX_TIMESTAMP(mch_matches.EndTime)," // row[2]
|
||||||
|
"mch_results.NumQsts," // row[3]
|
||||||
|
"mch_results.NumQstsNotBlank," // row[4]
|
||||||
|
"mch_results.Score" // row[5]
|
||||||
|
" FROM mch_results,mch_matches"
|
||||||
|
" WHERE mch_results.MchResCod=%ld"
|
||||||
|
" AND mch_results.MchCod=mch_matches.MchCod"
|
||||||
|
" AND mch_matches.CrsCod=%ld", // Extra check
|
||||||
|
MchResCod,
|
||||||
|
Gbl.Hierarchy.Crs.CrsCod) == 1)
|
||||||
|
{
|
||||||
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
|
/* Get user code (row[0]) */
|
||||||
|
Gbl.Usrs.Other.UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
|
||||||
|
|
||||||
|
/* Get if teachers are allowed to see this test result (row[1]) */
|
||||||
|
Gbl.Test.AllowTeachers = (row[1][0] == 'Y');
|
||||||
|
|
||||||
|
/* Get start time (row[1] and row[2] hold UTC date-times) */
|
||||||
|
*StartTimeUTC = Dat_GetUNIXTimeFromStr (row[1]);
|
||||||
|
*EndTimeUTC = Dat_GetUNIXTimeFromStr (row[2]);
|
||||||
|
|
||||||
|
/* Get number of questions (row[3]) */
|
||||||
|
if (sscanf (row[3],"%u",NumQsts) != 1)
|
||||||
|
*NumQsts = 0;
|
||||||
|
|
||||||
|
/* Get number of questions not blank (row[4]) */
|
||||||
|
if (sscanf (row[4],"%u",NumQstsNotBlank) != 1)
|
||||||
|
*NumQstsNotBlank = 0;
|
||||||
|
|
||||||
|
/* Get score (row[5]) */
|
||||||
|
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
|
||||||
|
if (sscanf (row[5],"%lf",Score) != 1)
|
||||||
|
*Score = 0.0;
|
||||||
|
Str_SetDecimalPointToLocal (); // Return to local system
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Free structure that stores the query result *****/
|
||||||
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
}
|
||||||
|
|
|
@ -68,6 +68,10 @@ void Mch_GetAndDrawBarNumUsrsWhoHaveChosenAns (long MchCod,unsigned QstInd,unsig
|
||||||
unsigned Mch_GetNumUsrsWhoHaveAnswerQst (long MchCod,unsigned QstInd);
|
unsigned Mch_GetNumUsrsWhoHaveAnswerQst (long MchCod,unsigned QstInd);
|
||||||
|
|
||||||
void Mch_PutFormToViewMchResults (Act_Action_t Action);
|
void Mch_PutFormToViewMchResults (Act_Action_t Action);
|
||||||
|
void Mch_SelDatesToSeeMyMchResults (void);
|
||||||
|
void Mch_ShowMyMchResults (void);
|
||||||
void Mch_SelUsrsToViewUsrsMchResults (void);
|
void Mch_SelUsrsToViewUsrsMchResults (void);
|
||||||
|
void Mch_ShowUsrsMchResults (void);
|
||||||
|
void Mch_ShowOneMchResult (void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
69
swad_test.c
69
swad_test.c
|
@ -181,7 +181,6 @@ static void Tst_PutIconDisable (long TagCod,const char *TagTxt);
|
||||||
static void Tst_ShowFormConfigTst (void);
|
static void Tst_ShowFormConfigTst (void);
|
||||||
static void Tst_PutInputFieldNumQst (const char *Field,const char *Label,
|
static void Tst_PutInputFieldNumQst (const char *Field,const char *Label,
|
||||||
unsigned Value);
|
unsigned Value);
|
||||||
static void Tst_GetConfigTstFromDB (void);
|
|
||||||
static Tst_Pluggable_t Tst_GetPluggableFromForm (void);
|
static Tst_Pluggable_t Tst_GetPluggableFromForm (void);
|
||||||
static Tst_Feedback_t Tst_GetFeedbackTypeFromForm (void);
|
static Tst_Feedback_t Tst_GetFeedbackTypeFromForm (void);
|
||||||
static void Tst_CheckAndCorrectNumbersQst (void);
|
static void Tst_CheckAndCorrectNumbersQst (void);
|
||||||
|
@ -290,7 +289,7 @@ static long Tst_CreateTestResultInDB (void);
|
||||||
static void Tst_StoreScoreOfTestResultInDB (long TstCod,
|
static void Tst_StoreScoreOfTestResultInDB (long TstCod,
|
||||||
unsigned NumQstsNotBlank,double Score);
|
unsigned NumQstsNotBlank,double Score);
|
||||||
static void Tst_ShowHeaderTestResults (void);
|
static void Tst_ShowHeaderTestResults (void);
|
||||||
static void Tst_ShowTestResults (struct UsrData *UsrDat);
|
static void Tst_ShowTstResults (struct UsrData *UsrDat);
|
||||||
static void Tst_ShowDataUsr (struct UsrData *UsrDat,unsigned NumExams);
|
static void Tst_ShowDataUsr (struct UsrData *UsrDat,unsigned NumExams);
|
||||||
static void Tst_PutParamTstCod (long TstCod);
|
static void Tst_PutParamTstCod (long TstCod);
|
||||||
static long Tst_GetParamTstCod (void);
|
static long Tst_GetParamTstCod (void);
|
||||||
|
@ -2037,7 +2036,7 @@ static void Tst_PutInputFieldNumQst (const char *Field,const char *Label,
|
||||||
/*************** Get configuration of test for current course ****************/
|
/*************** Get configuration of test for current course ****************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Tst_GetConfigTstFromDB (void)
|
void Tst_GetConfigTstFromDB (void)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
|
@ -7418,7 +7417,7 @@ void Tst_SelUsrsToViewUsrsTstResults (void)
|
||||||
/******************* Select dates to show my test results ********************/
|
/******************* Select dates to show my test results ********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Tst_SelDatesToSeeMyTestResults (void)
|
void Tst_SelDatesToSeeMyTstResults (void)
|
||||||
{
|
{
|
||||||
extern const char *Hlp_ASSESSMENT_Tests_results;
|
extern const char *Hlp_ASSESSMENT_Tests_results;
|
||||||
extern const char *Txt_Results;
|
extern const char *Txt_Results;
|
||||||
|
@ -7439,6 +7438,33 @@ void Tst_SelDatesToSeeMyTestResults (void)
|
||||||
Frm_EndForm ();
|
Frm_EndForm ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Show my test results **************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Tst_ShowMyTstResults (void)
|
||||||
|
{
|
||||||
|
extern const char *Hlp_ASSESSMENT_Tests_results;
|
||||||
|
extern const char *Txt_Results;
|
||||||
|
|
||||||
|
/***** Get starting and ending dates *****/
|
||||||
|
Dat_GetIniEndDatesFromForm ();
|
||||||
|
|
||||||
|
/***** Start box and table *****/
|
||||||
|
Box_StartBoxTable (NULL,Txt_Results,NULL,
|
||||||
|
Hlp_ASSESSMENT_Tests_results,Box_NOT_CLOSABLE,2);
|
||||||
|
|
||||||
|
/***** Header of the table with the list of users *****/
|
||||||
|
Tst_ShowHeaderTestResults ();
|
||||||
|
|
||||||
|
/***** List my test results *****/
|
||||||
|
Tst_GetConfigTstFromDB (); // To get feedback type
|
||||||
|
Tst_ShowTstResults (&Gbl.Usrs.Me.UsrDat);
|
||||||
|
|
||||||
|
/***** End table and box *****/
|
||||||
|
Box_EndBoxTable ();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************* Store test result in database *************************/
|
/********************* Store test result in database *************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -7481,7 +7507,7 @@ static void Tst_StoreScoreOfTestResultInDB (long TstCod,
|
||||||
/******************** Show test results for several users ********************/
|
/******************** Show test results for several users ********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Tst_ShowUsrsTestResults (void)
|
void Tst_ShowUsrsTstResults (void)
|
||||||
{
|
{
|
||||||
extern const char *Hlp_ASSESSMENT_Tests_results;
|
extern const char *Hlp_ASSESSMENT_Tests_results;
|
||||||
extern const char *Txt_Results;
|
extern const char *Txt_Results;
|
||||||
|
@ -7514,7 +7540,7 @@ void Tst_ShowUsrsTestResults (void)
|
||||||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,Usr_DONT_GET_PREFS)) // Get of the database the data of the user
|
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,Usr_DONT_GET_PREFS)) // Get of the database the data of the user
|
||||||
if (Usr_CheckIfICanViewTst (&Gbl.Usrs.Other.UsrDat))
|
if (Usr_CheckIfICanViewTst (&Gbl.Usrs.Other.UsrDat))
|
||||||
/***** Show test results *****/
|
/***** Show test results *****/
|
||||||
Tst_ShowTestResults (&Gbl.Usrs.Other.UsrDat);
|
Tst_ShowTstResults (&Gbl.Usrs.Other.UsrDat);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** End table and box *****/
|
/***** End table and box *****/
|
||||||
|
@ -7580,38 +7606,11 @@ static void Tst_ShowHeaderTestResults (void)
|
||||||
Txt_Score,Txt_out_of_PART_OF_A_SCORE,Tst_SCORE_MAX);
|
Txt_Score,Txt_out_of_PART_OF_A_SCORE,Tst_SCORE_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/***************************** Show my test results **************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
void Tst_ShowMyTestResults (void)
|
|
||||||
{
|
|
||||||
extern const char *Hlp_ASSESSMENT_Tests_results;
|
|
||||||
extern const char *Txt_Results;
|
|
||||||
|
|
||||||
/***** Get starting and ending dates *****/
|
|
||||||
Dat_GetIniEndDatesFromForm ();
|
|
||||||
|
|
||||||
/***** Start box and table *****/
|
|
||||||
Box_StartBoxTable (NULL,Txt_Results,NULL,
|
|
||||||
Hlp_ASSESSMENT_Tests_results,Box_NOT_CLOSABLE,2);
|
|
||||||
|
|
||||||
/***** Header of the table with the list of users *****/
|
|
||||||
Tst_ShowHeaderTestResults ();
|
|
||||||
|
|
||||||
/***** List my test results *****/
|
|
||||||
Tst_GetConfigTstFromDB (); // To get feedback type
|
|
||||||
Tst_ShowTestResults (&Gbl.Usrs.Me.UsrDat);
|
|
||||||
|
|
||||||
/***** End table and box *****/
|
|
||||||
Box_EndBoxTable ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*********** Show the test results of a user in the current course ***********/
|
/*********** Show the test results of a user in the current course ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Tst_ShowTestResults (struct UsrData *UsrDat)
|
static void Tst_ShowTstResults (struct UsrData *UsrDat)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Today;
|
extern const char *Txt_Today;
|
||||||
extern const char *Txt_View_test;
|
extern const char *Txt_View_test;
|
||||||
|
@ -7999,7 +7998,7 @@ static void Tst_ShowTestResultsSummaryRow (bool ItsMe,
|
||||||
/******************* Show one test result of another user ********************/
|
/******************* Show one test result of another user ********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Tst_ShowOneTestResult (void)
|
void Tst_ShowOneTstResult (void)
|
||||||
{
|
{
|
||||||
extern const char *Hlp_ASSESSMENT_Tests_results;
|
extern const char *Hlp_ASSESSMENT_Tests_results;
|
||||||
extern const char *Txt_Test_result;
|
extern const char *Txt_Test_result;
|
||||||
|
|
10
swad_test.h
10
swad_test.h
|
@ -168,6 +168,8 @@ void Tst_EnableTag (void);
|
||||||
void Tst_DisableTag (void);
|
void Tst_DisableTag (void);
|
||||||
void Tst_RenameTag (void);
|
void Tst_RenameTag (void);
|
||||||
|
|
||||||
|
void Tst_GetConfigTstFromDB (void);
|
||||||
|
|
||||||
void Tst_GetConfigFromRow (MYSQL_ROW row);
|
void Tst_GetConfigFromRow (MYSQL_ROW row);
|
||||||
bool Tst_CheckIfCourseHaveTestsAndPluggableIsUnknown (void);
|
bool Tst_CheckIfCourseHaveTestsAndPluggableIsUnknown (void);
|
||||||
void Tst_ReceiveConfigTst (void);
|
void Tst_ReceiveConfigTst (void);
|
||||||
|
@ -196,10 +198,10 @@ void Tst_FreeTagsList (void);
|
||||||
void Tst_GetTestStats (Tst_AnswerType_t AnsType,struct Tst_Stats *Stats);
|
void Tst_GetTestStats (Tst_AnswerType_t AnsType,struct Tst_Stats *Stats);
|
||||||
|
|
||||||
void Tst_SelUsrsToViewUsrsTstResults (void);
|
void Tst_SelUsrsToViewUsrsTstResults (void);
|
||||||
void Tst_SelDatesToSeeMyTestResults (void);
|
void Tst_SelDatesToSeeMyTstResults (void);
|
||||||
void Tst_ShowUsrsTestResults (void);
|
void Tst_ShowMyTstResults (void);
|
||||||
void Tst_ShowMyTestResults (void);
|
void Tst_ShowUsrsTstResults (void);
|
||||||
void Tst_ShowOneTestResult (void);
|
void Tst_ShowOneTstResult (void);
|
||||||
void Tst_RemoveTestResultsMadeByUsrInAllCrss (long UsrCod);
|
void Tst_RemoveTestResultsMadeByUsrInAllCrss (long UsrCod);
|
||||||
void Tst_RemoveTestResultsMadeByUsrInCrs (long UsrCod,long CrsCod);
|
void Tst_RemoveTestResultsMadeByUsrInCrs (long UsrCod,long CrsCod);
|
||||||
void Tst_RemoveCrsTestResults (long CrsCod);
|
void Tst_RemoveCrsTestResults (long CrsCod);
|
||||||
|
|
21
swad_text.c
21
swad_text.c
|
@ -18036,6 +18036,27 @@ const char *Txt_MATCH_respond =
|
||||||
"respondem";
|
"respondem";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char *Txt_Match_result =
|
||||||
|
#if L==1 // ca
|
||||||
|
"Resultat de la partida";
|
||||||
|
#elif L==2 // de
|
||||||
|
"Spielergebnis";
|
||||||
|
#elif L==3 // en
|
||||||
|
"Match result";
|
||||||
|
#elif L==4 // es
|
||||||
|
"Resultado de la partida";
|
||||||
|
#elif L==5 // fr
|
||||||
|
"Résultat du match";
|
||||||
|
#elif L==6 // gn
|
||||||
|
"Resultado de la partida"; // Okoteve traducción
|
||||||
|
#elif L==7 // it
|
||||||
|
"Risultato della partita";
|
||||||
|
#elif L==8 // pl
|
||||||
|
"Wynik mecz";
|
||||||
|
#elif L==9 // pt
|
||||||
|
"Resultado do jogo";
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *Txt_Matches = // of a game
|
const char *Txt_Matches = // of a game
|
||||||
#if L==1 // ca
|
#if L==1 // ca
|
||||||
"Partides";
|
"Partides";
|
||||||
|
|
Loading…
Reference in New Issue