diff --git a/sql/swad.sql b/sql/swad.sql index 0acc2bf1..e13a9be7 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -1206,9 +1206,6 @@ CREATE TABLE IF NOT EXISTS prg_resources ( -- CREATE TABLE IF NOT EXISTS prj_config ( CrsCod INT NOT NULL DEFAULT -1, - RubTutCod INT NOT NULL DEFAULT -1, - RubEvlCod INT NOT NULL DEFAULT -1, - RubGblCod INT NOT NULL DEFAULT -1, NETCanCreate ENUM('N','Y') NOT NULL DEFAULT 'Y', UNIQUE INDEX(CrsCod)); -- @@ -1240,6 +1237,22 @@ CREATE TABLE IF NOT EXISTS prj_projects ( INDEX(CrsCod,DptCod), INDEX(CrsCod,ReviewStatus)); -- +-- Table prj_rubrics: stores the rubrics for each project +-- +CREATE TABLE IF NOT EXISTS prj_rubrics ( + CrsCod INT NOT NULL, + Type ENUM('tut','evl','gbl') NOT NULL, + RubCod INT NOT NULL, + UNIQUE INDEX(CrsCod,Type,RubCod)); +-- +-- Table prj_scores: stores the rubric criteria scores for each project +-- +CREATE TABLE IF NOT EXISTS prj_scores ( + PrjCod INT NOT NULL, + CriCod INT NOT NULL, + Score DOUBLE PRECISION NOT NULL DEFAULT 0, + UNIQUE INDEX(PrjCod,CriCod)); +-- -- Table prj_users: stores the users inside projects -- CREATE TABLE IF NOT EXISTS prj_users ( diff --git a/swad_action_list.c b/swad_action_list.c index 71501e0f..9ef94c08 100644 --- a/swad_action_list.c +++ b/swad_action_list.c @@ -647,6 +647,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] = [ActRemStdPrj ] = {1693,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_RemStd ,NULL}, [ActRemTutPrj ] = {1694,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_RemTut ,NULL}, [ActRemEvlPrj ] = {1695,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_RemEvl ,NULL}, + [ActChgPrjSco ] = {1974,-1,TabUnk,ActSeeAllPrj ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_ChangeCriterionScore ,NULL}, [ActReqLnkPrj ] = {1948,-1,TabUnk,ActSeeAllPrj ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,PrjRsc_GetLinkToProject ,NULL}, [ActAdmDocPrj ] = {1697,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_ShowFileBrowserOrWorks ,NULL}, @@ -3866,4 +3867,5 @@ Act_Action_t ActLst_FromActCodToAction[1 + ActLst_MAX_ACTION_COD] = // Do not re ActRemRscCli_InPrg, // #1971 ActSeeRscCli_InRub, // #1972 ActRemRscCli_InRub, // #1973 + ActChgPrjSco, // #1974 }; diff --git a/swad_action_list.h b/swad_action_list.h index c321da24..0809f509 100644 --- a/swad_action_list.h +++ b/swad_action_list.h @@ -573,216 +573,217 @@ #define ActRemStdPrj (ActChgCrsTT1stDay + 50) #define ActRemTutPrj (ActChgCrsTT1stDay + 51) #define ActRemEvlPrj (ActChgCrsTT1stDay + 52) -#define ActReqLnkPrj (ActChgCrsTT1stDay + 53) +#define ActChgPrjSco (ActChgCrsTT1stDay + 53) +#define ActReqLnkPrj (ActChgCrsTT1stDay + 54) -#define ActAdmDocPrj (ActChgCrsTT1stDay + 54) -#define ActReqRemFilDocPrj (ActChgCrsTT1stDay + 55) -#define ActRemFilDocPrj (ActChgCrsTT1stDay + 56) -#define ActRemFolDocPrj (ActChgCrsTT1stDay + 57) -#define ActCopDocPrj (ActChgCrsTT1stDay + 58) -#define ActPasDocPrj (ActChgCrsTT1stDay + 59) -#define ActRemTreDocPrj (ActChgCrsTT1stDay + 60) -#define ActFrmCreDocPrj (ActChgCrsTT1stDay + 61) -#define ActCreFolDocPrj (ActChgCrsTT1stDay + 62) -#define ActCreLnkDocPrj (ActChgCrsTT1stDay + 63) -#define ActRenFolDocPrj (ActChgCrsTT1stDay + 64) -#define ActRcvFilDocPrjDZ (ActChgCrsTT1stDay + 65) -#define ActRcvFilDocPrjCla (ActChgCrsTT1stDay + 66) -#define ActExpDocPrj (ActChgCrsTT1stDay + 67) -#define ActConDocPrj (ActChgCrsTT1stDay + 68) -#define ActZIPDocPrj (ActChgCrsTT1stDay + 69) -#define ActReqDatDocPrj (ActChgCrsTT1stDay + 70) -#define ActChgDatDocPrj (ActChgCrsTT1stDay + 71) -#define ActDowDocPrj (ActChgCrsTT1stDay + 72) +#define ActAdmDocPrj (ActChgCrsTT1stDay + 55) +#define ActReqRemFilDocPrj (ActChgCrsTT1stDay + 56) +#define ActRemFilDocPrj (ActChgCrsTT1stDay + 57) +#define ActRemFolDocPrj (ActChgCrsTT1stDay + 58) +#define ActCopDocPrj (ActChgCrsTT1stDay + 59) +#define ActPasDocPrj (ActChgCrsTT1stDay + 60) +#define ActRemTreDocPrj (ActChgCrsTT1stDay + 61) +#define ActFrmCreDocPrj (ActChgCrsTT1stDay + 62) +#define ActCreFolDocPrj (ActChgCrsTT1stDay + 63) +#define ActCreLnkDocPrj (ActChgCrsTT1stDay + 64) +#define ActRenFolDocPrj (ActChgCrsTT1stDay + 65) +#define ActRcvFilDocPrjDZ (ActChgCrsTT1stDay + 66) +#define ActRcvFilDocPrjCla (ActChgCrsTT1stDay + 67) +#define ActExpDocPrj (ActChgCrsTT1stDay + 68) +#define ActConDocPrj (ActChgCrsTT1stDay + 69) +#define ActZIPDocPrj (ActChgCrsTT1stDay + 70) +#define ActReqDatDocPrj (ActChgCrsTT1stDay + 71) +#define ActChgDatDocPrj (ActChgCrsTT1stDay + 72) +#define ActDowDocPrj (ActChgCrsTT1stDay + 73) -#define ActAdmAssPrj (ActChgCrsTT1stDay + 73) -#define ActReqRemFilAssPrj (ActChgCrsTT1stDay + 74) -#define ActRemFilAssPrj (ActChgCrsTT1stDay + 75) -#define ActRemFolAssPrj (ActChgCrsTT1stDay + 76) -#define ActCopAssPrj (ActChgCrsTT1stDay + 77) -#define ActPasAssPrj (ActChgCrsTT1stDay + 78) -#define ActRemTreAssPrj (ActChgCrsTT1stDay + 79) -#define ActFrmCreAssPrj (ActChgCrsTT1stDay + 80) -#define ActCreFolAssPrj (ActChgCrsTT1stDay + 81) -#define ActCreLnkAssPrj (ActChgCrsTT1stDay + 82) -#define ActRenFolAssPrj (ActChgCrsTT1stDay + 83) -#define ActRcvFilAssPrjDZ (ActChgCrsTT1stDay + 84) -#define ActRcvFilAssPrjCla (ActChgCrsTT1stDay + 85) -#define ActExpAssPrj (ActChgCrsTT1stDay + 86) -#define ActConAssPrj (ActChgCrsTT1stDay + 87) -#define ActZIPAssPrj (ActChgCrsTT1stDay + 88) -#define ActReqDatAssPrj (ActChgCrsTT1stDay + 89) -#define ActChgDatAssPrj (ActChgCrsTT1stDay + 90) -#define ActDowAssPrj (ActChgCrsTT1stDay + 91) +#define ActAdmAssPrj (ActChgCrsTT1stDay + 74) +#define ActReqRemFilAssPrj (ActChgCrsTT1stDay + 75) +#define ActRemFilAssPrj (ActChgCrsTT1stDay + 76) +#define ActRemFolAssPrj (ActChgCrsTT1stDay + 77) +#define ActCopAssPrj (ActChgCrsTT1stDay + 78) +#define ActPasAssPrj (ActChgCrsTT1stDay + 79) +#define ActRemTreAssPrj (ActChgCrsTT1stDay + 80) +#define ActFrmCreAssPrj (ActChgCrsTT1stDay + 81) +#define ActCreFolAssPrj (ActChgCrsTT1stDay + 82) +#define ActCreLnkAssPrj (ActChgCrsTT1stDay + 83) +#define ActRenFolAssPrj (ActChgCrsTT1stDay + 84) +#define ActRcvFilAssPrjDZ (ActChgCrsTT1stDay + 85) +#define ActRcvFilAssPrjCla (ActChgCrsTT1stDay + 86) +#define ActExpAssPrj (ActChgCrsTT1stDay + 87) +#define ActConAssPrj (ActChgCrsTT1stDay + 88) +#define ActZIPAssPrj (ActChgCrsTT1stDay + 89) +#define ActReqDatAssPrj (ActChgCrsTT1stDay + 90) +#define ActChgDatAssPrj (ActChgCrsTT1stDay + 91) +#define ActDowAssPrj (ActChgCrsTT1stDay + 92) -#define ActSeeOneCfe (ActChgCrsTT1stDay + 92) -#define ActSeeDatCfe (ActChgCrsTT1stDay + 93) -#define ActEdiCfe (ActChgCrsTT1stDay + 94) -#define ActRcvCfe (ActChgCrsTT1stDay + 95) -#define ActPrnCfe (ActChgCrsTT1stDay + 96) -#define ActReqRemCfe (ActChgCrsTT1stDay + 97) -#define ActRemCfe (ActChgCrsTT1stDay + 98) -#define ActHidCfe (ActChgCrsTT1stDay + 99) -#define ActUnhCfe (ActChgCrsTT1stDay + 100) -#define ActReqLnkCfe (ActChgCrsTT1stDay + 101) +#define ActSeeOneCfe (ActChgCrsTT1stDay + 93) +#define ActSeeDatCfe (ActChgCrsTT1stDay + 94) +#define ActEdiCfe (ActChgCrsTT1stDay + 95) +#define ActRcvCfe (ActChgCrsTT1stDay + 96) +#define ActPrnCfe (ActChgCrsTT1stDay + 97) +#define ActReqRemCfe (ActChgCrsTT1stDay + 98) +#define ActRemCfe (ActChgCrsTT1stDay + 99) +#define ActHidCfe (ActChgCrsTT1stDay + 100) +#define ActUnhCfe (ActChgCrsTT1stDay + 101) +#define ActReqLnkCfe (ActChgCrsTT1stDay + 102) -#define ActEdiOneTstQst (ActChgCrsTT1stDay + 102) -#define ActReqImpTstQst (ActChgCrsTT1stDay + 103) -#define ActImpTstQst (ActChgCrsTT1stDay + 104) -#define ActLstTstQst (ActChgCrsTT1stDay + 105) -#define ActRcvTstQst (ActChgCrsTT1stDay + 106) -#define ActReqRemSevTstQst (ActChgCrsTT1stDay + 107) -#define ActRemSevTstQst (ActChgCrsTT1stDay + 108) -#define ActReqRemOneTstQst (ActChgCrsTT1stDay + 109) -#define ActRemOneTstQst (ActChgCrsTT1stDay + 110) -#define ActChgShfTstQst (ActChgCrsTT1stDay + 111) +#define ActEdiOneTstQst (ActChgCrsTT1stDay + 103) +#define ActReqImpTstQst (ActChgCrsTT1stDay + 104) +#define ActImpTstQst (ActChgCrsTT1stDay + 105) +#define ActLstTstQst (ActChgCrsTT1stDay + 106) +#define ActRcvTstQst (ActChgCrsTT1stDay + 107) +#define ActReqRemSevTstQst (ActChgCrsTT1stDay + 108) +#define ActRemSevTstQst (ActChgCrsTT1stDay + 109) +#define ActReqRemOneTstQst (ActChgCrsTT1stDay + 110) +#define ActRemOneTstQst (ActChgCrsTT1stDay + 111) +#define ActChgShfTstQst (ActChgCrsTT1stDay + 112) -#define ActEdiTag (ActChgCrsTT1stDay + 112) -#define ActEnaTag (ActChgCrsTT1stDay + 113) -#define ActDisTag (ActChgCrsTT1stDay + 114) -#define ActRenTag (ActChgCrsTT1stDay + 115) +#define ActEdiTag (ActChgCrsTT1stDay + 113) +#define ActEnaTag (ActChgCrsTT1stDay + 114) +#define ActDisTag (ActChgCrsTT1stDay + 115) +#define ActRenTag (ActChgCrsTT1stDay + 116) -#define ActSeeTst (ActChgCrsTT1stDay + 116) -#define ActReqAssTst (ActChgCrsTT1stDay + 117) -#define ActAssTst (ActChgCrsTT1stDay + 118) -#define ActCfgTst (ActChgCrsTT1stDay + 119) -#define ActRcvCfgTst (ActChgCrsTT1stDay + 120) +#define ActSeeTst (ActChgCrsTT1stDay + 117) +#define ActReqAssTst (ActChgCrsTT1stDay + 118) +#define ActAssTst (ActChgCrsTT1stDay + 119) +#define ActCfgTst (ActChgCrsTT1stDay + 120) +#define ActRcvCfgTst (ActChgCrsTT1stDay + 121) -#define ActReqSeeMyTstRes (ActChgCrsTT1stDay + 121) -#define ActSeeMyTstResCrs (ActChgCrsTT1stDay + 122) -#define ActSeeOneTstResMe (ActChgCrsTT1stDay + 123) -#define ActReqSeeUsrTstRes (ActChgCrsTT1stDay + 124) -#define ActSeeUsrTstResCrs (ActChgCrsTT1stDay + 125) -#define ActSeeOneTstResOth (ActChgCrsTT1stDay + 126) +#define ActReqSeeMyTstRes (ActChgCrsTT1stDay + 122) +#define ActSeeMyTstResCrs (ActChgCrsTT1stDay + 123) +#define ActSeeOneTstResMe (ActChgCrsTT1stDay + 124) +#define ActReqSeeUsrTstRes (ActChgCrsTT1stDay + 125) +#define ActSeeUsrTstResCrs (ActChgCrsTT1stDay + 126) +#define ActSeeOneTstResOth (ActChgCrsTT1stDay + 127) -#define ActSeeOneExa (ActChgCrsTT1stDay + 127) +#define ActSeeOneExa (ActChgCrsTT1stDay + 128) -#define ActFrmNewExa (ActChgCrsTT1stDay + 128) -#define ActEdiOneExa (ActChgCrsTT1stDay + 129) -#define ActNewExa (ActChgCrsTT1stDay + 130) -#define ActChgExa (ActChgCrsTT1stDay + 131) -#define ActReqRemExa (ActChgCrsTT1stDay + 132) -#define ActRemExa (ActChgCrsTT1stDay + 133) -#define ActHidExa (ActChgCrsTT1stDay + 134) -#define ActUnhExa (ActChgCrsTT1stDay + 135) -#define ActReqLnkExa (ActChgCrsTT1stDay + 136) +#define ActFrmNewExa (ActChgCrsTT1stDay + 129) +#define ActEdiOneExa (ActChgCrsTT1stDay + 130) +#define ActNewExa (ActChgCrsTT1stDay + 131) +#define ActChgExa (ActChgCrsTT1stDay + 132) +#define ActReqRemExa (ActChgCrsTT1stDay + 133) +#define ActRemExa (ActChgCrsTT1stDay + 134) +#define ActHidExa (ActChgCrsTT1stDay + 135) +#define ActUnhExa (ActChgCrsTT1stDay + 136) +#define ActReqLnkExa (ActChgCrsTT1stDay + 137) -#define ActFrmNewExaSet (ActChgCrsTT1stDay + 137) -#define ActNewExaSet (ActChgCrsTT1stDay + 138) -#define ActReqRemExaSet (ActChgCrsTT1stDay + 139) -#define ActRemExaSet (ActChgCrsTT1stDay + 140) -#define ActUp_ExaSet (ActChgCrsTT1stDay + 141) -#define ActDwnExaSet (ActChgCrsTT1stDay + 142) -#define ActChgTitExaSet (ActChgCrsTT1stDay + 143) -#define ActChgNumQstExaSet (ActChgCrsTT1stDay + 144) +#define ActFrmNewExaSet (ActChgCrsTT1stDay + 138) +#define ActNewExaSet (ActChgCrsTT1stDay + 139) +#define ActReqRemExaSet (ActChgCrsTT1stDay + 140) +#define ActRemExaSet (ActChgCrsTT1stDay + 141) +#define ActUp_ExaSet (ActChgCrsTT1stDay + 142) +#define ActDwnExaSet (ActChgCrsTT1stDay + 143) +#define ActChgTitExaSet (ActChgCrsTT1stDay + 144) +#define ActChgNumQstExaSet (ActChgCrsTT1stDay + 145) -#define ActReqAddQstExaSet (ActChgCrsTT1stDay + 145) -#define ActLstTstQstForSet (ActChgCrsTT1stDay + 146) -#define ActAddQstToExa (ActChgCrsTT1stDay + 147) -#define ActReqRemSetQst (ActChgCrsTT1stDay + 148) -#define ActRemExaQst (ActChgCrsTT1stDay + 149) -#define ActValSetQst (ActChgCrsTT1stDay + 150) -#define ActInvSetQst (ActChgCrsTT1stDay + 151) +#define ActReqAddQstExaSet (ActChgCrsTT1stDay + 146) +#define ActLstTstQstForSet (ActChgCrsTT1stDay + 147) +#define ActAddQstToExa (ActChgCrsTT1stDay + 148) +#define ActReqRemSetQst (ActChgCrsTT1stDay + 149) +#define ActRemExaQst (ActChgCrsTT1stDay + 150) +#define ActValSetQst (ActChgCrsTT1stDay + 151) +#define ActInvSetQst (ActChgCrsTT1stDay + 152) -#define ActReqNewExaSes (ActChgCrsTT1stDay + 152) -#define ActEdiOneExaSes (ActChgCrsTT1stDay + 153) -#define ActNewExaSes (ActChgCrsTT1stDay + 154) -#define ActChgExaSes (ActChgCrsTT1stDay + 155) -#define ActReqRemExaSes (ActChgCrsTT1stDay + 156) -#define ActRemExaSes (ActChgCrsTT1stDay + 157) -#define ActHidExaSes (ActChgCrsTT1stDay + 158) -#define ActUnhExaSes (ActChgCrsTT1stDay + 159) +#define ActReqNewExaSes (ActChgCrsTT1stDay + 153) +#define ActEdiOneExaSes (ActChgCrsTT1stDay + 154) +#define ActNewExaSes (ActChgCrsTT1stDay + 155) +#define ActChgExaSes (ActChgCrsTT1stDay + 156) +#define ActReqRemExaSes (ActChgCrsTT1stDay + 157) +#define ActRemExaSes (ActChgCrsTT1stDay + 158) +#define ActHidExaSes (ActChgCrsTT1stDay + 159) +#define ActUnhExaSes (ActChgCrsTT1stDay + 160) -#define ActSeeExaPrn (ActChgCrsTT1stDay + 160) -#define ActAnsExaPrn (ActChgCrsTT1stDay + 161) -#define ActEndExaPrn (ActChgCrsTT1stDay + 162) +#define ActSeeExaPrn (ActChgCrsTT1stDay + 161) +#define ActAnsExaPrn (ActChgCrsTT1stDay + 162) +#define ActEndExaPrn (ActChgCrsTT1stDay + 163) -#define ActSeeMyExaResCrs (ActChgCrsTT1stDay + 163) -#define ActSeeMyExaResExa (ActChgCrsTT1stDay + 164) -#define ActSeeMyExaResSes (ActChgCrsTT1stDay + 165) -#define ActSeeOneExaResMe (ActChgCrsTT1stDay + 166) -#define ActReqSeeUsrExaRes (ActChgCrsTT1stDay + 167) -#define ActSeeUsrExaResCrs (ActChgCrsTT1stDay + 168) -#define ActSeeUsrExaResExa (ActChgCrsTT1stDay + 169) -#define ActSeeUsrExaResSes (ActChgCrsTT1stDay + 170) -#define ActSeeOneExaResOth (ActChgCrsTT1stDay + 171) -#define ActChgVisExaRes (ActChgCrsTT1stDay + 172) +#define ActSeeMyExaResCrs (ActChgCrsTT1stDay + 164) +#define ActSeeMyExaResExa (ActChgCrsTT1stDay + 165) +#define ActSeeMyExaResSes (ActChgCrsTT1stDay + 166) +#define ActSeeOneExaResMe (ActChgCrsTT1stDay + 167) +#define ActReqSeeUsrExaRes (ActChgCrsTT1stDay + 168) +#define ActSeeUsrExaResCrs (ActChgCrsTT1stDay + 169) +#define ActSeeUsrExaResExa (ActChgCrsTT1stDay + 170) +#define ActSeeUsrExaResSes (ActChgCrsTT1stDay + 171) +#define ActSeeOneExaResOth (ActChgCrsTT1stDay + 172) +#define ActChgVisExaRes (ActChgCrsTT1stDay + 173) -#define ActSeeOneGam (ActChgCrsTT1stDay + 173) -#define ActReqRemMch (ActChgCrsTT1stDay + 174) -#define ActRemMch (ActChgCrsTT1stDay + 175) -#define ActEdiMch (ActChgCrsTT1stDay + 176) -#define ActChgMch (ActChgCrsTT1stDay + 177) -#define ActReqNewMch (ActChgCrsTT1stDay + 178) -#define ActNewMch (ActChgCrsTT1stDay + 179) -#define ActResMch (ActChgCrsTT1stDay + 180) -#define ActBckMch (ActChgCrsTT1stDay + 181) -#define ActPlyPauMch (ActChgCrsTT1stDay + 182) -#define ActFwdMch (ActChgCrsTT1stDay + 183) -#define ActChgNumColMch (ActChgCrsTT1stDay + 184) -#define ActChgVisResMchQst (ActChgCrsTT1stDay + 185) -#define ActMchCntDwn (ActChgCrsTT1stDay + 186) -#define ActRefMchTch (ActChgCrsTT1stDay + 187) +#define ActSeeOneGam (ActChgCrsTT1stDay + 174) +#define ActReqRemMch (ActChgCrsTT1stDay + 175) +#define ActRemMch (ActChgCrsTT1stDay + 176) +#define ActEdiMch (ActChgCrsTT1stDay + 177) +#define ActChgMch (ActChgCrsTT1stDay + 178) +#define ActReqNewMch (ActChgCrsTT1stDay + 179) +#define ActNewMch (ActChgCrsTT1stDay + 180) +#define ActResMch (ActChgCrsTT1stDay + 181) +#define ActBckMch (ActChgCrsTT1stDay + 182) +#define ActPlyPauMch (ActChgCrsTT1stDay + 183) +#define ActFwdMch (ActChgCrsTT1stDay + 184) +#define ActChgNumColMch (ActChgCrsTT1stDay + 185) +#define ActChgVisResMchQst (ActChgCrsTT1stDay + 186) +#define ActMchCntDwn (ActChgCrsTT1stDay + 187) +#define ActRefMchTch (ActChgCrsTT1stDay + 188) -#define ActJoiMch (ActChgCrsTT1stDay + 188) -#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 189) -#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 190) -#define ActAnsMchQstStd (ActChgCrsTT1stDay + 191) -#define ActRefMchStd (ActChgCrsTT1stDay + 192) +#define ActJoiMch (ActChgCrsTT1stDay + 189) +#define ActSeeMchAnsQstStd (ActChgCrsTT1stDay + 190) +#define ActRemMchAnsQstStd (ActChgCrsTT1stDay + 191) +#define ActAnsMchQstStd (ActChgCrsTT1stDay + 192) +#define ActRefMchStd (ActChgCrsTT1stDay + 193) -#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 193) -#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 194) -#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 195) -#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 196) +#define ActSeeMyMchResCrs (ActChgCrsTT1stDay + 194) +#define ActSeeMyMchResGam (ActChgCrsTT1stDay + 195) +#define ActSeeMyMchResMch (ActChgCrsTT1stDay + 196) +#define ActSeeOneMchResMe (ActChgCrsTT1stDay + 197) -#define ActReqSeeUsrMchRes (ActChgCrsTT1stDay + 197) -#define ActSeeUsrMchResCrs (ActChgCrsTT1stDay + 198) -#define ActSeeUsrMchResGam (ActChgCrsTT1stDay + 199) -#define ActSeeUsrMchResMch (ActChgCrsTT1stDay + 200) -#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 201) +#define ActReqSeeUsrMchRes (ActChgCrsTT1stDay + 198) +#define ActSeeUsrMchResCrs (ActChgCrsTT1stDay + 199) +#define ActSeeUsrMchResGam (ActChgCrsTT1stDay + 200) +#define ActSeeUsrMchResMch (ActChgCrsTT1stDay + 201) +#define ActSeeOneMchResOth (ActChgCrsTT1stDay + 202) -#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 202) +#define ActChgVisResMchUsr (ActChgCrsTT1stDay + 203) -#define ActLstOneGam (ActChgCrsTT1stDay + 203) +#define ActLstOneGam (ActChgCrsTT1stDay + 204) -#define ActFrmNewGam (ActChgCrsTT1stDay + 204) -#define ActEdiOneGam (ActChgCrsTT1stDay + 205) -#define ActNewGam (ActChgCrsTT1stDay + 206) -#define ActChgGam (ActChgCrsTT1stDay + 207) -#define ActReqRemGam (ActChgCrsTT1stDay + 208) -#define ActRemGam (ActChgCrsTT1stDay + 209) -#define ActHidGam (ActChgCrsTT1stDay + 210) -#define ActUnhGam (ActChgCrsTT1stDay + 211) -#define ActAddOneGamQst (ActChgCrsTT1stDay + 212) -#define ActGamLstTstQst (ActChgCrsTT1stDay + 213) -#define ActAddTstQstToGam (ActChgCrsTT1stDay + 214) -#define ActReqRemGamQst (ActChgCrsTT1stDay + 215) -#define ActRemGamQst (ActChgCrsTT1stDay + 216) -#define ActUp_GamQst (ActChgCrsTT1stDay + 217) -#define ActDwnGamQst (ActChgCrsTT1stDay + 218) -#define ActReqLnkGam (ActChgCrsTT1stDay + 219) +#define ActFrmNewGam (ActChgCrsTT1stDay + 205) +#define ActEdiOneGam (ActChgCrsTT1stDay + 206) +#define ActNewGam (ActChgCrsTT1stDay + 207) +#define ActChgGam (ActChgCrsTT1stDay + 208) +#define ActReqRemGam (ActChgCrsTT1stDay + 209) +#define ActRemGam (ActChgCrsTT1stDay + 210) +#define ActHidGam (ActChgCrsTT1stDay + 211) +#define ActUnhGam (ActChgCrsTT1stDay + 212) +#define ActAddOneGamQst (ActChgCrsTT1stDay + 213) +#define ActGamLstTstQst (ActChgCrsTT1stDay + 214) +#define ActAddTstQstToGam (ActChgCrsTT1stDay + 215) +#define ActReqRemGamQst (ActChgCrsTT1stDay + 216) +#define ActRemGamQst (ActChgCrsTT1stDay + 217) +#define ActUp_GamQst (ActChgCrsTT1stDay + 218) +#define ActDwnGamQst (ActChgCrsTT1stDay + 219) +#define ActReqLnkGam (ActChgCrsTT1stDay + 220) -#define ActSeeOneRub (ActChgCrsTT1stDay + 220) -#define ActFrmNewRub (ActChgCrsTT1stDay + 221) -#define ActEdiOneRub (ActChgCrsTT1stDay + 222) -#define ActNewRub (ActChgCrsTT1stDay + 223) -#define ActChgRub (ActChgCrsTT1stDay + 224) -#define ActReqRemRub (ActChgCrsTT1stDay + 225) -#define ActRemRub (ActChgCrsTT1stDay + 226) -#define ActReqLnkRub (ActChgCrsTT1stDay + 227) +#define ActSeeOneRub (ActChgCrsTT1stDay + 221) +#define ActFrmNewRub (ActChgCrsTT1stDay + 222) +#define ActEdiOneRub (ActChgCrsTT1stDay + 223) +#define ActNewRub (ActChgCrsTT1stDay + 224) +#define ActChgRub (ActChgCrsTT1stDay + 225) +#define ActReqRemRub (ActChgCrsTT1stDay + 226) +#define ActRemRub (ActChgCrsTT1stDay + 227) +#define ActReqLnkRub (ActChgCrsTT1stDay + 228) -#define ActSeeRscCli_InRub (ActChgCrsTT1stDay + 228) -#define ActRemRscCli_InRub (ActChgCrsTT1stDay + 229) -#define ActNewRubCri (ActChgCrsTT1stDay + 230) -#define ActReqRemRubCri (ActChgCrsTT1stDay + 231) -#define ActRemRubCri (ActChgCrsTT1stDay + 232) -#define ActUp_RubCri (ActChgCrsTT1stDay + 233) -#define ActDwnRubCri (ActChgCrsTT1stDay + 234) -#define ActChgTitRubCri (ActChgCrsTT1stDay + 235) -#define ActChgLnkRubCri (ActChgCrsTT1stDay + 236) -#define ActChgMinRubCri (ActChgCrsTT1stDay + 237) -#define ActChgMaxRubCri (ActChgCrsTT1stDay + 238) -#define ActChgWeiRubCri (ActChgCrsTT1stDay + 239) +#define ActSeeRscCli_InRub (ActChgCrsTT1stDay + 229) +#define ActRemRscCli_InRub (ActChgCrsTT1stDay + 230) +#define ActNewRubCri (ActChgCrsTT1stDay + 231) +#define ActReqRemRubCri (ActChgCrsTT1stDay + 232) +#define ActRemRubCri (ActChgCrsTT1stDay + 233) +#define ActUp_RubCri (ActChgCrsTT1stDay + 234) +#define ActDwnRubCri (ActChgCrsTT1stDay + 235) +#define ActChgTitRubCri (ActChgCrsTT1stDay + 236) +#define ActChgLnkRubCri (ActChgCrsTT1stDay + 237) +#define ActChgMinRubCri (ActChgCrsTT1stDay + 238) +#define ActChgMaxRubCri (ActChgCrsTT1stDay + 239) +#define ActChgWeiRubCri (ActChgCrsTT1stDay + 240) /*****************************************************************************/ /******************************** Files tab **********************************/ @@ -1778,7 +1779,7 @@ #define ActLst_NUM_ACTIONS (ActChgMyTT1stDay + 1) -#define ActLst_MAX_ACTION_COD 1973 +#define ActLst_MAX_ACTION_COD 1974 #define ActLst_DEFAULT_ACTION_AFTER_LOGIN ActSeeGblTL diff --git a/swad_changelog.h b/swad_changelog.h index c015a358..49e46de2 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -629,10 +629,19 @@ TODO: Emilce Barrera Mesa: Podr TODO: Emilce Barrera Mesa: Mis estudiantes presentan muchas dificultades a la hora de poner la foto porque la plataforma es muy exigente respecto al fondo de la imagen. */ -#define Log_PLATFORM_VERSION "SWAD 22.103 (2023-04-25)" +#define Log_PLATFORM_VERSION "SWAD 22.104 (2023-05-03)" #define CSS_FILE "swad22.103.css" #define JS_FILE "swad22.49.js" /* + Version 22.104: May 03, 2023 Rubrics in project. Not finished. (? lines) + 3 changes necessary in database: +CREATE TABLE IF NOT EXISTS prj_rubrics (CrsCod INT NOT NULL,Type ENUM('tut','evl','gbl') NOT NULL,RubCod INT NOT NULL,UNIQUE INDEX(CrsCod,Type,RubCod)); +CREATE TABLE IF NOT EXISTS prj_scores (PrjCod INT NOT NULL,CriCod INT NOT NULL,Score DOUBLE PRECISION NOT NULL DEFAULT 0,UNIQUE INDEX(PrjCod,CriCod)); +ALTER TABLE prj_config DROP COLUMN RubTutCod,DROP COLUMN RubEvlCod,DROP COLUMN RubGblCod; + If you want to use MyISAM: +ALTER TABLE prj_rubrics ENGINE=MyISAM; +ALTER TABLE prj_scores ENGINE=MyISAM; + Version 22.103: Apr 25, 2023 Fixed issue in list of rubric criteria. (337537 lines) Version 22.102.3: Apr 21, 2023 Changes in exams. (337538 lines) Version 22.102.2: Apr 21, 2023 Changes in games. (337454 lines) diff --git a/swad_database.c b/swad_database.c index be1f68ed..4fc7acd4 100644 --- a/swad_database.c +++ b/swad_database.c @@ -2558,18 +2558,12 @@ mysql> DESCRIBE prj_config; | Field | Type | Null | Key | Default | Extra | +--------------+---------------+------+-----+---------+-------+ | CrsCod | int | NO | PRI | -1 | | -| RubTutCod | int | NO | | -1 | | -| RubEvlCod | int | NO | | -1 | | -| RubGblCod | int | NO | | -1 | | | NETCanCreate | enum('N','Y') | NO | | Y | | +--------------+---------------+------+-----+---------+-------+ -5 rows in set (0,00 sec) +2 rows in set (0,00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS prj_config (" "CrsCod INT NOT NULL DEFAULT -1," - "RubTutCod INT NOT NULL DEFAULT -1," - "RubEvlCod INT NOT NULL DEFAULT -1," - "RubGblCod INT NOT NULL DEFAULT -1," "NETCanCreate ENUM('N','Y') NOT NULL DEFAULT 'Y'," "UNIQUE INDEX(CrsCod))"); @@ -2647,6 +2641,42 @@ mysql> DESCRIBE prj_reviews; "INDEX(PrjCod,ReviewTime)," "INDEX(PrjCod,Result))"); + /***** Table prj_rubrics *****/ +/* +mysql> DESCRIBE prj_rubrics; ++--------+-------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------+-------------------------+------+-----+---------+-------+ +| CrsCod | int | NO | PRI | NULL | | +| Type | enum('tut','evl','gbl') | NO | PRI | NULL | | +| RubCod | int | NO | PRI | NULL | | ++--------+-------------------------+------+-----+---------+-------+ +3 rows in set (0,00 sec) +*/ + DB_CreateTable ("CREATE TABLE IF NOT EXISTS prj_rubrics (" + "CrsCod INT NOT NULL," + "Type ENUM('tut','evl','gbl') NOT NULL," + "RubCod INT NOT NULL," + "UNIQUE INDEX(CrsCod,Type,RubCod))"); + + /***** Table prj_scores *****/ +/* +mysql> DESCRIBE prj_scores; ++--------+--------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------+--------+------+-----+---------+-------+ +| PrjCod | int | NO | PRI | NULL | | +| CriCod | int | NO | PRI | NULL | | +| Score | double | NO | | 0 | | ++--------+--------+------+-----+---------+-------+ +3 rows in set (0,00 sec) +*/ + DB_CreateTable ("CREATE TABLE IF NOT EXISTS prj_scores (" + "PrjCod INT NOT NULL," + "CriCod INT NOT NULL," + "Score DOUBLE PRECISION NOT NULL DEFAULT 0," + "UNIQUE INDEX(PrjCod,CriCod))"); + /***** Table prj_users *****/ /* mysql> DESCRIBE prj_users; @@ -4112,7 +4142,7 @@ double DB_QuerySELECTDouble (const char *MsgError, va_list ap; int NumBytesPrinted; char *Query; - double DoubleNum = 0.0; + double DoubleNum = 0.0; // Default value /***** Create query string *****/ va_start (ap,fmt); diff --git a/swad_info.c b/swad_info.c index 4fb78097..4aef4494 100644 --- a/swad_info.c +++ b/swad_info.c @@ -1227,7 +1227,7 @@ static void Inf_AsignInfoType (struct Inf_Info *Info, Inf_Src_t Inf_GetInfoSrcFromForm (void) { /***** Get info source for a specific type of course information - (introduction, teaching guide, bibliography, FAQ, links or evaluation) *****/ + (introduction, teaching guide, bibliography, FAQ, links or assessment) *****/ return (Inf_Src_t) Par_GetParUnsignedLong ("InfoSrc", 0, @@ -1355,7 +1355,7 @@ void Inf_GetInfoTxtFromDB (long CrsCod,Inf_Type_t InfoType, MYSQL_ROW row; /***** Get info source for a specific type of course information - (bibliography, FAQ, links or evaluation) from database *****/ + (bibliography, FAQ, links or assessment) from database *****/ if (Inf_DB_GetInfoTxt (&mysql_res,CrsCod,InfoType) == 1) { /* Get info text */ diff --git a/swad_pagination.c b/swad_pagination.c index 93466aa7..92ea8b0d 100644 --- a/swad_pagination.c +++ b/swad_pagination.c @@ -186,9 +186,9 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate, case Pag_PROJECTS: Frm_BeginFormAnchor (ActSeeAllPrj,Pagination->Anchor); Prj_PutPars (&((struct Prj_Projects *) Context)->Filter, - ((struct Prj_Projects *) Context)->SelectedOrder, - 1, - Cod); + ((struct Prj_Projects *) Context)->SelectedOrder, + 1, + Cod); break; case Pag_EXAMS: Frm_BeginFormAnchor (ActSeeAllExa,Pagination->Anchor); @@ -313,9 +313,9 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate, case Pag_PROJECTS: Frm_BeginFormAnchor (ActSeeAllPrj,Pagination->Anchor); Prj_PutPars (&((struct Prj_Projects *) Context)->Filter, - ((struct Prj_Projects *) Context)->SelectedOrder, - 1, - Cod); + ((struct Prj_Projects *) Context)->SelectedOrder, + 1, + Cod); break; case Pag_EXAMS: Frm_BeginFormAnchor (ActSeeAllExa,Pagination->Anchor); @@ -433,9 +433,9 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate, case Pag_PROJECTS: Frm_BeginFormAnchor (ActSeeAllPrj,Pagination->Anchor); Prj_PutPars (&((struct Prj_Projects *) Context)->Filter, - ((struct Prj_Projects *) Context)->SelectedOrder, - Pagination->LeftPage, - Cod); + ((struct Prj_Projects *) Context)->SelectedOrder, + Pagination->LeftPage, + Cod); break; case Pag_EXAMS: Frm_BeginFormAnchor (ActSeeAllExa,Pagination->Anchor); @@ -566,9 +566,9 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate, case Pag_PROJECTS: Frm_BeginFormAnchor (ActSeeAllPrj,Pagination->Anchor); Prj_PutPars (&((struct Prj_Projects *) Context)->Filter, - ((struct Prj_Projects *) Context)->SelectedOrder, - NumPage, - Cod); + ((struct Prj_Projects *) Context)->SelectedOrder, + NumPage, + Cod); break; case Pag_EXAMS: Frm_BeginFormAnchor (ActSeeAllExa,Pagination->Anchor); @@ -685,9 +685,9 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate, case Pag_PROJECTS: Frm_BeginFormAnchor (ActSeeAllPrj,Pagination->Anchor); Prj_PutPars (&((struct Prj_Projects *) Context)->Filter, - ((struct Prj_Projects *) Context)->SelectedOrder, - Pagination->RightPage, - Cod); + ((struct Prj_Projects *) Context)->SelectedOrder, + Pagination->RightPage, + Cod); break; case Pag_EXAMS: Frm_BeginFormAnchor (ActSeeAllExa,Pagination->Anchor); @@ -805,9 +805,9 @@ void Pag_WriteLinksToPages (Pag_WhatPaginate_t WhatPaginate, case Pag_PROJECTS: Frm_BeginFormAnchor (ActSeeAllPrj,Pagination->Anchor); Prj_PutPars (&((struct Prj_Projects *) Context)->Filter, - ((struct Prj_Projects *) Context)->SelectedOrder, - Pagination->NumPags, - Cod); + ((struct Prj_Projects *) Context)->SelectedOrder, + Pagination->NumPags, + Cod); break; case Pag_EXAMS: Frm_BeginFormAnchor (ActSeeAllExa,Pagination->Anchor); diff --git a/swad_project.c b/swad_project.c index 45914012..7e349595 100644 --- a/swad_project.c +++ b/swad_project.c @@ -55,6 +55,9 @@ #include "swad_project_config.h" #include "swad_project_database.h" #include "swad_role.h" +#include "swad_rubric.h" +#include "swad_rubric_criteria.h" +#include "swad_rubric_database.h" #include "swad_setting.h" #include "swad_string.h" @@ -188,7 +191,6 @@ static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects); static bool Prj_CheckIfICanViewProjectFiles (long PrjCod); -static void Prj_PutCurrentPars (void *Projects); static void Prj_PutParAssign (unsigned Assign); static void Prj_PutParHidden (unsigned Hidden); static void Prj_PutParFaulti (unsigned Faulti); @@ -310,7 +312,7 @@ static void Prj_PutIconOffLockedUnlocked (const struct Prj_Project *Prj); static Prj_ReviewStatus_t Prj_GetParReviewStatus (void); //------------------------------- Rubrics ------------------------------------- -static void Prj_ShowRubrics (long PrjCod); +static void Prj_ShowRubrics (struct Prj_Projects *Projects); static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_Rubric_t WhichRubric); static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_Rubric_t WhichRubric); @@ -642,9 +644,9 @@ static void Prj_ShowFormToFilterByMy_All (const struct Prj_Projects *Projects) Filter.Review = Projects->Filter.Review; Filter.DptCod = Projects->Filter.DptCod; Prj_PutPars (&Filter, - Projects->SelectedOrder, - Projects->CurrentPage, - -1L); + Projects->SelectedOrder, + Projects->CurrentPage, + -1L); Usr_PutWhoIcon (Who); Frm_EndForm (); Set_EndPref (); @@ -676,9 +678,9 @@ static void Prj_ShowFormToFilterByAssign (const struct Prj_Projects *Projects) Filter.Review = Projects->Filter.Review; Filter.DptCod = Projects->Filter.DptCod; Prj_PutPars (&Filter, - Projects->SelectedOrder, - Projects->CurrentPage, - -1L); + Projects->SelectedOrder, + Projects->CurrentPage, + -1L); Ico_PutSettingIconLink (AssignedNonassigIcon[Assign],Ico_BLACK, Txt_PROJECT_ASSIGNED_NONASSIGNED_PLURAL[Assign]); Frm_EndForm (); @@ -720,9 +722,9 @@ static void Prj_ShowFormToFilterByHidden (const struct Prj_Projects *Projects) Filter.Review = Projects->Filter.Review; Filter.DptCod = Projects->Filter.DptCod; Prj_PutPars (&Filter, - Projects->SelectedOrder, - Projects->CurrentPage, - -1L); + Projects->SelectedOrder, + Projects->CurrentPage, + -1L); Ico_PutSettingIconLink (HiddenVisiblIcon[HidVis].Icon, HiddenVisiblIcon[HidVis].Color, Txt_PROJECT_HIDDEN_VISIBL_PROJECTS[HidVis]); @@ -765,9 +767,9 @@ static void Prj_ShowFormToFilterByWarning (const struct Prj_Projects *Projects) Filter.Review = Projects->Filter.Review; Filter.DptCod = Projects->Filter.DptCod; Prj_PutPars (&Filter, - Projects->SelectedOrder, - Projects->CurrentPage, - -1L); + Projects->SelectedOrder, + Projects->CurrentPage, + -1L); Ico_PutSettingIconLink (FaultinessIcon[Faultiness].Icon, FaultinessIcon[Faultiness].Color, Txt_PROJECT_FAULTY_FAULTLESS_PROJECTS[Faultiness]); @@ -801,9 +803,9 @@ static void Prj_ShowFormToFilterByReview (const struct Prj_Projects *Projects) Filter.Review = Projects->Filter.Review ^ (1 << ReviewStatus); // Toggle Filter.DptCod = Projects->Filter.DptCod; Prj_PutPars (&Filter, - Projects->SelectedOrder, - Projects->CurrentPage, - -1L); + Projects->SelectedOrder, + Projects->CurrentPage, + -1L); Ico_PutSettingIconLink (ReviewIcon[ReviewStatus].Icon, ReviewIcon[ReviewStatus].Color, Txt_PROJECT_REVIEW_PLURAL[ReviewStatus]); @@ -833,9 +835,9 @@ static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects) Filter.Review = Projects->Filter.Review; Filter.DptCod = Prj_FILTER_DPT_DEFAULT; // Do not put department parameter here Prj_PutPars (&Filter, - Projects->SelectedOrder, - Projects->CurrentPage, - -1L); + Projects->SelectedOrder, + Projects->CurrentPage, + -1L); /***** Write selector with departments *****/ if (asprintf (&SelectClass,"TITLE_DESCRIPTION_WIDTH INPUT_%s", @@ -919,7 +921,7 @@ bool Prj_CheckIfICanViewProjectAssessment (long PrjCod) /********************** Put parameters used in projects **********************/ /*****************************************************************************/ -static void Prj_PutCurrentPars (void *Projects) +void Prj_PutCurrentPars (void *Projects) { if (Projects) Prj_PutPars (&((struct Prj_Projects *) Projects)->Filter, @@ -933,9 +935,9 @@ static void Prj_PutCurrentPars (void *Projects) Each parameter is passed only if its value is distinct to default. */ void Prj_PutPars (struct Prj_Filter *Filter, - Prj_Order_t Order, - unsigned NumPage, - long PrjCod) + Prj_Order_t Order, + unsigned NumPage, + long PrjCod) { /***** Put filter parameters (which projects to show) *****/ if (Filter->Who != Prj_FILTER_WHO_DEFAULT) @@ -1357,7 +1359,7 @@ void Prj_ShowBoxWithOneProject (struct Prj_Projects *Projects) Brw_ShowFileBrowserProject (Projects->Prj.PrjCod); /***** Show project rubrics *****/ - Prj_ShowRubrics (Projects->Prj.PrjCod); + Prj_ShowRubrics (Projects); /***** End box *****/ Box_BoxEnd (); @@ -3324,8 +3326,8 @@ static void Prj_GetListProjects (struct Prj_Projects *Projects) void Prj_GetProjectDataByCod (struct Prj_Project *Prj) { - extern const char *Prj_Proposal_DB[Prj_NUM_PROPOSAL_TYPES]; - extern const char *Prj_ReviewStatus_DB[Prj_NUM_REVIEW_STATUS]; + extern const char *Prj_DB_Proposal[Prj_NUM_PROPOSAL_TYPES]; + extern const char *Prj_DB_ReviewStatus[Prj_NUM_REVIEW_STATUS]; MYSQL_RES *mysql_res; MYSQL_ROW row; Prj_Proposal_t Proposal; @@ -3367,7 +3369,7 @@ void Prj_GetProjectDataByCod (struct Prj_Project *Prj) for (Proposal = (Prj_Proposal_t) 0; Proposal <= (Prj_Proposal_t) (Prj_NUM_PROPOSAL_TYPES - 1); Proposal++) - if (!strcmp (Prj_Proposal_DB[Proposal],row[7])) + if (!strcmp (Prj_DB_Proposal[Proposal],row[7])) { Prj->Proposal = Proposal; break; @@ -3392,7 +3394,7 @@ void Prj_GetProjectDataByCod (struct Prj_Project *Prj) for (ReviewStatus = (Prj_ReviewStatus_t) 0; ReviewStatus <= (Prj_ReviewStatus_t) (Prj_NUM_REVIEW_STATUS - 1); ReviewStatus++) - if (!strcmp (Prj_ReviewStatus_DB[ReviewStatus],row[15])) + if (!strcmp (Prj_DB_ReviewStatus[ReviewStatus],row[15])) { Prj->Review.Status = ReviewStatus; break; @@ -4473,11 +4475,12 @@ static Prj_ReviewStatus_t Prj_GetParReviewStatus (void) /************************ Show rubrics in a project **************************/ /*****************************************************************************/ -static void Prj_ShowRubrics (long PrjCod) +static void Prj_ShowRubrics (struct Prj_Projects *Projects) { extern const char *Hlp_ASSESSMENT_Projects; extern const char *Txt_Rubrics; extern const char *Txt_PROJECT_RUBRIC[PrjCfg_NUM_RUBRICS]; + struct Rub_Rubric Rubric; PrjCfg_Rubric_t WhichRubric; /***** Begin box *****/ @@ -4485,19 +4488,31 @@ static void Prj_ShowRubrics (long PrjCod) NULL,NULL, Hlp_ASSESSMENT_Projects,Box_NOT_CLOSABLE); - /***** Rubrics *****/ - for (WhichRubric = (PrjCfg_Rubric_t) 0; - WhichRubric <= (PrjCfg_Rubric_t) (PrjCfg_NUM_RUBRICS - 1); - WhichRubric++) - { - if (Prj_CheckIfICanViewRubric (PrjCod,WhichRubric)) - { - Ale_ShowAlert (Ale_INFO,Txt_PROJECT_RUBRIC[WhichRubric]); - Ale_ShowAlert (Ale_SUCCESS,"Can see"); - if (Prj_CheckIfICanFillRubric (PrjCod,WhichRubric)) - Ale_ShowAlert (Ale_SUCCESS,"Can fill"); - } - } + /***** Begin table *****/ + HTM_TABLE_BeginWideMarginPadding (5); + + /***** Rubrics *****/ + for (WhichRubric = (PrjCfg_Rubric_t) 1; + WhichRubric <= (PrjCfg_Rubric_t) (PrjCfg_NUM_RUBRICS - 1); + WhichRubric++) + if (Prj_CheckIfICanViewRubric (Projects->Prj.PrjCod,WhichRubric)) + { + /***** Get rubric data *****/ + Rub_RubricConstructor (&Rubric); + Rubric.RubCod = Projects->Config.RubCod[WhichRubric]; + Rub_GetRubricDataByCod (&Rubric); + + /***** Show this rubric ready to fill it *****/ + Rub_ShowRubricInProject (Projects,&Rubric, + Txt_PROJECT_RUBRIC[WhichRubric], + Prj_CheckIfICanFillRubric (Projects->Prj.PrjCod,WhichRubric)); + + /***** Free memory used for rubric *****/ + Rub_RubricDestructor (&Rubric); + } + + /***** End table *****/ + HTM_TABLE_End (); /***** End box *****/ Box_BoxEnd (); @@ -4515,6 +4530,8 @@ static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_Rubric_t WhichRubric) case Rol_NET: switch (WhichRubric) { + case PrjCfg_RUBRIC_ERR: + return false; case PrjCfg_RUBRIC_TUT: case PrjCfg_RUBRIC_EVL: return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // I am a tutor @@ -4540,6 +4557,8 @@ static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_Rubric_t WhichRubric) case Rol_NET: switch (WhichRubric) { + case PrjCfg_RUBRIC_ERR: + return false; case PrjCfg_RUBRIC_TUT: return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT)) != 0); // I am a tutor case PrjCfg_RUBRIC_EVL: @@ -4556,6 +4575,52 @@ static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_Rubric_t WhichRubric) } } +/*****************************************************************************/ +/************* Change the score of a criterion in a project ******************/ +/*****************************************************************************/ + +void Prj_ChangeCriterionScore (void) + { + struct Prj_Projects Projects; + long CriCod; + double Score; + long RubCod; + PrjCfg_Rubric_t WhichRubric; + + /***** Reset projects *****/ + Prj_ResetPrjsAndReadConfig (&Projects); + + /***** Allocate memory for the project *****/ + Prj_AllocMemProject (&Projects.Prj); + + /***** Get parameters *****/ + Prj_GetPars (&Projects); + Projects.Prj.PrjCod = ParCod_GetAndCheckPar (ParCod_Prj); + CriCod = ParCod_GetAndCheckPar (ParCod_Cri); + Score = RubCri_GetParScore (); + + /***** Get data of the project from database *****/ + Prj_GetProjectDataByCod (&Projects.Prj); + + /***** Get which rubric match this criterion *****/ + if ((RubCod = Rub_DB_GetRubCodFromCriCod (CriCod)) <= 0) + Err_WrongRubricExit (); + if ((WhichRubric = Prj_DB_GetWichRubricFromRubCod (RubCod)) == PrjCfg_RUBRIC_ERR) + Err_WrongRubricExit (); + + /***** Update review *****/ + if (Prj_CheckIfICanFillRubric (Projects.Prj.PrjCod,WhichRubric)) + Prj_DB_UpdateScore (Projects.Prj.PrjCod,CriCod,Score); + else + Err_NoPermission (); + + /***** Free memory of the project *****/ + Prj_FreeMemProject (&Projects.Prj); + + /***** Show projects again *****/ + Prj_ShowProjects (&Projects); + } + /*****************************************************************************/ /********************** Remove all projects in a course **********************/ /*****************************************************************************/ @@ -4571,6 +4636,9 @@ void Prj_RemoveCrsProjects (long CrsCod) /***** Remove configuration of projects in the course *****/ Prj_DB_RemoveConfigOfCrsPrjs (CrsCod); + /***** Remove associations of rubrics to projects in the course *****/ + Prj_DB_RemoveRubricsOfCrsPrjs (CrsCod); + /***** Remove projects *****/ Prj_DB_RemoveCrsPrjs (CrsCod); } diff --git a/swad_project.h b/swad_project.h index f07ea8fb..31f698b2 100644 --- a/swad_project.h +++ b/swad_project.h @@ -214,10 +214,11 @@ void Prj_ShowTableSelectedPrjs (void); bool Prj_CheckIfICanViewProjectDocuments (long PrjCod); bool Prj_CheckIfICanViewProjectAssessment (long PrjCod); +void Prj_PutCurrentPars (void *Projects); void Prj_PutPars (struct Prj_Filter *Filter, - Prj_Order_t Order, - unsigned NumPage, - long PrjCod); + Prj_Order_t Order, + unsigned NumPage, + long PrjCod); void Prj_GetPars (struct Prj_Projects *Projects); void Prj_PutIconsListProjects (void *Projects); @@ -271,6 +272,8 @@ void Prj_UnloProjectEdition (void); void Prj_ChangeReviewStatus (void); +void Prj_ChangeCriterionScore (void); + void Prj_RemoveCrsProjects (long CrsCod); void Prj_RemoveUsrFromProjects (long UsrCod); diff --git a/swad_project_config.c b/swad_project_config.c index f7457e4a..bac22da9 100644 --- a/swad_project_config.c +++ b/swad_project_config.c @@ -25,6 +25,7 @@ /*****************************************************************************/ #include // For boolean type +#include // For string functions #include "swad_action_list.h" #include "swad_alert.h" @@ -56,12 +57,6 @@ static const char *PrjCfg_RubricIDs[PrjCfg_NUM_RUBRICS] = extern struct Globals Gbl; -/*****************************************************************************/ -/************************* Private global variables **************************/ -/*****************************************************************************/ - -// static struct Rub_Rubric PrjCfg_Rubrics[PrjCfg_NUM_RUBRICS]; - /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ @@ -74,6 +69,8 @@ static void PrjCfg_ShowFormRubric (const struct PrjCfg_Config *Config, static void PrjCfg_GetConfigDataFromRow (MYSQL_RES *mysql_res, struct PrjCfg_Config *Config); +static void PrjCfg_GetRubricDataFromRow (MYSQL_RES *mysql_res, + struct PrjCfg_Config *Config); static bool PrjCfg_GetIfNETCanCreateFromForm (void); /*****************************************************************************/ @@ -83,19 +80,28 @@ static bool PrjCfg_GetIfNETCanCreateFromForm (void); void PrjCfg_GetConfig (struct PrjCfg_Config *Config) { MYSQL_RES *mysql_res; + unsigned NumRubrics; + unsigned NumRub; PrjCfg_Rubric_t WhichRubric; /***** Get configuration of projects for current course from database *****/ + Config->NETCanCreate = PrjCfg_NET_CAN_CREATE_DEFAULT; if (Prj_DB_GetConfig (&mysql_res)) PrjCfg_GetConfigDataFromRow (mysql_res,Config); - else - { - for (WhichRubric = (PrjCfg_Rubric_t) 0; - WhichRubric <= (PrjCfg_Rubric_t) (PrjCfg_NUM_RUBRICS - 1); - WhichRubric++) - Config->RubCod[WhichRubric] = -1L; - Config->NETCanCreate = PrjCfg_NET_CAN_CREATE_DEFAULT; - } + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + /***** Get project rubrics for current course from database *****/ + for (WhichRubric = (PrjCfg_Rubric_t) 1; + WhichRubric <= (PrjCfg_Rubric_t) (PrjCfg_NUM_RUBRICS - 1); + WhichRubric++) + Config->RubCod[WhichRubric] = -1L; + NumRubrics = Prj_DB_GetRubrics (&mysql_res); + for (NumRub = 0; + NumRub < NumRubrics; + NumRub++) + PrjCfg_GetRubricDataFromRow (mysql_res,Config); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); @@ -174,7 +180,7 @@ static void PrjCfg_ShowFormRubrics (const struct PrjCfg_Config *Config) Rub_GetListRubrics (&Rubrics); /***** Rubric selectors *****/ - for (WhichRubric = (PrjCfg_Rubric_t) 0; + for (WhichRubric = (PrjCfg_Rubric_t) 1; WhichRubric <= (PrjCfg_Rubric_t) (PrjCfg_NUM_RUBRICS - 1); WhichRubric++) PrjCfg_ShowFormRubric (Config,&Rubrics,WhichRubric); @@ -244,24 +250,56 @@ static void PrjCfg_GetConfigDataFromRow (MYSQL_RES *mysql_res, struct PrjCfg_Config *Config) { MYSQL_ROW row; + + /***** Get row *****/ + row = mysql_fetch_row (mysql_res); + /* + row[0] NETCanCreate + */ + /***** Get whether non-editing teachers can create new projects or not (row[0]) *****/ + Config->NETCanCreate = (row[0][0] == 'Y'); + } + +/*****************************************************************************/ +/****************** Get project rubric from a database row *******************/ +/*****************************************************************************/ + +static void PrjCfg_GetRubricDataFromRow (MYSQL_RES *mysql_res, + struct PrjCfg_Config *Config) + { + MYSQL_ROW row; PrjCfg_Rubric_t WhichRubric; /***** Get row *****/ row = mysql_fetch_row (mysql_res); /* - row[0] RubTutCod - row[1] RubEvlCod - row[2] RubGblCod - row[3] NETCanCreate + row[0] Type + row[1] RubCod */ - /***** Get rubric codes (row[0], row[1], row[2] *****/ - for (WhichRubric = (PrjCfg_Rubric_t) 0; + /***** Get rubric type (row[0]) *****/ + WhichRubric = PrjCfg_GetRubricFromString (row[0]); + + /***** Get rubric code (row[1]) *****/ + Config->RubCod[WhichRubric] = Str_ConvertStrCodToLongCod (row[1]); + } + +/*****************************************************************************/ +/********************** Convert from string to type **************************/ +/*****************************************************************************/ + +PrjCfg_Rubric_t PrjCfg_GetRubricFromString (const char *Str) + { + extern const char *Prj_DB_WhichRubric[PrjCfg_NUM_RUBRICS]; + PrjCfg_Rubric_t WhichRubric; + + /***** Compare string with all string types *****/ + for (WhichRubric = (PrjCfg_Rubric_t) 1; WhichRubric <= (PrjCfg_Rubric_t) (PrjCfg_NUM_RUBRICS - 1); WhichRubric++) - Config->RubCod[WhichRubric] = Str_ConvertStrCodToLongCod (row[WhichRubric]); + if (!strcmp (Prj_DB_WhichRubric[WhichRubric],Str)) + return WhichRubric; - /***** Get whether non-editing teachers can create new projects or not (row[3]) *****/ - Config->NETCanCreate = (row[3][0] == 'Y'); + return PrjCfg_RUBRIC_ERR; } /*****************************************************************************/ @@ -307,17 +345,18 @@ void PrjCfg_ReceiveConfig (void) /***** Reset projects *****/ Prj_ResetPrjsAndReadConfig (&Projects); + /***** Get non-editing teachers can create new projects or not *****/ + Projects.Config.NETCanCreate = PrjCfg_GetIfNETCanCreateFromForm (); + /***** Get rubric codes *****/ - for (WhichRubric = (PrjCfg_Rubric_t) 0; + for (WhichRubric = (PrjCfg_Rubric_t) 1; WhichRubric <= (PrjCfg_Rubric_t) (PrjCfg_NUM_RUBRICS - 1); WhichRubric++) Projects.Config.RubCod[WhichRubric] = Par_GetParLong (PrjCfg_RubricIDs[WhichRubric]); - /***** Get non-editing teachers can create new projects or not *****/ - Projects.Config.NETCanCreate = PrjCfg_GetIfNETCanCreateFromForm (); - /***** Update database *****/ Prj_DB_UpdateConfig (&Projects); + Prj_DB_UpdateRubrics (&Projects); /***** Show confirmation message *****/ Ale_ShowAlert (Ale_SUCCESS,Txt_The_configuration_of_the_projects_has_been_updated); diff --git a/swad_project_config.h b/swad_project_config.h index c9290455..5b16c56e 100644 --- a/swad_project_config.h +++ b/swad_project_config.h @@ -35,18 +35,19 @@ #define PrjCfg_NET_CAN_CREATE_DEFAULT true -#define PrjCfg_NUM_RUBRICS 3 +#define PrjCfg_NUM_RUBRICS 4 typedef enum { - PrjCfg_RUBRIC_TUT, - PrjCfg_RUBRIC_EVL, - PrjCfg_RUBRIC_GBL, + PrjCfg_RUBRIC_ERR = 0, + PrjCfg_RUBRIC_TUT = 1, + PrjCfg_RUBRIC_EVL = 2, + PrjCfg_RUBRIC_GBL = 3, } PrjCfg_Rubric_t; struct PrjCfg_Config { - long RubCod[PrjCfg_NUM_RUBRICS]; bool NETCanCreate; + long RubCod[PrjCfg_NUM_RUBRICS]; }; /*****************************************************************************/ @@ -57,6 +58,7 @@ void PrjCfg_GetConfig (struct PrjCfg_Config *Config); bool PrjCfg_CheckIfICanConfig (void); void PrjCfg_ShowFormConfig (void); +PrjCfg_Rubric_t PrjCfg_GetRubricFromString (const char *Str); void PrjCfg_ReceiveConfig (void); #endif diff --git a/swad_project_database.c b/swad_project_database.c index 01f392d6..b0a5eb58 100644 --- a/swad_project_database.c +++ b/swad_project_database.c @@ -44,8 +44,16 @@ extern struct Globals Gbl; /************************** Public constants and types ***********************/ /*****************************************************************************/ +/***** Enum field in database for type of rubric *****/ +const char *Prj_DB_WhichRubric[PrjCfg_NUM_RUBRICS] = + { + [PrjCfg_RUBRIC_TUT] = "tut", + [PrjCfg_RUBRIC_EVL] = "evl", + [PrjCfg_RUBRIC_GBL] = "gbl", + }; + /***** Enum field in database for types of proposal *****/ -const char *Prj_Proposal_DB[Prj_NUM_PROPOSAL_TYPES] = +const char *Prj_DB_Proposal[Prj_NUM_PROPOSAL_TYPES] = { [Prj_PROPOSAL_NEW ] = "new", [Prj_PROPOSAL_MODIFIED ] = "modified", @@ -53,7 +61,7 @@ const char *Prj_Proposal_DB[Prj_NUM_PROPOSAL_TYPES] = }; /***** Enum field in database for review status *****/ -const char *Prj_ReviewStatus_DB[Prj_NUM_REVIEW_STATUS] = +const char *Prj_DB_ReviewStatus[Prj_NUM_REVIEW_STATUS] = { [Prj_UNREVIEWED] = "unreviewed", [Prj_UNAPPROVED] = "unapproved", @@ -115,7 +123,7 @@ long Prj_DB_CreateProject (const struct Prj_Project *Prj) Prj->Assigned == Prj_ASSIGNED ? 'Y' : 'N', Prj->NumStds, - Prj_Proposal_DB[Prj->Proposal], + Prj_DB_Proposal[Prj->Proposal], Prj->CreatTime, Prj->ModifTime, Prj->Title, @@ -123,7 +131,7 @@ long Prj_DB_CreateProject (const struct Prj_Project *Prj) Prj->Knowledge, Prj->Materials, Prj->URL, - Prj_ReviewStatus_DB[Prj->Review.Status], + Prj_DB_ReviewStatus[Prj->Review.Status], Prj->Review.Time, Prj->Review.Txt); } @@ -155,7 +163,7 @@ void Prj_DB_UpdateProject (const struct Prj_Project *Prj) Prj->Assigned == Prj_ASSIGNED ? 'Y' : 'N', Prj->NumStds, - Prj_Proposal_DB[Prj->Proposal], + Prj_DB_Proposal[Prj->Proposal], Prj->ModifTime, Prj->Title, Prj->Description, @@ -212,12 +220,30 @@ void Prj_DB_UpdateReview (const struct Prj_Project *Prj) "ReviewTxt='%s'" " WHERE PrjCod=%ld" " AND CrsCod=%ld", // Extra check - Prj_ReviewStatus_DB[Prj->Review.Status], + Prj_DB_ReviewStatus[Prj->Review.Status], Prj->Review.Txt, Prj->PrjCod, Gbl.Hierarchy.Crs.CrsCod); } +/*****************************************************************************/ +/**************** Update score of a criterion in a project *******************/ +/*****************************************************************************/ + +void Prj_DB_UpdateScore (long PrjCod,long CriCod,double Score) + { + Str_SetDecimalPointToUS (); // To write the decimal point as a dot + DB_QueryUPDATE ("can not update score", + "UPDATE prj_scores" + " SET Score=%.15lg" + " WHERE PrjCod=%ld" + " AND CriCod=%ld", + Score, + PrjCod, + CriCod); + Str_SetDecimalPointToLocal (); // Return to local system + } + /*****************************************************************************/ /******************************** Get projects *******************************/ /*****************************************************************************/ @@ -301,38 +327,38 @@ unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, { case (1 << Prj_UNREVIEWED): // Unreviewed projects if (asprintf (&ReviewSubQuery," AND prj_projects.ReviewStatus='%s'", - Prj_ReviewStatus_DB[Prj_UNREVIEWED]) < 0) + Prj_DB_ReviewStatus[Prj_UNREVIEWED]) < 0) Err_NotEnoughMemoryExit (); break; case (1 << Prj_UNAPPROVED): // Unapproved projects if (asprintf (&ReviewSubQuery," AND prj_projects.ReviewStatus='%s'", - Prj_ReviewStatus_DB[Prj_UNAPPROVED]) < 0) + Prj_DB_ReviewStatus[Prj_UNAPPROVED]) < 0) Err_NotEnoughMemoryExit (); break; case (1 << Prj_APPROVED): // Approved projects if (asprintf (&ReviewSubQuery," AND prj_projects.ReviewStatus='%s'", - Prj_ReviewStatus_DB[Prj_APPROVED ]) < 0) + Prj_DB_ReviewStatus[Prj_APPROVED ]) < 0) Err_NotEnoughMemoryExit (); break; case (1 << Prj_UNREVIEWED | 1 << Prj_UNAPPROVED): // Unreviewed and unapproved projects if (asprintf (&ReviewSubQuery," AND prj_projects.ReviewStatus IN ('%s','%s')", - Prj_ReviewStatus_DB[Prj_UNREVIEWED], - Prj_ReviewStatus_DB[Prj_UNAPPROVED]) < 0) + Prj_DB_ReviewStatus[Prj_UNREVIEWED], + Prj_DB_ReviewStatus[Prj_UNAPPROVED]) < 0) Err_NotEnoughMemoryExit (); break; case (1 << Prj_UNREVIEWED | 1 << Prj_APPROVED): // Unreviewed and approved projects if (asprintf (&ReviewSubQuery," AND prj_projects.ReviewStatus IN ('%s','%s')", - Prj_ReviewStatus_DB[Prj_UNREVIEWED], - Prj_ReviewStatus_DB[Prj_APPROVED ]) < 0) + Prj_DB_ReviewStatus[Prj_UNREVIEWED], + Prj_DB_ReviewStatus[Prj_APPROVED ]) < 0) Err_NotEnoughMemoryExit (); break; case (1 << Prj_UNAPPROVED | 1 << Prj_APPROVED): // Unapproved and approved projects if (asprintf (&ReviewSubQuery," AND prj_projects.ReviewStatus IN ('%s','%s')", - Prj_ReviewStatus_DB[Prj_UNAPPROVED], - Prj_ReviewStatus_DB[Prj_APPROVED ]) < 0) + Prj_DB_ReviewStatus[Prj_UNAPPROVED], + Prj_DB_ReviewStatus[Prj_APPROVED ]) < 0) Err_NotEnoughMemoryExit (); break; default: // All projects @@ -595,8 +621,8 @@ unsigned Prj_DB_GetPrjDataToCheckFaults (MYSQL_RES **mysql_res,long PrjCod) "ReviewStatus<>'%s' AND ModifTime>ReviewTime" // row[5] = 0 / 1 " FROM prj_projects" " WHERE PrjCod=%ld", - Prj_ReviewStatus_DB[Prj_UNAPPROVED], - Prj_ReviewStatus_DB[Prj_UNREVIEWED], + Prj_DB_ReviewStatus[Prj_UNAPPROVED], + Prj_DB_ReviewStatus[Prj_UNREVIEWED], PrjCod); } @@ -675,6 +701,21 @@ long Prj_DB_GetCrsOfPrj (long PrjCod) PrjCod); // Project found... } +/*****************************************************************************/ +/********************* Get criteria in a given rubric ************************/ +/*****************************************************************************/ + +double Prj_DB_GetScore (long PrjCod,long CriCod) + { + return DB_QuerySELECTDouble ("can not get score", + "SELECT Score" + " FROM prj_scores" + " WHERE PrjCod=%ld" + " AND CriCod=%ld", + PrjCod, + CriCod); + } + /*****************************************************************************/ /******************** Get number of courses with projects ********************/ /*****************************************************************************/ @@ -902,6 +943,18 @@ void Prj_DB_RemoveConfigOfCrsPrjs (long CrsCod) CrsCod); } +/*****************************************************************************/ +/********** Remove associations of rubrics to projects in the course *********/ +/*****************************************************************************/ + +void Prj_DB_RemoveRubricsOfCrsPrjs (long CrsCod) + { + DB_QueryDELETE ("can not remove rubrics of projects in a course", + "DELETE FROM prj_rubrics" + " WHERE CrsCod=%ld", + CrsCod); + } + /*****************************************************************************/ /******************************* Remove project ******************************/ /*****************************************************************************/ @@ -936,17 +989,35 @@ void Prj_DB_UpdateConfig (const struct Prj_Projects *Projects) { DB_QueryREPLACE ("can not save configuration of projects", "REPLACE INTO prj_config" - " (CrsCod,RubTutCod,RubEvlCod,RubGblCod,NETCanCreate)" + " (CrsCod,NETCanCreate)" " VALUES" - " (%ld,%ld,%ld,%ld,'%c')", + " (%ld,'%c')", Gbl.Hierarchy.Crs.CrsCod, - Projects->Config.RubCod[PrjCfg_RUBRIC_TUT], - Projects->Config.RubCod[PrjCfg_RUBRIC_EVL], - Projects->Config.RubCod[PrjCfg_RUBRIC_GBL], Projects->Config.NETCanCreate ? 'Y' : 'N'); } +/*****************************************************************************/ +/********* Update rubrics associated to projects for current course **********/ +/*****************************************************************************/ + +void Prj_DB_UpdateRubrics (const struct Prj_Projects *Projects) + { + PrjCfg_Rubric_t WhichRubric; + + for (WhichRubric = (PrjCfg_Rubric_t) 1; + WhichRubric <= (PrjCfg_Rubric_t) (PrjCfg_NUM_RUBRICS - 1); + WhichRubric++) + DB_QueryREPLACE ("can not save configuration of projects", + "REPLACE INTO prj_rubrics" + " (CrsCod,Type,RubCod)" + " VALUES" + " (%ld,'%s',%ld)", + Gbl.Hierarchy.Crs.CrsCod, + Prj_DB_WhichRubric[WhichRubric], + Projects->Config.RubCod[WhichRubric]); + } + /*****************************************************************************/ /************** Get configuration of projects for current course *************/ /*****************************************************************************/ @@ -955,11 +1026,42 @@ unsigned Prj_DB_GetConfig (MYSQL_RES **mysql_res) { return (unsigned) DB_QuerySELECT (mysql_res,"can not get project configuration", - "SELECT RubTutCod," // row[0] - "RubEvlCod," // row[1] - "RubGblCod," // row[2] - "NETCanCreate" // row[3] + "SELECT NETCanCreate" // row[0] " FROM prj_config" " WHERE CrsCod=%ld", Gbl.Hierarchy.Crs.CrsCod); } + +/*****************************************************************************/ +/******************* Get project rubrics for current course ******************/ +/*****************************************************************************/ + +unsigned Prj_DB_GetRubrics (MYSQL_RES **mysql_res) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get project rubrics", + "SELECT Type," // row[0] + "RubCod" // row[1] + " FROM prj_rubrics" + " WHERE CrsCod=%ld", + Gbl.Hierarchy.Crs.CrsCod); + } + +/*****************************************************************************/ +/*** Get type of project rubric in the current course given a rubric code ****/ +/*****************************************************************************/ + +PrjCfg_Rubric_t Prj_DB_GetWichRubricFromRubCod (long RubCod) + { + char StrTypeDB[32]; + + DB_QuerySELECTString (StrTypeDB,sizeof (StrTypeDB) - 1, + "can not get which rubric", + "SELECT Type" // row[0] + " FROM prj_rubrics" + " WHERE CrsCod=%ld" + " AND RubCod=%ld", + Gbl.Hierarchy.Crs.CrsCod, + RubCod); + return PrjCfg_GetRubricFromString (StrTypeDB); + } diff --git a/swad_project_database.h b/swad_project_database.h index bd369518..b3c13b55 100644 --- a/swad_project_database.h +++ b/swad_project_database.h @@ -41,6 +41,7 @@ void Prj_DB_UpdateProject (const struct Prj_Project *Prj); void Prj_DB_AddUsrToPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,long UsrCod); void Prj_DB_HideOrUnhideProject (long PrjCod,bool Hide); void Prj_DB_UpdateReview (const struct Prj_Project *Prj); +void Prj_DB_UpdateScore (long PrjCod,long CriCod,double Score); unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, const struct Prj_Projects *Projects, @@ -53,6 +54,7 @@ unsigned Prj_DB_GetUsrsInPrj (MYSQL_RES **mysql_res, long PrjCod,Prj_RoleInProject_t RoleInProject); unsigned Prj_DB_GetMyRolesInPrj (MYSQL_RES **mysql_res,long PrjCod); long Prj_DB_GetCrsOfPrj (long PrjCod); +double Prj_DB_GetScore (long PrjCod,long CriCod); unsigned Prj_DB_GetNumCoursesWithProjects (HieLvl_Level_t Scope); unsigned Prj_DB_GetNumProjects (HieLvl_Level_t Scope); @@ -61,12 +63,16 @@ void Prj_DB_RemoveUsrFromProjects (long UsrCod); void Prj_DB_RemoveUsrsFromPrj (long PrjCod); void Prj_DB_RemoveUsrsFromCrsPrjs (long CrsCod); void Prj_DB_RemoveConfigOfCrsPrjs (long CrsCod); +void Prj_DB_RemoveRubricsOfCrsPrjs (long CrsCod); void Prj_DB_RemovePrj (long PrjCod); void Prj_DB_RemoveCrsPrjs (long CrsCod); //----------------------------- Configuration --------------------------------- void Prj_DB_UpdateConfig (const struct Prj_Projects *Projects); +void Prj_DB_UpdateRubrics (const struct Prj_Projects *Projects); unsigned Prj_DB_GetConfig (MYSQL_RES **mysql_res); +unsigned Prj_DB_GetRubrics (MYSQL_RES **mysql_res); +PrjCfg_Rubric_t Prj_DB_GetWichRubricFromRubCod (long RubCod); #endif diff --git a/swad_rubric.c b/swad_rubric.c index d714fcef..79983875 100644 --- a/swad_rubric.c +++ b/swad_rubric.c @@ -63,9 +63,6 @@ static void Rub_PutIconToCreateNewRubric (struct Rub_Rubrics *Rubrics); static void Prg_PutIconToViewResourceClipboard (void); static void Rub_PutParsToCreateNewRubric (void *Rubrics); -static void Rub_ShowRubricMainData (struct Rub_Rubrics *Rubrics, - bool ShowOnlyThisRubric); - static void Rub_PutIconsViewingOneRubric (void *Rubrics); static void Rub_PutIconsEditingOneRubric (void *Rubrics); static void Rub_PutIconsToRemEditOneRubric (struct Rub_Rubrics *Rubrics); @@ -368,8 +365,8 @@ void Rub_ShowOnlyOneRubric (struct Rub_Rubrics *Rubrics) /********* Show a pair of rows with the main data of a given rubric **********/ /*****************************************************************************/ -static void Rub_ShowRubricMainData (struct Rub_Rubrics *Rubrics, - bool ShowOnlyThisRubric) +void Rub_ShowRubricMainData (struct Rub_Rubrics *Rubrics, + bool ShowOnlyThisRubric) { extern const char *Txt_View_rubric; extern const char *Txt_Number_of_criteria; @@ -412,6 +409,8 @@ static void Rub_ShowRubricMainData (struct Rub_Rubrics *Rubrics, HTM_Unsigned (Rub_DB_GetNumCriteriaInRubric (Rubrics->Rubric.RubCod)); HTM_DIV_End (); + HTM_TD_End (); + /***** End 1st row of this rubric *****/ HTM_TR_End (); @@ -449,6 +448,60 @@ static void Rub_ShowRubricMainData (struct Rub_Rubrics *Rubrics, The_ChangeRowColor (); } +/*****************************************************************************/ +/************************ Show one rubric in a project ***********************/ +/*****************************************************************************/ + +void Rub_ShowRubricInProject (struct Prj_Projects *Projects, + struct Rub_Rubric *Rubric, + const char *WhichRubricTxt, + bool ICanFill) + { + extern const char *Txt_Rubric; + + /***** Begin first row of this rubric *****/ + HTM_TR_Begin (NULL); + + /***** Rubric title *****/ + HTM_TD_Begin ("class=\"LT ASG_TITLE_%s %s\"", + The_GetSuffix (),The_GetColorRows ()); + HTM_TxtColonNBSP (WhichRubricTxt); + HTM_Txt (Rubric->Title); + HTM_TD_End (); + + /***** End 1st row of this rubric *****/ + HTM_TR_End (); + + /***** Begin 2nd row of this rubric *****/ + HTM_TR_Begin (NULL); + + /***** Text of the rubric *****/ + HTM_TD_Begin ("class=\"LT PAR DAT_%s %s\"", + The_GetSuffix (),The_GetColorRows ()); + Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, + Rubric->Txt,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML + ALn_InsertLinks (Rubric->Txt,Cns_MAX_BYTES_TEXT,60); // Insert links + HTM_Txt (Rubric->Txt); + HTM_TD_End (); + + /***** End 2nd row of this rubric *****/ + HTM_TR_End (); + + /***** Begin 4rd row of this rubric *****/ + HTM_TR_Begin (NULL); + + /***** Write criteria of this rubric *****/ + HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ()); + RubCri_ListCriteriaInProject (Projects,Rubric->RubCod,ICanFill); + HTM_TD_End (); + + /***** End 3rd row of this rubric *****/ + HTM_TR_End (); + + /***** Change color for next rubric *****/ + The_ChangeRowColor (); + } + /*****************************************************************************/ /*************** Put icons when viewing or editing one rubric ****************/ /*****************************************************************************/ diff --git a/swad_rubric.h b/swad_rubric.h index f6b0ec93..3bf14515 100644 --- a/swad_rubric.h +++ b/swad_rubric.h @@ -27,6 +27,7 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#include "swad_project.h" #include "swad_rubric_type.h" #include "swad_string.h" @@ -50,6 +51,12 @@ bool Rub_CheckIfICanEditRubrics (void); bool Rub_CheckIfEditable (void); void Rub_SeeOneRubric (void); void Rub_ShowOnlyOneRubric (struct Rub_Rubrics *Rubrics); +void Rub_ShowRubricMainData (struct Rub_Rubrics *Rubrics, + bool ShowOnlyThisRubric); +void Rub_ShowRubricInProject (struct Prj_Projects *Projects, + struct Rub_Rubric *Rubric, + const char *WhichRubricTxt, + bool ICanFill); void Rub_SetCurrentRubCod (long GamCod); void Rub_PutPars (void *Rubrics); diff --git a/swad_rubric_criteria.c b/swad_rubric_criteria.c index 1c7ff111..55365db2 100644 --- a/swad_rubric_criteria.c +++ b/swad_rubric_criteria.c @@ -24,8 +24,10 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf #include // For DBL_MAX #include // To access MySQL databases +#include // For asprintf #include // For string functions #include "swad_action_list.h" @@ -40,6 +42,7 @@ #include "swad_global.h" #include "swad_parameter.h" #include "swad_parameter_code.h" +#include "swad_project_database.h" #include "swad_resource_database.h" #include "swad_rubric.h" #include "swad_rubric_criteria.h" @@ -61,6 +64,7 @@ static const char *RubCri_ParValues[RubCri_NUM_VALUES] = [RubCri_MIN] = "MinVal", [RubCri_MAX] = "MaxVal", }; +#define RubCri_SCORE_STEP 0.1 #define RubCri_WEIGHT_MIN 0.0 #define RubCri_WEIGHT_MAX 1.0 @@ -76,6 +80,12 @@ typedef enum RubCri_PUT_COLUMN_FOR_ICONS, } RubCri_PutColumnForIcons_t; +typedef enum + { + RubCri_DONT_PUT_COLUMNS_FOR_SCORE, + RubCri_PUT_COLUMNS_FOR_SCORE, + } RubCri_PutColumnsForScore_t; + /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ @@ -98,11 +108,16 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, unsigned MaxCriInd, unsigned NumCriteria, MYSQL_RES *mysql_res); +static void RubCri_ListOneOrMoreCriteriaInProject (struct Prj_Projects *Projects, + bool ICanFill, + unsigned NumCriteria, + MYSQL_RES *mysql_res); static void RubCri_GetCriterionDataFromRow (MYSQL_RES *mysql_res, struct RubCri_Criterion *Criterion); -static void RubCri_PutTableHeadingForCriteria (RubCri_PutColumnForIcons_t PutColumnForIcons); +static void RubCri_PutTableHeadingForCriteria (RubCri_PutColumnForIcons_t PutColumnForIcons, + RubCri_PutColumnsForScore_t PutColumnsForScore); static void RubCri_GetAndCheckRubricAndCriterion (struct Rub_Rubrics *Rubrics); @@ -169,7 +184,8 @@ static void RubCri_PutFormNewCriterion (struct Rub_Rubrics *Rubrics, NULL,Box_NOT_CLOSABLE,2); /***** Table heading *****/ - RubCri_PutTableHeadingForCriteria (RubCri_DONT_PUT_COLUMN_FOR_ICONS); + RubCri_PutTableHeadingForCriteria (RubCri_DONT_PUT_COLUMN_FOR_ICONS, + RubCri_DONT_PUT_COLUMNS_FOR_SCORE); /***** Begin row *****/ HTM_TR_Begin (NULL); @@ -200,7 +216,8 @@ static void RubCri_PutFormNewCriterion (struct Rub_Rubrics *Rubrics, ValueRange++) { HTM_TD_Begin ("class=\"RT\""); - HTM_INPUT_FLOAT (RubCri_ParValues[ValueRange],0.0,DBL_MAX,0.1, + HTM_INPUT_FLOAT (RubCri_ParValues[ValueRange], + 0.0,DBL_MAX,RubCri_SCORE_STEP, Rubrics->Criterion.Values[ValueRange],false, " class=\"INPUT_FLOAT INPUT_%s\" required=\"required\"", The_GetSuffix ()); @@ -548,6 +565,28 @@ void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics) DB_FreeMySQLResult (&mysql_res); } +/*****************************************************************************/ +/**************** List the criteria of a rubric in a project *****************/ +/*****************************************************************************/ + +void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod, + bool ICanFill) + { + MYSQL_RES *mysql_res; + unsigned NumCriteria; + + /***** Get data of rubric criteria from database *****/ + NumCriteria = Rub_DB_GetCriteria (&mysql_res,RubCod); + + /***** Show table with rubric criteria *****/ + if (NumCriteria) + RubCri_ListOneOrMoreCriteriaInProject (Projects,ICanFill, + NumCriteria,mysql_res); + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + } + /*****************************************************************************/ /********************** List rubric criteria for edition *********************/ /*****************************************************************************/ @@ -564,7 +603,8 @@ static void RubCri_ListOneOrMoreCriteriaForSeeing (unsigned NumCriteria, HTM_TABLE_BeginWideMarginPadding (5); /***** Write the heading *****/ - RubCri_PutTableHeadingForCriteria (RubCri_DONT_PUT_COLUMN_FOR_ICONS); + RubCri_PutTableHeadingForCriteria (RubCri_DONT_PUT_COLUMN_FOR_ICONS, + RubCri_DONT_PUT_COLUMNS_FOR_SCORE); /***** Write rows *****/ for (NumCriterion = 0, The_ResetRowColor (); @@ -577,12 +617,11 @@ static void RubCri_ListOneOrMoreCriteriaForSeeing (unsigned NumCriteria, /***** Get criterion data *****/ RubCri_GetCriterionDataFromRow (mysql_res,&Criterion); - /***** Begin first row *****/ + /***** Begin row *****/ HTM_TR_Begin (NULL); /***** Index *****/ - HTM_TD_Begin ("rowspan=\"2\" class=\"RT %s\"", - The_GetColorRows ()); + HTM_TD_Begin ("class=\"RT %s\"",The_GetColorRows ()); Lay_WriteIndex (Criterion.CriInd,"BIG_INDEX"); HTM_TD_End (); @@ -619,21 +658,7 @@ static void RubCri_ListOneOrMoreCriteriaForSeeing (unsigned NumCriteria, HTM_Double (Criterion.Weight); HTM_TD_End (); - /***** End first row *****/ - HTM_TR_End (); - - /***** Begin second row *****/ - HTM_TR_Begin (NULL); - - /***** Questions *****/ - HTM_TD_Begin ("colspan=\"5\" class=\"LT %s\"", - The_GetColorRows ()); - - // Description here - - HTM_TD_End (); - - /***** End second row *****/ + /***** End row *****/ HTM_TR_End (); } @@ -666,7 +691,8 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, HTM_TABLE_BeginWideMarginPadding (5); /***** Write the heading *****/ - RubCri_PutTableHeadingForCriteria (RubCri_PUT_COLUMN_FOR_ICONS); + RubCri_PutTableHeadingForCriteria (RubCri_PUT_COLUMN_FOR_ICONS, + RubCri_DONT_PUT_COLUMNS_FOR_SCORE); /***** Write rows *****/ for (NumCriterion = 0, The_ResetRowColor (); @@ -682,12 +708,11 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, /***** Build anchor string *****/ Frm_SetAnchorStr (Rubrics->Criterion.CriCod,&Anchor); - /***** Begin first row *****/ + /***** Begin row *****/ HTM_TR_Begin (NULL); /***** Icons *****/ - HTM_TD_Begin ("rowspan=\"2\" class=\"BT %s\"", - The_GetColorRows ()); + HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ()); /* Put icon to remove the criterion */ Ico_PutContextualIconToRemove (ActReqRemRubCri,NULL, @@ -714,7 +739,7 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, HTM_TD_End (); /***** Index *****/ - HTM_TD_Begin ("rowspan=\"2\" class=\"RT %s\"", + HTM_TD_Begin ("class=\"RT %s\"", The_GetColorRows ()); Lay_WriteIndex (Rubrics->Criterion.CriInd,"BIG_INDEX"); HTM_TD_End (); @@ -750,7 +775,8 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, HTM_TD_Begin ("class=\"RT %s\"",The_GetColorRows ()); Frm_BeginFormAnchor (RubCri_ActionsValues[ValueRange],Anchor); RubCri_PutParsOneCriterion (Rubrics); - HTM_INPUT_FLOAT (RubCri_ParValues[ValueRange],0.0,DBL_MAX,0.1, + HTM_INPUT_FLOAT (RubCri_ParValues[ValueRange], + 0.0,DBL_MAX,RubCri_SCORE_STEP, Rubrics->Criterion.Values[ValueRange],false, " class=\"INPUT_FLOAT INPUT_%s\"" " required=\"required\"", @@ -774,21 +800,7 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, Frm_EndForm (); HTM_TD_End (); - /***** End first row *****/ - HTM_TR_End (); - - /***** Begin second row *****/ - HTM_TR_Begin (NULL); - - /***** Questions *****/ - HTM_TD_Begin ("colspan=\"5\" class=\"LT %s\"", - The_GetColorRows ()); - - // Description here - - HTM_TD_End (); - - /***** End second row *****/ + /***** End row *****/ HTM_TR_End (); /***** Free anchor string *****/ @@ -799,6 +811,142 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, HTM_TABLE_End (); } +/*****************************************************************************/ +/********************* List rubric criteria in a project *********************/ +/*****************************************************************************/ + +static void RubCri_ListOneOrMoreCriteriaInProject (struct Prj_Projects *Projects, + bool ICanFill, + unsigned NumCriteria, + MYSQL_RES *mysql_res) + { + extern const char *Txt_Criteria; + struct RubCri_Criterion Criterion; + unsigned NumCriterion; + RubCri_ValueRange_t ValueRange; + char *Anchor; + double Score = 0.0; + + /***** Begin table *****/ + HTM_TABLE_BeginWideMarginPadding (5); + + /***** Write the heading *****/ + RubCri_PutTableHeadingForCriteria (RubCri_DONT_PUT_COLUMN_FOR_ICONS, + RubCri_PUT_COLUMNS_FOR_SCORE); + + /***** Write rows *****/ + for (NumCriterion = 0, The_ResetRowColor (); + NumCriterion < NumCriteria; + NumCriterion++, The_ChangeRowColor ()) + { + /***** Create criterion of questions *****/ + RubCri_ResetCriterion (&Criterion); + + /***** Get criterion data *****/ + RubCri_GetCriterionDataFromRow (mysql_res,&Criterion); + + /***** Build anchor string *****/ + Frm_SetAnchorStr (Criterion.CriCod,&Anchor); + + /***** Begin row *****/ + HTM_TR_Begin (NULL); + + /***** Index *****/ + HTM_TD_Begin ("class=\"RT %s\"",The_GetColorRows ()); + Lay_WriteIndex (Criterion.CriInd,"BIG_INDEX"); + HTM_TD_End (); + + /***** Title *****/ + HTM_TD_Begin ("class=\"LT DAT_%s %s\"", + The_GetSuffix (), + The_GetColorRows ()); + HTM_ARTICLE_Begin (Anchor); + HTM_Txt (Criterion.Title); + HTM_ARTICLE_End (); + HTM_TD_End (); + + /***** Link to resource *****/ + HTM_TD_Begin ("class=\"LT DAT_%s %s\"", + The_GetSuffix (), + The_GetColorRows ()); + Rsc_WriteLinkName (&Criterion.Link,Frm_DONT_PUT_FORM_TO_GO); + HTM_TD_End (); + + /***** Minimum and maximum values of criterion *****/ + for (ValueRange = (RubCri_ValueRange_t) 0; + ValueRange <= (RubCri_ValueRange_t) (RubCri_NUM_VALUES - 1); + ValueRange++) + { + HTM_TD_Begin ("class=\"RT DAT_%s %s\"", + The_GetSuffix (), + The_GetColorRows ()); + HTM_Double (Criterion.Values[ValueRange]); + HTM_TD_End (); + } + + /***** Criterion weight *****/ + HTM_TD_Begin ("class=\"RT DAT_%s %s\"", + The_GetSuffix (), + The_GetColorRows ()); + HTM_Double (Criterion.Weight); + HTM_TD_End (); + + /***** Criterion score *****/ + HTM_TD_Begin ("class=\"RT DAT_%s %s\"", + The_GetSuffix (), + The_GetColorRows ()); + /* Get score from database */ + Score = Prj_DB_GetScore (Projects->Prj.PrjCod, + Criterion.CriCod); + + /* Show score */ + if (ICanFill) + { + Frm_BeginFormAnchor (ActChgPrjSco,Anchor); + Prj_PutCurrentPars (Projects); + ParCod_PutPar (ParCod_Cri,Criterion.CriCod); + HTM_INPUT_FLOAT ("Score", + Criterion.Values[RubCri_MIN], + Criterion.Values[RubCri_MAX], + RubCri_SCORE_STEP, + Score,false, + " class=\"INPUT_FLOAT INPUT_%s\"" + " required=\"required\"", + The_GetSuffix ()); + Frm_EndForm (); + } + else + HTM_Double (Score); + HTM_TD_End (); + + /***** Criterion score x weight *****/ + HTM_TD_Begin ("class=\"RT DAT_%s %s\"", + The_GetSuffix (), + The_GetColorRows ()); + HTM_Double (Criterion.Weight); + HTM_TD_End (); + + /***** End row *****/ + HTM_TR_End (); + } + + /***** End table *****/ + HTM_TABLE_End (); + } + +/*****************************************************************************/ +/***************** Get parameter with score of a criterion *******************/ +/*****************************************************************************/ + +double RubCri_GetParScore (void) + { + char ScoreStr[64]; + + /***** Get criterion weight *****/ + Par_GetParText ("Score",ScoreStr,sizeof (ScoreStr) - 1); + return Str_GetDoubleFromStr (ScoreStr); + } + /*****************************************************************************/ /************************** Get rubric criteria data *************************/ /*****************************************************************************/ @@ -853,7 +1001,8 @@ static void RubCri_GetCriterionDataFromRow (MYSQL_RES *mysql_res, /****************** Put table heading for rubric criteria ********************/ /*****************************************************************************/ -static void RubCri_PutTableHeadingForCriteria (RubCri_PutColumnForIcons_t PutColumnForIcons) +static void RubCri_PutTableHeadingForCriteria (RubCri_PutColumnForIcons_t PutColumnForIcons, + RubCri_PutColumnsForScore_t PutColumnsForScore) { extern const char *Txt_No_INDEX; extern const char *Txt_Criterion; @@ -861,6 +1010,8 @@ static void RubCri_PutTableHeadingForCriteria (RubCri_PutColumnForIcons_t PutCol extern const char *Txt_Minimum; extern const char *Txt_Maximum; extern const char *Txt_Weight; + extern const char *Txt_Score; + char *Title; /***** Begin row *****/ HTM_TR_Begin (NULL); @@ -871,9 +1022,17 @@ static void RubCri_PutTableHeadingForCriteria (RubCri_PutColumnForIcons_t PutCol HTM_TH (Txt_No_INDEX ,HTM_HEAD_RIGHT); HTM_TH (Txt_Criterion,HTM_HEAD_LEFT ); HTM_TH (Txt_Source ,HTM_HEAD_LEFT ); - HTM_TH (Txt_Minimum ,HTM_HEAD_LEFT ); - HTM_TH (Txt_Maximum ,HTM_HEAD_LEFT ); - HTM_TH (Txt_Weight ,HTM_HEAD_LEFT ); + HTM_TH (Txt_Minimum ,HTM_HEAD_RIGHT); + HTM_TH (Txt_Maximum ,HTM_HEAD_RIGHT); + HTM_TH (Txt_Weight ,HTM_HEAD_RIGHT); + if (PutColumnsForScore == RubCri_PUT_COLUMNS_FOR_SCORE) + { + HTM_TH (Txt_Score ,HTM_HEAD_RIGHT); + if (asprintf (&Title,"%s × %s",Txt_Score,Txt_Weight) < 0) + Err_NotEnoughMemoryExit (); + HTM_TH (Title,HTM_HEAD_RIGHT); + free (Title); + } /***** End row *****/ HTM_TR_End (); diff --git a/swad_rubric_criteria.h b/swad_rubric_criteria.h index 2c9f112c..e1e7f2b5 100644 --- a/swad_rubric_criteria.h +++ b/swad_rubric_criteria.h @@ -43,6 +43,9 @@ void RubCri_ChangeWeight (void); void RubCri_ListCriteriaForSeeing (const struct Rub_Rubrics *Rubrics); void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics); +void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod, + bool ICanFill); +double RubCri_GetParScore (void); void RubCri_ResetCriterion (struct RubCri_Criterion *Criterion); diff --git a/swad_rubric_database.c b/swad_rubric_database.c index 5230fa73..c1b4ed58 100644 --- a/swad_rubric_database.c +++ b/swad_rubric_database.c @@ -505,6 +505,20 @@ unsigned Rub_DB_GetNumCriteriaInRubric (long RubCod) RubCod); } +/*****************************************************************************/ +/****************** Get rubric code given a criterion code *******************/ +/*****************************************************************************/ +// Return <0 is criterion is not present in any rubric + +long Rub_DB_GetRubCodFromCriCod (long CriCod) + { + return DB_QuerySELECTCode ("can not get which rubric", + "SELECT RubCod" // row[0] + " FROM rub_criteria" + " WHERE CriCod=%ld", + CriCod); + } + /*****************************************************************************/ /********* Get criterion code given rubric and index of criterion ************/ /*****************************************************************************/ diff --git a/swad_rubric_database.h b/swad_rubric_database.h index 87484bdf..31fd2981 100644 --- a/swad_rubric_database.h +++ b/swad_rubric_database.h @@ -65,8 +65,9 @@ void Rub_DB_UpdateCriterionIndex (long CriInd,long CriCod,long RubCod); void Rub_DB_LockTable (void); unsigned Rub_DB_GetNumCriteriaInRubric (long RubCod); +long Rub_DB_GetRubCodFromCriCod (long CriCod); long Rub_DB_GetCriCodFromCriInd (long RubCod,unsigned QstInd); -unsigned Rub_DB_GetCriIndFromCriCod (long RubCod,long QstCod); +unsigned Rub_DB_GetCriIndFromCriCod (long RubCod,long CriCod); unsigned Rub_DB_GetMaxCriterionIndexInRubric (long RubCod); unsigned Rub_DB_GetPrevCriterionIndexInRubric (long RubCod,unsigned QstInd); unsigned Rub_DB_GetNextCriterionIndexInRubric (long RubCod,unsigned QstInd); diff --git a/swad_text_action.c b/swad_text_action.c index c306e0bd..8c450478 100644 --- a/swad_text_action.c +++ b/swad_text_action.c @@ -10111,6 +10111,29 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] = "Remove evaluator from a project" // Precisa de tradução #elif L==10 // tr "Remove evaluator from a project" // Çeviri lazim! +#endif + , + [ActChgPrjSco] = +#if L==1 // ca + "Canviar la puntuació d'un criteri en un projecte" +#elif L==2 // de + "Ändern Sie die Punktzahl eines Kriteriums in einem Projekt" +#elif L==3 // en + "Change the score of a criterion in a project" +#elif L==4 // es + "Cambiar la puntuación de un criterio en un proyecto" +#elif L==5 // fr + "Modifier le score d'un critère dans un projet" +#elif L==6 // gn + "Omoambue puntuación peteî criterio peteî proyecto-pe" +#elif L==7 // it + "Modificare il punteggio di un criterio in un progetto" +#elif L==8 // pl + "Zmień wynik kryterium w projekcie" +#elif L==9 // pt + "Alterar a pontuação de um critério em um projeto" +#elif L==10 // tr + "Bir projedeki bir kriterin puanını değiştirin" #endif , [ActReqLnkPrj] =