mirror of https://github.com/acanas/swad-core.git
Version19.93
This commit is contained in:
parent
9ad0384944
commit
22dea9e2af
|
@ -1052,7 +1052,7 @@ void Ctr_GetListCentres (long InsCod)
|
|||
static const char *OrderBySubQuery[Ctr_NUM_ORDERS] =
|
||||
{
|
||||
[Ctr_ORDER_BY_CENTRE ] = "FullName",
|
||||
[Ctr_ORDER_BY_NUM_TCHS] = "NumUsrs DESC,FullName",
|
||||
[Ctr_ORDER_BY_NUM_USRS] = "NumUsrs DESC,FullName",
|
||||
};
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
|
@ -2576,8 +2576,8 @@ static void Ctr_PutHeadCentresForSeeing (bool OrderSelectable)
|
|||
|
||||
HTM_TH_Empty (1);
|
||||
|
||||
for (Order = Ctr_ORDER_BY_CENTRE;
|
||||
Order <= Ctr_ORDER_BY_NUM_TCHS;
|
||||
for (Order = (Ctr_Order_t) 0;
|
||||
Order <= (Ctr_Order_t) (Ctr_NUM_ORDERS - 1);
|
||||
Order++)
|
||||
{
|
||||
HTM_TH_Begin (1,1,Order == Ctr_ORDER_BY_CENTRE ? "LM" :
|
||||
|
|
|
@ -79,7 +79,7 @@ struct Centre
|
|||
typedef enum
|
||||
{
|
||||
Ctr_ORDER_BY_CENTRE = 0,
|
||||
Ctr_ORDER_BY_NUM_TCHS = 1,
|
||||
Ctr_ORDER_BY_NUM_USRS = 1,
|
||||
} Ctr_Order_t;
|
||||
#define Ctr_ORDER_DEFAULT Ctr_ORDER_BY_CENTRE
|
||||
|
||||
|
|
|
@ -490,13 +490,14 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
|
|||
En OpenSWAD:
|
||||
ps2pdf source.ps destination.pdf
|
||||
*/
|
||||
#define Log_PLATFORM_VERSION "SWAD 19.92.1 (2019-12-15)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 19.93 (2019-12-15)"
|
||||
#define CSS_FILE "swad19.90.1.css"
|
||||
#define JS_FILE "swad19.91.1.js"
|
||||
/*
|
||||
// TODO: Hacer un nuevo rol en los TFG: tutor externo (profesor de áreas no vinculadas con el centro, profesionales de empresas, etc.)
|
||||
// TODO: Impedir la creación y edición de proyectos si no son editables.
|
||||
|
||||
Version 19.93: Dec 15, 2019 Code refactoring. (248907 lines)
|
||||
Version 19.92.1: Dec 15, 2019 Code refactoring. (248629 lines)
|
||||
Version 19.92: Dec 14, 2019 New module for log database tables. (248625 lines)
|
||||
Version 19.91.2: Dec 14, 2019 Code refactoring related to doubles. (248538 lines)
|
||||
|
|
|
@ -2771,8 +2771,8 @@ static void Fig_GetAndShowOERsStats (void)
|
|||
|
||||
HTM_TR_End ();
|
||||
|
||||
for (License = 0;
|
||||
License < Brw_NUM_LICENSES;
|
||||
for (License = (Brw_License_t) 0;
|
||||
License <= (Brw_License_t) (Brw_NUM_LICENSES - 1);
|
||||
License++)
|
||||
{
|
||||
Fig_GetNumberOfOERsFromDB (Gbl.Scope.Current,License,NumFiles);
|
||||
|
@ -3089,7 +3089,7 @@ static void Fig_GetAndShowTestsStats (void)
|
|||
HTM_TR_End ();
|
||||
|
||||
for (AnsType = (Tst_AnswerType_t) 0;
|
||||
AnsType < Tst_NUM_ANS_TYPES;
|
||||
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
|
||||
AnsType++)
|
||||
{
|
||||
/***** Get the stats about test questions from this location *****/
|
||||
|
@ -3294,7 +3294,7 @@ static void Fig_GetAndShowTimelineActivityStats (void)
|
|||
|
||||
/***** Get total number of following/followers from database *****/
|
||||
for (NoteType = (TL_NoteType_t) 0;
|
||||
NoteType < TL_NUM_NOTE_TYPES;
|
||||
NoteType <= (TL_NoteType_t) (TL_NUM_NOTE_TYPES - 1);
|
||||
NoteType++)
|
||||
{
|
||||
switch (Gbl.Scope.Current)
|
||||
|
@ -4233,7 +4233,7 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void)
|
|||
|
||||
/***** For each notify event... *****/
|
||||
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
|
||||
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
|
||||
NotifyEvent <= (Ntf_NotifyEvent_t) (Ntf_NUM_NOTIFY_EVENTS - 1);
|
||||
NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
|
||||
{
|
||||
/* Get the number of users who want to be notified by email on this event, from database */
|
||||
|
@ -4340,7 +4340,7 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void)
|
|||
|
||||
/***** Write number of users who want to be notified by email on each event *****/
|
||||
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
|
||||
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
|
||||
NotifyEvent <= (Ntf_NotifyEvent_t) (Ntf_NUM_NOTIFY_EVENTS - 1);
|
||||
NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -4423,7 +4423,7 @@ static void Fig_GetAndShowNoticesStats (void)
|
|||
|
||||
/***** Get the number of notices active and obsolete *****/
|
||||
for (NoticeStatus = (Not_Status_t) 0;
|
||||
NoticeStatus < Not_NUM_STATUS;
|
||||
NoticeStatus <= (Not_Status_t) (Not_NUM_STATUS - 1);
|
||||
NoticeStatus++)
|
||||
{
|
||||
NumNotices[NoticeStatus] = Not_GetNumNotices (Gbl.Scope.Current,NoticeStatus,&NumNotif);
|
||||
|
@ -4706,7 +4706,7 @@ static void Fig_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject,
|
|||
|
||||
/***** For each privacy option... *****/
|
||||
for (Visibility = (Pri_Visibility_t) 0;
|
||||
Visibility < Pri_NUM_OPTIONS_PRIVACY;
|
||||
Visibility <= (Pri_Visibility_t) (Pri_NUM_OPTIONS_PRIVACY - 1);
|
||||
Visibility++)
|
||||
if (MaskAllowedVisibility & (1 << Visibility))
|
||||
{
|
||||
|
@ -4723,7 +4723,7 @@ static void Fig_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject,
|
|||
|
||||
/***** Write number of users who have chosen each privacy option *****/
|
||||
for (Visibility = (Pri_Visibility_t) 0;
|
||||
Visibility < Pri_NUM_OPTIONS_PRIVACY;
|
||||
Visibility <= (Pri_Visibility_t) (Pri_NUM_OPTIONS_PRIVACY - 1);
|
||||
Visibility++)
|
||||
if (MaskAllowedVisibility & (1 << Visibility))
|
||||
{
|
||||
|
@ -4761,18 +4761,18 @@ static void Fig_GetAndShowNumUsrsPerCookies (void)
|
|||
unsigned i;
|
||||
static const char AcceptedInDB[2] =
|
||||
{
|
||||
'N', // false
|
||||
'Y' // true
|
||||
[false] = 'N',
|
||||
[true ] = 'Y'
|
||||
};
|
||||
static const char *AcceptedClass[2] =
|
||||
{
|
||||
"DAT_RED", // false
|
||||
"DAT_GREEN" // true
|
||||
[false] = "DAT_RED",
|
||||
[true ] = "DAT_GREEN"
|
||||
};
|
||||
static const char *AcceptedSymbol[2] =
|
||||
{
|
||||
"✗", // false
|
||||
"✓" // true
|
||||
[false] = "✗",
|
||||
[true ] = "✓"
|
||||
};
|
||||
|
||||
char *SubQuery;
|
||||
|
@ -4869,7 +4869,7 @@ static void Fig_GetAndShowNumUsrsPerLanguage (void)
|
|||
|
||||
/***** For each language... *****/
|
||||
for (Lan = (Lan_Language_t) 1;
|
||||
Lan <= Lan_NUM_LANGUAGES;
|
||||
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
|
||||
Lan++)
|
||||
{
|
||||
/* Get the number of users who have chosen this language from database */
|
||||
|
@ -4885,7 +4885,7 @@ static void Fig_GetAndShowNumUsrsPerLanguage (void)
|
|||
|
||||
/***** Write number of users who have chosen each language *****/
|
||||
for (Lan = (Lan_Language_t) 1;
|
||||
Lan <= Lan_NUM_LANGUAGES;
|
||||
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
|
||||
Lan++)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -5107,7 +5107,7 @@ static void Fig_GetAndShowNumUsrsPerIconSet (void)
|
|||
|
||||
/***** For each icon set... *****/
|
||||
for (IconSet = (Ico_IconSet_t) 0;
|
||||
IconSet < Ico_NUM_ICON_SETS;
|
||||
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
|
||||
IconSet++)
|
||||
{
|
||||
/* Get the number of users who have chosen this icon set from database */
|
||||
|
@ -5123,7 +5123,7 @@ static void Fig_GetAndShowNumUsrsPerIconSet (void)
|
|||
|
||||
/***** Write number of users who have chosen each icon set *****/
|
||||
for (IconSet = (Ico_IconSet_t) 0;
|
||||
IconSet < Ico_NUM_ICON_SETS;
|
||||
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
|
||||
IconSet++)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -5187,7 +5187,7 @@ static void Fig_GetAndShowNumUsrsPerMenu (void)
|
|||
|
||||
/***** For each menu... *****/
|
||||
for (Menu = (Mnu_Menu_t) 0;
|
||||
Menu < Mnu_NUM_MENUS;
|
||||
Menu <= (Mnu_Menu_t) (Mnu_NUM_MENUS - 1);
|
||||
Menu++)
|
||||
{
|
||||
/* Get number of users who have chosen this menu from database */
|
||||
|
@ -5203,7 +5203,7 @@ static void Fig_GetAndShowNumUsrsPerMenu (void)
|
|||
|
||||
/***** Write number of users who have chosen each menu *****/
|
||||
for (Menu = (Mnu_Menu_t) 0;
|
||||
Menu < Mnu_NUM_MENUS;
|
||||
Menu <= (Mnu_Menu_t) (Mnu_NUM_MENUS - 1);
|
||||
Menu++)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -5263,7 +5263,7 @@ static void Fig_GetAndShowNumUsrsPerTheme (void)
|
|||
|
||||
/***** For each theme... *****/
|
||||
for (Theme = (The_Theme_t) 0;
|
||||
Theme < The_NUM_THEMES;
|
||||
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
|
||||
Theme++)
|
||||
{
|
||||
/* Get number of users who have chosen this theme from database */
|
||||
|
@ -5279,7 +5279,7 @@ static void Fig_GetAndShowNumUsrsPerTheme (void)
|
|||
|
||||
/***** Write number of users who have chosen each theme *****/
|
||||
for (Theme = (The_Theme_t) 0;
|
||||
Theme < The_NUM_THEMES;
|
||||
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
|
||||
Theme++)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
|
|
@ -2374,7 +2374,7 @@ static void Brw_GetParamsPathInTreeAndFileName (void)
|
|||
/***** Get the name of the file, folder or link *****/
|
||||
Gbl.FileBrowser.FilFolLnk.Type = Brw_IS_UNKNOWN;
|
||||
for (FileType = (Brw_FileType_t) 0;
|
||||
FileType < Brw_NUM_FILE_TYPES;
|
||||
FileType <= (Brw_FileType_t) (Brw_NUM_FILE_TYPES - 1);
|
||||
FileType++)
|
||||
// File names with heading and trailing spaces are allowed
|
||||
if (Par_GetParAndChangeFormat (Brw_FileTypeParamName[FileType],
|
||||
|
@ -3540,7 +3540,6 @@ static void Brw_ShowFileBrowser (void)
|
|||
extern const char *Txt_Temporary_private_storage_area;
|
||||
extern const char *Txt_Project_documents;
|
||||
extern const char *Txt_Project_assessment;
|
||||
|
||||
const char *Brw_TitleOfFileBrowser[Brw_NUM_TYPES_FILE_BROWSER];
|
||||
const char *Brw_HelpOfFileBrowser[Brw_NUM_TYPES_FILE_BROWSER];
|
||||
struct Brw_NumObjects Removed;
|
||||
|
@ -9649,8 +9648,8 @@ void Brw_ShowFileMetadata (void)
|
|||
{
|
||||
HTM_SELECT_Begin (false,
|
||||
"id=\"License\" name=\"License\" class=\"LICENSE\"");
|
||||
for (License = 0;
|
||||
License < Brw_NUM_LICENSES;
|
||||
for (License = (Brw_License_t) 0;
|
||||
License <= (Brw_License_t) (Brw_NUM_LICENSES - 1);
|
||||
License++)
|
||||
{
|
||||
LicenseUnsigned = (unsigned) License;
|
||||
|
|
|
@ -1750,7 +1750,7 @@ static void For_PutFormWhichForums (void)
|
|||
HTM_UL_Begin (NULL);
|
||||
|
||||
for (ForumSet = (For_ForumSet_t) 0;
|
||||
ForumSet < For_NUM_FORUM_SETS;
|
||||
ForumSet <= (For_ForumSet_t) (For_NUM_FORUM_SETS - 1);
|
||||
ForumSet++)
|
||||
{
|
||||
HTM_LI_Begin (NULL);
|
||||
|
|
|
@ -195,7 +195,7 @@ void Gbl_InitializeGlobals (void)
|
|||
Gbl.Usrs.Selected.ParamSuffix = NULL;// Don't add suffix to param names
|
||||
Gbl.Usrs.Selected.Option = Usr_OPTION_UNKNOWN;
|
||||
for (Role = (Rol_Role_t) 0;
|
||||
Role < Rol_NUM_ROLES;
|
||||
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
|
||||
Role++)
|
||||
{
|
||||
Gbl.Usrs.LstUsrs[Role].Lst = NULL;
|
||||
|
@ -462,7 +462,7 @@ void Gbl_Cleanup (void)
|
|||
Plg_FreeListPlugins ();
|
||||
|
||||
for (Role = (Rol_Role_t) 0;
|
||||
Role < Rol_NUM_ROLES;
|
||||
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
|
||||
Role++)
|
||||
Usr_FreeUsrsList (Role);
|
||||
|
||||
|
|
|
@ -606,7 +606,7 @@ static void Hld_ListHolidaysForEdition (void)
|
|||
HTM_SELECT_Begin (true,
|
||||
"name=\"HldTyp\" style=\"width:62px;\"");
|
||||
for (HolidayType = (Hld_HolidayType_t) 0;
|
||||
HolidayType < Hld_NUM_TYPES_HOLIDAY;
|
||||
HolidayType <= (Hld_HolidayType_t) (Hld_NUM_TYPES_HOLIDAY - 1);
|
||||
HolidayType++)
|
||||
{
|
||||
HolidayTypeUnsigned = (unsigned) HolidayType;
|
||||
|
@ -785,7 +785,7 @@ void Hld_ChangeHolidayType (void)
|
|||
|
||||
void Hld_ChangeStartDate (void)
|
||||
{
|
||||
Hld_ChangeDate (HLD_START_DATE);
|
||||
Hld_ChangeDate (Hld_START_DATE);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -794,7 +794,7 @@ void Hld_ChangeStartDate (void)
|
|||
|
||||
void Hld_ChangeEndDate (void)
|
||||
{
|
||||
Hld_ChangeDate (HLD_END_DATE);
|
||||
Hld_ChangeDate (Hld_END_DATE);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -822,7 +822,7 @@ static void Hld_ChangeDate (Hld_StartOrEndDate_t StartOrEndDate)
|
|||
/***** Get the new date for the holiday *****/
|
||||
switch (StartOrEndDate)
|
||||
{
|
||||
case HLD_START_DATE:
|
||||
case Hld_START_DATE:
|
||||
StrStartOrEndDate = "StartDate";
|
||||
PtrDate = &Hld_EditingHld->StartDate;
|
||||
Dat_GetDateFromForm ("StartDay","StartMonth","StartYear",
|
||||
|
@ -832,7 +832,7 @@ static void Hld_ChangeDate (Hld_StartOrEndDate_t StartOrEndDate)
|
|||
NewDate.Year == 0)
|
||||
Dat_AssignDate (&NewDate,&Gbl.Now.Date);
|
||||
break;
|
||||
case HLD_END_DATE:
|
||||
case Hld_END_DATE:
|
||||
StrStartOrEndDate = "EndDate";
|
||||
PtrDate = &Hld_EditingHld->EndDate;
|
||||
switch (Hld_EditingHld->HldTyp)
|
||||
|
@ -1000,7 +1000,7 @@ static void Hld_PutFormToCreateHoliday (void)
|
|||
HTM_SELECT_Begin (false,
|
||||
"name=\"HldTyp\" style=\"width:62px;\"");
|
||||
for (HolidayType = (Hld_HolidayType_t) 0;
|
||||
HolidayType < Hld_NUM_TYPES_HOLIDAY;
|
||||
HolidayType <= (Hld_HolidayType_t) (Hld_NUM_TYPES_HOLIDAY - 1);
|
||||
HolidayType++)
|
||||
{
|
||||
HolidayTypeUnsigned = (unsigned) HolidayType;
|
||||
|
|
|
@ -47,8 +47,8 @@ typedef enum
|
|||
|
||||
typedef enum
|
||||
{
|
||||
HLD_START_DATE,
|
||||
HLD_END_DATE
|
||||
Hld_START_DATE,
|
||||
Hld_END_DATE
|
||||
} Hld_StartOrEndDate_t;
|
||||
|
||||
struct Holiday
|
||||
|
|
|
@ -121,7 +121,7 @@ void Ico_PutIconsToSelectIconSet (void)
|
|||
Set_StartSettingsHead ();
|
||||
Set_StartOneSettingSelector ();
|
||||
for (IconSet = (Ico_IconSet_t) 0;
|
||||
IconSet < Ico_NUM_ICON_SETS;
|
||||
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
|
||||
IconSet++)
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"%s\"",
|
||||
|
@ -188,7 +188,7 @@ Ico_IconSet_t Ico_GetParamIconSet (void)
|
|||
|
||||
Par_GetParToText ("IconSet",IconSetId,Ico_MAX_BYTES_ICON_SET_ID);
|
||||
for (IconSet = (Ico_IconSet_t) 0;
|
||||
IconSet < Ico_NUM_ICON_SETS;
|
||||
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
|
||||
IconSet++)
|
||||
if (!strcmp (IconSetId,Ico_IconSetId[IconSet]))
|
||||
return IconSet;
|
||||
|
@ -205,7 +205,7 @@ Ico_IconSet_t Ico_GetIconSetFromStr (const char *Str)
|
|||
Ico_IconSet_t IconSet;
|
||||
|
||||
for (IconSet = (Ico_IconSet_t) 0;
|
||||
IconSet < Ico_NUM_ICON_SETS;
|
||||
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
|
||||
IconSet++)
|
||||
if (!strcasecmp (Str,Ico_IconSetId[IconSet]))
|
||||
return IconSet;
|
||||
|
|
60
swad_info.c
60
swad_info.c
|
@ -516,7 +516,7 @@ bool Inf_GetIfIMustReadAnyCrsInfoInThisCrs (void)
|
|||
|
||||
/***** Reset must-be-read to false for all info types *****/
|
||||
for (InfoType = (Inf_InfoType_t) 0;
|
||||
InfoType < Inf_NUM_INFO_TYPES;
|
||||
InfoType <= (Inf_InfoType_t) (Inf_NUM_INFO_TYPES - 1);
|
||||
InfoType++)
|
||||
Gbl.Crs.Info.MustBeRead[InfoType] = false;
|
||||
|
||||
|
@ -573,7 +573,7 @@ void Inf_WriteMsgYouMustReadInfo (void)
|
|||
HTM_DIV_Begin ("class=\"CM\"");
|
||||
HTM_UL_Begin ("class=\"LIST_I_MUST_READ\"");
|
||||
for (InfoType = (Inf_InfoType_t) 0;
|
||||
InfoType < Inf_NUM_INFO_TYPES;
|
||||
InfoType <= (Inf_InfoType_t) (Inf_NUM_INFO_TYPES - 1);
|
||||
InfoType++)
|
||||
if (Gbl.Crs.Info.MustBeRead[InfoType])
|
||||
{
|
||||
|
@ -1060,14 +1060,14 @@ void Inf_FormsToSelSendInfo (void)
|
|||
bool MustBeRead;
|
||||
const char *HelpEdit[Inf_NUM_INFO_TYPES] =
|
||||
{
|
||||
Hlp_COURSE_Information_edit, // Inf_INTRODUCTION
|
||||
Hlp_COURSE_Guide_edit, // Inf_TEACHING_GUIDE
|
||||
Hlp_COURSE_Syllabus_edit, // Inf_LECTURES
|
||||
Hlp_COURSE_Syllabus_edit, // Inf_PRACTICALS
|
||||
Hlp_COURSE_Bibliography_edit, // Inf_BIBLIOGRAPHY
|
||||
Hlp_COURSE_FAQ_edit, // Inf_FAQ
|
||||
Hlp_COURSE_Links_edit, // Inf_LINKS
|
||||
Hlp_ASSESSMENT_System_edit, // Inf_ASSESSMENT
|
||||
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
|
||||
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit,
|
||||
};
|
||||
|
||||
/***** Set info type *****/
|
||||
|
@ -1080,7 +1080,7 @@ void Inf_FormsToSelSendInfo (void)
|
|||
|
||||
/***** Check if info available *****/
|
||||
for (InfoSrc = (Inf_InfoSrc_t) 0;
|
||||
InfoSrc < Inf_NUM_INFO_SOURCES;
|
||||
InfoSrc <= (Inf_InfoSrc_t) (Inf_NUM_INFO_SOURCES - 1);
|
||||
InfoSrc++)
|
||||
InfoAvailable[InfoSrc] = Inf_CheckIfInfoAvailable (InfoSrc);
|
||||
|
||||
|
@ -1100,7 +1100,7 @@ void Inf_FormsToSelSendInfo (void)
|
|||
|
||||
/* Options */
|
||||
for (InfoSrc = (Inf_InfoSrc_t) 0;
|
||||
InfoSrc < Inf_NUM_INFO_SOURCES;
|
||||
InfoSrc <= (Inf_InfoSrc_t) (Inf_NUM_INFO_SOURCES - 1);
|
||||
InfoSrc++)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -1617,7 +1617,7 @@ Inf_InfoType_t Inf_ConvertFromStrDBToInfoType (const char *StrInfoTypeDB)
|
|||
Inf_InfoType_t InfoType;
|
||||
|
||||
for (InfoType = (Inf_InfoType_t) 0;
|
||||
InfoType < Inf_NUM_INFO_TYPES;
|
||||
InfoType <= (Inf_InfoType_t) (Inf_NUM_INFO_TYPES - 1);
|
||||
InfoType++)
|
||||
if (!strcmp (StrInfoTypeDB,Inf_NamesInDBForInfoType[InfoType]))
|
||||
return InfoType;
|
||||
|
@ -1634,7 +1634,7 @@ Inf_InfoSrc_t Inf_ConvertFromStrDBToInfoSrc (const char *StrInfoSrcDB)
|
|||
Inf_InfoSrc_t InfoSrc;
|
||||
|
||||
for (InfoSrc = (Inf_InfoSrc_t) 0;
|
||||
InfoSrc < Inf_NUM_INFO_SOURCES;
|
||||
InfoSrc <= (Inf_InfoSrc_t) (Inf_NUM_INFO_SOURCES - 1);
|
||||
InfoSrc++)
|
||||
if (!strcmp (StrInfoSrcDB,Inf_NamesInDBForInfoSrc[InfoSrc]))
|
||||
return InfoSrc;
|
||||
|
@ -2016,14 +2016,14 @@ void Inf_EditPlainTxtInfo (void)
|
|||
char TxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||
const char *HelpEdit[Inf_NUM_INFO_TYPES] =
|
||||
{
|
||||
Hlp_COURSE_Information_edit, // Inf_INTRODUCTION
|
||||
Hlp_COURSE_Guide_edit, // Inf_TEACHING_GUIDE
|
||||
Hlp_COURSE_Syllabus_edit, // Inf_LECTURES
|
||||
Hlp_COURSE_Syllabus_edit, // Inf_PRACTICALS
|
||||
Hlp_COURSE_Bibliography_edit, // Inf_BIBLIOGRAPHY
|
||||
Hlp_COURSE_FAQ_edit, // Inf_FAQ
|
||||
Hlp_COURSE_Links_edit, // Inf_LINKS
|
||||
Hlp_ASSESSMENT_System_edit, // Inf_ASSESSMENT
|
||||
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
|
||||
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit,
|
||||
};
|
||||
|
||||
/***** Set info type *****/
|
||||
|
@ -2066,14 +2066,14 @@ void Inf_EditRichTxtInfo (void)
|
|||
char TxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||
const char *HelpEdit[Inf_NUM_INFO_TYPES] =
|
||||
{
|
||||
Hlp_COURSE_Information_edit, // Inf_INTRODUCTION
|
||||
Hlp_COURSE_Guide_edit, // Inf_TEACHING_GUIDE
|
||||
Hlp_COURSE_Syllabus_edit, // Inf_LECTURES
|
||||
Hlp_COURSE_Syllabus_edit, // Inf_PRACTICALS
|
||||
Hlp_COURSE_Bibliography_edit, // Inf_BIBLIOGRAPHY
|
||||
Hlp_COURSE_FAQ_edit, // Inf_FAQ
|
||||
Hlp_COURSE_Links_edit, // Inf_LINKS
|
||||
Hlp_ASSESSMENT_System_edit, // Inf_ASSESSMENT
|
||||
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
|
||||
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit,
|
||||
};
|
||||
|
||||
/***** Set info type *****/
|
||||
|
|
|
@ -849,8 +849,8 @@ static void Ins_PutHeadInstitutionsForSeeing (bool OrderSelectable)
|
|||
|
||||
HTM_TR_Begin (NULL);
|
||||
HTM_TH_Empty (1);
|
||||
for (Order = Ins_ORDER_BY_INSTITUTION;
|
||||
Order <= Ins_ORDER_BY_NUM_USRS;
|
||||
for (Order = (Ins_Order_t) 0;
|
||||
Order <= (Ins_Order_t) (Ins_NUM_ORDERS - 1);
|
||||
Order++)
|
||||
{
|
||||
HTM_TH_Begin (1,1,Order == Ins_ORDER_BY_INSTITUTION ? "LM" :
|
||||
|
|
|
@ -120,7 +120,7 @@ void Lan_PutSelectorToSelectLanguage (void)
|
|||
HTM_SELECT_Begin (true,
|
||||
"name=\"Lan\" style=\"width:112px; margin:0;\"");
|
||||
for (Lan = (Lan_Language_t) 1;
|
||||
Lan <= Lan_NUM_LANGUAGES;
|
||||
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
|
||||
Lan++)
|
||||
{
|
||||
LanUnsigned = (unsigned) Lan;
|
||||
|
|
39
swad_media.c
39
swad_media.c
|
@ -350,33 +350,32 @@ void Med_PutMediaUploader (int NumMediaInForm,const char *ClassInput)
|
|||
struct ParamUploadMedia ParamUploadMedia;
|
||||
char Id[Frm_MAX_BYTES_ID + 1];
|
||||
size_t NumUploader;
|
||||
|
||||
#define Med_NUM_MEDIA_UPLOADERS 3
|
||||
struct MediaUploader MediaUploader[Med_NUM_MEDIA_UPLOADERS] =
|
||||
{
|
||||
{/* Upload */
|
||||
Med_FORM_FILE,
|
||||
"ico_upl", // <id>_ico_upl
|
||||
"par_upl", // <id>_par_upl
|
||||
"mediaClickOnActivateUpload",
|
||||
"photo-video.svg",
|
||||
Txt_Image_video
|
||||
.FormType = Med_FORM_FILE,
|
||||
.IconSuffix = "ico_upl", // <id>_ico_upl
|
||||
.ParamSuffix = "par_upl", // <id>_par_upl
|
||||
.FunctionName = "mediaClickOnActivateUpload",
|
||||
.Icon = "photo-video.svg",
|
||||
.Title = Txt_Image_video
|
||||
},
|
||||
{/* YouTube */
|
||||
Med_FORM_YOUTUBE,
|
||||
"ico_you", // <id>_ico_you
|
||||
"par_you", // <id>_par_you
|
||||
"mediaClickOnActivateYoutube",
|
||||
"youtube-brands.svg",
|
||||
"YouTube"
|
||||
.FormType = Med_FORM_YOUTUBE,
|
||||
.IconSuffix = "ico_you", // <id>_ico_you
|
||||
.ParamSuffix = "par_you", // <id>_par_you
|
||||
.FunctionName = "mediaClickOnActivateYoutube",
|
||||
.Icon = "youtube-brands.svg",
|
||||
.Title = "YouTube"
|
||||
},
|
||||
{/* Embed */
|
||||
Med_FORM_EMBED,
|
||||
"ico_emb", // <id>_ico_emb
|
||||
"par_emb", // <id>_par_emb
|
||||
"mediaClickOnActivateEmbed",
|
||||
"code.svg",
|
||||
"Embed"
|
||||
.FormType = Med_FORM_EMBED,
|
||||
.IconSuffix = "ico_emb", // <id>_ico_emb
|
||||
.ParamSuffix = "par_emb", // <id>_par_emb
|
||||
.FunctionName = "mediaClickOnActivateEmbed",
|
||||
.Icon = "code.svg",
|
||||
.Title = "Embed"
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1919,7 +1918,7 @@ static Med_Type_t Med_GetTypeFromStrInDB (const char *Str)
|
|||
Med_Type_t Type;
|
||||
|
||||
for (Type = (Med_Type_t) 0;
|
||||
Type < Med_NUM_TYPES;
|
||||
Type <= (Med_Type_t) (Med_NUM_TYPES - 1);
|
||||
Type++)
|
||||
if (!strcasecmp (Str,Med_StringsTypeDB[Type]))
|
||||
return Type;
|
||||
|
|
|
@ -280,7 +280,7 @@ void Mnu_PutIconsToSelectMenu (void)
|
|||
Set_StartSettingsHead ();
|
||||
Set_StartOneSettingSelector ();
|
||||
for (Menu = (Mnu_Menu_t) 0;
|
||||
Menu < Mnu_NUM_MENUS;
|
||||
Menu <= (Mnu_Menu_t) (Mnu_NUM_MENUS - 1);
|
||||
Menu++)
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"%s\"",Menu == Gbl.Prefs.Menu ? "PREF_ON" :
|
||||
|
|
|
@ -2605,8 +2605,8 @@ void Msg_ShowFormSelectCourseSentOrRecMsgs (void)
|
|||
unsigned NumOriginCrs;
|
||||
const char *TxtSelector[Msg_NUM_TYPES_OF_MSGS] =
|
||||
{
|
||||
Txt_Messages_received_from_A_COURSE,
|
||||
Txt_Messages_sent_from_A_COURSE
|
||||
[Msg_MESSAGES_RECEIVED] = Txt_Messages_received_from_A_COURSE,
|
||||
[Msg_MESSAGES_SENT ] = Txt_Messages_sent_from_A_COURSE
|
||||
};
|
||||
|
||||
/***** Course selection *****/
|
||||
|
@ -2641,8 +2641,8 @@ void Msg_ShowFormToFilterMsgs (void)
|
|||
extern const char *Txt_MSG_Content;
|
||||
const char *TxtFromTo[Msg_NUM_TYPES_OF_MSGS] =
|
||||
{
|
||||
Txt_MSG_From,
|
||||
Txt_MSG_To
|
||||
[Msg_MESSAGES_RECEIVED] = Txt_MSG_From,
|
||||
[Msg_MESSAGES_SENT ] = Txt_MSG_To
|
||||
};
|
||||
|
||||
/***** Begin table *****/
|
||||
|
|
|
@ -215,7 +215,7 @@ void Net_ShowWebsAndSocialNets (const struct UsrData *UsrDat)
|
|||
|
||||
/***** Show the rest of webs / social networks *****/
|
||||
for (NumURL = (Net_WebsAndSocialNetworks_t) 0;
|
||||
NumURL < Net_NUM_WEBS_AND_SOCIAL_NETWORKS;
|
||||
NumURL <= (Net_WebsAndSocialNetworks_t) (Net_NUM_WEBS_AND_SOCIAL_NETWORKS - 1);
|
||||
NumURL++)
|
||||
{
|
||||
/***** Check if exists the web / social network for this user *****/
|
||||
|
@ -294,7 +294,7 @@ void Net_ShowFormMyWebsAndSocialNets (void)
|
|||
|
||||
/***** List webs and social networks *****/
|
||||
for (NumURL = (Net_WebsAndSocialNetworks_t) 0;
|
||||
NumURL < Net_NUM_WEBS_AND_SOCIAL_NETWORKS;
|
||||
NumURL <= (Net_WebsAndSocialNetworks_t) (Net_NUM_WEBS_AND_SOCIAL_NETWORKS - 1);
|
||||
NumURL++)
|
||||
{
|
||||
/***** Get user's web / social network from database *****/
|
||||
|
@ -392,7 +392,7 @@ static void Net_GetMyWebsAndSocialNetsFromForm (void)
|
|||
|
||||
/***** Get URLs *****/
|
||||
for (NumURL = (Net_WebsAndSocialNetworks_t) 0;
|
||||
NumURL < Net_NUM_WEBS_AND_SOCIAL_NETWORKS;
|
||||
NumURL <= (Net_WebsAndSocialNetworks_t) (Net_NUM_WEBS_AND_SOCIAL_NETWORKS - 1);
|
||||
NumURL++)
|
||||
{
|
||||
/***** Get URL from the form *****/
|
||||
|
@ -564,7 +564,7 @@ void Net_ShowWebAndSocialNetworksStats (void)
|
|||
Str_Copy (NetName,row[0],
|
||||
Net_MAX_BYTES_NETWORK_NAME);
|
||||
for (Web = (Net_WebsAndSocialNetworks_t) 0;
|
||||
Web < Net_NUM_WEBS_AND_SOCIAL_NETWORKS;
|
||||
Web <= (Net_WebsAndSocialNetworks_t) (Net_NUM_WEBS_AND_SOCIAL_NETWORKS - 1);
|
||||
Web++)
|
||||
if (!strcmp (Net_WebsAndSocialNetworksDB[Web],NetName))
|
||||
break;
|
||||
|
|
|
@ -1927,7 +1927,7 @@ void Ntf_PutFormChangeNotifSentByEMail (void)
|
|||
/***** Checkbox to activate internal notifications and email notifications
|
||||
about events *****/
|
||||
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
|
||||
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
|
||||
NotifyEvent <= (Ntf_NotifyEvent_t) (Ntf_NUM_NOTIFY_EVENTS - 1);
|
||||
NotifyEvent++) // O is reserved for Ntf_EVENT_UNKNOWN
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -1980,7 +1980,7 @@ static void Ntf_GetParamsNotifyEvents (void)
|
|||
Gbl.Usrs.Me.UsrDat.NtfEvents.CreateNotif = 0;
|
||||
Gbl.Usrs.Me.UsrDat.NtfEvents.SendEmail = 0;
|
||||
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
|
||||
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
|
||||
NotifyEvent <= (Ntf_NotifyEvent_t) (Ntf_NUM_NOTIFY_EVENTS - 1);
|
||||
NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
|
||||
{
|
||||
if ((CreateNotifForThisEvent = Par_GetParToBool (Ntf_ParamNotifMeAboutNotifyEvents[NotifyEvent])))
|
||||
|
|
16
swad_photo.c
16
swad_photo.c
|
@ -1373,12 +1373,12 @@ void Pho_CalcPhotoDegree (void)
|
|||
Usr_GetUnorderedStdsCodesInDeg (DegCod);
|
||||
|
||||
for (Sex = (Usr_Sex_t) 0;
|
||||
Sex < Usr_NUM_SEXS;
|
||||
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
|
||||
Sex++)
|
||||
{
|
||||
TotalTimeToComputeAvgPhotoInMicroseconds = 0;
|
||||
for (TypeOfAverage = (Pho_AvgPhotoTypeOfAverage_t) 0;
|
||||
TypeOfAverage < Pho_NUM_AVERAGE_PHOTO_TYPES;
|
||||
TypeOfAverage <= (Pho_AvgPhotoTypeOfAverage_t) (Pho_NUM_AVERAGE_PHOTO_TYPES - 1);
|
||||
TypeOfAverage++)
|
||||
{
|
||||
/***** Compute average photos of students belonging this degree *****/
|
||||
|
@ -1546,7 +1546,7 @@ static long Pho_GetTimeToComputeAvgPhoto (long DegCod)
|
|||
{
|
||||
TotalTimeToComputeAvgPhoto = 0;
|
||||
for (Sex = (Usr_Sex_t) 0;
|
||||
Sex < Usr_NUM_SEXS;
|
||||
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
|
||||
Sex++)
|
||||
{
|
||||
/***** Get row *****/
|
||||
|
@ -1806,7 +1806,7 @@ static void Pho_PutSelectorForTypeOfAvg (void)
|
|||
HTM_SELECT_Begin (true,
|
||||
"id=\"AvgType\" name=\"AvgType\"");
|
||||
for (TypeOfAvg = (Pho_AvgPhotoTypeOfAverage_t) 0;
|
||||
TypeOfAvg < Pho_NUM_AVERAGE_PHOTO_TYPES;
|
||||
TypeOfAvg <= (Pho_AvgPhotoTypeOfAverage_t) (Pho_NUM_AVERAGE_PHOTO_TYPES - 1);
|
||||
TypeOfAvg++)
|
||||
{
|
||||
TypeOfAvgUnsigned = (unsigned) TypeOfAvg;
|
||||
|
@ -1871,7 +1871,7 @@ static void Pho_PutSelectorForHowComputePhotoSize (void)
|
|||
HTM_SELECT_Begin (true,
|
||||
"id=\"PhotoSize\" name=\"PhotoSize\"");
|
||||
for (PhoSi = (Pho_HowComputePhotoSize_t) 0;
|
||||
PhoSi < Pho_NUM_HOW_COMPUTE_PHOTO_SIZES;
|
||||
PhoSi <= (Pho_HowComputePhotoSize_t) (Pho_NUM_HOW_COMPUTE_PHOTO_SIZES - 1);
|
||||
PhoSi++)
|
||||
{
|
||||
PhoSiUnsigned = (unsigned) PhoSi;
|
||||
|
@ -1936,7 +1936,7 @@ static void Pho_PutSelectorForHowOrderDegrees (void)
|
|||
HTM_SELECT_Begin (true,
|
||||
"id=\"Order\" name=\"Order\"");
|
||||
for (Order = (Pho_HowOrderDegrees_t) 0;
|
||||
Order < Pho_NUM_HOW_ORDER_DEGREES;
|
||||
Order <= (Pho_HowOrderDegrees_t) (Pho_NUM_HOW_ORDER_DEGREES - 1);
|
||||
Order++)
|
||||
{
|
||||
OrderUnsigned = (unsigned) Order;
|
||||
|
@ -2231,7 +2231,7 @@ static void Pho_ShowOrPrintListDegrees (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint)
|
|||
HTM_TH (1,1,"RT",Txt_No_INDEX);
|
||||
HTM_TH (1,1,"CT",Txt_Degree);
|
||||
for (Sex = (Usr_Sex_t) 0;
|
||||
Sex < Usr_NUM_SEXS;
|
||||
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
|
||||
Sex++)
|
||||
HTM_TH (1,1,"CT",Txt_SEX_PLURAL_Abc[Sex]);
|
||||
|
||||
|
@ -2272,7 +2272,7 @@ static void Pho_ShowOrPrintListDegrees (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint)
|
|||
HTM_TD_End ();
|
||||
|
||||
for (Sex = (Usr_Sex_t) 0;
|
||||
Sex < Usr_NUM_SEXS;
|
||||
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
|
||||
Sex++)
|
||||
{
|
||||
/***** Show average photo of students belonging to this degree *****/
|
||||
|
|
|
@ -115,8 +115,8 @@ void Plc_SeePlaces (void)
|
|||
Hlp_INSTITUTION_Places,Box_NOT_CLOSABLE);
|
||||
HTM_TABLE_BeginWideMarginPadding (2);
|
||||
HTM_TR_Begin (NULL);
|
||||
for (Order = Plc_ORDER_BY_PLACE;
|
||||
Order <= Plc_ORDER_BY_NUM_CTRS;
|
||||
for (Order = (Plc_Order_t) 0;
|
||||
Order <= (Plc_Order_t) (Plc_NUM_ORDERS - 1);
|
||||
Order++)
|
||||
{
|
||||
HTM_TH_Begin (1,1,"LM");
|
||||
|
|
|
@ -203,7 +203,7 @@ Pri_Visibility_t Pri_GetVisibilityFromStr (const char *Str)
|
|||
Pri_Visibility_t Visibility;
|
||||
|
||||
for (Visibility = (Pri_Visibility_t) 0;
|
||||
Visibility < Pri_NUM_OPTIONS_PRIVACY;
|
||||
Visibility <= (Pri_Visibility_t) (Pri_NUM_OPTIONS_PRIVACY - 1);
|
||||
Visibility++)
|
||||
if (!strcasecmp (Str,Pri_VisibilityDB[Visibility]))
|
||||
return Visibility;
|
||||
|
|
|
@ -2271,10 +2271,10 @@ static void Prj_ReqAddUsrs (Prj_RoleInProject_t RoleInProject)
|
|||
extern const char *Txt_PROJECT_ROLES_PLURAL_abc[Prj_NUM_ROLES_IN_PROJECT];
|
||||
static Act_Action_t ActionAddUsr[Prj_NUM_ROLES_IN_PROJECT] =
|
||||
{
|
||||
ActUnk, // Prj_ROLE_UNK, Unknown
|
||||
ActAddStdPrj, // Prj_ROLE_STD, Student
|
||||
ActAddTutPrj, // Prj_ROLE_TUT, Tutor
|
||||
ActAddEvlPrj, // Prj_ROLE_EVL, Evaluator
|
||||
[Prj_ROLE_UNK] = ActUnk, // Unknown
|
||||
[Prj_ROLE_STD] = ActAddStdPrj, // Student
|
||||
[Prj_ROLE_TUT] = ActAddTutPrj, // Tutor
|
||||
[Prj_ROLE_EVL] = ActAddEvlPrj, // Evaluator
|
||||
};
|
||||
char TxtButton[Lay_MAX_BYTES_TITLE + 1];
|
||||
|
||||
|
@ -2421,10 +2421,10 @@ static void Prj_ReqRemUsrFromPrj (Prj_RoleInProject_t RoleInProject)
|
|||
extern const char *Txt_Remove_USER_from_this_project;
|
||||
static Act_Action_t ActionRemUsr[Prj_NUM_ROLES_IN_PROJECT] =
|
||||
{
|
||||
ActUnk, // Prj_ROLE_UNK, Unknown
|
||||
ActRemStdPrj, // Prj_ROLE_STD, Student
|
||||
ActRemTutPrj, // Prj_ROLE_TUT, Tutor
|
||||
ActRemEvlPrj, // Prj_ROLE_EVL, Evaluator
|
||||
[Prj_ROLE_UNK] = ActUnk, // Unknown
|
||||
[Prj_ROLE_STD] = ActRemStdPrj, // Student
|
||||
[Prj_ROLE_TUT] = ActRemTutPrj, // Tutor
|
||||
[Prj_ROLE_EVL] = ActRemEvlPrj, // Evaluator
|
||||
};
|
||||
struct Project Prj;
|
||||
bool ItsMe;
|
||||
|
|
|
@ -336,7 +336,7 @@ void Rec_ListFieldsRecordsForEdition (void)
|
|||
HTM_SELECT_Begin (true,
|
||||
"name=\"Visibility\"");
|
||||
for (Vis = (Rec_VisibilityRecordFields_t) 0;
|
||||
Vis < (Rec_VisibilityRecordFields_t) Rec_NUM_TYPES_VISIBILITY;
|
||||
Vis <= (Rec_VisibilityRecordFields_t) (Rec_NUM_TYPES_VISIBILITY - 1);
|
||||
Vis++)
|
||||
{
|
||||
VisUnsigned = (unsigned) Vis;
|
||||
|
@ -401,7 +401,7 @@ void Rec_ShowFormCreateRecordField (void)
|
|||
HTM_SELECT_Begin (false,
|
||||
"name=\"Visibility\"");
|
||||
for (Vis = (Rec_VisibilityRecordFields_t) 0;
|
||||
Vis < (Rec_VisibilityRecordFields_t) Rec_NUM_TYPES_VISIBILITY;
|
||||
Vis <= (Rec_VisibilityRecordFields_t) (Rec_NUM_TYPES_VISIBILITY - 1);
|
||||
Vis++)
|
||||
{
|
||||
VisUnsigned = (unsigned) Vis;
|
||||
|
|
14
swad_role.c
14
swad_role.c
|
@ -211,7 +211,7 @@ void Rol_SetMyRoles (void)
|
|||
if (!(Gbl.Usrs.Me.Role.Available &
|
||||
(1 << Gbl.Usrs.Me.Role.Logged))) // Current type I am logged is not available for me
|
||||
/* Set the lowest role available for me */
|
||||
for (Gbl.Usrs.Me.Role.Logged = Rol_UNK;
|
||||
for (Gbl.Usrs.Me.Role.Logged = (Rol_Role_t) 0;
|
||||
Gbl.Usrs.Me.Role.Logged <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
|
||||
Gbl.Usrs.Me.Role.Logged++)
|
||||
if (Gbl.Usrs.Me.Role.Available & (1 << Gbl.Usrs.Me.Role.Logged))
|
||||
|
@ -227,8 +227,8 @@ unsigned Rol_GetNumAvailableRoles (void)
|
|||
Rol_Role_t Role;
|
||||
unsigned NumAvailableRoles = 0;
|
||||
|
||||
for (Role = Rol_GST;
|
||||
Role < Rol_NUM_ROLES;
|
||||
for (Role = (Rol_Role_t) 1;
|
||||
Role <= (Rol_Role_t) Rol_NUM_ROLES - 1;
|
||||
Role++)
|
||||
if (Gbl.Usrs.Me.Role.Available & (1 << Role))
|
||||
NumAvailableRoles++;
|
||||
|
@ -485,8 +485,8 @@ void Rol_PutFormToChangeMyRole (const char *ClassSelect)
|
|||
else
|
||||
HTM_SELECT_Begin (true,
|
||||
"name=\"MyRole\"");
|
||||
for (Role = Rol_GST;
|
||||
Role < Rol_NUM_ROLES;
|
||||
for (Role = (Rol_Role_t) 1;
|
||||
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
|
||||
Role++)
|
||||
if (Gbl.Usrs.Me.Role.Available & (1 << Role))
|
||||
{
|
||||
|
@ -578,7 +578,7 @@ void Rol_PutHiddenParamRoles (unsigned Roles)
|
|||
|
||||
unsigned Rol_GetSelectedRoles (void)
|
||||
{
|
||||
char StrRoles[Rol_NUM_ROLES * (10 + 1)];
|
||||
char StrRoles[Rol_NUM_ROLES * (Cns_MAX_DECIMAL_DIGITS_UINT + 1)];
|
||||
const char *Ptr;
|
||||
char UnsignedStr[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
|
||||
Rol_Role_t Role;
|
||||
|
@ -592,7 +592,7 @@ unsigned Rol_GetSelectedRoles (void)
|
|||
0); // 000...000
|
||||
|
||||
/***** Try to get multiple param "Role" *****/
|
||||
Par_GetParMultiToText ("Role",StrRoles,Rol_NUM_ROLES * (10 + 1));
|
||||
Par_GetParMultiToText ("Role",StrRoles,Rol_NUM_ROLES * (Cns_MAX_DECIMAL_DIGITS_UINT + 1));
|
||||
for (Ptr = StrRoles;
|
||||
*Ptr;)
|
||||
{
|
||||
|
|
|
@ -79,7 +79,7 @@ void Sco_PutSelectorScope (const char *ParamName,bool SendOnChange)
|
|||
"id=\"%s\" name=\"%s\"",ParamName,ParamName);
|
||||
|
||||
for (Scope = (Hie_Level_t) 0;
|
||||
Scope < Hie_NUM_LEVELS;
|
||||
Scope <= (Hie_Level_t) (Hie_NUM_LEVELS - 1);
|
||||
Scope++)
|
||||
if ((Gbl.Scope.Allowed & (1 << Scope)))
|
||||
{
|
||||
|
@ -333,8 +333,8 @@ Hie_Level_t Sco_GetScopeFromDBStr (const char *ScopeDBStr)
|
|||
{
|
||||
Hie_Level_t Scope;
|
||||
|
||||
for (Scope = Hie_UNK;
|
||||
Scope < Hie_NUM_LEVELS;
|
||||
for (Scope = (Hie_Level_t) 0;
|
||||
Scope <= (Hie_Level_t) (Hie_NUM_LEVELS - 1);
|
||||
Scope++)
|
||||
if (!strcmp (Sco_GetDBStrFromScope (Scope),ScopeDBStr))
|
||||
return Scope;
|
||||
|
|
|
@ -168,7 +168,7 @@ static void Sch_PutFormToSearchWithWhatToSearchAndScope (Act_Action_t Action,Hie
|
|||
HTM_SELECT_Begin (false,
|
||||
"name=\"WhatToSearch\" class=\"WHAT_TO_SEARCH\"");
|
||||
for (WhatToSearch = (Sch_WhatToSearch_t) 0;
|
||||
WhatToSearch < Sch_NUM_WHAT_TO_SEARCH;
|
||||
WhatToSearch <= (Sch_WhatToSearch_t) (Sch_NUM_WHAT_TO_SEARCH - 1);
|
||||
WhatToSearch++)
|
||||
if (Sch_CheckIfIHavePermissionToSearch (WhatToSearch))
|
||||
{
|
||||
|
|
|
@ -437,7 +437,7 @@ void Sta_AskShowGblHits (void)
|
|||
HTM_SELECT_Begin (false,
|
||||
"id=\"Role\" name=\"Role\" class=\"STAT_SEL\"");
|
||||
for (RoleStat = (Sta_Role_t) 0;
|
||||
RoleStat < Sta_NUM_ROLES_STAT;
|
||||
RoleStat <= (Sta_Role_t) (Sta_NUM_ROLES_STAT - 1);
|
||||
RoleStat++)
|
||||
{
|
||||
RoleStatUnsigned = (unsigned) RoleStat;
|
||||
|
@ -576,7 +576,7 @@ static void Sta_WriteSelectorCountType (void)
|
|||
HTM_SELECT_Begin (false,
|
||||
"id=\"CountType\" name=\"CountType\"");
|
||||
for (StatCountType = (Sta_CountType_t) 0;
|
||||
StatCountType < Sta_NUM_COUNT_TYPES;
|
||||
StatCountType <= (Sta_CountType_t) (Sta_NUM_COUNT_TYPES - 1);
|
||||
StatCountType++)
|
||||
{
|
||||
StatCountTypeUnsigned = (unsigned) StatCountType;
|
||||
|
@ -616,7 +616,7 @@ static void Sta_WriteSelectorAction (void)
|
|||
HTM_OPTION (HTM_Type_STRING,"0",Gbl.Stat.NumAction == 0,false,
|
||||
"%s",Txt_Any_action);
|
||||
for (Action = (Act_Action_t) 1;
|
||||
Action < Act_NUM_ACTIONS;
|
||||
Action <= (Act_Action_t) (Act_NUM_ACTIONS - 1);
|
||||
Action++)
|
||||
{
|
||||
Tab = Act_GetTab (Act_GetSuperAction (Action));
|
||||
|
@ -1975,7 +1975,7 @@ static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES
|
|||
HTM_SELECT_Begin (true,
|
||||
"name=\"ColorType\"");
|
||||
for (ColorType = (Sta_ColorType_t) 0;
|
||||
ColorType < Sta_NUM_COLOR_TYPES;
|
||||
ColorType <= (Sta_ColorType_t) (Sta_NUM_COLOR_TYPES - 1);
|
||||
ColorType++)
|
||||
{
|
||||
ColorTypeUnsigned = (unsigned) ColorType;
|
||||
|
|
|
@ -62,8 +62,8 @@ extern struct Globals Gbl;
|
|||
|
||||
const char *Svy_StrAnswerTypesDB[Svy_NUM_ANS_TYPES] =
|
||||
{
|
||||
"unique_choice",
|
||||
"multiple_choice",
|
||||
[Svy_ANS_UNIQUE_CHOICE ] = "unique_choice",
|
||||
[Svy_ANS_MULTIPLE_CHOICE] = "multiple_choice",
|
||||
};
|
||||
|
||||
#define Svy_MAX_ANSWERS_PER_QUESTION 10
|
||||
|
@ -2715,7 +2715,7 @@ static void Svy_ShowFormEditOneQst (long SvyCod,struct SurveyQuestion *SvyQst,
|
|||
|
||||
HTM_TD_Begin ("class=\"%s LT\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
|
||||
for (AnsType = (Svy_AnswerType_t) 0;
|
||||
AnsType < Svy_NUM_ANS_TYPES;
|
||||
AnsType <= (Svy_AnswerType_t) (Svy_NUM_ANS_TYPES - 1);
|
||||
AnsType++)
|
||||
{
|
||||
HTM_LABEL_Begin (NULL);
|
||||
|
@ -2845,7 +2845,7 @@ static Svy_AnswerType_t Svy_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTy
|
|||
Svy_AnswerType_t AnsType;
|
||||
|
||||
for (AnsType = (Svy_AnswerType_t) 0;
|
||||
AnsType < Svy_NUM_ANS_TYPES;
|
||||
AnsType <= (Svy_AnswerType_t) (Svy_NUM_ANS_TYPES - 1);
|
||||
AnsType++)
|
||||
if (!strcmp (StrAnsTypeBD,Svy_StrAnswerTypesDB[AnsType]))
|
||||
return AnsType;
|
||||
|
|
|
@ -65,17 +65,17 @@ extern struct Globals Gbl;
|
|||
|
||||
static const char *StyleSyllabus[1 + Syl_MAX_LEVELS_SYLLABUS] =
|
||||
{
|
||||
"",
|
||||
"T1",
|
||||
"T2",
|
||||
"T3",
|
||||
"T3",
|
||||
"T3",
|
||||
"T3",
|
||||
"T3",
|
||||
"T3",
|
||||
"T3",
|
||||
"T3",
|
||||
[ 0] = "",
|
||||
[ 1] = "T1",
|
||||
[ 2] = "T2",
|
||||
[ 3] = "T3",
|
||||
[ 4] = "T3",
|
||||
[ 5] = "T3",
|
||||
[ 6] = "T3",
|
||||
[ 7] = "T3",
|
||||
[ 8] = "T3",
|
||||
[ 9] = "T3",
|
||||
[10] = "T3",
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -145,7 +145,7 @@ void Syl_PutFormWhichSyllabus (void)
|
|||
HTM_UL_Begin ("class=\"LIST_LEFT\"");
|
||||
|
||||
for (WhichSyllabus = (Syl_WhichSyllabus_t) 0;
|
||||
WhichSyllabus < For_NUM_FORUM_SETS;
|
||||
WhichSyllabus <= (Syl_WhichSyllabus_t) (For_NUM_FORUM_SETS - 1);
|
||||
WhichSyllabus++)
|
||||
{
|
||||
HTM_LI_Begin ("class=\"DAT LM\"");
|
||||
|
|
|
@ -87,7 +87,7 @@ void Tab_DrawTabs (void)
|
|||
|
||||
/***** Draw the tabs *****/
|
||||
for (NumTab = (Tab_Tab_t) 1;
|
||||
NumTab <= (Tab_Tab_t) Tab_NUM_TABS - 1;
|
||||
NumTab <= (Tab_Tab_t) (Tab_NUM_TABS - 1);
|
||||
NumTab++)
|
||||
{
|
||||
ICanViewTab = Tab_CheckIfICanViewTab (NumTab);
|
||||
|
@ -201,7 +201,8 @@ static const char *Tab_GetIcon (Tab_Tab_t NumTab)
|
|||
[TabPrf] = "user",
|
||||
};
|
||||
|
||||
if (NumTab < (Tab_Tab_t) 1 || NumTab >= Tab_NUM_TABS)
|
||||
if (NumTab < (Tab_Tab_t) 1 ||
|
||||
NumTab > (Tab_Tab_t) (Tab_NUM_TABS - 1))
|
||||
return NULL;
|
||||
|
||||
return Ico_GetIcon (Tab_TabIcons[NumTab]);
|
||||
|
|
151
swad_test.c
151
swad_test.c
|
@ -86,31 +86,31 @@ const char *Tst_StrAnswerTypesXML[Tst_NUM_ANS_TYPES] =
|
|||
#define Tst_MAX_BYTES_TAGS_LIST (16 * 1024)
|
||||
#define Tst_MAX_BYTES_FLOAT_ANSWER 30 // Maximum length of the strings that store an floating point answer
|
||||
|
||||
const char *Tst_PluggableDB[Tst_NUM_OPTIONS_PLUGGABLE] =
|
||||
static const char *Tst_PluggableDB[Tst_NUM_OPTIONS_PLUGGABLE] =
|
||||
{
|
||||
"unknown",
|
||||
"N",
|
||||
"Y",
|
||||
[Tst_PLUGGABLE_UNKNOWN] = "unknown",
|
||||
[Tst_PLUGGABLE_NO ] = "N",
|
||||
[Tst_PLUGGABLE_YES ] = "Y",
|
||||
};
|
||||
|
||||
// Feedback to students in tests
|
||||
const char *Tst_FeedbackDB[Tst_NUM_TYPES_FEEDBACK] =
|
||||
static const char *Tst_FeedbackDB[Tst_NUM_TYPES_FEEDBACK] =
|
||||
{
|
||||
"nothing", // No feedback
|
||||
"total_result", // Little
|
||||
"each_result", // Medium
|
||||
"each_good_bad", // High
|
||||
"full_feedback", // Maximum
|
||||
[Tst_FEEDBACK_NOTHING ] = "nothing", // No feedback
|
||||
[Tst_FEEDBACK_TOTAL_RESULT ] = "total_result", // Little
|
||||
[Tst_FEEDBACK_EACH_RESULT ] = "each_result", // Medium
|
||||
[Tst_FEEDBACK_EACH_GOOD_BAD] = "each_good_bad", // High
|
||||
[Tst_FEEDBACK_FULL_FEEDBACK] = "full_feedback", // Maximum
|
||||
};
|
||||
|
||||
const char *Tst_StrAnswerTypesDB[Tst_NUM_ANS_TYPES] =
|
||||
static const char *Tst_StrAnswerTypesDB[Tst_NUM_ANS_TYPES] =
|
||||
{
|
||||
"int",
|
||||
"float",
|
||||
"true_false",
|
||||
"unique_choice",
|
||||
"multiple_choice",
|
||||
"text",
|
||||
[Tst_ANS_INT ] = "int",
|
||||
[Tst_ANS_FLOAT ] = "float",
|
||||
[Tst_ANS_TRUE_FALSE ] = "true_false",
|
||||
[Tst_ANS_UNIQUE_CHOICE ] = "unique_choice",
|
||||
[Tst_ANS_MULTIPLE_CHOICE] = "multiple_choice",
|
||||
[Tst_ANS_TEXT ] = "text",
|
||||
};
|
||||
|
||||
// Test images will be saved with:
|
||||
|
@ -1980,7 +1980,7 @@ static void Tst_ShowFormConfigTst (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB\"");
|
||||
for (Feedback = (Tst_Feedback_t) 0;
|
||||
Feedback < Tst_NUM_TYPES_FEEDBACK;
|
||||
Feedback <= (Tst_Feedback_t) (Tst_NUM_TYPES_FEEDBACK - 1);
|
||||
Feedback++)
|
||||
{
|
||||
HTM_LABEL_Begin ("class=\"DAT\"");
|
||||
|
@ -2127,7 +2127,7 @@ void Tst_GetConfigFromRow (MYSQL_ROW row)
|
|||
|
||||
/***** Get feedback type (row[5]) *****/
|
||||
for (Feedback = (Tst_Feedback_t) 0;
|
||||
Feedback < Tst_NUM_TYPES_FEEDBACK;
|
||||
Feedback <= (Tst_Feedback_t) (Tst_NUM_TYPES_FEEDBACK - 1);
|
||||
Feedback++)
|
||||
if (!strcmp (row[5],Tst_FeedbackDB[Feedback]))
|
||||
{
|
||||
|
@ -2344,7 +2344,7 @@ static void Tst_ShowFormAnswerTypes (void)
|
|||
|
||||
/***** Type of answer *****/
|
||||
for (AnsType = (Tst_AnswerType_t) 0;
|
||||
AnsType < Tst_NUM_ANS_TYPES;
|
||||
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
|
||||
AnsType++)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -2825,7 +2825,7 @@ static void Tst_ListOneOrMoreQuestionsForEdition (unsigned long NumRows,
|
|||
/* Number of times that the question has been answered */
|
||||
/* Average score */
|
||||
for (Order = (Tst_QuestionsOrder_t) 0;
|
||||
Order < (Tst_QuestionsOrder_t) Tst_NUM_TYPES_ORDER_QST;
|
||||
Order <= (Tst_QuestionsOrder_t) (Tst_NUM_TYPES_ORDER_QST - 1);
|
||||
Order++)
|
||||
{
|
||||
HTM_TH_Begin (1,1,"LT");
|
||||
|
@ -5243,7 +5243,7 @@ static void Tst_PutFormEditOneQst (char Stem[Cns_MAX_BYTES_TEXT + 1],
|
|||
|
||||
HTM_TD_Begin ("class=\"%s LT\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
|
||||
for (AnsType = (Tst_AnswerType_t) 0;
|
||||
AnsType < Tst_NUM_ANS_TYPES;
|
||||
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
|
||||
AnsType++)
|
||||
{
|
||||
HTM_LABEL_Begin (NULL);
|
||||
|
@ -5838,7 +5838,7 @@ Tst_AnswerType_t Tst_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeBD)
|
|||
|
||||
if (StrAnsTypeBD != NULL)
|
||||
for (AnsType = (Tst_AnswerType_t) 0;
|
||||
AnsType < Tst_NUM_ANS_TYPES;
|
||||
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
|
||||
AnsType++)
|
||||
if (!strcmp (StrAnsTypeBD,Tst_StrAnswerTypesDB[AnsType]))
|
||||
return AnsType;
|
||||
|
@ -6285,6 +6285,111 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void)
|
|||
return true; // Question format without errors
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*********** Check if a test question already exists in database *************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Tst_CheckIfQuestionExistsInDB (void)
|
||||
{
|
||||
extern const char *Tst_StrAnswerTypesDB[Tst_NUM_ANS_TYPES];
|
||||
MYSQL_RES *mysql_res_qst;
|
||||
MYSQL_RES *mysql_res_ans;
|
||||
MYSQL_ROW row;
|
||||
bool IdenticalQuestionFound = false;
|
||||
bool IdenticalAnswers;
|
||||
unsigned NumQst;
|
||||
unsigned NumQstsWithThisStem;
|
||||
unsigned NumOpt;
|
||||
unsigned NumOptsExistingQstInDB;
|
||||
long QstCod;
|
||||
unsigned i;
|
||||
|
||||
/***** Check if stem exists *****/
|
||||
NumQstsWithThisStem =
|
||||
(unsigned) DB_QuerySELECT (&mysql_res_qst,"can not check"
|
||||
" if a question exists",
|
||||
"SELECT QstCod FROM tst_questions"
|
||||
" WHERE CrsCod=%ld AND AnsType='%s' AND Stem='%s'",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
Tst_StrAnswerTypesDB[Gbl.Test.AnswerType],
|
||||
Gbl.Test.Stem.Text);
|
||||
|
||||
if (NumQstsWithThisStem) // There are questions in database with the same stem that the one of this question
|
||||
{
|
||||
/***** Check if the answer exists in any of the questions with the same stem *****/
|
||||
/* For each question with the same stem */
|
||||
for (NumQst = 0;
|
||||
!IdenticalQuestionFound && NumQst < NumQstsWithThisStem;
|
||||
NumQst++)
|
||||
{
|
||||
row = mysql_fetch_row (mysql_res_qst);
|
||||
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
|
||||
Lay_ShowErrorAndExit ("Wrong code of question.");
|
||||
|
||||
/* Get answers from this question */
|
||||
NumOptsExistingQstInDB =
|
||||
(unsigned) DB_QuerySELECT (&mysql_res_ans,"can not get the answer"
|
||||
" of a question",
|
||||
"SELECT Answer FROM tst_answers"
|
||||
" WHERE QstCod=%ld ORDER BY AnsInd",
|
||||
QstCod);
|
||||
|
||||
switch (Gbl.Test.AnswerType)
|
||||
{
|
||||
case Tst_ANS_INT:
|
||||
row = mysql_fetch_row (mysql_res_ans);
|
||||
IdenticalQuestionFound = (Tst_GetIntAnsFromStr (row[0]) == Gbl.Test.Answer.Integer);
|
||||
break;
|
||||
case Tst_ANS_FLOAT:
|
||||
for (IdenticalAnswers = true, i = 0;
|
||||
IdenticalAnswers && i < 2;
|
||||
i++)
|
||||
{
|
||||
row = mysql_fetch_row (mysql_res_ans);
|
||||
IdenticalAnswers = (Str_GetDoubleFromStr (row[0]) == Gbl.Test.Answer.FloatingPoint[i]);
|
||||
}
|
||||
IdenticalQuestionFound = IdenticalAnswers;
|
||||
break;
|
||||
case Tst_ANS_TRUE_FALSE:
|
||||
row = mysql_fetch_row (mysql_res_ans);
|
||||
IdenticalQuestionFound = (Str_ConvertToUpperLetter (row[0][0]) == Gbl.Test.Answer.TF);
|
||||
break;
|
||||
case Tst_ANS_UNIQUE_CHOICE:
|
||||
case Tst_ANS_MULTIPLE_CHOICE:
|
||||
case Tst_ANS_TEXT:
|
||||
if (NumOptsExistingQstInDB == Gbl.Test.Answer.NumOptions)
|
||||
{
|
||||
for (IdenticalAnswers = true, NumOpt = 0;
|
||||
IdenticalAnswers && NumOpt < NumOptsExistingQstInDB;
|
||||
NumOpt++)
|
||||
{
|
||||
row = mysql_fetch_row (mysql_res_ans);
|
||||
|
||||
if (strcasecmp (row[0],Gbl.Test.Answer.Options[NumOpt].Text))
|
||||
IdenticalAnswers = false;
|
||||
}
|
||||
}
|
||||
else // Different number of answers (options)
|
||||
IdenticalAnswers = false;
|
||||
IdenticalQuestionFound = IdenticalAnswers;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Free structure that stores the query result for answers */
|
||||
DB_FreeMySQLResult (&mysql_res_ans);
|
||||
}
|
||||
}
|
||||
else // Stem does not exist
|
||||
IdenticalQuestionFound = false;
|
||||
|
||||
/* Free structure that stores the query result for questions */
|
||||
DB_FreeMySQLResult (&mysql_res_qst);
|
||||
|
||||
return IdenticalQuestionFound;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Move images associates to a test question to their definitive directories */
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -197,6 +197,9 @@ int Tst_AllocateTextChoiceAnswer (unsigned NumOpt);
|
|||
Tst_AnswerType_t Tst_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeBD);
|
||||
void Tst_ReceiveQst (void);
|
||||
bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void);
|
||||
|
||||
bool Tst_CheckIfQuestionExistsInDB (void);
|
||||
|
||||
long Tst_GetIntAnsFromStr (char *Str);
|
||||
void Tst_RequestRemoveQst (void);
|
||||
void Tst_RemoveQst (void);
|
||||
|
|
|
@ -72,7 +72,6 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod);
|
|||
static void TsI_ReadQuestionsFromXMLFileAndStoreInDB (const char *FileNameXML);
|
||||
static void TsI_ImportQuestionsFromXMLBuffer (const char *XMLBuffer);
|
||||
static Tst_AnswerType_t TsI_ConvertFromStrAnsTypXMLToAnsTyp (const char *StrAnsTypeXML);
|
||||
static bool TsI_CheckIfQuestionExistsInDB (void);
|
||||
static void TsI_GetAnswerFromXML (struct XMLElement *AnswerElem);
|
||||
static void TsI_WriteHeadingListImportedQst (void);
|
||||
static void TsI_WriteRowImportedQst (struct XMLElement *StemElem,
|
||||
|
@ -641,7 +640,7 @@ static void TsI_ImportQuestionsFromXMLBuffer (const char *XMLBuffer)
|
|||
if (Tst_CheckIfQstFormatIsCorrectAndCountNumOptions ())
|
||||
{
|
||||
/* Check if question already exists in database */
|
||||
QuestionExists = TsI_CheckIfQuestionExistsInDB ();
|
||||
QuestionExists = Tst_CheckIfQuestionExistsInDB ();
|
||||
|
||||
/* Write row with this imported question */
|
||||
TsI_WriteRowImportedQst (StemElem,FeedbackElem,QuestionExists);
|
||||
|
@ -682,7 +681,7 @@ static Tst_AnswerType_t TsI_ConvertFromStrAnsTypXMLToAnsTyp (const char *StrAnsT
|
|||
|
||||
if (StrAnsTypeXML != NULL)
|
||||
for (AnsType = (Tst_AnswerType_t) 0;
|
||||
AnsType < Tst_NUM_ANS_TYPES;
|
||||
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
|
||||
AnsType++)
|
||||
// comparison must be case insensitive, because users can edit XML
|
||||
if (!strcasecmp (StrAnsTypeXML,Tst_StrAnswerTypesXML[AnsType]))
|
||||
|
@ -692,111 +691,6 @@ static Tst_AnswerType_t TsI_ConvertFromStrAnsTypXMLToAnsTyp (const char *StrAnsT
|
|||
return (Tst_AnswerType_t) 0; // Not reached
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**************** Get answer inside an XML question elements *****************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool TsI_CheckIfQuestionExistsInDB (void)
|
||||
{
|
||||
extern const char *Tst_StrAnswerTypesDB[Tst_NUM_ANS_TYPES];
|
||||
MYSQL_RES *mysql_res_qst;
|
||||
MYSQL_RES *mysql_res_ans;
|
||||
MYSQL_ROW row;
|
||||
bool IdenticalQuestionFound = false;
|
||||
bool IdenticalAnswers;
|
||||
unsigned NumQst;
|
||||
unsigned NumQstsWithThisStem;
|
||||
unsigned NumOpt;
|
||||
unsigned NumOptsExistingQstInDB;
|
||||
long QstCod;
|
||||
unsigned i;
|
||||
|
||||
/***** Check if stem exists *****/
|
||||
NumQstsWithThisStem =
|
||||
(unsigned) DB_QuerySELECT (&mysql_res_qst,"can not check"
|
||||
" if a question exists",
|
||||
"SELECT QstCod FROM tst_questions"
|
||||
" WHERE CrsCod=%ld AND AnsType='%s' AND Stem='%s'",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
Tst_StrAnswerTypesDB[Gbl.Test.AnswerType],
|
||||
Gbl.Test.Stem.Text);
|
||||
|
||||
if (NumQstsWithThisStem) // There are questions in database with the same stem that the one of this question
|
||||
{
|
||||
/***** Check if the answer exists in any of the questions with the same stem *****/
|
||||
/* For each question with the same stem */
|
||||
for (NumQst = 0;
|
||||
!IdenticalQuestionFound && NumQst < NumQstsWithThisStem;
|
||||
NumQst++)
|
||||
{
|
||||
row = mysql_fetch_row (mysql_res_qst);
|
||||
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
|
||||
Lay_ShowErrorAndExit ("Wrong code of question.");
|
||||
|
||||
/* Get answers from this question */
|
||||
NumOptsExistingQstInDB =
|
||||
(unsigned) DB_QuerySELECT (&mysql_res_ans,"can not get the answer"
|
||||
" of a question",
|
||||
"SELECT Answer FROM tst_answers"
|
||||
" WHERE QstCod=%ld ORDER BY AnsInd",
|
||||
QstCod);
|
||||
|
||||
switch (Gbl.Test.AnswerType)
|
||||
{
|
||||
case Tst_ANS_INT:
|
||||
row = mysql_fetch_row (mysql_res_ans);
|
||||
IdenticalQuestionFound = (Tst_GetIntAnsFromStr (row[0]) == Gbl.Test.Answer.Integer);
|
||||
break;
|
||||
case Tst_ANS_FLOAT:
|
||||
for (IdenticalAnswers = true, i = 0;
|
||||
IdenticalAnswers && i < 2;
|
||||
i++)
|
||||
{
|
||||
row = mysql_fetch_row (mysql_res_ans);
|
||||
IdenticalAnswers = (Str_GetDoubleFromStr (row[0]) == Gbl.Test.Answer.FloatingPoint[i]);
|
||||
}
|
||||
IdenticalQuestionFound = IdenticalAnswers;
|
||||
break;
|
||||
case Tst_ANS_TRUE_FALSE:
|
||||
row = mysql_fetch_row (mysql_res_ans);
|
||||
IdenticalQuestionFound = (Str_ConvertToUpperLetter (row[0][0]) == Gbl.Test.Answer.TF);
|
||||
break;
|
||||
case Tst_ANS_UNIQUE_CHOICE:
|
||||
case Tst_ANS_MULTIPLE_CHOICE:
|
||||
case Tst_ANS_TEXT:
|
||||
if (NumOptsExistingQstInDB == Gbl.Test.Answer.NumOptions)
|
||||
{
|
||||
for (IdenticalAnswers = true, NumOpt = 0;
|
||||
IdenticalAnswers && NumOpt < NumOptsExistingQstInDB;
|
||||
NumOpt++)
|
||||
{
|
||||
row = mysql_fetch_row (mysql_res_ans);
|
||||
|
||||
if (strcasecmp (row[0],Gbl.Test.Answer.Options[NumOpt].Text))
|
||||
IdenticalAnswers = false;
|
||||
}
|
||||
}
|
||||
else // Different number of answers (options)
|
||||
IdenticalAnswers = false;
|
||||
IdenticalQuestionFound = IdenticalAnswers;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Free structure that stores the query result for answers */
|
||||
DB_FreeMySQLResult (&mysql_res_ans);
|
||||
}
|
||||
}
|
||||
else // Stem does not exist
|
||||
IdenticalQuestionFound = false;
|
||||
|
||||
/* Free structure that stores the query result for questions */
|
||||
DB_FreeMySQLResult (&mysql_res_qst);
|
||||
|
||||
return IdenticalQuestionFound;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**************** Get answer inside an XML question elements *****************/
|
||||
/*****************************************************************************/
|
||||
|
|
1020
swad_text.c
1020
swad_text.c
File diff suppressed because it is too large
Load Diff
|
@ -323,7 +323,7 @@ void The_PutIconsToSelectTheme (void)
|
|||
Set_StartSettingsHead ();
|
||||
Set_StartOneSettingSelector ();
|
||||
for (Theme = (The_Theme_t) 0;
|
||||
Theme < The_NUM_THEMES;
|
||||
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
|
||||
Theme++)
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"%s\"",Theme == Gbl.Prefs.Theme ? "PREF_ON" :
|
||||
|
@ -396,7 +396,7 @@ The_Theme_t The_GetParamTheme (void)
|
|||
|
||||
Par_GetParToText ("Theme",ThemeId,The_MAX_BYTES_THEME_ID);
|
||||
for (Theme = (The_Theme_t) 0;
|
||||
Theme < The_NUM_THEMES;
|
||||
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
|
||||
Theme++)
|
||||
if (!strcmp (ThemeId,The_ThemeId[Theme]))
|
||||
return Theme;
|
||||
|
@ -413,7 +413,7 @@ The_Theme_t The_GetThemeFromStr (const char *Str)
|
|||
The_Theme_t Theme;
|
||||
|
||||
for (Theme = (The_Theme_t) 0;
|
||||
Theme < The_NUM_THEMES;
|
||||
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
|
||||
Theme++)
|
||||
if (!strcasecmp (Str,The_ThemeId[Theme]))
|
||||
return Theme;
|
||||
|
|
|
@ -280,11 +280,11 @@ static void TT_GetParamsTimeTable (void)
|
|||
/***** Get class type *****/
|
||||
Par_GetParToText ("TTTyp",StrClassType,TT_MAX_BYTES_STR_CLASS_TYPE);
|
||||
for (Gbl.TimeTable.ClassType = (TT_ClassType_t) 0;
|
||||
Gbl.TimeTable.ClassType < (TT_ClassType_t) TT_NUM_CLASS_TYPES;
|
||||
Gbl.TimeTable.ClassType <= (TT_ClassType_t) (TT_NUM_CLASS_TYPES - 1);
|
||||
Gbl.TimeTable.ClassType++)
|
||||
if (!strcmp (StrClassType,TT_ClassTypeDB[Gbl.TimeTable.ClassType]))
|
||||
break;
|
||||
if (Gbl.TimeTable.ClassType == (TT_ClassType_t) TT_NUM_CLASS_TYPES)
|
||||
if (Gbl.TimeTable.ClassType > (TT_ClassType_t) (TT_NUM_CLASS_TYPES - 1))
|
||||
Lay_ShowErrorAndExit ("Type of timetable cell is missing.");
|
||||
|
||||
/***** Get class duration *****/
|
||||
|
@ -420,9 +420,9 @@ static void TT_PutFormToSelectWhichGroupsToShow (void)
|
|||
{
|
||||
static const Act_Action_t ActSeeTT[TT_NUM_TIMETABLE_TYPES] =
|
||||
{
|
||||
ActSeeCrsTT, // TT_COURSE_TIMETABLE
|
||||
ActSeeMyTT, // TT_MY_TIMETABLE
|
||||
ActUnk, // TT_TUTORING_TIMETABLE
|
||||
[TT_COURSE_TIMETABLE ] = ActSeeCrsTT,
|
||||
[TT_MY_TIMETABLE ] = ActSeeMyTT,
|
||||
[TT_TUTORING_TIMETABLE] = ActUnk,
|
||||
};
|
||||
|
||||
Grp_ShowFormToSelWhichGrps (ActSeeTT[Gbl.TimeTable.Type],NULL);
|
||||
|
@ -1607,7 +1607,7 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co
|
|||
HTM_SELECT_Begin (true,
|
||||
"name=\"TTTyp\" class=\"TT_TYP\"");
|
||||
for (CT = (TT_ClassType_t) 0;
|
||||
CT < (TT_ClassType_t) TT_NUM_CLASS_TYPES;
|
||||
CT <= (TT_ClassType_t) (TT_NUM_CLASS_TYPES - 1);
|
||||
CT++)
|
||||
if ((CT == TT_FREE) ||
|
||||
((Gbl.TimeTable.View == TT_CRS_EDIT) && (CT == TT_LECTURE || CT == TT_PRACTICAL)) ||
|
||||
|
|
12
swad_user.c
12
swad_user.c
|
@ -691,7 +691,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat,Usr_GetPrefs_t GetPrefs)
|
|||
/* Get language (row[26]) */
|
||||
UsrDat->Prefs.Language = Lan_LANGUAGE_UNKNOWN; // Language unknown
|
||||
for (Lan = (Lan_Language_t) 1;
|
||||
Lan <= Lan_NUM_LANGUAGES;
|
||||
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
|
||||
Lan++)
|
||||
if (!strcasecmp (row[26],Lan_STR_LANG_ID[Lan]))
|
||||
{
|
||||
|
@ -708,7 +708,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat,Usr_GetPrefs_t GetPrefs)
|
|||
/* Get theme (row[29]) */
|
||||
UsrDat->Prefs.Theme = The_THEME_DEFAULT;
|
||||
for (Theme = (The_Theme_t) 0;
|
||||
Theme < The_NUM_THEMES;
|
||||
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
|
||||
Theme++)
|
||||
if (!strcasecmp (row[29],The_ThemeId[Theme]))
|
||||
{
|
||||
|
@ -719,7 +719,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat,Usr_GetPrefs_t GetPrefs)
|
|||
/* Get icon set (row[30]) */
|
||||
UsrDat->Prefs.IconSet = Ico_ICON_SET_DEFAULT;
|
||||
for (IconSet = (Ico_IconSet_t) 0;
|
||||
IconSet < Ico_NUM_ICON_SETS;
|
||||
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
|
||||
IconSet++)
|
||||
if (!strcasecmp (row[30],Ico_IconSetId[IconSet]))
|
||||
{
|
||||
|
@ -866,7 +866,7 @@ static Usr_Sex_t Usr_GetSexFromStr (const char *Str)
|
|||
Usr_Sex_t Sex;
|
||||
|
||||
for (Sex = (Usr_Sex_t) 0;
|
||||
Sex < Usr_NUM_SEXS;
|
||||
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
|
||||
Sex++)
|
||||
if (!strcasecmp (Str,Usr_StringsSexDB[Sex]))
|
||||
return Sex;
|
||||
|
@ -6110,7 +6110,7 @@ void Usr_FreeListsSelectedEncryptedUsrsCods (struct SelectedUsrs *SelectedUsrs)
|
|||
{
|
||||
/***** Free lists *****/
|
||||
for (Role = (Rol_Role_t) 0;
|
||||
Role < Rol_NUM_ROLES;
|
||||
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
|
||||
Role++)
|
||||
if (SelectedUsrs->List[Role])
|
||||
{
|
||||
|
@ -7696,7 +7696,7 @@ static void Usr_GetMyUsrListTypeFromDB (void)
|
|||
row = mysql_fetch_row (mysql_res);
|
||||
if (row[0])
|
||||
for (ListType = (Usr_ShowUsrsType_t) 0;
|
||||
ListType < Usr_NUM_USR_LIST_TYPES;
|
||||
ListType <= (Usr_ShowUsrsType_t) (Usr_NUM_USR_LIST_TYPES - 1);
|
||||
ListType++)
|
||||
if (!strcasecmp (row[0],Usr_StringsUsrListTypeInDB[ListType]))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue