Version 21.11: Sep 22, 2021 New module swad_info_database for database queries related to course information.

This commit is contained in:
acanas 2021-09-22 00:18:08 +02:00
parent 61385a0565
commit babcd3df60
10 changed files with 617 additions and 468 deletions

View File

@ -56,8 +56,9 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \
swad_hierarchy_config.o swad_hierarchy_database.o swad_holiday.o \ swad_hierarchy_config.o swad_hierarchy_database.o swad_holiday.o \
swad_holiday_database.o swad_HTML.o \ swad_holiday_database.o swad_HTML.o \
swad_icon.o swad_ID.o swad_ID_database.o swad_indicator.o \ swad_icon.o swad_ID.o swad_ID_database.o swad_indicator.o \
swad_indicator_database.o swad_info.o swad_institution.o \ swad_indicator_database.o swad_info.o swad_info_database.o \
swad_institution_config.o swad_institution_database.o \ swad_institution.o swad_institution_config.o \
swad_institution_database.o \
swad_language.o swad_layout.o swad_link.o swad_log.o swad_logo.o \ swad_language.o swad_layout.o swad_link.o swad_log.o swad_logo.o \
swad_MAC.o swad_mail.o swad_main.o swad_maintenance.o swad_map.o \ swad_MAC.o swad_mail.o swad_main.o swad_maintenance.o swad_map.o \
swad_mark.o swad_match.o swad_match_print.o swad_match_result.o \ swad_mark.o swad_match.o swad_match_print.o swad_match_result.o \

View File

@ -602,16 +602,15 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo. TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/ */
#define Log_PLATFORM_VERSION "SWAD 21.10 (2021-09-20)" #define Log_PLATFORM_VERSION "SWAD 21.11 (2021-09-22)"
#define CSS_FILE "swad20.45.css" #define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js" #define JS_FILE "swad20.69.1.js"
/* /*
TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
TODO: Un profesor no puede confirmar DNIs Version 21.11: Sep 22, 2021 New module swad_info_database for database queries related to course information. (316228 lines)
TODO: Al cambiar un estudiante en una asignatura, dice que el rol ha cambiado de desconocido a estudiante Version 21.10.1: Sep 21, 2021 Fixed bugs in roles. Reported by Javier Fernández Baldomero and Carmen García Miranda. (316111 lines)
Version 21.10: Sep 20, 2021 New module swad_indicator_database for database queries related to course indicators. (316112 lines) Version 21.10: Sep 20, 2021 New module swad_indicator_database for database queries related to course indicators. (316112 lines)
Version 21.9.1: Sep 20, 2021 Queries moved to module swad_browser_database. (316023 lines) Version 21.9.1: Sep 20, 2021 Queries moved to module swad_browser_database. (316023 lines)
Version 21.9: Sep 20, 2021 New module swad_ID_database for database queries related to user's IDs. (316021 lines) Version 21.9: Sep 20, 2021 New module swad_ID_database for database queries related to user's IDs. (316021 lines)

View File

@ -3204,7 +3204,7 @@ static void Enr_EffectivelyRemUsrFromCrs (struct UsrData *UsrDat,
Grp_RemUsrFromAllGrpsInCrs (UsrDat->UsrCod,Crs->CrsCod); Grp_RemUsrFromAllGrpsInCrs (UsrDat->UsrCod,Crs->CrsCod);
/***** Remove user's status about reading of course information *****/ /***** Remove user's status about reading of course information *****/
Inf_RemoveUsrFromCrsInfoRead (UsrDat->UsrCod,Crs->CrsCod); Inf_DB_RemoveUsrFromCrsInfoRead (UsrDat->UsrCod,Crs->CrsCod);
/***** Remove important production of this user in course *****/ /***** Remove important production of this user in course *****/
if (RemoveUsrWorks == Enr_REMOVE_USR_PRODUCTION) if (RemoveUsrWorks == Enr_REMOVE_USR_PRODUCTION)

View File

@ -25,25 +25,12 @@
/********************************* Headers ***********************************/ /********************************* Headers ***********************************/
/*****************************************************************************/ /*****************************************************************************/
// #include <stddef.h> // For NULL
#include <mysql/mysql.h> // To access MySQL databases #include <mysql/mysql.h> // To access MySQL databases
// #include "swad_action.h"
// #include "swad_assignment_database.h"
// #include "swad_box.h"
// #include "swad_browser_database.h"
#include "swad_database.h" #include "swad_database.h"
// #include "swad_department.h"
#include "swad_error.h" #include "swad_error.h"
// #include "swad_form.h"
// #include "swad_forum_database.h"
#include "swad_global.h" #include "swad_global.h"
// #include "swad_hierarchy_level.h"
// #include "swad_HTML.h"
#include "swad_indicator.h" #include "swad_indicator.h"
// #include "swad_message.h"
// #include "swad_parameter.h"
// #include "swad_theme.h"
/*****************************************************************************/ /*****************************************************************************/
/************** External global variables from others modules ****************/ /************** External global variables from others modules ****************/

View File

