mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-03 07:15:26 +02:00
Version19.14.1
This commit is contained in:
parent
a7cc0c1fdf
commit
690371760b
|
@ -470,14 +470,15 @@ 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.14 (2019-09-25)"
|
#define Log_PLATFORM_VERSION "SWAD 19.14.1 (2019-09-25)"
|
||||||
#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"
|
||||||
/*
|
/*
|
||||||
// TODO: Poner columna en listado de juegos que indique el número de partidas
|
// TODO: Poner columna en listado de juegos que indique el número de partidas
|
||||||
// TODO: Imposibilitar la edición de preguntas de un juego cuando tenga partidas
|
// TODO: Imposibilitar la edición de preguntas de un juego cuando tenga partidas
|
||||||
// TODO: Evitar que el estudiante vea resultados de partidas cuando están ocultos
|
// TODO: Evitar que el estudiante vea el resultado de una partida cuando está oculto
|
||||||
|
|
||||||
|
Version 19.14.1: Sep 25, 2019 Student can not see match results if hidden. (246207 lines)
|
||||||
Version 19.14: Sep 25, 2019 New actions to show/hide match results. (246152 lines)
|
Version 19.14: Sep 25, 2019 New actions to show/hide match results. (246152 lines)
|
||||||
5 changes necessary in database:
|
5 changes necessary in database:
|
||||||
ALTER TABLE mch_matches DROP COLUMN VisibleResult,DROP COLUMN ShowResults;
|
ALTER TABLE mch_matches DROP COLUMN VisibleResult,DROP COLUMN ShowResults;
|
||||||
|
|
183
swad_match.c
183
swad_match.c
|
@ -146,6 +146,8 @@ static void Mch_ListOneOrMoreMatchesNumPlayers (const struct Match *Match);
|
||||||
static void Mch_ListOneOrMoreMatchesStatus (const struct Match *Match,unsigned NumQsts);
|
static void Mch_ListOneOrMoreMatchesStatus (const struct Match *Match,unsigned NumQsts);
|
||||||
static void Mch_ListOneOrMoreMatchesResult (const struct Match *Match);
|
static void Mch_ListOneOrMoreMatchesResult (const struct Match *Match);
|
||||||
|
|
||||||
|
static bool Mch_GetIfShowUsrResults (long MchCod);
|
||||||
|
|
||||||
static void Mch_GetMatchDataFromRow (MYSQL_RES *mysql_res,
|
static void Mch_GetMatchDataFromRow (MYSQL_RES *mysql_res,
|
||||||
struct Match *Match);
|
struct Match *Match);
|
||||||
static Mch_Showing_t Mch_GetShowingFromStr (const char *Str);
|
static Mch_Showing_t Mch_GetShowingFromStr (const char *Str);
|
||||||
|
@ -222,7 +224,7 @@ static void Mch_DrawBarNumUsrs (unsigned NumAnswerersAns,unsigned NumAnswerersQs
|
||||||
|
|
||||||
static void Mch_ShowHeaderMchResults (void);
|
static void Mch_ShowHeaderMchResults (void);
|
||||||
static void Mch_ShowMchResults (Usr_MeOrOther_t MeOrOther);
|
static void Mch_ShowMchResults (Usr_MeOrOther_t MeOrOther);
|
||||||
static void Mch_ShowMchResultsSummaryRow (bool ItsMe,
|
static void Mch_ShowMchResultsSummaryRow (bool ShowSummaryResults,
|
||||||
unsigned NumResults,
|
unsigned NumResults,
|
||||||
unsigned NumTotalQsts,
|
unsigned NumTotalQsts,
|
||||||
unsigned NumTotalQstsNotBlank,
|
unsigned NumTotalQstsNotBlank,
|
||||||
|
@ -790,6 +792,42 @@ void Mch_ToggleVisibilResultsMchUsr (void)
|
||||||
false); // Do not put form to start new match
|
false); // Do not put form to start new match
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************* Get visibility of match result ************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static bool Mch_GetIfShowUsrResults (long MchCod)
|
||||||
|
{
|
||||||
|
MYSQL_RES *mysql_res;
|
||||||
|
MYSQL_ROW row;
|
||||||
|
unsigned long NumRows;
|
||||||
|
bool ShowUsrResults;
|
||||||
|
|
||||||
|
/***** Get data of match from database *****/
|
||||||
|
NumRows = (unsigned) DB_QuerySELECT (&mysql_res,"can not get if show result",
|
||||||
|
"SELECT ShowUsrResults" // row[0]
|
||||||
|
" FROM mch_matches"
|
||||||
|
" WHERE MchCod=%ld"
|
||||||
|
" AND GamCod IN" // Extra check
|
||||||
|
" (SELECT GamCod FROM gam_games"
|
||||||
|
" WHERE CrsCod='%ld')",
|
||||||
|
MchCod,
|
||||||
|
Gbl.Hierarchy.Crs.CrsCod);
|
||||||
|
if (NumRows) // Match found...
|
||||||
|
{
|
||||||
|
/* Get whether to show user results or not (row(0)) */
|
||||||
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
ShowUsrResults = (row[0][0] == 'Y');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ShowUsrResults = false;
|
||||||
|
|
||||||
|
/***** Free structure that stores the query result *****/
|
||||||
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
||||||
|
return ShowUsrResults;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************** Get game data from a database row **********************/
|
/******************** Get game data from a database row **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -855,7 +893,7 @@ static void Mch_GetMatchDataFromRow (MYSQL_RES *mysql_res,
|
||||||
/* Get whether to show question results or not (row(9)) */
|
/* Get whether to show question results or not (row(9)) */
|
||||||
Match->Status.ShowQstResults = (row[9][0] == 'Y');
|
Match->Status.ShowQstResults = (row[9][0] == 'Y');
|
||||||
|
|
||||||
/* Get whether to show question results or not (row(10)) */
|
/* Get whether to show user results or not (row(10)) */
|
||||||
Match->Status.ShowUsrResults = (row[10][0] == 'Y');
|
Match->Status.ShowUsrResults = (row[10][0] == 'Y');
|
||||||
|
|
||||||
/***** Get whether the match is being played or not *****/
|
/***** Get whether the match is being played or not *****/
|
||||||
|
@ -3154,10 +3192,13 @@ static void Mch_ShowMchResults (Usr_MeOrOther_t MeOrOther)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Today;
|
extern const char *Txt_Today;
|
||||||
extern const char *Txt_Match_result;
|
extern const char *Txt_Match_result;
|
||||||
|
extern const char *Txt_Hidden_result;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
struct UsrData *UsrDat;
|
struct UsrData *UsrDat;
|
||||||
bool ItsMe;
|
bool ItsMe;
|
||||||
|
bool ShowResultThisMatch;
|
||||||
|
bool ShowSummaryResults = true;
|
||||||
unsigned NumResults;
|
unsigned NumResults;
|
||||||
unsigned NumResult;
|
unsigned NumResult;
|
||||||
static unsigned UniqueId = 0;
|
static unsigned UniqueId = 0;
|
||||||
|
@ -3175,7 +3216,6 @@ static void Mch_ShowMchResults (Usr_MeOrOther_t MeOrOther)
|
||||||
/***** Set user *****/
|
/***** Set user *****/
|
||||||
UsrDat = (MeOrOther == Usr_ME) ? &Gbl.Usrs.Me.UsrDat :
|
UsrDat = (MeOrOther == Usr_ME) ? &Gbl.Usrs.Me.UsrDat :
|
||||||
&Gbl.Usrs.Other.UsrDat;
|
&Gbl.Usrs.Other.UsrDat;
|
||||||
ItsMe = Usr_ItsMe (UsrDat->UsrCod);
|
|
||||||
|
|
||||||
/***** Make database query *****/
|
/***** Make database query *****/
|
||||||
NumResults =
|
NumResults =
|
||||||
|
@ -3216,6 +3256,30 @@ static void Mch_ShowMchResults (Usr_MeOrOther_t MeOrOther)
|
||||||
if ((MchCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
|
if ((MchCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
|
||||||
Lay_ShowErrorAndExit ("Wrong code of match.");
|
Lay_ShowErrorAndExit ("Wrong code of match.");
|
||||||
|
|
||||||
|
/* Show results? */
|
||||||
|
switch (Gbl.Usrs.Me.Role.Logged)
|
||||||
|
{
|
||||||
|
case Rol_STD:
|
||||||
|
ItsMe = Usr_ItsMe (UsrDat->UsrCod);
|
||||||
|
if (ItsMe && Gbl.Test.Config.Feedback != Tst_FEEDBACK_NOTHING)
|
||||||
|
ShowResultThisMatch = Mch_GetIfShowUsrResults (MchCod);
|
||||||
|
else
|
||||||
|
ShowResultThisMatch = false;
|
||||||
|
break;
|
||||||
|
case Rol_NET:
|
||||||
|
case Rol_TCH:
|
||||||
|
case Rol_DEG_ADM:
|
||||||
|
case Rol_CTR_ADM:
|
||||||
|
case Rol_INS_ADM:
|
||||||
|
case Rol_SYS_ADM:
|
||||||
|
ShowResultThisMatch = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ShowResultThisMatch = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ShowSummaryResults = ShowSummaryResults && ShowResultThisMatch;
|
||||||
|
|
||||||
if (NumResult)
|
if (NumResult)
|
||||||
fprintf (Gbl.F.Out,"<tr>");
|
fprintf (Gbl.F.Out,"<tr>");
|
||||||
|
|
||||||
|
@ -3250,12 +3314,15 @@ static void Mch_ShowMchResults (Usr_MeOrOther_t MeOrOther)
|
||||||
NumQstsNotBlankInThisResult = 0;
|
NumQstsNotBlankInThisResult = 0;
|
||||||
NumTotalQstsNotBlank += NumQstsNotBlankInThisResult;
|
NumTotalQstsNotBlank += NumQstsNotBlankInThisResult;
|
||||||
|
|
||||||
/* Get score (row[5]) */
|
if (ShowResultThisMatch)
|
||||||
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
|
{
|
||||||
if (sscanf (row[5],"%lf",&ScoreInThisResult) != 1)
|
/* Get score (row[5]) */
|
||||||
ScoreInThisResult = 0.0;
|
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
|
||||||
Str_SetDecimalPointToLocal (); // Return to local system
|
if (sscanf (row[5],"%lf",&ScoreInThisResult) != 1)
|
||||||
TotalScoreOfAllResults += ScoreInThisResult;
|
ScoreInThisResult = 0.0;
|
||||||
|
Str_SetDecimalPointToLocal (); // Return to local system
|
||||||
|
TotalScoreOfAllResults += ScoreInThisResult;
|
||||||
|
}
|
||||||
|
|
||||||
/* Write number of questions */
|
/* Write number of questions */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%u</td>",
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%u</td>",
|
||||||
|
@ -3266,44 +3333,61 @@ static void Mch_ShowMchResults (Usr_MeOrOther_t MeOrOther)
|
||||||
ClassDat,Gbl.RowEvenOdd,NumQstsNotBlankInThisResult);
|
ClassDat,Gbl.RowEvenOdd,NumQstsNotBlankInThisResult);
|
||||||
|
|
||||||
/* Write score */
|
/* Write score */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%.2lf</td>",
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
|
||||||
ClassDat,Gbl.RowEvenOdd,ScoreInThisResult);
|
ClassDat,Gbl.RowEvenOdd);
|
||||||
|
if (ShowResultThisMatch)
|
||||||
|
fprintf (Gbl.F.Out,"%.2lf",
|
||||||
|
ScoreInThisResult);
|
||||||
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/* Write average score per question */
|
/* Write average score per question */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%.2lf</td>",
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
|
||||||
ClassDat,Gbl.RowEvenOdd,
|
ClassDat,Gbl.RowEvenOdd);
|
||||||
NumQstsInThisResult ? ScoreInThisResult / (double) NumQstsInThisResult :
|
if (ShowResultThisMatch)
|
||||||
0.0);
|
fprintf (Gbl.F.Out,"%.2lf",
|
||||||
|
NumQstsInThisResult ? ScoreInThisResult / (double) NumQstsInThisResult :
|
||||||
|
0.0);
|
||||||
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/* Write score over Tst_SCORE_MAX */
|
/* Write score over Tst_SCORE_MAX */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%.2lf</td>",
|
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">",
|
||||||
ClassDat,Gbl.RowEvenOdd,
|
ClassDat,Gbl.RowEvenOdd);
|
||||||
NumQstsInThisResult ? ScoreInThisResult * Tst_SCORE_MAX / (double) NumQstsInThisResult :
|
if (ShowResultThisMatch)
|
||||||
0.0);
|
fprintf (Gbl.F.Out,"%.2lf",
|
||||||
|
NumQstsInThisResult ? ScoreInThisResult * Tst_SCORE_MAX / (double) NumQstsInThisResult :
|
||||||
|
0.0);
|
||||||
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/* Link to show this result */
|
/* Link to show this result */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"RIGHT_TOP COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"RIGHT_TOP COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
switch (MeOrOther)
|
if (ShowResultThisMatch)
|
||||||
{
|
{
|
||||||
case Usr_ME:
|
switch (MeOrOther)
|
||||||
Frm_StartForm (ActSeeOneMchResMe);
|
{
|
||||||
Mch_PutParamMchCod (MchCod);
|
case Usr_ME:
|
||||||
break;
|
Frm_StartForm (ActSeeOneMchResMe);
|
||||||
case Usr_OTHER:
|
Mch_PutParamMchCod (MchCod);
|
||||||
Frm_StartForm (ActSeeOneMchResOth);
|
break;
|
||||||
Mch_PutParamMchCod (MchCod);
|
case Usr_OTHER:
|
||||||
Usr_PutParamOtherUsrCodEncrypted ();
|
Frm_StartForm (ActSeeOneMchResOth);
|
||||||
break;
|
Mch_PutParamMchCod (MchCod);
|
||||||
|
Usr_PutParamOtherUsrCodEncrypted ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Ico_PutIconLink ("tasks.svg",Txt_Match_result);
|
||||||
|
Frm_EndForm ();
|
||||||
}
|
}
|
||||||
Ico_PutIconLink ("tasks.svg",Txt_Match_result);
|
else
|
||||||
Frm_EndForm ();
|
Ico_PutIconOff ("eye-slash.svg",Txt_Hidden_result);
|
||||||
fprintf (Gbl.F.Out,"</td>"
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
"</tr>");
|
|
||||||
|
fprintf (Gbl.F.Out,"</tr>");
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Write totals for this user *****/
|
/***** Write totals for this user *****/
|
||||||
Mch_ShowMchResultsSummaryRow (ItsMe,NumResults,
|
Mch_ShowMchResultsSummaryRow (ShowSummaryResults,
|
||||||
|
NumResults,
|
||||||
NumTotalQsts,NumTotalQstsNotBlank,
|
NumTotalQsts,NumTotalQstsNotBlank,
|
||||||
TotalScoreOfAllResults);
|
TotalScoreOfAllResults);
|
||||||
}
|
}
|
||||||
|
@ -3323,36 +3407,13 @@ static void Mch_ShowMchResults (Usr_MeOrOther_t MeOrOther)
|
||||||
/************** Show row with summary of user's matches results **************/
|
/************** Show row with summary of user's matches results **************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Mch_ShowMchResultsSummaryRow (bool ItsMe,
|
static void Mch_ShowMchResultsSummaryRow (bool ShowSummaryResults,
|
||||||
unsigned NumResults,
|
unsigned NumResults,
|
||||||
unsigned NumTotalQsts,
|
unsigned NumTotalQsts,
|
||||||
unsigned NumTotalQstsNotBlank,
|
unsigned NumTotalQstsNotBlank,
|
||||||
double TotalScoreOfAllResults)
|
double TotalScoreOfAllResults)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Matches;
|
extern const char *Txt_Matches;
|
||||||
bool ICanViewTotalScore;
|
|
||||||
|
|
||||||
switch (Gbl.Usrs.Me.Role.Logged)
|
|
||||||
{
|
|
||||||
case Rol_STD:
|
|
||||||
ICanViewTotalScore = 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:
|
|
||||||
ICanViewTotalScore = ItsMe ||
|
|
||||||
NumResults;
|
|
||||||
break;
|
|
||||||
case Rol_SYS_ADM:
|
|
||||||
ICanViewTotalScore = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ICanViewTotalScore = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Start row *****/
|
/***** Start row *****/
|
||||||
fprintf (Gbl.F.Out,"<tr>");
|
fprintf (Gbl.F.Out,"<tr>");
|
||||||
|
@ -3382,14 +3443,14 @@ static void Mch_ShowMchResultsSummaryRow (bool ItsMe,
|
||||||
/***** Write total score *****/
|
/***** Write total score *****/
|
||||||
fprintf (Gbl.F.Out,"<td class=\"DAT_N_LINE_TOP RIGHT_MIDDLE COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"DAT_N_LINE_TOP RIGHT_MIDDLE COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
if (ICanViewTotalScore)
|
if (ShowSummaryResults)
|
||||||
fprintf (Gbl.F.Out,"%.2lf",TotalScoreOfAllResults);
|
fprintf (Gbl.F.Out,"%.2lf",TotalScoreOfAllResults);
|
||||||
fprintf (Gbl.F.Out,"</td>");
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/***** Write average score per question *****/
|
/***** Write average score per question *****/
|
||||||
fprintf (Gbl.F.Out,"<td class=\"DAT_N_LINE_TOP RIGHT_MIDDLE COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"DAT_N_LINE_TOP RIGHT_MIDDLE COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
if (ICanViewTotalScore)
|
if (ShowSummaryResults)
|
||||||
fprintf (Gbl.F.Out,"%.2lf",
|
fprintf (Gbl.F.Out,"%.2lf",
|
||||||
NumTotalQsts ? TotalScoreOfAllResults / (double) NumTotalQsts :
|
NumTotalQsts ? TotalScoreOfAllResults / (double) NumTotalQsts :
|
||||||
0.0);
|
0.0);
|
||||||
|
@ -3398,7 +3459,7 @@ static void Mch_ShowMchResultsSummaryRow (bool ItsMe,
|
||||||
/***** Write score over Tst_SCORE_MAX *****/
|
/***** Write score over Tst_SCORE_MAX *****/
|
||||||
fprintf (Gbl.F.Out,"<td class=\"DAT_N_LINE_TOP RIGHT_MIDDLE COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"DAT_N_LINE_TOP RIGHT_MIDDLE COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
if (ICanViewTotalScore)
|
if (ShowSummaryResults)
|
||||||
fprintf (Gbl.F.Out,"%.2lf",
|
fprintf (Gbl.F.Out,"%.2lf",
|
||||||
NumTotalQsts ? TotalScoreOfAllResults * Tst_SCORE_MAX /
|
NumTotalQsts ? TotalScoreOfAllResults * Tst_SCORE_MAX /
|
||||||
(double) NumTotalQsts :
|
(double) NumTotalQsts :
|
||||||
|
|
Loading…
Reference in New Issue
Block a user