diff --git a/swad_action.c b/swad_action.c
index a063d8007..60afc7633 100644
--- a/swad_action.c
+++ b/swad_action.c
@@ -477,24 +477,44 @@ Assessment:
337. ActRemEvaPrj Remove an emulator from a project
NEW. ActAdmDocPrj Admin. project documents
- NEW. ActReqRemFilBrf Request removal of a file from project documents
- NEW. ActRemFilBrf Remove a file from project documents
- NEW. ActRemFolBrf Remove an empty folder from project documents
- NEW. ActCopBrf Set source of copy in project documents
- NEW. ActPasBrf Paste a folder or file into project documents
- NEW. ActRemTreBrf Remove a non empty folder from project documents
- NEW. ActFrmCreBrf Form to create a folder or file in project documents
- NEW. ActCreFolBrf Create a new folder in project documents
- NEW. ActCreLnkBrf Create a new link in project documents
- NEW. ActRenFolBrf Rename a folder in project documents
- NEW. ActRcvFilBrfDZ Receive a file in project documents using Dropzone.js
- NEW. ActRcvFilBrfCla Receive a file in project documents using the classic way
- NEW. ActExpBrf Expand a folder in project documents
- NEW. ActConBrf Contract a folder in project documents
- NEW. ActZIPBrf Compress a folder in project documents
- NEW. ActReqDatBrf Ask for metadata of a file in project documents
- NEW. ActChgDatBrf Change metadata of a file in project documents
- NEW. ActDowBrf Download a file from project documents
+ NEW. ActReqRemFilDocPrj Request removal of a file from project documents
+ NEW. ActRemFilDocPrj Remove a file from project documents
+ NEW. ActRemFolDocPrj Remove an empty folder from project documents
+ NEW. ActCopDocPrj Set source of copy in project documents
+ NEW. ActPasDocPrj Paste a folder or file into project documents
+ NEW. ActRemTreDocPrj Remove a non empty folder from project documents
+ NEW. ActFrmCreDocPrj Form to create a folder or file in project documents
+ NEW. ActCreFolDocPrj Create a new folder in project documents
+ NEW. ActCreLnkDocPrj Create a new link in project documents
+ NEW. ActRenFolDocPrj Rename a folder in project documents
+ NEW. ActRcvFilDocPrjDZ Receive a file in project documents using Dropzone.js
+ NEW. ActRcvFilDocPrjCla Receive a file in project documents using the classic way
+ NEW. ActExpDocPrj Expand a folder in project documents
+ NEW. ActConDocPrj Contract a folder in project documents
+ NEW. ActZIPDocPrj Compress a folder in project documents
+ NEW. ActReqDatDocPrj Ask for metadata of a file in project documents
+ NEW. ActChgDatDocPrj Change metadata of a file in project documents
+ NEW. ActDowDocPrj Download a file from project documents
+
+ NEW. ActAdmAssPrj Admin. project assessment
+ NEW. ActReqRemFilAssPrj Request removal of a file from project assessment
+ NEW. ActRemFilAssPrj Remove a file from project assessment
+ NEW. ActRemFolAssPrj Remove an empty folder from project assessment
+ NEW. ActCopAssPrj Set source of copy in project assessment
+ NEW. ActPasAssPrj Paste a folder or file into project assessment
+ NEW. ActRemTreAssPrj Remove a non empty folder from project assessment
+ NEW. ActFrmCreAssPrj Form to create a folder or file in project assessment
+ NEW. ActCreFolAssPrj Create a new folder in project assessment
+ NEW. ActCreLnkAssPrj Create a new link in project assessment
+ NEW. ActRenFolAssPrj Rename a folder in project assessment
+ NEW. ActRcvFilAssPrjDZ Receive a file in project assessment using Dropzone.js
+ NEW. ActRcvFilAssPrjCla Receive a file in project assessment using the classic way
+ NEW. ActExpAssPrj Expand a folder in project assessment
+ NEW. ActConAssPrj Contract a folder in project assessment
+ NEW. ActZIPAssPrj Compress a folder in project assessment
+ NEW. ActReqDatAssPrj Ask for metadata of a file in project assessment
+ NEW. ActChgDatAssPrj Change metadata of a file in project assessment
+ NEW. ActDowAssPrj Download a file from project assessment
338. ActSeeTst Show the seft-assessment test
339. ActAssTst Assess a self-assessment test
@@ -2019,6 +2039,26 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActChgDatDocPrj */{1714,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_ChgFileMetadata ,NULL},
/* ActDowDocPrj */{1715,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_DOWNLD_FILE,Brw_DownloadFile ,NULL ,NULL},
+ /* ActAdmAssPrj */{1716,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_ShowFileBrowserOrWorks ,NULL},
+ /* ActReqRemFilAssPrj*/{1717,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_AskRemFileFromTree ,NULL},
+ /* ActRemFilAssPrj */{1718,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_RemFileFromTree ,NULL},
+ /* ActRemFolAssPrj */{1719,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_RemFolderFromTree ,NULL},
+ /* ActCopAssPrj */{1720,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_CopyFromFileBrowser ,NULL},
+ /* ActPasAssPrj */{1721,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_PasteIntoFileBrowser ,NULL},
+ /* ActRemTreAssPrj */{1722,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_RemSubtreeInFileBrowser ,NULL},
+ /* ActFrmCreAssPrj */{1723,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_ShowFormFileBrowser ,NULL},
+ /* ActCreFolAssPrj */{1724,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_RecFolderFileBrowser ,NULL},
+ /* ActCreLnkAssPrj */{1725,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_RecLinkFileBrowser ,NULL},
+ /* ActRenFolAssPrj */{1726,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_RenFolderFileBrowser ,NULL},
+ /* ActRcvFilAssPrjDZ */{1727,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPLOAD_FILE,Brw_RcvFileInFileBrwDropzone ,NULL ,NULL},
+ /* ActRcvFilAssPrjCla*/{1728,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_BRW_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic ,NULL},
+ /* ActExpAssPrj */{1729,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NO_CONT,Brw_ExpandFileTree ,NULL ,NULL},
+ /* ActConAssPrj */{1730,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NO_CONT,Brw_ContractFileTree ,NULL ,NULL},
+ /* ActZIPAssPrj */{1731,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ZIP_CompressFileTree ,NULL},
+ /* ActReqDatAssPrj */{1732,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_ShowFileMetadata ,NULL},
+ /* ActChgDatAssPrj */{1733,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_ChgFileMetadata ,NULL},
+ /* ActDowAssPrj */{1734,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_DOWNLD_FILE,Brw_DownloadFile ,NULL ,NULL},
+
/* ActSeeTst */{ 29,-1,TabUnk,ActReqTst ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowNewTest ,NULL},
/* ActAssTst */{ 98,-1,TabUnk,ActReqTst ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_AssessTest ,NULL},
@@ -4860,6 +4900,25 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActReqDatDocPrj, // #1713
ActChgDatDocPrj, // #1714
ActDowDocPrj, // #1715
+ ActAdmAssPrj, // #1716
+ ActReqRemFilAssPrj, // #1717
+ ActRemFilAssPrj, // #1718
+ ActRemFolAssPrj, // #1719
+ ActCopAssPrj, // #1720
+ ActPasAssPrj, // #1721
+ ActRemTreAssPrj, // #1722
+ ActFrmCreAssPrj, // #1723
+ ActCreFolAssPrj, // #1724
+ ActCreLnkAssPrj, // #1725
+ ActRenFolAssPrj, // #1726
+ ActRcvFilAssPrjDZ, // #1727
+ ActRcvFilAssPrjCla, // #1728
+ ActExpAssPrj, // #1729
+ ActConAssPrj, // #1730
+ ActZIPAssPrj, // #1731
+ ActReqDatAssPrj, // #1732
+ ActChgDatAssPrj, // #1733
+ ActDowAssPrj, // #1734
};
/*****************************************************************************/
diff --git a/swad_action.h b/swad_action.h
index 2ab0d600c..7d0d9b774 100644
--- a/swad_action.h
+++ b/swad_action.h
@@ -59,9 +59,9 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
-#define Act_NUM_ACTIONS (1 + 9 + 43 + 17 + 47 + 33 + 24 + 115 + 138 + 437 + 165 + 172 + 42 + 14 + 76)
+#define Act_NUM_ACTIONS (1 + 9 + 43 + 17 + 47 + 33 + 24 + 115 + 157 + 437 + 165 + 172 + 42 + 14 + 76)
-#define Act_MAX_ACTION_COD 1715
+#define Act_MAX_ACTION_COD 1734
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@@ -507,80 +507,100 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActChgDatDocPrj (ActChgCalCrs1stDay + 67)
#define ActDowDocPrj (ActChgCalCrs1stDay + 68)
-#define ActSeeTst (ActChgCalCrs1stDay + 69)
-#define ActAssTst (ActChgCalCrs1stDay + 70)
-#define ActEdiTstQst (ActChgCalCrs1stDay + 71)
-#define ActEdiOneTstQst (ActChgCalCrs1stDay + 72)
-#define ActReqImpTstQst (ActChgCalCrs1stDay + 73)
-#define ActImpTstQst (ActChgCalCrs1stDay + 74)
-#define ActLstTstQst (ActChgCalCrs1stDay + 75)
-#define ActRcvTstQst (ActChgCalCrs1stDay + 76)
-#define ActReqRemTstQst (ActChgCalCrs1stDay + 77)
-#define ActRemTstQst (ActChgCalCrs1stDay + 78)
-#define ActShfTstQst (ActChgCalCrs1stDay + 79)
-#define ActCfgTst (ActChgCalCrs1stDay + 80)
-#define ActEnableTag (ActChgCalCrs1stDay + 81)
-#define ActDisableTag (ActChgCalCrs1stDay + 82)
-#define ActRenTag (ActChgCalCrs1stDay + 83)
-#define ActRcvCfgTst (ActChgCalCrs1stDay + 84)
+#define ActAdmAssPrj (ActChgCalCrs1stDay + 69)
+#define ActReqRemFilAssPrj (ActChgCalCrs1stDay + 70)
+#define ActRemFilAssPrj (ActChgCalCrs1stDay + 71)
+#define ActRemFolAssPrj (ActChgCalCrs1stDay + 72)
+#define ActCopAssPrj (ActChgCalCrs1stDay + 73)
+#define ActPasAssPrj (ActChgCalCrs1stDay + 74)
+#define ActRemTreAssPrj (ActChgCalCrs1stDay + 75)
+#define ActFrmCreAssPrj (ActChgCalCrs1stDay + 76)
+#define ActCreFolAssPrj (ActChgCalCrs1stDay + 77)
+#define ActCreLnkAssPrj (ActChgCalCrs1stDay + 78)
+#define ActRenFolAssPrj (ActChgCalCrs1stDay + 79)
+#define ActRcvFilAssPrjDZ (ActChgCalCrs1stDay + 80)
+#define ActRcvFilAssPrjCla (ActChgCalCrs1stDay + 81)
+#define ActExpAssPrj (ActChgCalCrs1stDay + 82)
+#define ActConAssPrj (ActChgCalCrs1stDay + 83)
+#define ActZIPAssPrj (ActChgCalCrs1stDay + 84)
+#define ActReqDatAssPrj (ActChgCalCrs1stDay + 85)
+#define ActChgDatAssPrj (ActChgCalCrs1stDay + 86)
+#define ActDowAssPrj (ActChgCalCrs1stDay + 87)
-#define ActReqSeeMyTstRes (ActChgCalCrs1stDay + 85)
-#define ActSeeMyTstRes (ActChgCalCrs1stDay + 86)
-#define ActSeeOneTstResMe (ActChgCalCrs1stDay + 87)
-#define ActReqSeeUsrTstRes (ActChgCalCrs1stDay + 88)
-#define ActSeeUsrTstRes (ActChgCalCrs1stDay + 89)
-#define ActSeeOneTstResOth (ActChgCalCrs1stDay + 90)
+#define ActSeeTst (ActChgCalCrs1stDay + 88)
+#define ActAssTst (ActChgCalCrs1stDay + 89)
+#define ActEdiTstQst (ActChgCalCrs1stDay + 90)
+#define ActEdiOneTstQst (ActChgCalCrs1stDay + 91)
+#define ActReqImpTstQst (ActChgCalCrs1stDay + 92)
+#define ActImpTstQst (ActChgCalCrs1stDay + 93)
+#define ActLstTstQst (ActChgCalCrs1stDay + 94)
+#define ActRcvTstQst (ActChgCalCrs1stDay + 95)
+#define ActReqRemTstQst (ActChgCalCrs1stDay + 96)
+#define ActRemTstQst (ActChgCalCrs1stDay + 97)
+#define ActShfTstQst (ActChgCalCrs1stDay + 98)
+#define ActCfgTst (ActChgCalCrs1stDay + 99)
+#define ActEnableTag (ActChgCalCrs1stDay + 100)
+#define ActDisableTag (ActChgCalCrs1stDay + 101)
+#define ActRenTag (ActChgCalCrs1stDay + 102)
+#define ActRcvCfgTst (ActChgCalCrs1stDay + 103)
-#define ActSeeOneGam (ActChgCalCrs1stDay + 91)
-#define ActPlyGam (ActChgCalCrs1stDay + 92)
-#define ActPlyGam1stQst (ActChgCalCrs1stDay + 93)
-#define ActPlyGamNxtQst (ActChgCalCrs1stDay + 94)
-#define ActPlyGamAns (ActChgCalCrs1stDay + 95)
-#define ActAnsGam (ActChgCalCrs1stDay + 96)
-#define ActFrmNewGam (ActChgCalCrs1stDay + 97)
-#define ActEdiOneGam (ActChgCalCrs1stDay + 98)
-#define ActNewGam (ActChgCalCrs1stDay + 99)
-#define ActChgGam (ActChgCalCrs1stDay + 100)
-#define ActReqRemGam (ActChgCalCrs1stDay + 101)
-#define ActRemGam (ActChgCalCrs1stDay + 102)
-#define ActReqRstGam (ActChgCalCrs1stDay + 103)
-#define ActRstGam (ActChgCalCrs1stDay + 104)
-#define ActHidGam (ActChgCalCrs1stDay + 105)
-#define ActShoGam (ActChgCalCrs1stDay + 106)
-#define ActAddOneGamQst (ActChgCalCrs1stDay + 107)
-#define ActGamLstTstQst (ActChgCalCrs1stDay + 108)
-#define ActAddTstQstToGam (ActChgCalCrs1stDay + 109)
-#define ActReqRemGamQst (ActChgCalCrs1stDay + 100)
-#define ActRemGamQst (ActChgCalCrs1stDay + 111)
-#define ActUp_GamQst (ActChgCalCrs1stDay + 112)
-#define ActDwnGamQst (ActChgCalCrs1stDay + 113)
+#define ActReqSeeMyTstRes (ActChgCalCrs1stDay + 104)
+#define ActSeeMyTstRes (ActChgCalCrs1stDay + 105)
+#define ActSeeOneTstResMe (ActChgCalCrs1stDay + 106)
+#define ActReqSeeUsrTstRes (ActChgCalCrs1stDay + 107)
+#define ActSeeUsrTstRes (ActChgCalCrs1stDay + 108)
+#define ActSeeOneTstResOth (ActChgCalCrs1stDay + 109)
-#define ActSeeOneSvy (ActChgCalCrs1stDay + 114)
-#define ActAnsSvy (ActChgCalCrs1stDay + 115)
-#define ActFrmNewSvy (ActChgCalCrs1stDay + 116)
-#define ActEdiOneSvy (ActChgCalCrs1stDay + 117)
-#define ActNewSvy (ActChgCalCrs1stDay + 118)
-#define ActChgSvy (ActChgCalCrs1stDay + 119)
-#define ActReqRemSvy (ActChgCalCrs1stDay + 120)
-#define ActRemSvy (ActChgCalCrs1stDay + 121)
-#define ActReqRstSvy (ActChgCalCrs1stDay + 122)
-#define ActRstSvy (ActChgCalCrs1stDay + 123)
-#define ActHidSvy (ActChgCalCrs1stDay + 124)
-#define ActShoSvy (ActChgCalCrs1stDay + 125)
-#define ActEdiOneSvyQst (ActChgCalCrs1stDay + 126)
-#define ActRcvSvyQst (ActChgCalCrs1stDay + 127)
-#define ActReqRemSvyQst (ActChgCalCrs1stDay + 128)
-#define ActRemSvyQst (ActChgCalCrs1stDay + 129)
+#define ActSeeOneGam (ActChgCalCrs1stDay + 110)
+#define ActPlyGam (ActChgCalCrs1stDay + 111)
+#define ActPlyGam1stQst (ActChgCalCrs1stDay + 112)
+#define ActPlyGamNxtQst (ActChgCalCrs1stDay + 113)
+#define ActPlyGamAns (ActChgCalCrs1stDay + 114)
+#define ActAnsGam (ActChgCalCrs1stDay + 115)
+#define ActFrmNewGam (ActChgCalCrs1stDay + 116)
+#define ActEdiOneGam (ActChgCalCrs1stDay + 117)
+#define ActNewGam (ActChgCalCrs1stDay + 118)
+#define ActChgGam (ActChgCalCrs1stDay + 119)
+#define ActReqRemGam (ActChgCalCrs1stDay + 120)
+#define ActRemGam (ActChgCalCrs1stDay + 121)
+#define ActReqRstGam (ActChgCalCrs1stDay + 122)
+#define ActRstGam (ActChgCalCrs1stDay + 123)
+#define ActHidGam (ActChgCalCrs1stDay + 124)
+#define ActShoGam (ActChgCalCrs1stDay + 125)
+#define ActAddOneGamQst (ActChgCalCrs1stDay + 126)
+#define ActGamLstTstQst (ActChgCalCrs1stDay + 127)
+#define ActAddTstQstToGam (ActChgCalCrs1stDay + 128)
+#define ActReqRemGamQst (ActChgCalCrs1stDay + 129)
+#define ActRemGamQst (ActChgCalCrs1stDay + 130)
+#define ActUp_GamQst (ActChgCalCrs1stDay + 131)
+#define ActDwnGamQst (ActChgCalCrs1stDay + 132)
-#define ActSeeOneExaAnn (ActChgCalCrs1stDay + 130)
-#define ActSeeDatExaAnn (ActChgCalCrs1stDay + 131)
-#define ActEdiExaAnn (ActChgCalCrs1stDay + 132)
-#define ActRcvExaAnn (ActChgCalCrs1stDay + 133)
-#define ActPrnExaAnn (ActChgCalCrs1stDay + 134)
-#define ActReqRemExaAnn (ActChgCalCrs1stDay + 135)
-#define ActRemExaAnn (ActChgCalCrs1stDay + 136)
-#define ActHidExaAnn (ActChgCalCrs1stDay + 137)
-#define ActShoExaAnn (ActChgCalCrs1stDay + 138)
+#define ActSeeOneSvy (ActChgCalCrs1stDay + 133)
+#define ActAnsSvy (ActChgCalCrs1stDay + 134)
+#define ActFrmNewSvy (ActChgCalCrs1stDay + 135)
+#define ActEdiOneSvy (ActChgCalCrs1stDay + 136)
+#define ActNewSvy (ActChgCalCrs1stDay + 137)
+#define ActChgSvy (ActChgCalCrs1stDay + 138)
+#define ActReqRemSvy (ActChgCalCrs1stDay + 139)
+#define ActRemSvy (ActChgCalCrs1stDay + 140)
+#define ActReqRstSvy (ActChgCalCrs1stDay + 141)
+#define ActRstSvy (ActChgCalCrs1stDay + 142)
+#define ActHidSvy (ActChgCalCrs1stDay + 143)
+#define ActShoSvy (ActChgCalCrs1stDay + 144)
+#define ActEdiOneSvyQst (ActChgCalCrs1stDay + 145)
+#define ActRcvSvyQst (ActChgCalCrs1stDay + 146)
+#define ActReqRemSvyQst (ActChgCalCrs1stDay + 147)
+#define ActRemSvyQst (ActChgCalCrs1stDay + 148)
+
+#define ActSeeOneExaAnn (ActChgCalCrs1stDay + 149)
+#define ActSeeDatExaAnn (ActChgCalCrs1stDay + 150)
+#define ActEdiExaAnn (ActChgCalCrs1stDay + 151)
+#define ActRcvExaAnn (ActChgCalCrs1stDay + 152)
+#define ActPrnExaAnn (ActChgCalCrs1stDay + 153)
+#define ActReqRemExaAnn (ActChgCalCrs1stDay + 154)
+#define ActRemExaAnn (ActChgCalCrs1stDay + 155)
+#define ActHidExaAnn (ActChgCalCrs1stDay + 156)
+#define ActShoExaAnn (ActChgCalCrs1stDay + 157)
/*****************************************************************************/
/******************************** Files tab **********************************/
diff --git a/swad_changelog.h b/swad_changelog.h
index 66533ba07..5f06e049b 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -256,13 +256,35 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 17.21.6 (2017-10-08)"
+#define Log_PLATFORM_VERSION "SWAD 17.22 (2017-10-08)"
#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.22: Oct 08, 2017 New file browser for project assessment. (233755 lines)
+ 19 changes necessary in database:
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1716','es','N','Editar eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1717','es','N','Subir archivo a eval. proyecto (ant.)');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1718','es','N','Eliminar archivo eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1719','es','N','Crear carpeta en eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1720','es','N','Eliminar carpeta eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1721','es','N','Renombrar carpeta en eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1722','es','N','Eliminar árbol eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1723','es','N','Solicitar elim. arch. eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1724','es','N','Copiar de eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1725','es','N','Pegar en eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1726','es','N','Expandir carpeta eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1727','es','N','Contraer carpeta eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1728','es','N','Solic. nuevo arch/carp eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1729','es','N','Ver datos arch. eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1730','es','N','Cambiar datos arch. eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1731','es','N','Descargar arch. eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1732','es','N','Crear ZIP carpeta eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1733','es','N','Subir archivo a eval. proyecto');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1734','es','N','Crear enlace en eval. proyecto');
+
Version 17.21.6: Oct 08, 2017 Changes related with project file browsers. (233315 lines)
Version 17.21.5: Oct 08, 2017 Code refactoring in removal of files from database when removing course. (233317 lines)
Version 17.21.4: Oct 08, 2017 Fixed bug: remove group files from database when removing course.
diff --git a/swad_file_browser.c b/swad_file_browser.c
index b18f0365c..04f557b72 100644
--- a/swad_file_browser.c
+++ b/swad_file_browser.c
@@ -131,6 +131,7 @@ const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER] =
Brw_ADMI_TCH_CRS, // Brw_ADMI_TCH_CRS = 25
Brw_ADMI_TCH_GRP, // Brw_ADMI_TCH_GRP = 26
Brw_ADMI_DOC_PRJ, // Brw_ADMI_DOC_PRJ = 27
+ Brw_ADMI_ASS_PRJ, // Brw_ADMI_ASS_PRJ = 28
};
// Browsers viewable shown in search for documents
const Brw_FileBrowser_t Brw_FileBrowserForFoundDocs[Brw_NUM_TYPES_FILE_BROWSER] =
@@ -163,6 +164,7 @@ const Brw_FileBrowser_t Brw_FileBrowserForFoundDocs[Brw_NUM_TYPES_FILE_BROWSER]
Brw_ADMI_TCH_CRS, // Brw_ADMI_TCH_CRS = 25
Brw_ADMI_TCH_GRP, // Brw_ADMI_TCH_GRP = 26
Brw_ADMI_DOC_PRJ, // Brw_ADMI_DOC_PRJ = 27
+ Brw_ADMI_ASS_PRJ, // Brw_ADMI_ASS_PRJ = 28
};
// Browsers types for database "clipboard" table
static const Brw_FileBrowser_t Brw_FileBrowserForDB_clipboard[Brw_NUM_TYPES_FILE_BROWSER] =
@@ -195,6 +197,7 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_clipboard[Brw_NUM_TYPES_FILE
Brw_ADMI_TCH_CRS, // Brw_ADMI_TCH_CRS = 25
Brw_ADMI_TCH_GRP, // Brw_ADMI_TCH_GRP = 26
Brw_ADMI_DOC_PRJ, // Brw_ADMI_DOC_PRJ = 27
+ Brw_ADMI_ASS_PRJ, // Brw_ADMI_ASS_PRJ = 28
};
// Browsers types for database "expanded_folders" table
static const Brw_FileBrowser_t Brw_FileBrowserForDB_expanded_folders[Brw_NUM_TYPES_FILE_BROWSER] =
@@ -227,6 +230,7 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_expanded_folders[Brw_NUM_TYP
Brw_ADMI_TCH_CRS, // Brw_ADMI_TCH_CRS = 25
Brw_ADMI_TCH_GRP, // Brw_ADMI_TCH_GRP = 26
Brw_ADMI_DOC_PRJ, // Brw_ADMI_DOC_PRJ = 27
+ Brw_ADMI_ASS_PRJ, // Brw_ADMI_ASS_PRJ = 28
};
// Browsers types for database "file_browser_last" table
// Assignments and works are stored as one in file_browser_last...
@@ -261,6 +265,7 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_file_browser_last[Brw_NUM_TY
Brw_ADMI_TCH_CRS, // Brw_ADMI_TCH_CRS = 25
Brw_ADMI_TCH_GRP, // Brw_ADMI_TCH_GRP = 26
Brw_ADMI_DOC_PRJ, // Brw_ADMI_DOC_PRJ = 27
+ Brw_ADMI_ASS_PRJ, // Brw_ADMI_ASS_PRJ = 28
};
// Internal names of root folders
@@ -294,6 +299,7 @@ const char *Brw_RootFolderInternalNames[Brw_NUM_TYPES_FILE_BROWSER] =
Brw_INTERNAL_NAME_ROOT_FOLDER_TEACHERS, // Brw_ADMI_TCH_CRS
Brw_INTERNAL_NAME_ROOT_FOLDER_TEACHERS, // Brw_ADMI_TCH_GRP
Brw_INTERNAL_NAME_ROOT_FOLDER_PROJECT_DOCUMENTS, // Brw_ADMI_DOC_PRJ
+ Brw_INTERNAL_NAME_ROOT_FOLDER_PROJECT_ASSESSMENT, // Brw_ADMI_ASS_PRJ
};
static const bool Brw_FileBrowserIsEditable[Brw_NUM_TYPES_FILE_BROWSER] =
@@ -326,6 +332,7 @@ static const bool Brw_FileBrowserIsEditable[Brw_NUM_TYPES_FILE_BROWSER] =
true, // Brw_ADMI_TCH_CRS
true, // Brw_ADMI_TCH_GRP
true, // Brw_ADMI_DOC_PRJ
+ true, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActSeeAdm[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -357,6 +364,7 @@ static const Act_Action_t Brw_ActSeeAdm[Brw_NUM_TYPES_FILE_BROWSER] =
ActAdmTchCrs, // Brw_ADMI_TCH_CRS
ActAdmTchGrp, // Brw_ADMI_TCH_GRP
ActAdmDocPrj, // Brw_ADMI_DOC_PRJ
+ ActAdmAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActFromSeeToAdm[Brw_NUM_TYPES_FILE_BROWSER] =
@@ -389,6 +397,7 @@ static const Act_Action_t Brw_ActFromSeeToAdm[Brw_NUM_TYPES_FILE_BROWSER] =
ActUnk, // Brw_ADMI_TCH_CRS
ActUnk, // Brw_ADMI_TCH_GRP
ActUnk, // Brw_ADMI_DOC_PRJ
+ ActUnk, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActFromAdmToSee[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -420,6 +429,7 @@ static const Act_Action_t Brw_ActFromAdmToSee[Brw_NUM_TYPES_FILE_BROWSER] =
ActUnk, // Brw_ADMI_TCH_CRS
ActUnk, // Brw_ADMI_TCH_GRP
ActUnk, // Brw_ADMI_DOC_PRJ
+ ActUnk, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActChgZone[Brw_NUM_TYPES_FILE_BROWSER] =
@@ -452,6 +462,7 @@ static const Act_Action_t Brw_ActChgZone[Brw_NUM_TYPES_FILE_BROWSER] =
ActChgToAdmTch, // Brw_ADMI_TCH_CRS
ActChgToAdmTch, // Brw_ADMI_TCH_GRP
ActUnk, // Brw_ADMI_DOC_PRJ
+ ActUnk, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActShow[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -483,6 +494,7 @@ static const Act_Action_t Brw_ActShow[Brw_NUM_TYPES_FILE_BROWSER] =
ActUnk, // Brw_ADMI_TCH_CRS
ActUnk, // Brw_ADMI_TCH_GRP
ActUnk, // Brw_ADMI_DOC_PRJ
+ ActUnk, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActHide[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -514,6 +526,7 @@ static const Act_Action_t Brw_ActHide[Brw_NUM_TYPES_FILE_BROWSER] =
ActUnk, // Brw_ADMI_TCH_CRS
ActUnk, // Brw_ADMI_TCH_GRP
ActUnk, // Brw_ADMI_DOC_PRJ
+ ActUnk, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActReqDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -545,6 +558,7 @@ static const Act_Action_t Brw_ActReqDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
ActReqDatTchCrs, // Brw_ADMI_TCH_CRS
ActReqDatTchGrp, // Brw_ADMI_TCH_GRP
ActReqDatDocPrj, // Brw_ADMI_DOC_PRJ
+ ActReqDatAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActDowFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -576,6 +590,7 @@ static const Act_Action_t Brw_ActDowFile[Brw_NUM_TYPES_FILE_BROWSER] =
ActDowTchCrs, // Brw_ADMI_TCH_CRS
ActDowTchGrp, // Brw_ADMI_TCH_GRP
ActDowDocPrj, // Brw_ADMI_DOC_PRJ
+ ActDowAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActAskRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -607,6 +622,7 @@ static const Act_Action_t Brw_ActAskRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
ActReqRemFilTchCrs, // Brw_ADMI_TCH_CRS
ActReqRemFilTchGrp, // Brw_ADMI_TCH_GRP
ActReqRemFilDocPrj, // Brw_ADMI_DOC_PRJ
+ ActReqRemFilAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -638,6 +654,7 @@ static const Act_Action_t Brw_ActRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
ActRemFilTchCrs, // Brw_ADMI_TCH_CRS
ActRemFilTchGrp, // Brw_ADMI_TCH_GRP
ActRemFilDocPrj, // Brw_ADMI_DOC_PRJ
+ ActRemFilAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActRemoveFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -669,6 +686,7 @@ static const Act_Action_t Brw_ActRemoveFolder[Brw_NUM_TYPES_FILE_BROWSER] =
ActRemFolTchCrs, // Brw_ADMI_TCH_CRS
ActRemFolTchGrp, // Brw_ADMI_TCH_GRP
ActRemFolDocPrj, // Brw_ADMI_DOC_PRJ
+ ActRemFolAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActRemoveFolderNotEmpty[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -700,6 +718,7 @@ static const Act_Action_t Brw_ActRemoveFolderNotEmpty[Brw_NUM_TYPES_FILE_BROWSER
ActRemTreTchCrs, // Brw_ADMI_TCH_CRS
ActRemTreTchGrp, // Brw_ADMI_TCH_GRP
ActRemTreDocPrj, // Brw_ADMI_DOC_PRJ
+ ActRemTreAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActCopy[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -731,6 +750,7 @@ static const Act_Action_t Brw_ActCopy[Brw_NUM_TYPES_FILE_BROWSER] =
ActCopTchCrs, // Brw_ADMI_TCH_CRS
ActCopTchGrp, // Brw_ADMI_TCH_GRP
ActCopDocPrj, // Brw_ADMI_DOC_PRJ
+ ActCopAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActPaste[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -762,6 +782,7 @@ static const Act_Action_t Brw_ActPaste[Brw_NUM_TYPES_FILE_BROWSER] =
ActPasTchCrs, // Brw_ADMI_TCH_CRS
ActPasTchGrp, // Brw_ADMI_TCH_GRP
ActPasDocPrj, // Brw_ADMI_DOC_PRJ
+ ActPasAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActFormCreate[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -793,6 +814,7 @@ static const Act_Action_t Brw_ActFormCreate[Brw_NUM_TYPES_FILE_BROWSER] =
ActFrmCreTchCrs, // Brw_ADMI_TCH_CRS
ActFrmCreTchGrp, // Brw_ADMI_TCH_GRP
ActFrmCreDocPrj, // Brw_ADMI_DOC_PRJ
+ ActFrmCreAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActCreateFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -824,6 +846,7 @@ static const Act_Action_t Brw_ActCreateFolder[Brw_NUM_TYPES_FILE_BROWSER] =
ActCreFolTchCrs, // Brw_ADMI_TCH_CRS
ActCreFolTchGrp, // Brw_ADMI_TCH_GRP
ActCreFolDocPrj, // Brw_ADMI_DOC_PRJ
+ ActCreFolAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActCreateLink[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -855,6 +878,7 @@ static const Act_Action_t Brw_ActCreateLink[Brw_NUM_TYPES_FILE_BROWSER] =
ActCreLnkTchCrs, // Brw_ADMI_TCH_CRS
ActCreLnkTchGrp, // Brw_ADMI_TCH_GRP
ActCreLnkDocPrj, // Brw_ADMI_DOC_PRJ
+ ActCreLnkAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActRenameFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -886,6 +910,7 @@ static const Act_Action_t Brw_ActRenameFolder[Brw_NUM_TYPES_FILE_BROWSER] =
ActRenFolTchCrs, // Brw_ADMI_TCH_CRS
ActRenFolTchGrp, // Brw_ADMI_TCH_GRP
ActRenFolDocPrj, // Brw_ADMI_DOC_PRJ
+ ActRenFolAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActUploadFileDropzone[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -917,6 +942,7 @@ static const Act_Action_t Brw_ActUploadFileDropzone[Brw_NUM_TYPES_FILE_BROWSER]
ActRcvFilTchCrsDZ, // Brw_ADMI_TCH_CRS
ActRcvFilTchGrpDZ, // Brw_ADMI_TCH_GRP
ActRcvFilDocPrjDZ, // Brw_ADMI_DOC_PRJ
+ ActRcvFilAssPrjDZ, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActUploadFileClassic[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -948,6 +974,7 @@ static const Act_Action_t Brw_ActUploadFileClassic[Brw_NUM_TYPES_FILE_BROWSER] =
ActRcvFilTchCrsCla, // Brw_ADMI_TCH_CRS
ActRcvFilTchGrpCla, // Brw_ADMI_TCH_GRP
ActRcvFilDocPrjCla, // Brw_ADMI_DOC_PRJ
+ ActRcvFilAssPrjCla, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActRefreshAfterUploadFiles[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -979,6 +1006,7 @@ static const Act_Action_t Brw_ActRefreshAfterUploadFiles[Brw_NUM_TYPES_FILE_BROW
ActAdmTchCrs, // Brw_ADMI_TCH_CRS
ActAdmTchGrp, // Brw_ADMI_TCH_GRP
ActAdmDocPrj, // Brw_ADMI_DOC_PRJ
+ ActAdmAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActExpandFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -1010,6 +1038,7 @@ static const Act_Action_t Brw_ActExpandFolder[Brw_NUM_TYPES_FILE_BROWSER] =
ActExpTchCrs, // Brw_ADMI_TCH_CRS
ActExpTchGrp, // Brw_ADMI_TCH_GRP
ActExpDocPrj, // Brw_ADMI_DOC_PRJ
+ ActExpAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActContractFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -1041,6 +1070,7 @@ static const Act_Action_t Brw_ActContractFolder[Brw_NUM_TYPES_FILE_BROWSER] =
ActConTchCrs, // Brw_ADMI_TCH_CRS
ActConTchGrp, // Brw_ADMI_TCH_GRP
ActConDocPrj, // Brw_ADMI_DOC_PRJ
+ ActConAssPrj, // Brw_ADMI_ASS_PRJ
};
static const Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
@@ -1072,6 +1102,7 @@ static const Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
ActChgDatTchCrs, // Brw_ADMI_TCH_CRS
ActChgDatTchGrp, // Brw_ADMI_TCH_GRP
ActChgDatDocPrj, // Brw_ADMI_DOC_PRJ
+ ActChgDatAssPrj, // Brw_ADMI_ASS_PRJ
};
/* All quotas must be multiple of 1 GiB (Gibibyte)*/
@@ -1138,6 +1169,10 @@ static const Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
#define Brw_MAX_FILES_DOC_PRJ 500
#define Brw_MAX_FOLDS_DOC_PRJ 50
+#define Brw_MAX_QUOTA_ASS_PRJ ( 1ULL*Brw_GiB)
+#define Brw_MAX_FILES_ASS_PRJ 200
+#define Brw_MAX_FOLDS_ASS_PRJ 20
+
#define Brw_MAX_QUOTA_MARKS_CRS ( 1ULL*Brw_GiB)
#define Brw_MAX_FILES_MARKS_CRS 500
#define Brw_MAX_FOLDS_MARKS_CRS 50
@@ -1675,7 +1710,10 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level);
static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level);
static bool Brw_CheckIfICanModifySharedFileOrFolder (void);
static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void);
-static bool Brw_CheckIfICanModifyProjectFileOrFolder (void);
+static bool Brw_CheckIfICanViewProjectDocuments (Prj_RoleInProject_t MyRoleInProject);
+static bool Brw_CheckIfICanViewProjectAssessment (Prj_RoleInProject_t MyRoleInProject);
+static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void);
+static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void);
static long Brw_GetPublisherOfSubtree (void);
static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row);
@@ -2172,6 +2210,29 @@ void Brw_GetParAndInitFileBrowser (void)
Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ;
break;
+ /***** Assessment of project *****/
+ case ActAdmAssPrj:
+ case ActReqRemFilAssPrj:
+ case ActRemFilAssPrj:
+ case ActRemFolAssPrj:
+ case ActCopAssPrj:
+ case ActPasAssPrj:
+ case ActRemTreAssPrj:
+ case ActFrmCreAssPrj:
+ case ActCreFolAssPrj:
+ case ActCreLnkAssPrj:
+ case ActRenFolAssPrj:
+ case ActRcvFilAssPrjDZ:
+ case ActRcvFilAssPrjCla:
+ case ActExpAssPrj:
+ case ActConAssPrj:
+ case ActZIPAssPrj:
+ case ActReqDatAssPrj:
+ case ActChgDatAssPrj:
+ case ActDowAssPrj:
+ Gbl.FileBrowser.Type = Brw_ADMI_ASS_PRJ;
+ break;
+
/***** Marks *****/
case ActSeeAdmMrk: // Access to a marks zone from menu
/* Set file browser type acording to last group accessed */
@@ -2342,6 +2403,7 @@ void Brw_GetParAndInitFileBrowser (void)
case ActCreFolWrkUsr: case ActRenFolWrkUsr:
case ActCreFolDocPrj: case ActRenFolDocPrj:
+ case ActCreFolAssPrj: case ActRenFolAssPrj:
case ActCreFolBrf: case ActRenFolBrf:
/* Get the name of the new folder */
@@ -2799,6 +2861,7 @@ static void Brw_SetPathFileBrowser (void)
}
break;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
/* Create a directory for projects inside the current course */
sprintf (Path,"%s/%s",
Gbl.CurrentCrs.PathPriv,Cfg_FOLDER_PRJ);
@@ -3207,6 +3270,11 @@ static void Brw_SetMaxQuota (void)
Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_DOC_PRJ;
Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_DOC_PRJ;
break;
+ case Brw_ADMI_ASS_PRJ:
+ Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_ASS_PRJ;
+ Gbl.FileBrowser.Size.MaxFiles = Brw_MAX_FILES_ASS_PRJ;
+ Gbl.FileBrowser.Size.MaxFolds = Brw_MAX_FOLDS_ASS_PRJ;
+ break;
case Brw_SHOW_MRK_CRS:
case Brw_ADMI_MRK_CRS:
Gbl.FileBrowser.Size.MaxQuota = Brw_MAX_QUOTA_MARKS_CRS;
@@ -3354,6 +3422,7 @@ static void Brw_ShowFileBrowserProject (void)
{
extern const char *Hlp_ASSESSMENT_Projects;
struct Project Prj;
+ Prj_RoleInProject_t MyRoleInProject;
/***** Allocate memory for the project *****/
Prj_AllocMemProject (&Prj);
@@ -3361,6 +3430,7 @@ static void Brw_ShowFileBrowserProject (void)
/***** Get project data *****/
Prj.PrjCod = Prj_GetParamPrjCod ();
Prj_GetDataOfProjectByCod (&Prj);
+ Gbl.CurrentCrs.Prjs.PrjCod = Prj.PrjCod;
/***** Start box *****/
Box_StartBox (NULL,Prj.Title,NULL,
@@ -3370,22 +3440,29 @@ static void Brw_ShowFileBrowserProject (void)
Prj_ShowOneUniqueProject (&Prj);
/***** Show project file browsers *****/
- if (Prj_CheckIfICanAdminDocsProject (Prj.PrjCod))
+ MyRoleInProject = Prj_GetMyRoleInProject (Gbl.CurrentCrs.Prjs.PrjCod);
+ if (Prj_CheckIfICanViewProjectFiles (MyRoleInProject))
{
Brw_WriteTopBeforeShowingFileBrowser ();
- /***** Show the tree with the project documents *****/
- Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ;
- Brw_InitializeFileBrowser ();
- Brw_ShowFileBrowser ();
+ if (Brw_CheckIfICanViewProjectDocuments (MyRoleInProject))
+ {
+ /***** Show the tree with the project documents *****/
+ Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ;
+ Brw_InitializeFileBrowser ();
+ Brw_ShowFileBrowser ();
+ }
- /***** Show the tree with the project assessment *****/
- Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ;
- Brw_InitializeFileBrowser ();
- Brw_ShowFileBrowser ();
+ if (Brw_CheckIfICanViewProjectAssessment (MyRoleInProject))
+ {
+ /***** Show the tree with the project assessment *****/
+ Gbl.FileBrowser.Type = Brw_ADMI_ASS_PRJ;
+ Brw_InitializeFileBrowser ();
+ Brw_ShowFileBrowser ();
+ }
}
else
- Ale_ShowAlert (Ale_WARNING,"You have no access to project documents.");
+ Ale_ShowAlert (Ale_WARNING,"You have no access to project files.");
/***** End box *****/
Box_EndBox ();
@@ -3756,6 +3833,7 @@ static void Brw_ShowFileBrowser (void)
extern const char *Txt_Works_area;
extern const char *Txt_Temporary_private_storage_area;
extern const char *Txt_Project_documents;
+ extern const char *Txt_Project_assessment;
const char *Brw_TitleOfFileBrowser[Brw_NUM_TYPES_FILE_BROWSER];
const char *Brw_HelpOfFileBrowser[Brw_NUM_TYPES_FILE_BROWSER];
@@ -3790,17 +3868,18 @@ static void Brw_ShowFileBrowser (void)
Brw_TitleOfFileBrowser[Brw_ADMI_SHR_DEG] = Txt_Shared_files_area; // Brw_ADMI_SHR_DEG
Brw_TitleOfFileBrowser[Brw_ADMI_SHR_CTR] = Txt_Shared_files_area; // Brw_ADMI_SHR_CTR
Brw_TitleOfFileBrowser[Brw_ADMI_SHR_INS] = Txt_Shared_files_area; // Brw_ADMI_SHR_INS
- Brw_TitleOfFileBrowser[Brw_ADMI_TCH_CRS] = Txt_Teachers_files_area; // Brw_ADMI_TCH_CRS
- Brw_TitleOfFileBrowser[Brw_ADMI_TCH_GRP] = Txt_Teachers_files_area; // Brw_ADMI_TCH_GRP
+ Brw_TitleOfFileBrowser[Brw_ADMI_TCH_CRS] = Txt_Teachers_files_area; // Brw_ADMI_TCH_CRS
+ Brw_TitleOfFileBrowser[Brw_ADMI_TCH_GRP] = Txt_Teachers_files_area; // Brw_ADMI_TCH_GRP
Brw_TitleOfFileBrowser[Brw_ADMI_DOC_PRJ] = Txt_Project_documents; // Brw_ADMI_DOC_PRJ
+ Brw_TitleOfFileBrowser[Brw_ADMI_ASS_PRJ] = Txt_Project_assessment; // Brw_ADMI_ASS_PRJ
/***** Set help link of file browser *****/
Brw_HelpOfFileBrowser[Brw_UNKNOWN ] = NULL; // Brw_UNKNOWN
Brw_HelpOfFileBrowser[Brw_SHOW_DOC_CRS] = Hlp_FILES_Documents; // Brw_SHOW_DOC_CRS
Brw_HelpOfFileBrowser[Brw_SHOW_MRK_CRS] = Hlp_FILES_Marks; // Brw_SHOW_MRK_CRS
Brw_HelpOfFileBrowser[Brw_ADMI_DOC_CRS] = Hlp_FILES_Documents; // Brw_ADMI_DOC_CRS
- Brw_HelpOfFileBrowser[Brw_ADMI_SHR_CRS] = Hlp_FILES_Shared; // Brw_ADMI_SHR_CRS
- Brw_HelpOfFileBrowser[Brw_ADMI_SHR_GRP] = Hlp_FILES_Shared; // Brw_ADMI_SHR_GRP
+ Brw_HelpOfFileBrowser[Brw_ADMI_SHR_CRS] = Hlp_FILES_Shared; // Brw_ADMI_SHR_CRS
+ Brw_HelpOfFileBrowser[Brw_ADMI_SHR_GRP] = Hlp_FILES_Shared; // Brw_ADMI_SHR_GRP
Brw_HelpOfFileBrowser[Brw_ADMI_WRK_USR] = Hlp_FILES_Homework_for_students; // Brw_ADMI_WRK_USR
Brw_HelpOfFileBrowser[Brw_ADMI_WRK_CRS] = Hlp_FILES_Homework_for_teachers; // Brw_ADMI_WRK_CRS
Brw_HelpOfFileBrowser[Brw_ADMI_MRK_CRS] = Hlp_FILES_Marks; // Brw_ADMI_MRK_CRS
@@ -3817,12 +3896,13 @@ static void Brw_ShowFileBrowser (void)
Brw_HelpOfFileBrowser[Brw_ADMI_DOC_CTR] = Hlp_FILES_Documents; // Brw_ADMI_DOC_CTR
Brw_HelpOfFileBrowser[Brw_SHOW_DOC_INS] = Hlp_FILES_Documents; // Brw_SHOW_DOC_INS
Brw_HelpOfFileBrowser[Brw_ADMI_DOC_INS] = Hlp_FILES_Documents; // Brw_ADMI_DOC_INS
- Brw_HelpOfFileBrowser[Brw_ADMI_SHR_DEG] = Hlp_FILES_Shared; // Brw_ADMI_SHR_DEG
- Brw_HelpOfFileBrowser[Brw_ADMI_SHR_CTR] = Hlp_FILES_Shared; // Brw_ADMI_SHR_CTR
- Brw_HelpOfFileBrowser[Brw_ADMI_SHR_INS] = Hlp_FILES_Shared; // Brw_ADMI_SHR_INS
- Brw_HelpOfFileBrowser[Brw_ADMI_TCH_CRS] = Hlp_FILES_Private; // Brw_ADMI_TCH_CRS
- Brw_HelpOfFileBrowser[Brw_ADMI_TCH_GRP] = Hlp_FILES_Private; // Brw_ADMI_TCH_GRP
+ Brw_HelpOfFileBrowser[Brw_ADMI_SHR_DEG] = Hlp_FILES_Shared; // Brw_ADMI_SHR_DEG
+ Brw_HelpOfFileBrowser[Brw_ADMI_SHR_CTR] = Hlp_FILES_Shared; // Brw_ADMI_SHR_CTR
+ Brw_HelpOfFileBrowser[Brw_ADMI_SHR_INS] = Hlp_FILES_Shared; // Brw_ADMI_SHR_INS
+ Brw_HelpOfFileBrowser[Brw_ADMI_TCH_CRS] = Hlp_FILES_Private; // Brw_ADMI_TCH_CRS
+ Brw_HelpOfFileBrowser[Brw_ADMI_TCH_GRP] = Hlp_FILES_Private; // Brw_ADMI_TCH_GRP
Brw_HelpOfFileBrowser[Brw_ADMI_DOC_PRJ] = Hlp_ASSESSMENT_Projects; // Brw_ADMI_DOC_PRJ
+ Brw_HelpOfFileBrowser[Brw_ADMI_ASS_PRJ] = Hlp_ASSESSMENT_Projects; // Brw_ADMI_ASS_PRJ
/***** Set contextual icon in box *****/
Gbl.FileBrowser.IconViewEdit = Brw_ICON_NONE;
@@ -3952,6 +4032,7 @@ static void Brw_PutIconsFileBrowser (void)
case Brw_ADMI_WRK_CRS:
case Brw_ADMI_ASG_CRS:
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
break;
default:
Brw_PutIconShowFigure ();
@@ -4149,6 +4230,7 @@ static void Brw_WriteSubtitleOfFileBrowser (void)
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_accessible_for_reading_and_writing_by_project_tutors_and_evaluators;
extern const char *Txt_nobody_else_can_access_this_content;
char Subtitle[1024];
@@ -4275,6 +4357,10 @@ static void Brw_WriteSubtitleOfFileBrowser (void)
sprintf (Subtitle,"(%s)",
Txt_accessible_for_reading_and_writing_by_project_members);
break;
+ case Brw_ADMI_ASS_PRJ:
+ sprintf (Subtitle,"(%s)",
+ Txt_accessible_for_reading_and_writing_by_project_tutors_and_evaluators);
+ break;
case Brw_ADMI_BRF_USR:
sprintf (Subtitle,"%s
(%s)",
Gbl.Usrs.Me.UsrDat.FullName,
@@ -4615,10 +4701,11 @@ void Brw_RemoveCrsFilesFromDB (long CrsCod)
/* Remove from project file zones */
sprintf (Query,"DELETE FROM file_view USING file_view,files"
- " WHERE files.FileBrowser IN (%u)"
+ " WHERE files.FileBrowser IN (%u,%u)"
" AND files.Cod IN %s"
" AND files.FilCod=file_view.FilCod",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
SubqueryPrj);
DB_QueryDELETE (Query,"can not remove file views to files of a course");
@@ -4651,9 +4738,10 @@ void Brw_RemoveCrsFilesFromDB (long CrsCod)
/* Remove from project file zones */
sprintf (Query,"DELETE LOW_PRIORITY FROM expanded_folders"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod IN %s",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
SubqueryPrj);
DB_QueryDELETE (Query,"can not remove expanded folders of a course");
@@ -4686,9 +4774,10 @@ void Brw_RemoveCrsFilesFromDB (long CrsCod)
/* Remove from project file zones */
sprintf (Query,"DELETE FROM clipboard"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod IN %s",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
SubqueryPrj);
DB_QueryDELETE (Query,"can not remove clipboards related to files of a course");
@@ -4720,9 +4809,10 @@ void Brw_RemoveCrsFilesFromDB (long CrsCod)
/* Remove from project file zones */
sprintf (Query,"DELETE FROM file_browser_last"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod IN %s",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
SubqueryPrj);
DB_QueryDELETE (Query,"can not remove file last visits to files of a course");
@@ -4753,9 +4843,10 @@ void Brw_RemoveCrsFilesFromDB (long CrsCod)
/* Remove from project file zones */
sprintf (Query,"DELETE FROM file_browser_size"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod IN %s",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
SubqueryPrj);
DB_QueryDELETE (Query,"can not remove sizes of file zones of a course");
@@ -4786,9 +4877,10 @@ void Brw_RemoveCrsFilesFromDB (long CrsCod)
/* Remove from project file zones */
sprintf (Query,"DELETE FROM files"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod IN %s",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
SubqueryPrj);
DB_QueryDELETE (Query,"can not remove files of a course");
}
@@ -4888,50 +4980,56 @@ void Brw_RemovePrjFilesFromDB (long PrjCod)
/***** Remove from database the entries that store the file views *****/
sprintf (Query,"DELETE FROM file_view USING file_view,files"
- " WHERE files.FileBrowser IN (%u)"
+ " WHERE files.FileBrowser IN (%u,%u)"
" AND files.Cod=%ld"
" AND files.FilCod=file_view.FilCod",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
PrjCod);
DB_QueryDELETE (Query,"can not remove file views to files of a project");
/***** Remove from database expanded folders *****/
sprintf (Query,"DELETE LOW_PRIORITY FROM expanded_folders"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod=%ld",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
PrjCod);
DB_QueryDELETE (Query,"can not remove expanded folders of a project");
/***** Remove from database the entries that store clipboards *****/
sprintf (Query,"DELETE FROM clipboard"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod=%ld",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
PrjCod);
DB_QueryDELETE (Query,"can not remove clipboards related to files of a project");
/***** Remove from database the entries that store the last time users visited file zones *****/
sprintf (Query,"DELETE FROM file_browser_last"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod=%ld",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
PrjCod);
DB_QueryDELETE (Query,"can not remove file last visits to files of a project");
/***** Remove from database the entries that store the sizes of the file zones *****/
sprintf (Query,"DELETE FROM file_browser_size"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod=%ld",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
PrjCod);
DB_QueryDELETE (Query,"can not remove sizes of file zones of a project");
/***** Remove from database the entries that store the data files *****/
sprintf (Query,"DELETE FROM files"
- " WHERE FileBrowser IN (%u)"
+ " WHERE FileBrowser IN (%u,%u)"
" AND Cod=%ld",
(unsigned) Brw_ADMI_DOC_PRJ,
+ (unsigned) Brw_ADMI_ASS_PRJ,
PrjCod);
DB_QueryDELETE (Query,"can not remove files of a project");
}
@@ -5206,7 +5304,14 @@ static bool Brw_GetIfGroupFileBrowser (void)
static bool Brw_GetIfProjectFileBrowser (void)
{
- return (Gbl.FileBrowser.Type == Brw_ADMI_DOC_PRJ);
+ switch (Gbl.FileBrowser.Type)
+ {
+ case Brw_ADMI_DOC_PRJ: // Project documents
+ case Brw_ADMI_ASS_PRJ: // Project assessment
+ return true;
+ default:
+ return false;
+ }
}
/*****************************************************************************/
@@ -5339,6 +5444,7 @@ static void Brw_GetAndUpdateDateLastAccFileBrowser (void)
Cod = Gbl.CurrentCrs.Grps.GrpCod;
break;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
Cod = Gbl.CurrentCrs.Prjs.PrjCod;
break;
case Brw_ADMI_BRF_USR:
@@ -7166,6 +7272,7 @@ static void Brw_WriteCurrentClipboard (void)
extern const char *Txt_assignments_area;
extern const char *Txt_works_area;
extern const char *Txt_project_documents;
+ extern const char *Txt_project_assessment;
extern const char *Txt_marks_management_area;
extern const char *Txt_temporary_private_storage_area;
extern const char *Txt_institution;
@@ -7333,13 +7440,15 @@ static void Brw_WriteCurrentClipboard (void)
Usr_UsrDataDestructor (&UsrDat);
break;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
Prj_AllocMemProject (&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,
+ Gbl.FileBrowser.Clipboard.FileBrowser == Brw_ADMI_DOC_PRJ ? Txt_project_documents :
+ Txt_project_assessment,
Txt_course,Crs.ShrtName,
Txt_project,Prj.Title);
Prj_FreeMemProject (&Prj);
@@ -7516,6 +7625,7 @@ static bool Brw_CheckIfClipboardIsInThisTree (void)
return true; // I am in the group of the clipboard
break;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
if (Gbl.FileBrowser.Clipboard.Cod == Gbl.CurrentCrs.Prjs.PrjCod)
return true; // I am in the project of the clipboard
break;
@@ -7603,6 +7713,7 @@ static long Brw_GetCodForClipboard (void)
case Brw_ADMI_MRK_GRP:
return Gbl.CurrentCrs.Grps.GrpCod;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
return Gbl.CurrentCrs.Prjs.PrjCod;
default:
return -1L;
@@ -8073,6 +8184,7 @@ static void Brw_RemoveAffectedClipboards (Brw_FileBrowser_t FileBrowser,
Gbl.CurrentCrs.Crs.CrsCod,WorksUsrCod);
break;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
sprintf (Query,"DELETE FROM clipboard"
" WHERE FileBrowser=%u AND Cod=%ld",
(unsigned) FileBrowser,
@@ -8255,6 +8367,7 @@ static void Brw_PasteClipboard (void)
Lay_ShowErrorAndExit ("The copy source does not exist.");
break;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
PrjCod = Gbl.FileBrowser.Clipboard.Cod;
Crs.CrsCod = Prj_GetCourseOfProject (PrjCod);
if (Crs_GetDataOfCourseByCod (&Crs))
@@ -10526,6 +10639,7 @@ void Brw_ChgFileMetadata (void)
case Brw_ADMI_WRK_USR:
case Brw_ADMI_WRK_CRS:
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
case Brw_ADMI_BRF_USR:
PublicFileAfterEdition = false; // Files in these zones can not be public
License = Brw_GetParLicense ();
@@ -11324,6 +11438,7 @@ long Brw_GetCodForFiles (void)
case Brw_ADMI_MRK_GRP:
return Gbl.CurrentCrs.Grps.GrpCod;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
return Gbl.CurrentCrs.Prjs.PrjCod;
default:
return -1L;
@@ -11428,6 +11543,7 @@ void Brw_GetCrsGrpFromFileMetadata (Brw_FileBrowser_t FileBrowser,long Cod,
*InsCod = Ctr.InsCod;
break;
case Brw_ADMI_DOC_PRJ:
+ case Brw_ADMI_ASS_PRJ:
/* Cod stores the project code */
*GrpCod = -1L;
*CrsCod = Crs.CrsCod = Prj_GetCourseOfProject (Cod);
@@ -11671,11 +11787,13 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level)
}
return false;
case Brw_ADMI_DOC_PRJ:
- // Check if I am the publisher of the file/folder
- return Brw_CheckIfICanModifyProjectFileOrFolder ();
+ return Brw_CheckIfICanModifyPrjDocFileOrFolder ();
+ case Brw_ADMI_ASS_PRJ:
+ return Brw_CheckIfICanModifyPrjAssFileOrFolder ();
default:
return Brw_FileBrowserIsEditable[Gbl.FileBrowser.Type];
}
+ return false;
}
/*****************************************************************************/
@@ -11754,6 +11872,7 @@ static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level)
default:
return Brw_FileBrowserIsEditable[Gbl.FileBrowser.Type];
}
+ return false;
}
/*****************************************************************************/
@@ -11780,6 +11899,7 @@ static bool Brw_CheckIfICanModifySharedFileOrFolder (void)
default:
return false;
}
+ return false;
}
static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void)
@@ -11798,8 +11918,66 @@ static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void)
default:
return false;
}
+ return false;
}
+/*****************************************************************************/
+/******** Check if I have permission to view project documents zone **********/
+/*****************************************************************************/
+
+static bool Brw_CheckIfICanViewProjectDocuments (Prj_RoleInProject_t MyRoleInProject)
+ {
+ switch (Gbl.Usrs.Me.Role.Logged)
+ {
+ case Rol_STD:
+ case Rol_NET:
+ case Rol_TCH:
+ switch (MyRoleInProject)
+ {
+ case Prj_ROLE_UNK: // I am not a member
+ return false;
+ case Prj_ROLE_STD:
+ case Prj_ROLE_TUT:
+ case Prj_ROLE_EVA:
+ return true;
+ }
+ break;
+ case Rol_SYS_ADM:
+ return true;
+ default:
+ return false;
+ }
+ return false;
+ }
+
+/*****************************************************************************/
+/******** Check if I have permission to view project assessment zone *********/
+/*****************************************************************************/
+
+static bool Brw_CheckIfICanViewProjectAssessment (Prj_RoleInProject_t MyRoleInProject)
+ {
+ switch (Gbl.Usrs.Me.Role.Logged)
+ {
+ case Rol_STD:
+ case Rol_NET:
+ case Rol_TCH:
+ switch (MyRoleInProject)
+ {
+ case Prj_ROLE_UNK: // I am not a member
+ case Prj_ROLE_STD: // Students can not view or edit project assessment
+ return false;
+ case Prj_ROLE_TUT:
+ case Prj_ROLE_EVA:
+ return true;
+ }
+ break;
+ case Rol_SYS_ADM:
+ return true;
+ default:
+ return false;
+ }
+ return false;
+ }
/*****************************************************************************/
/********** Check if I have permission to modify a file or folder ************/
@@ -11809,17 +11987,14 @@ static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void)
// 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)
+static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (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_STD:
+ case Rol_NET:
case Rol_TCH:
- MyRoleInProject = Prj_GetMyRoleInProject (Gbl.CurrentCrs.Prjs.PrjCod);
- switch (MyRoleInProject)
+ switch (Prj_GetMyRoleInProject (Gbl.CurrentCrs.Prjs.PrjCod))
{
case Prj_ROLE_UNK: // I am not a member
return false;
@@ -11828,12 +12003,46 @@ static bool Brw_CheckIfICanModifyProjectFileOrFolder (void)
case Prj_ROLE_EVA:
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree?
}
- return false;
+ break;
case Rol_SYS_ADM:
return true;
default:
return false;
}
+ return false;
+ }
+
+/*****************************************************************************/
+/********** Check if I have permission to modify a file or folder ************/
+/********** in the current project assessment 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_CheckIfICanModifyPrjAssFileOrFolder (void)
+ {
+ switch (Gbl.Usrs.Me.Role.Logged)
+ {
+ case Rol_STD:
+ case Rol_NET:
+ case Rol_TCH:
+ switch (Prj_GetMyRoleInProject (Gbl.CurrentCrs.Prjs.PrjCod))
+ {
+ case Prj_ROLE_UNK: // I am not a member
+ case Prj_ROLE_STD: // Students can not view or edit project assessment
+ return false;
+ case Prj_ROLE_TUT:
+ case Prj_ROLE_EVA:
+ return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_GetPublisherOfSubtree ()); // Am I the publisher of subtree?
+ }
+ break;
+ case Rol_SYS_ADM:
+ return true;
+ default:
+ return false;
+ }
+ return false;
}
/*****************************************************************************/
@@ -12160,6 +12369,7 @@ static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row)
extern const char *Txt_Assignments_area;
extern const char *Txt_Works_area;
extern const char *Txt_Project_documents;
+ extern const char *Txt_Project_assessment;
extern const char *Txt_Marks_area;
extern const char *Txt_Temporary_private_storage_area;
extern const char *Txt_Go_to_X;
@@ -12317,6 +12527,9 @@ static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row)
case Brw_ADMI_DOC_PRJ:
Title = Txt_Project_documents;
break;
+ case Brw_ADMI_ASS_PRJ:
+ Title = Txt_Project_assessment;
+ break;
case Brw_ADMI_MRK_CRS:
case Brw_ADMI_MRK_GRP:
Title = Txt_Marks_area;
diff --git a/swad_file_browser.h b/swad_file_browser.h
index aa22c59a6..500a2339b 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 28
+#define Brw_NUM_TYPES_FILE_BROWSER 29
// The following types are stored in several database tables as numeric fields,
// so don't change numbers!
typedef enum
@@ -72,6 +72,7 @@ typedef enum
Brw_ADMI_TCH_CRS = 25,
Brw_ADMI_TCH_GRP = 26,
Brw_ADMI_DOC_PRJ = 27,
+ Brw_ADMI_ASS_PRJ = 28,
} Brw_FileBrowser_t;
// The following types are stored in files and clipboard tables as numeric fields, so don't change numbers!
@@ -155,7 +156,7 @@ struct FileMetadata
#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_PROJECT_DOCUMENTS "doc"
-#define Brw_INTERNAL_NAME_ROOT_FOLDER_PROJECT_ASSESSMENT "ass" // For future use
+#define Brw_INTERNAL_NAME_ROOT_FOLDER_PROJECT_ASSESSMENT "ass"
#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.c b/swad_global.c
index 10c03beba..9af024b04 100644
--- a/swad_global.c
+++ b/swad_global.c
@@ -464,6 +464,7 @@ void Gbl_InitializeGlobals (void)
Usr_FlushCacheUsrHasAcceptedInCurrentCrs ();
Usr_FlushCacheUsrSharesAnyOfMyCrs ();
Rol_FlushCacheRoleUsrInCrs ();
+ Prj_FlushCacheMyRoleInProject ();
Grp_FlushCacheIBelongToGrp ();
Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs ();
}
diff --git a/swad_global.h b/swad_global.h
index 1bdb59408..e58c3d4e9 100644
--- a/swad_global.h
+++ b/swad_global.h
@@ -856,6 +856,11 @@ struct Globals
long CrsCod;
Rol_Role_t Role;
} RoleUsrInCrs;
+ struct
+ {
+ long PrjCod;
+ Prj_RoleInProject_t RoleInProject;
+ } MyRoleInProject;
} Cache;
};
diff --git a/swad_layout.c b/swad_layout.c
index 1dac81ebb..04d31119f 100644
--- a/swad_layout.c
+++ b/swad_layout.c
@@ -222,6 +222,7 @@ void Lay_WriteStartOfPage (void)
case ActFrmCreWrkUsr: // Brw_ADMI_WRK_USR
case ActFrmCreWrkCrs: // Brw_ADMI_WRK_CRS
case ActFrmCreDocPrj: // Brw_ADMI_DOC_PRJ
+ case ActFrmCreAssPrj: // Brw_ADMI_ASS_PRJ
case ActFrmCreMrkCrs: // Brw_ADMI_MRK_CRS
case ActFrmCreMrkGrp: // Brw_ADMI_MRK_GRP
case ActFrmCreBrf: // Brw_ADMI_BRF_USR
@@ -596,6 +597,7 @@ static void Lay_WriteScripts (void)
case ActFrmCreWrkUsr: // Brw_ADMI_WRK_USR
case ActFrmCreWrkCrs: // Brw_ADMI_WRK_CRS
case ActFrmCreDocPrj: // Brw_ADMI_DOC_PRJ
+ case ActFrmCreAssPrj: // Brw_ADMI_ASS_PRJ
case ActFrmCreMrkCrs: // Brw_ADMI_MRK_CRS
case ActFrmCreMrkGrp: // Brw_ADMI_MRK_GRP
case ActFrmCreBrf: // Brw_ADMI_BRF_USR
diff --git a/swad_project.c b/swad_project.c
index d3996ed74..76d140bee 100644
--- a/swad_project.c
+++ b/swad_project.c
@@ -124,6 +124,8 @@ static void Prj_ShowTableAllProjectsMembersWithARole (const struct Project *Prj,
static unsigned Prj_GetUsrsInPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,
MYSQL_RES **mysql_res);
+static Prj_RoleInProject_t Prj_ConvertUnsignedStrToRoleInProject (const char *UnsignedStr);
+
static void Prj_ReqAnotherUsrID (Prj_RoleInProject_t RoleInProject);
static void Prj_AddUsrToProject (Prj_RoleInProject_t RoleInProject);
static void Prj_ReqRemUsrFromPrj (Prj_RoleInProject_t RoleInProject);
@@ -132,11 +134,9 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInProject);
static void Prj_GetParamPrjOrder (void);
static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden,
- bool ICanAdminDocsProject);
+ bool ICanViewProjectFiles);
static bool Prj_CheckIfICanEditProject (long PrjCod);
-static bool Prj_GetIfIAmMemberOfProject (long PrjCod);
-static bool Prj_GetIfIAmTutorInProject (long PrjCod);
static void Prj_PutParams (void);
static void Prj_GetDataOfProject (struct Project *Prj,const char *Query);
@@ -607,7 +607,7 @@ void Prj_PrintOneProject (void)
static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectView)
{
extern const char *Txt_Today;
- extern const char *Txt_Project_documents;
+ extern const char *Txt_Project_files;
extern const char *Txt_Preassigned_QUESTION;
extern const char *Txt_Yes;
extern const char *Txt_No;
@@ -620,7 +620,7 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
extern const char *Txt_Required_knowledge;
extern const char *Txt_Required_materials;
static unsigned UniqueId = 0;
- bool ICanAdminDocsProject = Prj_CheckIfICanAdminDocsProject (Prj->PrjCod);
+ bool ICanViewProjectFiles = Prj_CheckIfICanViewProjectFiles (Prj_GetMyRoleInProject (Prj->PrjCod));
/***** Write first row of data of this project *****/
/* Forms to remove/edit this project */
@@ -634,7 +634,7 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
case Prj_FILE_BROWSER_PROJECT:
fprintf (Gbl.F.Out,"\">");
Prj_PutFormsToRemEditOnePrj (Prj->PrjCod,Prj->Hidden,
- ICanAdminDocsProject);
+ ICanViewProjectFiles);
break;
default:
fprintf (Gbl.F.Out,"\">");
@@ -681,11 +681,11 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
if (ProjectView == Prj_LIST_PROJECTS)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">");
- if (ICanAdminDocsProject)
+ if (ICanViewProjectFiles)
{
Act_FormStart (ActAdmDocPrj);
Prj_PutParams ();
- Act_LinkFormSubmit (Txt_Project_documents,
+ Act_LinkFormSubmit (Txt_Project_files,
Prj->Hidden ? "ASG_TITLE_LIGHT" :
"ASG_TITLE",
NULL);
@@ -1410,28 +1410,57 @@ static unsigned Prj_GetUsrsInPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,
/************************** Get my role in a project *************************/
/*****************************************************************************/
+void Prj_FlushCacheMyRoleInProject (void)
+ {
+ Gbl.Cache.MyRoleInProject.PrjCod = -1L;
+ Gbl.Cache.MyRoleInProject.RoleInProject = Prj_ROLE_UNK;
+ }
+
Prj_RoleInProject_t Prj_GetMyRoleInProject (long PrjCod)
{
- char Query[128];
+ char Query[256];
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);
+ /***** 1. Fast check: trivial cases *****/
+ if (Gbl.Usrs.Me.UsrDat.UsrCod <= 0 ||
+ PrjCod <= 0)
+ return Prj_ROLE_UNK;
+
+ /***** 2. Fast check: Is my role in project already calculated *****/
+ if (PrjCod == Gbl.Cache.MyRoleInProject.PrjCod)
+ return Gbl.Cache.MyRoleInProject.RoleInProject;
+
+ /***** 3. Slow check: Get my role in project from database.
+ The result of the query will have one row or none *****/
+ Gbl.Cache.MyRoleInProject.PrjCod = PrjCod;
+ Gbl.Cache.MyRoleInProject.RoleInProject = Prj_ROLE_UNK;
+ sprintf (Query,"SELECT RoleInProject FROM prj_usr"
+ " WHERE PrjCod=%ld AND UsrCod=%ld",
+ PrjCod,Gbl.Usrs.Me.UsrDat.UsrCod);
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;
+ Gbl.Cache.MyRoleInProject.RoleInProject = Prj_ConvertUnsignedStrToRoleInProject (row[0]);
}
-
- /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
- return RoleInProject;
+ return Gbl.Cache.MyRoleInProject.RoleInProject;
+ }
+
+/*****************************************************************************/
+/********************** Get role from unsigned string ************************/
+/*****************************************************************************/
+
+static Prj_RoleInProject_t Prj_ConvertUnsignedStrToRoleInProject (const char *UnsignedStr)
+ {
+ unsigned UnsignedNum;
+
+ if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1)
+ if (UnsignedNum < Prj_NUM_ROLES_IN_PROJECT)
+ return (Prj_RoleInProject_t) UnsignedNum;
+
+ return Prj_ROLE_UNK;
}
/*****************************************************************************/
@@ -1540,6 +1569,10 @@ static void Prj_AddUsrToProject (Prj_RoleInProject_t RoleInProject)
PrjCod,(unsigned) RoleInProject,Gbl.Usrs.Other.UsrDat.UsrCod);
DB_QueryREPLACE (Query,"can not add user to project");
+ /***** Flush cache *****/
+ if (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // It's me
+ Prj_FlushCacheMyRoleInProject ();
+
/* Show success alert */
sprintf (Gbl.Alert.Txt,Txt_THE_USER_X_has_been_enroled_as_a_Y_in_the_project,
Gbl.Usrs.Other.UsrDat.FullName,
@@ -1703,6 +1736,10 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInProject)
Gbl.Usrs.Other.UsrDat.UsrCod);
DB_QueryDELETE (Query,"can not remove a user from a project");
+ /***** Flush cache *****/
+ if (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // It's me
+ Prj_FlushCacheMyRoleInProject ();
+
/***** Show success alert *****/
sprintf (Gbl.Alert.Txt,Txt_THE_USER_X_has_been_removed_as_a_Y_from_the_project_Z,
Gbl.Usrs.Other.UsrDat.FullName,
@@ -1750,7 +1787,7 @@ void Prj_PutHiddenParamPrjOrder (void)
/*****************************************************************************/
static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden,
- bool ICanAdminDocsProject)
+ bool ICanViewProjectFiles)
{
Gbl.Prjs.PrjCodToEdit = PrjCod; // Used as parameter in contextual links
@@ -1770,7 +1807,7 @@ static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden,
}
/***** Put form to admin project documents *****/
- if (ICanAdminDocsProject)
+ if (ICanViewProjectFiles)
Ico_PutContextualIconToViewFiles (ActAdmDocPrj,Prj_PutParams);
/***** Put form to print project *****/
@@ -1778,17 +1815,26 @@ static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden,
}
/*****************************************************************************/
-/***************** Can I admin documents of a given project? *****************/
+/******************** Can I view files of a given project? *******************/
/*****************************************************************************/
-bool Prj_CheckIfICanAdminDocsProject (long PrjCod)
+bool Prj_CheckIfICanViewProjectFiles (Prj_RoleInProject_t MyRoleInProject)
{
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
case Rol_NET:
case Rol_TCH:
- return Prj_GetIfIAmMemberOfProject (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 true;
+ }
+ return false;
case Rol_SYS_ADM:
return true;
default:
@@ -1805,7 +1851,7 @@ static bool Prj_CheckIfICanEditProject (long PrjCod)
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_NET:
- return Prj_GetIfIAmTutorInProject (PrjCod);
+ return (Prj_GetMyRoleInProject (PrjCod) == Prj_ROLE_TUT);
case Rol_TCH:
case Rol_SYS_ADM:
return true;
@@ -1814,34 +1860,6 @@ static bool Prj_CheckIfICanEditProject (long PrjCod)
}
}
-/*****************************************************************************/
-/*********************** Am I member of a given project? *********************/
-/*****************************************************************************/
-
-static bool Prj_GetIfIAmMemberOfProject (long PrjCod)
- {
- char Query[256];
-
- sprintf (Query,"SELECT COUNT(*) FROM prj_usr"
- " WHERE PrjCod=%ld AND UsrCod=%ld",
- PrjCod,Gbl.Usrs.Me.UsrDat.UsrCod);
- return (bool) (DB_QueryCOUNT (Query,"can not check if I am a member of a project") != 0);
- }
-
-/*****************************************************************************/
-/*********************** Am I tutor in a given project? **********************/
-/*****************************************************************************/
-
-static bool Prj_GetIfIAmTutorInProject (long PrjCod)
- {
- char Query[256];
-
- sprintf (Query,"SELECT COUNT(*) FROM prj_usr"
- " WHERE PrjCod=%ld AND RoleInProject=%u AND UsrCod=%ld",
- PrjCod,Prj_ROLE_TUT,Gbl.Usrs.Me.UsrDat.UsrCod);
- return (bool) (DB_QueryCOUNT (Query,"can not check if I am a tutor in a project") != 0);
- }
-
/*****************************************************************************/
/********************** Params used to edit a project ************************/
/*****************************************************************************/
@@ -2310,6 +2328,9 @@ void Prj_RemoveProject (void)
Prj.PrjCod,Gbl.CurrentCrs.Crs.CrsCod);
DB_QueryDELETE (Query,"can not remove project");
+ /***** Flush cache *****/
+ Prj_FlushCacheMyRoleInProject ();
+
/***** Remove project *****/
sprintf (Query,"DELETE FROM projects"
" WHERE PrjCod=%ld AND CrsCod=%ld",
@@ -2912,6 +2933,9 @@ static void Prj_CreateProject (struct Project *Prj)
(unsigned) Prj_ROLE_TUT,
Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryINSERT (Query,"can not add tutor");
+
+ /***** Flush cache *****/
+ Prj_FlushCacheMyRoleInProject ();
}
/*****************************************************************************/
@@ -2967,6 +2991,9 @@ void Prj_RemoveCrsProjects (long CrsCod)
CrsCod);
DB_QueryDELETE (Query,"can not remove all the projects of a course");
+ /***** Flush cache *****/
+ Prj_FlushCacheMyRoleInProject ();
+
/***** Remove projects *****/
sprintf (Query,"DELETE FROM projects WHERE CrsCod=%ld",CrsCod);
DB_QueryDELETE (Query,"can not remove all the projects of a course");
@@ -2983,6 +3010,10 @@ void Prj_RemoveUsrFromProjects (long UsrCod)
/***** Remove user from projects *****/
sprintf (Query,"DELETE FROM prj_usr WHERE UsrCod=%ld",UsrCod);
DB_QueryDELETE (Query,"can not remove user from projects");
+
+ /***** Flush cache *****/
+ if (UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // It's me
+ Prj_FlushCacheMyRoleInProject ();
}
/*****************************************************************************/
diff --git a/swad_project.h b/swad_project.h
index 7bf5298b4..dc2e35454 100644
--- a/swad_project.h
+++ b/swad_project.h
@@ -115,6 +115,7 @@ void Prj_ShowOneUniqueProject (struct Project *Prj);
void Prj_PrintOneProject (void);
+void Prj_FlushCacheMyRoleInProject (void);
Prj_RoleInProject_t Prj_GetMyRoleInProject (long PrjCod);
void Prj_ReqAddStd (void);
@@ -135,7 +136,7 @@ void Prj_RemEva (void);
void Prj_PutHiddenParamPrjOrder (void);
-bool Prj_CheckIfICanAdminDocsProject (long PrjCod);
+bool Prj_CheckIfICanViewProjectFiles (Prj_RoleInProject_t MyRoleInProject);
void Prj_RequestCreatePrj (void);
void Prj_RequestEditPrj (void);
diff --git a/swad_text.c b/swad_text.c
index 51cbe4f8a..ea5cb8613 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -1733,7 +1733,7 @@ const char *Txt_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";
+ "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
@@ -1744,6 +1744,27 @@ const char *Txt_accessible_for_reading_and_writing_by_project_members =
"acessível para leitura e escrita por membros do projeto";
#endif
+const char *Txt_accessible_for_reading_and_writing_by_project_tutors_and_evaluators =
+#if L==1
+ "accessible per a lectura i escriptura per tutors i avaluadors del projecte";
+#elif L==2
+ "zugänglich zum Lesen und Schreiben für Tutoren und Auswerter der Projekt";
+#elif L==3
+ "accessible for reading and writing by project tutors and evaluators";
+#elif L==4
+ "accesible para lectura y escritura por tutores y evaluadores del proyecto";
+#elif L==5
+ "accessible pour la lecture et l'écriture par tuteurs et évaluateurs du projet";
+#elif L==6
+ "accesible para lectura y escritura por tutores y evaluadores del proyecto"; // Okoteve traducción
+#elif L==7
+ "accessibile per la lettura e la scrittura da parte dei precettori e dei valutatori del progetto";
+#elif L==8
+ "dostępne do czytania i pisania przez nauczyciele i ewaluatorów projektu";
+#elif L==9
+ "acessível para leitura e escrita por tutores e avaliadores 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";
@@ -30831,6 +30852,48 @@ const char *Txt_project =
"projeto";
#endif
+const char *Txt_Project_assessment =
+#if L==1
+ "Avaluació del projecte";
+#elif L==2
+ "Projektbewertung";
+#elif L==3
+ "Project assessment";
+#elif L==4
+ "Evaluación del proyecto";
+#elif L==5
+ "Évaluation du project";
+#elif L==6
+ "Evaluación del proyecto"; // Okoteve traducción
+#elif L==7
+ "Valutazione di progetto";
+#elif L==8
+ "Ocena projektowe";
+#elif L==9
+ "Avaliação do projeto";
+#endif
+
+const char *Txt_project_assessment =
+#if L==1
+ "avaluació del projecte";
+#elif L==2
+ "Projektbewertung";
+#elif L==3
+ "project assessment";
+#elif L==4
+ "evaluación del proyecto";
+#elif L==5
+ "évaluation du project";
+#elif L==6
+ "evaluación del proyecto"; // Okoteve traducción
+#elif L==7
+ "valutazione di progetto";
+#elif L==8
+ "ocena projektowe";
+#elif L==9
+ "avaliação do projeto";
+#endif
+
const char *Txt_Project_documents =
#if L==1
"Documents del projecte";
@@ -30873,6 +30936,27 @@ const char *Txt_project_documents =
"documentos do projeto";
#endif
+const char *Txt_Project_files =
+#if L==1
+ "Fitxers del projecte";
+#elif L==2
+ "Projektdateien";
+#elif L==3
+ "Project files";
+#elif L==4
+ "Archivos del proyecto";
+#elif L==5
+ "Fichiers du project";
+#elif L==6
+ "Archivos del proyecto"; // Okoteve traducción
+#elif L==7
+ "File di progetto";
+#elif L==8
+ "Pliki projektowe";
+#elif L==9
+ "Arquivos 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.";
@@ -38080,6 +38164,27 @@ const char *Txt_ROOT_FOLDER_EXTERNAL_NAMES[Brw_NUM_TYPES_FILE_BROWSER] =
"dokumenty"
#elif L==9
"documentos"
+#endif
+ ,
+ // Brw_ADMI_ASS_PRJ
+#if L==1
+ "avaluacio"
+#elif L==2
+ "Bewertung"
+#elif L==3
+ "assessment"
+#elif L==4
+ "evaluacion"
+#elif L==5
+ "evaluation"
+#elif L==6
+ "mbohepy"
+#elif L==7
+ "valutazione"
+#elif L==8
+ "ocena"
+#elif L==9
+ "avaliacao"
#endif
};
diff --git a/swad_zip.c b/swad_zip.c
index 79f744a2b..3128f4e8c 100644
--- a/swad_zip.c
+++ b/swad_zip.c
@@ -84,6 +84,7 @@ const Act_Action_t ZIP_ActZIPFolder[Brw_NUM_TYPES_FILE_BROWSER] =
ActZIPTchCrs, // Brw_ADMI_TCH_CRS
ActZIPTchGrp, // Brw_ADMI_TCH_GRP
ActZIPDocPrj, // Brw_ADMI_DOC_PRJ
+ ActZIPAssPrj, // Brw_ADMI_ASS_PRJ
};
/*****************************************************************************/