Version19.8.2

This commit is contained in:
Antonio Cañas Vargas 2019-09-22 19:50:24 +02:00
parent 138b24327c
commit 1f02939f6c
7 changed files with 216 additions and 264 deletions

View File

@ -468,10 +468,11 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.8.1 (2019-09-22)"
#define Log_PLATFORM_VERSION "SWAD 19.8.2 (2019-09-22)"
#define CSS_FILE "swad19.3.css"
#define JS_FILE "swad18.130.2.js"
/*
Version 19.8.2: Sep 22, 2019 View matches results. Not finished. (245429 lines)
Version 19.8.1: Sep 22, 2019 View matches results. Not finished. (245474 lines)
Version 19.8: Sep 22, 2019 View matches results. Not finished.
Help links related to test and match results changed. (245412 lines)

View File

@ -414,12 +414,12 @@ void Gam_ShowOneGame (long GamCod,
if (!ShowOnlyThisGame)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">");
if (Game.TimeUTC[Gam_START_TIME])
if (Game.TimeUTC[Dat_START_TIME])
fprintf (Gbl.F.Out,"<script type=\"text/javascript\">"
"writeLocalDateHMSFromUTC('gam_date_start_%u',%ld,"
"%u,'<br />','%s',true,true,0x7);"
"</script>",
UniqueId,Game.TimeUTC[Gam_START_TIME],
UniqueId,Game.TimeUTC[Dat_START_TIME],
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
fprintf (Gbl.F.Out,"</td>");
@ -431,12 +431,12 @@ void Gam_ShowOneGame (long GamCod,
if (!ShowOnlyThisGame)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">");
if (Game.TimeUTC[Gam_END_TIME])
if (Game.TimeUTC[Dat_END_TIME])
fprintf (Gbl.F.Out,"<script type=\"text/javascript\">"
"writeLocalDateHMSFromUTC('gam_date_end_%u',%ld,"
"%u,'<br />','%s',false,true,0x7);"
"</script>",
UniqueId,Game.TimeUTC[Gam_END_TIME],
UniqueId,Game.TimeUTC[Dat_END_TIME],
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
fprintf (Gbl.F.Out,"</td>");
@ -759,10 +759,10 @@ void Gam_GetDataOfGameByCod (struct Game *Game)
row = mysql_fetch_row (mysql_res);
/* Get start date (row[0] holds the start UTC time) */
Game->TimeUTC[Gam_START_TIME] = Dat_GetUNIXTimeFromStr (row[0]);
Game->TimeUTC[Dat_START_TIME] = Dat_GetUNIXTimeFromStr (row[0]);
/* Get end date (row[1] holds the end UTC time) */
Game->TimeUTC[Gam_END_TIME ] = Dat_GetUNIXTimeFromStr (row[1]);
Game->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[1]);
}
/* Free structure that stores the query result */
@ -770,8 +770,8 @@ void Gam_GetDataOfGameByCod (struct Game *Game)
}
else
{
Game->TimeUTC[Gam_START_TIME] =
Game->TimeUTC[Gam_END_TIME ] = (time_t) 0;
Game->TimeUTC[Dat_START_TIME] =
Game->TimeUTC[Dat_END_TIME ] = (time_t) 0;
}
}
@ -1031,8 +1031,8 @@ void Gam_RequestCreatOrEditGame (void)
/* Initialize to empty game */
Game.GamCod = -1L;
Game.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
Game.TimeUTC[Gam_START_TIME] = (time_t) 0;
Game.TimeUTC[Gam_END_TIME ] = (time_t) 0;
Game.TimeUTC[Dat_START_TIME] = (time_t) 0;
Game.TimeUTC[Dat_END_TIME ] = (time_t) 0;
Game.Title[0] = '\0';
Game.NumQsts = 0;
Game.Status.Visible = true;

View File

