diff --git a/swad_changelog.h b/swad_changelog.h index 5ee1df0d3..12b461b3b 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -248,19 +248,20 @@ // TODO: "Administrar varios profesores no editores" -> debería poder hacerlo un profesor (Perico) -// TODO: Copy icon/link64x64.gif to public directory in swad.ugr.es and openswad.org +// TODO: Mover PROFILE.Briefcase a FILES.Briefcase en la ayuda de GitHub (aquí ya está cambiado) /*****************************************************************************/ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 17.18 (2017-10-06)" +#define Log_PLATFORM_VERSION "SWAD 17.19 (2017-10-06)" #define CSS_FILE "swad17.0.css" #define JS_FILE "swad17.17.1.js" // 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 /* + Version 17.19: Oct 06, 2017 New file browser for project documents. Not finished. (232781 lines) Version 17.18: Oct 06, 2017 New view in projects for project file browser. (232547 lines) 1 change necessary in database: INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1697','es','N','Editar archivos proyecto'); diff --git a/swad_config.h b/swad_config.h index a7c3a267e..d93d57123 100644 --- a/swad_config.h +++ b/swad_config.h @@ -336,9 +336,15 @@ /* Folders for courses, inside public and private swad directories */ #define Cfg_FOLDER_CRS "crs" // If not exists, it should be created during installation inside swad private and public directory! +/* Folders for groups, inside public and private swad directories */ +#define Cfg_FOLDER_GRP "grp" // Created automatically the first time it is accessed + /* Folder for users, inside private swad directory */ #define Cfg_FOLDER_USR "usr" // Created automatically the first time it is accessed +/* Folders for projects, inside public and private swad directories */ +#define Cfg_FOLDER_PRJ "prj" // Created automatically the first time it is accessed + /* Folder for temporary HTML output of this CGI, inside private swad directory */ #define Cfg_FOLDER_OUT "out" // Created automatically the first time it is accessed diff --git a/swad_file_browser.c b/swad_file_browser.c index bcc480b93..8ecf77f50 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -130,6 +130,7 @@ const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER] = Brw_ADMI_SHARE_INS, // Brw_ADMI_SHARE_INS = 24 Brw_ADMI_TEACH_CRS, // Brw_ADMI_TEACH_CRS = 25 Brw_ADMI_TEACH_GRP, // Brw_ADMI_TEACH_GRP = 26 + Brw_ADMI_DOCUM_PRJ, // Brw_ADMI_DOCUM_PRJ = 27 }; // Browsers viewable shown in search for documents const Brw_FileBrowser_t Brw_FileBrowserForFoundDocs[Brw_NUM_TYPES_FILE_BROWSER] = @@ -161,6 +162,7 @@ const Brw_FileBrowser_t Brw_FileBrowserForFoundDocs[Brw_NUM_TYPES_FILE_BROWSER] Brw_ADMI_SHARE_INS, // Brw_ADMI_SHARE_INS = 24 Brw_ADMI_TEACH_CRS, // Brw_ADMI_TEACH_CRS = 25 Brw_ADMI_TEACH_GRP, // Brw_ADMI_TEACH_GRP = 26 + Brw_ADMI_DOCUM_PRJ, // Brw_ADMI_DOCUM_PRJ = 27 }; // Browsers types for database "clipboard" table static const Brw_FileBrowser_t Brw_FileBrowserForDB_clipboard[Brw_NUM_TYPES_FILE_BROWSER] = @@ -192,6 +194,7 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_clipboard[Brw_NUM_TYPES_FILE Brw_ADMI_SHARE_INS, // Brw_ADMI_SHARE_INS = 24 Brw_ADMI_TEACH_CRS, // Brw_ADMI_TEACH_CRS = 25 Brw_ADMI_TEACH_GRP, // Brw_ADMI_TEACH_GRP = 26 + Brw_ADMI_DOCUM_PRJ, // Brw_ADMI_DOCUM_PRJ = 27 }; // Browsers types for database "expanded_folders" table static const Brw_FileBrowser_t Brw_FileBrowserForDB_expanded_folders[Brw_NUM_TYPES_FILE_BROWSER] = @@ -223,6 +226,7 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_expanded_folders[Brw_NUM_TYP Brw_ADMI_SHARE_INS, // Brw_ADMI_SHARE_INS = 24 Brw_ADMI_TEACH_CRS, // Brw_ADMI_TEACH_CRS = 25 Brw_ADMI_TEACH_GRP, // Brw_ADMI_TEACH_GRP = 26 + Brw_ADMI_DOCUM_PRJ, // Brw_ADMI_DOCUM_PRJ = 27 }; // Browsers types for database "file_browser_last" table // Assignments and works are stored as one in file_browser_last... @@ -256,6 +260,7 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_file_browser_last[Brw_NUM_TY Brw_ADMI_SHARE_INS, // Brw_ADMI_SHARE_INS = 24 Brw_ADMI_TEACH_CRS, // Brw_ADMI_TEACH_CRS = 25 Brw_ADMI_TEACH_GRP, // Brw_ADMI_TEACH_GRP = 26 + Brw_ADMI_DOCUM_PRJ, // Brw_ADMI_DOCUM_PRJ = 27 }; // Internal names of root folders @@ -288,6 +293,7 @@ const char *Brw_RootFolderInternalNames[Brw_NUM_TYPES_FILE_BROWSER] = Brw_INTERNAL_NAME_ROOT_FOLDER_SHARED_FILES, // Brw_ADMI_SHARE_INS Brw_INTERNAL_NAME_ROOT_FOLDER_TEACHERS, // Brw_ADMI_TEACH_CRS Brw_INTERNAL_NAME_ROOT_FOLDER_TEACHERS, // Brw_ADMI_TEACH_GRP + Brw_INTERNAL_NAME_ROOT_FOLDER_PROJECTS, // Brw_ADMI_DOCUM_PRJ }; static const bool Brw_FileBrowserIsEditable[Brw_NUM_TYPES_FILE_BROWSER] = @@ -319,6 +325,7 @@ static const bool Brw_FileBrowserIsEditable[Brw_NUM_TYPES_FILE_BROWSER] = true, // Brw_ADMI_SHARE_INS true, // Brw_ADMI_TEACH_CRS true, // Brw_ADMI_TEACH_GRP + true, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActSeeAdm[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -349,6 +356,7 @@ static const Act_Action_t Brw_ActSeeAdm[Brw_NUM_TYPES_FILE_BROWSER] = ActAdmShaIns, // Brw_ADMI_SHARE_INS ActAdmTchCrs, // Brw_ADMI_TEACH_CRS ActAdmTchGrp, // Brw_ADMI_TEACH_GRP + ActAdmDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActFromSeeToAdm[Brw_NUM_TYPES_FILE_BROWSER] = @@ -380,6 +388,7 @@ static const Act_Action_t Brw_ActFromSeeToAdm[Brw_NUM_TYPES_FILE_BROWSER] = ActUnk, // Brw_ADMI_SHARE_INS ActUnk, // Brw_ADMI_TEACH_CRS ActUnk, // Brw_ADMI_TEACH_GRP + ActUnk, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActFromAdmToSee[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -410,6 +419,7 @@ static const Act_Action_t Brw_ActFromAdmToSee[Brw_NUM_TYPES_FILE_BROWSER] = ActUnk, // Brw_ADMI_SHARE_INS ActUnk, // Brw_ADMI_TEACH_CRS ActUnk, // Brw_ADMI_TEACH_GRP + ActUnk, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActChgZone[Brw_NUM_TYPES_FILE_BROWSER] = @@ -441,6 +451,7 @@ static const Act_Action_t Brw_ActChgZone[Brw_NUM_TYPES_FILE_BROWSER] = ActUnk, // Brw_ADMI_SHARE_INS ActChgToAdmTch, // Brw_ADMI_TEACH_CRS ActChgToAdmTch, // Brw_ADMI_TEACH_GRP + ActUnk, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActShow[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -471,6 +482,7 @@ static const Act_Action_t Brw_ActShow[Brw_NUM_TYPES_FILE_BROWSER] = ActUnk, // Brw_ADMI_SHARE_INS ActUnk, // Brw_ADMI_TEACH_CRS ActUnk, // Brw_ADMI_TEACH_GRP + ActUnk, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActHide[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -501,6 +513,7 @@ static const Act_Action_t Brw_ActHide[Brw_NUM_TYPES_FILE_BROWSER] = ActUnk, // Brw_ADMI_SHARE_INS ActUnk, // Brw_ADMI_TEACH_CRS ActUnk, // Brw_ADMI_TEACH_GRP + ActUnk, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActReqDatFile[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -531,6 +544,7 @@ static const Act_Action_t Brw_ActReqDatFile[Brw_NUM_TYPES_FILE_BROWSER] = ActReqDatShaIns, // Brw_ADMI_SHARE_INS ActReqDatTchCrs, // Brw_ADMI_TEACH_CRS ActReqDatTchGrp, // Brw_ADMI_TEACH_GRP + ActReqDatDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActDowFile[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -561,6 +575,7 @@ static const Act_Action_t Brw_ActDowFile[Brw_NUM_TYPES_FILE_BROWSER] = ActDowShaIns, // Brw_ADMI_SHARE_INS ActDowTchCrs, // Brw_ADMI_TEACH_CRS ActDowTchGrp, // Brw_ADMI_TEACH_GRP + ActDowDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActAskRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -591,6 +606,7 @@ static const Act_Action_t Brw_ActAskRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] = ActReqRemFilShaIns, // Brw_ADMI_SHARE_INS ActReqRemFilTchCrs, // Brw_ADMI_TEACH_CRS ActReqRemFilTchGrp, // Brw_ADMI_TEACH_GRP + ActReqRemFilDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -621,6 +637,7 @@ static const Act_Action_t Brw_ActRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] = ActRemFilShaIns, // Brw_ADMI_SHARE_INS ActRemFilTchCrs, // Brw_ADMI_TEACH_CRS ActRemFilTchGrp, // Brw_ADMI_TEACH_GRP + ActRemFilDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActRemoveFolder[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -651,6 +668,7 @@ static const Act_Action_t Brw_ActRemoveFolder[Brw_NUM_TYPES_FILE_BROWSER] = ActRemFolShaIns, // Brw_ADMI_SHARE_INS ActRemFolTchCrs, // Brw_ADMI_TEACH_CRS ActRemFolTchGrp, // Brw_ADMI_TEACH_GRP + ActRemFolDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActRemoveFolderNotEmpty[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -681,6 +699,7 @@ static const Act_Action_t Brw_ActRemoveFolderNotEmpty[Brw_NUM_TYPES_FILE_BROWSER ActRemTreShaIns, // Brw_ADMI_SHARE_INS ActRemTreTchCrs, // Brw_ADMI_TEACH_CRS ActRemTreTchGrp, // Brw_ADMI_TEACH_GRP + ActRemTreDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActCopy[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -711,6 +730,7 @@ static const Act_Action_t Brw_ActCopy[Brw_NUM_TYPES_FILE_BROWSER] = ActCopShaIns, // Brw_ADMI_SHARE_INS ActCopTchCrs, // Brw_ADMI_TEACH_CRS ActCopTchGrp, // Brw_ADMI_TEACH_GRP + ActCopDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActPaste[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -741,6 +761,7 @@ static const Act_Action_t Brw_ActPaste[Brw_NUM_TYPES_FILE_BROWSER] = ActPasShaIns, // Brw_ADMI_SHARE_INS ActPasTchCrs, // Brw_ADMI_TEACH_CRS ActPasTchGrp, // Brw_ADMI_TEACH_GRP + ActPasDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActFormCreate[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -771,6 +792,7 @@ static const Act_Action_t Brw_ActFormCreate[Brw_NUM_TYPES_FILE_BROWSER] = ActFrmCreShaIns, // Brw_ADMI_SHARE_INS ActFrmCreTchCrs, // Brw_ADMI_TEACH_CRS ActFrmCreTchGrp, // Brw_ADMI_TEACH_GRP + ActFrmCreDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActCreateFolder[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -801,6 +823,7 @@ static const Act_Action_t Brw_ActCreateFolder[Brw_NUM_TYPES_FILE_BROWSER] = ActCreFolShaIns, // Brw_ADMI_SHARE_INS ActCreFolTchCrs, // Brw_ADMI_TEACH_CRS ActCreFolTchGrp, // Brw_ADMI_TEACH_GRP + ActCreFolDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActCreateLink[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -831,6 +854,7 @@ static const Act_Action_t Brw_ActCreateLink[Brw_NUM_TYPES_FILE_BROWSER] = ActCreLnkShaIns, // Brw_ADMI_SHARE_INS ActCreLnkTchCrs, // Brw_ADMI_TEACH_CRS ActCreLnkTchGrp, // Brw_ADMI_TEACH_GRP + ActCreLnkDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActRenameFolder[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -861,6 +885,7 @@ static const Act_Action_t Brw_ActRenameFolder[Brw_NUM_TYPES_FILE_BROWSER] = ActRenFolShaIns, // Brw_ADMI_SHARE_INS ActRenFolTchCrs, // Brw_ADMI_TEACH_CRS ActRenFolTchGrp, // Brw_ADMI_TEACH_GRP + ActRenFolDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActUploadFileDropzone[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -891,6 +916,7 @@ static const Act_Action_t Brw_ActUploadFileDropzone[Brw_NUM_TYPES_FILE_BROWSER] ActRcvFilShaInsDZ, // Brw_ADMI_SHARE_INS ActRcvFilTchCrsDZ, // Brw_ADMI_TEACH_CRS ActRcvFilTchGrpDZ, // Brw_ADMI_TEACH_GRP + ActRcvFilDocPrjDZ, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActUploadFileClassic[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -921,6 +947,7 @@ static const Act_Action_t Brw_ActUploadFileClassic[Brw_NUM_TYPES_FILE_BROWSER] = ActRcvFilShaInsCla, // Brw_ADMI_SHARE_INS ActRcvFilTchCrsCla, // Brw_ADMI_TEACH_CRS ActRcvFilTchGrpCla, // Brw_ADMI_TEACH_GRP + ActRcvFilDocPrjCla, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActRefreshAfterUploadFiles[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -951,6 +978,7 @@ static const Act_Action_t Brw_ActRefreshAfterUploadFiles[Brw_NUM_TYPES_FILE_BROW ActAdmShaIns, // Brw_ADMI_SHARE_INS ActAdmTchCrs, // Brw_ADMI_TEACH_CRS ActAdmTchGrp, // Brw_ADMI_TEACH_GRP + ActAdmDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActExpandFolder[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -981,6 +1009,7 @@ static const Act_Action_t Brw_ActExpandFolder[Brw_NUM_TYPES_FILE_BROWSER] = ActExpShaIns, // Brw_ADMI_SHARE_INS ActExpTchCrs, // Brw_ADMI_TEACH_CRS ActExpTchGrp, // Brw_ADMI_TEACH_GRP + ActExpDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActContractFolder[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -1011,6 +1040,7 @@ static const Act_Action_t Brw_ActContractFolder[Brw_NUM_TYPES_FILE_BROWSER] = ActConShaIns, // Brw_ADMI_SHARE_INS ActConTchCrs, // Brw_ADMI_TEACH_CRS ActConTchGrp, // Brw_ADMI_TEACH_GRP + ActConDocPrj, // Brw_ADMI_DOCUM_PRJ }; static const Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] = { @@ -1041,6 +1071,7 @@ static const Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] = ActChgDatShaIns, // Brw_ADMI_SHARE_INS ActChgDatTchCrs, // Brw_ADMI_TEACH_CRS ActChgDatTchGrp, // Brw_ADMI_TEACH_GRP + ActChgDatDocPrj, // Brw_ADMI_DOCUM_PRJ }; /* All quotas must be multiple of 1 GiB (Gibibyte)*/ @@ -1103,6 +1134,10 @@ static const Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] = #define Brw_MAX_FILES_WORKS_PER_STD 500 #define Brw_MAX_FOLDS_WORKS_PER_STD 50 +#define Brw_MAX_QUOTA_PRJ ( 2ULL*Brw_GiB) +#define Brw_MAX_FILES_PRJ 500 +#define Brw_MAX_FOLDS_PRJ 50 + #define Brw_MAX_QUOTA_MARKS_CRS ( 1ULL*Brw_GiB) #define Brw_MAX_FILES_MARKS_CRS 500 #define Brw_MAX_FOLDS_MARKS_CRS 50 @@ -2113,6 +2148,29 @@ void Brw_GetParAndInitFileBrowser (void) Gbl.FileBrowser.Type = Brw_ADMI_WORKS_CRS; break; + /***** Documents in project *****/ + case ActAdmDocPrj: + case ActReqRemFilDocPrj: + case ActRemFilDocPrj: + case ActRemFolDocPrj: + case ActCopDocPrj: + case ActPasDocPrj: + case ActRemTreDocPrj: + case ActFrmCreDocPrj: + case ActCreFolDocPrj: + case ActCreLnkDocPrj: + case ActRenFolDocPrj: + case ActRcvFilDocPrjDZ: + case ActRcvFilDocPrjCla: + case ActExpDocPrj: + case ActConDocPrj: + case ActZIPDocPrj: + case ActReqDatDocPrj: + case ActChgDatDocPrj: + case ActDowDocPrj: + Gbl.FileBrowser.Type = Brw_ADMI_DOCUM_PRJ; + break; + /***** Marks *****/ case ActSeeAdmMrk: // Access to a marks zone from menu /* Set file browser type acording to last group accessed */ @@ -2658,26 +2716,26 @@ static void Brw_SetPathFileBrowser (void) case Brw_ADMI_SHARE_GRP: case Brw_SHOW_MARKS_GRP: case Brw_ADMI_MARKS_GRP: - sprintf (Path,"%s/grp", - Gbl.CurrentCrs.PathPriv); + sprintf (Path,"%s/%s", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_GRP); Fil_CreateDirIfNotExists (Path); - sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/grp/%ld", - Gbl.CurrentCrs.PathPriv, + sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%ld", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_GRP, Gbl.CurrentCrs.Grps.GrpCod); break; case Brw_ADMI_ASSIG_USR: case Brw_ADMI_WORKS_USR: - sprintf (Path,"%s/usr", - Gbl.CurrentCrs.PathPriv); + sprintf (Path,"%s/%s", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR); Fil_CreateDirIfNotExists (Path); - sprintf (Path,"%s/usr/%02u", - Gbl.CurrentCrs.PathPriv, + sprintf (Path,"%s/%s/%02u", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR, (unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100)); Fil_CreateDirIfNotExists (Path); - sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/usr/%02u/%ld", - Gbl.CurrentCrs.PathPriv, + sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%02u/%ld", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR, (unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100), Gbl.Usrs.Me.UsrDat.UsrCod); break; @@ -2685,20 +2743,29 @@ static void Brw_SetPathFileBrowser (void) case Brw_ADMI_WORKS_CRS: if (Gbl.Usrs.Other.UsrDat.UsrCod > 0) { - sprintf (Path,"%s/usr", - Gbl.CurrentCrs.PathPriv); + sprintf (Path,"%s/%s", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR); Fil_CreateDirIfNotExists (Path); - sprintf (Path,"%s/usr/%02u", - Gbl.CurrentCrs.PathPriv, + sprintf (Path,"%s/%s/%02u", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR, (unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100)); Fil_CreateDirIfNotExists (Path); - sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/usr/%02u/%ld", - Gbl.CurrentCrs.PathPriv, + sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%02u/%ld", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_USR, (unsigned) (Gbl.Usrs.Other.UsrDat.UsrCod % 100), Gbl.Usrs.Other.UsrDat.UsrCod); } break; + case Brw_ADMI_DOCUM_PRJ: + sprintf (Path,"%s/%s", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ); + Fil_CreateDirIfNotExists (Path); + + sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%ld", + Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ, + Gbl.CurrentCrs.Grps.GrpCod); + break; case Brw_ADMI_BRIEF_USR: Str_Copy (Gbl.FileBrowser.Priv.PathAboveRootFolder, Gbl.Usrs.Me.PathDir, @@ -3072,18 +3139,6 @@ static void Brw_SetMaxQuota (void) Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_SHARE_GRP; Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_SHARE_GRP; break; - case Brw_SHOW_MARKS_CRS: - case Brw_ADMI_MARKS_CRS: - Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_MARKS_CRS; - Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_MARKS_CRS; - Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_MARKS_CRS; - break; - case Brw_SHOW_MARKS_GRP: - case Brw_ADMI_MARKS_GRP: - Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_MARKS_GRP; - Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_MARKS_GRP; - Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_MARKS_GRP; - break; case Brw_ADMI_ASSIG_USR: case Brw_ADMI_ASSIG_CRS: Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_ASSIG_PER_STD; @@ -3096,6 +3151,23 @@ static void Brw_SetMaxQuota (void) Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_WORKS_PER_STD; Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_WORKS_PER_STD; break; + case Brw_ADMI_DOCUM_PRJ: + Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_PRJ; + Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_PRJ; + Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_PRJ; + break; + case Brw_SHOW_MARKS_CRS: + case Brw_ADMI_MARKS_CRS: + Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_MARKS_CRS; + Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_MARKS_CRS; + Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_MARKS_CRS; + break; + case Brw_SHOW_MARKS_GRP: + case Brw_ADMI_MARKS_GRP: + Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_MARKS_GRP; + Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_MARKS_GRP; + Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_MARKS_GRP; + break; case Brw_ADMI_BRIEF_USR: Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_BRIEF[Gbl.Usrs.Me.Role.Max]; Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_BRIEF; @@ -3570,7 +3642,8 @@ static void Brw_ShowFileBrowser (void) extern const char *Hlp_FILES_Homework_for_students; extern const char *Hlp_FILES_Homework_for_teachers; extern const char *Hlp_FILES_Marks; - extern const char *Hlp_PROFILE_Briefcase; + extern const char *Hlp_FILES_Briefcase; + extern const char *Hlp_ASSESSMENT_Projects; extern const char *Txt_Documents_area; extern const char *Txt_Documents_management_area; @@ -3581,6 +3654,7 @@ static void Brw_ShowFileBrowser (void) extern const char *Txt_Assignments_area; extern const char *Txt_Works_area; extern const char *Txt_Temporary_private_storage_area; + extern const char *Txt_Project_documents; const char *Brw_TitleOfFileBrowser[Brw_NUM_TYPES_FILE_BROWSER]; const char *Brw_HelpOfFileBrowser[Brw_NUM_TYPES_FILE_BROWSER]; @@ -3617,35 +3691,37 @@ static void Brw_ShowFileBrowser (void) Brw_TitleOfFileBrowser[Brw_ADMI_SHARE_INS] = Txt_Shared_files_area; // Brw_ADMI_SHARE_INS Brw_TitleOfFileBrowser[Brw_ADMI_TEACH_CRS] = Txt_Teachers_files_area; // Brw_ADMI_TEACH_CRS Brw_TitleOfFileBrowser[Brw_ADMI_TEACH_GRP] = Txt_Teachers_files_area; // Brw_ADMI_TEACH_GRP + Brw_TitleOfFileBrowser[Brw_ADMI_DOCUM_PRJ] = Txt_Project_documents; // Brw_ADMI_DOCUM_PRJ /***** Set help link of file browser *****/ Brw_HelpOfFileBrowser[Brw_UNKNOWN ] = NULL; // Brw_UNKNOWN Brw_HelpOfFileBrowser[Brw_SHOW_DOCUM_CRS] = Hlp_FILES_Documents; // Brw_SHOW_DOCUM_CRS - Brw_HelpOfFileBrowser[Brw_SHOW_MARKS_CRS] = Hlp_FILES_Marks; // Brw_SHOW_MARKS_CRS + Brw_HelpOfFileBrowser[Brw_SHOW_MARKS_CRS] = Hlp_FILES_Marks; // Brw_SHOW_MARKS_CRS Brw_HelpOfFileBrowser[Brw_ADMI_DOCUM_CRS] = Hlp_FILES_Documents; // Brw_ADMI_DOCUM_CRS Brw_HelpOfFileBrowser[Brw_ADMI_SHARE_CRS] = Hlp_FILES_Shared; // Brw_ADMI_SHARE_CRS Brw_HelpOfFileBrowser[Brw_ADMI_SHARE_GRP] = Hlp_FILES_Shared; // Brw_ADMI_SHARE_GRP Brw_HelpOfFileBrowser[Brw_ADMI_WORKS_USR] = Hlp_FILES_Homework_for_students; // Brw_ADMI_WORKS_USR Brw_HelpOfFileBrowser[Brw_ADMI_WORKS_CRS] = Hlp_FILES_Homework_for_teachers; // Brw_ADMI_WORKS_CRS - Brw_HelpOfFileBrowser[Brw_ADMI_MARKS_CRS] = Hlp_FILES_Marks; // Brw_ADMI_MARKS_CRS - Brw_HelpOfFileBrowser[Brw_ADMI_BRIEF_USR] = Hlp_PROFILE_Briefcase; // Brw_ADMI_BRIEF_USR + Brw_HelpOfFileBrowser[Brw_ADMI_MARKS_CRS] = Hlp_FILES_Marks; // Brw_ADMI_MARKS_CRS + Brw_HelpOfFileBrowser[Brw_ADMI_BRIEF_USR] = Hlp_FILES_Briefcase; // Brw_ADMI_BRIEF_USR Brw_HelpOfFileBrowser[Brw_SHOW_DOCUM_GRP] = Hlp_FILES_Documents; // Brw_SHOW_DOCUM_GRP Brw_HelpOfFileBrowser[Brw_ADMI_DOCUM_GRP] = Hlp_FILES_Documents; // Brw_ADMI_DOCUM_GRP - Brw_HelpOfFileBrowser[Brw_SHOW_MARKS_GRP] = Hlp_FILES_Marks; // Brw_SHOW_MARKS_GRP - Brw_HelpOfFileBrowser[Brw_ADMI_MARKS_GRP] = Hlp_FILES_Marks; // Brw_ADMI_MARKS_GRP + Brw_HelpOfFileBrowser[Brw_SHOW_MARKS_GRP] = Hlp_FILES_Marks; // Brw_SHOW_MARKS_GRP + Brw_HelpOfFileBrowser[Brw_ADMI_MARKS_GRP] = Hlp_FILES_Marks; // Brw_ADMI_MARKS_GRP Brw_HelpOfFileBrowser[Brw_ADMI_ASSIG_USR] = Hlp_FILES_Homework_for_students; // Brw_ADMI_ASSIG_USR Brw_HelpOfFileBrowser[Brw_ADMI_ASSIG_CRS] = Hlp_FILES_Homework_for_teachers; // Brw_ADMI_ASSIG_CRS Brw_HelpOfFileBrowser[Brw_SHOW_DOCUM_DEG] = Hlp_FILES_Documents; // Brw_SHOW_DOCUM_DEG Brw_HelpOfFileBrowser[Brw_ADMI_DOCUM_DEG] = Hlp_FILES_Documents; // Brw_ADMI_DOCUM_DEG Brw_HelpOfFileBrowser[Brw_SHOW_DOCUM_CTR] = Hlp_FILES_Documents; // Brw_SHOW_DOCUM_CTR Brw_HelpOfFileBrowser[Brw_ADMI_DOCUM_CTR] = Hlp_FILES_Documents; // Brw_ADMI_DOCUM_CTR - Brw_HelpOfFileBrowser[Brw_SHOW_DOCUM_INS] = Hlp_FILES_Documents; // Brw_SHOW_DOCUM_INS - Brw_HelpOfFileBrowser[Brw_ADMI_DOCUM_INS] = Hlp_FILES_Documents; // Brw_ADMI_DOCUM_INS + Brw_HelpOfFileBrowser[Brw_SHOW_DOCUM_INS] = Hlp_FILES_Documents; // Brw_SHOW_DOCUM_INS + Brw_HelpOfFileBrowser[Brw_ADMI_DOCUM_INS] = Hlp_FILES_Documents; // Brw_ADMI_DOCUM_INS Brw_HelpOfFileBrowser[Brw_ADMI_SHARE_DEG] = Hlp_FILES_Shared; // Brw_ADMI_SHARE_DEG Brw_HelpOfFileBrowser[Brw_ADMI_SHARE_CTR] = Hlp_FILES_Shared; // Brw_ADMI_SHARE_CTR Brw_HelpOfFileBrowser[Brw_ADMI_SHARE_INS] = Hlp_FILES_Shared; // Brw_ADMI_SHARE_INS Brw_HelpOfFileBrowser[Brw_ADMI_TEACH_CRS] = Hlp_FILES_Private; // Brw_ADMI_TEACH_CRS Brw_HelpOfFileBrowser[Brw_ADMI_TEACH_GRP] = Hlp_FILES_Private; // Brw_ADMI_TEACH_GRP + Brw_HelpOfFileBrowser[Brw_ADMI_DOCUM_PRJ] = Hlp_ASSESSMENT_Projects; // Brw_ADMI_DOCUM_PRJ /***** Set contextual icon in box *****/ Gbl.FileBrowser.IconViewEdit = Brw_ICON_NONE; @@ -3964,6 +4040,7 @@ static void Brw_WriteSubtitleOfFileBrowser (void) extern const char *Txt_accessible_for_reading_and_writing_by_you_and_the_teachers_of_the_course; extern const char *Txt_accessible_only_for_reading_by_you_and_the_teachers_of_the_course; extern const char *Txt_the_marks_of_a_student_chosen_at_random_; + extern const char *Txt_accessible_for_reading_and_writing_by_project_members; extern const char *Txt_nobody_else_can_access_this_content; char Subtitle[1024]; @@ -4086,6 +4163,10 @@ static void Brw_WriteSubtitleOfFileBrowser (void) sprintf (Subtitle,"%s", Gbl.Usrs.Other.UsrDat.FullName); break; + case Brw_ADMI_DOCUM_PRJ: + sprintf (Subtitle,"(%s)", + Txt_accessible_for_reading_and_writing_by_project_members); + break; case Brw_ADMI_BRIEF_USR: sprintf (Subtitle,"%s
(%s)", Gbl.Usrs.Me.UsrDat.FullName, @@ -4943,6 +5024,9 @@ static void Brw_GetAndUpdateDateLastAccFileBrowser (void) case Brw_ADMI_MARKS_GRP: Cod = Gbl.CurrentCrs.Grps.GrpCod; break; + case Brw_ADMI_DOCUM_PRJ: + Cod = Gbl.CurrentCrs.Prjs.PrjCod; + break; case Brw_ADMI_BRIEF_USR: Cod = -1L; break; @@ -6763,6 +6847,7 @@ static void Brw_WriteCurrentClipboard (void) extern const char *Txt_shared_files_area; extern const char *Txt_assignments_area; extern const char *Txt_works_area; + extern const char *Txt_project_documents; extern const char *Txt_marks_management_area; extern const char *Txt_temporary_private_storage_area; extern const char *Txt_institution; @@ -6770,6 +6855,7 @@ static void Brw_WriteCurrentClipboard (void) extern const char *Txt_degree; extern const char *Txt_course; extern const char *Txt_group; + extern const char *Txt_project; extern const char *Txt_user[Usr_NUM_SEXS]; extern const char *Txt_file_folder; extern const char *Txt_file; @@ -6781,6 +6867,7 @@ static void Brw_WriteCurrentClipboard (void) struct Degree Deg; struct Course Crs; struct GroupData GrpDat; + struct Project Prj; struct UsrData UsrDat; char TxtClipboardZone[1024]; char FileNameToShow[NAME_MAX + 1]; @@ -6927,6 +7014,16 @@ static void Brw_WriteCurrentClipboard (void) Txt_user[UsrDat.Sex],UsrDat.FullName); Usr_UsrDataDestructor (&UsrDat); break; + case Brw_ADMI_DOCUM_PRJ: + Prj.PrjCod = Gbl.FileBrowser.Clipboard.Cod; + Prj_GetDataOfProjectByCod (&Prj); + Crs.CrsCod = Prj.CrsCod; + Crs_GetDataOfCourseByCod (&Crs); + sprintf (TxtClipboardZone,"%s, %s %s, %s %s", + Txt_project_documents, + Txt_course,Crs.ShrtName, + Txt_project,Prj.Title); + break; case Brw_ADMI_MARKS_CRS: Crs.CrsCod = Gbl.FileBrowser.Clipboard.Cod; Crs_GetDataOfCourseByCod (&Crs); @@ -7097,6 +7194,10 @@ static bool Brw_CheckIfClipboardIsInThisTree (void) if (Gbl.FileBrowser.Clipboard.Cod == Gbl.CurrentCrs.Grps.GrpCod) return true; // I am in the group of the clipboard break; + case Brw_ADMI_DOCUM_PRJ: + if (Gbl.FileBrowser.Clipboard.Cod == Gbl.CurrentCrs.Prjs.PrjCod) + return true; // I am in the project of the clipboard + break; case Brw_ADMI_BRIEF_USR: return true; default: @@ -7648,6 +7749,12 @@ static void Brw_RemoveAffectedClipboards (Brw_FileBrowser_t FileBrowser, (unsigned) FileBrowser, Gbl.CurrentCrs.Crs.CrsCod,WorksUsrCod); break; + case Brw_ADMI_DOCUM_PRJ: + sprintf (Query,"DELETE FROM clipboard" + " WHERE FileBrowser=%u AND Cod=%ld", + (unsigned) FileBrowser, + Gbl.CurrentCrs.Prjs.PrjCod); + break; case Brw_ADMI_BRIEF_USR: sprintf (Query,"DELETE FROM clipboard" " WHERE UsrCod=%ld AND FileBrowser=%u", @@ -7733,6 +7840,7 @@ static void Brw_PasteClipboard (void) struct Degree Deg; struct Course Crs; struct GroupData GrpDat; + struct Project Prj; char PathOrg[PATH_MAX + 1]; struct Brw_NumObjects Pasted; long FirstFilCod = -1L; // First file code of the first file or link pasted. Important: initialize here to -1L @@ -7804,9 +7912,9 @@ static void Brw_PasteClipboard (void) Grp_GetDataOfGroupByCod (&GrpDat); Crs.CrsCod = GrpDat.CrsCod; if (Crs_GetDataOfCourseByCod (&Crs)) - sprintf (PathOrg,"%s/%s/%ld/grp/%ld/%s", - Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CRS,Crs.CrsCod, - Gbl.FileBrowser.Clipboard.Cod, + sprintf (PathOrg,"%s/%s/%ld/%s/%ld/%s", + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CRS,Crs.CrsCod,Cfg_FOLDER_GRP, + GrpDat.GrpCod, Gbl.FileBrowser.Clipboard.Path); else Lay_ShowErrorAndExit ("The course of copy source does not exist."); @@ -7815,26 +7923,31 @@ static void Brw_PasteClipboard (void) case Brw_ADMI_WORKS_USR: Crs.CrsCod = Gbl.FileBrowser.Clipboard.Cod; if (Crs_GetDataOfCourseByCod (&Crs)) - sprintf (PathOrg,"%s/%s/%ld/usr/%02u/%ld/%s", - Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CRS,Crs.CrsCod, + sprintf (PathOrg,"%s/%s/%ld/%s/%02u/%ld/%s", + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CRS,Crs.CrsCod,Cfg_FOLDER_USR, (unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100), Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.FileBrowser.Clipboard.Path); else Lay_ShowErrorAndExit ("The course of copy source does not exist."); break; - case Brw_ADMI_ASSIG_CRS: - case Brw_ADMI_WORKS_CRS: - Crs.CrsCod = Gbl.FileBrowser.Clipboard.Cod; - if (Crs_GetDataOfCourseByCod (&Crs)) - sprintf (PathOrg,"%s/%s/%ld/usr/%02u/%ld/%s", - Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CRS,Crs.CrsCod, - (unsigned) (Gbl.FileBrowser.Clipboard.WorksUsrCod % 100), - Gbl.FileBrowser.Clipboard.WorksUsrCod, - Gbl.FileBrowser.Clipboard.Path); + case Brw_ADMI_DOCUM_PRJ: + Prj.PrjCod = Gbl.FileBrowser.Clipboard.Cod; + Prj_GetDataOfProjectByCod (&Prj); + if (Prj.PrjCod > 0) + { + Crs.CrsCod = Prj.CrsCod; + if (Crs_GetDataOfCourseByCod (&Crs)) + sprintf (PathOrg,"%s/%s/%ld/%s/%02u/%ld/%s", + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CRS,Crs.CrsCod,Cfg_FOLDER_PRJ, + (unsigned) (Prj.PrjCod % 100), + Prj.PrjCod, + Gbl.FileBrowser.Clipboard.Path); + else + Lay_ShowErrorAndExit ("The course of copy source does not exist."); + } else - Lay_ShowErrorAndExit ("The course of copy source does not exist."); - break; + Lay_ShowErrorAndExit ("The course of copy source does not exist."); break; case Brw_ADMI_BRIEF_USR: sprintf (PathOrg,"%s/%s", @@ -10083,6 +10196,7 @@ void Brw_ChgFileMetadata (void) case Brw_ADMI_ASSIG_CRS: case Brw_ADMI_WORKS_USR: case Brw_ADMI_WORKS_CRS: + case Brw_ADMI_DOCUM_PRJ: case Brw_ADMI_BRIEF_USR: PublicFileAfterEdition = false; // Files in these zones can not be public License = Brw_GetParLicense (); @@ -11659,6 +11773,7 @@ static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row) extern const char *Txt_Shared_files_area; extern const char *Txt_Assignments_area; extern const char *Txt_Works_area; + extern const char *Txt_Project_documents; extern const char *Txt_Marks_area; extern const char *Txt_Temporary_private_storage_area; extern const char *Txt_Go_to_X; @@ -11813,6 +11928,9 @@ static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row) case Brw_ADMI_WORKS_USR: Title = Txt_Works_area; break; + case Brw_ADMI_DOCUM_PRJ: + Title = Txt_Project_documents; + break; case Brw_ADMI_MARKS_CRS: case Brw_ADMI_MARKS_GRP: Title = Txt_Marks_area; diff --git a/swad_file_browser.h b/swad_file_browser.h index 290c5cfab..60bcbcaa3 100644 --- a/swad_file_browser.h +++ b/swad_file_browser.h @@ -39,7 +39,7 @@ #define Brw_MAX_CHARS_FOLDER 30 // 30 #define Brw_MAX_BYTES_FOLDER NAME_MAX // 255 -#define Brw_NUM_TYPES_FILE_BROWSER 27 +#define Brw_NUM_TYPES_FILE_BROWSER 28 // The following types are stored in several database tables as numeric fields, // so don't change numbers! typedef enum @@ -71,6 +71,7 @@ typedef enum Brw_ADMI_SHARE_INS = 24, Brw_ADMI_TEACH_CRS = 25, Brw_ADMI_TEACH_GRP = 26, + Brw_ADMI_DOCUM_PRJ = 27, } Brw_FileBrowser_t; // The following types are stored in files and clipboard tables as numeric fields, so don't change numbers! @@ -153,6 +154,7 @@ struct FileMetadata #define Brw_INTERNAL_NAME_ROOT_FOLDER_SHARED "comun" // TODO: It should be "sha" #define Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS "actividades" // TODO: It should be "asg" #define Brw_INTERNAL_NAME_ROOT_FOLDER_WORKS "trabajos" // TODO: It should be "wrk" +#define Brw_INTERNAL_NAME_ROOT_FOLDER_PROJECTS "prj" #define Brw_INTERNAL_NAME_ROOT_FOLDER_MARKS "calificaciones" // TODO: It should be "mrk" #define Brw_INTERNAL_NAME_ROOT_FOLDER_BRIEF "maletin" // TODO: It should be "brf" diff --git a/swad_global.h b/swad_global.h index 19ec8c556..1bdb59408 100644 --- a/swad_global.h +++ b/swad_global.h @@ -463,6 +463,7 @@ struct Globals struct { Prj_WhichProjects_t WhichPrjs; // Show my projects or all projects + long PrjCod; } Prjs; struct { diff --git a/swad_help_URL.c b/swad_help_URL.c index 996a8210b..38f4952f2 100644 --- a/swad_help_URL.c +++ b/swad_help_URL.c @@ -1474,6 +1474,27 @@ const char *Hlp_FILES_Marks = "FILES.Marks.en"; #endif +const char *Hlp_FILES_Briefcase = +#if L==1 + "FILES.Briefcase.es"; +#elif L==2 + "FILES.Briefcase.en"; +#elif L==3 + "FILES.Briefcase.en"; +#elif L==4 + "FILES.Briefcase.es"; +#elif L==5 + "FILES.Briefcase.en"; +#elif L==6 + "FILES.Briefcase.es"; +#elif L==7 + "FILES.Briefcase.en"; +#elif L==8 + "FILES.Briefcase.en"; +#elif L==9 + "FILES.Briefcase.en"; +#endif + /***** USERS tab *****/ const char *Hlp_USERS_Groups = @@ -3646,24 +3667,3 @@ const char *Hlp_PROFILE_Preferences_notifications = #elif L==9 "PROFILE.Preferences.en#notifications"; #endif - -const char *Hlp_PROFILE_Briefcase = -#if L==1 - "PROFILE.Briefcase.es"; -#elif L==2 - "PROFILE.Briefcase.en"; -#elif L==3 - "PROFILE.Briefcase.en"; -#elif L==4 - "PROFILE.Briefcase.es"; -#elif L==5 - "PROFILE.Briefcase.en"; -#elif L==6 - "PROFILE.Briefcase.es"; -#elif L==7 - "PROFILE.Briefcase.en"; -#elif L==8 - "PROFILE.Briefcase.en"; -#elif L==9 - "PROFILE.Briefcase.en"; -#endif diff --git a/swad_layout.c b/swad_layout.c index cb768f768..7282c3e2e 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -221,9 +221,10 @@ void Lay_WriteStartOfPage (void) case ActFrmCreAsgCrs: // Brw_ADMI_ASSIG_CRS case ActFrmCreWrkUsr: // Brw_ADMI_WORKS_USR case ActFrmCreWrkCrs: // Brw_ADMI_WORKS_CRS + case ActFrmCreDocPrj: // Brw_ADMI_DOCUM_PRJ case ActFrmCreMrkCrs: // Brw_ADMI_MARKS_CRS case ActFrmCreMrkGrp: // Brw_ADMI_MARKS_GRP - case ActFrmCreBrf: // Brw_ADMI_BRIEF_USR + case ActFrmCreBrf: // Brw_ADMI_BRIEF_USR fprintf (Gbl.F.Out,"\n", @@ -594,6 +595,7 @@ static void Lay_WriteScripts (void) case ActFrmCreAsgCrs: // Brw_ADMI_ASSIG_CRS case ActFrmCreWrkUsr: // Brw_ADMI_WORKS_USR case ActFrmCreWrkCrs: // Brw_ADMI_WORKS_CRS + case ActFrmCreDocPrj: // Brw_ADMI_DOCUM_PRJ case ActFrmCreMrkCrs: // Brw_ADMI_MARKS_CRS case ActFrmCreMrkGrp: // Brw_ADMI_MARKS_GRP case ActFrmCreBrf: // Brw_ADMI_BRIEF_USR diff --git a/swad_project.c b/swad_project.c index d940832ca..0be7d03a9 100644 --- a/swad_project.c +++ b/swad_project.c @@ -568,6 +568,7 @@ void Prj_FileBrowserPrj (void) /***** Get project data *****/ Prj.PrjCod = Prj_GetParamPrjCod (); Prj_GetDataOfProjectByCod (&Prj); + Gbl.CurrentCrs.Prjs.PrjCod = Prj.PrjCod; // Used in file browser /***** Start box and table *****/ Box_StartBoxTable (NULL,Prj.Title,NULL, @@ -1959,7 +1960,7 @@ void Prj_GetDataOfProjectByCod (struct Project *Prj) if (Prj->PrjCod > 0) { /***** Build query *****/ - sprintf (Query,"SELECT PrjCod,DptCod,Hidden,Preassigned,NumStds,Proposal," + sprintf (Query,"SELECT PrjCod,CrsCod,DptCod,Hidden,Preassigned,NumStds,Proposal," "UNIX_TIMESTAMP(StartTime)," "UNIX_TIMESTAMP(EndTime)," "NOW() BETWEEN StartTime AND EndTime," @@ -1969,19 +1970,20 @@ void Prj_GetDataOfProjectByCod (struct Project *Prj) Prj->PrjCod,Gbl.CurrentCrs.Crs.CrsCod); /* row[ 0]: PrjCod - row[ 1]: DptCod - row[ 2]: Hidden - row[ 3]: Preassigned - row[ 4]: NumStds - row[ 5]: Proposal - row[ 6]: UNIX_TIMESTAMP(StartTime) - row[ 7]: UNIX_TIMESTAMP(EndTime) - row[ 8]: NOW() BETWEEN StartTime AND EndTime - row[ 9]: Title - row[10]: Description - row[11]: Knowledge - row[12]: Materials - row[13]: URL + row[ 1]: CrsCod + row[ 2]: DptCod + row[ 3]: Hidden + row[ 4]: Preassigned + row[ 5]: NumStds + row[ 6]: Proposal + row[ 7]: UNIX_TIMESTAMP(StartTime) + row[ 8]: UNIX_TIMESTAMP(EndTime) + row[ 9]: NOW() BETWEEN StartTime AND EndTime + row[10]: Title + row[11]: Description + row[12]: Knowledge + row[13]: Materials + row[14]: URL */ /***** Get data of project *****/ @@ -2016,79 +2018,83 @@ static void Prj_GetDataOfProject (struct Project *Prj,const char *Query) row = mysql_fetch_row (mysql_res); /* row[ 0]: PrjCod - row[ 1]: DptCod - row[ 2]: Hidden - row[ 3]: Preassigned - row[ 4]: NumStds - row[ 5]: Proposal - row[ 6]: UNIX_TIMESTAMP(StartTime) - row[ 7]: UNIX_TIMESTAMP(EndTime) - row[ 8]: NOW() BETWEEN StartTime AND EndTime - row[ 9]: Title - row[10]: Description - row[11]: Knowledge - row[12]: Materials - row[13]: URL + row[ 1]: CrsCod + row[ 2]: DptCod + row[ 3]: Hidden + row[ 4]: Preassigned + row[ 5]: NumStds + row[ 6]: Proposal + row[ 7]: UNIX_TIMESTAMP(StartTime) + row[ 8]: UNIX_TIMESTAMP(EndTime) + row[ 9]: NOW() BETWEEN StartTime AND EndTime + row[10]: Title + row[11]: Description + row[12]: Knowledge + row[13]: Materials + row[14]: URL */ /* Get code of the project (row[0]) */ Prj->PrjCod = Str_ConvertStrCodToLongCod (row[0]); - /* Get code of the department (row[1]) */ - Prj->DptCod = Str_ConvertStrCodToLongCod (row[1]); + /* Get code of the course (row[1]) */ + Prj->CrsCod = Str_ConvertStrCodToLongCod (row[1]); - /* Get whether the project is hidden or not (row[2]) */ - Prj->Hidden = (row[2][0] == 'Y'); + /* Get code of the department (row[2]) */ + Prj->DptCod = Str_ConvertStrCodToLongCod (row[2]); - /* Get if project is preassigned or not (row[3]) */ - Prj->Preassigned = (row[3][0] == 'Y') ? Prj_PREASSIGNED : - Prj_NOT_PREASSIGNED; + /* Get whether the project is hidden or not (row[3]) */ + Prj->Hidden = (row[3][0] == 'Y'); /* Get if project is preassigned or not (row[4]) */ - NumLong = Str_ConvertStrCodToLongCod (row[4]); + Prj->Preassigned = (row[4][0] == 'Y') ? Prj_PREASSIGNED : + Prj_NOT_PREASSIGNED; + + /* Get if project is preassigned or not (row[5]) */ + NumLong = Str_ConvertStrCodToLongCod (row[5]); if (NumLong >= 0) Prj->NumStds = (unsigned) NumLong; else Prj->NumStds = 1; - /* Get project status (row[5]) */ + /* Get project status (row[6]) */ Prj->Proposal = Prj_PROPOSAL_DEFAULT; for (Proposal = (Prj_Proposal_t) 0; Proposal <= (Prj_Proposal_t) (Prj_NUM_PROPOSAL_TYPES - 1); Proposal++) - if (!strcmp (Prj_Proposal_DB[Proposal],row[5])) + if (!strcmp (Prj_Proposal_DB[Proposal],row[6])) { Prj->Proposal = Proposal; break; } - /* Get start date (row[6] holds the start UTC time) */ - Prj->TimeUTC[Dat_START_TIME] = Dat_GetUNIXTimeFromStr (row[6]); + /* Get start date (row[7] holds the start UTC time) */ + Prj->TimeUTC[Dat_START_TIME] = Dat_GetUNIXTimeFromStr (row[7]); - /* Get end date (row[7] holds the end UTC time) */ - Prj->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[7]); + /* Get end date (row[8] holds the end UTC time) */ + Prj->TimeUTC[Dat_END_TIME ] = Dat_GetUNIXTimeFromStr (row[8]); - /* Get whether the project is open or closed (row[8]) */ - Prj->Open = (row[8][0] == '1'); + /* Get whether the project is open or closed (row[9]) */ + Prj->Open = (row[9][0] == '1'); - /* Get the title of the project (row[9]) */ - Str_Copy (Prj->Title,row[9], + /* Get the title of the project (row[10]) */ + Str_Copy (Prj->Title,row[10], Prj_MAX_BYTES_PROJECT_TITLE); - /* Get the description of the project (row[10]) */ - Str_Copy (Prj->Description,row[10], + /* Get the description of the project (row[11]) */ + Str_Copy (Prj->Description,row[11], Cns_MAX_BYTES_TEXT); - /* Get the required knowledge for the project (row[11]) */ - Str_Copy (Prj->Knowledge,row[11], + /* Get the required knowledge for the project (row[12]) */ + Str_Copy (Prj->Knowledge,row[12], Cns_MAX_BYTES_TEXT); - /* Get the required materials for the project (row[12]) */ - Str_Copy (Prj->Materials,row[12], + /* Get the required materials for the project (row[13]) */ + Str_Copy (Prj->Materials,row[13], Cns_MAX_BYTES_TEXT); - /* Get the URL of the project (row[13]) */ - Str_Copy (Prj->URL,row[13], + /* Get the URL of the project (row[14]) */ + Str_Copy (Prj->URL,row[14], Cns_MAX_BYTES_WWW); } @@ -2104,10 +2110,11 @@ static void Prj_ResetProject (struct Project *Prj) { if (Prj->PrjCod <= 0) // If > 0 ==> keep value Prj->PrjCod = -1L; + Prj->CrsCod = -1L; Prj->Hidden = false; Prj->Preassigned = Prj_PREASSIGNED_DEFAULT; Prj->NumStds = 1; - Prj->Proposal = Prj_PROPOSAL_DEFAULT; + Prj->Proposal = Prj_PROPOSAL_DEFAULT; Prj->TimeUTC[Dat_START_TIME] = Prj->TimeUTC[Dat_END_TIME ] = (time_t) 0; Prj->Open = false; @@ -2116,7 +2123,7 @@ static void Prj_ResetProject (struct Project *Prj) Prj->Description[0] = '\0'; Prj->Knowledge[0] = '\0'; Prj->Materials[0] = '\0'; - Prj->URL[0] = '\0'; + Prj->URL[0] = '\0'; } /*****************************************************************************/ diff --git a/swad_project.h b/swad_project.h index 2b8c2d3c5..ee24ffb14 100644 --- a/swad_project.h +++ b/swad_project.h @@ -70,6 +70,7 @@ typedef enum struct Project { long PrjCod; + long CrsCod; bool Hidden; Prj_Preassigned_t Preassigned; unsigned NumStds; diff --git a/swad_text.c b/swad_text.c index ba08365a7..f870e665f 100644 --- a/swad_text.c +++ b/swad_text.c @@ -1723,6 +1723,27 @@ const char *Txt_accessible_for_reading_and_writing_by_administrators_of_the_inst "acessível para leitura e escrita pelos administradores da instituição"; #endif +const char *Txt_accessible_for_reading_and_writing_by_project_members = +#if L==1 + "accessible per a lectura i escriptura per membres del projecte"; +#elif L==2 + "zugänglich zum Lesen und Schreiben von Projektmitgliedern"; +#elif L==3 + "accessible for reading and writing by project members"; +#elif L==4 + "accesible para lectura y escritura por miembros del proyecto"; +#elif L==5 + "accessible pour la lecture et l'écriture par les membres du projet"; +#elif L==6 + "accesible para lectura y escritura por miembros del proyecto"; // Okoteve traducción +#elif L==7 + "accessibile per la lettura e la scrittura da parte dei membri del progetto"; +#elif L==8 + "dostępne do czytania i pisania przez członków projektu"; +#elif L==9 + "acessível para leitura e escrita por membros do projeto"; +#endif + const char *Txt_accessible_for_reading_and_writing_by_students_and_teachers_of_the_centre = #if L==1 "accessible per a lectura i escriptura per estudiants i professors del centre"; @@ -30789,6 +30810,69 @@ const char *Txt_Private_available_to_certain_users_identified = "Privado, disponível para alguns usuários identificados"; #endif +const char *Txt_project = +#if L==1 + "projecte"; +#elif L==2 + "Projekt"; +#elif L==3 + "project"; +#elif L==4 + "proyecto"; +#elif L==5 + "project"; +#elif L==6 + "proyecto"; // Okoteve traducción +#elif L==7 + "progetto"; +#elif L==8 + "projektowe"; +#elif L==9 + "projeto"; +#endif + +const char *Txt_Project_documents = +#if L==1 + "Documents del projecte"; +#elif L==2 + "Projektdokumente"; +#elif L==3 + "Project documents"; +#elif L==4 + "Documentos del proyecto"; +#elif L==5 + "Documents du project"; +#elif L==6 + "Documentos del proyecto"; // Okoteve traducción +#elif L==7 + "Documenti di progetto"; +#elif L==8 + "Dokumenty projektowe"; +#elif L==9 + "Documentos do projeto"; +#endif + +const char *Txt_project_documents = +#if L==1 + "documents del projecte"; +#elif L==2 + "Projektdokumente"; +#elif L==3 + "project documents"; +#elif L==4 + "documentos del proyecto"; +#elif L==5 + "documents du project"; +#elif L==6 + "documentos del proyecto"; // Okoteve traducción +#elif L==7 + "documenti di progetto"; +#elif L==8 + "dokumenty projektowe"; +#elif L==9 + "documentos do projeto"; +#endif + const char *Txt_Project_X_is_now_hidden = // Warning: it is very important to include %s in the following sentences #if L==1 "El projecte %s ara està ocult."; @@ -37975,6 +38059,27 @@ const char *Txt_ROOT_FOLDER_EXTERNAL_NAMES[Brw_NUM_TYPES_FILE_BROWSER] = "prywatne" #elif L==9 "privados" +#endif + , + // Brw_ADMI_DOCUM_PRJ +#if L==1 + "projecte" +#elif L==2 + "Projekt" +#elif L==3 + "project" +#elif L==4 + "proyecto" +#elif L==5 + "projet" +#elif L==6 + "proyecto" // Okoteve traducción +#elif L==7 + "progetto" +#elif L==8 + "projekt" +#elif L==9 + "projeto" #endif }; diff --git a/swad_zip.c b/swad_zip.c index a29e58a61..c364e819c 100644 --- a/swad_zip.c +++ b/swad_zip.c @@ -83,6 +83,7 @@ const Act_Action_t ZIP_ActZIPFolder[Brw_NUM_TYPES_FILE_BROWSER] = ActZIPShaIns, // Brw_ADMI_SHARE_INS ActZIPTchCrs, // Brw_ADMI_TEACH_CRS ActZIPTchGrp, // Brw_ADMI_TEACH_GRP + ActZIPDocPrj, // Brw_ADMI_DOCUM_PRJ }; /*****************************************************************************/