diff --git a/swad_changelog.h b/swad_changelog.h
index aa9af0a31..e9a6a9c53 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -487,14 +487,15 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
-#define Log_PLATFORM_VERSION "SWAD 19.42.7 (2019-10-24)"
+#define Log_PLATFORM_VERSION "SWAD 19.42.8 (2019-10-25)"
#define CSS_FILE "swad19.42.6.css"
#define JS_FILE "swad19.39.js"
/*
// TODO: Perico: poner un candado de bloqueo de creación/edición de proyectos (por ejemplo en asignaturas obsoletas)
// TODO: Hacer un nuevo rol en los TFG: tutor externo (profesor de áreas no vinculadas con el centro, profesionales de empresas, etc.)
- Version 19.42.7: Oct 24, 2019 Code refactoring in media. (246037 lines)
+ Version 19.42.8: Oct 25, 2019 New warning on projects non-assigned but with registered students. (246052 lines)
+ Version 19.42.7: Oct 25, 2019 Code refactoring in media. (246037 lines)
Version 19.42.6: Oct 24, 2019 Code refactoring in CSS.
Changes icon to upload file in timeline.
Code refactoring in media. (246034 lines)
diff --git a/swad_file_browser.c b/swad_file_browser.c
index c78288c86..d0cdbab81 100644
--- a/swad_file_browser.c
+++ b/swad_file_browser.c
@@ -3298,7 +3298,7 @@ static void Brw_FormToChangeCrsGrpZone (void)
"My_All != Prj_FILTER_WHOSE_PROJECTS_DEFAULT)
Prj_PutHiddenParamMy_All (Filter->My_All);
- if (Filter->PreNon != ((unsigned) Prj_FILTER_PREASSIGNED_DEFAULT |
- (unsigned) Prj_FILTER_NONPREASSIG_DEFAULT))
- Prj_PutHiddenParamPreNon (Filter->PreNon);
+ if (Filter->Assign != ((unsigned) Prj_FILTER_ASSIGNED_DEFAULT |
+ (unsigned) Prj_FILTER_NONASSIG_DEFAULT))
+ Prj_PutHiddenParamAssign (Filter->Assign);
- if (Filter->HidVis != ((unsigned) Prj_FILTER_HIDDEN_DEFAULT |
+ if (Filter->Hidden != ((unsigned) Prj_FILTER_HIDDEN_DEFAULT |
(unsigned) Prj_FILTER_VISIBL_DEFAULT))
- Prj_PutHiddenParamHidVis (Filter->HidVis);
+ Prj_PutHiddenParamHidden (Filter->Hidden);
if (Filter->Faulti != ((unsigned) Prj_FILTER_FAULTY_DEFAULT |
(unsigned) Prj_FILTER_FAULTLESS_DEFAULT))
@@ -658,14 +659,14 @@ static void Prj_PutHiddenParamMy_All (Prj_WhoseProjects_t My_All)
Par_PutHiddenParamUnsigned (Prj_PARAM_MY__ALL_NAME,(unsigned) My_All);
}
-static void Prj_PutHiddenParamPreNon (unsigned PreNon)
+static void Prj_PutHiddenParamAssign (unsigned Assign)
{
- Par_PutHiddenParamUnsigned (Prj_PARAM_PRE_NON_NAME,PreNon);
+ Par_PutHiddenParamUnsigned (Prj_PARAM_PRE_NON_NAME,Assign);
}
-static void Prj_PutHiddenParamHidVis (unsigned HidVis)
+static void Prj_PutHiddenParamHidden (unsigned Hidden)
{
- Par_PutHiddenParamUnsigned (Prj_PARAM_HID_VIS_NAME,HidVis);
+ Par_PutHiddenParamUnsigned (Prj_PARAM_HID_VIS_NAME,Hidden);
}
static void Prj_PutHiddenParamFaulti (unsigned Faulti)
@@ -692,12 +693,12 @@ static void Prj_GetHiddenParamMy_All (void)
static void Prj_GetHiddenParamPreNon (void)
{
- Gbl.Prjs.Filter.PreNon = (unsigned) Par_GetParToUnsignedLong (Prj_PARAM_PRE_NON_NAME,
+ Gbl.Prjs.Filter.Assign = (unsigned) Par_GetParToUnsignedLong (Prj_PARAM_PRE_NON_NAME,
0,
- (1 << Prj_PREASSIGNED) |
- (1 << Prj_NONPREASSIG),
- (unsigned) Prj_FILTER_PREASSIGNED_DEFAULT |
- (unsigned) Prj_FILTER_NONPREASSIG_DEFAULT);
+ (1 << Prj_ASSIGNED) |
+ (1 << Prj_NONASSIG),
+ (unsigned) Prj_FILTER_ASSIGNED_DEFAULT |
+ (unsigned) Prj_FILTER_NONASSIG_DEFAULT);
}
static void Prj_GetHiddenParamHidVis (void)
@@ -705,12 +706,12 @@ static void Prj_GetHiddenParamHidVis (void)
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD: // Students can view only visible projects
- Gbl.Prjs.Filter.HidVis = (1 << Prj_VISIBL); // Only visible projects
+ Gbl.Prjs.Filter.Hidden = (1 << Prj_VISIBL); // Only visible projects
break;
case Rol_NET:
case Rol_TCH:
case Rol_SYS_ADM:
- Gbl.Prjs.Filter.HidVis = (unsigned) Par_GetParToUnsignedLong (Prj_PARAM_HID_VIS_NAME,
+ Gbl.Prjs.Filter.Hidden = (unsigned) Par_GetParToUnsignedLong (Prj_PARAM_HID_VIS_NAME,
0,
(1 << Prj_HIDDEN) |
(1 << Prj_VISIBL),
@@ -827,7 +828,7 @@ static void Prj_ShowProjectsHead (Prj_ProjectView_t ProjectView)
static void Prj_ShowTableAllProjectsHead (void)
{
extern const char *Txt_PROJECT_ORDER[Prj_NUM_ORDERS];
- extern const char *Txt_Preassigned_QUESTION;
+ extern const char *Txt_Assigned_QUESTION;
extern const char *Txt_Number_of_students;
extern const char *Txt_PROJECT_ROLES_PLURAL_Abc[Prj_NUM_ROLES_IN_PROJECT];
extern const char *Txt_Proposal;
@@ -844,7 +845,7 @@ static void Prj_ShowTableAllProjectsHead (void)
Order <= (Prj_Order_t) (Prj_NUM_ORDERS - 1);
Order++)
HTM_TH (1,1,"LT DAT_N",Txt_PROJECT_ORDER[Order]);
- HTM_TH (1,1,"LT DAT_N",Txt_Preassigned_QUESTION);
+ HTM_TH (1,1,"LT DAT_N",Txt_Assigned_QUESTION);
HTM_TH (1,1,"LT DAT_N",Txt_Number_of_students);
for (NumRoleToShow = 0;
NumRoleToShow < Brw_NUM_ROLES_TO_SHOW;
@@ -1032,10 +1033,10 @@ static void Prj_ShowOneProject (unsigned NumIndex,struct Project *Prj,
{
extern const char *Txt_Today;
extern const char *Txt_Project_files;
- extern const char *Txt_Preassigned_QUESTION;
+ extern const char *Txt_Assigned_QUESTION;
extern const char *Txt_Yes;
extern const char *Txt_No;
- extern const char *Txt_PROJECT_PREASSIGNED_NONPREASSIGNED_SINGUL[Prj_NUM_PREASSIGNED_NONPREASSIG];
+ extern const char *Txt_PROJECT_PREASSIGNED_NONPREASSIGNED_SINGUL[Prj_NUM_ASSIGNED_NONASSIG];
extern const char *Txt_Number_of_students;
extern const char *Txt_See_more;
extern const char *Txt_See_less;
@@ -1198,7 +1199,7 @@ static void Prj_ShowOneProject (unsigned NumIndex,struct Project *Prj,
ClassLabel);
break;
}
- fprintf (Gbl.F.Out,"%s:",Txt_Preassigned_QUESTION);
+ fprintf (Gbl.F.Out,"%s:",Txt_Assigned_QUESTION);
HTM_TD_End ();
switch (ProjectView)
@@ -1212,10 +1213,14 @@ static void Prj_ShowOneProject (unsigned NumIndex,struct Project *Prj,
ClassData);
break;
}
- fprintf (Gbl.F.Out,"%s ",(Prj->Preassigned == Prj_PREASSIGNED) ? Txt_Yes :
+ fprintf (Gbl.F.Out,"%s ",(Prj->Assigned == Prj_ASSIGNED) ? Txt_Yes :
Txt_No);
- Ico_PutIconOff (PreassignedNonpreassigImage[Prj->Preassigned],
- Txt_PROJECT_PREASSIGNED_NONPREASSIGNED_SINGUL[Prj->Preassigned]);
+ Ico_PutIconOff (PreassignedNonpreassigImage[Prj->Assigned],
+ Txt_PROJECT_PREASSIGNED_NONPREASSIGNED_SINGUL[Prj->Assigned]);
+
+ if (Faults.WrongAssigned)
+ Prj_PutWarningIcon ();
+
HTM_TD_End ();
HTM_TR_End ();
@@ -1371,7 +1376,8 @@ static bool Prj_CheckIfPrjIsFaulty (long PrjCod,struct Prj_Faults *Faults)
/***** Reset faults *****/
Faults->WrongTitle =
Faults->WrongDescription =
- Faults->WrongNumStds = false;
+ Faults->WrongNumStds =
+ Faults->WrongAssigned = false;
/***** Get some project date and check faults ****/
if (PrjCod > 0)
@@ -1413,11 +1419,18 @@ static bool Prj_CheckIfPrjIsFaulty (long PrjCod,struct Prj_Faults *Faults)
/* 3. Check number of students */
if (NumProposedStds == 0)
+ // The number of proposed students should be > 0
Faults->WrongNumStds = true;
- else if (IsPreassigned)
+ else
{
NumStdsRegisteredInPrj = Prj_GetNumUsrsInPrj (PrjCod,Prj_ROLE_STD);
- Faults->WrongNumStds = (NumProposedStds != NumStdsRegisteredInPrj);
+ if (IsPreassigned) // Assigned
+ // In an assigned project the number of proposed students...
+ // ...should match the number of students registered in it
+ Faults->WrongNumStds = (NumProposedStds != NumStdsRegisteredInPrj);
+ else // Not assigned
+ // A non assigned project should not have students registered in it
+ Faults->WrongAssigned = (NumStdsRegisteredInPrj != 0);
}
}
@@ -1427,7 +1440,8 @@ static bool Prj_CheckIfPrjIsFaulty (long PrjCod,struct Prj_Faults *Faults)
return Faults->WrongTitle ||
Faults->WrongDescription ||
- Faults->WrongNumStds;
+ Faults->WrongNumStds ||
+ Faults->WrongAssigned;
}
/*****************************************************************************/
@@ -1437,7 +1451,7 @@ static bool Prj_CheckIfPrjIsFaulty (long PrjCod,struct Prj_Faults *Faults)
static void Prj_PutWarningIcon (void)
{
fprintf (Gbl.F.Out,"",
- Cfg_URL_ICON_PUBLIC,"exclamation-triangle.svg");
+ Cfg_URL_ICON_PUBLIC,"warning64x64.gif");
}
/*****************************************************************************/
@@ -1521,7 +1535,7 @@ static void Prj_ShowTableAllProjectsOneRow (struct Project *Prj)
/***** Preassigned? *****/
HTM_TD_Begin ("class=\"LT %s COLOR%u\"",ClassData,Gbl.RowEvenOdd);
- fprintf (Gbl.F.Out,"%s",(Prj->Preassigned == Prj_PREASSIGNED) ? Txt_Yes :
+ fprintf (Gbl.F.Out,"%s",(Prj->Assigned == Prj_ASSIGNED) ? Txt_Yes :
Txt_No);
HTM_TD_End ();
@@ -2669,18 +2683,18 @@ void Prj_GetListProjects (void)
Prj_FreeListProjects ();
/***** Get list of projects from database *****/
- if (Gbl.Prjs.Filter.PreNon && // Any selector is on
- Gbl.Prjs.Filter.HidVis && // Any selector is on
+ if (Gbl.Prjs.Filter.Assign && // Any selector is on
+ Gbl.Prjs.Filter.Hidden && // Any selector is on
Gbl.Prjs.Filter.Faulti) // Any selector is on
{
/* Preassigned subquery */
- switch (Gbl.Prjs.Filter.PreNon)
+ switch (Gbl.Prjs.Filter.Assign)
{
- case (1 << Prj_PREASSIGNED): // Preassigned projects
+ case (1 << Prj_ASSIGNED): // Preassigned projects
if (asprintf (&PreNonSubQuery," AND projects.Preassigned='Y'") < 0)
Lay_NotEnoughMemoryExit ();
break;
- case (1 << Prj_NONPREASSIG): // Non-preassigned projects
+ case (1 << Prj_NONASSIG): // Non-preassigned projects
if (asprintf (&PreNonSubQuery," AND projects.Preassigned='N'") < 0)
Lay_NotEnoughMemoryExit ();
break;
@@ -2700,7 +2714,7 @@ void Prj_GetListProjects (void)
case Rol_NET:
case Rol_TCH:
case Rol_SYS_ADM:
- switch (Gbl.Prjs.Filter.HidVis)
+ switch (Gbl.Prjs.Filter.Hidden)
{
case (1 << Prj_HIDDEN): // Hidden projects
if (asprintf (&HidVisSubQuery," AND projects.Hidden='Y'") < 0)
@@ -2940,8 +2954,8 @@ void Prj_GetDataOfProjectByCod (struct Project *Prj)
Prj_VISIBL;
/* Get if project is preassigned or not (row[5]) */
- Prj->Preassigned = (row[5][0] == 'Y') ? Prj_PREASSIGNED :
- Prj_NONPREASSIG;
+ Prj->Assigned = (row[5][0] == 'Y') ? Prj_ASSIGNED :
+ Prj_NONASSIG;
/* Get if project is preassigned or not (row[6]) */
LongNum = Str_ConvertStrCodToLongCod (row[6]);
@@ -3008,7 +3022,7 @@ static void Prj_ResetProject (struct Project *Prj)
Prj->CrsCod = -1L;
Prj->Locked = Prj_UNLOCKED;
Prj->Hidden = Prj_NEW_PRJ_HIDDEN_VISIBL_DEFAULT;
- Prj->Preassigned = Prj_NEW_PRJ_PREASSIGNED_NONPREASSIG_DEFAULT;
+ Prj->Assigned = Prj_NEW_PRJ_ASSIGNED_NONASSIG_DEFAULT;
Prj->NumStds = 1;
Prj->Proposal = Prj_PROPOSAL_DEFAULT;
Prj->CreatTime =
@@ -3525,7 +3539,7 @@ static void Prj_PutFormProject (struct Project *Prj,bool ItsANewProject)
extern const char *Txt_Title;
extern const char *Txt_Department;
extern const char *Txt_Another_department;
- extern const char *Txt_Preassigned_QUESTION;
+ extern const char *Txt_Assigned_QUESTION;
extern const char *Txt_Number_of_students;
extern const char *Txt_Proposal;
extern const char *Txt_PROJECT_STATUS[Prj_NUM_PROPOSAL_TYPES];
@@ -3622,19 +3636,19 @@ static void Prj_PutFormProject (struct Project *Prj,bool ItsANewProject)
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"%s RM\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
- fprintf (Gbl.F.Out,"%s:",Txt_Preassigned_QUESTION);
+ fprintf (Gbl.F.Out,"%s:",Txt_Assigned_QUESTION);
HTM_TD_End ();
HTM_TD_Begin ("class=\"LM\"");
fprintf (Gbl.F.Out,"