@ -41,6 +41,7 @@
#include "swad_global.h" #include "swad_global.h"
#include "swad_HTML.h" #include "swad_HTML.h"
#include "swad_info.h" #include "swad_info.h"
#include "swad_info_database.h"
#include "swad_parameter.h" #include "swad_parameter.h"
#include "swad_string.h" #include "swad_string.h"
@ -97,16 +98,6 @@ static void (*Inf_FormsForEditionTypes[Inf_NUM_SOURCES])(Inf_Src_t InfoSrc) =
[Inf_URL ] = Inf_FormToSendURL, [Inf_URL ] = Inf_FormToSendURL,
}; };
static const char *Inf_NamesInDBForInfoSrc[Inf_NUM_SOURCES] =
{
[Inf_NONE ] = "none",
[Inf_EDITOR ] = "editor",
[Inf_PLAIN_TEXT] = "plain_text",
[Inf_RICH_TEXT ] = "rich_text",
[Inf_PAGE ] = "page",
[Inf_URL ] = "URL",
};
static const Act_Action_t Inf_ActionsEditInfo[Inf_NUM_TYPES] = static const Act_Action_t Inf_ActionsEditInfo[Inf_NUM_TYPES] =
{ {
[Inf_INTRODUCTION ] = ActEdiCrsInf, [Inf_INTRODUCTION ] = ActEdiCrsInf,
@ -236,18 +227,6 @@ static const Act_Action_t Inf_ActionsRcvRchTxtInfo[Inf_NUM_TYPES] =
[Inf_ASSESSMENT ] = ActRcvRchTxtAss, [Inf_ASSESSMENT ] = ActRcvRchTxtAss,
}; };
static const char *Inf_NamesInDBForInfoType[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = "intro", // TODO: Change this to "introduction"!
[Inf_TEACHING_GUIDE] = "description", // TODO: Change this to "guide"!
[Inf_LECTURES ] = "theory", // TODO: Change this to "lectures"!
[Inf_PRACTICALS ] = "practices", // TODO: Change this to "practicals"!
[Inf_BIBLIOGRAPHY ] = "bibliography",
[Inf_FAQ ] = "FAQ",
[Inf_LINKS ] = "links",
[Inf_ASSESSMENT ] = "assessment",
};
/***** Help *****/ /***** Help *****/
extern const char *Hlp_COURSE_Information_textual_information; extern const char *Hlp_COURSE_Information_textual_information;
extern const char *Hlp_COURSE_Guide; extern const char *Hlp_COURSE_Guide;
@ -273,11 +252,8 @@ static void Inf_PutButtonToEditInfo (void);
static void Inf_PutIconToViewInfo (void *Type); static void Inf_PutIconToViewInfo (void *Type);
static void Inf_PutCheckboxForceStdsToReadInfo (bool MustBeRead,bool Disabled); static void Inf_PutCheckboxForceStdsToReadInfo (bool MustBeRead,bool Disabled);
static void Inf_PutCheckboxConfirmIHaveReadInfo (void); static void Inf_PutCheckboxConfirmIHaveReadInfo (void);
static bool Inf_CheckIfIHaveReadInfo (void);
static bool Inf_GetMustBeReadFromForm (void); static bool Inf_GetMustBeReadFromForm (void);
static bool Inf_GetIfIHaveReadFromForm (void); static bool Inf_GetIfIHaveReadFromForm (void);
static void Inf_SetForceReadIntoDB (bool MustBeRead);
static void Inf_SetIHaveReadIntoDB (bool IHaveRead);
static bool Inf_CheckPage (long CrsCod,Inf_Type_t InfoType); static bool Inf_CheckPage (long CrsCod,Inf_Type_t InfoType);
static bool Inf_CheckAndShowPage (void); static bool Inf_CheckAndShowPage (void);
@ -293,7 +269,6 @@ static bool Inf_CheckIfInfoAvailable (struct Syl_Syllabus *Syllabus,
Inf_Src_t InfoSrc); Inf_Src_t InfoSrc);
static void Inf_AsignInfoType (struct Inf_Info *Info, static void Inf_AsignInfoType (struct Inf_Info *Info,
struct Syl_Syllabus *Syllabus); struct Syl_Syllabus *Syllabus);
static void Inf_SetInfoTxtIntoDB (const char *InfoTxtHTML,const char *InfoTxtMD);
static bool Inf_CheckPlainTxt (long CrsCod,Inf_Type_t InfoType); static bool Inf_CheckPlainTxt (long CrsCod,Inf_Type_t InfoType);
static bool Inf_CheckAndShowPlainTxt (void); static bool Inf_CheckAndShowPlainTxt (void);
@ -443,7 +418,7 @@ static void Inf_PutButtonToEditInfo (void)
extern const char *Txt_Edit; extern const char *Txt_Edit;
Frm_BeginForm (Inf_ActionsEditInfo[Gbl.Crs.Info.Type]); Frm_BeginForm (Inf_ActionsEditInfo[Gbl.Crs.Info.Type]);
Btn_PutConfirmButton (Txt_Edit); Btn_PutConfirmButton (Txt_Edit);
Frm_EndForm (); Frm_EndForm ();
} }
@ -488,7 +463,7 @@ static void Inf_PutCheckboxForceStdsToReadInfo (bool MustBeRead,bool Disabled)
static void Inf_PutCheckboxConfirmIHaveReadInfo (void) static void Inf_PutCheckboxConfirmIHaveReadInfo (void)
{ {
extern const char *Txt_I_have_read_this_information; extern const char *Txt_I_have_read_this_information;
bool IHaveRead = Inf_CheckIfIHaveReadInfo (); bool IHaveRead = Inf_DB_CheckIfIHaveReadInfo ();
Lay_PutContextualCheckbox (Inf_ActionsIHaveReadInfo[Gbl.Crs.Info.Type], Lay_PutContextualCheckbox (Inf_ActionsIHaveReadInfo[Gbl.Crs.Info.Type],
NULL, NULL,
@ -498,24 +473,6 @@ static void Inf_PutCheckboxConfirmIHaveReadInfo (void)
Txt_I_have_read_this_information); Txt_I_have_read_this_information);
} }
/*****************************************************************************/
/******************** Check I have read a course info ************************/
/*****************************************************************************/
static bool Inf_CheckIfIHaveReadInfo (void)
{
/***** Get if info source is already stored in database *****/
return (DB_QueryCOUNT ("can not get if I have read course info",
"SELECT COUNT(*)"
" FROM crs_info_read"
" WHERE UsrCod=%ld"
" AND CrsCod=%ld"
" AND InfoType='%s'",
Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type]) != 0);
}
/*****************************************************************************/ /*****************************************************************************/
/********* Get if students must read any info about current course ***********/ /********* Get if students must read any info about current course ***********/
/*****************************************************************************/ /*****************************************************************************/
@ -558,7 +515,7 @@ bool Inf_GetIfIMustReadAnyCrsInfoInThisCrs (void)
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/* Get info type (row[0]) */ /* Get info type (row[0]) */
InfoType = Inf_ConvertFromStrDBToInfoType (row[0]); InfoType = Inf_DB_ConvertFromStrDBToInfoType (row[0]);
Gbl.Crs.Info.MustBeRead[InfoType] = true; Gbl.Crs.Info.MustBeRead[InfoType] = true;
} }
@ -585,28 +542,28 @@ void Inf_WriteMsgYouMustReadInfo (void)
NULL,NULL, NULL,NULL,
NULL,Box_CLOSABLE); NULL,Box_CLOSABLE);
/***** Write message *****/ /***** Write message *****/
Ale_ShowAlert (Ale_WARNING,Txt_You_should_read_the_following_information); Ale_ShowAlert (Ale_WARNING,Txt_You_should_read_the_following_information);
/***** Write every information I must read *****/ /***** Write every information I must read *****/
HTM_DIV_Begin ("class=\"CM\""); HTM_DIV_Begin ("class=\"CM\"");
HTM_UL_Begin ("class=\"LIST_I_MUST_READ\""); HTM_UL_Begin ("class=\"LIST_I_MUST_READ\"");
for (InfoType = (Inf_Type_t) 0; for (InfoType = (Inf_Type_t) 0;
InfoType <= (Inf_Type_t) (Inf_NUM_TYPES - 1); InfoType <= (Inf_Type_t) (Inf_NUM_TYPES - 1);
InfoType++) InfoType++)
if (Gbl.Crs.Info.MustBeRead[InfoType]) if (Gbl.Crs.Info.MustBeRead[InfoType])
{ {
HTM_LI_Begin (NULL); HTM_LI_Begin (NULL);
Frm_BeginForm (Inf_ActionsSeeInfo[InfoType]); Frm_BeginForm (Inf_ActionsSeeInfo[InfoType]);
HTM_BUTTON_SUBMIT_Begin (Act_GetTitleAction (Inf_ActionsSeeInfo[InfoType]), HTM_BUTTON_SUBMIT_Begin (Act_GetTitleAction (Inf_ActionsSeeInfo[InfoType]),
The_ClassFormLinkInBox[Gbl.Prefs.Theme],NULL); The_ClassFormLinkInBox[Gbl.Prefs.Theme],NULL);
HTM_Txt (Act_GetTitleAction (Inf_ActionsSeeInfo[InfoType])); HTM_Txt (Act_GetTitleAction (Inf_ActionsSeeInfo[InfoType]));
HTM_BUTTON_End (); HTM_BUTTON_End ();
Frm_EndForm (); Frm_EndForm ();
HTM_LI_End (); HTM_LI_End ();
} }
HTM_UL_End (); HTM_UL_End ();
HTM_DIV_End (); HTM_DIV_End ();
/***** End box *****/ /***** End box *****/
Box_BoxEnd (); Box_BoxEnd ();
@ -630,7 +587,7 @@ void Inf_ChangeForceReadInfo (void)
Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus);
/***** Set status (if info must be read or not) into database *****/ /***** Set status (if info must be read or not) into database *****/
Inf_SetForceReadIntoDB (MustBeRead); Inf_DB_SetForceRead (MustBeRead);
/***** Write message of success *****/ /***** Write message of success *****/
Ale_ShowAlert (Ale_SUCCESS, Ale_ShowAlert (Ale_SUCCESS,
@ -659,7 +616,7 @@ void Inf_ChangeIHaveReadInfo (void)
Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus);
/***** Set status (if I have read or not a information) into database *****/ /***** Set status (if I have read or not a information) into database *****/
Inf_SetIHaveReadIntoDB (IHaveRead); Inf_DB_SetIHaveRead (IHaveRead);
/***** Write message of success *****/ /***** Write message of success *****/
Ale_ShowAlert (Ale_SUCCESS, Ale_ShowAlert (Ale_SUCCESS,
@ -688,57 +645,11 @@ static bool Inf_GetIfIHaveReadFromForm (void)
return Par_GetParToBool ("IHaveRead"); return Par_GetParToBool ("IHaveRead");
} }
/*****************************************************************************/
/***************** Set if students must read course info *********************/
/*****************************************************************************/
static void Inf_SetForceReadIntoDB (bool MustBeRead)
{
/***** Insert or replace info source for a specific type of course information *****/
DB_QueryUPDATE ("can not update if info must be read",
"UPDATE crs_info_src"
" SET MustBeRead='%c'"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
MustBeRead ? 'Y' :
'N',
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type]);
}
/*****************************************************************************/
/********************* Set if I have read course info ************************/
/*****************************************************************************/
static void Inf_SetIHaveReadIntoDB (bool IHaveRead)
{
if (IHaveRead)
/***** Insert I have read course information *****/
DB_QueryREPLACE ("can not set that I have read course info",
"REPLACE INTO crs_info_read"
" (UsrCod,CrsCod,InfoType)"
" VALUES"
" (%ld,%ld,'%s')",
Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type]);
else
/***** Remove I have read course information *****/
DB_QueryDELETE ("can not set that I have not read course info",
"DELETE FROM crs_info_read"
" WHERE UsrCod=%ld"
" AND CrsCod=%ld"
" AND InfoType='%s'",
Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type]);
}
/*****************************************************************************/ /*****************************************************************************/
/********* Remove user's status about reading of course information **********/ /********* Remove user's status about reading of course information **********/
/*****************************************************************************/ /*****************************************************************************/
void Inf_RemoveUsrFromCrsInfoRead (long UsrCod,long CrsCod) void Inf_DB_RemoveUsrFromCrsInfoRead (long UsrCod,long CrsCod)
{ {
/***** Remove user's status about reading of course information *****/ /***** Remove user's status about reading of course information *****/
DB_QueryDELETE ("can not set that I have not read course info", DB_QueryDELETE ("can not set that I have not read course info",
@ -969,8 +880,8 @@ static void Inf_ShowPage (const char *URL)
/***** Link to view in a new window *****/ /***** Link to view in a new window *****/
HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"%s\"", HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"%s\"",
URL,The_ClassFormOutBoxBold[Gbl.Prefs.Theme]); URL,The_ClassFormOutBoxBold[Gbl.Prefs.Theme]);
Ico_PutIconTextLink ("expand-arrows-alt.svg", Ico_PutIconTextLink ("expand-arrows-alt.svg",
Txt_View_in_a_new_window); Txt_View_in_a_new_window);
HTM_A_End (); HTM_A_End ();
/***** End box *****/ /***** End box *****/
@ -993,7 +904,7 @@ void Inf_SetInfoSrc (void)
Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus); Inf_AsignInfoType (&Gbl.Crs.Info,&Syllabus);
/***** Set info source into database *****/ /***** Set info source into database *****/
Inf_SetInfoSrcIntoDB (InfoSrcSelected); Inf_DB_SetInfoSrc (InfoSrcSelected);
/***** Show the selected info *****/ /***** Show the selected info *****/
Inf_ShowInfo (); Inf_ShowInfo ();
@ -1049,7 +960,7 @@ void Inf_FormsToSelSendInfo (void)
!InfoAvailable[FromDB.Src]) !InfoAvailable[FromDB.Src])
{ {
FromDB.Src = Inf_NONE; FromDB.Src = Inf_NONE;
Inf_SetInfoSrcIntoDB (Inf_NONE); Inf_DB_SetInfoSrc (Inf_NONE);
} }
/***** Form to choice between alternatives *****/ /***** Form to choice between alternatives *****/
@ -1058,54 +969,53 @@ void Inf_FormsToSelSendInfo (void)
Inf_PutIconToViewInfo,&Gbl.Crs.Info.Type, Inf_PutIconToViewInfo,&Gbl.Crs.Info.Type,
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE,4); HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE,4);
/* Options */ /* Options */
for (InfoSrc = (Inf_Src_t) 0; for (InfoSrc = (Inf_Src_t) 0;
InfoSrc <= (Inf_Src_t) (Inf_NUM_SOURCES - 1); InfoSrc <= (Inf_Src_t) (Inf_NUM_SOURCES - 1);
InfoSrc++) InfoSrc++)
{
HTM_TR_Begin (NULL);
/* Select info source */
if (InfoSrc == FromDB.Src)
HTM_TD_Begin ("class=\"DAT LT LIGHT_BLUE\"");
else
HTM_TD_Begin ("class=\"DAT LT\"");
Frm_BeginForm (Inf_ActionsSelecInfoSrc[Gbl.Crs.Info.Type]);
HTM_INPUT_RADIO ("InfoSrc",InfoSrc != FromDB.Src &&
(InfoSrc == Inf_NONE ||
InfoAvailable[InfoSrc]), // Info available for this source
"id=\"InfoSrc%u\" value=\"%u\"%s",
(unsigned) InfoSrc,(unsigned) InfoSrc,
InfoSrc == FromDB.Src ? " checked=\"checked\"" :
(InfoSrc == Inf_NONE ||
InfoAvailable[InfoSrc]) ? "" : // Info available for this source
" disabled=\"disabled\"");
Frm_EndForm ();
HTM_TD_End ();
/* Form for this info source */
if (InfoSrc == FromDB.Src)
HTM_TD_Begin ("class=\"LT LIGHT_BLUE\"");
else
HTM_TD_Begin ("class=\"LT\"");
HTM_LABEL_Begin ("for=\"InfoSrc%u\" class=\"%s\"",
(unsigned) InfoSrc,The_ClassFormInBox[Gbl.Prefs.Theme]);
HTM_Txt (Txt_INFO_SRC_FULL_TEXT[InfoSrc]);
HTM_LABEL_End ();
if (Txt_INFO_SRC_HELP[InfoSrc])
{ {
HTM_SPAN_Begin ("class=\"DAT\""); HTM_TR_Begin (NULL);
HTM_BR ();
HTM_TxtF ("(%s)",Txt_INFO_SRC_HELP[InfoSrc]);
HTM_SPAN_End ();
}
if (Inf_FormsForEditionTypes[InfoSrc])
Inf_FormsForEditionTypes[InfoSrc] (InfoSrc);
HTM_TD_End ();
HTM_TR_End (); /* Select info source */
} if (InfoSrc == FromDB.Src)
HTM_TD_Begin ("class=\"DAT LT LIGHT_BLUE\"");
else
HTM_TD_Begin ("class=\"DAT LT\"");
Frm_BeginForm (Inf_ActionsSelecInfoSrc[Gbl.Crs.Info.Type]);
HTM_INPUT_RADIO ("InfoSrc",InfoSrc != FromDB.Src &&
(InfoSrc == Inf_NONE ||
InfoAvailable[InfoSrc]), // Info available for this source
"id=\"InfoSrc%u\" value=\"%u\"%s",
(unsigned) InfoSrc,(unsigned) InfoSrc,
InfoSrc == FromDB.Src ? " checked=\"checked\"" :
(InfoSrc == Inf_NONE ||
InfoAvailable[InfoSrc]) ? "" : // Info available for this source
" disabled=\"disabled\"");
Frm_EndForm ();
HTM_TD_End ();
/* Form for this info source */
if (InfoSrc == FromDB.Src)
HTM_TD_Begin ("class=\"LT LIGHT_BLUE\"");
else
HTM_TD_Begin ("class=\"LT\"");
HTM_LABEL_Begin ("for=\"InfoSrc%u\" class=\"%s\"",
(unsigned) InfoSrc,The_ClassFormInBox[Gbl.Prefs.Theme]);
HTM_Txt (Txt_INFO_SRC_FULL_TEXT[InfoSrc]);
HTM_LABEL_End ();
if (Txt_INFO_SRC_HELP[InfoSrc])
{
HTM_SPAN_Begin ("class=\"DAT\"");
HTM_BR ();
HTM_TxtF ("(%s)",Txt_INFO_SRC_HELP[InfoSrc]);
HTM_SPAN_End ();
}
if (Inf_FormsForEditionTypes[InfoSrc])
Inf_FormsForEditionTypes[InfoSrc] (InfoSrc);
HTM_TD_End ();
HTM_TR_End ();
}
/***** End table and box *****/ /***** End table and box *****/
Box_BoxTableEnd (); Box_BoxTableEnd ();
@ -1161,7 +1071,7 @@ void Inf_FormToEnterIntegratedEditor (Inf_Src_t InfoSrc)
extern const char *Txt_Edit; extern const char *Txt_Edit;
Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]); Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]);
Btn_PutConfirmButton (Txt_Edit); Btn_PutConfirmButton (Txt_Edit);
Frm_EndForm (); Frm_EndForm ();
} }
@ -1174,7 +1084,7 @@ void Inf_FormToEnterPlainTextEditor (Inf_Src_t InfoSrc)
extern const char *Txt_Edit_plain_text; extern const char *Txt_Edit_plain_text;
Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]); Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]);
Btn_PutConfirmButton (Txt_Edit_plain_text); Btn_PutConfirmButton (Txt_Edit_plain_text);
Frm_EndForm (); Frm_EndForm ();
} }
@ -1187,7 +1097,7 @@ void Inf_FormToEnterRichTextEditor (Inf_Src_t InfoSrc)
extern const char *Txt_Edit_rich_text; extern const char *Txt_Edit_rich_text;
Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]); Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]);
Btn_PutConfirmButton (Txt_Edit_rich_text); Btn_PutConfirmButton (Txt_Edit_rich_text);
Frm_EndForm (); Frm_EndForm ();
} }
@ -1204,18 +1114,18 @@ void Inf_FormToSendPage (Inf_Src_t InfoSrc)
/***** Begin form *****/ /***** Begin form *****/
Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]); Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]);
/***** File *****/ /***** File *****/
HTM_DIV_Begin ("class=\"CM\""); HTM_DIV_Begin ("class=\"CM\"");
HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]); HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
HTM_TxtColonNBSP (Txt_File); HTM_TxtColonNBSP (Txt_File);
HTM_INPUT_FILE (Fil_NAME_OF_PARAM_FILENAME_ORG,".htm,.html,.pdf,.zip", HTM_INPUT_FILE (Fil_NAME_OF_PARAM_FILENAME_ORG,".htm,.html,.pdf,.zip",
HTM_DONT_SUBMIT_ON_CHANGE, HTM_DONT_SUBMIT_ON_CHANGE,
NULL); NULL);
HTM_LABEL_End (); HTM_LABEL_End ();
HTM_DIV_End (); HTM_DIV_End ();
/***** Send button *****/ /***** Send button *****/
Btn_PutCreateButton (Txt_Upload_file); Btn_PutCreateButton (Txt_Upload_file);
/***** End form *****/ /***** End form *****/
Frm_EndForm (); Frm_EndForm ();
@ -1239,27 +1149,27 @@ void Inf_FormToSendURL (Inf_Src_t InfoSrc)
/***** Begin form *****/ /***** Begin form *****/
Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]); Frm_BeginForm (Inf_ActionsInfo[InfoSrc][Gbl.Crs.Info.Type]);
/***** Link *****/ /***** Link *****/
if ((FileURL = fopen (PathFile,"rb")) != NULL) if ((FileURL = fopen (PathFile,"rb")) != NULL)
{ {
if (fgets (Gbl.Crs.Info.URL,Cns_MAX_BYTES_WWW,FileURL) == NULL) if (fgets (Gbl.Crs.Info.URL,Cns_MAX_BYTES_WWW,FileURL) == NULL)
Gbl.Crs.Info.URL[0] = '\0'; Gbl.Crs.Info.URL[0] = '\0';
/* File is not longer needed. Close it */ /* File is not longer needed. Close it */
fclose (FileURL); fclose (FileURL);
} }
else else
Gbl.Crs.Info.URL[0] = '\0'; Gbl.Crs.Info.URL[0] = '\0';
HTM_DIV_Begin ("class=\"CM\""); HTM_DIV_Begin ("class=\"CM\"");
HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]); HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
HTM_TxtColonNBSP (Txt_URL); HTM_TxtColonNBSP (Txt_URL);
HTM_INPUT_URL ("InfoSrcURL",Gbl.Crs.Info.URL,HTM_DONT_SUBMIT_ON_CHANGE, HTM_INPUT_URL ("InfoSrcURL",Gbl.Crs.Info.URL,HTM_DONT_SUBMIT_ON_CHANGE,
"size=\"50\""); "size=\"50\"");
HTM_LABEL_End (); HTM_LABEL_End ();
HTM_DIV_End (); HTM_DIV_End ();
/***** Send button *****/ /***** Send button *****/
Btn_PutCreateButton (Txt_Send_URL); Btn_PutCreateButton (Txt_Send_URL);
/***** End form *****/ /***** End form *****/
Frm_EndForm (); Frm_EndForm ();
@ -1411,54 +1321,6 @@ Inf_Src_t Inf_GetInfoSrcFromForm (void)
(unsigned long) Inf_NONE); (unsigned long) Inf_NONE);
} }
/*****************************************************************************/
/********* Set info source for a type of course info from database ***********/
/*****************************************************************************/
void Inf_SetInfoSrcIntoDB (Inf_Src_t InfoSrc)
{
/***** Get if info source is already stored in database *****/
if (DB_QueryCOUNT ("can not get if info source is already stored in database",
"SELECT COUNT(*)"
" FROM crs_info_src"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type]))
// Info is already stored in database, so update it
{ // Update info source
if (InfoSrc == Inf_NONE)
DB_QueryUPDATE ("can not update info source",
"UPDATE crs_info_src"
" SET InfoSrc='%s',"
"MustBeRead='N'"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
Inf_NamesInDBForInfoSrc[Inf_NONE],
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type]);
else // MustBeRead remains unchanged
DB_QueryUPDATE ("can not update info source",
"UPDATE crs_info_src"
" SET InfoSrc='%s'"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
Inf_NamesInDBForInfoSrc[InfoSrc],
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type]);
}
else // Info is not stored in database, so insert it
DB_QueryINSERT ("can not insert info source",
"INSERT INTO crs_info_src"
" (CrsCod,InfoType,InfoSrc,MustBeRead)"
" VALUES"
" (%ld,'%s','%s','N')",
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type],
Inf_NamesInDBForInfoSrc[InfoSrc]);
}
/*****************************************************************************/ /*****************************************************************************/
/***** Get and check info source for a type of course info from database *****/ /***** Get and check info source for a type of course info from database *****/
/*****************************************************************************/ /*****************************************************************************/
@ -1470,19 +1332,13 @@ Inf_Src_t Inf_GetInfoSrcFromDB (long CrsCod,Inf_Type_t InfoType)
Inf_Src_t InfoSrc; Inf_Src_t InfoSrc;
/***** Get info source for a specific type of info from database *****/ /***** Get info source for a specific type of info from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get info source", if (Inf_DB_GetInfoSrc (&mysql_res,CrsCod,InfoType))
"SELECT InfoSrc" // row[0]
" FROM crs_info_src"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
CrsCod,
Inf_NamesInDBForInfoType[InfoType]))
{ {
/* Get row */ /* Get row */
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/* Get info source (row[0]) */ /* Get info source (row[0]) */
InfoSrc = Inf_ConvertFromStrDBToInfoSrc (row[0]); InfoSrc = Inf_DB_ConvertFromStrDBToInfoSrc (row[0]);
} }
else else
InfoSrc = Inf_NONE; InfoSrc = Inf_NONE;
@ -1499,7 +1355,7 @@ Inf_Src_t Inf_GetInfoSrcFromDB (long CrsCod,Inf_Type_t InfoType)
void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus, void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus,
long CrsCod, long CrsCod,
Inf_Type_t Type, Inf_Type_t InfoType,
struct Inf_FromDB *FromDB) struct Inf_FromDB *FromDB)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
@ -1510,20 +1366,13 @@ void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus,
FromDB->MustBeRead = false; FromDB->MustBeRead = false;
/***** Get info source for a specific type of info from database *****/ /***** Get info source for a specific type of info from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get info source", if (Inf_DB_GetInfoSrcAndMustBeRead (&mysql_res,CrsCod,InfoType) == 1)
"SELECT InfoSrc," // row[0]
"MustBeRead" // row[1]
" FROM crs_info_src"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
CrsCod,
Inf_NamesInDBForInfoType[Type]) == 1)
{ {
/* Get row */ /* Get row */
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
/* Get info source (row[0]) and if students must read info (row[1]) */ /* Get info source (row[0]) and if students must read info (row[1]) */
FromDB->Src = Inf_ConvertFromStrDBToInfoSrc (row[0]); FromDB->Src = Inf_DB_ConvertFromStrDBToInfoSrc (row[0]);
FromDB->MustBeRead = (row[1][0] == 'Y'); FromDB->MustBeRead = (row[1][0] == 'Y');
} }
@ -1536,7 +1385,7 @@ void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus,
case Inf_NONE: case Inf_NONE:
break; break;
case Inf_EDITOR: case Inf_EDITOR:
switch (Type) switch (InfoType)
{ {
case Inf_LECTURES: case Inf_LECTURES:
Syllabus->WhichSyllabus = Syl_LECTURES; Syllabus->WhichSyllabus = Syl_LECTURES;
@ -1559,19 +1408,19 @@ void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus,
} }
break; break;
case Inf_PLAIN_TEXT: case Inf_PLAIN_TEXT:
if (!Inf_CheckPlainTxt (CrsCod,Type)) if (!Inf_CheckPlainTxt (CrsCod,InfoType))
FromDB->Src = Inf_NONE; FromDB->Src = Inf_NONE;
break; break;
case Inf_RICH_TEXT: case Inf_RICH_TEXT:
if (!Inf_CheckRichTxt (CrsCod,Type)) if (!Inf_CheckRichTxt (CrsCod,InfoType))
FromDB->Src = Inf_NONE; FromDB->Src = Inf_NONE;
break; break;
case Inf_PAGE: case Inf_PAGE:
if (!Inf_CheckPage (CrsCod,Type)) if (!Inf_CheckPage (CrsCod,InfoType))
FromDB->Src = Inf_NONE; FromDB->Src = Inf_NONE;
break; break;
case Inf_URL: case Inf_URL:
if (!Inf_CheckURL (CrsCod,Type)) if (!Inf_CheckURL (CrsCod,InfoType))
FromDB->Src = Inf_NONE; FromDB->Src = Inf_NONE;
break; break;
} }
@ -1580,58 +1429,6 @@ void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus,
FromDB->MustBeRead = false; FromDB->MustBeRead = false;
} }
/*****************************************************************************/
/*** Convert a string with info type in database to a Inf_InfoType_t value ***/
/*****************************************************************************/
Inf_Type_t Inf_ConvertFromStrDBToInfoType (const char *StrInfoTypeDB)
{
Inf_Type_t InfoType;
for (InfoType = (Inf_Type_t) 0;
InfoType <= (Inf_Type_t) (Inf_NUM_TYPES - 1);
InfoType++)
if (!strcmp (StrInfoTypeDB,Inf_NamesInDBForInfoType[InfoType]))
return InfoType;
return (Inf_Type_t) 0;
}
/*****************************************************************************/
/** Convert a string with info source in database to a Inf_InfoSrc_t value ***/
/*****************************************************************************/
Inf_Src_t Inf_ConvertFromStrDBToInfoSrc (const char *StrInfoSrcDB)
{
Inf_Src_t InfoSrc;
for (InfoSrc = (Inf_Src_t) 0;
InfoSrc <= (Inf_Src_t) (Inf_NUM_SOURCES - 1);
InfoSrc++)
if (!strcmp (StrInfoSrcDB,Inf_NamesInDBForInfoSrc[InfoSrc]))
return InfoSrc;
return Inf_NONE;
}
/*****************************************************************************/
/********** Set info text for a type of course info from database ************/
/*****************************************************************************/
static void Inf_SetInfoTxtIntoDB (const char *InfoTxtHTML,const char *InfoTxtMD)
{
/***** Insert or replace info source for a specific type of course information *****/
DB_QueryREPLACE ("can not update info text",
"REPLACE INTO crs_info_txt"
" (CrsCod,InfoType,InfoTxtHTML,InfoTxtMD)"
" VALUES"
" (%ld,'%s','%s','%s')",
Gbl.Hierarchy.Crs.CrsCod,
Inf_NamesInDBForInfoType[Gbl.Crs.Info.Type],
InfoTxtHTML,
InfoTxtMD);
}
/*****************************************************************************/ /*****************************************************************************/
/********** Get info text for a type of course info from database ************/ /********** Get info text for a type of course info from database ************/
/*****************************************************************************/ /*****************************************************************************/
@ -1645,14 +1442,7 @@ void Inf_GetInfoTxtFromDB (long CrsCod,Inf_Type_t InfoType,
/***** Get info source for a specific type of course information /***** Get info source for a specific type of course information
(bibliography, FAQ, links or evaluation) from database *****/ (bibliography, FAQ, links or evaluation) from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get info text", if (Inf_DB_GetInfoTxt (&mysql_res,CrsCod,InfoType) == 1)
"SELECT InfoTxtHTML," // row[0]
"InfoTxtMD" // row[1]
" FROM crs_info_txt"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
CrsCod,
Inf_NamesInDBForInfoType[InfoType]) == 1)
{ {
/* Get info text */ /* Get info text */
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
@ -1737,13 +1527,13 @@ static bool Inf_CheckAndShowPlainTxt (void)
HTM_DIV_Begin ("class=\"DAT LM\""); HTM_DIV_Begin ("class=\"DAT LM\"");
/***** Convert to respectful HTML and insert links *****/ /***** Convert to respectful HTML and insert links *****/
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
TxtHTML,Cns_MAX_BYTES_LONG_TEXT,false); // Convert from HTML to recpectful HTML TxtHTML,Cns_MAX_BYTES_LONG_TEXT,false); // Convert from HTML to recpectful HTML
Str_InsertLinks (TxtHTML,Cns_MAX_BYTES_LONG_TEXT,60); // Insert links Str_InsertLinks (TxtHTML,Cns_MAX_BYTES_LONG_TEXT,60); // Insert links
/***** Write text *****/ /***** Write text *****/
HTM_Txt (TxtHTML); HTM_Txt (TxtHTML);
/***** End box *****/ /***** End box *****/
HTM_DIV_End (); HTM_DIV_End ();
@ -1825,75 +1615,75 @@ static bool Inf_CheckAndShowRichTxt (void)
HTM_DIV_Begin ("id=\"crs_info\" class=\"LM\""); HTM_DIV_Begin ("id=\"crs_info\" class=\"LM\"");
/***** Store text into a temporary .md file in HTML output directory *****/ /***** Store text into a temporary .md file in HTML output directory *****/
// TODO: change to another directory? // TODO: change to another directory?
/* Create a unique name for the .md file */ /* Create a unique name for the .md file */
snprintf (PathFileMD,sizeof (PathFileMD),"%s/%s.md", snprintf (PathFileMD,sizeof (PathFileMD),"%s/%s.md",
Cfg_PATH_OUT_PRIVATE,Gbl.UniqueNameEncrypted); Cfg_PATH_OUT_PRIVATE,Gbl.UniqueNameEncrypted);
snprintf (PathFileHTML,sizeof (PathFileHTML),"%s/%s.md.html", // Do not use only .html because that is the output temporary file snprintf (PathFileHTML,sizeof (PathFileHTML),"%s/%s.md.html", // Do not use only .html because that is the output temporary file
Cfg_PATH_OUT_PRIVATE,Gbl.UniqueNameEncrypted); Cfg_PATH_OUT_PRIVATE,Gbl.UniqueNameEncrypted);
/* Open Markdown file for writing */ /* Open Markdown file for writing */
if ((FileMD = fopen (PathFileMD,"wb")) == NULL) if ((FileMD = fopen (PathFileMD,"wb")) == NULL)
Err_ShowErrorAndExit ("Can not create temporary Markdown file."); Err_ShowErrorAndExit ("Can not create temporary Markdown file.");
/* Write text into Markdown file */ /* Write text into Markdown file */
fprintf (FileMD,"%s",TxtMD); fprintf (FileMD,"%s",TxtMD);
/* Close Markdown file */ /* Close Markdown file */
fclose (FileMD); fclose (FileMD);
/***** Convert from Markdown to HTML *****/ /***** Convert from Markdown to HTML *****/
/* MathJax 2.5.1 /* MathJax 2.5.1
#ifdef Cfg_MATHJAX_LOCAL #ifdef Cfg_MATHJAX_LOCAL
// Use the local copy of MathJax // Use the local copy of MathJax
snprintf (MathJaxURL,sizeof (MathJaxURL), snprintf (MathJaxURL,sizeof (MathJaxURL),
"=%s/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML", "=%s/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML",
Cfg_URL_SWAD_PUBLIC); Cfg_URL_SWAD_PUBLIC);
#else #else
// Use the MathJax Content Delivery Network (CDN) // Use the MathJax Content Delivery Network (CDN)
MathJaxURL[0] = '\0'; MathJaxURL[0] = '\0';
#endif #endif
*/ */
/* MathJax 3.0.1 */ /* MathJax 3.0.1 */
#ifdef Cfg_MATHJAX_LOCAL #ifdef Cfg_MATHJAX_LOCAL
// Use the local copy of MathJax // Use the local copy of MathJax
snprintf (MathJaxURL,sizeof (MathJaxURL),"=%s/mathjax/tex-chtml.js", snprintf (MathJaxURL,sizeof (MathJaxURL),"=%s/mathjax/tex-chtml.js",
Cfg_URL_SWAD_PUBLIC); Cfg_URL_SWAD_PUBLIC);
#else #else
// Use the MathJax Content Delivery Network (CDN) // Use the MathJax Content Delivery Network (CDN)
MathJaxURL[0] = '\0'; MathJaxURL[0] = '\0';
#endif #endif
// --ascii uses only ascii characters in output // --ascii uses only ascii characters in output
// (uses numerical entities instead of UTF-8) // (uses numerical entities instead of UTF-8)
// is mandatory in order to convert (with iconv) the UTF-8 output of pandoc to WINDOWS-1252 // is mandatory in order to convert (with iconv) the UTF-8 output of pandoc to WINDOWS-1252
snprintf (Command,sizeof (Command), snprintf (Command,sizeof (Command),
"iconv -f WINDOWS-1252 -t UTF-8 %s" "iconv -f WINDOWS-1252 -t UTF-8 %s"
" | " " | "
"pandoc --ascii --mathjax%s -f markdown_github+tex_math_dollars -t html5" "pandoc --ascii --mathjax%s -f markdown_github+tex_math_dollars -t html5"
" | " " | "
"iconv -f UTF-8 -t WINDOWS-1252 -o %s", "iconv -f UTF-8 -t WINDOWS-1252 -o %s",
PathFileMD, PathFileMD,
MathJaxURL, MathJaxURL,
PathFileHTML); PathFileHTML);
ReturnCode = system (Command); ReturnCode = system (Command);
if (ReturnCode == -1) if (ReturnCode == -1)
Err_ShowErrorAndExit ("Error when running command to convert from Markdown to HTML."); Err_ShowErrorAndExit ("Error when running command to convert from Markdown to HTML.");
/***** Remove Markdown file *****/ /***** Remove Markdown file *****/
unlink (PathFileMD); unlink (PathFileMD);
/***** Copy HTML file just created to HTML output *****/ /***** Copy HTML file just created to HTML output *****/
/* Open temporary HTML file for reading */ /* Open temporary HTML file for reading */
if ((FileHTML = fopen (PathFileHTML,"rb")) == NULL) if ((FileHTML = fopen (PathFileHTML,"rb")) == NULL)
Err_ShowErrorAndExit ("Can not open temporary HTML file."); Err_ShowErrorAndExit ("Can not open temporary HTML file.");
/* Copy from temporary HTML file to output file */ /* Copy from temporary HTML file to output file */
Fil_FastCopyOfOpenFiles (FileHTML,Gbl.F.Out); Fil_FastCopyOfOpenFiles (FileHTML,Gbl.F.Out);
/* Close and remove temporary HTML file */ /* Close and remove temporary HTML file */
fclose (FileHTML); fclose (FileHTML);
unlink (PathFileHTML); unlink (PathFileHTML);
/***** End box *****/ /***** End box *****/
HTM_DIV_End (); HTM_DIV_End ();
@ -1935,28 +1725,28 @@ void Inf_EditPlainTxtInfo (void)
/***** Begin form and box *****/ /***** Begin form and box *****/
Frm_BeginForm (Inf_ActionsRcvPlaTxtInfo[Gbl.Crs.Info.Type]); Frm_BeginForm (Inf_ActionsRcvPlaTxtInfo[Gbl.Crs.Info.Type]);
Box_BoxBegin (NULL,Txt_INFO_TITLE[Gbl.Crs.Info.Type], Box_BoxBegin (NULL,Txt_INFO_TITLE[Gbl.Crs.Info.Type],
NULL,NULL, NULL,NULL,
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE); HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
if (Gbl.Crs.Info.Type == Inf_INTRODUCTION || if (Gbl.Crs.Info.Type == Inf_INTRODUCTION ||
Gbl.Crs.Info.Type == Inf_TEACHING_GUIDE) Gbl.Crs.Info.Type == Inf_TEACHING_GUIDE)
Lay_WriteHeaderClassPhoto (false,false,Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Crs.CrsCod); Lay_WriteHeaderClassPhoto (false,false,Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Crs.CrsCod);
/***** Get info text from database *****/ /***** Get info text from database *****/
Inf_GetInfoTxtFromDB (Gbl.Hierarchy.Crs.CrsCod,Gbl.Crs.Info.Type, Inf_GetInfoTxtFromDB (Gbl.Hierarchy.Crs.CrsCod,Gbl.Crs.Info.Type,
TxtHTML,NULL); TxtHTML,NULL);
/***** Edition area *****/ /***** Edition area *****/
HTM_DIV_Begin ("class=\"CM\""); HTM_DIV_Begin ("class=\"CM\"");
Lay_HelpPlainEditor (); Lay_HelpPlainEditor ();
HTM_TEXTAREA_Begin ("name=\"Txt\" cols=\"80\" rows=\"20\""); HTM_TEXTAREA_Begin ("name=\"Txt\" cols=\"80\" rows=\"20\"");
HTM_Txt (TxtHTML); HTM_Txt (TxtHTML);
HTM_TEXTAREA_End (); HTM_TEXTAREA_End ();
HTM_DIV_End (); HTM_DIV_End ();
/***** Send button and end box *****/ /***** Send button and end box *****/
Box_BoxWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes); Box_BoxWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes);
Frm_EndForm (); Frm_EndForm ();
} }
@ -1990,28 +1780,28 @@ void Inf_EditRichTxtInfo (void)
/***** Begin form and box *****/ /***** Begin form and box *****/
Frm_BeginForm (Inf_ActionsRcvRchTxtInfo[Gbl.Crs.Info.Type]); Frm_BeginForm (Inf_ActionsRcvRchTxtInfo[Gbl.Crs.Info.Type]);
Box_BoxBegin (NULL,Txt_INFO_TITLE[Gbl.Crs.Info.Type], Box_BoxBegin (NULL,Txt_INFO_TITLE[Gbl.Crs.Info.Type],
NULL,NULL, NULL,NULL,
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE); HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
if (Gbl.Crs.Info.Type == Inf_INTRODUCTION || if (Gbl.Crs.Info.Type == Inf_INTRODUCTION ||
Gbl.Crs.Info.Type == Inf_TEACHING_GUIDE) Gbl.Crs.Info.Type == Inf_TEACHING_GUIDE)
Lay_WriteHeaderClassPhoto (false,false,Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Crs.CrsCod); Lay_WriteHeaderClassPhoto (false,false,Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Crs.CrsCod);
/***** Get info text from database *****/ /***** Get info text from database *****/
Inf_GetInfoTxtFromDB (Gbl.Hierarchy.Crs.CrsCod,Gbl.Crs.Info.Type, Inf_GetInfoTxtFromDB (Gbl.Hierarchy.Crs.CrsCod,Gbl.Crs.Info.Type,
TxtHTML,NULL); TxtHTML,NULL);
/***** Edition area *****/ /***** Edition area *****/
HTM_DIV_Begin ("class=\"CM\""); HTM_DIV_Begin ("class=\"CM\"");
Lay_HelpRichEditor (); Lay_HelpRichEditor ();
HTM_TEXTAREA_Begin ("name=\"Txt\" cols=\"80\" rows=\"20\""); HTM_TEXTAREA_Begin ("name=\"Txt\" cols=\"80\" rows=\"20\"");
HTM_Txt (TxtHTML); HTM_Txt (TxtHTML);
HTM_TEXTAREA_End (); HTM_TEXTAREA_End ();
HTM_DIV_End (); HTM_DIV_End ();
/***** Send button and end box *****/ /***** Send button and end box *****/
Box_BoxWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes); Box_BoxWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes);
Frm_EndForm (); Frm_EndForm ();
} }
@ -2041,10 +1831,10 @@ void Inf_RecAndChangePlainTxtInfo (void)
Txt_MarkdownFormat,Cns_MAX_BYTES_LONG_TEXT,true); // Store a copy in Markdown format Txt_MarkdownFormat,Cns_MAX_BYTES_LONG_TEXT,true); // Store a copy in Markdown format
/***** Update text of course info in database *****/ /***** Update text of course info in database *****/
Inf_SetInfoTxtIntoDB (Txt_HTMLFormat,Txt_MarkdownFormat); Inf_DB_SetInfoTxt (Txt_HTMLFormat,Txt_MarkdownFormat);
/***** Change info source to "plain text" in database *****/ /***** Change info source to "plain text" in database *****/
Inf_SetInfoSrcIntoDB (Txt_HTMLFormat[0] ? Inf_PLAIN_TEXT : Inf_DB_SetInfoSrc (Txt_HTMLFormat[0] ? Inf_PLAIN_TEXT :
Inf_NONE); Inf_NONE);
if (Txt_HTMLFormat[0]) if (Txt_HTMLFormat[0])
/***** Show the updated info *****/ /***** Show the updated info *****/
@ -2080,10 +1870,10 @@ void Inf_RecAndChangeRichTxtInfo (void)
Txt_MarkdownFormat,Cns_MAX_BYTES_LONG_TEXT,true); // Store a copy in Markdown format Txt_MarkdownFormat,Cns_MAX_BYTES_LONG_TEXT,true); // Store a copy in Markdown format
/***** Update text of course info in database *****/ /***** Update text of course info in database *****/
Inf_SetInfoTxtIntoDB (Txt_HTMLFormat,Txt_MarkdownFormat); Inf_DB_SetInfoTxt (Txt_HTMLFormat,Txt_MarkdownFormat);
/***** Change info source to "rich text" in database *****/ /***** Change info source to "rich text" in database *****/
Inf_SetInfoSrcIntoDB (Txt_HTMLFormat[0] ? Inf_RICH_TEXT : Inf_DB_SetInfoSrc (Txt_HTMLFormat[0] ? Inf_RICH_TEXT :
Inf_NONE); Inf_NONE);
if (Txt_HTMLFormat[0]) if (Txt_HTMLFormat[0])
/***** Show the updated info *****/ /***** Show the updated info *****/
@ -2137,7 +1927,7 @@ void Inf_ReceiveURLInfo (void)
if (URLIsOK) if (URLIsOK)
{ {
/***** Change info source to URL in database *****/ /***** Change info source to URL in database *****/
Inf_SetInfoSrcIntoDB (Inf_URL); Inf_DB_SetInfoSrc (Inf_URL);
/***** Show the updated info *****/ /***** Show the updated info *****/
Inf_ShowInfo (); Inf_ShowInfo ();
@ -2145,7 +1935,7 @@ void Inf_ReceiveURLInfo (void)
else else
{ {
/***** Change info source to none in database *****/ /***** Change info source to none in database *****/
Inf_SetInfoSrcIntoDB (Inf_NONE); Inf_DB_SetInfoSrc (Inf_NONE);
/***** Show again the form to select and send course info *****/ /***** Show again the form to select and send course info *****/
Inf_FormsToSelSendInfo (); Inf_FormsToSelSendInfo ();
@ -2274,7 +2064,7 @@ void Inf_ReceivePagInfo (void)
if (FileIsOK) if (FileIsOK)
{ {
/***** Change info source to page in database *****/ /***** Change info source to page in database *****/
Inf_SetInfoSrcIntoDB (Inf_PAGE); Inf_DB_SetInfoSrc (Inf_PAGE);
/***** Show the updated info *****/ /***** Show the updated info *****/
Inf_ShowInfo (); Inf_ShowInfo ();
@ -2282,7 +2072,7 @@ void Inf_ReceivePagInfo (void)
else else
{ {
/***** Change info source to none in database *****/ /***** Change info source to none in database *****/
Inf_SetInfoSrcIntoDB (Inf_NONE); Inf_DB_SetInfoSrc (Inf_NONE);
/***** Show again the form to select and send course info *****/ /***** Show again the form to select and send course info *****/
Inf_FormsToSelSendInfo (); Inf_FormsToSelSendInfo ();

View File

@ -1,4 +1,4 @@
// swad_info.c: info about course // swad_info.h: info about course
#ifndef _SWAD_INF #ifndef _SWAD_INF
#define _SWAD_INF #define _SWAD_INF
@ -88,7 +88,7 @@ void Inf_WriteMsgYouMustReadInfo (void);
void Inf_ChangeForceReadInfo (void); void Inf_ChangeForceReadInfo (void);
void Inf_ChangeIHaveReadInfo (void); void Inf_ChangeIHaveReadInfo (void);
bool Inf_GetIfIMustReadAnyCrsInfoInThisCrs (void); bool Inf_GetIfIMustReadAnyCrsInfoInThisCrs (void);
void Inf_RemoveUsrFromCrsInfoRead (long UsrCod,long CrsCod); void Inf_DB_RemoveUsrFromCrsInfoRead (long UsrCod,long CrsCod);
void Inf_BuildPathPage (long CrsCod,Inf_Type_t InfoType,char PathDir[PATH_MAX + 1]); void Inf_BuildPathPage (long CrsCod,Inf_Type_t InfoType,char PathDir[PATH_MAX + 1]);
void Inf_WriteURLIntoTxtBuffer (char TxtBuffer[Cns_MAX_BYTES_WWW + 1]); void Inf_WriteURLIntoTxtBuffer (char TxtBuffer[Cns_MAX_BYTES_WWW + 1]);
void Inf_SetInfoSrc (void); void Inf_SetInfoSrc (void);
@ -99,14 +99,11 @@ void Inf_FormToEnterRichTextEditor (Inf_Src_t InfoSrc);
void Inf_FormToSendPage (Inf_Src_t InfoSrc); void Inf_FormToSendPage (Inf_Src_t InfoSrc);
void Inf_FormToSendURL (Inf_Src_t InfoSrc); void Inf_FormToSendURL (Inf_Src_t InfoSrc);
Inf_Src_t Inf_GetInfoSrcFromForm (void); Inf_Src_t Inf_GetInfoSrcFromForm (void);
void Inf_SetInfoSrcIntoDB (Inf_Src_t InfoSrc);
Inf_Src_t Inf_GetInfoSrcFromDB (long CrsCod,Inf_Type_t InfoType); Inf_Src_t Inf_GetInfoSrcFromDB (long CrsCod,Inf_Type_t InfoType);
void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus, void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus,
long CrsCod, long CrsCod,
Inf_Type_t Type, Inf_Type_t InfoType,
struct Inf_FromDB *FromDB); struct Inf_FromDB *FromDB);
Inf_Type_t Inf_ConvertFromStrDBToInfoType (const char *StrInfoTypeDB);
Inf_Src_t Inf_ConvertFromStrDBToInfoSrc (const char *StrInfoSrcDB);
void Inf_GetInfoTxtFromDB (long CrsCod,Inf_Type_t InfoType, void Inf_GetInfoTxtFromDB (long CrsCod,Inf_Type_t InfoType,
char InfoTxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1], char InfoTxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1],

303
swad_info_database.c Normal file
View File

@ -0,0 +1,303 @@
// swad_info_database.c: info about course, operations with database
/*
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-2021 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 <limits.h> // For maximum values
// #include <linux/limits.h> // For PATH_MAX, NAME_MAX
// #include <stddef.h> // For NULL
// #include <stdlib.h> // For getenv, etc
// #include <stdsoap2.h> // For SOAP_OK and soap functions
#include <string.h> // For string functions
// #include <unistd.h> // For unlink
// #include "swad_action.h"
// #include "swad_box.h"
#include "swad_database.h"
// #include "swad_error.h"
// #include "swad_form.h"
#include "swad_global.h"
// #include "swad_HTML.h"
// #include "swad_info.h"
// #include "swad_parameter.h"
// #include "swad_string.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/****************************** Private types ********************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private constants *****************************/
/*****************************************************************************/
static const char *Inf_DB_NamesForInfoType[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = "intro", // TODO: Change this to "introduction"!
[Inf_TEACHING_GUIDE] = "description", // TODO: Change this to "guide"!
[Inf_LECTURES ] = "theory", // TODO: Change this to "lectures"!
[Inf_PRACTICALS ] = "practices", // TODO: Change this to "practicals"!
[Inf_BIBLIOGRAPHY ] = "bibliography",
[Inf_FAQ ] = "FAQ",
[Inf_LINKS ] = "links",
[Inf_ASSESSMENT ] = "assessment",
};
static const char *Inf_DB_NamesForInfoSrc[Inf_NUM_SOURCES] =
{
[Inf_NONE ] = "none",
[Inf_EDITOR ] = "editor",
[Inf_PLAIN_TEXT] = "plain_text",
[Inf_RICH_TEXT ] = "rich_text",
[Inf_PAGE ] = "page",
[Inf_URL ] = "URL",
};
/*****************************************************************************/
/**************************** Private prototypes *****************************/
/*****************************************************************************/
/*****************************************************************************/
/*** Convert a string with info type in database to a Inf_InfoType_t value ***/
/*****************************************************************************/
Inf_Type_t Inf_DB_ConvertFromStrDBToInfoType (const char *StrInfoTypeDB)
{
Inf_Type_t InfoType;
for (InfoType = (Inf_Type_t) 0;
InfoType <= (Inf_Type_t) (Inf_NUM_TYPES - 1);
InfoType++)
if (!strcmp (StrInfoTypeDB,Inf_DB_NamesForInfoType[InfoType]))
return InfoType;
return (Inf_Type_t) 0;
}
/*****************************************************************************/
/********* Set info source for a type of course info from database ***********/
/*****************************************************************************/
void Inf_DB_SetInfoSrc (Inf_Src_t InfoSrc)
{
/***** Get if info source is already stored in database *****/
if (DB_QueryCOUNT ("can not get if info source is already stored in database",
"SELECT COUNT(*)"
" FROM crs_info_src"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type]))
// Info is already stored in database, so update it
{ // Update info source
if (InfoSrc == Inf_NONE)
DB_QueryUPDATE ("can not update info source",
"UPDATE crs_info_src"
" SET InfoSrc='%s',"
"MustBeRead='N'"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
Inf_DB_NamesForInfoSrc[Inf_NONE],
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type]);
else // MustBeRead remains unchanged
DB_QueryUPDATE ("can not update info source",
"UPDATE crs_info_src"
" SET InfoSrc='%s'"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
Inf_DB_NamesForInfoSrc[InfoSrc],
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type]);
}
else // Info is not stored in database, so insert it
DB_QueryINSERT ("can not insert info source",
"INSERT INTO crs_info_src"
" (CrsCod,InfoType,InfoSrc,MustBeRead)"
" VALUES"
" (%ld,'%s','%s','N')",
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type],
Inf_DB_NamesForInfoSrc[InfoSrc]);
}
/*****************************************************************************/
/***************** Get info source for a type of course info *****************/
/*****************************************************************************/
unsigned Inf_DB_GetInfoSrc (MYSQL_RES **mysql_res,
long CrsCod,Inf_Type_t InfoType)
{
/***** Get info source for a specific type of info from database *****/
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get info source",
"SELECT InfoSrc" // row[0]
" FROM crs_info_src"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
CrsCod,
Inf_DB_NamesForInfoType[InfoType]);
}
/*****************************************************************************/
/*** Get info source and wether info must be read for a type of course info **/
/*****************************************************************************/
unsigned Inf_DB_GetInfoSrcAndMustBeRead (MYSQL_RES **mysql_res,
long CrsCod,Inf_Type_t InfoType)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get info source",
"SELECT InfoSrc," // row[0]
"MustBeRead" // row[1]
" FROM crs_info_src"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
CrsCod,
Inf_DB_NamesForInfoType[InfoType]);
}
/*****************************************************************************/
/** Convert a string with info source in database to a Inf_InfoSrc_t value ***/
/*****************************************************************************/
Inf_Src_t Inf_DB_ConvertFromStrDBToInfoSrc (const char *StrInfoSrcDB)
{
Inf_Src_t InfoSrc;
for (InfoSrc = (Inf_Src_t) 0;
InfoSrc <= (Inf_Src_t) (Inf_NUM_SOURCES - 1);
InfoSrc++)
if (!strcmp (StrInfoSrcDB,Inf_DB_NamesForInfoSrc[InfoSrc]))
return InfoSrc;
return Inf_NONE;
}
/*****************************************************************************/
/********** Set info text for a type of course info from database ************/
/*****************************************************************************/
void Inf_DB_SetInfoTxt (const char *InfoTxtHTML,const char *InfoTxtMD)
{
/***** Insert or replace info source for a specific type of course information *****/
DB_QueryREPLACE ("can not update info text",
"REPLACE INTO crs_info_txt"
" (CrsCod,InfoType,InfoTxtHTML,InfoTxtMD)"
" VALUES"
" (%ld,'%s','%s','%s')",
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type],
InfoTxtHTML,
InfoTxtMD);
}
/*****************************************************************************/
/********** Get info text for a type of course info from database ************/
/*****************************************************************************/
unsigned Inf_DB_GetInfoTxt (MYSQL_RES **mysql_res,
long CrsCod,Inf_Type_t InfoType)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get info text",
"SELECT InfoTxtHTML," // row[0]
"InfoTxtMD" // row[1]
" FROM crs_info_txt"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
CrsCod,
Inf_DB_NamesForInfoType[InfoType]);
}
/*****************************************************************************/
/***************** Set if students must read course info *********************/
/*****************************************************************************/
void Inf_DB_SetForceRead (bool MustBeRead)
{
DB_QueryUPDATE ("can not update if info must be read",
"UPDATE crs_info_src"
" SET MustBeRead='%c'"
" WHERE CrsCod=%ld"
" AND InfoType='%s'",
MustBeRead ? 'Y' :
'N',
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type]);
}
/*****************************************************************************/
/********************* Set if I have read course info ************************/
/*****************************************************************************/
void Inf_DB_SetIHaveRead (bool IHaveRead)
{
if (IHaveRead)
/***** Insert I have read course information *****/
DB_QueryREPLACE ("can not set that I have read course info",
"REPLACE INTO crs_info_read"
" (UsrCod,CrsCod,InfoType)"
" VALUES"
" (%ld,%ld,'%s')",
Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type]);
else
/***** Remove I have read course information *****/
DB_QueryDELETE ("can not set that I have not read course info",
"DELETE FROM crs_info_read"
" WHERE UsrCod=%ld"
" AND CrsCod=%ld"
" AND InfoType='%s'",
Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type]);
}
/*****************************************************************************/
/******************** Check I have read a course info ************************/
/*****************************************************************************/
bool Inf_DB_CheckIfIHaveReadInfo (void)
{
return (DB_QueryCOUNT ("can not get if I have read course info",
"SELECT COUNT(*)"
" FROM crs_info_read"
" WHERE UsrCod=%ld"
" AND CrsCod=%ld"
" AND InfoType='%s'",
Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Hierarchy.Crs.CrsCod,
Inf_DB_NamesForInfoType[Gbl.Crs.Info.Type]) != 0);
}

