From 218ff36c1d2afa4e225739b5d954e2479ce326b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Wed, 19 Oct 2016 01:46:40 +0200 Subject: [PATCH] Version 16.22 --- swad_action.c | 4 + swad_action.h | 471 ++++++++++++++++++++++++----------------------- swad_changelog.h | 4 +- swad_course.c | 240 +++++++++++++++++++----- swad_course.h | 1 + swad_degree.c | 72 ++++---- swad_global.c | 2 - swad_global.h | 1 - swad_parameter.c | 31 +--- swad_user.c | 2 +- 10 files changed, 472 insertions(+), 356 deletions(-) diff --git a/swad_action.c b/swad_action.c index 31fe98c8a..e5d2abafb 100644 --- a/swad_action.c +++ b/swad_action.c @@ -448,6 +448,7 @@ Course: 316. ActCrsSch Search for courses, teachers, documents... 317. ActPrnCrsInf Print information on the course + NEW. ActChgCrsDegCfg Request change of degree in course configuration 318. ActChgInsCrsCodCfg Change institutional code in course configuration 319. ActChgCrsYeaCfg Change year/semester in course configuration 320. ActEdiCrsInf Edit general information about the course @@ -1800,9 +1801,11 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActDegSch */{1185,-1,TabCrs,ActCrsReqSch ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Sch_GetParamsSearch ,Sch_CrsSearch ,NULL}, /* ActPrnCrsInf */{1028,-1,TabCrs,ActSeeCrsInf ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Crs_PrintConfiguration ,NULL}, + /* ActChgCrsDegCfg */{1587,-1,TabCrs,ActSeeCrsInf ,0x1E0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,Crs_ChangeCrsDegreeInConfig ,Crs_ContEditAfterChgCrsInConfig,NULL}, /* ActChgInsCrsCodCfg*/{1024,-1,TabCrs,ActSeeCrsInf ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Crs_ChangeInsCrsCodInConfig ,Crs_ContEditAfterChgCrsInConfig,NULL}, /* ActChgCrsYeaCfg */{1573,-1,TabCrs,ActSeeCrsInf ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Crs_ChangeCrsYearInConfig ,Crs_ContEditAfterChgCrsInConfig,NULL}, /* ActEdiCrsInf */{ 848,-1,TabCrs,ActSeeCrsInf ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Inf_FormsToSelSendInfo ,NULL}, + /* ActEdiTchGui */{ 785,-1,TabCrs,ActSeeTchGui ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Inf_FormsToSelSendInfo ,NULL}, /* ActPrnCrsTT */{ 152,-1,TabCrs,ActSeeCrsTT ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,TT_ShowClassTimeTable ,NULL}, @@ -4437,6 +4440,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActChkUsrAcc, // #1584 ActAutUsrNew, // #1585 ActReqMyUsgRep, // #1586 + ActChgCrsDegCfg, // #1587 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index b0a4f5f6e..1c0d8e9e5 100644 --- a/swad_action.h +++ b/swad_action.h @@ -55,9 +55,9 @@ typedef enum typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action -#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+246+186+155+172+36+30+86) +#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+247+186+155+172+36+30+86) -#define Act_MAX_ACTION_COD 1586 +#define Act_MAX_ACTION_COD 1587 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20 @@ -444,253 +444,254 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica // Secondary actions #define ActCrsSch (ActDowShaDeg+ 12) #define ActPrnCrsInf (ActDowShaDeg+ 13) -#define ActChgInsCrsCodCfg (ActDowShaDeg+ 14) -#define ActChgCrsYeaCfg (ActDowShaDeg+ 15) -#define ActEdiCrsInf (ActDowShaDeg+ 16) -#define ActEdiTchGui (ActDowShaDeg+ 17) -#define ActPrnCrsTT (ActDowShaDeg+ 18) -#define ActEdiCrsTT (ActDowShaDeg+ 19) -#define ActChgCrsTT (ActDowShaDeg+ 20) -#define ActChgCrsTT1stDay (ActDowShaDeg+ 21) -#define ActSeeSylLec (ActDowShaDeg+ 22) -#define ActSeeSylPra (ActDowShaDeg+ 23) -#define ActEdiSylLec (ActDowShaDeg+ 24) -#define ActEdiSylPra (ActDowShaDeg+ 25) -#define ActDelItmSylLec (ActDowShaDeg+ 26) -#define ActDelItmSylPra (ActDowShaDeg+ 27) -#define ActUp_IteSylLec (ActDowShaDeg+ 28) -#define ActUp_IteSylPra (ActDowShaDeg+ 29) -#define ActDwnIteSylLec (ActDowShaDeg+ 30) -#define ActDwnIteSylPra (ActDowShaDeg+ 31) -#define ActRgtIteSylLec (ActDowShaDeg+ 32) -#define ActRgtIteSylPra (ActDowShaDeg+ 33) -#define ActLftIteSylLec (ActDowShaDeg+ 34) -#define ActLftIteSylPra (ActDowShaDeg+ 35) -#define ActInsIteSylLec (ActDowShaDeg+ 36) -#define ActInsIteSylPra (ActDowShaDeg+ 37) -#define ActModIteSylLec (ActDowShaDeg+ 38) -#define ActModIteSylPra (ActDowShaDeg+ 39) +#define ActChgCrsDegCfg (ActDowShaDeg+ 14) +#define ActChgInsCrsCodCfg (ActDowShaDeg+ 15) +#define ActChgCrsYeaCfg (ActDowShaDeg+ 16) +#define ActEdiCrsInf (ActDowShaDeg+ 17) +#define ActEdiTchGui (ActDowShaDeg+ 18) +#define ActPrnCrsTT (ActDowShaDeg+ 19) +#define ActEdiCrsTT (ActDowShaDeg+ 20) +#define ActChgCrsTT (ActDowShaDeg+ 21) +#define ActChgCrsTT1stDay (ActDowShaDeg+ 22) +#define ActSeeSylLec (ActDowShaDeg+ 23) +#define ActSeeSylPra (ActDowShaDeg+ 24) +#define ActEdiSylLec (ActDowShaDeg+ 25) +#define ActEdiSylPra (ActDowShaDeg+ 26) +#define ActDelItmSylLec (ActDowShaDeg+ 27) +#define ActDelItmSylPra (ActDowShaDeg+ 28) +#define ActUp_IteSylLec (ActDowShaDeg+ 29) +#define ActUp_IteSylPra (ActDowShaDeg+ 30) +#define ActDwnIteSylLec (ActDowShaDeg+ 31) +#define ActDwnIteSylPra (ActDowShaDeg+ 32) +#define ActRgtIteSylLec (ActDowShaDeg+ 33) +#define ActRgtIteSylPra (ActDowShaDeg+ 34) +#define ActLftIteSylLec (ActDowShaDeg+ 35) +#define ActLftIteSylPra (ActDowShaDeg+ 36) +#define ActInsIteSylLec (ActDowShaDeg+ 37) +#define ActInsIteSylPra (ActDowShaDeg+ 38) +#define ActModIteSylLec (ActDowShaDeg+ 39) +#define ActModIteSylPra (ActDowShaDeg+ 40) -#define ActChgToSeeDocCrs (ActDowShaDeg+ 40) -#define ActSeeDocCrs (ActDowShaDeg+ 41) -#define ActExpSeeDocCrs (ActDowShaDeg+ 42) -#define ActConSeeDocCrs (ActDowShaDeg+ 43) -#define ActZIPSeeDocCrs (ActDowShaDeg+ 44) -#define ActReqDatSeeDocCrs (ActDowShaDeg+ 45) -#define ActDowSeeDocCrs (ActDowShaDeg+ 46) +#define ActChgToSeeDocCrs (ActDowShaDeg+ 41) +#define ActSeeDocCrs (ActDowShaDeg+ 42) +#define ActExpSeeDocCrs (ActDowShaDeg+ 43) +#define ActConSeeDocCrs (ActDowShaDeg+ 44) +#define ActZIPSeeDocCrs (ActDowShaDeg+ 45) +#define ActReqDatSeeDocCrs (ActDowShaDeg+ 46) +#define ActDowSeeDocCrs (ActDowShaDeg+ 47) -#define ActSeeDocGrp (ActDowShaDeg+ 47) -#define ActExpSeeDocGrp (ActDowShaDeg+ 48) -#define ActConSeeDocGrp (ActDowShaDeg+ 49) -#define ActZIPSeeDocGrp (ActDowShaDeg+ 50) -#define ActReqDatSeeDocGrp (ActDowShaDeg+ 51) -#define ActDowSeeDocGrp (ActDowShaDeg+ 52) +#define ActSeeDocGrp (ActDowShaDeg+ 48) +#define ActExpSeeDocGrp (ActDowShaDeg+ 49) +#define ActConSeeDocGrp (ActDowShaDeg+ 50) +#define ActZIPSeeDocGrp (ActDowShaDeg+ 51) +#define ActReqDatSeeDocGrp (ActDowShaDeg+ 52) +#define ActDowSeeDocGrp (ActDowShaDeg+ 53) -#define ActChgToAdmDocCrs (ActDowShaDeg+ 53) -#define ActAdmDocCrs (ActDowShaDeg+ 54) -#define ActReqRemFilDocCrs (ActDowShaDeg+ 55) -#define ActRemFilDocCrs (ActDowShaDeg+ 56) -#define ActRemFolDocCrs (ActDowShaDeg+ 57) -#define ActCopDocCrs (ActDowShaDeg+ 58) -#define ActPasDocCrs (ActDowShaDeg+ 59) -#define ActRemTreDocCrs (ActDowShaDeg+ 60) -#define ActFrmCreDocCrs (ActDowShaDeg+ 61) -#define ActCreFolDocCrs (ActDowShaDeg+ 62) -#define ActCreLnkDocCrs (ActDowShaDeg+ 63) -#define ActRenFolDocCrs (ActDowShaDeg+ 64) -#define ActRcvFilDocCrsDZ (ActDowShaDeg+ 65) -#define ActRcvFilDocCrsCla (ActDowShaDeg+ 66) -#define ActExpAdmDocCrs (ActDowShaDeg+ 67) -#define ActConAdmDocCrs (ActDowShaDeg+ 68) -#define ActZIPAdmDocCrs (ActDowShaDeg+ 69) -#define ActShoDocCrs (ActDowShaDeg+ 70) -#define ActHidDocCrs (ActDowShaDeg+ 71) -#define ActReqDatAdmDocCrs (ActDowShaDeg+ 72) -#define ActChgDatAdmDocCrs (ActDowShaDeg+ 73) -#define ActDowAdmDocCrs (ActDowShaDeg+ 74) +#define ActChgToAdmDocCrs (ActDowShaDeg+ 54) +#define ActAdmDocCrs (ActDowShaDeg+ 55) +#define ActReqRemFilDocCrs (ActDowShaDeg+ 56) +#define ActRemFilDocCrs (ActDowShaDeg+ 57) +#define ActRemFolDocCrs (ActDowShaDeg+ 58) +#define ActCopDocCrs (ActDowShaDeg+ 59) +#define ActPasDocCrs (ActDowShaDeg+ 60) +#define ActRemTreDocCrs (ActDowShaDeg+ 61) +#define ActFrmCreDocCrs (ActDowShaDeg+ 62) +#define ActCreFolDocCrs (ActDowShaDeg+ 63) +#define ActCreLnkDocCrs (ActDowShaDeg+ 64) +#define ActRenFolDocCrs (ActDowShaDeg+ 65) +#define ActRcvFilDocCrsDZ (ActDowShaDeg+ 66) +#define ActRcvFilDocCrsCla (ActDowShaDeg+ 67) +#define ActExpAdmDocCrs (ActDowShaDeg+ 68) +#define ActConAdmDocCrs (ActDowShaDeg+ 69) +#define ActZIPAdmDocCrs (ActDowShaDeg+ 70) +#define ActShoDocCrs (ActDowShaDeg+ 71) +#define ActHidDocCrs (ActDowShaDeg+ 72) +#define ActReqDatAdmDocCrs (ActDowShaDeg+ 73) +#define ActChgDatAdmDocCrs (ActDowShaDeg+ 74) +#define ActDowAdmDocCrs (ActDowShaDeg+ 75) -#define ActAdmDocGrp (ActDowShaDeg+ 75) -#define ActReqRemFilDocGrp (ActDowShaDeg+ 76) -#define ActRemFilDocGrp (ActDowShaDeg+ 77) -#define ActRemFolDocGrp (ActDowShaDeg+ 78) -#define ActCopDocGrp (ActDowShaDeg+ 79) -#define ActPasDocGrp (ActDowShaDeg+ 80) -#define ActRemTreDocGrp (ActDowShaDeg+ 81) -#define ActFrmCreDocGrp (ActDowShaDeg+ 82) -#define ActCreFolDocGrp (ActDowShaDeg+ 83) -#define ActCreLnkDocGrp (ActDowShaDeg+ 84) -#define ActRenFolDocGrp (ActDowShaDeg+ 85) -#define ActRcvFilDocGrpDZ (ActDowShaDeg+ 86) -#define ActRcvFilDocGrpCla (ActDowShaDeg+ 87) -#define ActExpAdmDocGrp (ActDowShaDeg+ 88) -#define ActConAdmDocGrp (ActDowShaDeg+ 89) -#define ActZIPAdmDocGrp (ActDowShaDeg+ 90) -#define ActShoDocGrp (ActDowShaDeg+ 91) -#define ActHidDocGrp (ActDowShaDeg+ 92) -#define ActReqDatAdmDocGrp (ActDowShaDeg+ 93) -#define ActChgDatAdmDocGrp (ActDowShaDeg+ 94) -#define ActDowAdmDocGrp (ActDowShaDeg+ 95) +#define ActAdmDocGrp (ActDowShaDeg+ 76) +#define ActReqRemFilDocGrp (ActDowShaDeg+ 77) +#define ActRemFilDocGrp (ActDowShaDeg+ 78) +#define ActRemFolDocGrp (ActDowShaDeg+ 79) +#define ActCopDocGrp (ActDowShaDeg+ 80) +#define ActPasDocGrp (ActDowShaDeg+ 81) +#define ActRemTreDocGrp (ActDowShaDeg+ 82) +#define ActFrmCreDocGrp (ActDowShaDeg+ 83) +#define ActCreFolDocGrp (ActDowShaDeg+ 84) +#define ActCreLnkDocGrp (ActDowShaDeg+ 85) +#define ActRenFolDocGrp (ActDowShaDeg+ 86) +#define ActRcvFilDocGrpDZ (ActDowShaDeg+ 87) +#define ActRcvFilDocGrpCla (ActDowShaDeg+ 88) +#define ActExpAdmDocGrp (ActDowShaDeg+ 89) +#define ActConAdmDocGrp (ActDowShaDeg+ 90) +#define ActZIPAdmDocGrp (ActDowShaDeg+ 91) +#define ActShoDocGrp (ActDowShaDeg+ 92) +#define ActHidDocGrp (ActDowShaDeg+ 93) +#define ActReqDatAdmDocGrp (ActDowShaDeg+ 94) +#define ActChgDatAdmDocGrp (ActDowShaDeg+ 95) +#define ActDowAdmDocGrp (ActDowShaDeg+ 96) -#define ActChgToAdmTch (ActDowShaDeg+ 96) +#define ActChgToAdmTch (ActDowShaDeg+ 97) -#define ActAdmTchCrs (ActDowShaDeg+ 97) -#define ActReqRemFilTchCrs (ActDowShaDeg+ 98) -#define ActRemFilTchCrs (ActDowShaDeg+ 99) -#define ActRemFolTchCrs (ActDowShaDeg+100) -#define ActCopTchCrs (ActDowShaDeg+101) -#define ActPasTchCrs (ActDowShaDeg+102) -#define ActRemTreTchCrs (ActDowShaDeg+103) -#define ActFrmCreTchCrs (ActDowShaDeg+104) -#define ActCreFolTchCrs (ActDowShaDeg+105) -#define ActCreLnkTchCrs (ActDowShaDeg+106) -#define ActRenFolTchCrs (ActDowShaDeg+107) -#define ActRcvFilTchCrsDZ (ActDowShaDeg+108) -#define ActRcvFilTchCrsCla (ActDowShaDeg+109) -#define ActExpTchCrs (ActDowShaDeg+110) -#define ActConTchCrs (ActDowShaDeg+111) -#define ActZIPTchCrs (ActDowShaDeg+112) -#define ActReqDatTchCrs (ActDowShaDeg+113) -#define ActChgDatTchCrs (ActDowShaDeg+114) -#define ActDowTchCrs (ActDowShaDeg+115) +#define ActAdmTchCrs (ActDowShaDeg+ 98) +#define ActReqRemFilTchCrs (ActDowShaDeg+ 99) +#define ActRemFilTchCrs (ActDowShaDeg+100) +#define ActRemFolTchCrs (ActDowShaDeg+101) +#define ActCopTchCrs (ActDowShaDeg+102) +#define ActPasTchCrs (ActDowShaDeg+103) +#define ActRemTreTchCrs (ActDowShaDeg+104) +#define ActFrmCreTchCrs (ActDowShaDeg+105) +#define ActCreFolTchCrs (ActDowShaDeg+106) +#define ActCreLnkTchCrs (ActDowShaDeg+107) +#define ActRenFolTchCrs (ActDowShaDeg+108) +#define ActRcvFilTchCrsDZ (ActDowShaDeg+109) +#define ActRcvFilTchCrsCla (ActDowShaDeg+110) +#define ActExpTchCrs (ActDowShaDeg+111) +#define ActConTchCrs (ActDowShaDeg+112) +#define ActZIPTchCrs (ActDowShaDeg+113) +#define ActReqDatTchCrs (ActDowShaDeg+114) +#define ActChgDatTchCrs (ActDowShaDeg+115) +#define ActDowTchCrs (ActDowShaDeg+116) -#define ActAdmTchGrp (ActDowShaDeg+116) -#define ActReqRemFilTchGrp (ActDowShaDeg+117) -#define ActRemFilTchGrp (ActDowShaDeg+118) -#define ActRemFolTchGrp (ActDowShaDeg+119) -#define ActCopTchGrp (ActDowShaDeg+120) -#define ActPasTchGrp (ActDowShaDeg+121) -#define ActRemTreTchGrp (ActDowShaDeg+122) -#define ActFrmCreTchGrp (ActDowShaDeg+123) -#define ActCreFolTchGrp (ActDowShaDeg+124) -#define ActCreLnkTchGrp (ActDowShaDeg+125) -#define ActRenFolTchGrp (ActDowShaDeg+126) -#define ActRcvFilTchGrpDZ (ActDowShaDeg+127) -#define ActRcvFilTchGrpCla (ActDowShaDeg+128) -#define ActExpTchGrp (ActDowShaDeg+129) -#define ActConTchGrp (ActDowShaDeg+130) -#define ActZIPTchGrp (ActDowShaDeg+131) -#define ActReqDatTchGrp (ActDowShaDeg+132) -#define ActChgDatTchGrp (ActDowShaDeg+133) -#define ActDowTchGrp (ActDowShaDeg+134) +#define ActAdmTchGrp (ActDowShaDeg+117) +#define ActReqRemFilTchGrp (ActDowShaDeg+118) +#define ActRemFilTchGrp (ActDowShaDeg+119) +#define ActRemFolTchGrp (ActDowShaDeg+120) +#define ActCopTchGrp (ActDowShaDeg+121) +#define ActPasTchGrp (ActDowShaDeg+122) +#define ActRemTreTchGrp (ActDowShaDeg+123) +#define ActFrmCreTchGrp (ActDowShaDeg+124) +#define ActCreFolTchGrp (ActDowShaDeg+125) +#define ActCreLnkTchGrp (ActDowShaDeg+126) +#define ActRenFolTchGrp (ActDowShaDeg+127) +#define ActRcvFilTchGrpDZ (ActDowShaDeg+128) +#define ActRcvFilTchGrpCla (ActDowShaDeg+129) +#define ActExpTchGrp (ActDowShaDeg+130) +#define ActConTchGrp (ActDowShaDeg+131) +#define ActZIPTchGrp (ActDowShaDeg+132) +#define ActReqDatTchGrp (ActDowShaDeg+133) +#define ActChgDatTchGrp (ActDowShaDeg+134) +#define ActDowTchGrp (ActDowShaDeg+135) -#define ActChgToAdmSha (ActDowShaDeg+135) +#define ActChgToAdmSha (ActDowShaDeg+136) -#define ActAdmShaCrs (ActDowShaDeg+136) -#define ActReqRemFilShaCrs (ActDowShaDeg+137) -#define ActRemFilShaCrs (ActDowShaDeg+138) -#define ActRemFolShaCrs (ActDowShaDeg+139) -#define ActCopShaCrs (ActDowShaDeg+140) -#define ActPasShaCrs (ActDowShaDeg+141) -#define ActRemTreShaCrs (ActDowShaDeg+142) -#define ActFrmCreShaCrs (ActDowShaDeg+143) -#define ActCreFolShaCrs (ActDowShaDeg+144) -#define ActCreLnkShaCrs (ActDowShaDeg+145) -#define ActRenFolShaCrs (ActDowShaDeg+146) -#define ActRcvFilShaCrsDZ (ActDowShaDeg+147) -#define ActRcvFilShaCrsCla (ActDowShaDeg+148) -#define ActExpShaCrs (ActDowShaDeg+149) -#define ActConShaCrs (ActDowShaDeg+150) -#define ActZIPShaCrs (ActDowShaDeg+151) -#define ActReqDatShaCrs (ActDowShaDeg+152) -#define ActChgDatShaCrs (ActDowShaDeg+153) -#define ActDowShaCrs (ActDowShaDeg+154) +#define ActAdmShaCrs (ActDowShaDeg+137) +#define ActReqRemFilShaCrs (ActDowShaDeg+138) +#define ActRemFilShaCrs (ActDowShaDeg+139) +#define ActRemFolShaCrs (ActDowShaDeg+140) +#define ActCopShaCrs (ActDowShaDeg+141) +#define ActPasShaCrs (ActDowShaDeg+142) +#define ActRemTreShaCrs (ActDowShaDeg+143) +#define ActFrmCreShaCrs (ActDowShaDeg+144) +#define ActCreFolShaCrs (ActDowShaDeg+145) +#define ActCreLnkShaCrs (ActDowShaDeg+146) +#define ActRenFolShaCrs (ActDowShaDeg+147) +#define ActRcvFilShaCrsDZ (ActDowShaDeg+148) +#define ActRcvFilShaCrsCla (ActDowShaDeg+149) +#define ActExpShaCrs (ActDowShaDeg+150) +#define ActConShaCrs (ActDowShaDeg+151) +#define ActZIPShaCrs (ActDowShaDeg+152) +#define ActReqDatShaCrs (ActDowShaDeg+153) +#define ActChgDatShaCrs (ActDowShaDeg+154) +#define ActDowShaCrs (ActDowShaDeg+155) -#define ActAdmShaGrp (ActDowShaDeg+155) -#define ActReqRemFilShaGrp (ActDowShaDeg+156) -#define ActRemFilShaGrp (ActDowShaDeg+157) -#define ActRemFolShaGrp (ActDowShaDeg+158) -#define ActCopShaGrp (ActDowShaDeg+159) -#define ActPasShaGrp (ActDowShaDeg+160) -#define ActRemTreShaGrp (ActDowShaDeg+161) -#define ActFrmCreShaGrp (ActDowShaDeg+162) -#define ActCreFolShaGrp (ActDowShaDeg+163) -#define ActCreLnkShaGrp (ActDowShaDeg+164) -#define ActRenFolShaGrp (ActDowShaDeg+165) -#define ActRcvFilShaGrpDZ (ActDowShaDeg+166) -#define ActRcvFilShaGrpCla (ActDowShaDeg+167) -#define ActExpShaGrp (ActDowShaDeg+168) -#define ActConShaGrp (ActDowShaDeg+169) -#define ActZIPShaGrp (ActDowShaDeg+170) -#define ActReqDatShaGrp (ActDowShaDeg+171) -#define ActChgDatShaGrp (ActDowShaDeg+172) -#define ActDowShaGrp (ActDowShaDeg+173) +#define ActAdmShaGrp (ActDowShaDeg+156) +#define ActReqRemFilShaGrp (ActDowShaDeg+157) +#define ActRemFilShaGrp (ActDowShaDeg+158) +#define ActRemFolShaGrp (ActDowShaDeg+159) +#define ActCopShaGrp (ActDowShaDeg+160) +#define ActPasShaGrp (ActDowShaDeg+161) +#define ActRemTreShaGrp (ActDowShaDeg+162) +#define ActFrmCreShaGrp (ActDowShaDeg+163) +#define ActCreFolShaGrp (ActDowShaDeg+164) +#define ActCreLnkShaGrp (ActDowShaDeg+165) +#define ActRenFolShaGrp (ActDowShaDeg+166) +#define ActRcvFilShaGrpDZ (ActDowShaDeg+167) +#define ActRcvFilShaGrpCla (ActDowShaDeg+168) +#define ActExpShaGrp (ActDowShaDeg+169) +#define ActConShaGrp (ActDowShaDeg+170) +#define ActZIPShaGrp (ActDowShaDeg+171) +#define ActReqDatShaGrp (ActDowShaDeg+172) +#define ActChgDatShaGrp (ActDowShaDeg+173) +#define ActDowShaGrp (ActDowShaDeg+174) -#define ActEdiBib (ActDowShaDeg+174) -#define ActEdiFAQ (ActDowShaDeg+175) -#define ActEdiCrsLnk (ActDowShaDeg+176) +#define ActEdiBib (ActDowShaDeg+175) +#define ActEdiFAQ (ActDowShaDeg+176) +#define ActEdiCrsLnk (ActDowShaDeg+177) -#define ActChgFrcReaCrsInf (ActDowShaDeg+177) -#define ActChgFrcReaTchGui (ActDowShaDeg+178) -#define ActChgFrcReaSylLec (ActDowShaDeg+179) -#define ActChgFrcReaSylPra (ActDowShaDeg+180) -#define ActChgFrcReaBib (ActDowShaDeg+181) -#define ActChgFrcReaFAQ (ActDowShaDeg+182) -#define ActChgFrcReaCrsLnk (ActDowShaDeg+183) +#define ActChgFrcReaCrsInf (ActDowShaDeg+178) +#define ActChgFrcReaTchGui (ActDowShaDeg+179) +#define ActChgFrcReaSylLec (ActDowShaDeg+180) +#define ActChgFrcReaSylPra (ActDowShaDeg+181) +#define ActChgFrcReaBib (ActDowShaDeg+182) +#define ActChgFrcReaFAQ (ActDowShaDeg+183) +#define ActChgFrcReaCrsLnk (ActDowShaDeg+184) -#define ActChgHavReaCrsInf (ActDowShaDeg+184) -#define ActChgHavReaTchGui (ActDowShaDeg+185) -#define ActChgHavReaSylLec (ActDowShaDeg+186) -#define ActChgHavReaSylPra (ActDowShaDeg+187) -#define ActChgHavReaBib (ActDowShaDeg+188) -#define ActChgHavReaFAQ (ActDowShaDeg+189) -#define ActChgHavReaCrsLnk (ActDowShaDeg+190) +#define ActChgHavReaCrsInf (ActDowShaDeg+185) +#define ActChgHavReaTchGui (ActDowShaDeg+186) +#define ActChgHavReaSylLec (ActDowShaDeg+187) +#define ActChgHavReaSylPra (ActDowShaDeg+188) +#define ActChgHavReaBib (ActDowShaDeg+189) +#define ActChgHavReaFAQ (ActDowShaDeg+190) +#define ActChgHavReaCrsLnk (ActDowShaDeg+191) -#define ActSelInfSrcCrsInf (ActDowShaDeg+191) -#define ActSelInfSrcTchGui (ActDowShaDeg+192) -#define ActSelInfSrcSylLec (ActDowShaDeg+193) -#define ActSelInfSrcSylPra (ActDowShaDeg+194) -#define ActSelInfSrcBib (ActDowShaDeg+195) -#define ActSelInfSrcFAQ (ActDowShaDeg+196) -#define ActSelInfSrcCrsLnk (ActDowShaDeg+197) -#define ActRcvURLCrsInf (ActDowShaDeg+198) -#define ActRcvURLTchGui (ActDowShaDeg+199) -#define ActRcvURLSylLec (ActDowShaDeg+200) -#define ActRcvURLSylPra (ActDowShaDeg+201) -#define ActRcvURLBib (ActDowShaDeg+202) -#define ActRcvURLFAQ (ActDowShaDeg+203) -#define ActRcvURLCrsLnk (ActDowShaDeg+204) -#define ActRcvPagCrsInf (ActDowShaDeg+205) -#define ActRcvPagTchGui (ActDowShaDeg+206) -#define ActRcvPagSylLec (ActDowShaDeg+207) -#define ActRcvPagSylPra (ActDowShaDeg+208) -#define ActRcvPagBib (ActDowShaDeg+209) -#define ActRcvPagFAQ (ActDowShaDeg+210) -#define ActRcvPagCrsLnk (ActDowShaDeg+211) -#define ActEditorCrsInf (ActDowShaDeg+212) -#define ActEditorTchGui (ActDowShaDeg+213) -#define ActEditorSylLec (ActDowShaDeg+214) -#define ActEditorSylPra (ActDowShaDeg+215) -#define ActEditorBib (ActDowShaDeg+216) -#define ActEditorFAQ (ActDowShaDeg+217) -#define ActEditorCrsLnk (ActDowShaDeg+218) -#define ActPlaTxtEdiCrsInf (ActDowShaDeg+219) -#define ActPlaTxtEdiTchGui (ActDowShaDeg+220) -#define ActPlaTxtEdiSylLec (ActDowShaDeg+221) -#define ActPlaTxtEdiSylPra (ActDowShaDeg+222) -#define ActPlaTxtEdiBib (ActDowShaDeg+223) -#define ActPlaTxtEdiFAQ (ActDowShaDeg+224) -#define ActPlaTxtEdiCrsLnk (ActDowShaDeg+225) -#define ActRchTxtEdiCrsInf (ActDowShaDeg+226) -#define ActRchTxtEdiTchGui (ActDowShaDeg+227) -#define ActRchTxtEdiSylLec (ActDowShaDeg+228) -#define ActRchTxtEdiSylPra (ActDowShaDeg+229) -#define ActRchTxtEdiBib (ActDowShaDeg+230) -#define ActRchTxtEdiFAQ (ActDowShaDeg+231) -#define ActRchTxtEdiCrsLnk (ActDowShaDeg+232) -#define ActRcvPlaTxtCrsInf (ActDowShaDeg+233) -#define ActRcvPlaTxtTchGui (ActDowShaDeg+234) -#define ActRcvPlaTxtSylLec (ActDowShaDeg+235) -#define ActRcvPlaTxtSylPra (ActDowShaDeg+236) -#define ActRcvPlaTxtBib (ActDowShaDeg+237) -#define ActRcvPlaTxtFAQ (ActDowShaDeg+238) -#define ActRcvPlaTxtCrsLnk (ActDowShaDeg+239) -#define ActRcvRchTxtCrsInf (ActDowShaDeg+240) -#define ActRcvRchTxtTchGui (ActDowShaDeg+241) -#define ActRcvRchTxtSylLec (ActDowShaDeg+242) -#define ActRcvRchTxtSylPra (ActDowShaDeg+243) -#define ActRcvRchTxtBib (ActDowShaDeg+244) -#define ActRcvRchTxtFAQ (ActDowShaDeg+245) -#define ActRcvRchTxtCrsLnk (ActDowShaDeg+246) +#define ActSelInfSrcCrsInf (ActDowShaDeg+192) +#define ActSelInfSrcTchGui (ActDowShaDeg+193) +#define ActSelInfSrcSylLec (ActDowShaDeg+194) +#define ActSelInfSrcSylPra (ActDowShaDeg+195) +#define ActSelInfSrcBib (ActDowShaDeg+196) +#define ActSelInfSrcFAQ (ActDowShaDeg+197) +#define ActSelInfSrcCrsLnk (ActDowShaDeg+198) +#define ActRcvURLCrsInf (ActDowShaDeg+199) +#define ActRcvURLTchGui (ActDowShaDeg+200) +#define ActRcvURLSylLec (ActDowShaDeg+201) +#define ActRcvURLSylPra (ActDowShaDeg+202) +#define ActRcvURLBib (ActDowShaDeg+203) +#define ActRcvURLFAQ (ActDowShaDeg+204) +#define ActRcvURLCrsLnk (ActDowShaDeg+205) +#define ActRcvPagCrsInf (ActDowShaDeg+206) +#define ActRcvPagTchGui (ActDowShaDeg+207) +#define ActRcvPagSylLec (ActDowShaDeg+208) +#define ActRcvPagSylPra (ActDowShaDeg+209) +#define ActRcvPagBib (ActDowShaDeg+210) +#define ActRcvPagFAQ (ActDowShaDeg+211) +#define ActRcvPagCrsLnk (ActDowShaDeg+212) +#define ActEditorCrsInf (ActDowShaDeg+213) +#define ActEditorTchGui (ActDowShaDeg+214) +#define ActEditorSylLec (ActDowShaDeg+215) +#define ActEditorSylPra (ActDowShaDeg+216) +#define ActEditorBib (ActDowShaDeg+217) +#define ActEditorFAQ (ActDowShaDeg+218) +#define ActEditorCrsLnk (ActDowShaDeg+219) +#define ActPlaTxtEdiCrsInf (ActDowShaDeg+220) +#define ActPlaTxtEdiTchGui (ActDowShaDeg+221) +#define ActPlaTxtEdiSylLec (ActDowShaDeg+222) +#define ActPlaTxtEdiSylPra (ActDowShaDeg+223) +#define ActPlaTxtEdiBib (ActDowShaDeg+224) +#define ActPlaTxtEdiFAQ (ActDowShaDeg+225) +#define ActPlaTxtEdiCrsLnk (ActDowShaDeg+226) +#define ActRchTxtEdiCrsInf (ActDowShaDeg+227) +#define ActRchTxtEdiTchGui (ActDowShaDeg+228) +#define ActRchTxtEdiSylLec (ActDowShaDeg+229) +#define ActRchTxtEdiSylPra (ActDowShaDeg+230) +#define ActRchTxtEdiBib (ActDowShaDeg+231) +#define ActRchTxtEdiFAQ (ActDowShaDeg+232) +#define ActRchTxtEdiCrsLnk (ActDowShaDeg+233) +#define ActRcvPlaTxtCrsInf (ActDowShaDeg+234) +#define ActRcvPlaTxtTchGui (ActDowShaDeg+235) +#define ActRcvPlaTxtSylLec (ActDowShaDeg+236) +#define ActRcvPlaTxtSylPra (ActDowShaDeg+237) +#define ActRcvPlaTxtBib (ActDowShaDeg+238) +#define ActRcvPlaTxtFAQ (ActDowShaDeg+239) +#define ActRcvPlaTxtCrsLnk (ActDowShaDeg+240) +#define ActRcvRchTxtCrsInf (ActDowShaDeg+241) +#define ActRcvRchTxtTchGui (ActDowShaDeg+242) +#define ActRcvRchTxtSylLec (ActDowShaDeg+243) +#define ActRcvRchTxtSylPra (ActDowShaDeg+244) +#define ActRcvRchTxtBib (ActDowShaDeg+245) +#define ActRcvRchTxtFAQ (ActDowShaDeg+246) +#define ActRcvRchTxtCrsLnk (ActDowShaDeg+247) /*****************************************************************************/ /***************************** Assessment tab ********************************/ diff --git a/swad_changelog.h b/swad_changelog.h index f8e44d08e..a62918e9a 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -148,13 +148,15 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.21.3 (2016-10-12)" +#define Log_PLATFORM_VERSION "SWAD 16.22 (2016-10-19)" #define CSS_FILE "swad15.229.css" #define JS_FILE "swad15.238.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 16.22: Oct 19, 2016 New form in course configuration to change course degree. + Code refactorization related with courses and degrees. (205367 lines) Version 16.21.3: Oct 12, 2016 Changes in layout of file browser. (205266 lines) Version 16.21.2: Oct 12, 2016 Unused code removed from actions. (205263 lines) Version 16.21.1: Oct 12, 2016 Code refactoring in actions. (205280 lines) diff --git a/swad_course.c b/swad_course.c index d27d66a33..ae3b4ce87 100644 --- a/swad_course.c +++ b/swad_course.c @@ -146,8 +146,8 @@ void Crs_PrintConfiguration (void) static void Crs_Configuration (bool PrintView) { - // extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS]; extern const char *The_ClassForm[The_NUM_THEMES]; + extern const char *Txt_Degree; extern const char *Txt_Course; extern const char *Txt_Short_name; extern const char *Txt_Year_OF_A_DEGREE; @@ -161,6 +161,7 @@ static void Crs_Configuration (bool PrintView) extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_Indicators; extern const char *Txt_of_PART_OF_A_TOTAL; + unsigned NumDeg; unsigned Year; int NumIndicatorsFromDB; struct Ind_IndicatorsCrs Indicators; @@ -202,6 +203,47 @@ static void Crs_Configuration (bool PrintView) /***** Start table *****/ fprintf (Gbl.F.Out,""); + /***** Course degree *****/ + fprintf (Gbl.F.Out,"" + "" + "" + ""); + /***** Course full name *****/ fprintf (Gbl.F.Out,"" "
" + "%s:" + "", + The_ClassForm[Gbl.Prefs.Theme], + Txt_Degree); + + /* Get list of degrees administrated by me */ + Deg_GetListDegsAdminByMe (); + + /* Put form to select degree */ + if (Gbl.Usrs.Me.MyAdminDegs.Num) + { + Act_FormStart (ActChgCrsDegCfg); + fprintf (Gbl.F.Out,""); + + Act_FormEnd (); + } + else + fprintf (Gbl.F.Out,"%s",Gbl.CurrentDeg.Deg.FullName); + + /* Free list of degrees administrated by me */ + Deg_FreeListMyAdminDegs (); + + fprintf (Gbl.F.Out,"
" @@ -2381,6 +2423,100 @@ void Crs_ChangeInsCrsCod (void) } } +/*****************************************************************************/ +/***************** Change the degree of the current course *******************/ +/*****************************************************************************/ + +void Crs_ChangeCrsDegreeInConfig (void) + { + extern const char *Txt_In_the_year_X_of_the_degree_Y_already_existed_a_course_with_the_name_Z; + extern const char *Txt_YEAR_OF_DEGREE[1+Deg_MAX_YEARS_PER_DEGREE]; + extern const char *Txt_The_course_X_has_been_moved_to_the_degree_Y; + extern const char *Txt_You_dont_have_permission_to_move_courses_to_the_degree_X; + bool ICanChangeCrsToNewDeg; + char Query[512]; + struct Degree NewDeg; + struct Centre NewCtr; + + /***** Get new degree from form *****/ + /* Get new degree code */ + if ((NewDeg.DegCod = Deg_GetParamOtherDegCod ()) == -1L) + Lay_ShowErrorAndExit ("Code of degree is missing."); + /* Get data of new degree */ + Deg_GetDataOfDegreeByCod (&NewDeg); + + /***** Check if I have permission to change course to this degree *****/ + switch (Gbl.Usrs.Me.LoggedRole) + { + case Rol_DEG_ADM: + ICanChangeCrsToNewDeg = Usr_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod, + Sco_SCOPE_DEG, + NewDeg.DegCod); + break; + case Rol_CTR_ADM: + ICanChangeCrsToNewDeg = Usr_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod, + Sco_SCOPE_CTR, + NewDeg.CtrCod); + break; + case Rol_INS_ADM: + /* Get data of centre of new degree */ + NewCtr.CtrCod = NewDeg.CtrCod; + Ctr_GetDataOfCentreByCod (&NewCtr); + + ICanChangeCrsToNewDeg = Usr_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod, + Sco_SCOPE_INS, + NewCtr.InsCod); + break; + case Rol_SYS_ADM: + ICanChangeCrsToNewDeg = true; + break; + default: + ICanChangeCrsToNewDeg = false; + break; + } + + /***** If I have permission to change course to this new degree... *****/ + if (ICanChangeCrsToNewDeg) + { + /***** If name of course was in database in the new degree... *****/ + if (Crs_CheckIfCourseNameExistsInCourses (NewDeg.DegCod,Gbl.CurrentCrs.Crs.Year, + "ShortName",Gbl.CurrentCrs.Crs.ShortName,-1L)) + { + sprintf (Gbl.Message,Txt_In_the_year_X_of_the_degree_Y_already_existed_a_course_with_the_name_Z, + Txt_YEAR_OF_DEGREE[Gbl.CurrentCrs.Crs.Year],NewDeg.FullName,Gbl.CurrentCrs.Crs.ShortName); + Gbl.Error = true; + } + else if (Crs_CheckIfCourseNameExistsInCourses (NewDeg.DegCod,Gbl.CurrentCrs.Crs.Year, + "FullName",Gbl.CurrentCrs.Crs.FullName,-1L)) + { + sprintf (Gbl.Message,Txt_In_the_year_X_of_the_degree_Y_already_existed_a_course_with_the_name_Z, + Txt_YEAR_OF_DEGREE[Gbl.CurrentCrs.Crs.Year],NewDeg.FullName,Gbl.CurrentCrs.Crs.FullName); + Gbl.Error = true; + } + else // Update degree in database + { + /***** Update degree in table of courses *****/ + sprintf (Query,"UPDATE courses SET DegCod='%ld' WHERE CrsCod='%ld'", + NewDeg.DegCod,Gbl.CurrentCrs.Crs.CrsCod); + DB_QueryUPDATE (Query,"can not move course to another degree"); + Gbl.CurrentCrs.Crs.DegCod = NewDeg.DegCod; + + /***** Initialize again current course, degree, centre... *****/ + Deg_InitCurrentCourse (); + + /***** Create message to show the change made *****/ + sprintf (Gbl.Message,Txt_The_course_X_has_been_moved_to_the_degree_Y, + Gbl.CurrentCrs.Crs.FullName,NewDeg.FullName); + } + } + else // I have no permission to change course to this new degree + { + sprintf (Gbl.Message,Txt_You_dont_have_permission_to_move_courses_to_the_degree_X, + NewDeg.FullName); + Gbl.Error = true; + } + } + /*****************************************************************************/ /****** Change the degree of a course (move course to another degree) ********/ /*****************************************************************************/ @@ -2390,12 +2526,12 @@ void Crs_ChangeCrsDegree (void) extern const char *Txt_In_the_year_X_of_the_degree_Y_already_existed_a_course_with_the_name_Z; extern const char *Txt_YEAR_OF_DEGREE[1+Deg_MAX_YEARS_PER_DEGREE]; extern const char *Txt_The_course_X_has_been_moved_to_the_degree_Y; - extern const char *Txt_The_year_X_is_not_allowed; extern const char *Txt_You_dont_have_permission_to_move_courses_to_the_degree_X; struct Course *Crs; bool ICanChangeCrsToNewDeg; char Query[512]; struct Degree NewDeg; + struct Centre NewCtr; Crs = &Gbl.Degs.EditingCrs; @@ -2408,59 +2544,69 @@ void Crs_ChangeCrsDegree (void) if ((NewDeg.DegCod = Deg_GetParamOtherDegCod ()) == -1L) Lay_ShowErrorAndExit ("Code of degree is missing."); - /* Check if I have permission to change course to this degree */ - if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM) - ICanChangeCrsToNewDeg = true; - else if (Gbl.Usrs.Me.LoggedRole == Rol_DEG_ADM) - ICanChangeCrsToNewDeg = Usr_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod, - Sco_SCOPE_DEG, - NewDeg.DegCod); - else - ICanChangeCrsToNewDeg = false; - /***** Get data of course and new degree *****/ Crs_GetDataOfCourseByCod (Crs); Deg_GetDataOfDegreeByCod (&NewDeg); + switch (Gbl.Usrs.Me.LoggedRole) + { + case Rol_DEG_ADM: + ICanChangeCrsToNewDeg = Usr_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod, + Sco_SCOPE_DEG, + NewDeg.DegCod); + break; + case Rol_CTR_ADM: + ICanChangeCrsToNewDeg = Usr_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod, + Sco_SCOPE_CTR, + NewDeg.CtrCod); + break; + case Rol_INS_ADM: + /* Get data of centre of new degree */ + NewCtr.CtrCod = NewDeg.CtrCod; + Ctr_GetDataOfCentreByCod (&NewCtr); + + ICanChangeCrsToNewDeg = Usr_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod, + Sco_SCOPE_INS, + NewCtr.InsCod); + break; + case Rol_SYS_ADM: + ICanChangeCrsToNewDeg = true; + break; + default: + ICanChangeCrsToNewDeg = false; + break; + } + /***** If I have permission to change course to this new degree... *****/ if (ICanChangeCrsToNewDeg) { - /***** If new degree has current course year... *****/ - if (Crs->Year <= Deg_MAX_YEARS_PER_DEGREE) - { - /***** If name of course was in database in the new degree... *****/ - if (Crs_CheckIfCourseNameExistsInCourses (NewDeg.DegCod,Crs->Year, - "ShortName",Crs->ShortName,-1L)) - { - sprintf (Gbl.Message,Txt_In_the_year_X_of_the_degree_Y_already_existed_a_course_with_the_name_Z, - Txt_YEAR_OF_DEGREE[Crs->Year],NewDeg.FullName,Crs->ShortName); - Gbl.Error = true; - } - else if (Crs_CheckIfCourseNameExistsInCourses (NewDeg.DegCod,Crs->Year, - "FullName",Crs->FullName,-1L)) - { - sprintf (Gbl.Message,Txt_In_the_year_X_of_the_degree_Y_already_existed_a_course_with_the_name_Z, - Txt_YEAR_OF_DEGREE[Crs->Year],NewDeg.FullName,Crs->FullName); - Gbl.Error = true; - } - else // Update degree in database - { - /***** Update degree in table of courses *****/ - sprintf (Query,"UPDATE courses SET DegCod='%ld' WHERE CrsCod='%ld'", - NewDeg.DegCod,Crs->CrsCod); - DB_QueryUPDATE (Query,"can not move course to another degree"); - Crs->DegCod = NewDeg.DegCod; + /***** If name of course was in database in the new degree... *****/ + if (Crs_CheckIfCourseNameExistsInCourses (NewDeg.DegCod,Crs->Year, + "ShortName",Crs->ShortName,-1L)) + { + sprintf (Gbl.Message,Txt_In_the_year_X_of_the_degree_Y_already_existed_a_course_with_the_name_Z, + Txt_YEAR_OF_DEGREE[Crs->Year],NewDeg.FullName,Crs->ShortName); + Gbl.Error = true; + } + else if (Crs_CheckIfCourseNameExistsInCourses (NewDeg.DegCod,Crs->Year, + "FullName",Crs->FullName,-1L)) + { + sprintf (Gbl.Message,Txt_In_the_year_X_of_the_degree_Y_already_existed_a_course_with_the_name_Z, + Txt_YEAR_OF_DEGREE[Crs->Year],NewDeg.FullName,Crs->FullName); + Gbl.Error = true; + } + else // Update degree in database + { + /***** Update degree in table of courses *****/ + sprintf (Query,"UPDATE courses SET DegCod='%ld' WHERE CrsCod='%ld'", + NewDeg.DegCod,Crs->CrsCod); + DB_QueryUPDATE (Query,"can not move course to another degree"); + Crs->DegCod = NewDeg.DegCod; - /***** Create message to show the change made *****/ - sprintf (Gbl.Message,Txt_The_course_X_has_been_moved_to_the_degree_Y, - Crs->FullName,NewDeg.FullName); - } - } - else // New degree has no current course year - { - sprintf (Gbl.Message,Txt_The_year_X_is_not_allowed,Crs->Year); - Gbl.Error = true; - } + /***** Create message to show the change made *****/ + sprintf (Gbl.Message,Txt_The_course_X_has_been_moved_to_the_degree_Y, + Crs->FullName,NewDeg.FullName); + } } else // I have no permission to change course to this new degree { diff --git a/swad_course.h b/swad_course.h index 85853c1f7..735508d55 100644 --- a/swad_course.h +++ b/swad_course.h @@ -119,6 +119,7 @@ void Crs_GetShortNamesByCod (long CrsCod,char *CrsShortName,char *DegShortName); void Crs_RemoveCourseCompletely (long CrsCod); void Crs_ChangeInsCrsCodInConfig (void); void Crs_ChangeInsCrsCod (void); +void Crs_ChangeCrsDegreeInConfig (void); void Crs_ChangeCrsDegree (void); void Crs_ChangeCrsYearInConfig (void); void Crs_ChangeCrsYear (void); diff --git a/swad_degree.c b/swad_degree.c index 4b1f8270c..162924d24 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -877,13 +877,9 @@ void Deg_InitCurrentCourse (void) if (Gbl.CurrentCrs.Crs.CrsCod > 0) { if (Crs_GetDataOfCourseByCod (&Gbl.CurrentCrs.Crs)) // Course found - { Gbl.CurrentDeg.Deg.DegCod = Gbl.CurrentCrs.Crs.DegCod; - Gbl.YearOK = true; - } else { - Gbl.YearOK = false; Gbl.CurrentIns.Ins.InsCod = Gbl.CurrentCtr.Ctr.CtrCod = Gbl.CurrentDeg.Deg.DegCod = @@ -903,7 +899,6 @@ void Deg_InitCurrentCourse (void) /***** Degree type is available, so get degree type data *****/ if (!DT_GetDataOfDegreeTypeByCod (&Gbl.CurrentDegTyp.DegTyp)) // Degree type not found { - Gbl.YearOK = false; Gbl.CurrentIns.Ins.InsCod = Gbl.CurrentCtr.Ctr.CtrCod = Gbl.CurrentDeg.Deg.DegTypCod = @@ -913,15 +908,12 @@ void Deg_InitCurrentCourse (void) } else { - Gbl.YearOK = false; Gbl.CurrentIns.Ins.InsCod = Gbl.CurrentCtr.Ctr.CtrCod = Gbl.CurrentDeg.Deg.DegCod = Gbl.CurrentCrs.Crs.CrsCod = -1L; } } - else - Gbl.YearOK = false; /***** If centre code is available, get centre data *****/ if (Gbl.CurrentCtr.Ctr.CtrCod > 0) @@ -929,13 +921,8 @@ void Deg_InitCurrentCourse (void) if (Ctr_GetDataOfCentreByCod (&Gbl.CurrentCtr.Ctr)) // Centre found Gbl.CurrentIns.Ins.InsCod = Gbl.CurrentCtr.Ctr.InsCod; else - { Gbl.CurrentCtr.Ctr.CtrCod = -1L; - Gbl.YearOK = false; - } } - else - Gbl.YearOK = false; /***** If numerical institution code is available, get institution data *****/ if (Gbl.CurrentIns.Ins.InsCod > 0) @@ -944,7 +931,6 @@ void Deg_InitCurrentCourse (void) Gbl.CurrentCty.Cty.CtyCod = Gbl.CurrentIns.Ins.CtyCod; else { - Gbl.YearOK = false; Gbl.CurrentCty.Cty.CtyCod = Gbl.CurrentIns.Ins.InsCod = Gbl.CurrentCtr.Ctr.CtrCod = @@ -958,7 +944,6 @@ void Deg_InitCurrentCourse (void) { if (!Cty_GetDataOfCountryByCod (&Gbl.CurrentCty.Cty,Cty_GET_BASIC_DATA)) // Country not found { - Gbl.YearOK = false; Gbl.CurrentCty.Cty.CtyCod = Gbl.CurrentIns.Ins.InsCod = Gbl.CurrentCtr.Ctr.CtrCod = @@ -967,10 +952,6 @@ void Deg_InitCurrentCourse (void) } } - /***** Once we know course code, adjust action and tab *****/ - // if (Gbl.Action.Act != ActMnu) - // Lay_SetCurrentTab (); // Use the tab associated to current action - /***** Initialize default fields for edition to current values *****/ Gbl.Inss.EditingIns.CtyCod = Gbl.CurrentCty.Cty.CtyCod; Gbl.Ctrs.EditingCtr.InsCod = @@ -1913,33 +1894,48 @@ void Deg_GetListDegsAdminByMe (void) MYSQL_ROW row; unsigned NumDeg; + /***** Set default list *****/ + Gbl.Usrs.Me.MyAdminDegs.Num = 0; + Gbl.Usrs.Me.MyAdminDegs.Lst = NULL; + /***** Get degrees admin by me from database *****/ - if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM) - sprintf (Query,"SELECT DegCod,CtrCod,DegTypCod,Status,RequesterUsrCod," - "ShortName,FullName,WWW" - " FROM degrees" - " WHERE CtrCod='%ld'" - " ORDER BY ShortName", - Gbl.CurrentCtr.Ctr.CtrCod); - // TODO: put an if to select all degrees for admins of all degrees !!!!!!!!!!!!! - else // Gbl.Usrs.Me.LoggedRole == Rol_ROLE_DEG_ADM - sprintf (Query,"SELECT degrees.DegCod,degrees.CtrCod,degrees.DegTypCod,degrees.Status,degrees.RequesterUsrCod," - "degrees.ShortName,degrees.FullName,degrees.WWW" - " FROM admin,degrees" - " WHERE admin.UsrCod='%ld' AND admin.Scope='Deg'" - " AND admin.Cod=degrees.DegCod" - " ORDER BY degrees.ShortName", - Gbl.Usrs.Me.UsrDat.UsrCod); + switch (Gbl.Usrs.Me.LoggedRole) + { + case Rol_CTR_ADM: + case Rol_INS_ADM: + case Rol_SYS_ADM: + sprintf (Query,"SELECT DegCod,CtrCod,DegTypCod,Status,RequesterUsrCod," + "ShortName,FullName,WWW" + " FROM degrees" + " WHERE CtrCod='%ld'" + " ORDER BY ShortName", + Gbl.CurrentCtr.Ctr.CtrCod); + break; + case Rol_DEG_ADM: + sprintf (Query,"SELECT degrees.DegCod,degrees.CtrCod,degrees.DegTypCod,degrees.Status,degrees.RequesterUsrCod," + "degrees.ShortName,degrees.FullName,degrees.WWW" + " FROM admin,degrees" + " WHERE admin.UsrCod='%ld' AND admin.Scope='Deg'" + " AND admin.Cod=degrees.DegCod" + " ORDER BY degrees.ShortName", + Gbl.Usrs.Me.UsrDat.UsrCod); + break; + default: + /* I can not admin any degree */ + return; + } + Gbl.Usrs.Me.MyAdminDegs.Num = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get degrees admin by you"); /***** Count number of rows in result *****/ if (Gbl.Usrs.Me.MyAdminDegs.Num) // Degrees found... { /***** Create list with degrees of this type *****/ - if ((Gbl.Usrs.Me.MyAdminDegs.Lst = (struct Degree *) calloc (Gbl.Usrs.Me.MyAdminDegs.Num,sizeof (struct Degree))) == NULL) + if ((Gbl.Usrs.Me.MyAdminDegs.Lst = (struct Degree *) calloc (Gbl.Usrs.Me.MyAdminDegs.Num, + sizeof (struct Degree))) == NULL) Lay_ShowErrorAndExit ("Nout enough memory to store degrees admin by you."); - /***** Get the degrees of this type *****/ + /***** Get the degrees *****/ for (NumDeg = 0; NumDeg < Gbl.Usrs.Me.MyAdminDegs.Num; NumDeg++) @@ -1949,8 +1945,6 @@ void Deg_GetListDegsAdminByMe (void) Deg_GetDataOfDegreeFromRow (&(Gbl.Usrs.Me.MyAdminDegs.Lst[NumDeg]),row); } } - else - Gbl.Usrs.Me.MyAdminDegs.Lst = NULL; /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); diff --git a/swad_global.c b/swad_global.c index 7587518a6..fbe15aeca 100644 --- a/swad_global.c +++ b/swad_global.c @@ -147,8 +147,6 @@ void Gbl_InitializeGlobals (void) Gbl.Session.IsOpen = false; Gbl.Session.HasBeenDisconnected = false; - Gbl.YearOK = false; - Gbl.Usrs.Me.UsrIdLogin[0] = '\0'; Gbl.Usrs.Me.LoginPlainPassword[0] = '\0'; Gbl.Usrs.Me.UsrDat.UsrCod = -1L; diff --git a/swad_global.h b/swad_global.h index 0ca73de60..c93e2de89 100644 --- a/swad_global.h +++ b/swad_global.h @@ -165,7 +165,6 @@ struct Globals long UsrCod; } Session; - bool YearOK; struct { Tab_Tab_t Tab; diff --git a/swad_parameter.c b/swad_parameter.c index b156fcb6b..82cc947f2 100644 --- a/swad_parameter.c +++ b/swad_parameter.c @@ -647,7 +647,6 @@ void Par_GetMainParameters (void) unsigned UnsignedNum; char Nickname[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA+1]; char LongStr[1+10+1]; - char YearStr[2+1]; /***** Reset codes of country, institution, centre, degree and course *****/ Gbl.CurrentCty.Cty.CtyCod = @@ -655,7 +654,6 @@ void Par_GetMainParameters (void) Gbl.CurrentCtr.Ctr.CtrCod = Gbl.CurrentDeg.Deg.DegCod = Gbl.CurrentCrs.Crs.CrsCod = -1L; - Gbl.YearOK = false; // First of all, get action, and session identifier. // So, if other parameters have been stored in the database, there will be no problems to get them. @@ -774,7 +772,6 @@ void Par_GetMainParameters (void) if (LongStr[0]) // Parameter "cty" available { Gbl.CurrentCty.Cty.CtyCod = Str_ConvertStrCodToLongCod (LongStr); - Gbl.YearOK = false; Gbl.CurrentIns.Ins.InsCod = Gbl.CurrentCtr.Ctr.CtrCod = Gbl.CurrentDeg.Deg.DegCod = @@ -786,7 +783,6 @@ void Par_GetMainParameters (void) if (LongStr[0]) // Parameter "ins" available { Gbl.CurrentIns.Ins.InsCod = Str_ConvertStrCodToLongCod (LongStr); - Gbl.YearOK = false; Gbl.CurrentCtr.Ctr.CtrCod = Gbl.CurrentDeg.Deg.DegCod = Gbl.CurrentCrs.Crs.CrsCod = -1L; @@ -797,7 +793,6 @@ void Par_GetMainParameters (void) if (LongStr[0]) // Parameter "ctr" available { Gbl.CurrentCtr.Ctr.CtrCod = Str_ConvertStrCodToLongCod (LongStr); - Gbl.YearOK = false; Gbl.CurrentDeg.Deg.DegCod = Gbl.CurrentCrs.Crs.CrsCod = -1L; } @@ -807,37 +802,13 @@ void Par_GetMainParameters (void) if (LongStr[0]) // Parameter "deg" available { Gbl.CurrentDeg.Deg.DegCod = Str_ConvertStrCodToLongCod (LongStr); - if (Gbl.CurrentDeg.Deg.DegCod > 0) - { - /***** Get possible course year *****/ - Par_GetParToText ("CrsYear",YearStr,2); - if (YearStr[0]) // Parameter CrsYear available - { - Gbl.CurrentCrs.Crs.Year = Deg_ConvStrToYear (YearStr); - Gbl.YearOK = true; - } - - Gbl.CurrentCrs.Crs.CrsCod = -1L; // Reset possible course from session - } - else - Gbl.CurrentCty.Cty.CtyCod = - Gbl.CurrentIns.Ins.InsCod = - Gbl.CurrentCtr.Ctr.CtrCod = - Gbl.CurrentDeg.Deg.DegCod = - Gbl.CurrentCrs.Crs.CrsCod = -1L; + Gbl.CurrentCrs.Crs.CrsCod = -1L; // Reset possible course from session } /***** Get numerical course code if exists (from menu) *****/ Par_GetParToText ("crs",LongStr,1+10); if (LongStr[0]) // Parameter "crs" available Gbl.CurrentCrs.Crs.CrsCod = Str_ConvertStrCodToLongCod (LongStr); // Overwrite CrsCod from session - else - { - // Try old parameter "CrsCod" (allowed for compatibility with old links, to be removed in 2016) - Par_GetParToText ("CrsCod",LongStr,1+10); - if (LongStr[0]) // Parameter "CrsCod" available - Gbl.CurrentCrs.Crs.CrsCod = Str_ConvertStrCodToLongCod (LongStr); // Overwrite CrsCod from session - } /***** Get tab to activate *****/ Gbl.Action.Tab = TabUnk; diff --git a/swad_user.c b/swad_user.c index 048d22499..646a10ed4 100644 --- a/swad_user.c +++ b/swad_user.c @@ -748,7 +748,7 @@ void Usr_RestrictLengthAndWriteName (const struct UsrData *UsrDat,unsigned MaxCh } /*****************************************************************************/ -/*********** Check if a user is an administrator of an institution ***********/ +/***** Check if a user is an administrator of a degree/centre/institution ****/ /*****************************************************************************/ bool Usr_CheckIfUsrIsAdm (long UsrCod,Sco_Scope_t Scope,long Cod)