@ -27,6 +27,7 @@
/********************************* Headers ***********************************/
/*****************************************************************************/
#include "swad_date.h"
#include "swad_scope.h"
/*****************************************************************************/
@ -36,19 +37,12 @@
#define Gam_MAX_CHARS_TITLE (128 - 1) // 127
#define Gam_MAX_BYTES_TITLE ((Gam_MAX_CHARS_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Gam_NUM_DATES 2
typedef enum
{
Gam_START_TIME = 0,
Gam_END_TIME = 1,
} Gam_StartOrEndTime_t;
struct Game
{
long GamCod; // Game code
long UsrCod; // Author code
char Title[Gam_MAX_BYTES_TITLE + 1];
time_t TimeUTC[Gam_NUM_DATES];
time_t TimeUTC[Dat_NUM_START_END_TIME];
unsigned NumQsts; // Number of questions in the game
struct
{

View File

@ -84,7 +84,7 @@ struct Match
long MchCod;
long GamCod;
long UsrCod;
time_t TimeUTC[2];
time_t TimeUTC[Dat_NUM_START_END_TIME];
char Title[Gam_MAX_BYTES_TITLE + 1];
struct
{
@ -200,8 +200,7 @@ static void Mch_DrawBarNumUsrs (unsigned NumAnswerersAns,unsigned NumAnswerersQs
static void Mch_ShowHeaderMchResults (void);
static void Mch_ShowMchResults (struct UsrData *UsrDat);
static void Mch_GetMatchResultDataByMchCod (long MchResCod,
time_t *StartTimeUTC,
time_t *EndTimeUTC,
time_t TimeUTC[Dat_NUM_START_END_TIME],
unsigned *NumQsts,
unsigned *NumQstsNotBlank,
double *Score);
@ -299,6 +298,7 @@ static void Mch_GetDataOfMatchByCod (struct Match *Match)
{
MYSQL_RES *mysql_res;
unsigned long NumRows;
Dat_StartEndTime_t StartEndTime;
/***** Get data of match from database *****/
NumRows = (unsigned) DB_QuerySELECT (&mysql_res,"can not get matches",
@ -328,8 +328,10 @@ static void Mch_GetDataOfMatchByCod (struct Match *Match)
Match->MchCod = -1L;
Match->GamCod = -1L;
Match->UsrCod = -1L;
Match->TimeUTC[Gam_START_TIME] =
Match->TimeUTC[Gam_END_TIME ] = (time_t) 0;
for (StartEndTime = (Dat_StartEndTime_t) 0;
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
StartEndTime++)
Match->TimeUTC[StartEndTime] = (time_t) 0;
Match->Title[0] = '\0';
Match->Status.QstInd = 0;
Match->Status.QstCod = -1L;
@ -376,6 +378,7 @@ static void Mch_ListOneOrMoreMatches (struct Game *Game,
unsigned NumMatch;
unsigned UniqueId;
struct Match Match;
Dat_StartEndTime_t StartEndTime;
/***** Write the heading *****/
Tbl_StartTableWideMargin (2);
@ -443,36 +446,26 @@ static void Mch_ListOneOrMoreMatches (struct Game *Game,
Usr_WriteAuthor1Line (Match.UsrCod,false);
fprintf (Gbl.F.Out,"</td>");
/***** Start date/time *****/
fprintf (Gbl.F.Out,"<td id=\"mch_date_start_%u\""
" class=\"%s LEFT_TOP COLOR%u\">",
UniqueId,
Match.Status.QstInd >= Mch_AFTER_LAST_QUESTION ? "DATE_RED" :
"DATE_GREEN",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<script type=\"text/javascript\">"
"writeLocalDateHMSFromUTC('mch_date_start_%u',%ld,"
"%u,'<br />','%s',true,true,0x7);"
"</script>"
"</td>",
UniqueId,Match.TimeUTC[Gam_START_TIME],
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
/***** End date/time *****/
fprintf (Gbl.F.Out,"<td id=\"mch_date_end_%u\""
" class=\"%s LEFT_TOP COLOR%u\">",
UniqueId,
Match.Status.QstInd >= Mch_AFTER_LAST_QUESTION ? "DATE_RED" :
"DATE_GREEN",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">"
"<script type=\"text/javascript\">"
"writeLocalDateHMSFromUTC('mch_date_end_%u',%ld,"
"%u,'<br />','%s',false,true,0x7);"
"</script>"
"</td>",
UniqueId,Match.TimeUTC[Gam_END_TIME],
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
/***** Start/end date/time *****/
for (StartEndTime = (Dat_StartEndTime_t) 0;
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
StartEndTime++)
{
fprintf (Gbl.F.Out,"<td id=\"mch_time_%u_%u\""
" class=\"%s LEFT_TOP COLOR%u\">",
(unsigned) StartEndTime,UniqueId,
Match.Status.QstInd >= Mch_AFTER_LAST_QUESTION ? "DATE_RED" :
"DATE_GREEN",
Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"<script type=\"text/javascript\">"
"writeLocalDateHMSFromUTC('mch_time_%u_%u',"
"%ld,%u,'<br />','%s',true,true,0x7);"
"</script>"
"</td>",
(unsigned) StartEndTime,UniqueId,
Match.TimeUTC[StartEndTime],
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
}
/***** Title and groups *****/
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",Gbl.RowEvenOdd);
@ -611,6 +604,7 @@ static void Mch_GetMatchDataFromRow (MYSQL_RES *mysql_res,
struct Match *Match)
{
MYSQL_ROW row;
Dat_StartEndTime_t StartEndTime;
/***** Get match data *****/
row = mysql_fetch_row (mysql_res);
@ -634,11 +628,11 @@ static void Mch_GetMatchDataFromRow (MYSQL_RES *mysql_res,
/* Get match teacher (row[2]) */
Match->UsrCod = Str_ConvertStrCodToLongCod (row[2]);
/* Get start date (row[3] holds the start UTC time) */
Match->TimeUTC[Gam_START_TIME] = Dat_GetUNIXTimeFromStr (row[3]);
/* Get end date (row[4] holds the end UTC time) */
Match->TimeUTC[Gam_END_TIME ] = Dat_GetUNIXTimeFromStr (row[4]);
/* Get start/end times (row[3], row[4] hold start/end UTC times) */
for (StartEndTime = (Dat_StartEndTime_t) 0;
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
StartEndTime++)
Match->TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[3 + StartEndTime]);
/* Get the title of the game (row[5]) */
if (row[5])
@ -2741,181 +2735,142 @@ static void Mch_ShowMchResults (struct UsrData *UsrDat)
extern const char *Txt_View_test;
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumExams;
unsigned NumTest;
unsigned NumResults;
unsigned NumResult;
static unsigned UniqueId = 0;
long TstCod;
unsigned NumQstsInThisTest;
unsigned NumQstsNotBlankInThisTest;
long MchResCod;
long MchCod;
Dat_StartEndTime_t StartEndTime;
unsigned NumQstsInThisResult;
unsigned NumQstsNotBlankInThisResult;
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;
double ScoreInThisResult;
double TotalScoreOfAllResults = 0.0;
time_t TimeUTC[Dat_NUM_START_END_TIME];
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,
NumResults =
(unsigned) DB_QuerySELECT (&mysql_res,"can not get matches results of a user",
"SELECT mch_results.MchResCod," // row[0]
"mch_results.MchCod," // row[1]
"UNIX_TIMESTAMP(mch_matches.StartTime)," // row[2]
"UNIX_TIMESTAMP(mch_matches.EndTime)," // row[3]
"mch_results.NumQsts," // row[4]
"mch_results.NumQstsNotBlank," // row[5]
"mch_results.Score" // row[6]
" FROM mch_results,mch_matches,gam_games"
" WHERE mch_results.UsrCod=%ld"
" AND mch_results.MchCod=mch_matches.MchCod"
" AND mch_matches.GamCod=gam_games.GamCod"
" AND gam_games.CrsCod=%ld" // Extra check
" AND mch_matches.EndTime>=FROM_UNIXTIME(%ld)"
" AND mch_matches.StartTime<=FROM_UNIXTIME(%ld)"
" ORDER BY MchResCod",
UsrDat->UsrCod,
(long) Gbl.DateRange.TimeUTC[0],
(long) Gbl.DateRange.TimeUTC[1]);
Gbl.Hierarchy.Crs.CrsCod,
(long) Gbl.DateRange.TimeUTC[Dat_START_TIME],
(long) Gbl.DateRange.TimeUTC[Dat_END_TIME]);
/***** Show user's data *****/
fprintf (Gbl.F.Out,"<tr>");
// Tst_ShowDataUsr (UsrDat,NumExams); // TODO: Change to matches results
Usr_ShowTableCellWithUsrData (UsrDat,NumResults);
/***** Get and print test results *****/
if (NumExams)
if (NumResults)
{
for (NumTest = 0;
NumTest < NumExams;
NumTest++)
for (NumResult = 0;
NumResult < NumResults;
NumResult++)
{
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 match result code (row[0]) */
if ((MchResCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
Lay_ShowErrorAndExit ("Wrong code of 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";
/* Get match code (row[1]) */
if ((MchCod = Str_ConvertStrCodToLongCod (row[1])) < 0)
Lay_ShowErrorAndExit ("Wrong code of match.");
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)
if (NumResult)
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,',&nbsp;','%s',true,false,0x7);"
"</script>"
"</td>",
UniqueId,ClassDat,Gbl.RowEvenOdd,
UniqueId,(long) TimeUTC,
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
/* Write start/end times (row[2], row[3] hold UTC start/end times) */
for (StartEndTime = (Dat_StartEndTime_t) 0;
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
StartEndTime++)
{
TimeUTC[0] = Dat_GetUNIXTimeFromStr (row[2 + StartEndTime]);
UniqueId++;
fprintf (Gbl.F.Out,"<td id =\"mch_time_%u_%u\""
" class=\"%s RIGHT_TOP COLOR%u\">"
"<script type=\"text/javascript\">"
"writeLocalDateHMSFromUTC('mch_time_%u_%u',"
"%ld,%u,',&nbsp;','%s',true,false,0x7);"
"</script>"
"</td>",
(unsigned) StartEndTime,UniqueId,
ClassDat,Gbl.RowEvenOdd,
(unsigned) StartEndTime,UniqueId,
(long) TimeUTC[StartEndTime],
(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
}
/* Get number of questions (row[3]) */
if (sscanf (row[3],"%u",&NumQstsInThisTest) != 1)
NumQstsInThisTest = 0;
/* Get number of questions (row[4]) */
if (sscanf (row[4],"%u",&NumQstsInThisResult) != 1)
NumQstsInThisResult = 0;
if (Gbl.Test.AllowTeachers)
NumTotalQsts += NumQstsInThisTest;
NumTotalQsts += NumQstsInThisResult;
/* Get number of questions not blank (row[4]) */
if (sscanf (row[4],"%u",&NumQstsNotBlankInThisTest) != 1)
NumQstsNotBlankInThisTest = 0;
/* Get number of questions not blank (row[5]) */
if (sscanf (row[5],"%u",&NumQstsNotBlankInThisResult) != 1)
NumQstsNotBlankInThisResult = 0;
if (Gbl.Test.AllowTeachers)
NumTotalQstsNotBlank += NumQstsNotBlankInThisTest;
NumTotalQstsNotBlank += NumQstsNotBlankInThisResult;
/* Get score (row[5]) */
/* Get score (row[6]) */
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
if (sscanf (row[5],"%lf",&ScoreInThisTest) != 1)
ScoreInThisTest = 0.0;
if (sscanf (row[6],"%lf",&ScoreInThisResult) != 1)
ScoreInThisResult = 0.0;
Str_SetDecimalPointToLocal (); // Return to local system
if (Gbl.Test.AllowTeachers)
TotalScoreOfAllTests += ScoreInThisTest;
TotalScoreOfAllResults += ScoreInThisResult;
/* 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>");
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%u</td>",
ClassDat,Gbl.RowEvenOdd,NumQstsInThisResult);
/* 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>");
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%u</td>",
ClassDat,Gbl.RowEvenOdd,NumQstsNotBlankInThisResult);
/* 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>");
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%.2lf</td>",
ClassDat,Gbl.RowEvenOdd,ScoreInThisResult);
/* 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>");
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%.2lf</td>",
ClassDat,Gbl.RowEvenOdd,
NumQstsInThisResult ? ScoreInThisResult / (double) NumQstsInThisResult :
0.0);
/* 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>");
fprintf (Gbl.F.Out,"<td class=\"%s RIGHT_TOP COLOR%u\">%.2lf</td>",
ClassDat,Gbl.RowEvenOdd,
NumQstsInThisResult ? ScoreInThisResult * Tst_SCORE_MAX / (double) NumQstsInThisResult :
0.0);
/* 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 ();
}
Frm_StartForm (Gbl.Action.Act == ActSeeMyMchRes ? ActSeeOneMchResMe :
ActSeeOneMchResOth);
// 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 *****/
@ -2962,8 +2917,7 @@ void Mch_ShowOneMchResult (void)
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
time_t TimeUTC[Dat_NUM_START_END_TIME]; // Match result UTC date-time
unsigned NumQstsNotBlank;
double TotalScore;
bool ShowPhoto;
@ -2978,8 +2932,7 @@ void Mch_ShowOneMchResult (void)
/***** Get test result data *****/
Mch_GetMatchResultDataByMchCod (MchResCod,
&StartTimeUTC,
&EndTimeUTC,
TimeUTC,
&Gbl.Test.NumQsts,
&NumQstsNotBlank,
&TotalScore);
@ -3096,8 +3049,8 @@ void Mch_ShowOneMchResult (void)
"</td>"
"</tr>",
Txt_Date,
StartTimeUTC,(unsigned) Gbl.Prefs.DateFormat,Txt_Today,
EndTimeUTC ,(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
TimeUTC[Dat_START_TIME],(unsigned) Gbl.Prefs.DateFormat,Txt_Today,
TimeUTC[Dat_END_TIME],(unsigned) Gbl.Prefs.DateFormat,Txt_Today);
/* Number of questions */
fprintf (Gbl.F.Out,"<tr>"
@ -3151,14 +3104,14 @@ void Mch_ShowOneMchResult (void)
/*****************************************************************************/
static void Mch_GetMatchResultDataByMchCod (long MchResCod,
time_t *StartTimeUTC,
time_t *EndTimeUTC,
time_t TimeUTC[Dat_NUM_START_END_TIME],
unsigned *NumQsts,
unsigned *NumQstsNotBlank,
double *Score)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
Dat_StartEndTime_t StartEndTime;
/***** Make database query *****/
if (DB_QuerySELECT (&mysql_res,"can not get data"
@ -3185,8 +3138,10 @@ static void Mch_GetMatchResultDataByMchCod (long MchResCod,
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]);
for (StartEndTime = (Dat_StartEndTime_t) 0;
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
StartEndTime++)
TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[1 + StartEndTime]);
/* Get number of questions (row[3]) */
if (sscanf (row[3],"%u",NumQsts) != 1)

View File

@ -290,7 +290,6 @@ static void Tst_StoreScoreOfTestResultInDB (long TstCod,
unsigned NumQstsNotBlank,double Score);
static void Tst_ShowHeaderTestResults (void);
static void Tst_ShowTstResults (struct UsrData *UsrDat);
static void Tst_ShowDataUsr (struct UsrData *UsrDat,unsigned NumExams);
static void Tst_PutParamTstCod (long TstCod);
static long Tst_GetParamTstCod (void);
static void Tst_ShowTestResultsSummaryRow (bool ItsMe,
@ -7654,7 +7653,7 @@ static void Tst_ShowTstResults (struct UsrData *UsrDat)
/***** Show user's data *****/
fprintf (Gbl.F.Out,"<tr>");
Tst_ShowDataUsr (UsrDat,NumExams);
Usr_ShowTableCellWithUsrData (UsrDat,NumExams);
/***** Get and print test results *****/
if (NumExams)
@ -7821,67 +7820,6 @@ static void Tst_ShowTstResults (struct UsrData *UsrDat)
Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd;
}
/*****************************************************************************/
/******************** Show a row with the data of a user *********************/
/*****************************************************************************/
static void Tst_ShowDataUsr (struct UsrData *UsrDat,unsigned NumExams)
{
bool ShowPhoto;
char PhotoURL[PATH_MAX + 1];
Act_Action_t NextAction;
/***** Show user's photo and name *****/
fprintf (Gbl.F.Out,"<td ");
if (NumExams)
fprintf (Gbl.F.Out,"rowspan=\"%u\"",NumExams + 1);
fprintf (Gbl.F.Out," class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (UsrDat,PhotoURL);
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
NULL,
"PHOTO45x60",Pho_ZOOM,false);
fprintf (Gbl.F.Out,"</td>");
/***** Start form to go to user's record card *****/
fprintf (Gbl.F.Out,"<td ");
if (NumExams)
fprintf (Gbl.F.Out,"rowspan=\"%u\"",NumExams + 1);
fprintf (Gbl.F.Out," class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
switch (UsrDat->Roles.InCurrentCrs.Role)
{
case Rol_STD:
NextAction = ActSeeRecOneStd;
break;
case Rol_NET:
case Rol_TCH:
NextAction = ActSeeRecOneTch;
break;
default:
NextAction = ActUnk;
Lay_ShowErrorAndExit ("Wrong role.");
break;
}
Frm_StartForm (NextAction);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
Frm_LinkFormSubmit (UsrDat->FullName,"AUTHOR_TXT",NULL);
/***** Show user's ID *****/
ID_WriteUsrIDs (UsrDat,NULL);
/***** Show user's name *****/
fprintf (Gbl.F.Out,"<br />%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
fprintf (Gbl.F.Out," %s",UsrDat->Surname2);
if (UsrDat->FirstName[0])
fprintf (Gbl.F.Out,",<br />%s",UsrDat->FirstName);
/***** End form *****/
Frm_EndForm ();
fprintf (Gbl.F.Out,"</td>");
}
/*****************************************************************************/
/******************** Write parameter with code of test **********************/
/*****************************************************************************/

View File

@ -9728,3 +9728,65 @@ void Usr_WriteAuthor1Line (long UsrCod,bool Hidden)
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
}
/*****************************************************************************/
/*************** Show a table cell with the data of a user *******************/
/*****************************************************************************/
void Usr_ShowTableCellWithUsrData (struct UsrData *UsrDat,unsigned NumRows)
{
bool ShowPhoto;
char PhotoURL[PATH_MAX + 1];
Act_Action_t NextAction;
/***** Show user's photo and name *****/
fprintf (Gbl.F.Out,"<td ");
if (NumRows)
fprintf (Gbl.F.Out,"rowspan=\"%u\"",NumRows + 1);
fprintf (Gbl.F.Out," class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (UsrDat,PhotoURL);
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
NULL,
"PHOTO45x60",Pho_ZOOM,false);
fprintf (Gbl.F.Out,"</td>");
/***** Start form to go to user's record card *****/
fprintf (Gbl.F.Out,"<td ");
if (NumRows)
fprintf (Gbl.F.Out,"rowspan=\"%u\"",NumRows + 1);
fprintf (Gbl.F.Out," class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
switch (UsrDat->Roles.InCurrentCrs.Role)
{
case Rol_STD:
NextAction = ActSeeRecOneStd;
break;
case Rol_NET:
case Rol_TCH:
NextAction = ActSeeRecOneTch;
break;
default:
NextAction = ActUnk;
Lay_ShowErrorAndExit ("Wrong role.");
break;
}
Frm_StartForm (NextAction);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
Frm_LinkFormSubmit (UsrDat->FullName,"AUTHOR_TXT",NULL);
/***** Show user's ID *****/
ID_WriteUsrIDs (UsrDat,NULL);
/***** Show user's name *****/
fprintf (Gbl.F.Out,"<br />%s",UsrDat->Surname1);
if (UsrDat->Surname2[0])
fprintf (Gbl.F.Out," %s",UsrDat->Surname2);
if (UsrDat->FirstName[0])
fprintf (Gbl.F.Out,",<br />%s",UsrDat->FirstName);
/***** End form *****/
Frm_EndForm ();
fprintf (Gbl.F.Out,"</td>");
}

View File

@ -480,4 +480,6 @@ void Usr_PrintUsrQRCode (void);
void Usr_WriteAuthor1Line (long UsrCod,bool Hidden);
void Usr_ShowTableCellWithUsrData (struct UsrData *UsrDat,unsigned NumRows);
#endif