71
swad_info_database.h Normal file
View File

@ -0,0 +1,71 @@
// swad_info_database.h: info about course, operations with database
#ifndef _SWAD_INF_DB
#define _SWAD_INF_DB
/*
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-2021 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 <stdbool.h> // For boolean type
// #include "swad_constant.h"
#include "swad_info.h"
// #include "swad_syllabus.h"
/*****************************************************************************/
/***************************** Public constants ******************************/
/*****************************************************************************/
/*****************************************************************************/
/******************************* Public types ********************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
//------------------------------- Info type -----------------------------------
Inf_Type_t Inf_DB_ConvertFromStrDBToInfoType (const char *StrInfoTypeDB);
//------------------------------ Info source ----------------------------------
void Inf_DB_SetInfoSrc (Inf_Src_t InfoSrc);
unsigned Inf_DB_GetInfoSrc (MYSQL_RES **mysql_res,
long CrsCod,Inf_Type_t InfoType);
unsigned Inf_DB_GetInfoSrcAndMustBeRead (MYSQL_RES **mysql_res,
long CrsCod,Inf_Type_t InfoType);
Inf_Src_t Inf_DB_ConvertFromStrDBToInfoSrc (const char *StrInfoSrcDB);
//------------------------------- Info text -----------------------------------
void Inf_DB_SetInfoTxt (const char *InfoTxtHTML,const char *InfoTxtMD);
unsigned Inf_DB_GetInfoTxt (MYSQL_RES **mysql_res,
long CrsCod,Inf_Type_t InfoType);
//------------------------- Info read by students? ----------------------------
void Inf_DB_SetForceRead (bool MustBeRead);
void Inf_DB_SetIHaveRead (bool IHaveRead);
bool Inf_DB_CheckIfIHaveReadInfo (void);
#endif

View File

@ -42,6 +42,7 @@
#include "swad_forum.h" #include "swad_forum.h"
#include "swad_global.h" #include "swad_global.h"
#include "swad_HTML.h" #include "swad_HTML.h"
#include "swad_info_database.h"
#include "swad_parameter.h" #include "swad_parameter.h"
#include "swad_string.h" #include "swad_string.h"
#include "swad_xml.h" #include "swad_xml.h"
@ -964,7 +965,7 @@ void Syl_RemoveItemSyllabus (void)
/***** We are editing a syllabus with the internal editor, /***** We are editing a syllabus with the internal editor,
so change info source to internal editor in database *****/ so change info source to internal editor in database *****/
Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR : Inf_DB_SetInfoSrc (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR :
Inf_NONE); Inf_NONE);
/***** Show the updated syllabus to continue editing it *****/ /***** Show the updated syllabus to continue editing it *****/
@ -1070,7 +1071,7 @@ static void Syl_ChangePlaceItemSyllabus (Syl_ChangePosItem_t UpOrDownPos)
/***** We are editing a syllabus with the internal editor, /***** We are editing a syllabus with the internal editor,
so change info source to internal editor in database *****/ so change info source to internal editor in database *****/
Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR : Inf_DB_SetInfoSrc (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR :
Inf_NONE); Inf_NONE);
/***** Show the updated syllabus to continue editing it *****/ /***** Show the updated syllabus to continue editing it *****/
@ -1239,7 +1240,7 @@ static void Syl_ChangeLevelItemSyllabus (Syl_ChangeLevelItem_t IncreaseOrDecreas
/***** We are editing a syllabus with the internal editor, /***** We are editing a syllabus with the internal editor,
so change info source to internal editor in database *****/ so change info source to internal editor in database *****/
Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR : Inf_DB_SetInfoSrc (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR :
Inf_NONE); Inf_NONE);
/***** Show the updated syllabus to continue editing it *****/ /***** Show the updated syllabus to continue editing it *****/
@ -1310,7 +1311,7 @@ void Syl_InsertItemSyllabus (void)
/***** We are editing a syllabus with the internal editor, /***** We are editing a syllabus with the internal editor,
so change info source to internal editor in database *****/ so change info source to internal editor in database *****/
Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR : Inf_DB_SetInfoSrc (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR :
Inf_NONE); Inf_NONE);
/***** Show the updated syllabus to continue editing it *****/ /***** Show the updated syllabus to continue editing it *****/
@ -1362,7 +1363,7 @@ void Syl_ModifyItemSyllabus (void)
/***** We are editing a syllabus with the internal editor, /***** We are editing a syllabus with the internal editor,
so change info source to internal editor in database *****/ so change info source to internal editor in database *****/
Inf_SetInfoSrcIntoDB (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR : Inf_DB_SetInfoSrc (Syl_LstItemsSyllabus.NumItems ? Inf_EDITOR :
Inf_NONE); Inf_NONE);
/***** Show the updated syllabus to continue editing it *****/ /***** Show the updated syllabus to continue editing it *****/

View File

@ -3031,7 +3031,7 @@ bool Usr_GetParamOtherUsrCodEncryptedAndGetUsrData (void)
/***** Check if user exists and get her/his data *****/ /***** Check if user exists and get her/his data *****/
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CURRENT_CRS)) Usr_GET_ROLE_IN_CURRENT_CRS))
// Existing user // Existing user
return true; return true;