Version 17.20.7

This commit is contained in:
Antonio Cañas Vargas 2017-10-07 20:01:34 +02:00
parent 9b0831dceb
commit 041faac9ea
4 changed files with 115 additions and 27 deletions

View File

@ -256,13 +256,14 @@
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 17.20.6 (2017-10-07)" #define Log_PLATFORM_VERSION "SWAD 17.20.7 (2017-10-07)"
#define CSS_FILE "swad17.0.css" #define CSS_FILE "swad17.0.css"
#define JS_FILE "swad17.17.1.js" #define JS_FILE "swad17.17.1.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // 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 // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/* /*
Version 17.20.7: Oct 07, 2017 Only publishers can remove subtrees in project documents. (233105 lines)
Version 17.20.6: Oct 07, 2017 Fixed bug in project documents. (233027 lines) Version 17.20.6: Oct 07, 2017 Fixed bug in project documents. (233027 lines)
Version 17.20.5: Oct 07, 2017 Title of project is now a link to show the project and its documents. (233024 lines) Version 17.20.5: Oct 07, 2017 Title of project is now a link to show the project and its documents. (233024 lines)
Version 17.20.4: Oct 07, 2017 Changes in layout of project. (232972 lines) Version 17.20.4: Oct 07, 2017 Changes in layout of project. (232972 lines)

View File

