mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-16 05:34:12 +02:00
Version 18.63.1
This commit is contained in:
parent
5758e3c7f6
commit
88c1e2ee24
|
@ -411,6 +411,8 @@ Antonio
|
||||||
|
|
||||||
// TODO: Chequear "Imagen no encontrada" en timeline. Mensaje de Víctor González Argudo
|
// TODO: Chequear "Imagen no encontrada" en timeline. Mensaje de Víctor González Argudo
|
||||||
|
|
||||||
|
// TODO: Comprobar "Error when getting publishing code from session." tras horas de inactividad.
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -430,10 +432,11 @@ En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
ps2pdf source.ps destination.pdf
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 18.63 (2019-03-02)"
|
#define Log_PLATFORM_VERSION "SWAD 18.63.1 (2019-03-03)"
|
||||||
#define CSS_FILE "swad18.61.css"
|
#define CSS_FILE "swad18.61.css"
|
||||||
#define JS_FILE "swad18.62.js"
|
#define JS_FILE "swad18.62.js"
|
||||||
/*
|
/*
|
||||||
|
Version 18.63.1: Mar 02, 2019 Allowing animated GIFs. Not finished. (238162 lines)
|
||||||
Version 18.63: Mar 02, 2019 Allowing animated GIFs. Not finished. (238125 lines)
|
Version 18.63: Mar 02, 2019 Allowing animated GIFs. Not finished. (238125 lines)
|
||||||
Rename the following directory:
|
Rename the following directory:
|
||||||
sudo mv /var/www/swad/img /var/www/swad/med
|
sudo mv /var/www/swad/img /var/www/swad/med
|
||||||
|
|
12
swad_forum.c
12
swad_forum.c
|
@ -511,13 +511,16 @@ static long For_InsertForumPst (long ThrCod,long UsrCod,
|
||||||
DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
|
DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
|
||||||
"INSERT INTO forum_post"
|
"INSERT INTO forum_post"
|
||||||
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
|
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
|
||||||
"Subject,Content,MediaName,MediaTitle,MediaURL)"
|
"Subject,Content,"
|
||||||
|
"MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,%ld,NOW(),NOW(),0,"
|
" (%ld,%ld,NOW(),NOW(),0,"
|
||||||
"'%s','%s','%s','%s','%s')",
|
"'%s','%s',"
|
||||||
|
"'%s','%s','%s','%s')",
|
||||||
ThrCod,UsrCod,
|
ThrCod,UsrCod,
|
||||||
Subject,Content,
|
Subject,Content,
|
||||||
Media->Name,
|
Media->Name,
|
||||||
|
Med_GetStringTypeForDB (Media->Type),
|
||||||
Media->Title ? Media->Title : "",
|
Media->Title ? Media->Title : "",
|
||||||
Media->URL ? Media->URL : "");
|
Media->URL ? Media->URL : "");
|
||||||
|
|
||||||
|
@ -1369,9 +1372,8 @@ static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
|
||||||
Str_Copy (Content,row[3],
|
Str_Copy (Content,row[3],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get media name (row[4]), type (row[5]),
|
/****** Get media data (row[4], row[5], row[6], row[7]) *****/
|
||||||
title (row[6]) and URL (row[7]) *****/
|
Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],Media);
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],Media);
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
12
swad_game.c
12
swad_game.c
|
@ -2923,13 +2923,12 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
|
||||||
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
|
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
|
||||||
fprintf (Gbl.F.Out,"</td>");
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/* Write the stem (row[2]), the image (row[4], row[5], row[6], row[7]),
|
/* Write stem (row[2]), media data (row[4], row[5], row[6], row[7]),
|
||||||
the feedback (row[3]) and the answers */
|
feedback (row[3]) and answers */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
Tst_WriteQstStem (row[2],"TEST_EDI");
|
Tst_WriteQstStem (row[2],"TEST_EDI");
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],
|
Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],&Gbl.Test.Media);
|
||||||
&Gbl.Test.Media);
|
|
||||||
Med_ShowMedia (&Gbl.Test.Media,
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
||||||
"TEST_IMG_EDIT_LIST_STEM");
|
"TEST_IMG_EDIT_LIST_STEM");
|
||||||
|
@ -3554,10 +3553,9 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
|
||||||
|
|
||||||
fprintf (Gbl.F.Out,"<div class=\"GAM_PLAY_QST_CONTAINER\">");
|
fprintf (Gbl.F.Out,"<div class=\"GAM_PLAY_QST_CONTAINER\">");
|
||||||
|
|
||||||
/* Write the stem (row[2]) and the image (row[3], row[4], row[5], row[6]) */
|
/* Write stem (row[2]) and media data (row[3], row[4], row[5], row[6]) */
|
||||||
Tst_WriteQstStem (row[2],"GAM_PLAY_QST");
|
Tst_WriteQstStem (row[2],"GAM_PLAY_QST");
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
|
Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],&Gbl.Test.Media);
|
||||||
&Gbl.Test.Media);
|
|
||||||
Med_ShowMedia (&Gbl.Test.Media,
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
||||||
"TEST_IMG_EDIT_LIST_STEM");
|
"TEST_IMG_EDIT_LIST_STEM");
|
||||||
|
|
48
swad_media.c
48
swad_media.c
|
@ -56,6 +56,8 @@ const char *Med_StringsTypeDB[Med_NUM_TYPES] =
|
||||||
"gif", // Med_GIF
|
"gif", // Med_GIF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define Med_MAX_SIZE_GIF (5UL * 1024UL * 1024UL) // 5 MiB
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Internal types *******************************/
|
/****************************** Internal types *******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -78,7 +80,7 @@ static Med_Action_t Med_GetMediaActionFromForm (const char *ParamAction);
|
||||||
static void Med_GetAndProcessFileFromForm (struct Media *Media,
|
static void Med_GetAndProcessFileFromForm (struct Media *Media,
|
||||||
const char *ParamFile);
|
const char *ParamFile);
|
||||||
|
|
||||||
static int Med_ProcessMedia (struct Media *Media,
|
static int Med_ConvertImage (struct Media *Media,
|
||||||
const char *FileNameOriginal,
|
const char *FileNameOriginal,
|
||||||
const char *FileNameProcessed);
|
const char *FileNameProcessed);
|
||||||
|
|
||||||
|
@ -152,11 +154,11 @@ void Med_FreeMediaURL (struct Media *Media)
|
||||||
/**** Get media name, title and URL from a query result and copy to struct ***/
|
/**** Get media name, title and URL from a query result and copy to struct ***/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Med_GetMediaNameTitleAndURLFromRow (const char *Name,
|
void Med_GetMediaDataFromRow (const char *Name,
|
||||||
const char *TypeStr,
|
const char *TypeStr,
|
||||||
const char *Title,
|
const char *Title,
|
||||||
const char *URL,
|
const char *URL,
|
||||||
struct Media *Media)
|
struct Media *Media)
|
||||||
{
|
{
|
||||||
size_t Length;
|
size_t Length;
|
||||||
|
|
||||||
|
@ -421,6 +423,7 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
|
||||||
const char *ParamFile)
|
const char *ParamFile)
|
||||||
{
|
{
|
||||||
extern const char *Txt_The_image_could_not_be_processed_successfully;
|
extern const char *Txt_The_image_could_not_be_processed_successfully;
|
||||||
|
extern const char *Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X;
|
||||||
struct Param *Param;
|
struct Param *Param;
|
||||||
char FileNameImgSrc[PATH_MAX + 1];
|
char FileNameImgSrc[PATH_MAX + 1];
|
||||||
char *PtrExtension;
|
char *PtrExtension;
|
||||||
|
@ -430,6 +433,7 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
|
||||||
char FileNameOrig[PATH_MAX + 1]; // Full name of original uploaded file
|
char FileNameOrig[PATH_MAX + 1]; // Full name of original uploaded file
|
||||||
char FileNameTmp[PATH_MAX + 1]; // Full name of temporary processed file
|
char FileNameTmp[PATH_MAX + 1]; // Full name of temporary processed file
|
||||||
struct stat FileStatus;
|
struct stat FileStatus;
|
||||||
|
char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
|
||||||
bool WrongType = false;
|
bool WrongType = false;
|
||||||
|
|
||||||
/***** Set media file status *****/
|
/***** Set media file status *****/
|
||||||
|
@ -502,18 +506,18 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
|
||||||
switch (Media->Type)
|
switch (Media->Type)
|
||||||
{
|
{
|
||||||
case Med_JPG:
|
case Med_JPG:
|
||||||
/***** Convert original media to temporary JPEG processed file
|
/***** Convert original media to temporary JPG processed file
|
||||||
by calling to program that makes the conversion *****/
|
by calling to program that makes the conversion *****/
|
||||||
snprintf (FileNameTmp,sizeof (FileNameTmp),
|
snprintf (FileNameTmp,sizeof (FileNameTmp),
|
||||||
"%s/%s/%s/%s.jpg",
|
"%s/%s/%s/%s.jpg",
|
||||||
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP,
|
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP,
|
||||||
Media->Name);
|
Media->Name);
|
||||||
if (Med_ProcessMedia (Media,FileNameOrig,FileNameTmp) == 0) // Return 0 on success
|
if (Med_ConvertImage (Media,FileNameOrig,FileNameTmp) == 0) // On success ==> 0 is returned
|
||||||
/* Success */
|
/* Success */
|
||||||
Media->Status = Med_FILE_PROCESSED;
|
Media->Status = Med_FILE_PROCESSED;
|
||||||
else // Error processing media
|
else // Error processing media
|
||||||
{
|
{
|
||||||
/* Error ==> remove temporary destination media file */
|
/* Remove temporary destination media file */
|
||||||
if (Fil_CheckIfPathExists (FileNameTmp))
|
if (Fil_CheckIfPathExists (FileNameTmp))
|
||||||
unlink (FileNameTmp);
|
unlink (FileNameTmp);
|
||||||
|
|
||||||
|
@ -526,15 +530,10 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
|
||||||
break;
|
break;
|
||||||
case Med_GIF:
|
case Med_GIF:
|
||||||
/***** Check size of media file *****/
|
/***** Check size of media file *****/
|
||||||
if (lstat (FileNameOrig,&FileStatus)) // On success ==> 0 is returned
|
if (lstat (FileNameOrig,&FileStatus) == 0) // On success ==> 0 is returned
|
||||||
{
|
{
|
||||||
// Error on lstat
|
/* Success */
|
||||||
/* Show error alert */
|
if (FileStatus.st_size <= (__off_t) Med_MAX_SIZE_GIF)
|
||||||
Ale_ShowAlert (Ale_ERROR,"Can not check gif file.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (FileStatus.st_size <= 5*1024*1024)
|
|
||||||
{
|
{
|
||||||
/***** Move original file to temporary file *****/
|
/***** Move original file to temporary file *****/
|
||||||
snprintf (FileNameTmp,sizeof (FileNameTmp),
|
snprintf (FileNameTmp,sizeof (FileNameTmp),
|
||||||
|
@ -542,13 +541,20 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
|
||||||
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP,
|
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP,
|
||||||
Media->Name);
|
Media->Name);
|
||||||
if (rename (FileNameOrig,FileNameTmp)) // Fail
|
if (rename (FileNameOrig,FileNameTmp)) // Fail
|
||||||
Ale_ShowAlert (Ale_ERROR,"No se puede cambiar el nombre..."); // TODO: Need translation!!!!
|
Ale_ShowAlert (Ale_ERROR,"Can not change file name.");
|
||||||
else // Success
|
else // Success
|
||||||
Media->Status = Med_FILE_PROCESSED;
|
Media->Status = Med_FILE_PROCESSED;
|
||||||
}
|
}
|
||||||
else
|
else // Size exceeded
|
||||||
Ale_ShowAlert (Ale_WARNING,"El tamaño del archivo excede el límite..."); // TODO: Need translation!!!!
|
{
|
||||||
|
Fil_WriteFileSizeBrief ((double) Med_MAX_SIZE_GIF,FileSizeStr);
|
||||||
|
Ale_ShowAlert (Ale_WARNING,Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X,
|
||||||
|
FileSizeStr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else // Error getting file data
|
||||||
|
/* Show error alert */
|
||||||
|
Ale_ShowAlert (Ale_ERROR,"Can not get file size.");
|
||||||
|
|
||||||
/***** Remove temporary original file *****/
|
/***** Remove temporary original file *****/
|
||||||
unlink (FileNameOrig);
|
unlink (FileNameOrig);
|
||||||
|
@ -565,7 +571,7 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
|
||||||
// Return 0 on success
|
// Return 0 on success
|
||||||
// Return != 0 on error
|
// Return != 0 on error
|
||||||
|
|
||||||
static int Med_ProcessMedia (struct Media *Media,
|
static int Med_ConvertImage (struct Media *Media,
|
||||||
const char *FileNameOriginal,
|
const char *FileNameOriginal,
|
||||||
const char *FileNameProcessed)
|
const char *FileNameProcessed)
|
||||||
{
|
{
|
||||||
|
|
10
swad_media.h
10
swad_media.h
|
@ -133,11 +133,11 @@ void Med_MediaDestructor (struct Media *Media);
|
||||||
void Med_FreeMediaTitle (struct Media *Media);
|
void Med_FreeMediaTitle (struct Media *Media);
|
||||||
void Med_FreeMediaURL (struct Media *Media);
|
void Med_FreeMediaURL (struct Media *Media);
|
||||||
|
|
||||||
void Med_GetMediaNameTitleAndURLFromRow (const char *Name,
|
void Med_GetMediaDataFromRow (const char *Name,
|
||||||
const char *TypeStr,
|
const char *TypeStr,
|
||||||
const char *Title,
|
const char *Title,
|
||||||
const char *URL,
|
const char *URL,
|
||||||
struct Media *Media);
|
struct Media *Media);
|
||||||
|
|
||||||
void Med_PutMediaUploader (int NumMediaInForm,const char *ClassMediaTitURL);
|
void Med_PutMediaUploader (int NumMediaInForm,const char *ClassMediaTitURL);
|
||||||
void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,
|
void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,
|
||||||
|
|
|
@ -1291,9 +1291,11 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
|
||||||
MsgCod =
|
MsgCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create message",
|
DB_QueryINSERTandReturnCode ("can not create message",
|
||||||
"INSERT INTO msg_content"
|
"INSERT INTO msg_content"
|
||||||
" (Subject,Content,MediaName,MediaType,MediaTitle,MediaURL)"
|
" (Subject,Content,"
|
||||||
|
"MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" ('%s','%s','%s','%s','%s','%s')",
|
" ('%s','%s',"
|
||||||
|
"'%s','%s','%s','%s')",
|
||||||
Subject,Content,
|
Subject,Content,
|
||||||
Media->Name,
|
Media->Name,
|
||||||
Med_GetStringTypeForDB (Media->Type),
|
Med_GetStringTypeForDB (Media->Type),
|
||||||
|
@ -1491,8 +1493,10 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
|
||||||
/* Insert message content into msg_content_deleted */
|
/* Insert message content into msg_content_deleted */
|
||||||
DB_QueryINSERT ("can not remove the content of a message",
|
DB_QueryINSERT ("can not remove the content of a message",
|
||||||
"INSERT IGNORE INTO msg_content_deleted"
|
"INSERT IGNORE INTO msg_content_deleted"
|
||||||
" (MsgCod,Subject,Content,MediaName,MediaType,MediaTitle,MediaURL)"
|
" (MsgCod,Subject,Content,"
|
||||||
" SELECT MsgCod,Subject,Content,MediaName,MediaType,MediaTitle,MediaURL"
|
"MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
|
" SELECT MsgCod,Subject,Content,"
|
||||||
|
"MediaName,MediaType,MediaTitle,MediaURL"
|
||||||
" FROM msg_content WHERE MsgCod=%ld",
|
" FROM msg_content WHERE MsgCod=%ld",
|
||||||
MsgCod);
|
MsgCod);
|
||||||
|
|
||||||
|
@ -2802,8 +2806,8 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
|
||||||
Str_Copy (Content,row[0],
|
Str_Copy (Content,row[0],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get image name (row[1]), type (row[2]), title (row[3]) and URL (row[4]) *****/
|
/****** Get media data (row[1], row[2], row[3], row[4]) *****/
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[1],row[2],row[3],row[4],Media);
|
Med_GetMediaDataFromRow (row[1],row[2],row[3],row[4],Media);
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
|
@ -1833,8 +1833,8 @@ static void Soc_GetAndWriteSocialPost (long PstCod)
|
||||||
Str_Copy (Content,row[0],
|
Str_Copy (Content,row[0],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get image name (row[1]), type (row[2]), title (row[3]) and URL (row[4]) *****/
|
/****** Get media data (row[1], row[2], row[3], row[4]) *****/
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[1],row[2],row[3],row[4],&Media);
|
Med_GetMediaDataFromRow (row[1],row[2],row[3],row[4],&Media);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Content[0] = '\0';
|
Content[0] = '\0';
|
||||||
|
@ -2470,9 +2470,11 @@ static long Soc_ReceiveSocialPost (void)
|
||||||
PstCod =
|
PstCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create post",
|
DB_QueryINSERTandReturnCode ("can not create post",
|
||||||
"INSERT INTO social_posts"
|
"INSERT INTO social_posts"
|
||||||
" (Content,MediaName,MediaType,MediaTitle,MediaURL)"
|
" (Content,"
|
||||||
|
"MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" ('%s','%s','%s','%s','%s')",
|
" ('%s',"
|
||||||
|
"'%s','%s','%s','%s')",
|
||||||
Content,
|
Content,
|
||||||
Media.Name,
|
Media.Name,
|
||||||
Med_GetStringTypeForDB (Media.Type),
|
Med_GetStringTypeForDB (Media.Type),
|
||||||
|
@ -3201,9 +3203,11 @@ static long Soc_ReceiveComment (void)
|
||||||
/* Insert comment content in the database */
|
/* Insert comment content in the database */
|
||||||
DB_QueryINSERT ("can not store comment content",
|
DB_QueryINSERT ("can not store comment content",
|
||||||
"INSERT INTO social_comments"
|
"INSERT INTO social_comments"
|
||||||
" (PubCod,Content,MediaName,MediaType,MediaTitle,MediaURL)"
|
" (PubCod,Content,"
|
||||||
|
"MediaName,MediaType,MediaTitle,MediaURL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,'%s','%s','%s','%s','%s')",
|
" (%ld,'%s',"
|
||||||
|
"'%s','%s','%s','%s')",
|
||||||
SocPub.PubCod,
|
SocPub.PubCod,
|
||||||
Content,
|
Content,
|
||||||
Media.Name,
|
Media.Name,
|
||||||
|
@ -4826,9 +4830,8 @@ static void Soc_GetDataOfSocialCommentFromRow (MYSQL_ROW row,struct SocialCommen
|
||||||
/***** Get number of times this comment has been favourited *****/
|
/***** Get number of times this comment has been favourited *****/
|
||||||
Soc_GetNumTimesACommHasBeenFav (SocCom);
|
Soc_GetNumTimesACommHasBeenFav (SocCom);
|
||||||
|
|
||||||
/****** Get image name (row[5]), type (row[6]), title (row[7]) and URL (row[8]) *****/
|
/****** Get media data (row[5], row[6], row[7], row[8]) *****/
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[5],row[6],row[7],row[8],
|
Med_GetMediaDataFromRow (row[5],row[6],row[7],row[8],&SocCom->Media);
|
||||||
&SocCom->Media);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
128
swad_test.c
128
swad_test.c
|
@ -1034,13 +1034,12 @@ void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestio
|
||||||
"</td>",
|
"</td>",
|
||||||
Txt_TST_STR_ANSWER_TYPES[Gbl.Test.AnswerType]);
|
Txt_TST_STR_ANSWER_TYPES[Gbl.Test.AnswerType]);
|
||||||
|
|
||||||
/***** Write stem (row[4]), media (row[6], row[7], row[8], row[9]),
|
/***** Write stem (row[4]), media data (row[6], row[7], row[8], row[9]),
|
||||||
answers depending on shuffle (row[3]) and feedback (row[5]) *****/
|
answers depending on shuffle (row[3]) and feedback (row[5]) *****/
|
||||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
Tst_WriteQstStem (row[4],"TEST_EXA");
|
Tst_WriteQstStem (row[4],"TEST_EXA");
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9],
|
Med_GetMediaDataFromRow (row[6],row[7],row[8],row[9],&Gbl.Test.Media);
|
||||||
&Gbl.Test.Media);
|
|
||||||
Med_ShowMedia (&Gbl.Test.Media,
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_SHOW_STEM_CONTAINER",
|
"TEST_IMG_SHOW_STEM_CONTAINER",
|
||||||
"TEST_IMG_SHOW_STEM");
|
"TEST_IMG_SHOW_STEM");
|
||||||
|
@ -2987,13 +2986,12 @@ static void Tst_ListOneOrMoreQuestionsForEdition (unsigned long NumRows,
|
||||||
}
|
}
|
||||||
fprintf (Gbl.F.Out,"</td>");
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/* Write the stem (row[4]), the media (row[6], row[7], row[8], row[9]),
|
/* Write stem (row[4]), media data (row[6], row[7], row[8], row[9]),
|
||||||
the feedback (row[5]) and the answers */
|
feedback (row[5]) and answers */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
Tst_WriteQstStem (row[4],"TEST_EDI");
|
Tst_WriteQstStem (row[4],"TEST_EDI");
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9],
|
Med_GetMediaDataFromRow (row[6],row[7],row[8],row[9],&Gbl.Test.Media);
|
||||||
&Gbl.Test.Media);
|
|
||||||
Med_ShowMedia (&Gbl.Test.Media,
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
||||||
"TEST_IMG_EDIT_LIST_STEM");
|
"TEST_IMG_EDIT_LIST_STEM");
|
||||||
|
@ -3223,13 +3221,12 @@ static void Tst_ListOneOrMoreQuestionsForSelection (long GamCod,
|
||||||
|
|
||||||
fprintf (Gbl.F.Out,"</td>");
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/* Write the stem (row[4]), the image (row[6], row[7], row[8], row[9]),
|
/* Write stem (row[4]), media data (row[6], row[7], row[8], row[9]),
|
||||||
the feedback (row[5]) and the answers */
|
feedback (row[5]) and answers */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
Tst_WriteQstStem (row[4],"TEST_EDI");
|
Tst_WriteQstStem (row[4],"TEST_EDI");
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[6],row[7],row[8],row[9],
|
Med_GetMediaDataFromRow (row[6],row[7],row[8],row[9],&Gbl.Test.Media);
|
||||||
&Gbl.Test.Media);
|
|
||||||
Med_ShowMedia (&Gbl.Test.Media,
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
||||||
"TEST_IMG_EDIT_LIST_STEM");
|
"TEST_IMG_EDIT_LIST_STEM");
|
||||||
|
@ -3320,14 +3317,14 @@ static void Tst_WriteAnswersEdit (long QstCod)
|
||||||
|
|
||||||
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false);
|
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false);
|
||||||
/*
|
/*
|
||||||
row[ 0] AnsInd
|
row[0] AnsInd
|
||||||
row[ 1] Answer
|
row[1] Answer
|
||||||
row[ 2] Feedback
|
row[2] Feedback
|
||||||
row[ 3] MediaName
|
row[3] MediaName
|
||||||
row[ 4] MediaType
|
row[4] MediaType
|
||||||
row[ 5] MediaTitle
|
row[5] MediaTitle
|
||||||
row[ 6] MediaURL
|
row[6] MediaURL
|
||||||
row[ 7] Correct
|
row[7] Correct
|
||||||
*/
|
*/
|
||||||
/***** Write the answers *****/
|
/***** Write the answers *****/
|
||||||
switch (Gbl.Test.AnswerType)
|
switch (Gbl.Test.AnswerType)
|
||||||
|
@ -3393,9 +3390,9 @@ static void Tst_WriteAnswersEdit (long QstCod)
|
||||||
Feedback,LengthFeedback,false);
|
Feedback,LengthFeedback,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy image */
|
/* Get media data (row[3], row[4], row[5], row[6]) */
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
|
Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
|
||||||
&Gbl.Test.Answer.Options[NumOpt].Media);
|
&Gbl.Test.Answer.Options[NumOpt].Media);
|
||||||
|
|
||||||
/* Put an icon that indicates whether the answer is correct or wrong */
|
/* Put an icon that indicates whether the answer is correct or wrong */
|
||||||
fprintf (Gbl.F.Out,"<tr>"
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
@ -3495,14 +3492,14 @@ static void Tst_WriteAnswersTestResult (struct UsrData *UsrDat,
|
||||||
/***** Get answers of a question from database *****/
|
/***** Get answers of a question from database *****/
|
||||||
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false);
|
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,false);
|
||||||
/*
|
/*
|
||||||
row[ 0] AnsInd
|
row[0] AnsInd
|
||||||
row[ 1] Answer
|
row[1] Answer
|
||||||
row[ 2] Feedback
|
row[2] Feedback
|
||||||
row[ 3] MediaName
|
row[3] MediaName
|
||||||
row[ 4] MediaType
|
row[4] MediaType
|
||||||
row[ 5] MediaTitle
|
row[5] MediaTitle
|
||||||
row[ 6] MediaURL
|
row[6] MediaURL
|
||||||
row[ 7] Correct
|
row[7] Correct
|
||||||
*/
|
*/
|
||||||
/***** Write answer depending on type *****/
|
/***** Write answer depending on type *****/
|
||||||
switch (Gbl.Test.AnswerType)
|
switch (Gbl.Test.AnswerType)
|
||||||
|
@ -3705,14 +3702,14 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
|
||||||
/***** Get answers of a question from database *****/
|
/***** Get answers of a question from database *****/
|
||||||
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,Shuffle);
|
Gbl.Test.Answer.NumOptions = Tst_GetAnswersQst (QstCod,&mysql_res,Shuffle);
|
||||||
/*
|
/*
|
||||||
row[ 0] AnsInd
|
row[0] AnsInd
|
||||||
row[ 1] Answer
|
row[1] Answer
|
||||||
row[ 2] Feedback
|
row[2] Feedback
|
||||||
row[ 3] MediaName
|
row[3] MediaName
|
||||||
row[ 4] MediaType
|
row[4] MediaType
|
||||||
row[ 5] MediaTitle
|
row[5] MediaTitle
|
||||||
row[ 6] MediaURL
|
row[6] MediaURL
|
||||||
row[ 7] Correct
|
row[7] Correct
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/***** Start table *****/
|
/***** Start table *****/
|
||||||
|
@ -3749,9 +3746,9 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
|
||||||
Gbl.Test.Answer.Options[NumOpt].Text,
|
Gbl.Test.Answer.Options[NumOpt].Text,
|
||||||
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
|
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
|
||||||
|
|
||||||
/***** Copy image *****/
|
/***** Get media data (row[3], row[4], row[5], row[6]) *****/
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
|
Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
|
||||||
&Gbl.Test.Answer.Options[NumOpt].Media);
|
&Gbl.Test.Answer.Options[NumOpt].Media);
|
||||||
|
|
||||||
/***** Write selectors and letter of this option *****/
|
/***** Write selectors and letter of this option *****/
|
||||||
fprintf (Gbl.F.Out,"<tr>"
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
@ -3871,9 +3868,9 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
|
||||||
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
|
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Copy image *****/
|
/***** Get media data (row[3], row[4], row[5], row[6]) *****/
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
|
Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
|
||||||
&Gbl.Test.Answer.Options[NumOpt].Media);
|
&Gbl.Test.Answer.Options[NumOpt].Media);
|
||||||
|
|
||||||
/***** Assign correctness (row[7]) of this answer (this option) *****/
|
/***** Assign correctness (row[7]) of this answer (this option) *****/
|
||||||
Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
|
Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
|
||||||
|
@ -4120,9 +4117,9 @@ static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
|
||||||
Gbl.Test.Answer.Options[NumOpt].Text,
|
Gbl.Test.Answer.Options[NumOpt].Text,
|
||||||
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
|
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
|
||||||
|
|
||||||
/***** Copy image *****/
|
/***** Get media data (row[3], row[4], row[5], row[6]) *****/
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
|
Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
|
||||||
&Gbl.Test.Answer.Options[NumOpt].Media);
|
&Gbl.Test.Answer.Options[NumOpt].Media);
|
||||||
|
|
||||||
/***** Write letter of this option *****/
|
/***** Write letter of this option *****/
|
||||||
fprintf (Gbl.F.Out,"<tr>"
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
@ -4193,14 +4190,14 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
|
||||||
char TextAnsOK[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1];
|
char TextAnsOK[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1];
|
||||||
bool Correct = false;
|
bool Correct = false;
|
||||||
/*
|
/*
|
||||||
row[ 0] AnsInd
|
row[0] AnsInd
|
||||||
row[ 1] Answer
|
row[1] Answer
|
||||||
row[ 2] Feedback
|
row[2] Feedback
|
||||||
row[ 3] MediaName
|
row[3] MediaName
|
||||||
row[ 4] MediaType
|
row[4] MediaType
|
||||||
row[ 5] MediaTitle
|
row[5] MediaTitle
|
||||||
row[ 6] MediaURL
|
row[6] MediaURL
|
||||||
row[ 7] Correct
|
row[7] Correct
|
||||||
*/
|
*/
|
||||||
/***** Get text and correctness of answers for this question from database (one row per answer) *****/
|
/***** Get text and correctness of answers for this question from database (one row per answer) *****/
|
||||||
for (NumOpt = 0;
|
for (NumOpt = 0;
|
||||||
|
@ -5583,10 +5580,8 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
|
||||||
Str_Copy (Feedback,row[3],
|
Str_Copy (Feedback,row[3],
|
||||||
Cns_MAX_BYTES_TEXT);
|
Cns_MAX_BYTES_TEXT);
|
||||||
|
|
||||||
/* Get the image name, title and URL of the question
|
/* Get media data (row[4], row[5], row[6], row[7]) */
|
||||||
from the database (row[4], row[5], row[6], row[7]) */
|
Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],&Gbl.Test.Media);
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[4],row[5],row[6],row[7],
|
|
||||||
&Gbl.Test.Media);
|
|
||||||
|
|
||||||
/* Free structure that stores the query result */
|
/* Free structure that stores the query result */
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -5656,10 +5651,11 @@ static void Tst_GetQstDataFromDB (char Stem[Cns_MAX_BYTES_TEXT + 1],
|
||||||
Str_Copy (Gbl.Test.Answer.Options[NumOpt].Feedback,row[2],
|
Str_Copy (Gbl.Test.Answer.Options[NumOpt].Feedback,row[2],
|
||||||
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
|
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
|
||||||
|
|
||||||
/* Copy image */
|
/* Get media data (row[3], row[4], row[5], row[6]) */
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[3],row[4],row[5],row[6],
|
Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],
|
||||||
&Gbl.Test.Answer.Options[NumOpt].Media);
|
&Gbl.Test.Answer.Options[NumOpt].Media);
|
||||||
|
|
||||||
|
/* Get if this option is correct */
|
||||||
Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
|
Gbl.Test.Answer.Options[NumOpt].Correct = (row[7][0] == 'Y');
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -5705,10 +5701,8 @@ static void Tst_GetMediaFromDB (int NumOpt,struct Media *Media)
|
||||||
|
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
/***** Get the image name, type, title and URL
|
/***** Get media data (row[0], row[1], row[2], row[3]) *****/
|
||||||
(row[0], row[1], row[2], row[3]) *****/
|
Med_GetMediaDataFromRow (row[0],row[1],row[2],row[3],Media);
|
||||||
Med_GetMediaNameTitleAndURLFromRow (row[0],row[1],row[2],row[3],
|
|
||||||
Media);
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -6832,7 +6826,7 @@ static void Tst_RemoveImgFileFromAnsOfQst (long CrsCod,long QstCod,unsigned AnsI
|
||||||
"SELECT tst_answers.MediaName," // row[0]
|
"SELECT tst_answers.MediaName," // row[0]
|
||||||
"tst_answers.MediaType" // row[1]
|
"tst_answers.MediaType" // row[1]
|
||||||
" FROM tst_questions,tst_answers"
|
" FROM tst_questions,tst_answers"
|
||||||
" WHERE tst_questions.CrsCod=%ld" // Extra check
|
" WHERE tst_questions.CrsCod=%ld"// Extra check
|
||||||
" AND tst_questions.QstCod=%ld" // Extra check
|
" AND tst_questions.QstCod=%ld" // Extra check
|
||||||
" AND tst_questions.QstCod=tst_answers.QstCod"
|
" AND tst_questions.QstCod=tst_answers.QstCod"
|
||||||
" AND tst_answers.QstCod=%ld"
|
" AND tst_answers.QstCod=%ld"
|
||||||
|
|
30
swad_text.c
30
swad_text.c
|
@ -46871,6 +46871,36 @@ const char *Txt_The_session_has_expired =
|
||||||
"A sessão expirou.";
|
"A sessão expirou.";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char *Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X = // Warning: it is very important to include %s in the following sentences
|
||||||
|
#if L==1 // ca
|
||||||
|
"La mida del fitxer <em>GIF</em>"
|
||||||
|
" supera el màxim permès (%s).";
|
||||||
|
#elif L==2 // de
|
||||||
|
"Die Größe der <em>GIF</em>-Datei"
|
||||||
|
" überschreitet den zulässigen Höchstwert (%s).";
|
||||||
|
#elif L==3 // en
|
||||||
|
"The size of the <em>GIF</em> file"
|
||||||
|
" exceeds the maximum allowed (%s).";
|
||||||
|
#elif L==4 // es
|
||||||
|
"El tamaño del archivo <em>GIF</em>"
|
||||||
|
" excede el máximo permitido (%s).";
|
||||||
|
#elif L==5 // fr
|
||||||
|
"La taille du fichier <em>GIF</em>"
|
||||||
|
" dépasse le maximum autorisé (%s).";
|
||||||
|
#elif L==6 // gn
|
||||||
|
"El tamaño del archivo <em>GIF</em>"
|
||||||
|
" excede el máximo permitido (%s)."; // Okoteve traducción
|
||||||
|
#elif L==7 // it
|
||||||
|
"La dimensione del file <em>GIF</em>"
|
||||||
|
" supera il massimo consentito (%s).";
|
||||||
|
#elif L==8 // pl
|
||||||
|
"Rozmiar pliku <em>GIF</em>"
|
||||||
|
" przekracza maksymalne dozwolone (%s).";
|
||||||
|
#elif L==9 // pt
|
||||||
|
"O tamanho do arquivo <em>GIF</em>"
|
||||||
|
" excede o máximo permitido (%s).";
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *Txt_The_status_of_the_centre_X_has_changed = // Warning: it is very important to include %s in the following sentences
|
const char *Txt_The_status_of_the_centre_X_has_changed = // Warning: it is very important to include %s in the following sentences
|
||||||
#if L==1 // ca
|
#if L==1 // ca
|
||||||
"El estado del centro <strong>%s</strong> ha cambiado."; // Necessita traduccio
|
"El estado del centro <strong>%s</strong> ha cambiado."; // Necessita traduccio
|
||||||
|
|
Loading…
Reference in New Issue
Block a user