Version18.110.2

This commit is contained in:
Antonio Cañas Vargas 2019-04-11 15:24:05 +02:00
parent e0404d18d0
commit 6950880886
6 changed files with 66 additions and 90 deletions

View File

@ -456,12 +456,13 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf 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 CSS_FILE "swad18.92.css"
#define JS_FILE "swad18.92.js" #define JS_FILE "swad18.92.js"
/* /*
Comprobar si Gbl.AttEvents.AttCodToEdit puede ser sustituido por Gbl.AttEvents.AttCod 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.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. 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) Adding multiple users ad once to a project, suggested by Pedro Villar Castro. (242563 lines)

View File

@ -1386,8 +1386,8 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level);
static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level); static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level);
static bool Brw_CheckIfICanModifySharedFileOrFolder (void); static bool Brw_CheckIfICanModifySharedFileOrFolder (void);
static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void); static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void);
static bool Brw_CheckIfICanViewProjectDocuments (Prj_RoleInProject_t MyRoleInProject); static bool Brw_CheckIfICanViewProjectDocuments (unsigned MyRolesInProject);
static bool Brw_CheckIfICanViewProjectAssessment (Prj_RoleInProject_t MyRoleInProject); static bool Brw_CheckIfICanViewProjectAssessment (unsigned MyRolesInProject);
static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void); static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void);
static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void); static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void);
static long Brw_GetPublisherOfSubtree (void); static long Brw_GetPublisherOfSubtree (void);
@ -3083,7 +3083,7 @@ static void Brw_ShowFileBrowserProject (void)
{ {
extern const char *Hlp_ASSESSMENT_Projects; extern const char *Hlp_ASSESSMENT_Projects;
struct Project Prj; struct Project Prj;
Prj_RoleInProject_t MyRoleInProject; unsigned MyRolesInProject;
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
Prj_AllocMemProject (&Prj); Prj_AllocMemProject (&Prj);
@ -3101,12 +3101,12 @@ static void Brw_ShowFileBrowserProject (void)
Prj_ShowOneUniqueProject (&Prj); Prj_ShowOneUniqueProject (&Prj);
/***** Show project file browsers *****/ /***** Show project file browsers *****/
MyRoleInProject = Prj_GetMyRoleInProject (Gbl.Prjs.PrjCod); MyRolesInProject = Prj_GetMyRolesInProject (Gbl.Prjs.PrjCod);
if (Prj_CheckIfICanViewProjectFiles (MyRoleInProject)) if (Prj_CheckIfICanViewProjectFiles (MyRolesInProject))
{ {
Brw_WriteTopBeforeShowingFileBrowser (); Brw_WriteTopBeforeShowingFileBrowser ();
if (Brw_CheckIfICanViewProjectDocuments (MyRoleInProject)) if (Brw_CheckIfICanViewProjectDocuments (MyRolesInProject))
{ {
/***** Show the tree with the project documents *****/ /***** Show the tree with the project documents *****/
Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ; Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ;
@ -3114,7 +3114,7 @@ static void Brw_ShowFileBrowserProject (void)
Brw_ShowFileBrowser (); Brw_ShowFileBrowser ();
} }
if (Brw_CheckIfICanViewProjectAssessment (MyRoleInProject)) if (Brw_CheckIfICanViewProjectAssessment (MyRolesInProject))
{ {
/***** Show the tree with the project assessment *****/ /***** Show the tree with the project assessment *****/
Gbl.FileBrowser.Type = Brw_ADMI_ASS_PRJ; 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 **********/ /******** 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
switch (MyRoleInProject) return (MyRolesInProject != 0); // Am I a member?
{
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;
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return true;
default: default:
@ -11648,23 +11639,15 @@ static bool Brw_CheckIfICanViewProjectDocuments (Prj_RoleInProject_t MyRoleInPro
/******** Check if I have permission to view project assessment zone *********/ /******** 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
switch (MyRoleInProject) return ((MyRolesInProject & (1 << Prj_ROLE_TUT | // Tutor...
{ 1 << Prj_ROLE_EVL)) != 0); // ...or evaluator
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;
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return true;
default: default:
@ -11683,21 +11666,17 @@ static bool Brw_CheckIfICanViewProjectAssessment (Prj_RoleInProject_t MyRoleInPr
static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void) static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void)
{ {
unsigned MyRolesInProject;
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
switch (Prj_GetMyRoleInProject (Gbl.Prjs.PrjCod)) MyRolesInProject = Prj_GetMyRolesInProject (Gbl.Prjs.PrjCod);
{ if (MyRolesInProject) // I am a member
case Prj_ROLE_UNK: // I am not a member return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree?
return false; 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;
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return true;
default: default:
@ -11716,21 +11695,18 @@ static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void)
static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void) static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void)
{ {
unsigned MyRolesInProject;
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
switch (Prj_GetMyRoleInProject (Gbl.Prjs.PrjCod)) MyRolesInProject = Prj_GetMyRolesInProject (Gbl.Prjs.PrjCod);
{ if ((MyRolesInProject & (1 << Prj_ROLE_TUT | // Tutor...
case Prj_ROLE_UNK: // I am not a member 1 << Prj_ROLE_EVL))) // ...or evaluator
case Prj_ROLE_STD: // Students can not view or edit project assessment return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree?
return false; 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;
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return true;
default: default:

View File

@ -416,7 +416,7 @@ void Gbl_InitializeGlobals (void)
Usr_FlushCacheUsrHasAcceptedInCurrentCrs (); Usr_FlushCacheUsrHasAcceptedInCurrentCrs ();
Usr_FlushCacheUsrSharesAnyOfMyCrs (); Usr_FlushCacheUsrSharesAnyOfMyCrs ();
Rol_FlushCacheRoleUsrInCrs (); Rol_FlushCacheRoleUsrInCrs ();
Prj_FlushCacheMyRoleInProject (); Prj_FlushCacheMyRolesInProject ();
Grp_FlushCacheIBelongToGrp (); Grp_FlushCacheIBelongToGrp ();
Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs (); Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs ();
Fol_FlushCacheFollow (); Fol_FlushCacheFollow ();

View File

@ -838,8 +838,8 @@ struct Globals
struct struct
{ {
long PrjCod; long PrjCod;
Prj_RoleInProject_t RoleInProject; unsigned RolesInProject;
} MyRoleInProject; } MyRolesInProject;
struct struct
{ {
long UsrCod; long UsrCod;

View File

@ -923,7 +923,7 @@ static void Prj_ShowOneProject (unsigned NumIndex,struct Project *Prj,
extern const char *Txt_Required_knowledge; extern const char *Txt_Required_knowledge;
extern const char *Txt_Required_materials; extern const char *Txt_Required_materials;
static unsigned UniqueId = 0; 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 *****/ /***** Write first row of data of this project *****/
fprintf (Gbl.F.Out,"<tr>"); fprintf (Gbl.F.Out,"<tr>");
@ -1804,41 +1804,49 @@ static unsigned Prj_GetUsrsInPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,
/************************** Get my role in a project *************************/ /************************** Get my role in a project *************************/
/*****************************************************************************/ /*****************************************************************************/
void Prj_FlushCacheMyRoleInProject (void) void Prj_FlushCacheMyRolesInProject (void)
{ {
Gbl.Cache.MyRoleInProject.PrjCod = -1L; Gbl.Cache.MyRolesInProject.PrjCod = -1L;
Gbl.Cache.MyRoleInProject.RoleInProject = Prj_ROLE_UNK; Gbl.Cache.MyRolesInProject.RolesInProject = 0;
} }
Prj_RoleInProject_t Prj_GetMyRoleInProject (long PrjCod) unsigned Prj_GetMyRolesInProject (long PrjCod)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumRows;
unsigned NumRow;
Prj_RoleInProject_t RoleInProject;
/***** 1. Fast check: trivial cases *****/ /***** 1. Fast check: trivial cases *****/
if (Gbl.Usrs.Me.UsrDat.UsrCod <= 0 || if (Gbl.Usrs.Me.UsrDat.UsrCod <= 0 ||
PrjCod <= 0) PrjCod <= 0)
return Prj_ROLE_UNK; return 0;
/***** 2. Fast check: Is my role in project already calculated *****/ /***** 2. Fast check: Is my role in project already calculated *****/
if (PrjCod == Gbl.Cache.MyRoleInProject.PrjCod) if (PrjCod == Gbl.Cache.MyRolesInProject.PrjCod)
return Gbl.Cache.MyRoleInProject.RoleInProject; return Gbl.Cache.MyRolesInProject.RolesInProject;
/***** 3. Slow check: Get my role in project from database. /***** 3. Slow check: Get my role in project from database.
The result of the query will have one row or none *****/ The result of the query will have one row or none *****/
Gbl.Cache.MyRoleInProject.PrjCod = PrjCod; Gbl.Cache.MyRolesInProject.PrjCod = PrjCod;
Gbl.Cache.MyRoleInProject.RoleInProject = Prj_ROLE_UNK; Gbl.Cache.MyRolesInProject.RolesInProject = 0;
if (DB_QuerySELECT (&mysql_res,"can not get my role in project", NumRows = (unsigned) DB_QuerySELECT (&mysql_res,"can not get my roles in project",
"SELECT RoleInProject FROM prj_usr" "SELECT RoleInProject FROM prj_usr"
" WHERE PrjCod=%ld AND UsrCod=%ld", " WHERE PrjCod=%ld AND UsrCod=%ld",
PrjCod,Gbl.Usrs.Me.UsrDat.UsrCod)) PrjCod,Gbl.Usrs.Me.UsrDat.UsrCod);
for (NumRow = 0;
NumRow < NumRows;
NumRow++)
{ {
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
Gbl.Cache.MyRoleInProject.RoleInProject = Prj_ConvertUnsignedStrToRoleInProject (row[0]); RoleInProject = Prj_ConvertUnsignedStrToRoleInProject (row[0]);
if (RoleInProject != Prj_ROLE_UNK)
Gbl.Cache.MyRolesInProject.RolesInProject |= (1 << RoleInProject);
} }
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);
return Gbl.Cache.MyRoleInProject.RoleInProject; return Gbl.Cache.MyRolesInProject.RolesInProject;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1982,7 +1990,7 @@ static void Prj_AddUsrsToProject (Prj_RoleInProject_t RoleInProject)
/* Flush cache */ /* Flush cache */
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
if (ItsMe) if (ItsMe)
Prj_FlushCacheMyRoleInProject (); Prj_FlushCacheMyRolesInProject ();
/* Show success alert */ /* Show success alert */
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_enroled_as_a_Y_in_the_project, Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_enroled_as_a_Y_in_the_project,
@ -2140,7 +2148,7 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInProject)
/***** Flush cache *****/ /***** Flush cache *****/
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
if (ItsMe) if (ItsMe)
Prj_FlushCacheMyRoleInProject (); Prj_FlushCacheMyRolesInProject ();
/***** Show success alert *****/ /***** Show success alert *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_a_Y_from_the_project_Z, Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_a_Y_from_the_project_Z,
@ -2224,23 +2232,14 @@ static void Prj_PutFormsToRemEditOnePrj (long PrjCod,Prj_HiddenVisibl_t Hidden,
/******************** Can I view files of a given project? *******************/ /******************** Can I view files of a given project? *******************/
/*****************************************************************************/ /*****************************************************************************/
bool Prj_CheckIfICanViewProjectFiles (Prj_RoleInProject_t MyRoleInProject) bool Prj_CheckIfICanViewProjectFiles (unsigned MyRolesInProject)
{ {
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
switch (MyRoleInProject) return (MyRolesInProject != 0); // Am I a member?
{
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;
}
return false;
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return true;
default: default:
@ -2257,7 +2256,7 @@ static bool Prj_CheckIfICanEditProject (long PrjCod)
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_NET: case Rol_NET:
return (Prj_GetMyRoleInProject (PrjCod) == Prj_ROLE_TUT); return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT)) != 0); // Am I tutor?
case Rol_TCH: case Rol_TCH:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return true;
@ -2742,7 +2741,7 @@ void Prj_RemoveProject (void)
Prj.PrjCod,Gbl.Hierarchy.Crs.CrsCod); Prj.PrjCod,Gbl.Hierarchy.Crs.CrsCod);
/***** Flush cache *****/ /***** Flush cache *****/
Prj_FlushCacheMyRoleInProject (); Prj_FlushCacheMyRolesInProject ();
/***** Remove project *****/ /***** Remove project *****/
DB_QueryDELETE ("can not remove project", DB_QueryDELETE ("can not remove project",
@ -3337,7 +3336,7 @@ static void Prj_CreateProject (struct Project *Prj)
Gbl.Usrs.Me.UsrDat.UsrCod); Gbl.Usrs.Me.UsrDat.UsrCod);
/***** Flush cache *****/ /***** Flush cache *****/
Prj_FlushCacheMyRoleInProject (); Prj_FlushCacheMyRolesInProject ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -3394,7 +3393,7 @@ void Prj_RemoveCrsProjects (long CrsCod)
CrsCod); CrsCod);
/***** Flush cache *****/ /***** Flush cache *****/
Prj_FlushCacheMyRoleInProject (); Prj_FlushCacheMyRolesInProject ();
/***** Remove projects *****/ /***** Remove projects *****/
DB_QueryDELETE ("can not remove all the projects of a course", DB_QueryDELETE ("can not remove all the projects of a course",
@ -3418,7 +3417,7 @@ void Prj_RemoveUsrFromProjects (long UsrCod)
/***** Flush cache *****/ /***** Flush cache *****/
ItsMe = Usr_ItsMe (UsrCod); ItsMe = Usr_ItsMe (UsrCod);
if (ItsMe) if (ItsMe)
Prj_FlushCacheMyRoleInProject (); Prj_FlushCacheMyRolesInProject ();
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -151,8 +151,8 @@ void Prj_ShowOneUniqueProject (struct Project *Prj);
void Prj_PrintOneProject (void); void Prj_PrintOneProject (void);
void Prj_FlushCacheMyRoleInProject (void); void Prj_FlushCacheMyRolesInProject (void);
Prj_RoleInProject_t Prj_GetMyRoleInProject (long PrjCod); Prj_RoleInProject_t Prj_GetMyRolesInProject (long PrjCod);
void Prj_ReqAddStds (void); void Prj_ReqAddStds (void);
void Prj_ReqAddTuts (void); void Prj_ReqAddTuts (void);
@ -172,7 +172,7 @@ void Prj_RemEvl (void);
void Prj_PutHiddenParamPrjOrder (void); void Prj_PutHiddenParamPrjOrder (void);
bool Prj_CheckIfICanViewProjectFiles (Prj_RoleInProject_t MyRoleInProject); bool Prj_CheckIfICanViewProjectFiles (unsigned MyRolesInProject);
void Prj_RequestCreatePrj (void); void Prj_RequestCreatePrj (void);
void Prj_RequestEditPrj (void); void Prj_RequestEditPrj (void);