@ -1675,6 +1675,7 @@ 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_CheckIfICanModifyProjectFileOrFolder (void);
static long Brw_GetPublisherOfSubtree (void); static long Brw_GetPublisherOfSubtree (void);
static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row); static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row);
@ -5515,9 +5516,11 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
Gbl.FileBrowser.Asg.AsgCod = -1L; Gbl.FileBrowser.Asg.AsgCod = -1L;
/***** Get the name of the file to show *****/ /***** Get the name of the file to show *****/
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,Level, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
Level,
Gbl.FileBrowser.FileType, Gbl.FileBrowser.FileType,
FileName,FileNameToShow); FileName,
FileNameToShow);
/***** Start this row *****/ /***** Start this row *****/
fprintf (Gbl.F.Out,"<tr id=\"file_browser_%u_%s\"", fprintf (Gbl.F.Out,"<tr id=\"file_browser_%u_%s\"",
@ -6679,9 +6682,11 @@ void Brw_AskRemFileFromTree (void)
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this file? if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this file?
{ {
/***** Show question and button to remove file/link *****/ /***** Show question and button to remove file/link *****/
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.FileType,Gbl.FileBrowser.Level, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.FileType,
Gbl.FileBrowser.FileType, Gbl.FileBrowser.Level,
Gbl.FileBrowser.FilFolLnkName,FileNameToShow); Gbl.FileBrowser.FileType,
Gbl.FileBrowser.FilFolLnkName,
FileNameToShow);
sprintf (Gbl.Alert.Txt,Txt_Do_you_really_want_to_remove_FILE_OR_LINK_X, sprintf (Gbl.Alert.Txt,Txt_Do_you_really_want_to_remove_FILE_OR_LINK_X,
FileNameToShow); FileNameToShow);
Ale_ShowAlertAndButton (Ale_QUESTION,Gbl.Alert.Txt, Ale_ShowAlertAndButton (Ale_QUESTION,Gbl.Alert.Txt,
@ -7158,9 +7163,10 @@ static void Brw_WriteCurrentClipboard (void)
{ {
// Not the root folder // Not the root folder
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Clipboard.FileBrowser, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Clipboard.FileBrowser,
Gbl.FileBrowser.Clipboard.Level, Gbl.FileBrowser.Clipboard.Level,
Gbl.FileBrowser.Clipboard.FileType, Gbl.FileBrowser.Clipboard.FileType,
Gbl.FileBrowser.Clipboard.FileName,FileNameToShow); Gbl.FileBrowser.Clipboard.FileName,
FileNameToShow);
sprintf (Gbl.Alert.Txt,"%s: %s, %s <strong>%s</strong>.", sprintf (Gbl.Alert.Txt,"%s: %s, %s <strong>%s</strong>.",
Txt_Copy_source,TxtClipboardZone, Txt_Copy_source,TxtClipboardZone,
@ -8384,9 +8390,11 @@ void Brw_ShowFormFileBrowser (void)
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level)) if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level))
{ {
/***** Name of the folder to be shown ****/ /***** Name of the folder to be shown ****/
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,Gbl.FileBrowser.Level, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
Gbl.FileBrowser.FileType, Gbl.FileBrowser.Level,
Gbl.FileBrowser.FilFolLnkName,FileNameToShow); Gbl.FileBrowser.FileType,
Gbl.FileBrowser.FilFolLnkName,
FileNameToShow);
/***** 1. Form to create a new folder *****/ /***** 1. Form to create a new folder *****/
Brw_PutFormToCreateAFolder (FileNameToShow); Brw_PutFormToCreateAFolder (FileNameToShow);
@ -8727,9 +8735,11 @@ void Brw_RecFolderFileBrowser (void)
PathCompleteInTreeIncludingFolder,false,Brw_LICENSE_DEFAULT); PathCompleteInTreeIncludingFolder,false,Brw_LICENSE_DEFAULT);
/* The folder has been created sucessfully */ /* The folder has been created sucessfully */
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,Gbl.FileBrowser.Level, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
Brw_IS_FOLDER, Gbl.FileBrowser.Level,
Gbl.FileBrowser.FilFolLnkName,FileNameToShow); Brw_IS_FOLDER,
Gbl.FileBrowser.FilFolLnkName,
FileNameToShow);
sprintf (Gbl.Alert.Txt,Txt_The_folder_X_has_been_created_inside_the_folder_Y, sprintf (Gbl.Alert.Txt,Txt_The_folder_X_has_been_created_inside_the_folder_Y,
Gbl.FileBrowser.NewFilFolLnkName,FileNameToShow); Gbl.FileBrowser.NewFilFolLnkName,FileNameToShow);
Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt); Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt);
@ -9029,9 +9039,11 @@ static bool Brw_RcvFileInFileBrw (Brw_UploadType_t UploadType)
/* Show message of confirmation */ /* Show message of confirmation */
if (UploadType == Brw_CLASSIC_UPLOAD) if (UploadType == Brw_CLASSIC_UPLOAD)
{ {
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,Gbl.FileBrowser.Level, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
Brw_IS_FOLDER, Gbl.FileBrowser.Level,
Gbl.FileBrowser.FilFolLnkName,FileNameToShow); Brw_IS_FOLDER,
Gbl.FileBrowser.FilFolLnkName,
FileNameToShow);
sprintf (Gbl.Alert.Txt,Txt_The_file_X_has_been_placed_inside_the_folder_Y, sprintf (Gbl.Alert.Txt,Txt_The_file_X_has_been_placed_inside_the_folder_Y,
Gbl.FileBrowser.NewFilFolLnkName, Gbl.FileBrowser.NewFilFolLnkName,
FileNameToShow); FileNameToShow);
@ -9205,9 +9217,11 @@ void Brw_RecLinkFileBrowser (void)
PathCompleteInTreeIncludingFile,false,Brw_LICENSE_DEFAULT); PathCompleteInTreeIncludingFile,false,Brw_LICENSE_DEFAULT);
/* Show message of confirmation */ /* Show message of confirmation */
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,Gbl.FileBrowser.Level, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
Brw_IS_FOLDER, Gbl.FileBrowser.Level,
Gbl.FileBrowser.FilFolLnkName,FileNameToShow); Brw_IS_FOLDER,
Gbl.FileBrowser.FilFolLnkName,
FileNameToShow);
sprintf (Gbl.Alert.Txt,Txt_The_link_X_has_been_placed_inside_the_folder_Y, sprintf (Gbl.Alert.Txt,Txt_The_link_X_has_been_placed_inside_the_folder_Y,
FileName,FileNameToShow); FileName,FileNameToShow);
Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt); Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt);
@ -9356,9 +9370,11 @@ void Brw_SetDocumentAsVisible (void)
Brw_RemoveAffectedClipboards (Gbl.FileBrowser.Type,Gbl.Usrs.Me.UsrDat.UsrCod,Gbl.Usrs.Other.UsrDat.UsrCod); Brw_RemoveAffectedClipboards (Gbl.FileBrowser.Type,Gbl.Usrs.Me.UsrDat.UsrCod,Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Write message of confirmation *****/ /***** Write message of confirmation *****/
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,Gbl.FileBrowser.Level, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
Gbl.FileBrowser.FileType, Gbl.FileBrowser.Level,
Gbl.FileBrowser.FilFolLnkName,FileNameToShow); Gbl.FileBrowser.FileType,
Gbl.FileBrowser.FilFolLnkName,
FileNameToShow);
sprintf (Gbl.Alert.Txt,Txt_FILE_FOLDER_OR_LINK_X_is_now_visible, sprintf (Gbl.Alert.Txt,Txt_FILE_FOLDER_OR_LINK_X_is_now_visible,
FileNameToShow); FileNameToShow);
Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt); Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt);
@ -9389,9 +9405,11 @@ void Brw_SetDocumentAsHidden (void)
Brw_RemoveAffectedClipboards (Gbl.FileBrowser.Type,Gbl.Usrs.Me.UsrDat.UsrCod,Gbl.Usrs.Other.UsrDat.UsrCod); Brw_RemoveAffectedClipboards (Gbl.FileBrowser.Type,Gbl.Usrs.Me.UsrDat.UsrCod,Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Write confirmation message *****/ /***** Write confirmation message *****/
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,Gbl.FileBrowser.Level, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
Gbl.FileBrowser.FileType, Gbl.FileBrowser.Level,
Gbl.FileBrowser.FilFolLnkName,FileNameToShow); Gbl.FileBrowser.FileType,
Gbl.FileBrowser.FilFolLnkName,
FileNameToShow);
sprintf (Gbl.Alert.Txt,Txt_FILE_FOLDER_OR_LINK_X_is_now_hidden,FileNameToShow); sprintf (Gbl.Alert.Txt,Txt_FILE_FOLDER_OR_LINK_X_is_now_hidden,FileNameToShow);
Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt); Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt);
@ -11423,6 +11441,9 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level)
break; break;
} }
return false; return false;
case Brw_ADMI_DOCUM_PRJ:
// Check if I am the publisher of the file/folder
return Brw_CheckIfICanModifyProjectFileOrFolder ();
default: default:
return Brw_FileBrowserIsEditable[Gbl.FileBrowser.Type]; return Brw_FileBrowserIsEditable[Gbl.FileBrowser.Type];
} }
@ -11550,6 +11571,42 @@ static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void)
} }
} }
/*****************************************************************************/
/********** Check if I have permission to modify a file or folder ************/
/********** in the current project documents zone ************/
/*****************************************************************************/
// Returns true if I can remove or rename Gbl.FileBrowser.Priv.FullPathInTree, and false if I have not permission
// I can remove or rename a file if I am the publisher
// I can remove or rename a folder if I am the unique publisher of all the files and folders in the subtree starting there
static bool Brw_CheckIfICanModifyProjectFileOrFolder (void)
{
Prj_RoleInProject_t MyRoleInProject;
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD: // If I am a student or a non-editing teacher...
case Rol_NET: // ...I can modify the file/folder if I am the publisher
case Rol_TCH:
MyRoleInProject = Prj_GetMyRoleInProject (Gbl.CurrentCrs.Prjs.PrjCod);
switch (MyRoleInProject)
{
case Prj_ROLE_UNK: // I am not a member
return false;
case Prj_ROLE_STD:
case Prj_ROLE_TUT:
case Prj_ROLE_EVA:
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree?
}
return false;
case Rol_SYS_ADM:
return true;
default:
return false;
}
}
/*****************************************************************************/ /*****************************************************************************/
/************************ Get the publisher of a subtree *********************/ /************************ Get the publisher of a subtree *********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -1419,6 +1419,34 @@ static unsigned Prj_GetUsrsInPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,
"can not get users in project"); "can not get users in project");
} }
/*****************************************************************************/
/************************** Get my role in a project *************************/
/*****************************************************************************/
Prj_RoleInProject_t Prj_GetMyRoleInProject (long PrjCod)
{
char Query[128];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned UnsignedNum;
Prj_RoleInProject_t RoleInProject = Prj_ROLE_UNK;
/***** Get my role in project from database *****/
sprintf (Query,"SELECT RoleInProject FROM prj_usr WHERE PrjCod=%ld",PrjCod);
if (DB_QuerySELECT (Query,&mysql_res,"can not get my role in project"))
{
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%u",&UnsignedNum) == 1)
if (UnsignedNum < Prj_NUM_ROLES_IN_PROJECT)
RoleInProject = (Prj_RoleInProject_t) UnsignedNum;
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return RoleInProject;
}
/*****************************************************************************/ /*****************************************************************************/
/*** Request another user's ID, @nickname or email to add user to project ****/ /*** Request another user's ID, @nickname or email to add user to project ****/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -115,6 +115,8 @@ void Prj_ShowOneUniqueProject (struct Project *Prj);
void Prj_PrintOneProject (void); void Prj_PrintOneProject (void);
Prj_RoleInProject_t Prj_GetMyRoleInProject (long PrjCod);
void Prj_ReqAddStd (void); void Prj_ReqAddStd (void);
void Prj_ReqAddTut (void); void Prj_ReqAddTut (void);
void Prj_ReqAddEva (void); void Prj_ReqAddEva (void);