diff --git a/swad_changelog.h b/swad_changelog.h index e735fe1c..2ed12453 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -456,12 +456,13 @@ En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 18.110.1 (2019-04-11)" +#define Log_PLATFORM_VERSION "SWAD 18.110.2 (2019-04-11)" #define CSS_FILE "swad18.92.css" #define JS_FILE "swad18.92.js" /* Comprobar si Gbl.AttEvents.AttCodToEdit puede ser sustituido por Gbl.AttEvents.AttCod + Version 18.110.2: Apr 11, 2019 A user can have several roles in the same project. (242527 lines) Version 18.110.1: Apr 11, 2019 Code refactoring in selection of groups and users. (242553 lines) Version 18.110: Apr 11, 2019 Code refactoring in selection of groups and users. Adding multiple users ad once to a project, suggested by Pedro Villar Castro. (242563 lines) diff --git a/swad_file_browser.c b/swad_file_browser.c index a08d5615..967b0660 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -1386,8 +1386,8 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level); static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level); static bool Brw_CheckIfICanModifySharedFileOrFolder (void); static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void); -static bool Brw_CheckIfICanViewProjectDocuments (Prj_RoleInProject_t MyRoleInProject); -static bool Brw_CheckIfICanViewProjectAssessment (Prj_RoleInProject_t MyRoleInProject); +static bool Brw_CheckIfICanViewProjectDocuments (unsigned MyRolesInProject); +static bool Brw_CheckIfICanViewProjectAssessment (unsigned MyRolesInProject); static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void); static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void); static long Brw_GetPublisherOfSubtree (void); @@ -3083,7 +3083,7 @@ static void Brw_ShowFileBrowserProject (void) { extern const char *Hlp_ASSESSMENT_Projects; struct Project Prj; - Prj_RoleInProject_t MyRoleInProject; + unsigned MyRolesInProject; /***** Allocate memory for the project *****/ Prj_AllocMemProject (&Prj); @@ -3101,12 +3101,12 @@ static void Brw_ShowFileBrowserProject (void) Prj_ShowOneUniqueProject (&Prj); /***** Show project file browsers *****/ - MyRoleInProject = Prj_GetMyRoleInProject (Gbl.Prjs.PrjCod); - if (Prj_CheckIfICanViewProjectFiles (MyRoleInProject)) + MyRolesInProject = Prj_GetMyRolesInProject (Gbl.Prjs.PrjCod); + if (Prj_CheckIfICanViewProjectFiles (MyRolesInProject)) { Brw_WriteTopBeforeShowingFileBrowser (); - if (Brw_CheckIfICanViewProjectDocuments (MyRoleInProject)) + if (Brw_CheckIfICanViewProjectDocuments (MyRolesInProject)) { /***** Show the tree with the project documents *****/ Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ; @@ -3114,7 +3114,7 @@ static void Brw_ShowFileBrowserProject (void) Brw_ShowFileBrowser (); } - if (Brw_CheckIfICanViewProjectAssessment (MyRoleInProject)) + if (Brw_CheckIfICanViewProjectAssessment (MyRolesInProject)) { /***** Show the tree with the project assessment *****/ Gbl.FileBrowser.Type = Brw_ADMI_ASS_PRJ; @@ -11619,23 +11619,14 @@ static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void) /******** Check if I have permission to view project documents zone **********/ /*****************************************************************************/ -static bool Brw_CheckIfICanViewProjectDocuments (Prj_RoleInProject_t MyRoleInProject) +static bool Brw_CheckIfICanViewProjectDocuments (unsigned MyRolesInProject) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: case Rol_TCH: - switch (MyRoleInProject) - { - case Prj_ROLE_UNK: // I am not a member - return false; - case Prj_ROLE_STD: - case Prj_ROLE_TUT: - case Prj_ROLE_EVL: - return true; - } - break; + return (MyRolesInProject != 0); // Am I a member? case Rol_SYS_ADM: return true; default: @@ -11648,23 +11639,15 @@ static bool Brw_CheckIfICanViewProjectDocuments (Prj_RoleInProject_t MyRoleInPro /******** Check if I have permission to view project assessment zone *********/ /*****************************************************************************/ -static bool Brw_CheckIfICanViewProjectAssessment (Prj_RoleInProject_t MyRoleInProject) +static bool Brw_CheckIfICanViewProjectAssessment (unsigned MyRolesInProject) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: case Rol_TCH: - switch (MyRoleInProject) - { - case Prj_ROLE_UNK: // I am not a member - case Prj_ROLE_STD: // Students can not view or edit project assessment - return false; - case Prj_ROLE_TUT: - case Prj_ROLE_EVL: - return true; - } - break; + return ((MyRolesInProject & (1 << Prj_ROLE_TUT | // Tutor... + 1 << Prj_ROLE_EVL)) != 0); // ...or evaluator case Rol_SYS_ADM: return true; default: @@ -11683,21 +11666,17 @@ static bool Brw_CheckIfICanViewProjectAssessment (Prj_RoleInProject_t MyRoleInPr static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void) { + unsigned MyRolesInProject; + switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: case Rol_TCH: - switch (Prj_GetMyRoleInProject (Gbl.Prjs.PrjCod)) - { - case Prj_ROLE_UNK: // I am not a member - return false; - case Prj_ROLE_STD: - case Prj_ROLE_TUT: - case Prj_ROLE_EVL: - return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree? - } - break; + MyRolesInProject = Prj_GetMyRolesInProject (Gbl.Prjs.PrjCod); + if (MyRolesInProject) // I am a member + return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree? + return false; case Rol_SYS_ADM: return true; default: @@ -11716,21 +11695,18 @@ static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void) static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void) { + unsigned MyRolesInProject; + switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: case Rol_TCH: - switch (Prj_GetMyRoleInProject (Gbl.Prjs.PrjCod)) - { - case Prj_ROLE_UNK: // I am not a member - case Prj_ROLE_STD: // Students can not view or edit project assessment - return false; - case Prj_ROLE_TUT: - case Prj_ROLE_EVL: - return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree? - } - break; + MyRolesInProject = Prj_GetMyRolesInProject (Gbl.Prjs.PrjCod); + if ((MyRolesInProject & (1 << Prj_ROLE_TUT | // Tutor... + 1 << Prj_ROLE_EVL))) // ...or evaluator + return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree? + return false; case Rol_SYS_ADM: return true; default: diff --git a/swad_global.c b/swad_global.c index be712672..62185a74 100644 --- a/swad_global.c +++ b/swad_global.c @@ -416,7 +416,7 @@ void Gbl_InitializeGlobals (void) Usr_FlushCacheUsrHasAcceptedInCurrentCrs (); Usr_FlushCacheUsrSharesAnyOfMyCrs (); Rol_FlushCacheRoleUsrInCrs (); - Prj_FlushCacheMyRoleInProject (); + Prj_FlushCacheMyRolesInProject (); Grp_FlushCacheIBelongToGrp (); Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs (); Fol_FlushCacheFollow (); diff --git a/swad_global.h b/swad_global.h index 2dc6ce9c..a442edfb 100644 --- a/swad_global.h +++ b/swad_global.h @@ -838,8 +838,8 @@ struct Globals struct { long PrjCod; - Prj_RoleInProject_t RoleInProject; - } MyRoleInProject; + unsigned RolesInProject; + } MyRolesInProject; struct { long UsrCod; diff --git a/swad_project.c b/swad_project.c index b75d3eb2..6762bff0 100644 --- a/swad_project.c +++ b/swad_project.c @@ -923,7 +923,7 @@ static void Prj_ShowOneProject (unsigned NumIndex,struct Project *Prj, extern const char *Txt_Required_knowledge; extern const char *Txt_Required_materials; static unsigned UniqueId = 0; - bool ICanViewProjectFiles = Prj_CheckIfICanViewProjectFiles (Prj_GetMyRoleInProject (Prj->PrjCod)); + bool ICanViewProjectFiles = Prj_CheckIfICanViewProjectFiles (Prj_GetMyRolesInProject (Prj->PrjCod)); /***** Write first row of data of this project *****/ fprintf (Gbl.F.Out,"