Version 15.174

This commit is contained in:
Antonio Cañas Vargas 2016-04-01 21:56:00 +02:00
parent 93cd2494f9
commit 0648ccefe6
5 changed files with 49 additions and 20 deletions

View File

@ -1745,11 +1745,12 @@ a:hover img.CENTRE_PHOTO_SHOW
.TEST_IMG_SHOW .TEST_IMG_SHOW
{ {
width:600px; width:600px;
margin:10px; margin:10px 0;
} }
.TEST_IMG_EDIT_LIST .TEST_IMG_EDIT_LIST
{ {
width:256px; width:300px;
margin:5px 0;
} }
.TEST_IMG_EDIT_ONE .TEST_IMG_EDIT_ONE
{ {

View File

@ -136,21 +136,23 @@
// TODO: In Statistics > Degrees, show only degrees with students // TODO: In Statistics > Degrees, show only degrees with students
// TODO: Ask for confirmation when removing a test question?
// TODO: Put radio button to remove image when editing one test question // TODO: Put radio button to remove image when editing one test question
// TODO: Put icon to remove image when editing a list of test questions (similar to shuffle icon) // TODO: Put icon to remove image when editing a list of test questions (similar to shuffle icon)
// TODO: Image in a test question is removed when the test question is removed
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 15.173.4 (2016-04-01)" #define Log_PLATFORM_VERSION "SWAD 15.174 (2016-04-01)"
#define CSS_FILE "swad15.173.1.css" #define CSS_FILE "swad15.173.1.css"
#define JS_FILE "swad15.131.3.js" #define JS_FILE "swad15.131.3.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1
/* /*
Version 15.174: Apr 01, 2016 Image in a test question is removed when the test question is removed.
All images in test questions of a course are removed when course is removed. (197504 lines)
Version 15.173.4: Apr 01, 2016 Old image in test question is removed when replaced by a new one. (197481 lines) Version 15.173.4: Apr 01, 2016 Old image in test question is removed when replaced by a new one. (197481 lines)
Version 15.173.3: Apr 01, 2016 Changes in layout of class photo. (197447 lines) Version 15.173.3: Apr 01, 2016 Changes in layout of class photo. (197447 lines)
Version 15.173.2: Apr 01, 2016 Changes in CSS related to tests. (197446 lines) Version 15.173.2: Apr 01, 2016 Changes in CSS related to tests. (197446 lines)

View File

@ -2266,6 +2266,10 @@ static void Crs_EmptyCourseCompletely (long CrsCod)
CrsCod); CrsCod);
DB_QueryDELETE (Query,"can not remove answers of tests of a course"); DB_QueryDELETE (Query,"can not remove answers of tests of a course");
/* Remove files with images associated to test questions in the course */
Tst_RemoveImageFilesFromQstsInCrs (CrsCod,
-1L); // All questions in the course
/* Remove test questions in the course */ /* Remove test questions in the course */
sprintf (Query,"DELETE FROM tst_questions WHERE CrsCod='%ld'", sprintf (Query,"DELETE FROM tst_questions WHERE CrsCod='%ld'",
CrsCod); CrsCod);

View File

@ -222,7 +222,6 @@ static void Tst_EnableOrDisableTag (long TagCod,bool TagHidden);
static int Tst_GetQstCod (void); static int Tst_GetQstCod (void);
static void Tst_InsertOrUpdateQstIntoDB (void); static void Tst_InsertOrUpdateQstIntoDB (void);
static void Tst_RemoveImageFileCurrentQst (void);
static void Tst_InsertTagsIntoDB (void); static void Tst_InsertTagsIntoDB (void);
static void Tst_InsertAnswersIntoDB (void); static void Tst_InsertAnswersIntoDB (void);
@ -5343,6 +5342,9 @@ void Tst_RemoveQst (void)
Par_GetParToText ("OnlyThisQst",YN,1); Par_GetParToText ("OnlyThisQst",YN,1);
EditingOnlyThisQst = (Str_ConvertToUpperLetter (YN[0]) == 'Y'); EditingOnlyThisQst = (Str_ConvertToUpperLetter (YN[0]) == 'Y');
/***** Remove image associated to question *****/
Tst_RemoveImageFilesFromQstsInCrs (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Test.QstCod);
/***** Remove the question from all the tables *****/ /***** Remove the question from all the tables *****/
/* Remove answers and tags from this test question */ /* Remove answers and tags from this test question */
Tst_RemAnsFromQst (); Tst_RemAnsFromQst ();
@ -5462,10 +5464,9 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
Gbl.Test.Feedback.Length)) == NULL) Gbl.Test.Feedback.Length)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store database query."); Lay_ShowErrorAndExit ("Not enough memory to store database query.");
/***** Make database query *****/
if (Gbl.Test.QstCod < 0) // It's a new question if (Gbl.Test.QstCod < 0) // It's a new question
{ {
/* Insert question in the table of questions */ /***** Insert question in the table of questions *****/
sprintf (Query,"INSERT INTO tst_questions" sprintf (Query,"INSERT INTO tst_questions"
" (CrsCod,EditTime,AnsType,Shuffle,Stem,Image,Feedback,NumHits,Score)" " (CrsCod,EditTime,AnsType,Shuffle,Stem,Image,Feedback,NumHits,Score)"
" VALUES ('%ld',NOW(),'%s','%c','%s','%s','%s','0','0')", " VALUES ('%ld',NOW(),'%s','%c','%s','%s','%s','0','0')",
@ -5480,11 +5481,12 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
} }
else // It's an existing question else // It's an existing question
{ {
/* Update question */ /***** Update existing question *****/
if (Gbl.Test.ChangeImage) if (Gbl.Test.ChangeImage)
{ {
/* Remove file with the current image */ /* Remove file with the previous image
Tst_RemoveImageFileCurrentQst (); (the file with the new image is already created) */
Tst_RemoveImageFilesFromQstsInCrs (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Test.QstCod);
/* Update question in database */ /* Update question in database */
sprintf (Query,"UPDATE tst_questions" sprintf (Query,"UPDATE tst_questions"
@ -5499,7 +5501,7 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
Gbl.Test.Feedback.Text ? Gbl.Test.Feedback.Text : "", Gbl.Test.Feedback.Text ? Gbl.Test.Feedback.Text : "",
Gbl.Test.QstCod,Gbl.CurrentCrs.Crs.CrsCod); Gbl.Test.QstCod,Gbl.CurrentCrs.Crs.CrsCod);
} }
else else // Do not change image
sprintf (Query,"UPDATE tst_questions" sprintf (Query,"UPDATE tst_questions"
" SET EditTime=NOW(),AnsType='%s',Shuffle='%c'," " SET EditTime=NOW(),AnsType='%s',Shuffle='%c',"
"Stem='%s',Feedback='%s'" "Stem='%s',Feedback='%s'"
@ -5522,33 +5524,50 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/**************** Remove the current image of a test question ****************/ /******** Remove one or more image files associated to test questions ********/
/*****************************************************************************/ /*****************************************************************************/
// Use question code <= 0 to remove all images associated to questions in course
static void Tst_RemoveImageFileCurrentQst (void) void Tst_RemoveImageFilesFromQstsInCrs (long CrsCod,
long QstCod) // <= 0 ==> all questions in course
{ {
char Query[256]; char Query[256];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumImages;
unsigned NumImg;
char FullPathImgPriv[PATH_MAX+1]; char FullPathImgPriv[PATH_MAX+1];
/***** Get name of image associated to test question from database *****/ /***** Get names of images associated to test questions from database *****/
sprintf (Query,"SELECT Image FROM tst_questions" if (QstCod > 0) // Only one question
" WHERE QstCod='%ld' AND CrsCod='%ld'", sprintf (Query,"SELECT Image FROM tst_questions"
Gbl.Test.QstCod,Gbl.CurrentCrs.Crs.CrsCod); " WHERE QstCod='%ld' AND CrsCod='%ld'",
if (DB_QuerySELECT (Query,&mysql_res,"can not get test image")) QstCod,CrsCod);
else // All questions in the course
sprintf (Query,"SELECT Image FROM tst_questions"
" WHERE CrsCod='%ld'",
CrsCod);
NumImages = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get test images");
/***** Go over result removing image files *****/
for (NumImg = 0;
NumImg < NumImages;
NumImg++)
{ {
/***** Get image name (row[0]) *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/***** Get image name (row[0]) *****/ /***** Build path to private file *****/
sprintf (FullPathImgPriv,"%s/%s/%c%c/%s.jpg", sprintf (FullPathImgPriv,"%s/%s/%c%c/%s.jpg",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG, Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_IMG,
row[0][0], row[0][0],
row[0][1], row[0][1],
row[0]); row[0]);
/***** Remove file *****/ /***** Remove private file *****/
unlink (FullPathImgPriv); unlink (FullPathImgPriv);
// Public links are removed automatically after a period
} }
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/

View File

@ -150,6 +150,9 @@ double Tst_GetFloatAnsFromStr (char *Str);
void Tst_RemoveQst (void); void Tst_RemoveQst (void);
void Tst_ChangeShuffleQst (void); void Tst_ChangeShuffleQst (void);
void Tst_InsertOrUpdateQstTagsAnsIntoDB (void); void Tst_InsertOrUpdateQstTagsAnsIntoDB (void);
void Tst_RemoveImageFilesFromQstsInCrs (long CrsCod,long QstCod);
int Tst_AllocateTextChoiceAnswer (unsigned NumOpt); int Tst_AllocateTextChoiceAnswer (unsigned NumOpt);
void Tst_FreeTextChoiceAnswers (void); void Tst_FreeTextChoiceAnswers (void);
void Tst_FreeTagsList (void); void Tst_FreeTagsList (void);