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
};
/*****************************************************************************/