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,"