Version 16.183

This commit is contained in:
Antonio Cañas Vargas 2017-04-18 19:55:56 +02:00
parent 921a66af70
commit 77461e8ef9
6 changed files with 286 additions and 225 deletions

View File

@ -214,13 +214,14 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.182 (2017-04-18)"
#define Log_PLATFORM_VERSION "SWAD 16.183 (2017-04-18)"
#define CSS_FILE "swad16.181.css"
#define JS_FILE "swad16.181.js"
// Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/*
Version 16.183: Apr 18, 2017 Code refactoring in forums. (217738 lines)
Version 16.182: Apr 18, 2017 Code refactoring in forums and pagination. (217678 lines)
Version 16.181.7: Apr 18, 2017 Changes in layout of forums. (217641 lines)
Version 16.181.6: Apr 18, 2017 Code refactoring in forums. (217648 lines)

View File

@ -68,8 +68,9 @@ const unsigned PermissionThreadDeletion[For_NUM_TYPES_FORUM] =
0x180, // For_FORUM_INSTIT_TCHS
0x100, // For_FORUM_GLOBAL_USRS
0x100, // For_FORUM_GLOBAL_TCHS
0x100, // For_FORUM_SWAD_USRS
0x100, // For_FORUM_SWAD_TCHS
0x100, // For_FORUM__SWAD__USRS
0x100, // For_FORUM__SWAD__TCHS
0x000, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsSeeFor[For_NUM_TYPES_FORUM] =
@ -86,6 +87,7 @@ const Act_Action_t For_ActionsSeeFor[For_NUM_TYPES_FORUM] =
ActSeeForGenTch,
ActSeeForSWAUsr,
ActSeeForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsSeePstFor[For_NUM_TYPES_FORUM] =
{
@ -101,6 +103,7 @@ const Act_Action_t For_ActionsSeePstFor[For_NUM_TYPES_FORUM] =
ActSeePstForGenTch,
ActSeePstForSWAUsr,
ActSeePstForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsRecThrFor[For_NUM_TYPES_FORUM] =
{
@ -116,6 +119,7 @@ const Act_Action_t For_ActionsRecThrFor[For_NUM_TYPES_FORUM] =
ActRcvThrForGenTch,
ActRcvThrForSWAUsr,
ActRcvThrForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsRecRepFor[For_NUM_TYPES_FORUM] =
{
@ -131,6 +135,7 @@ const Act_Action_t For_ActionsRecRepFor[For_NUM_TYPES_FORUM] =
ActRcvRepForGenTch,
ActRcvRepForSWAUsr,
ActRcvRepForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsReqDelThr[For_NUM_TYPES_FORUM] =
{
@ -146,6 +151,7 @@ const Act_Action_t For_ActionsReqDelThr[For_NUM_TYPES_FORUM] =
ActReqDelThrGenTch,
ActReqDelThrSWAUsr,
ActReqDelThrSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsDelThrFor[For_NUM_TYPES_FORUM] =
{
@ -161,6 +167,7 @@ const Act_Action_t For_ActionsDelThrFor[For_NUM_TYPES_FORUM] =
ActDelThrForGenTch,
ActDelThrForSWAUsr,
ActDelThrForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsCutThrFor[For_NUM_TYPES_FORUM] =
{
@ -176,6 +183,7 @@ const Act_Action_t For_ActionsCutThrFor[For_NUM_TYPES_FORUM] =
ActCutThrForGenTch,
ActCutThrForSWAUsr,
ActCutThrForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsPasThrFor[For_NUM_TYPES_FORUM] =
{
@ -191,6 +199,7 @@ const Act_Action_t For_ActionsPasThrFor[For_NUM_TYPES_FORUM] =
ActPasThrForGenTch,
ActPasThrForSWAUsr,
ActPasThrForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsDelPstFor[For_NUM_TYPES_FORUM] =
{
@ -206,6 +215,7 @@ const Act_Action_t For_ActionsDelPstFor[For_NUM_TYPES_FORUM] =
ActDelPstForGenTch,
ActDelPstForSWAUsr,
ActDelPstForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsEnbPstFor[For_NUM_TYPES_FORUM] =
{
@ -221,6 +231,7 @@ const Act_Action_t For_ActionsEnbPstFor[For_NUM_TYPES_FORUM] =
ActEnbPstForGenTch,
ActEnbPstForSWAUsr,
ActEnbPstForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
const Act_Action_t For_ActionsDisPstFor[For_NUM_TYPES_FORUM] =
{
@ -236,6 +247,7 @@ const Act_Action_t For_ActionsDisPstFor[For_NUM_TYPES_FORUM] =
ActDisPstForGenTch,
ActDisPstForSWAUsr,
ActDisPstForSWATch,
ActSeeFor, // For_FORUM_UNKNOWN
};
// Links to go to <section>
@ -273,7 +285,7 @@ static long For_InsertForumThread (struct Forum *WichForum,long FirstPstCod);
static void For_RemoveThreadOnly (long ThrCod);
static void For_RemoveThreadAndItsPsts (long ThrCod);
static void For_GetThrSubject (long ThrCod,char Subject[Cns_MAX_BYTES_SUBJECT + 1]);
static void For_GetForumTypeAndLocationFromQuery (const char *Query,struct Forum *ForumSelected);
static void For_UpdateThrFirstAndLastPst (long ThrCod,long FirstPstCod,long LastPstCod);
static void For_UpdateThrLastPst (long ThrCod,long LastPstCod);
static long For_GetLastPstCod (long ThrCod);
@ -693,6 +705,14 @@ static void For_GetThrSubject (long ThrCod,char Subject[Cns_MAX_BYTES_SUBJECT +
void For_GetForumTypeAndLocationOfAPost (long PstCod,struct Forum *ForumSelected)
{
char Query[512];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned UnsignedNum;
long LongNum;
/***** Set default forum type and location *****/
ForumSelected->Type = For_FORUM_UNKNOWN;
ForumSelected->Location = -1L;
/***** Get forum type of a forum from database *****/
sprintf (Query,"SELECT forum_thread.ForumType,forum_thread.Location"
@ -700,18 +720,6 @@ void For_GetForumTypeAndLocationOfAPost (long PstCod,struct Forum *ForumSelected
" WHERE forum_post.PstCod=%ld"
" AND forum_post.ThrCod=forum_thread.ThrCod",
PstCod);
For_GetForumTypeAndLocationFromQuery (Query,ForumSelected);
}
/*****************************************************************************/
/*********** Get the forum type and location of a thread or post *************/
/*****************************************************************************/
static void For_GetForumTypeAndLocationFromQuery (const char *Query,struct Forum *ForumSelected)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned UnsignedNum;
/***** Check if there is a row with forum type *****/
if (DB_QuerySELECT (Query,&mysql_res,"can not get forum type and location"))
@ -719,18 +727,14 @@ static void For_GetForumTypeAndLocationFromQuery (const char *Query,struct Forum
row = mysql_fetch_row (mysql_res);
/* Get forum type (row[0]) */
if (sscanf (row[0],"%u",&UnsignedNum) != 1)
Lay_ShowErrorAndExit ("Wrong forum type.");
if (UnsignedNum >= For_NUM_TYPES_FORUM)
Lay_ShowErrorAndExit ("Wrong forum type.");
ForumSelected->Type = (For_ForumType_t) UnsignedNum;
if (sscanf (row[0],"%u",&UnsignedNum) == 1)
if (UnsignedNum < For_NUM_TYPES_FORUM)
ForumSelected->Type = (For_ForumType_t) UnsignedNum;
/* Get forum location (row[1]) */
if (sscanf (row[1],"%ld",&(ForumSelected->Location)) != 1)
Lay_ShowErrorAndExit ("Wrong forum location.");
if (sscanf (row[1],"%ld",&LongNum) == 1)
ForumSelected->Location = LongNum;
}
else
Lay_ShowErrorAndExit ("Wrong forum.");
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@ -1017,28 +1021,30 @@ static void For_ShowPostsOfAThread (Lay_AlertType_t AlertType,const char *Messag
/***** Check if I can moderate posts in forum *****/
switch (Gbl.Forum.ForumSelected.Type)
{
case For_FORUM_SWAD_USRS:
case For_FORUM_SWAD_TCHS:
case For_FORUM_GLOBAL_USRS:
case For_FORUM_GLOBAL_TCHS:
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
ICanModerateForum = Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM;
case For_FORUM__SWAD__USRS:
case For_FORUM__SWAD__TCHS:
ICanModerateForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM);
break;
case For_FORUM_INSTIT_USRS:
case For_FORUM_INSTIT_TCHS:
ICanModerateForum = Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM;
ICanModerateForum = (Gbl.Usrs.Me.LoggedRole >= Rol_INS_ADM);
break;
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
ICanModerateForum = (Gbl.Usrs.Me.LoggedRole >= Rol_CTR_ADM);
break;
case For_FORUM_DEGREE_USRS:
case For_FORUM_DEGREE_TCHS:
case For_FORUM_COURSE_TCHS:
ICanModerateForum = (Gbl.Usrs.Me.LoggedRole == Rol_DEG_ADM ||
Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM);
ICanModerateForum = (Gbl.Usrs.Me.LoggedRole >= Rol_DEG_ADM);
break;
case For_FORUM_COURSE_USRS:
ICanModerateForum = (Gbl.Usrs.Me.LoggedRole == Rol_TEACHER ||
Gbl.Usrs.Me.LoggedRole == Rol_DEG_ADM ||
Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM);
ICanModerateForum = (Gbl.Usrs.Me.LoggedRole >= Rol_TEACHER);
break;
default:
ICanModerateForum = false;
break;
}
@ -1852,18 +1858,18 @@ static void For_WriteLinksToPlatformForums (bool IsLastForum,
Gbl.Usrs.Me.UsrDat.Roles >= (1 << Rol_TEACHER));
/***** Link to forum of users about the platform *****/
ForumSelected.Type = For_FORUM_SWAD_USRS;
ForumSelected.Type = For_FORUM__SWAD__USRS;
ForumSelected.Location = -1L;
Highlight = (Gbl.Forum.ForumSelected.Type == For_FORUM_SWAD_USRS);
Highlight = (Gbl.Forum.ForumSelected.Type == For_FORUM__SWAD__USRS);
IsLastItemInLevel[1] = (IsLastForum && !ICanSeeTeacherForum);
For_WriteLinkToAForum (&ForumSelected,Highlight,false,0,IsLastItemInLevel);
/***** Link to forum of teachers about the platform *****/
if (ICanSeeTeacherForum)
{
ForumSelected.Type = For_FORUM_SWAD_TCHS;
ForumSelected.Type = For_FORUM__SWAD__TCHS;
ForumSelected.Location = -1L;
Highlight = (Gbl.Forum.ForumSelected.Type == For_FORUM_SWAD_TCHS);
Highlight = (Gbl.Forum.ForumSelected.Type == For_FORUM__SWAD__TCHS);
IsLastItemInLevel[1] = IsLastForum;
For_WriteLinkToAForum (&ForumSelected,Highlight,false,0,IsLastItemInLevel);
}
@ -2049,21 +2055,14 @@ static void For_WriteLinkToAForum (struct Forum *Forum,
Gbl.Prefs.IconsURL,
ForumName,ForumName);
break;
case For_FORUM_SWAD_USRS:
case For_FORUM_SWAD_TCHS:
case For_FORUM__SWAD__USRS:
case For_FORUM__SWAD__TCHS:
sprintf (Icon,"<img src=\"%s/swad64x64.gif\""
" alt=\"%s\" title=\"%s\""
" class=\"ICO20x20\" />",
Gbl.Prefs.IconsURL,
ForumName,ForumName);
break;
case For_FORUM_INSTIT_USRS:
case For_FORUM_INSTIT_TCHS:
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
case For_FORUM_DEGREE_USRS:
case For_FORUM_DEGREE_TCHS:
break;
case For_FORUM_COURSE_USRS:
case For_FORUM_COURSE_TCHS:
sprintf (Icon,"<img src=\"%s/dot64x64.png\""
@ -2072,6 +2071,8 @@ static void For_WriteLinkToAForum (struct Forum *Forum,
Gbl.Prefs.IconsURL,
ForumName,ForumName);
break;
default:
break;
}
For_WriteLinkToForum (Forum,
@ -2092,6 +2093,7 @@ void For_SetForumName (struct Forum *Forum,
extern const char *Txt_General_NO_HTML[1 + Txt_NUM_LANGUAGES];
extern const char *Txt_only_teachers;
extern const char *Txt_only_teachers_NO_HTML[1 + Txt_NUM_LANGUAGES];
extern const char *Txt_Unknown_FORUM;
struct Instit Ins;
struct Centre Ctr;
struct Degree Deg;
@ -2099,48 +2101,24 @@ void For_SetForumName (struct Forum *Forum,
switch (Forum->Type)
{
case For_FORUM_COURSE_USRS:
Crs.CrsCod = Forum->Location;
if (!Crs_GetDataOfCourseByCod (&Crs))
Lay_ShowErrorAndExit ("Course not found.");
Str_Copy (ForumName,Crs.ShrtName,
case For_FORUM_GLOBAL_USRS:
Str_Copy (ForumName,UseHTMLEntities ? Txt_General :
Txt_General_NO_HTML[Language],
For_MAX_BYTES_FORUM_NAME);
break;
case For_FORUM_COURSE_TCHS:
Crs.CrsCod = Forum->Location;
if (!Crs_GetDataOfCourseByCod (&Crs))
Lay_ShowErrorAndExit ("Course not found.");
sprintf (ForumName,"%s%s",Crs.ShrtName,
case For_FORUM_GLOBAL_TCHS:
sprintf (ForumName,"%s%s",
UseHTMLEntities ? Txt_General :
Txt_General_NO_HTML[Language],
UseHTMLEntities ? Txt_only_teachers :
Txt_only_teachers_NO_HTML[Language]);
break;
case For_FORUM_DEGREE_USRS:
Deg.DegCod = Forum->Location;
if (!Deg_GetDataOfDegreeByCod (&Deg))
Lay_ShowErrorAndExit ("Degree not found.");
Str_Copy (ForumName,Deg.ShrtName,
case For_FORUM__SWAD__USRS:
Str_Copy (ForumName,Cfg_PLATFORM_SHORT_NAME,
For_MAX_BYTES_FORUM_NAME);
break;
case For_FORUM_DEGREE_TCHS:
Deg.DegCod = Forum->Location;
if (!Deg_GetDataOfDegreeByCod (&Deg))
Lay_ShowErrorAndExit ("Degree not found.");
sprintf (ForumName,"%s%s",Deg.ShrtName,
UseHTMLEntities ? Txt_only_teachers :
Txt_only_teachers_NO_HTML[Language]);
break;
case For_FORUM_CENTRE_USRS:
Ctr.CtrCod = Forum->Location;
if (!Ctr_GetDataOfCentreByCod (&Ctr))
Lay_ShowErrorAndExit ("Centre not found.");
Str_Copy (ForumName,Ctr.ShrtName,
For_MAX_BYTES_FORUM_NAME);
break;
case For_FORUM_CENTRE_TCHS:
Ctr.CtrCod = Forum->Location;
if (!Ctr_GetDataOfCentreByCod (&Ctr))
Lay_ShowErrorAndExit ("Centre not found.");
sprintf (ForumName,"%s%s",Ctr.ShrtName,
case For_FORUM__SWAD__TCHS:
sprintf (ForumName,"%s%s",Cfg_PLATFORM_SHORT_NAME,
UseHTMLEntities ? Txt_only_teachers :
Txt_only_teachers_NO_HTML[Language]);
break;
@ -2159,27 +2137,54 @@ void For_SetForumName (struct Forum *Forum,
UseHTMLEntities ? Txt_only_teachers :
Txt_only_teachers_NO_HTML[Language]);
break;
case For_FORUM_GLOBAL_USRS:
Str_Copy (ForumName,UseHTMLEntities ? Txt_General :
Txt_General_NO_HTML[Language],
case For_FORUM_CENTRE_USRS:
Ctr.CtrCod = Forum->Location;
if (!Ctr_GetDataOfCentreByCod (&Ctr))
Lay_ShowErrorAndExit ("Centre not found.");
Str_Copy (ForumName,Ctr.ShrtName,
For_MAX_BYTES_FORUM_NAME);
break;
case For_FORUM_GLOBAL_TCHS:
sprintf (ForumName,"%s%s",
UseHTMLEntities ? Txt_General :
Txt_General_NO_HTML[Language],
case For_FORUM_CENTRE_TCHS:
Ctr.CtrCod = Forum->Location;
if (!Ctr_GetDataOfCentreByCod (&Ctr))
Lay_ShowErrorAndExit ("Centre not found.");
sprintf (ForumName,"%s%s",Ctr.ShrtName,
UseHTMLEntities ? Txt_only_teachers :
Txt_only_teachers_NO_HTML[Language]);
break;
case For_FORUM_SWAD_USRS:
Str_Copy (ForumName,Cfg_PLATFORM_SHORT_NAME,
case For_FORUM_DEGREE_USRS:
Deg.DegCod = Forum->Location;
if (!Deg_GetDataOfDegreeByCod (&Deg))
Lay_ShowErrorAndExit ("Degree not found.");
Str_Copy (ForumName,Deg.ShrtName,
For_MAX_BYTES_FORUM_NAME);
break;
case For_FORUM_SWAD_TCHS:
sprintf (ForumName,"%s%s",Cfg_PLATFORM_SHORT_NAME,
case For_FORUM_DEGREE_TCHS:
Deg.DegCod = Forum->Location;
if (!Deg_GetDataOfDegreeByCod (&Deg))
Lay_ShowErrorAndExit ("Degree not found.");
sprintf (ForumName,"%s%s",Deg.ShrtName,
UseHTMLEntities ? Txt_only_teachers :
Txt_only_teachers_NO_HTML[Language]);
break;
case For_FORUM_COURSE_USRS:
Crs.CrsCod = Forum->Location;
if (!Crs_GetDataOfCourseByCod (&Crs))
Lay_ShowErrorAndExit ("Course not found.");
Str_Copy (ForumName,Crs.ShrtName,
For_MAX_BYTES_FORUM_NAME);
break;
case For_FORUM_COURSE_TCHS:
Crs.CrsCod = Forum->Location;
if (!Crs_GetDataOfCourseByCod (&Crs))
Lay_ShowErrorAndExit ("Course not found.");
sprintf (ForumName,"%s%s",Crs.ShrtName,
UseHTMLEntities ? Txt_only_teachers :
Txt_only_teachers_NO_HTML[Language]);
break;
default:
Str_Copy (ForumName,Txt_Unknown_FORUM,
For_MAX_BYTES_FORUM_NAME);
}
}
@ -2688,10 +2693,13 @@ unsigned For_GetNumTotalForumsOfType (For_ForumType_t ForumType,
/***** Get number of forums of a type from database *****/
switch (ForumType)
{
case For_FORUM_SWAD_USRS: case For_FORUM_SWAD_TCHS:
case For_FORUM_GLOBAL_USRS: case For_FORUM_GLOBAL_TCHS:
case For_FORUM_GLOBAL_USRS:
case For_FORUM_GLOBAL_TCHS:
case For_FORUM__SWAD__USRS:
case For_FORUM__SWAD__TCHS:
return 1; // Only one forum
case For_FORUM_INSTIT_USRS: case For_FORUM_INSTIT_TCHS:
case For_FORUM_INSTIT_USRS:
case For_FORUM_INSTIT_TCHS:
if (InsCod > 0) // InsCod > 0 ==> 0 <= number of institutions forums for an institution <= 1
sprintf (Query,"SELECT COUNT(DISTINCT Location)"
" FROM forum_thread"
@ -2711,7 +2719,8 @@ unsigned For_GetNumTotalForumsOfType (For_ForumType_t ForumType,
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
case For_FORUM_CENTRE_USRS: case For_FORUM_CENTRE_TCHS:
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
if (CtrCod > 0) // CtrCod > 0 ==> 0 <= number of centre forums for a centre <= 1
sprintf (Query,"SELECT COUNT(DISTINCT Location)"
" FROM forum_thread"
@ -2739,7 +2748,8 @@ unsigned For_GetNumTotalForumsOfType (For_ForumType_t ForumType,
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
case For_FORUM_DEGREE_USRS: case For_FORUM_DEGREE_TCHS:
case For_FORUM_DEGREE_USRS:
case For_FORUM_DEGREE_TCHS:
if (DegCod > 0) // DegCod > 0 ==> 0 <= number of degree forums for a degree <= 1
sprintf (Query,"SELECT COUNT(DISTINCT Location)"
" FROM forum_thread"
@ -2776,7 +2786,8 @@ unsigned For_GetNumTotalForumsOfType (For_ForumType_t ForumType,
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
case For_FORUM_COURSE_USRS: case For_FORUM_COURSE_TCHS:
case For_FORUM_COURSE_USRS:
case For_FORUM_COURSE_TCHS:
if (CrsCod > 0) // CrsCod > 0 ==> 0 <= number of course forums for a course <= 1
sprintf (Query,"SELECT COUNT(DISTINCT Location)"
" FROM forum_thread"
@ -2823,6 +2834,8 @@ unsigned For_GetNumTotalForumsOfType (For_ForumType_t ForumType,
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
default:
return 0;
}
DB_QuerySELECT (Query,&mysql_res,"can not get number of forums of a type");
@ -2851,15 +2864,18 @@ unsigned For_GetNumTotalThrsInForumsOfType (For_ForumType_t ForumType,
/***** Get total number of threads in forums of this type from database *****/
switch (ForumType)
{
case For_FORUM_SWAD_USRS: case For_FORUM_SWAD_TCHS:
case For_FORUM_GLOBAL_USRS: case For_FORUM_GLOBAL_TCHS:
case For_FORUM_GLOBAL_USRS:
case For_FORUM_GLOBAL_TCHS:
case For_FORUM__SWAD__USRS:
case For_FORUM__SWAD__TCHS:
// Total number of threads in forums of this type
sprintf (Query,"SELECT COUNT(*)"
" FROM forum_thread"
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
case For_FORUM_INSTIT_USRS: case For_FORUM_INSTIT_TCHS:
case For_FORUM_INSTIT_USRS:
case For_FORUM_INSTIT_TCHS:
if (InsCod > 0) // InsCod > 0 ==> Number of threads in institution forums for an institution
sprintf (Query,"SELECT COUNT(*)"
" FROM forum_thread"
@ -2879,7 +2895,8 @@ unsigned For_GetNumTotalThrsInForumsOfType (For_ForumType_t ForumType,
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
case For_FORUM_CENTRE_USRS: case For_FORUM_CENTRE_TCHS:
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
if (CtrCod > 0) // CtrCod > 0 ==> 0 <= Number of threads in centre forums for a centre <= 1
sprintf (Query,"SELECT COUNT(*)"
" FROM forum_thread"
@ -2907,7 +2924,8 @@ unsigned For_GetNumTotalThrsInForumsOfType (For_ForumType_t ForumType,
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
case For_FORUM_DEGREE_USRS: case For_FORUM_DEGREE_TCHS:
case For_FORUM_DEGREE_USRS:
case For_FORUM_DEGREE_TCHS:
if (DegCod > 0) // DegCod > 0 ==> Number of threads in degree forums for a degree
sprintf (Query,"SELECT COUNT(*)"
" FROM forum_thread"
@ -2944,7 +2962,8 @@ unsigned For_GetNumTotalThrsInForumsOfType (For_ForumType_t ForumType,
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
case For_FORUM_COURSE_USRS: case For_FORUM_COURSE_TCHS:
case For_FORUM_COURSE_USRS:
case For_FORUM_COURSE_TCHS:
if (CrsCod > 0) // CrsCod > 0 ==> 0 <= Number of threads in course forums for a course
sprintf (Query,"SELECT COUNT(*)"
" FROM forum_thread"
@ -2991,6 +3010,8 @@ unsigned For_GetNumTotalThrsInForumsOfType (For_ForumType_t ForumType,
" WHERE ForumType=%u",
(unsigned) ForumType);
break;
default:
return 0;
}
return (unsigned) DB_QueryCOUNT (Query,"can not get the number of threads in forums of a type");
}
@ -3030,8 +3051,10 @@ unsigned For_GetNumTotalPstsInForumsOfType (For_ForumType_t ForumType,
/***** Get total number of posts in forums of this type from database *****/
switch (ForumType)
{
case For_FORUM_SWAD_USRS: case For_FORUM_SWAD_TCHS:
case For_FORUM_GLOBAL_USRS: case For_FORUM_GLOBAL_TCHS:
case For_FORUM_GLOBAL_USRS:
case For_FORUM_GLOBAL_TCHS:
case For_FORUM__SWAD__USRS:
case For_FORUM__SWAD__TCHS:
// Total number of posts in forums of this type
sprintf (Query,"SELECT COUNT(*),SUM(forum_post.NumNotif)"
" FROM forum_thread,forum_post "
@ -3062,7 +3085,8 @@ unsigned For_GetNumTotalPstsInForumsOfType (For_ForumType_t ForumType,
" AND forum_thread.ThrCod=forum_post.ThrCod",
(unsigned) ForumType);
break;
case For_FORUM_CENTRE_USRS: case For_FORUM_CENTRE_TCHS:
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
if (CtrCod > 0) // CtrCod > 0 ==> Number of posts in centre forums for a centre
sprintf (Query,"SELECT COUNT(*),SUM(forum_post.NumNotif)"
" FROM forum_thread,forum_post"
@ -3094,7 +3118,8 @@ unsigned For_GetNumTotalPstsInForumsOfType (For_ForumType_t ForumType,
" AND forum_thread.ThrCod=forum_post.ThrCod",
(unsigned) ForumType);
break;
case For_FORUM_DEGREE_USRS: case For_FORUM_DEGREE_TCHS:
case For_FORUM_DEGREE_USRS:
case For_FORUM_DEGREE_TCHS:
if (DegCod > 0) // DegCod > 0 ==> Number of posts in degree forums for a degree
sprintf (Query,"SELECT COUNT(*),SUM(forum_post.NumNotif)"
" FROM forum_thread,forum_post "
@ -3136,7 +3161,8 @@ unsigned For_GetNumTotalPstsInForumsOfType (For_ForumType_t ForumType,
" AND forum_thread.ThrCod=forum_post.ThrCod",
(unsigned) ForumType);
break;
case For_FORUM_COURSE_USRS: case For_FORUM_COURSE_TCHS:
case For_FORUM_COURSE_USRS:
case For_FORUM_COURSE_TCHS:
if (CrsCod > 0) // CrsCod > 0 ==> 0 <= number of posts in course forums for a course
sprintf (Query,"SELECT COUNT(*),SUM(forum_post.NumNotif)"
" FROM forum_thread,forum_post "
@ -3189,6 +3215,8 @@ unsigned For_GetNumTotalPstsInForumsOfType (For_ForumType_t ForumType,
" AND forum_thread.ThrCod=forum_post.ThrCod",
(unsigned) ForumType);
break;
default:
return 0;
}
DB_QuerySELECT (Query,&mysql_res,"can not get the total number of forums of a type");
@ -3569,14 +3597,14 @@ static void For_GetParamsForum (void)
/***** Get parameter with code of course, degree, centre or institution *****/
switch (Gbl.Forum.ForumSelected.Type)
{
case For_FORUM_COURSE_USRS:
case For_FORUM_COURSE_TCHS:
case For_FORUM_DEGREE_USRS:
case For_FORUM_DEGREE_TCHS:
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
case For_FORUM_INSTIT_USRS:
case For_FORUM_INSTIT_TCHS:
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:
case For_FORUM_DEGREE_USRS:
case For_FORUM_DEGREE_TCHS:
case For_FORUM_COURSE_USRS:
case For_FORUM_COURSE_TCHS:
Gbl.Forum.ForumSelected.Location = Par_GetParToLong ("Location");
break;
default:
@ -3643,7 +3671,7 @@ static void For_SetForumType (void)
case ActCutThrForSWAUsr: case ActPasThrForSWAUsr:
case ActDelPstForSWAUsr:
case ActEnbPstForSWAUsr: case ActDisPstForSWAUsr:
Gbl.Forum.ForumSelected.Type = For_FORUM_SWAD_USRS;
Gbl.Forum.ForumSelected.Type = For_FORUM__SWAD__USRS;
break;
case ActSeeForSWATch: case ActSeePstForSWATch:
case ActRcvThrForSWATch: case ActRcvRepForSWATch:
@ -3651,7 +3679,7 @@ static void For_SetForumType (void)
case ActCutThrForSWATch: case ActPasThrForSWATch:
case ActDelPstForSWATch:
case ActEnbPstForSWATch: case ActDisPstForSWATch:
Gbl.Forum.ForumSelected.Type = For_FORUM_SWAD_TCHS;
Gbl.Forum.ForumSelected.Type = For_FORUM__SWAD__TCHS;
break;
case ActSeeForInsUsr: case ActSeePstForInsUsr:
case ActRcvThrForInsUsr: case ActRcvRepForInsUsr:
@ -3717,6 +3745,8 @@ static void For_SetForumType (void)
case ActEnbPstForCrsTch: case ActDisPstForCrsTch:
Gbl.Forum.ForumSelected.Type = For_FORUM_COURSE_TCHS;
break;
default:
Gbl.Forum.ForumSelected.Type = For_FORUM_UNKNOWN;
}
}
@ -3727,34 +3757,19 @@ static void For_SetForumType (void)
static void For_RestrictAccess (void)
{
extern const char *Txt_You_dont_have_permission_to_access_to_this_forum;
bool ICanSeeForum = false;
bool ICanSeeForum;
/***** Restrict access *****/
switch (Gbl.Forum.ForumSelected.Type)
{
case For_FORUM_COURSE_USRS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyRoleInCrs (Gbl.Forum.ForumSelected.Location) >= Rol_STUDENT);
case For_FORUM_GLOBAL_USRS:
case For_FORUM__SWAD__USRS:
ICanSeeForum = true;
break;
case For_FORUM_COURSE_TCHS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyRoleInCrs (Gbl.Forum.ForumSelected.Location) >= Rol_TEACHER);
break;
case For_FORUM_DEGREE_USRS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInDeg (Gbl.Forum.ForumSelected.Location) >= Rol_STUDENT);
break;
case For_FORUM_DEGREE_TCHS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInDeg (Gbl.Forum.ForumSelected.Location) >= Rol_TEACHER);
break;
case For_FORUM_CENTRE_USRS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInCtr (Gbl.Forum.ForumSelected.Location) >= Rol_STUDENT);
break;
case For_FORUM_CENTRE_TCHS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInCtr (Gbl.Forum.ForumSelected.Location) >= Rol_TEACHER);
case For_FORUM_GLOBAL_TCHS:
case For_FORUM__SWAD__TCHS:
Rol_GetRolesInAllCrssIfNotYetGot (&Gbl.Usrs.Me.UsrDat);
ICanSeeForum = (Gbl.Usrs.Me.UsrDat.Roles >= (1 << Rol_TEACHER));
break;
case For_FORUM_INSTIT_USRS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
@ -3764,15 +3779,33 @@ static void For_RestrictAccess (void)
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInIns (Gbl.Forum.ForumSelected.Location) >= Rol_TEACHER);
break;
case For_FORUM_GLOBAL_USRS:
case For_FORUM_SWAD_USRS:
ICanSeeForum = true;
case For_FORUM_CENTRE_USRS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInCtr (Gbl.Forum.ForumSelected.Location) >= Rol_STUDENT);
break;
case For_FORUM_GLOBAL_TCHS:
case For_FORUM_SWAD_TCHS:
Rol_GetRolesInAllCrssIfNotYetGot (&Gbl.Usrs.Me.UsrDat);
ICanSeeForum = (Gbl.Usrs.Me.UsrDat.Roles >= (1 << Rol_TEACHER));
case For_FORUM_CENTRE_TCHS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInCtr (Gbl.Forum.ForumSelected.Location) >= Rol_TEACHER);
break;
case For_FORUM_DEGREE_USRS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInDeg (Gbl.Forum.ForumSelected.Location) >= Rol_STUDENT);
break;
case For_FORUM_DEGREE_TCHS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyMaxRoleInDeg (Gbl.Forum.ForumSelected.Location) >= Rol_TEACHER);
break;
case For_FORUM_COURSE_USRS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyRoleInCrs (Gbl.Forum.ForumSelected.Location) >= Rol_STUDENT);
break;
case For_FORUM_COURSE_TCHS:
ICanSeeForum = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
Rol_GetMyRoleInCrs (Gbl.Forum.ForumSelected.Location) >= Rol_TEACHER);
break;
default:
ICanSeeForum = false;
break;
}
if (!ICanSeeForum)
Lay_ShowErrorAndExit (Txt_You_dont_have_permission_to_access_to_this_forum);
@ -3971,7 +4004,7 @@ void For_ReceiveForumPost (void)
switch (Gbl.Forum.ForumSelected.Type) // Only if forum is public for any logged user
{
case For_FORUM_GLOBAL_USRS:
case For_FORUM_SWAD_USRS:
case For_FORUM__SWAD__USRS:
Soc_StoreAndPublishSocialNote (Soc_NOTE_FORUM_POST,PstCod,&SocPub);
break;
default:
@ -4056,7 +4089,7 @@ void For_RemovePost (void)
switch (Gbl.Forum.ForumSelected.Type) // Only if forum is public for any logged user
{
case For_FORUM_GLOBAL_USRS:
case For_FORUM_SWAD_USRS:
case For_FORUM__SWAD__USRS:
Soc_MarkSocialNoteAsUnavailableUsingNoteTypeAndCod (Soc_NOTE_FORUM_POST,Gbl.Forum.ForumSelected.PstCod);
break;
default:
@ -4332,10 +4365,10 @@ static void For_MoveThrToCurrentForum (long ThrCod)
/***** Move a thread to current forum *****/
switch (Gbl.Forum.ForumSelected.Type)
{
case For_FORUM_SWAD_USRS:
case For_FORUM_SWAD_TCHS:
case For_FORUM_GLOBAL_USRS:
case For_FORUM_GLOBAL_TCHS:
case For_FORUM__SWAD__USRS:
case For_FORUM__SWAD__TCHS:
sprintf (Query,"UPDATE forum_thread"
" SET ForumType=%u,Location=-1"
" WHERE ThrCod=%ld",
@ -4378,6 +4411,9 @@ static void For_MoveThrToCurrentForum (long ThrCod)
Gbl.Forum.ForumSelected.Location,
ThrCod);
break;
default:
Lay_ShowErrorAndExit ("Wrong forum.");
break;
}
DB_QueryUPDATE (Query,"can not move a thread to current forum");
}

View File

@ -47,21 +47,22 @@ typedef enum
} For_ForumSet_t; // Which set of forums I want to see: all my forums or only the forums of current institution/degree/course.
#define For_DEFAULT_FORUM_SET For_ONLY_CURRENT_FORUMS
#define For_NUM_TYPES_FORUM 12
#define For_NUM_TYPES_FORUM 13
typedef enum
{
For_FORUM_COURSE_USRS = 0,
For_FORUM_COURSE_TCHS = 1,
For_FORUM_DEGREE_USRS = 2,
For_FORUM_DEGREE_TCHS = 3,
For_FORUM_CENTRE_USRS = 4,
For_FORUM_CENTRE_TCHS = 5,
For_FORUM_INSTIT_USRS = 6,
For_FORUM_INSTIT_TCHS = 7,
For_FORUM_GLOBAL_USRS = 8,
For_FORUM_GLOBAL_TCHS = 9,
For_FORUM_SWAD_USRS = 10,
For_FORUM_SWAD_TCHS = 11,
For_FORUM_COURSE_USRS = 0, // TODO: Change to 11 (also in database)
For_FORUM_COURSE_TCHS = 1, // TODO: Change to 12 (also in database)
For_FORUM_DEGREE_USRS = 2, // TODO: Change to 9 (also in database)
For_FORUM_DEGREE_TCHS = 3, // TODO: Change to 10 (also in database)
For_FORUM_CENTRE_USRS = 4, // TODO: Change to 7 (also in database)
For_FORUM_CENTRE_TCHS = 5, // TODO: Change to 8 (also in database)
For_FORUM_INSTIT_USRS = 6, // TODO: Change to 5 (also in database)
For_FORUM_INSTIT_TCHS = 7, // TODO: Change to 6 (also in database)
For_FORUM_GLOBAL_USRS = 8, // TODO: Change to 1 (also in database)
For_FORUM_GLOBAL_TCHS = 9, // TODO: Change to 2 (also in database)
For_FORUM__SWAD__USRS = 10, // TODO: Change to 3 (also in database)
For_FORUM__SWAD__TCHS = 11, // TODO: Change to 4 (also in database)
For_FORUM_UNKNOWN = 12, // TODO: Change to 0 (also in database)
} For_ForumType_t; // Don't change numbers (used in database)
struct Forum

View File

@ -407,7 +407,7 @@ void Gbl_InitializeGlobals (void)
/* Forums */
Gbl.Forum.ForumSet = For_DEFAULT_FORUM_SET;
Gbl.Forum.ForumSelected.Type = (For_ForumType_t) 0;
Gbl.Forum.ForumSelected.Type = For_FORUM_UNKNOWN;
Gbl.Forum.ForumSelected.Location = -1L;
Gbl.Forum.ForumSelected.ThrCod = -1L;
Gbl.Forum.ForumSelected.PstCod = -1L;

View File

@ -7498,8 +7498,8 @@ static void Sta_GetAndShowForumStats (void)
case Sco_SCOPE_SYS:
Sta_ShowStatOfAForumType (For_FORUM_GLOBAL_USRS ,-1L,-1L,-1L,-1L,-1L,&StatsForum);
Sta_ShowStatOfAForumType (For_FORUM_GLOBAL_TCHS ,-1L,-1L,-1L,-1L,-1L,&StatsForum);
Sta_ShowStatOfAForumType (For_FORUM_SWAD_USRS ,-1L,-1L,-1L,-1L,-1L,&StatsForum);
Sta_ShowStatOfAForumType (For_FORUM_SWAD_TCHS ,-1L,-1L,-1L,-1L,-1L,&StatsForum);
Sta_ShowStatOfAForumType (For_FORUM__SWAD__USRS ,-1L,-1L,-1L,-1L,-1L,&StatsForum);
Sta_ShowStatOfAForumType (For_FORUM__SWAD__TCHS ,-1L,-1L,-1L,-1L,-1L,&StatsForum);
Sta_ShowStatOfAForumType (For_FORUM_INSTIT_USRS,-1L,-1L,-1L,-1L,-1L,&StatsForum);
Sta_ShowStatOfAForumType (For_FORUM_INSTIT_TCHS,-1L,-1L,-1L,-1L,-1L,&StatsForum);
Sta_ShowStatOfAForumType (For_FORUM_CENTRE_USRS ,-1L,-1L,-1L,-1L,-1L,&StatsForum);
@ -7575,35 +7575,25 @@ static void Sta_ShowStatOfAForumType (For_ForumType_t ForumType,
switch (ForumType)
{
case For_FORUM_COURSE_USRS:
case For_FORUM_GLOBAL_USRS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"crs64x64.gif",StatsForum,
Txt_Courses,"");
"forum64x64.gif",StatsForum,
Txt_General,"");
break;
case For_FORUM_COURSE_TCHS:
case For_FORUM_GLOBAL_TCHS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"crs64x64.gif",StatsForum,
Txt_Courses,Txt_only_teachers);
"forum64x64.gif",StatsForum,
Txt_General,Txt_only_teachers);
break;
case For_FORUM_DEGREE_USRS:
case For_FORUM__SWAD__USRS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"deg64x64.gif",StatsForum,
Txt_Degrees,"");
"swad64x64.gif",StatsForum,
Cfg_PLATFORM_SHORT_NAME,"");
break;
case For_FORUM_DEGREE_TCHS:
case For_FORUM__SWAD__TCHS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"deg64x64.gif",StatsForum,
Txt_Degrees,Txt_only_teachers);
break;
case For_FORUM_CENTRE_USRS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"ctr64x64.gif",StatsForum,
Txt_Centres,"");
break;
case For_FORUM_CENTRE_TCHS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"ctr64x64.gif",StatsForum,
Txt_Centres,Txt_only_teachers);
"swad64x64.gif",StatsForum,
Cfg_PLATFORM_SHORT_NAME,Txt_only_teachers);
break;
case For_FORUM_INSTIT_USRS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
@ -7615,26 +7605,38 @@ static void Sta_ShowStatOfAForumType (For_ForumType_t ForumType,
"ins64x64.gif",StatsForum,
Txt_Institutions,Txt_only_teachers);
break;
case For_FORUM_GLOBAL_USRS:
case For_FORUM_CENTRE_USRS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"forum64x64.gif",StatsForum,
Txt_General,"");
"ctr64x64.gif",StatsForum,
Txt_Centres,"");
break;
case For_FORUM_GLOBAL_TCHS:
case For_FORUM_CENTRE_TCHS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"forum64x64.gif",StatsForum,
Txt_General,Txt_only_teachers);
"ctr64x64.gif",StatsForum,
Txt_Centres,Txt_only_teachers);
break;
case For_FORUM_SWAD_USRS:
case For_FORUM_DEGREE_USRS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"swad64x64.gif",StatsForum,
Cfg_PLATFORM_SHORT_NAME,"");
"deg64x64.gif",StatsForum,
Txt_Degrees,"");
break;
case For_FORUM_SWAD_TCHS:
case For_FORUM_DEGREE_TCHS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"swad64x64.gif",StatsForum,
Cfg_PLATFORM_SHORT_NAME,Txt_only_teachers);
"deg64x64.gif",StatsForum,
Txt_Degrees,Txt_only_teachers);
break;
case For_FORUM_COURSE_USRS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"crs64x64.gif",StatsForum,
Txt_Courses,"");
break;
case For_FORUM_COURSE_TCHS:
Sta_WriteForumTitleAndStats (ForumType,CtyCod,InsCod,CtrCod,DegCod,CrsCod,
"crs64x64.gif",StatsForum,
Txt_Courses,Txt_only_teachers);
break;
default:
break;
}
}

View File

@ -49113,27 +49113,6 @@ const char *Txt_Unfollow =
"Deixar de seguir";
#endif
const char *Txt_unknown_removed_course =
#if L==1
"assignatura desconeguda / eliminada";
#elif L==2
"Kurs unbekannt / entfernt";
#elif L==3
"unknown / removed course";
#elif L==4
"asignatura desconocida / eliminada";
#elif L==5
"mati&egrave;re inconnue / supprim&eacute;e";
#elif L==6
"asignatura desconocida / eliminada"; // Okoteve traducción
#elif L==7
"corso sconosciuto / rimosso";
#elif L==8
"kurs nieznany / usuni&eogon;te";
#elif L==9
"disciplina desconhecida / removida";
#endif
const char *Txt_unknown_assignment =
#if L==1
"activitat desconeguda";
@ -49155,6 +49134,27 @@ const char *Txt_unknown_assignment =
"atividade desconhecida";
#endif
const char *Txt_Unknown_FORUM =
#if L==1
"Desconocido"; // Necessita traduccio
#elif L==2
"Unbekannt";
#elif L==3
"Unknown";
#elif L==4
"Desconocido";
#elif L==5
"Inconnu";
#elif L==6
"Desconocido"; // Okoteve traducción
#elif L==7
"Sconosciuto";
#elif L==8
"Unknown"; // Potrzebujesz tlumaczenie
#elif L==9
"Desconhecido";
#endif
const char *Txt_unknown_recipient =
#if L==1
"destinatario desconocido"; // Necessita traduccio
@ -49197,6 +49197,27 @@ const char *Txt_unknown_recipients =
"destinat&aacute;rios desconhecidos";
#endif
const char *Txt_unknown_removed_course =
#if L==1
"assignatura desconeguda / eliminada";
#elif L==2
"Kurs unbekannt / entfernt";
#elif L==3
"unknown / removed course";
#elif L==4
"asignatura desconocida / eliminada";
#elif L==5
"mati&egrave;re inconnue / supprim&eacute;e";
#elif L==6
"asignatura desconocida / eliminada"; // Okoteve traducción
#elif L==7
"corso sconosciuto / rimosso";
#elif L==8
"kurs nieznany / usuni&eogon;te";
#elif L==9
"disciplina desconhecida / removida";
#endif
const char *Txt_unknown_TIME =
#if L==1
"desconocido"; // Necessita traduccio