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