Compare commits
808 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ccbbe5936 | |||
| 50faa1482d | |||
| 150c0b7e2c | |||
| 4eeece1f92 | |||
| fd91456383 | |||
| 4a27bde150 | |||
| d1c98147e4 | |||
| 65d6ca257c | |||
| 9803d8fc3c | |||
| 7e71b80f1e | |||
| db6243d0a1 | |||
| ec17e70103 | |||
| c26a6747c6 | |||
| f94bb9ebd4 | |||
| 85fc893630 | |||
| e076bc63a5 | |||
| cc07dee0d0 | |||
| d8b662d5e2 | |||
| e5f91ef230 | |||
| e8138a566d | |||
| 640acd9907 | |||
| f24293bf1a | |||
| 2cc726280f | |||
| eef69e4122 | |||
| 5339ba2cf9 | |||
| 828bb475ac | |||
| 7ea26a73c4 | |||
| c04de02282 | |||
| 176a06e4e6 | |||
| 2c53094c6f | |||
| 4cf9360fca | |||
| 546667e238 | |||
| 7972bc0491 | |||
| 6a57ed2001 | |||
| c62a20c42b | |||
| ee02183dce | |||
| 299e51924e | |||
| 7837711783 | |||
| 4326153883 | |||
| c22a3558d3 | |||
| 226735fec1 | |||
| fc1414d856 | |||
| eada616a76 | |||
| af3889cc3f | |||
| 9fa159e2b4 | |||
| 46bd05ecc8 | |||
| 08947f22ab | |||
| 95932f640a | |||
| f772bb2b97 | |||
| 339579a5ac | |||
| 14859c7c2f | |||
| a7aa062d70 | |||
| cfddc821c0 | |||
| 160bd39347 | |||
| a8d671999f | |||
| 53d871beac | |||
| ae04014f6b | |||
| 62aecff9da | |||
| 53f164b797 | |||
| b81913ccc6 | |||
| ca2d4d39a2 | |||
| 2387735808 | |||
| 22eb7f13e4 | |||
| 413cba10cc | |||
| 7dcbb60c76 | |||
| 1e2cf5ad50 | |||
| 445b4dd368 | |||
| 9865cbfb60 | |||
| c95a67cd94 | |||
| 3875f26ebf | |||
| 9963023979 | |||
| 68763aef2d | |||
| c7c5b77888 | |||
| bf43fdd447 | |||
| ae11b8c080 | |||
| 7cab4616f5 | |||
| ea7f6fb4b1 | |||
| b857de59ab | |||
| d36658a989 | |||
| c97f7de664 | |||
| b24f1eb290 | |||
| f231685050 | |||
| 8ec4354542 | |||
| 1c8fe24234 | |||
| 9900a3df74 | |||
| e78c8c9054 | |||
| 2d2cce8bd2 | |||
| 8f7756b0e2 | |||
| d4c83ae4fb | |||
| c090fe60c7 | |||
| 5b6f73f488 | |||
| e60c472ccb | |||
| 76c590c0aa | |||
| 60dce6a2c1 | |||
| 56f9e59241 | |||
| 6f3c243bb8 | |||
| e74681c8b2 | |||
| b693256a99 | |||
| 77fa678ef2 | |||
| 6819bed8da | |||
| f3ab1e0c8f | |||
| 33faa0d19d | |||
| af08d144c9 | |||
| 5127b43eec | |||
| fc07639e9b | |||
| bc9e603b3f | |||
| 27a7bb1a0d | |||
| aea7288f77 | |||
| 18889e0e78 | |||
| 3df96ad21b | |||
| dc01f95fb4 | |||
| c54cd379ac | |||
| bdeeadb3c3 | |||
| e1abf003ee | |||
| b66a680956 | |||
| 5c89dd5d18 | |||
| 67fb1b666e | |||
| 6311d4de60 | |||
| 870d485024 | |||
| 44708a5568 | |||
| 0ac34abbfb | |||
| eace33059c | |||
| e626145ef6 | |||
| 97f5b526e6 | |||
| 0abafc0622 | |||
| 48d0a91018 | |||
| adb1b0afb4 | |||
| ec68dac0fd | |||
| 7d7f36787b | |||
| d27076d09e | |||
| 4dbc9b75d2 | |||
| f0da446c56 | |||
| 17a759cf61 | |||
| 78dd6d4813 | |||
| d65a100e88 | |||
| 7e31c3b1c3 | |||
| 30cab618e1 | |||
| 1b82db6d0d | |||
| 75aa150051 | |||
| ee9bd0e350 | |||
| f7b1660aa6 | |||
| b97702e584 | |||
| 5de876ba81 | |||
| 8162a1308a | |||
| 33406a758c | |||
| 44181e8a24 | |||
| 9eb2207168 | |||
| 3aa0f88b6e | |||
| d3c8f933df | |||
| a3039b2085 | |||
| 0a6a6a9cde | |||
| 5edb51d072 | |||
| 1f4a068537 | |||
| a0ca809653 | |||
| e059f69d3f | |||
| 706c814d8c | |||
| d0c33d06a3 | |||
| f2d59e46eb | |||
| 22c1e3f385 | |||
| 722efe6e5b | |||
| 40f00ad784 | |||
| 45181b1553 | |||
| ec7a8c38d9 | |||
| 18df418a50 | |||
| e2f3b1eea1 | |||
| 555769489a | |||
| c27a49324e | |||
| 92979a841d | |||
| 05ddbc3143 | |||
| bded2e91a0 | |||
| b532610c2f | |||
| 76ef65f45d | |||
| 7d82a37b49 | |||
| 2f82ac596b | |||
| 81200053af | |||
| bd874d2a0e | |||
| 676910acbd | |||
| bb44b2c9d0 | |||
| b53489190d | |||
| 99b1eb1755 | |||
| 4e2841b795 | |||
| 3546266a6b | |||
| d81704f632 | |||
| e13939dc77 | |||
| 40bde9dfa6 | |||
| 7b25272f43 | |||
| bce307ee77 | |||
| 66aece01f9 | |||
| d332e9f012 | |||
| 7114045d8d | |||
| da0655ebdf | |||
| a4c4e43a5f | |||
| d25f6b8104 | |||
| 236534f192 | |||
| 837e89e1d3 | |||
| 4018a4b4a7 | |||
| 5e0a9e2bf9 | |||
| 420b76d61e | |||
| 820e356a5e | |||
| 6ceafdb00a | |||
| 4a35940233 | |||
| 70243720e9 | |||
| b6c63cfcc6 | |||
| 74919fa156 | |||
| 1cdcf60ed3 | |||
| 47e26d45f7 | |||
| 7040ab6e30 | |||
| 5f828fa036 | |||
| ed2410c954 | |||
| 4557b47df1 | |||
| 840818cce4 | |||
| 463e194c85 | |||
| 19b1f96f1f | |||
| 795fd70584 | |||
| 05fc59ef64 | |||
| 82aab8024b | |||
| 50c5d7ae6d | |||
| e9637ea9ce | |||
| 4ee86612fe | |||
| d375d718ac | |||
| 417f9d311b | |||
| ea1cb30ce7 | |||
| 9a36598bac | |||
| 4776262f05 | |||
| 5fbd62c254 | |||
| b10a487334 | |||
| 294e7ff363 | |||
| dbb729e9d3 | |||
| 3720463fc4 | |||
| d9ecbdc715 | |||
| 34025ea1c2 | |||
| 8fbbd40394 | |||
| 54e24c11a5 | |||
| 9987a9e079 | |||
| 965481f7fb | |||
| 40035f042d | |||
| ff5aed23a4 | |||
| a6f4aa1a94 | |||
| 239ca19682 | |||
| bfe1d30444 | |||
| 331de0b546 | |||
| 7a150b25cb | |||
| c2cf907f3f | |||
| 5cf725b9b4 | |||
| eafc011e08 | |||
| bed0c7a63e | |||
| d099f4fd0e | |||
| 4c3a1c6f8a | |||
| 8ad117cca8 | |||
| 7d4c5ac5ab | |||
| ded3134c37 | |||
| 4471c79c07 | |||
| bc1f0e0b40 | |||
| 446bf5b9f4 | |||
| 97f8f66cc3 | |||
| bea1f152ae | |||
| e4624f6e6c | |||
| 6945d524c8 | |||
| 296d5c07d8 | |||
| 756765a2ed | |||
| 044c0ce868 | |||
| f83ecb3721 | |||
| fbf39e40e6 | |||
| 4ebf4efde8 | |||
| 1f0856d6bf | |||
| ceb3ce58a9 | |||
| 335a24ea72 | |||
| 92bf1836d0 | |||
| ca409b9b44 | |||
| 81ded23742 | |||
| 365f666cbf | |||
| a6dfc10bb0 | |||
| 4a7f742d2e | |||
| 043af1f6b2 | |||
| 4a126d26cf | |||
| 323d76708b | |||
| 3a2d363542 | |||
| 854682fb17 | |||
| 87ba4ff25a | |||
| a906556554 | |||
| c0ed22f6c7 | |||
| 24b464d9f7 | |||
| 01ab2bb505 | |||
| 28e0b61cd0 | |||
| db01641ec0 | |||
| 196b3fd27f | |||
| e3d8f34ad6 | |||
| e2eaa0bae4 | |||
| 5013a713eb | |||
| 573a933e42 | |||
| 6be00a7a49 | |||
| 054d245a2c | |||
| ae3f09e6cd | |||
| 1cbf87e8db | |||
| 382b95d292 | |||
| 29010d3e53 | |||
| b269d8f988 | |||
| c4f5ec20db | |||
| ec48562601 | |||
| 093e1ce8df | |||
| ef518ff137 | |||
| ff166d1157 | |||
| c02287f333 | |||
| 27ee2b6737 | |||
| f991601b63 | |||
| f3593fc2cb | |||
| 9c96488ed9 | |||
| b22884274f | |||
| ab833c6ee4 | |||
| d6fe3f01e0 | |||
| 82c62bd30a | |||
| fb0814ac14 | |||
| ba459c4dde | |||
| c1ca7fdccc | |||
| 0c8f156ece | |||
| 4e98691587 | |||
| ed2417a4cd | |||
| 497288882a | |||
| b108e75ce3 | |||
| b284426dd1 | |||
| 884972f915 | |||
| 9dde62c4e8 | |||
| 1da1b02592 | |||
| bd0802e56b | |||
| 65a312fa32 | |||
| ffb830f58e | |||
| 9eb160461d | |||
| ee97268a42 | |||
| f3edfb06a7 | |||
| ebbf509960 | |||
| e09266d176 | |||
| 805366d987 | |||
| 6645da5bce | |||
| 38d13c23f1 | |||
| 940e243547 | |||
| e6ef6bb1b6 | |||
| 84bfd60a03 | |||
| 6e4bb45785 | |||
| f7d185baf3 | |||
| d7bce7db81 | |||
| 18d4b57b69 | |||
| 0e1d75cff7 | |||
| 98fcf93146 | |||
| 660b8d0b66 | |||
| a64c75d059 | |||
| 2ddb941b0a | |||
| b571be75c5 | |||
| 8b1dd6905e | |||
| d02908d323 | |||
| f654ae9d8e | |||
| ccb462b076 | |||
| 5f40997e4b | |||
| 96a4e2efa5 | |||
| e98a486834 | |||
| 2aa58eb6ce | |||
| 2e61a814c3 | |||
| e76f4039b9 | |||
| 2dfeb89f48 | |||
| 3cf17d040e | |||
| d9e1178030 | |||
| c6f2c53f8d | |||
| a2ec78a369 | |||
| 25f8be6e70 | |||
| 47f1ee8e6f | |||
| 6030656b88 | |||
| 336c4263e9 | |||
| 1c8dbf72b9 | |||
| 8254d87d66 | |||
| 33641c3873 | |||
| 0375701522 | |||
| 53ce4f035e | |||
| 6e49419bda | |||
| 5701bc74a0 | |||
| 821e713503 | |||
| 51c048b088 | |||
| 5f70593f94 | |||
| 790f68fd92 | |||
| ac6f7b2c96 | |||
| 2fe83e04d9 | |||
| d4d88ffd73 | |||
| 2fd2edb032 | |||
| 7f51f30e2e | |||
| 0cd4a6158d | |||
| 2198d7f43c | |||
| 6244096bee | |||
| 6e7e184571 | |||
| efac2d2ad4 | |||
| e06065b4f8 | |||
| 45cadecc2a | |||
| 6866d7f6a5 | |||
| 3478ce9bdc | |||
| f8bed0f642 | |||
| d3da2883ce | |||
| 9c0f9c588e | |||
| 25aa12e229 | |||
| 2e63ba58fc | |||
| 7b84d2886a | |||
| 6fe7f2f198 | |||
| 36a8da6e85 | |||
| 230235e3e0 | |||
| 57284445ea | |||
| dfe26d0ba3 | |||
| 81ef1b474f | |||
| e52bc3f593 | |||
| 4997ac9e2f | |||
| 613b57021d | |||
| c8caabdb1c | |||
| f44480cccc | |||
| 8296031c1f | |||
| ad520779df | |||
| 3a6dc00d2a | |||
| 3cd76fea5d | |||
| cffd4c5b3f | |||
| 62e7fe190e | |||
| 78f8349245 | |||
| 9f786f7408 | |||
| 436ce722e8 | |||
| 427ef2ef69 | |||
| 68a2b1febf | |||
| 9da363fbc7 | |||
| e8a2fa86aa | |||
| 787a484a60 | |||
| b8f242d889 | |||
| c3574e4f10 | |||
| 6881ed5d82 | |||
| 6791b08315 | |||
| c0502c170c | |||
| 4ef74c4834 | |||
| 7986556d6b | |||
| ca984069b8 | |||
| 9ae37470fa | |||
| 768bdc8d70 | |||
| 39d59639e3 | |||
| 668f04282a | |||
| 66653a52b0 | |||
| dbcfd4f152 | |||
| b702373a4d | |||
| 53f2606205 | |||
| 22ec5e8876 | |||
| ba5f2ec663 | |||
| b7ea6c69d7 | |||
| 7299a9e288 | |||
| 817d9328ae | |||
| 7bd8e21ec4 | |||
| bb1042480f | |||
| 7cdb2e4575 | |||
| d8317f0a40 | |||
| dd3dc2e2e3 | |||
| dd6776c92b | |||
| d04cc1ea24 | |||
| 8da0b77ccb | |||
| bd774e7aeb | |||
| 3b9d358d9d | |||
| 60aaa96f61 | |||
| 8374754563 | |||
| 45bfe330ea | |||
| 221ded5477 | |||
| 0ffce4b7ae | |||
| bf2d7c1823 | |||
| 62aaf94f49 | |||
| eddceb69c7 | |||
| 7649be6ea0 | |||
| a65e24917f | |||
| 99a3b8215b | |||
| 4fab8e528d | |||
| 52de453351 | |||
| 607b4fa3e2 | |||
| 862f48225d | |||
| 538d482927 | |||
| 8683c24f73 | |||
| 7a48124d69 | |||
| 7546de2e7a | |||
| 9a2bb1ee2c | |||
| 19cc130565 | |||
| 72d890d2d2 | |||
| 793d2bf940 | |||
| b2313c434f | |||
| 4790c88e85 | |||
| a52b49b925 | |||
| d9e544b78c | |||
| b38f551820 | |||
| 04cc6a1ba1 | |||
| 4ca8983287 | |||
| 25d11fe956 | |||
| 43b542b616 | |||
| 69dcda25e5 | |||
| 8477740c30 | |||
| 42657ab7ec | |||
| f91b7ae26b | |||
| 5f73b066b5 | |||
| 238c24d44c | |||
| 4e9fcf1eb2 | |||
| 02c71f990f | |||
| db472efd13 | |||
| c168d35af5 | |||
| 030fc2d27c | |||
| 2211bba995 | |||
| d5fabf0b1f | |||
| 8f8bda7343 | |||
| 537005082b | |||
| f40bce2565 | |||
| d4ccd2ceeb | |||
| 24504b499b | |||
| 943c29e5b0 | |||
| b378542397 | |||
| fd40df6f92 | |||
| c623274478 | |||
| 2e67e5ecbb | |||
| af6e993c9d | |||
| b981c8706e | |||
| 931eace3c3 | |||
| 6642887953 | |||
| 24ca82df7e | |||
| 8b196107ba | |||
| e9eb08bef7 | |||
| ea89f29bbe | |||
| 4ef25d16cb | |||
| f89e86f135 | |||
| 9a800e2c9e | |||
| 0547b7e742 | |||
| 93b0225ece | |||
| 084c07f599 | |||
| 79cbfaa114 | |||
| 09dfc08f79 | |||
| 4174535ac9 | |||
| b3f60ef696 | |||
| bd44a3bc02 | |||
| c003806b56 | |||
| 6475153231 | |||
| 721c418985 | |||
| 993debdbe3 | |||
| 0fcd56e671 | |||
| 15824fadc2 | |||
| 2dd1e4c422 | |||
| d89ebccf65 | |||
| 157459a20a | |||
| 252979a787 | |||
| d5f9cfcf8d | |||
| 8a2b5c4525 | |||
| dd9841f926 | |||
| 4b8da40c6a | |||
| bde399dcef | |||
| c175e01ec0 | |||
| c046a3fb88 | |||
| b83306c0ce | |||
| a9b7100432 | |||
| f2994d7338 | |||
| 5e76b4a49b | |||
| 93deef3cd3 | |||
| f0c351f763 | |||
| 8876dd31d8 | |||
| 8886f0ace0 | |||
| 50ff77d26a | |||
| 0eeb0874cc | |||
| 2ee94c2d37 | |||
| 6535721ceb | |||
| a38d62efd8 | |||
| 84aabeae85 | |||
| f0aecedec6 | |||
| 52bb0934be | |||
| 75831af99e | |||
| 57fe307821 | |||
| fcb0c7f267 | |||
| 7d5af125b9 | |||
| f58b7c2f4a | |||
| 3108a0f862 | |||
| 5f05ebc40f | |||
| 14d8d5ab0e | |||
| dfd6a609e0 | |||
| a16230a69b | |||
| 54b0eec73d | |||
| adb6cdbe93 | |||
| a6ecee4ca0 | |||
| 8e35d0aef8 | |||
| 6d73da4a16 | |||
| 211bb241de | |||
| 2a2a8302b5 | |||
| bf5ff54adb | |||
| 133e7f3dd8 | |||
| a49c98f859 | |||
| fad527952b | |||
| d08845f37a | |||
| 5c2a2f209d | |||
| e17f0d3b1e | |||
| 365e69b47d | |||
| 3e86502dba | |||
| 5cd936cb57 | |||
| 4c9d3738db | |||
| ea7170945c | |||
| 56e270e11e | |||
| c5c7879f8b | |||
| 4d6bcdad3e | |||
| 4f7d9dee7c | |||
| ff4d87739d | |||
| 53dcf63488 | |||
| 4b3ee4fc55 | |||
| a0e75f0360 | |||
| 69d0176923 | |||
| ed1163b512 | |||
| 80a9e2aab9 | |||
| 471b1c8b30 | |||
| ee72fe8881 | |||
| e8f075bf74 | |||
| e496f11da2 | |||
| a0bf1073c5 | |||
| 7e7fbf62af | |||
| 3eaee3a914 | |||
| d5830dd0be | |||
| a76a53a6e1 | |||
| 3e14545d2d | |||
| a006cb40cb | |||
| 7d7331bd76 | |||
| 21cadefea3 | |||
| 2d8d02481a | |||
| 6931d54085 | |||
| 58b4ff5039 | |||
| 1180f2d49e | |||
| 5e84c2e01a | |||
| 9807bef7c7 | |||
| 50cc39f950 | |||
| a2e76551f0 | |||
| c185ac18f5 | |||
| 5023419f65 | |||
| 31489a451c | |||
| 0add004b0e | |||
| 8f343c64f6 | |||
| 5405de127b | |||
| 22e4bd4255 | |||
| c7f8a543d4 | |||
| f2e6b400b9 | |||
| f674eb81ca | |||
| 8491ee245b | |||
| a897a251d1 | |||
| 00568190ce | |||
| 2ab3134607 | |||
| 4e05e64e95 | |||
| 5fab70437e | |||
| 9fd2278e17 | |||
| 5b662f33e2 | |||
| 9f6c79e420 | |||
| 016660ca42 | |||
| 0f83dd10a1 | |||
| 1fdd74081c | |||
| 64f4979eeb | |||
| c54172b3c2 | |||
| 539eb194b1 | |||
| 570359909f | |||
| 9ea53a18b6 | |||
| a16f0a3cad | |||
| a8a076708e | |||
| 3d06074953 | |||
| 77c5c20554 | |||
| c4d72072dc | |||
| 88ead1b9ff | |||
| 38dbeec003 | |||
| 8b2aff422f | |||
| fa913a3ae8 | |||
| d6e3be6d79 | |||
| 1d0ac183a0 | |||
| 4d8cb115cc | |||
| 94c2ba853e | |||
| 81e33e74e0 | |||
| 8a4aa94daf | |||
| a8f7ec4571 | |||
| 65df3cd2cb | |||
| 690cf46b0c | |||
| c62eeedab7 | |||
| 05d8d4abe5 | |||
| fa13450de9 | |||
| 425a72f6db | |||
| 08b69b29bc | |||
| a7899ca45f | |||
| 0982968a37 | |||
| d23a6b06a8 | |||
| 5d2930d9dd | |||
| 912ec1fd85 | |||
| 989e8b7f0b | |||
| 2eaa6c2667 | |||
| a7dedc5efe | |||
| 7ad20028b0 | |||
| e5f9484e46 | |||
| f5fd808c7a | |||
| 5577a1a913 | |||
| 3bc6e06fc3 | |||
| c8f95660ff | |||
| 1bca1284f2 | |||
| da5f9221ea | |||
| db378febc2 | |||
| 49e45d069b | |||
| 404958a0c4 | |||
| 97e990c983 | |||
| fa93616a23 | |||
| a11492d7e8 | |||
| d29f6ebcd3 | |||
| 8fafe29890 | |||
| 8cac5c0cca | |||
| 2aab431486 | |||
| 9f1495aabc | |||
| 2849965662 | |||
| 9231ed5d79 | |||
| c1608f405d | |||
| 1e02608aa0 | |||
| 265724046d | |||
| 84b0900175 | |||
| 7a8c221fc7 | |||
| ed85611715 | |||
| b99ec3eabb | |||
| f9374e570a | |||
| fe8d2efe52 | |||
| f3463229bd | |||
| 70a63a726d | |||
| 9ac6d34dbd | |||
| 0f08848ca4 | |||
| b7fa2f9153 | |||
| 5a7722e046 | |||
| d0690afbc3 | |||
| 4247b7d472 | |||
| 9d014d75f4 | |||
| ddcb36bd92 | |||
| d42aaae5a6 | |||
| 73848c608d | |||
| 6bdb01ccf0 | |||
| 2c7a06ec8a | |||
| 16b879e79f | |||
| 33e8e9e709 | |||
| 4e1dd694d3 | |||
| fff39dcfc1 | |||
| ba23ddb67a | |||
| ac7b47e656 | |||
| 8e30abf5e6 | |||
| 3c4111ee68 | |||
| 197cd28771 | |||
| e77f635b84 | |||
| 9a47738c45 | |||
| 4970d12920 | |||
| 2199fb263f | |||
| d588f8c74c | |||
| 5d332d4a5d | |||
| cbd6ad13e0 | |||
| 3d9dff0f22 | |||
| 4850ab676c | |||
| 9086379bb7 | |||
| 40ba373443 | |||
| e2835a5232 | |||
| b434431b38 | |||
| 0149696274 | |||
| 651cf35cbe | |||
| a5d7e18abe | |||
| 5816961bde | |||
| 361492a806 | |||
| e785ca696e | |||
| e92ca9dbc8 | |||
| b713f5c2a0 | |||
| 7456f0b8a4 | |||
| 1a19ad3866 | |||
| 0b50793e41 | |||
| 08fb6ca3f1 | |||
| 63f4993e4a | |||
| 449fd68024 | |||
| 421a8533c5 | |||
| 8135ecf6e1 | |||
| 4c4c7197f0 | |||
| 5ceb78283c | |||
| 41c65d7d8e | |||
| 96b421fd91 | |||
| 833af94c19 | |||
| 3bc7584619 | |||
| 373b8fbdb5 | |||
| 2d2dfae5e9 | |||
| fc2d52bd34 | |||
| 06a31cb7b8 | |||
| e2094c3b93 | |||
| 81dc3b5fd5 | |||
| 79795cd631 | |||
| 62b3a99a0d | |||
| 2961a37027 | |||
| d383e08886 | |||
| ad3635a365 | |||
| c6a49f7b24 | |||
| 2942426ff4 | |||
| 960838e0f1 | |||
| 5c3f517142 | |||
| aadf8518c4 | |||
| 45c413e29e | |||
| e033345948 | |||
| 739af42c9c | |||
| c55be07e8a | |||
| 256e3edf0e | |||
| df3a3b45da | |||
| 06dd9ad0d8 | |||
| 7faf219bce | |||
| 61e14418d0 | |||
| 319ecdb58a | |||
| 6066f65817 | |||
| 214da1654e | |||
| 1668cd75f2 | |||
| 906950a195 | |||
| 9be109005b | |||
| 112ecf68ba | |||
| 09a54762b2 | |||
| 98d2e58d19 | |||
| 8af9ec6cb9 | |||
| ae3251111c | |||
| f2630cfd2c | |||
| a645b79113 | |||
| e5ecd739ed | |||
| e9313673bb | |||
| 936adcdbde |
@@ -99,7 +99,7 @@ function bloglevelupgrade_entries($blogentries, $forum, $cm, $groupid=-1) {
|
||||
$discussion->groupid = $groupid;
|
||||
$message = '';
|
||||
|
||||
$discussionid = forum_add_discussion($discussion, null, $message);
|
||||
$discussionid = forum_add_discussion($discussion, null, $message, $blogentry->userid);
|
||||
|
||||
// Copy file attachment records
|
||||
$fs = get_file_storage();
|
||||
|
||||
+4
-20
@@ -214,11 +214,7 @@
|
||||
</FEEDBACK>
|
||||
</UNICODE>
|
||||
<DATABASE level="required">
|
||||
<VENDOR name="mysql" version="5.0.25">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="mysql416required" />
|
||||
</FEEDBACK>
|
||||
</VENDOR>
|
||||
<VENDOR name="mysql" version="5.0.25" />
|
||||
<VENDOR name="postgres" version="8.3" />
|
||||
<VENDOR name="mssql" version="9.0" />
|
||||
<VENDOR name="odbc_mssql" version="9.0" />
|
||||
@@ -335,11 +331,7 @@
|
||||
</FEEDBACK>
|
||||
</UNICODE>
|
||||
<DATABASE level="required">
|
||||
<VENDOR name="mysql" version="5.0.25">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="mysql416required" />
|
||||
</FEEDBACK>
|
||||
</VENDOR>
|
||||
<VENDOR name="mysql" version="5.0.25" />
|
||||
<VENDOR name="postgres" version="8.3" />
|
||||
<VENDOR name="mssql" version="9.0" />
|
||||
<VENDOR name="odbc_mssql" version="9.0" />
|
||||
@@ -449,11 +441,7 @@
|
||||
</FEEDBACK>
|
||||
</UNICODE>
|
||||
<DATABASE level="required">
|
||||
<VENDOR name="mysql" version="5.0.25">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="mysql416required" />
|
||||
</FEEDBACK>
|
||||
</VENDOR>
|
||||
<VENDOR name="mysql" version="5.0.25" />
|
||||
<VENDOR name="postgres" version="8.3" />
|
||||
<VENDOR name="mssql" version="9.0" />
|
||||
<VENDOR name="odbc_mssql" version="9.0" />
|
||||
@@ -563,11 +551,7 @@
|
||||
</FEEDBACK>
|
||||
</UNICODE>
|
||||
<DATABASE level="required">
|
||||
<VENDOR name="mysql" version="5.0.25">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="mysql416required" />
|
||||
</FEEDBACK>
|
||||
</VENDOR>
|
||||
<VENDOR name="mysql" version="5.1.33" />
|
||||
<VENDOR name="postgres" version="8.3" />
|
||||
<VENDOR name="mssql" version="9.0" />
|
||||
<VENDOR name="odbc_mssql" version="9.0" />
|
||||
|
||||
@@ -50,7 +50,7 @@ class mnet_simple_host_form extends moodleform {
|
||||
$this->add_action_buttons(false, get_string('addhost', 'mnet'));
|
||||
}
|
||||
|
||||
function validation($data) {
|
||||
function validation($data, $files) {
|
||||
global $DB;
|
||||
|
||||
$wwwroot = $data['wwwroot'];
|
||||
@@ -154,7 +154,7 @@ class mnet_review_host_form extends moodleform {
|
||||
$this->add_action_buttons(false);
|
||||
}
|
||||
|
||||
function validation($data) {
|
||||
function validation($data, $files) {
|
||||
$errors = array();
|
||||
if ($data['oldpublickey'] == $data['public_key']) {
|
||||
return;
|
||||
|
||||
@@ -39,6 +39,15 @@ class mnet_profile_form extends moodleform {
|
||||
global $CFG;
|
||||
$mform =& $this->_form;
|
||||
|
||||
$mnetprofileimportfields = '';
|
||||
if (isset($CFG->mnetprofileimportfields)) {
|
||||
$mnetprofileimportfields = str_replace(',', ', ', $CFG->mnetprofileimportfields);
|
||||
}
|
||||
|
||||
$mnetprofileexportfields = '';
|
||||
if (isset($CFG->mnetprofileexportfields)) {
|
||||
$mnetprofileexportfields = str_replace(',', ', ', $CFG->mnetprofileexportfields);
|
||||
}
|
||||
|
||||
$mform->addElement('hidden', 'hostid', $this->_customdata['hostid']);
|
||||
$fields = mnet_profile_field_options();
|
||||
@@ -49,7 +58,7 @@ class mnet_profile_form extends moodleform {
|
||||
$select = $mform->addElement('select', 'importfields', get_string('importfields', 'mnet'), $fields['optional']);
|
||||
$select->setMultiple(true);
|
||||
|
||||
$mform->addElement('checkbox', 'importdefault', get_string('leavedefault', 'mnet'), str_replace(',', ', ', $CFG->mnetprofileimportfields));
|
||||
$mform->addElement('checkbox', 'importdefault', get_string('leavedefault', 'mnet'), $mnetprofileimportfields);
|
||||
|
||||
// Fields to export ----------------------------------------------------
|
||||
$mform->addElement('header', 'export', get_string('exportfields', 'mnet'));
|
||||
@@ -57,7 +66,7 @@ class mnet_profile_form extends moodleform {
|
||||
$select = $mform->addElement('select', 'exportfields', get_string('exportfields', 'mnet'), $fields['optional']);
|
||||
$select->setMultiple(true);
|
||||
|
||||
$mform->addElement('checkbox', 'exportdefault', get_string('leavedefault', 'mnet'), str_replace(',', ', ', $CFG->mnetprofileexportfields));
|
||||
$mform->addElement('checkbox', 'exportdefault', get_string('leavedefault', 'mnet'), $mnetprofileexportfields);
|
||||
|
||||
$this->add_action_buttons();
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class mnet_services_form extends moodleform {
|
||||
function definition() {
|
||||
$mform =& $this->_form;
|
||||
$mnet_peer =& $this->_customdata['peer'];
|
||||
$myservices =& mnet_get_service_info($mnet_peer);
|
||||
$myservices = mnet_get_service_info($mnet_peer);
|
||||
|
||||
$mform->addElement('hidden', 'hostid', $mnet_peer->id);
|
||||
|
||||
|
||||
@@ -50,8 +50,10 @@ if ($course) {
|
||||
|
||||
// security first
|
||||
require_login($course, false, $cm);
|
||||
$safeoverridesonly = false;
|
||||
if (!has_capability('moodle/role:override', $context)) {
|
||||
require_capability('moodle/role:safeoverride', $context);
|
||||
$safeoverridesonly = true;
|
||||
}
|
||||
$PAGE->set_url($url);
|
||||
$PAGE->set_context($context);
|
||||
@@ -119,7 +121,7 @@ if (empty($overridableroles[$roleid])) {
|
||||
}
|
||||
|
||||
// If we are actually overriding a role, create the table object, and save changes if appropriate.
|
||||
$overridestable = new override_permissions_table_advanced($context, $roleid, false);
|
||||
$overridestable = new override_permissions_table_advanced($context, $roleid, $safeoverridesonly);
|
||||
$overridestable->read_submitted_permissions();
|
||||
|
||||
if (optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey()) {
|
||||
|
||||
@@ -54,6 +54,17 @@ if (!$canview) {
|
||||
print_error('nopermissions', 'error', '', get_string('checkpermissions', 'role'));
|
||||
}
|
||||
|
||||
if ($userid != $USER->id) {
|
||||
// If its not the current user we need to extend the navigation for that user to ensure
|
||||
// their navigation is loaded and this page found upon it.
|
||||
$PAGE->navigation->extend_for_user($user);
|
||||
}
|
||||
if ($course->id != $SITE->id || $userid != $USER->id) {
|
||||
// If we're within a course OR if we're viewing another user then we need to include the
|
||||
// settings base on the navigation to ensure that the navbar will contain the users name.
|
||||
$PAGE->navbar->includesettingsbase = true;
|
||||
}
|
||||
|
||||
/// Now get the role assignments for this user.
|
||||
$sql = "SELECT
|
||||
ra.id, ra.userid, ra.contextid, ra.roleid, ra.component, ra.itemid,
|
||||
@@ -119,14 +130,9 @@ $title = get_string('xroleassignments', 'role', $fullname);
|
||||
$PAGE->set_title($title);
|
||||
if ($courseid != SITEID) {
|
||||
$PAGE->set_heading($fullname);
|
||||
if (has_capability('moodle/course:viewparticipants', $coursecontext)) {
|
||||
$PAGE->navbar->add(get_string('participants'),new moodle_url('/user/index.php', array('id'=>$courseid)));
|
||||
}
|
||||
} else {
|
||||
$PAGE->set_heading($course->fullname);
|
||||
}
|
||||
$PAGE->navbar->add($fullname, new moodle_url("$CFG->wwwroot/user/view.php", array('id'=>$userid,'course'=>$courseid)));
|
||||
$PAGE->navbar->add($straction);
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading($title, 3);
|
||||
echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthnormal');
|
||||
|
||||
@@ -92,8 +92,29 @@ if ($hassiteconfig
|
||||
// Add a category for backups
|
||||
$ADMIN->add('courses', new admin_category('backups', get_string('backups','admin')));
|
||||
|
||||
// Create a page for general backup defaults
|
||||
// Create a page for general backups configuration and defaults.
|
||||
$temp = new admin_settingpage('backupgeneralsettings', get_string('generalbackdefaults', 'backup'), 'moodle/backup:backupcourse');
|
||||
|
||||
// General configuration section.
|
||||
$temp->add(new admin_setting_configselect('backup/loglifetime', get_string('loglifetime', 'backup'), get_string('configloglifetime', 'backup'), 30, array(
|
||||
1 => get_string('numdays', '', 1),
|
||||
2 => get_string('numdays', '', 2),
|
||||
3 => get_string('numdays', '', 3),
|
||||
5 => get_string('numdays', '', 5),
|
||||
7 => get_string('numdays', '', 7),
|
||||
10 => get_string('numdays', '', 10),
|
||||
14 => get_string('numdays', '', 14),
|
||||
20 => get_string('numdays', '', 20),
|
||||
30 => get_string('numdays', '', 30),
|
||||
60 => get_string('numdays', '', 60),
|
||||
90 => get_string('numdays', '', 90),
|
||||
120 => get_string('numdays', '', 120),
|
||||
180 => get_string('numdays', '', 180),
|
||||
365 => get_string('numdays', '', 365)
|
||||
)));
|
||||
|
||||
// General defaults section.
|
||||
$temp->add(new admin_setting_heading('generalsettings', get_string('generalsettings', 'backup'), ''));
|
||||
$temp->add(new admin_setting_configcheckbox_with_lock('backup/backup_general_users', get_string('generalusers','backup'), get_string('configgeneralusers','backup'), array('value'=>1, 'locked'=>0)));
|
||||
$temp->add(new admin_setting_configcheckbox_with_lock('backup/backup_general_anonymize', get_string('generalanonymize','backup'), get_string('configgeneralanonymize','backup'), array('value'=>0, 'locked'=>0)));
|
||||
$temp->add(new admin_setting_configcheckbox_with_lock('backup/backup_general_role_assignments', get_string('generalroleassignments','backup'), get_string('configgeneralroleassignments','backup'), array('value'=>1, 'locked'=>0)));
|
||||
@@ -106,8 +127,10 @@ if ($hassiteconfig
|
||||
$temp->add(new admin_setting_configcheckbox_with_lock('backup/backup_general_histories', get_string('generalhistories','backup'), get_string('configgeneralhistories','backup'), array('value'=>0, 'locked'=>0)));
|
||||
$ADMIN->add('backups', $temp);
|
||||
|
||||
/// "backups" settingpage
|
||||
// Create a page for automated backups configuration and defaults.
|
||||
$temp = new admin_settingpage('automated', get_string('automatedsetup','backup'), 'moodle/backup:backupcourse');
|
||||
|
||||
// Automated configuration section.
|
||||
$temp->add(new admin_setting_configselect('backup/backup_auto_active', get_string('active'), get_string('autoactivedescription', 'backup'), 0, array(
|
||||
0 => get_string('autoactivedisabled', 'backup'),
|
||||
1 => get_string('autoactiveenabled', 'backup'),
|
||||
@@ -138,8 +161,9 @@ if ($hassiteconfig
|
||||
400 => '400',
|
||||
500 => '500');
|
||||
$temp->add(new admin_setting_configselect('backup/backup_auto_keep', get_string('keep'), get_string('backupkeephelp'), 1, $keepoptoins));
|
||||
$temp->add(new admin_setting_configcheckbox('backup/backup_shortname', get_string('backup_shortname', 'admin'), get_string('backup_shortnamehelp', 'admin'), 0));
|
||||
|
||||
|
||||
// Automated defaults section.
|
||||
$temp->add(new admin_setting_heading('automatedsettings', get_string('automatedsettings','backup'), ''));
|
||||
$temp->add(new admin_setting_configcheckbox('backup/backup_auto_users', get_string('generalusers', 'backup'), get_string('configgeneralusers', 'backup'), 1));
|
||||
$temp->add(new admin_setting_configcheckbox('backup/backup_auto_role_assignments', get_string('generalroleassignments','backup'), get_string('configgeneralroleassignments','backup'), 1));
|
||||
|
||||
@@ -77,7 +77,7 @@ if (!during_initial_install()) { //do not use during installation
|
||||
|
||||
$ADMIN->add('frontpage', new admin_externalpage('frontpagebackup', get_string('frontpagebackup', 'admin'), $CFG->wwwroot.'/backup/backup.php?id='.SITEID, 'moodle/backup:backupcourse', false, $frontpagecontext));
|
||||
|
||||
$ADMIN->add('frontpage', new admin_externalpage('frontpagerestore', get_string('frontpagerestore', 'admin'), $CFG->wwwroot.'/files/index.php?id='.SITEID.'&wdir=/backupdata', 'moodle/restore:restorecourse', false, $frontpagecontext));
|
||||
$ADMIN->add('frontpage', new admin_externalpage('frontpagerestore', get_string('frontpagerestore', 'admin'), $CFG->wwwroot.'/backup/restorefile.php?contextid='.$frontpagecontext->id, 'moodle/restore:restorecourse', false, $frontpagecontext));
|
||||
|
||||
$questioncapabilities = array(
|
||||
'moodle/question:add',
|
||||
|
||||
+3
-1
@@ -9,6 +9,9 @@
|
||||
$zone = clean_param($zone, PARAM_PATH);
|
||||
}
|
||||
|
||||
$PAGE->set_url('/admin/timezone.php');
|
||||
$PAGE->set_context(get_context_instance(CONTEXT_SYSTEM));
|
||||
|
||||
require_login();
|
||||
|
||||
require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM));
|
||||
@@ -18,7 +21,6 @@
|
||||
$strusers = get_string("users");
|
||||
$strall = get_string("all");
|
||||
|
||||
$PAGE->set_url('/admin/timezone.php');
|
||||
$PAGE->set_title($strtimezone);
|
||||
$PAGE->set_heading($strtimezone);
|
||||
$PAGE->navbar->add($strtimezone);
|
||||
|
||||
@@ -63,6 +63,7 @@ class external_service_form extends moodleform {
|
||||
|
||||
$mform->addElement('text', 'name', get_string('name'));
|
||||
$mform->addRule('name', get_string('required'), 'required', null, 'client');
|
||||
$mform->setType('name', PARAM_TEXT);
|
||||
$mform->addElement('advcheckbox', 'enabled', get_string('enabled', 'webservice'));
|
||||
$mform->addElement('advcheckbox', 'restrictedusers',
|
||||
get_string('restrictedusers', 'webservice'));
|
||||
@@ -107,7 +108,7 @@ class external_service_form extends moodleform {
|
||||
$mform->setType('id', PARAM_INT);
|
||||
|
||||
if (!empty($service->id)) {
|
||||
$buttonlabel = get_string('editaservice', 'webservice');
|
||||
$buttonlabel = get_string('savechanges');
|
||||
} else {
|
||||
$buttonlabel = get_string('addaservice', 'webservice');
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ $confirm = optional_param('confirm', 0, PARAM_BOOL);
|
||||
admin_externalpage_setup('externalservicefunctions');
|
||||
|
||||
//define nav bar
|
||||
$PAGE->set_url('/' . $CFG->admin . '/websevice/service_functions.php', array('id' => $serviceid));
|
||||
$PAGE->set_url('/' . $CFG->admin . '/webservice/service_functions.php', array('id' => $serviceid));
|
||||
$node = $PAGE->settingsnav->find('externalservices', navigation_node::TYPE_SETTING);
|
||||
if ($node) {
|
||||
$node->make_active();
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<div class="loginbox clearfix">
|
||||
<div class="loginpanel">
|
||||
<div>
|
||||
<a href="<?php echo $CFG->wwwroot.'/login/index.php?authCAS=CAS';?>"><?php print_string('accesCAS', 'auth_cas');?></a>
|
||||
<a href="<?php echo get_login_url() . '?authCAS=CAS';?>"><?php print_string('accesCAS', 'auth_cas');?></a>
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
<a href="<?php echo $CFG->wwwroot.'/login/index.php?authCAS=NOCAS';?>"><?php print_string('accesNOCAS', 'auth_cas');?></a>
|
||||
<a href="<?php echo get_login_url() . '?authCAS=NOCAS';?>"><?php print_string('accesNOCAS', 'auth_cas');?></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -30,8 +30,8 @@ $string['auth_cas_baseuri'] = 'URI of the server (nothing if no baseUri)<br />Fo
|
||||
$string['auth_cas_baseuri_key'] = 'Base URI';
|
||||
$string['auth_cas_broken_password'] = 'You cannot proceed without changing your password, however there is no available page for changing it. Please contact your Moodle Administrator.';
|
||||
$string['auth_cas_cantconnect'] = 'LDAP part of CAS-module cannot connect to server: {$a}';
|
||||
$string['auth_cas_casversion'] = 'Version';
|
||||
$string['auth_cas_certificate_check'] = 'Turn this to \'yes\' if you want to validate the server certificate';
|
||||
$string['auth_cas_casversion'] = 'CAS protocol version';
|
||||
$string['auth_cas_certificate_check'] = 'Select \'yes\' if you want to validate the server certificate';
|
||||
$string['auth_cas_certificate_path_empty'] = 'If you turn on Server validation, you need to specify a certificate path';
|
||||
$string['auth_cas_certificate_check_key'] = 'Server validation';
|
||||
$string['auth_cas_certificate_path'] = 'Path of the CA chain file (PEM Format) to validate the server certificate';
|
||||
@@ -44,22 +44,22 @@ $string['auth_cas_hostname'] = 'Hostname of the CAS server <br />eg: host.domain
|
||||
$string['auth_cas_hostname_key'] = 'Hostname';
|
||||
$string['auth_cas_changepasswordurl'] = 'Password-change URL';
|
||||
$string['auth_cas_invalidcaslogin'] = 'Sorry, your login has failed - you could not be authorised';
|
||||
$string['auth_cas_language'] = 'Selected language';
|
||||
$string['auth_cas_language'] = 'Select language for authentication pages';
|
||||
$string['auth_cas_language_key'] = 'Language';
|
||||
$string['auth_cas_logincas'] = 'Secure connection access';
|
||||
$string['auth_cas_logoutcas'] = 'Turn this to \'yes\' if you want to logout from CAS when you disconnect from Moodle';
|
||||
$string['auth_cas_logoutcas_key'] = 'Logout CAS';
|
||||
$string['auth_cas_multiauth'] = 'Turn this to \'yes\' if you want to have multi-authentication (CAS + other authentication)';
|
||||
$string['auth_cas_logoutcas'] = 'Select \'yes\' if you want to logout from CAS when you disconnect from Moodle';
|
||||
$string['auth_cas_logoutcas_key'] = 'CAS logout option';
|
||||
$string['auth_cas_multiauth'] = 'Select \'yes\' if you want to have multi-authentication (CAS + other authentication)';
|
||||
$string['auth_cas_multiauth_key'] = 'Multi-authentication';
|
||||
$string['auth_casnotinstalled'] = 'Cannot use CAS authentication. The PHP LDAP module is not installed.';
|
||||
$string['auth_cas_port'] = 'Port of the CAS server';
|
||||
$string['auth_cas_port_key'] = 'Port';
|
||||
$string['auth_cas_proxycas'] = 'Turn this to \'yes\' if you use CASin proxy-mode';
|
||||
$string['auth_cas_proxycas'] = 'Select \'yes\' if you use CAS in proxy-mode';
|
||||
$string['auth_cas_proxycas_key'] = 'Proxy mode';
|
||||
$string['auth_cas_server_settings'] = 'CAS server configuration';
|
||||
$string['auth_cas_text'] = 'Secure connection';
|
||||
$string['auth_cas_use_cas'] = 'Use CAS';
|
||||
$string['auth_cas_version'] = 'Version of CAS';
|
||||
$string['auth_cas_version'] = 'CAS protocol version to use';
|
||||
$string['CASform'] = 'Authentication choice';
|
||||
$string['noldapserver'] = 'No LDAP server configured for CAS! Syncing disabled.';
|
||||
$string['pluginname'] = 'CAS server (SSO)';
|
||||
|
||||
@@ -57,7 +57,7 @@ $string['auth_dbsybasequoting'] = 'Use sybase quotes';
|
||||
$string['auth_dbsybasequotinghelp'] = 'Sybase style single quote escaping - needed for Oracle, MS SQL and some other databases. Do not use for MySQL!';
|
||||
$string['auth_dbtable'] = 'Name of the table in the database';
|
||||
$string['auth_dbtable_key'] = 'Table';
|
||||
$string['auth_dbtype'] = 'The database type (See the <a href="../lib/adodb/readme.htm#drivers">ADOdb documentation</a> for details)';
|
||||
$string['auth_dbtype'] = 'The database type (See the <a href="http://phplens.com/adodb/supported.databases.html" target="_blank">ADOdb documentation</a> for details)';
|
||||
$string['auth_dbtype_key'] = 'Database';
|
||||
$string['auth_dbupdatinguser'] = 'Updating user {$a->name} id {$a->id}';
|
||||
$string['auth_dbuser'] = 'Username with read access to the database';
|
||||
|
||||
@@ -33,8 +33,9 @@ $PAGE->set_title("$site->fullname: $loginsite");
|
||||
$PAGE->set_heading($site->fullname);
|
||||
echo $OUTPUT->header();
|
||||
|
||||
// $PAGE->https_required() up above takes care of what $CFG->httpswwwroot should be.
|
||||
$msg = '<p>'.get_string('ntlmsso_attempting', 'auth_ldap').'</p>'
|
||||
. '<img width="1", height="1" '
|
||||
. ' src="' . $CFG->wwwroot . '/auth/ldap/ntlmsso_magic.php?sesskey='
|
||||
. ' src="' . $CFG->httpswwwroot . '/auth/ldap/ntlmsso_magic.php?sesskey='
|
||||
. $sesskey . '" />';
|
||||
redirect($CFG->wwwroot . '/auth/ldap/ntlmsso_finish.php', $msg, 3);
|
||||
redirect($CFG->httpswwwroot . '/auth/ldap/ntlmsso_finish.php', $msg, 3);
|
||||
|
||||
@@ -29,7 +29,8 @@ $file = $CFG->dirroot.'/pix/spacer.gif';
|
||||
if ($authplugin->ntlmsso_magic($sesskey) && file_exists($file)) {
|
||||
if (!empty($authplugin->config->ntlmsso_ie_fastpath)) {
|
||||
if (check_browser_version('MSIE')) {
|
||||
redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_finish.php');
|
||||
// $PAGE->https_required() up above takes care of what $CFG->httpswwwroot should be.
|
||||
redirect($CFG->httpswwwroot.'/auth/ldap/ntlmsso_finish.php');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,17 +44,17 @@ $PAGE->https_required();
|
||||
// Redirect to SessionInitiator with entityID as argument
|
||||
if (isset($IdPs[$selectedIdP][1]) && !empty($IdPs[$selectedIdP][1])) {
|
||||
// For Shibbolet 1.x Service Providers
|
||||
header('Location: '.$IdPs[$selectedIdP][1].'?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
|
||||
header('Location: '.$IdPs[$selectedIdP][1].'?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->httpswwwroot.'/auth/shibboleth/index.php'));
|
||||
|
||||
// For Shibbolet 2.x Service Providers
|
||||
// header('Location: '.$IdPs[$selectedIdP][1].'?entityID='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
|
||||
// header('Location: '.$IdPs[$selectedIdP][1].'?entityID='. urlencode($selectedIdP) .'&target='. urlencode($CFG->httpswwwroot.'/auth/shibboleth/index.php'));
|
||||
|
||||
} else {
|
||||
// For Shibbolet 1.x Service Providers
|
||||
header('Location: /Shibboleth.sso?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
|
||||
header('Location: /Shibboleth.sso?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->httpswwwroot.'/auth/shibboleth/index.php'));
|
||||
|
||||
// For Shibboleth 2.x Service Providers
|
||||
// header('Location: /Shibboleth.sso/DS?entityID='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
|
||||
// header('Location: /Shibboleth.sso/DS?entityID='. urlencode($selectedIdP) .'&target='. urlencode($CFG->httpswwwroot.'/auth/shibboleth/index.php'));
|
||||
}
|
||||
} elseif (isset($_POST['idp']) && !isset($IdPs[$_POST['idp']])) {
|
||||
$errormsg = get_string('auth_shibboleth_errormsg', 'auth_shibboleth');
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ switch ($type) {
|
||||
case backup::TYPE_1SECTION :
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
require_capability('moodle/backup:backupsection', $coursecontext);
|
||||
if (!empty($section->name)) {
|
||||
if ((string)$section->name !== '') {
|
||||
$sectionname = format_string($section->name, true, array('context' => $coursecontext));
|
||||
$heading = get_string('backupsection', 'backup', $sectionname);
|
||||
$PAGE->navbar->add($sectionname);
|
||||
|
||||
@@ -170,17 +170,22 @@ class backup_controller extends backup implements loggable {
|
||||
}
|
||||
|
||||
public function set_status($status) {
|
||||
$this->log('setting controller status to', backup::LOG_DEBUG, $status);
|
||||
// TODO: Check it's a correct status
|
||||
$this->status = $status;
|
||||
// Ensure that, once set to backup::STATUS_AWAITING, controller is stored in DB
|
||||
// Note: never save_controller() after STATUS_EXECUTING or the whole controller,
|
||||
// Note: never save_controller() with the object info after STATUS_EXECUTING or the whole controller,
|
||||
// containing all the steps will be sent to DB. 100% (monster) useless.
|
||||
$this->log('setting controller status to', backup::LOG_DEBUG, $status);
|
||||
// TODO: Check it's a correct status.
|
||||
$this->status = $status;
|
||||
// Ensure that, once set to backup::STATUS_AWAITING, controller is stored in DB.
|
||||
if ($status == backup::STATUS_AWAITING) {
|
||||
$this->save_controller();
|
||||
$tbc = self::load_controller($this->backupid);
|
||||
$this->logger = $tbc->logger; // wakeup loggers
|
||||
$tbc->destroy(); // Clean temp controller structures
|
||||
|
||||
} else if ($status == backup::STATUS_FINISHED_OK) {
|
||||
// If the operation has ended without error (backup::STATUS_FINISHED_OK)
|
||||
// proceed by cleaning the object from database. MDL-29262.
|
||||
$this->save_controller(false, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -312,12 +317,20 @@ class backup_controller extends backup implements loggable {
|
||||
backup_helper::log($message, $level, $a, $depth, $display, $this->logger);
|
||||
}
|
||||
|
||||
public function save_controller() {
|
||||
/**
|
||||
* Save controller information
|
||||
*
|
||||
* @param bool $includeobj to decide if the object itself must be updated (true) or no (false)
|
||||
* @param bool $cleanobj to decide if the object itself must be cleaned (true) or no (false)
|
||||
*/
|
||||
public function save_controller($includeobj = true, $cleanobj = false) {
|
||||
// Going to save controller to persistent storage, calculate checksum for later checks and save it
|
||||
// TODO: flag the controller as NA. Any operation on it should be forbidden util loaded back
|
||||
$this->log('saving controller to db', backup::LOG_DEBUG);
|
||||
$this->checksum = $this->calculate_checksum();
|
||||
backup_controller_dbops::save_controller($this, $this->checksum);
|
||||
if ($includeobj ) { // Only calculate checksum if we are going to include the object.
|
||||
$this->checksum = $this->calculate_checksum();
|
||||
}
|
||||
backup_controller_dbops::save_controller($this, $this->checksum, $includeobj, $cleanobj);
|
||||
}
|
||||
|
||||
public static function load_controller($backupid) {
|
||||
|
||||
@@ -166,17 +166,22 @@ class restore_controller extends backup implements loggable {
|
||||
}
|
||||
|
||||
public function set_status($status) {
|
||||
$this->log('setting controller status to', backup::LOG_DEBUG, $status);
|
||||
// TODO: Check it's a correct status
|
||||
$this->status = $status;
|
||||
// Ensure that, once set to backup::STATUS_AWAITING | STATUS_NEED_PRECHECK, controller is stored in DB
|
||||
// Note: never save_controller() after STATUS_EXECUTING or the whole controller,
|
||||
// Note: never save_controller() with the object info after STATUS_EXECUTING or the whole controller,
|
||||
// containing all the steps will be sent to DB. 100% (monster) useless.
|
||||
$this->log('setting controller status to', backup::LOG_DEBUG, $status);
|
||||
// TODO: Check it's a correct status.
|
||||
$this->status = $status;
|
||||
// Ensure that, once set to backup::STATUS_AWAITING | STATUS_NEED_PRECHECK, controller is stored in DB.
|
||||
if ($status == backup::STATUS_AWAITING || $status == backup::STATUS_NEED_PRECHECK) {
|
||||
$this->save_controller();
|
||||
$tbc = self::load_controller($this->restoreid);
|
||||
$this->logger = $tbc->logger; // wakeup loggers
|
||||
$tbc->destroy(); // Clean temp controller structures
|
||||
|
||||
} else if ($status == backup::STATUS_FINISHED_OK) {
|
||||
// If the operation has ended without error (backup::STATUS_FINISHED_OK)
|
||||
// proceed by cleaning the object from database. MDL-29262.
|
||||
$this->save_controller(false, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -363,12 +368,20 @@ class restore_controller extends backup implements loggable {
|
||||
backup_helper::log($message, $level, $a, $depth, $display, $this->logger);
|
||||
}
|
||||
|
||||
public function save_controller() {
|
||||
/**
|
||||
* Save controller information
|
||||
*
|
||||
* @param bool $includeobj to decide if the object itself must be updated (true) or no (false)
|
||||
* @param bool $cleanobj to decide if the object itself must be cleaned (true) or no (false)
|
||||
*/
|
||||
public function save_controller($includeobj = true, $cleanobj = false) {
|
||||
// Going to save controller to persistent storage, calculate checksum for later checks and save it
|
||||
// TODO: flag the controller as NA. Any operation on it should be forbidden util loaded back
|
||||
$this->log('saving controller to db', backup::LOG_DEBUG);
|
||||
$this->checksum = $this->calculate_checksum();
|
||||
restore_controller_dbops::save_controller($this, $this->checksum);
|
||||
if ($includeobj ) { // Only calculate checksum if we are going to include the object.
|
||||
$this->checksum = $this->calculate_checksum();
|
||||
}
|
||||
restore_controller_dbops::save_controller($this, $this->checksum, $includeobj, $cleanobj);
|
||||
}
|
||||
|
||||
public static function load_controller($restoreid) {
|
||||
|
||||
@@ -161,7 +161,7 @@ class backup_controller_test extends UnitTestCase {
|
||||
*/
|
||||
class mock_backup_controller extends backup_controller {
|
||||
|
||||
public function save_controller() {
|
||||
parent::save_controller();
|
||||
public function save_controller($includeobj = true, $cleanobj = false) {
|
||||
parent::save_controller($includeobj, $cleanobj);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -640,7 +640,10 @@ class moodle1_converter extends base_converter {
|
||||
return $files;
|
||||
}
|
||||
foreach ($matches[2] as $match) {
|
||||
$files[] = str_replace(array('$@FILEPHP@$', '$@SLASH@$', '$@FORCEDOWNLOAD@$'), array('', '/', ''), $match);
|
||||
$file = str_replace(array('$@FILEPHP@$', '$@SLASH@$', '$@FORCEDOWNLOAD@$'), array('', '/', ''), $match);
|
||||
if ($file === clean_param($file, PARAM_PATH)) {
|
||||
$files[] = rawurldecode($file);
|
||||
}
|
||||
}
|
||||
|
||||
return array_unique($files);
|
||||
@@ -1205,6 +1208,10 @@ class moodle1_file_manager implements loggable {
|
||||
|
||||
$sourcefullpath = $this->basepath.'/'.$sourcepath;
|
||||
|
||||
if ($sourcefullpath !== clean_param($sourcefullpath, PARAM_PATH)) {
|
||||
throw new moodle1_convert_exception('file_invalid_path', $sourcefullpath);
|
||||
}
|
||||
|
||||
if (!is_readable($sourcefullpath)) {
|
||||
throw new moodle1_convert_exception('file_not_readable', $sourcefullpath);
|
||||
}
|
||||
|
||||
@@ -260,6 +260,15 @@ class moodle1_converter_test extends UnitTestCase {
|
||||
$fileids = $fileman->get_fileids();
|
||||
$this->assertIsA($fileids, 'array');
|
||||
$this->assertEqual(0, count($fileids));
|
||||
// try to migrate an invalid file
|
||||
$fileman->itemid = 1;
|
||||
$thrown = false;
|
||||
try {
|
||||
$fileman->migrate_file('/../../../../../../../../../../../../../../etc/passwd');
|
||||
} catch (moodle1_convert_exception $e) {
|
||||
$thrown = true;
|
||||
}
|
||||
$this->assertTrue($thrown);
|
||||
// migrate a single file
|
||||
$fileman->itemid = 4;
|
||||
$fileman->migrate_file('moddata/unittest/4/icon.gif');
|
||||
@@ -421,6 +430,8 @@ class moodle1_converter_test extends UnitTestCase {
|
||||
|
||||
$text = 'This is a text containing links to file.php
|
||||
as it is parsed from the backup file. <br /><br /><img border="0" width="110" vspace="0" hspace="0" height="92" title="News" alt="News" src="$@FILEPHP@$$@SLASH@$pics$@SLASH@$news.gif" /><a href="$@FILEPHP@$$@SLASH@$pics$@SLASH@$news.gif$@FORCEDOWNLOAD@$">download image</a><br />
|
||||
<div><a href=\'$@FILEPHP@$/../../../../../../../../../../../../../../../etc/passwd\'>download passwords</a></div>
|
||||
<div><a href=\'$@FILEPHP@$$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$etc$@SLASH@$shadow\'>download shadows</a></div>
|
||||
<br /><a href=\'$@FILEPHP@$$@SLASH@$MANUAL.DOC$@FORCEDOWNLOAD@$\'>download manual</a><br />';
|
||||
|
||||
$files = moodle1_converter::find_referenced_files($text);
|
||||
@@ -432,6 +443,8 @@ as it is parsed from the backup file. <br /><br /><img border="0" width="110" vs
|
||||
$text = moodle1_converter::rewrite_filephp_usage($text, array('/pics/news.gif', '/another/file/notused.txt'), $files);
|
||||
$this->assertEqual($text, 'This is a text containing links to file.php
|
||||
as it is parsed from the backup file. <br /><br /><img border="0" width="110" vspace="0" hspace="0" height="92" title="News" alt="News" src="@@PLUGINFILE@@/pics/news.gif" /><a href="@@PLUGINFILE@@/pics/news.gif?forcedownload=1">download image</a><br />
|
||||
<div><a href=\'$@FILEPHP@$/../../../../../../../../../../../../../../../etc/passwd\'>download passwords</a></div>
|
||||
<div><a href=\'$@FILEPHP@$$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$..$@SLASH@$etc$@SLASH@$shadow\'>download shadows</a></div>
|
||||
<br /><a href=\'$@FILEPHP@$$@SLASH@$MANUAL.DOC$@FORCEDOWNLOAD@$\'>download manual</a><br />');
|
||||
}
|
||||
|
||||
|
||||
@@ -142,6 +142,11 @@ abstract class backup_activity_task extends backup_task {
|
||||
$this->add_step(new backup_activity_logs_structure_step('activity_logs', 'logs.xml'));
|
||||
}
|
||||
|
||||
// Generate the calendar events file (conditionally)
|
||||
if ($this->get_setting_value('calendarevents')) {
|
||||
$this->add_step(new backup_calendarevents_structure_step('activity_calendar', 'calendar.xml'));
|
||||
}
|
||||
|
||||
// Fetch all the activity grade items and put them to backup_ids
|
||||
$this->add_step(new backup_activity_grade_items_to_ids('fetch_activity_grade_items'));
|
||||
|
||||
|
||||
@@ -103,6 +103,11 @@ class backup_course_task extends backup_task {
|
||||
$this->add_step(new backup_comments_structure_step('course_comments', 'comments.xml'));
|
||||
}
|
||||
|
||||
// Generate the calender events file (conditionally)
|
||||
if ($this->get_setting_value('calendarevents')) {
|
||||
$this->add_step(new backup_calendarevents_structure_step('course_calendar', 'calendar.xml'));
|
||||
}
|
||||
|
||||
// Generate the logs file (conditionally)
|
||||
if ($this->get_setting_value('logs')) {
|
||||
$this->add_step(new backup_course_logs_structure_step('course_logs', 'logs.xml'));
|
||||
|
||||
@@ -90,6 +90,12 @@ class backup_root_task extends backup_task {
|
||||
$this->add_setting($comments);
|
||||
$users->add_dependency($comments);
|
||||
|
||||
// Define calendar events (dependent of users)
|
||||
$events = new backup_calendarevents_setting('calendarevents', base_setting::IS_BOOLEAN, true);
|
||||
$events->set_ui(new backup_setting_ui_checkbox($events, get_string('rootsettingcalendarevents', 'backup')));
|
||||
$this->add_setting($events);
|
||||
$users->add_dependency($events);
|
||||
|
||||
// Define completion (dependent of users)
|
||||
$completion = new backup_userscompletion_setting('userscompletion', base_setting::IS_BOOLEAN, true);
|
||||
$completion->set_ui(new backup_setting_ui_checkbox($completion, get_string('rootsettinguserscompletion', 'backup')));
|
||||
|
||||
@@ -89,6 +89,13 @@ class backup_logs_setting extends backup_anonymize_setting {}
|
||||
*/
|
||||
class backup_comments_setting extends backup_anonymize_setting {}
|
||||
|
||||
/**
|
||||
* root setting to control if backup will include
|
||||
* calender events or no (any level), depends of @backup_users_setting
|
||||
* exactly in the same way than @backup_anonymize_setting so we extend from it
|
||||
*/
|
||||
class backup_calendarevents_setting extends backup_anonymize_setting {}
|
||||
|
||||
/**
|
||||
* root setting to control if backup will include
|
||||
* users completion data or no (any level), depends of @backup_users_setting
|
||||
|
||||
@@ -763,6 +763,48 @@ class backup_comments_structure_step extends backup_structure_step {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* structure step in charge of constructing the calender.xml file for all the events found
|
||||
* in a given context
|
||||
*/
|
||||
class backup_calendarevents_structure_step extends backup_structure_step {
|
||||
|
||||
protected function define_structure() {
|
||||
|
||||
// Define each element separated
|
||||
|
||||
$events = new backup_nested_element('events');
|
||||
|
||||
$event = new backup_nested_element('event', array('id'), array(
|
||||
'name', 'description', 'format', 'courseid', 'groupid', 'userid',
|
||||
'repeatid', 'modulename', 'instance', 'eventtype', 'timestart',
|
||||
'timeduration', 'visible', 'uuid', 'sequence', 'timemodified'));
|
||||
|
||||
// Build the tree
|
||||
$events->add_child($event);
|
||||
|
||||
// Define sources
|
||||
if ($this->name == 'course_calendar') {
|
||||
$calendar_items_sql ="SELECT * FROM {event}
|
||||
WHERE courseid = :courseid
|
||||
AND (eventtype = 'course' OR eventtype = 'group')";
|
||||
$calendar_items_params = array('courseid'=>backup::VAR_COURSEID);
|
||||
$event->set_source_sql($calendar_items_sql, $calendar_items_params);
|
||||
} else {
|
||||
$event->set_source_table('event', array('courseid' => backup::VAR_COURSEID, 'instance' => backup::VAR_ACTIVITYID, 'modulename' => backup::VAR_MODNAME));
|
||||
}
|
||||
|
||||
// Define id annotations
|
||||
|
||||
$event->annotate_ids('user', 'userid');
|
||||
$event->annotate_ids('group', 'groupid');
|
||||
$event->annotate_files('calendar', 'event_description', 'id');
|
||||
|
||||
// Return the root element (events)
|
||||
return $events;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* structure step in charge of constructing the gradebook.xml file for all the gradebook config in the course
|
||||
* NOTE: the backup of the grade items themselves is handled by backup_activity_grades_structure_step
|
||||
|
||||
@@ -147,6 +147,11 @@ abstract class restore_activity_task extends restore_task {
|
||||
$this->add_step(new restore_comments_structure_step('activity_comments', 'comments.xml'));
|
||||
}
|
||||
|
||||
// Calendar events (conditionally)
|
||||
if ($this->get_setting_value('calendarevents')) {
|
||||
$this->add_step(new restore_calendarevents_structure_step('activity_calendar', 'calendar.xml'));
|
||||
}
|
||||
|
||||
// Grades (module-related, rest of gradebook is restored later if possible: cats, calculations...)
|
||||
$this->add_step(new restore_activity_grades_structure_step('activity_grades', 'grades.xml'));
|
||||
|
||||
|
||||
@@ -84,6 +84,11 @@ class restore_course_task extends restore_task {
|
||||
$this->add_step(new restore_comments_structure_step('course_comments', 'comments.xml'));
|
||||
}
|
||||
|
||||
// Calendar events (conditionally)
|
||||
if ($this->get_setting_value('calendarevents')) {
|
||||
$this->add_step(new restore_calendarevents_structure_step('course_calendar', 'calendar.xml'));
|
||||
}
|
||||
|
||||
// At the end, mark it as built
|
||||
$this->built = true;
|
||||
}
|
||||
|
||||
@@ -55,8 +55,11 @@ class restore_final_task extends restore_task {
|
||||
$this->add_step(new restore_gradebook_structure_step('gradebook_step','gradebook.xml'));
|
||||
}
|
||||
|
||||
// Course completion
|
||||
$this->add_step(new restore_course_completion_structure_step('course_completion', 'completion.xml'));
|
||||
// Course completion, executed conditionally if restoring to new course
|
||||
if ($this->get_target() !== backup::TARGET_CURRENT_ADDING &&
|
||||
$this->get_target() !== backup::TARGET_EXISTING_ADDING) {
|
||||
$this->add_step(new restore_course_completion_structure_step('course_completion', 'completion.xml'));
|
||||
}
|
||||
|
||||
// Review all the module_availability records in backup_ids in order
|
||||
// to match them with existing modules / grade items.
|
||||
|
||||
@@ -166,6 +166,19 @@ class restore_root_task extends restore_task {
|
||||
$this->add_setting($comments);
|
||||
$users->add_dependency($comments);
|
||||
|
||||
// Define Calendar events (dependent of users)
|
||||
$defaultvalue = false; // Safer default
|
||||
$changeable = false;
|
||||
if (isset($rootsettings['calendarevents']) && $rootsettings['calendarevents']) { // Only enabled when available
|
||||
$defaultvalue = true;
|
||||
$changeable = true;
|
||||
}
|
||||
$events = new restore_calendarevents_setting('calendarevents', base_setting::IS_BOOLEAN, $defaultvalue);
|
||||
$events->set_ui(new backup_setting_ui_checkbox($events, get_string('rootsettingcalendarevents', 'backup')));
|
||||
$events->get_ui()->set_changeable($changeable);
|
||||
$this->add_setting($events);
|
||||
$users->add_dependency($events);
|
||||
|
||||
// Define completion (dependent of users)
|
||||
$defaultvalue = false; // Safer default
|
||||
$changeable = false;
|
||||
|
||||
@@ -58,6 +58,13 @@ class restore_activities_setting extends restore_generic_setting {}
|
||||
*/
|
||||
class restore_comments_setting extends restore_role_assignments_setting {}
|
||||
|
||||
/**
|
||||
* root setting to control if restore will create
|
||||
* events or no, depends of @restore_users_setting
|
||||
* exactly in the same way than @restore_role_assignments_setting so we extend from it
|
||||
*/
|
||||
class restore_calendarevents_setting extends restore_role_assignments_setting {}
|
||||
|
||||
/**
|
||||
* root setting to control if restore will create
|
||||
* completion info or no, depends of @restore_users_setting
|
||||
|
||||
@@ -206,21 +206,25 @@ class restore_gradebook_structure_step extends restore_structure_step {
|
||||
global $DB;
|
||||
|
||||
$data = (object)$data;
|
||||
$oldid = $data->id;
|
||||
$olduserid = $data->userid;
|
||||
|
||||
$data->itemid = $this->get_new_parentid('grade_item');
|
||||
|
||||
$data->userid = $this->get_mappingid('user', $data->userid, NULL);
|
||||
$data->usermodified = $this->get_mappingid('user', $data->usermodified, NULL);
|
||||
$data->locktime = $this->apply_date_offset($data->locktime);
|
||||
// TODO: Ask, all the rest of locktime/exported... work with time... to be rolled?
|
||||
$data->overridden = $this->apply_date_offset($data->overridden);
|
||||
$data->timecreated = $this->apply_date_offset($data->timecreated);
|
||||
$data->timemodified = $this->apply_date_offset($data->timemodified);
|
||||
$data->userid = $this->get_mappingid('user', $data->userid, null);
|
||||
if (!empty($data->userid)) {
|
||||
$data->usermodified = $this->get_mappingid('user', $data->usermodified, null);
|
||||
$data->locktime = $this->apply_date_offset($data->locktime);
|
||||
// TODO: Ask, all the rest of locktime/exported... work with time... to be rolled?
|
||||
$data->overridden = $this->apply_date_offset($data->overridden);
|
||||
$data->timecreated = $this->apply_date_offset($data->timecreated);
|
||||
$data->timemodified = $this->apply_date_offset($data->timemodified);
|
||||
|
||||
$newitemid = $DB->insert_record('grade_grades', $data);
|
||||
//$this->set_mapping('grade_grade', $oldid, $newitemid);
|
||||
$newitemid = $DB->insert_record('grade_grades', $data);
|
||||
} else {
|
||||
debugging("Mapped user id not found for user id '{$olduserid}', grade item id '{$data->itemid}'");
|
||||
}
|
||||
}
|
||||
|
||||
protected function process_grade_category($data) {
|
||||
global $DB;
|
||||
|
||||
@@ -1023,7 +1027,7 @@ class restore_section_structure_step extends restore_structure_step {
|
||||
// Section exists, update non-empty information
|
||||
} else {
|
||||
$section->id = $secrec->id;
|
||||
if (empty($secrec->name)) {
|
||||
if ((string)$secrec->name === '') {
|
||||
$section->name = $data->name;
|
||||
}
|
||||
if (empty($secrec->summary)) {
|
||||
@@ -1512,6 +1516,76 @@ class restore_comments_structure_step extends restore_structure_step {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This structure steps restores the calendar events
|
||||
*/
|
||||
class restore_calendarevents_structure_step extends restore_structure_step {
|
||||
|
||||
protected function define_structure() {
|
||||
|
||||
$paths = array();
|
||||
|
||||
$paths[] = new restore_path_element('calendarevents', '/events/event');
|
||||
|
||||
return $paths;
|
||||
}
|
||||
|
||||
public function process_calendarevents($data) {
|
||||
global $DB;
|
||||
|
||||
$data = (object)$data;
|
||||
$oldid = $data->id;
|
||||
$restorefiles = true; // We'll restore the files
|
||||
// Find the userid and the groupid associated with the event. Return if not found.
|
||||
$data->userid = $this->get_mappingid('user', $data->userid);
|
||||
if ($data->userid === false) {
|
||||
return;
|
||||
}
|
||||
if (!empty($data->groupid)) {
|
||||
$data->groupid = $this->get_mappingid('group', $data->groupid);
|
||||
if ($data->groupid === false) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$params = array(
|
||||
'name' => $data->name,
|
||||
'description' => $data->description,
|
||||
'format' => $data->format,
|
||||
'courseid' => $this->get_courseid(),
|
||||
'groupid' => $data->groupid,
|
||||
'userid' => $data->userid,
|
||||
'repeatid' => $data->repeatid,
|
||||
'modulename' => $data->modulename,
|
||||
'eventtype' => $data->eventtype,
|
||||
'timestart' => $this->apply_date_offset($data->timestart),
|
||||
'timeduration' => $data->timeduration,
|
||||
'visible' => $data->visible,
|
||||
'uuid' => $data->uuid,
|
||||
'sequence' => $data->sequence,
|
||||
'timemodified' => $this->apply_date_offset($data->timemodified));
|
||||
if ($this->name == 'activity_calendar') {
|
||||
$params['instance'] = $this->task->get_activityid();
|
||||
} else {
|
||||
$params['instance'] = 0;
|
||||
}
|
||||
$sql = 'SELECT id FROM {event} WHERE name = ? AND courseid = ? AND
|
||||
repeatid = ? AND modulename = ? AND timestart = ? AND timeduration =?
|
||||
AND ' . $DB->sql_compare_text('description', 255) . ' = ' . $DB->sql_compare_text('?', 255);
|
||||
$arg = array ($params['name'], $params['courseid'], $params['repeatid'], $params['modulename'], $params['timestart'], $params['timeduration'], $params['description']);
|
||||
$result = $DB->record_exists_sql($sql, $arg);
|
||||
if (empty($result)) {
|
||||
$newitemid = $DB->insert_record('event', $params);
|
||||
$this->set_mapping('event_description', $oldid, $newitemid, $restorefiles);
|
||||
}
|
||||
|
||||
}
|
||||
protected function after_execute() {
|
||||
// Add related files
|
||||
$this->add_related_files('calendar', 'event_description', 'event_description');
|
||||
}
|
||||
}
|
||||
|
||||
class restore_course_completion_structure_step extends restore_structure_step {
|
||||
|
||||
/**
|
||||
@@ -1970,18 +2044,24 @@ class restore_activity_grades_structure_step extends restore_structure_step {
|
||||
|
||||
protected function process_grade_grade($data) {
|
||||
$data = (object)($data);
|
||||
|
||||
$olduserid = $data->userid;
|
||||
unset($data->id);
|
||||
$data->itemid = $this->get_new_parentid('grade_item');
|
||||
$data->userid = $this->get_mappingid('user', $data->userid);
|
||||
$data->usermodified = $this->get_mappingid('user', $data->usermodified);
|
||||
$data->rawscaleid = $this->get_mappingid('scale', $data->rawscaleid);
|
||||
// TODO: Ask, all the rest of locktime/exported... work with time... to be rolled?
|
||||
$data->overridden = $this->apply_date_offset($data->overridden);
|
||||
|
||||
$grade = new grade_grade($data, false);
|
||||
$grade->insert('restore');
|
||||
// no need to save any grade_grade mapping
|
||||
$data->itemid = $this->get_new_parentid('grade_item');
|
||||
|
||||
$data->userid = $this->get_mappingid('user', $data->userid, null);
|
||||
if (!empty($data->userid)) {
|
||||
$data->usermodified = $this->get_mappingid('user', $data->usermodified, null);
|
||||
$data->rawscaleid = $this->get_mappingid('scale', $data->rawscaleid);
|
||||
// TODO: Ask, all the rest of locktime/exported... work with time... to be rolled?
|
||||
$data->overridden = $this->apply_date_offset($data->overridden);
|
||||
|
||||
$grade = new grade_grade($data, false);
|
||||
$grade->insert('restore');
|
||||
// no need to save any grade_grade mapping
|
||||
} else {
|
||||
debugging("Mapped user id not found for user id '{$olduserid}', grade item id '{$data->itemid}'");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -168,9 +168,9 @@ abstract class backup_check {
|
||||
$hasusercap = has_capability('moodle/backup:userinfo', $coursectx, $userid);
|
||||
|
||||
// If setting is enabled but user lacks permission
|
||||
if (!$hasusercap && $prevvalue) { // If user has not the capability and setting is enabled
|
||||
if (!$hasusercap) { // If user has not the capability
|
||||
// Now analyse if we are allowed to apply changes or must stop with exception
|
||||
if (!$apply) { // Cannot apply changes, throw exception
|
||||
if (!$apply && $prevvalue) { // Cannot apply changes and the value is set, throw exception
|
||||
$a = new stdclass();
|
||||
$a->setting = 'users';
|
||||
$a->value = $prevvalue;
|
||||
@@ -178,7 +178,12 @@ abstract class backup_check {
|
||||
throw new backup_controller_exception('backup_setting_value_wrong_for_capability', $a);
|
||||
|
||||
} else { // Can apply changes
|
||||
$userssetting->set_value(false); // Set the value to false
|
||||
// If it is already false, we don't want to try and set it again, because if it is
|
||||
// already locked, and exception will occur. The side benifit is if it is true and locked
|
||||
// we will get an exception...
|
||||
if ($prevvalue) {
|
||||
$userssetting->set_value(false); // Set the value to false
|
||||
}
|
||||
$userssetting->set_status(base_setting::LOCKED_BY_PERMISSION);// Set the status to locked by perm
|
||||
}
|
||||
}
|
||||
@@ -191,9 +196,9 @@ abstract class backup_check {
|
||||
$hasanoncap = has_capability('moodle/backup:anonymise', $coursectx, $userid);
|
||||
|
||||
// If setting is enabled but user lacks permission
|
||||
if (!$hasanoncap && $prevvalue) { // If user has not the capability and setting is enabled
|
||||
if (!$hasanoncap) { // If user has not the capability
|
||||
// Now analyse if we are allowed to apply changes or must stop with exception
|
||||
if (!$apply) { // Cannot apply changes, throw exception
|
||||
if (!$apply && $prevvalue) { // Cannot apply changes and the value is set, throw exception
|
||||
$a = new stdclass();
|
||||
$a->setting = 'anonymize';
|
||||
$a->value = $prevvalue;
|
||||
@@ -201,7 +206,9 @@ abstract class backup_check {
|
||||
throw new backup_controller_exception('backup_setting_value_wrong_for_capability', $a);
|
||||
|
||||
} else { // Can apply changes
|
||||
$anonsetting->set_value(false); // Set the value to false
|
||||
if ($prevvalue) { // If we try and set it back to false and it has already been locked, error will occur
|
||||
$anonsetting->set_value(false); // Set the value to false
|
||||
}
|
||||
$anonsetting->set_status(base_setting::LOCKED_BY_PERMISSION);// Set the status to locked by perm
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,16 +32,30 @@
|
||||
*/
|
||||
abstract class backup_controller_dbops extends backup_dbops {
|
||||
|
||||
public static function save_controller($controller, $checksum) {
|
||||
/**
|
||||
* Send one backup controller to DB
|
||||
*
|
||||
* @param backup_controller $controller controller to send to DB
|
||||
* @param string $checksum hash of the controller to be checked
|
||||
* @param bool $includeobj to decide if the object itself must be updated (true) or no (false)
|
||||
* @param bool $cleanobj to decide if the object itself must be cleaned (true) or no (false)
|
||||
* @return int id of the controller record in the DB
|
||||
* @throws backup_controller_exception|backup_dbops_exception
|
||||
*/
|
||||
public static function save_controller($controller, $checksum, $includeobj = true, $cleanobj = false) {
|
||||
global $DB;
|
||||
// Check we are going to save one backup_controller
|
||||
if (! $controller instanceof backup_controller) {
|
||||
throw new backup_controller_exception('backup_controller_expected');
|
||||
}
|
||||
// Check checksum is ok. Sounds silly but it isn't ;-)
|
||||
if (!$controller->is_checksum_correct($checksum)) {
|
||||
// Check checksum is ok. Only if we are including object info. Sounds silly but it isn't ;-).
|
||||
if ($includeobj and !$controller->is_checksum_correct($checksum)) {
|
||||
throw new backup_dbops_exception('backup_controller_dbops_saving_checksum_mismatch');
|
||||
}
|
||||
// Cannot request to $includeobj and $cleanobj at the same time.
|
||||
if ($includeobj and $cleanobj) {
|
||||
throw new backup_dbops_exception('backup_controller_dbops_saving_cannot_include_and_delete');
|
||||
}
|
||||
// Get all the columns
|
||||
$rec = new stdclass();
|
||||
$rec->backupid = $controller->get_backupid();
|
||||
@@ -57,7 +71,11 @@ abstract class backup_controller_dbops extends backup_dbops {
|
||||
$rec->executiontime= $controller->get_executiontime();
|
||||
$rec->checksum = $checksum;
|
||||
// Serialize information
|
||||
$rec->controller = base64_encode(serialize($controller));
|
||||
if ($includeobj) {
|
||||
$rec->controller = base64_encode(serialize($controller));
|
||||
} else if ($cleanobj) {
|
||||
$rec->controller = '';
|
||||
}
|
||||
// Send it to DB
|
||||
if ($recexists = $DB->get_record('backup_controllers', array('backupid' => $rec->backupid))) {
|
||||
$rec->id = $recexists->id;
|
||||
|
||||
@@ -32,16 +32,30 @@
|
||||
*/
|
||||
abstract class restore_controller_dbops extends restore_dbops {
|
||||
|
||||
public static function save_controller($controller, $checksum) {
|
||||
/**
|
||||
* Send one restore controller to DB
|
||||
*
|
||||
* @param restore_controller $controller controller to send to DB
|
||||
* @param string $checksum hash of the controller to be checked
|
||||
* @param bool $includeobj to decide if the object itself must be updated (true) or no (false)
|
||||
* @param bool $cleanobj to decide if the object itself must be cleaned (true) or no (false)
|
||||
* @return int id of the controller record in the DB
|
||||
* @throws backup_controller_exception|restore_dbops_exception
|
||||
*/
|
||||
public static function save_controller($controller, $checksum, $includeobj = true, $cleanobj = false) {
|
||||
global $DB;
|
||||
// Check we are going to save one backup_controller
|
||||
if (! $controller instanceof restore_controller) {
|
||||
throw new backup_controller_exception('restore_controller_expected');
|
||||
}
|
||||
// Check checksum is ok. Sounds silly but it isn't ;-)
|
||||
if (!$controller->is_checksum_correct($checksum)) {
|
||||
// Check checksum is ok. Only if we are including object info. Sounds silly but it isn't ;-).
|
||||
if ($includeobj and !$controller->is_checksum_correct($checksum)) {
|
||||
throw new restore_dbops_exception('restore_controller_dbops_saving_checksum_mismatch');
|
||||
}
|
||||
// Cannot request to $includeobj and $cleanobj at the same time.
|
||||
if ($includeobj and $cleanobj) {
|
||||
throw new restore_dbops_exception('restore_controller_dbops_saving_cannot_include_and_delete');
|
||||
}
|
||||
// Get all the columns
|
||||
$rec = new stdclass();
|
||||
$rec->backupid = $controller->get_restoreid();
|
||||
@@ -57,7 +71,11 @@ abstract class restore_controller_dbops extends restore_dbops {
|
||||
$rec->executiontime= $controller->get_executiontime();
|
||||
$rec->checksum = $checksum;
|
||||
// Serialize information
|
||||
$rec->controller = base64_encode(serialize($controller));
|
||||
if ($includeobj) {
|
||||
$rec->controller = base64_encode(serialize($controller));
|
||||
} else if ($cleanobj) {
|
||||
$rec->controller = '';
|
||||
}
|
||||
// Send it to DB
|
||||
if ($recexists = $DB->get_record('backup_controllers', array('backupid' => $rec->backupid))) {
|
||||
$rec->id = $recexists->id;
|
||||
|
||||
@@ -139,7 +139,7 @@ abstract class backup_factory {
|
||||
throw new backup_task_exception('section_task_section_not_found', $sectionid);
|
||||
}
|
||||
|
||||
return new backup_section_task(empty($section->name) ? $section->section : $section->name, $sectionid);
|
||||
return new backup_section_task((string)$section->name === '' ? $section->section : $section->name, $sectionid);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -281,23 +281,25 @@ abstract class backup_cron_automated_helper {
|
||||
$midnight = usergetmidnight($now, $timezone);
|
||||
$date = usergetdate($now, $timezone);
|
||||
|
||||
//Get number of days (from today) to execute backups
|
||||
$automateddays = substr($config->backup_auto_weekdays,$date['wday']) . $config->backup_auto_weekdays;
|
||||
$daysfromtoday = strpos($automateddays, "1");
|
||||
// Get number of days (from today) to execute backups
|
||||
$automateddays = substr($config->backup_auto_weekdays, $date['wday']) . $config->backup_auto_weekdays;
|
||||
$daysfromtoday = strpos($automateddays, "1", 1);
|
||||
|
||||
// If we can't find the next day, we set it to tomorrow
|
||||
if (empty($daysfromtoday)) {
|
||||
$daysfromtoday = 1;
|
||||
}
|
||||
|
||||
//If some day has been found
|
||||
// If some day has been found
|
||||
if ($daysfromtoday !== false) {
|
||||
//Calculate distance
|
||||
$dist = ($daysfromtoday * 86400) + //Days distance
|
||||
($config->backup_auto_hour * 3600) + //Hours distance
|
||||
($config->backup_auto_minute * 60); //Minutes distance
|
||||
// Calculate distance
|
||||
$dist = ($daysfromtoday * 86400) + // Days distance
|
||||
($config->backup_auto_hour * 3600) + // Hours distance
|
||||
($config->backup_auto_minute * 60); // Minutes distance
|
||||
$result = $midnight + $dist;
|
||||
}
|
||||
|
||||
//If that time is past, call the function recursively to obtain the next valid day
|
||||
// If that time is past, call the function recursively to obtain the next valid day
|
||||
if ($result > 0 && $result < time()) {
|
||||
$result = self::calculate_next_automated_backup($timezone, $result);
|
||||
}
|
||||
@@ -315,6 +317,7 @@ abstract class backup_cron_automated_helper {
|
||||
*/
|
||||
public static function launch_automated_backup($course, $starttime, $userid) {
|
||||
|
||||
$outcome = true;
|
||||
$config = get_config('backup');
|
||||
$bc = new backup_controller(backup::TYPE_1COURSE, $course->id, backup::FORMAT_MOODLE, backup::INTERACTIVE_NO, backup::MODE_AUTOMATED, $userid);
|
||||
|
||||
@@ -347,32 +350,33 @@ abstract class backup_cron_automated_helper {
|
||||
|
||||
$bc->set_status(backup::STATUS_AWAITING);
|
||||
|
||||
$outcome = $bc->execute_plan();
|
||||
$bc->execute_plan();
|
||||
$results = $bc->get_results();
|
||||
$file = $results['backup_destination'];
|
||||
$file = $results['backup_destination']; // may be empty if file already moved to target location
|
||||
$dir = $config->backup_auto_destination;
|
||||
$storage = (int)$config->backup_auto_storage;
|
||||
if (!file_exists($dir) || !is_dir($dir) || !is_writable($dir)) {
|
||||
$dir = null;
|
||||
}
|
||||
if (!empty($dir) && $storage !== 0) {
|
||||
$filename = backup_plan_dbops::get_default_backup_filename($format, $type, $course->id, $users, $anonymised, true);
|
||||
if ($file && !empty($dir) && $storage !== 0) {
|
||||
$filename = backup_plan_dbops::get_default_backup_filename($format, $type, $course->id, $users, $anonymised, !$config->backup_shortname);
|
||||
$outcome = $file->copy_content_to($dir.'/'.$filename);
|
||||
if ($outcome && $storage === 1) {
|
||||
$file->delete();
|
||||
}
|
||||
}
|
||||
|
||||
$outcome = true;
|
||||
} catch (backup_exception $e) {
|
||||
$bc->log('backup_auto_failed_on_course', backup::LOG_WARNING, $course->shortname);
|
||||
} catch (moodle_exception $e) {
|
||||
$bc->log('backup_auto_failed_on_course', backup::LOG_ERROR, $course->shortname); // Log error header.
|
||||
$bc->log('Exception: ' . $e->errorcode, backup::LOG_ERROR, $e->a, 1); // Log original exception problem.
|
||||
$bc->log('Debug: ' . $e->debuginfo, backup::LOG_DEBUG, null, 1); // Log original debug information.
|
||||
$outcome = false;
|
||||
}
|
||||
|
||||
$bc->destroy();
|
||||
unset($bc);
|
||||
|
||||
return true;
|
||||
return $outcome;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -459,6 +463,11 @@ abstract class backup_cron_automated_helper {
|
||||
$storage = $config->backup_auto_storage;
|
||||
$dir = $config->backup_auto_destination;
|
||||
|
||||
if ($keep == 0) {
|
||||
// means keep all backup files
|
||||
return true;
|
||||
}
|
||||
|
||||
$backupword = str_replace(' ', '_', moodle_strtolower(get_string('backupfilename')));
|
||||
$backupword = trim(clean_filename($backupword), '_');
|
||||
|
||||
|
||||
@@ -176,8 +176,17 @@ abstract class backup_helper {
|
||||
/**
|
||||
* Given one backupid and the (FS) final generated file, perform its final storage
|
||||
* into Moodle file storage. For stored files it returns the complete file_info object
|
||||
*
|
||||
* Note: the $filepath is deleted if the backup file is created successfully
|
||||
*
|
||||
* @param int $backupid
|
||||
* @param string $filepath zip file containing the backup
|
||||
* @return stored_file if created, null otherwise
|
||||
*
|
||||
* @throws moodle_exception in case of any problems
|
||||
*/
|
||||
static public function store_backup_file($backupid, $filepath) {
|
||||
global $CFG;
|
||||
|
||||
// First of all, get some information from the backup_controller to help us decide
|
||||
list($dinfo, $cinfo, $sinfo) = backup_controller_dbops::get_moodle_backup_information($backupid);
|
||||
@@ -191,6 +200,7 @@ abstract class backup_helper {
|
||||
$userid = $dinfo[0]->userid; // User->id executing the backup
|
||||
$id = $dinfo[0]->id; // Id of activity/section/course (depends of type)
|
||||
$courseid = $dinfo[0]->courseid; // Id of the course
|
||||
$format = $dinfo[0]->format; // Type of backup file
|
||||
|
||||
// Quick hack. If for any reason, filename is blank, fix it here.
|
||||
// TODO: This hack will be out once MDL-22142 - P26 gets fixed
|
||||
@@ -200,7 +210,13 @@ abstract class backup_helper {
|
||||
|
||||
// Backups of type IMPORT aren't stored ever
|
||||
if ($backupmode == backup::MODE_IMPORT) {
|
||||
return false;
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!is_readable($filepath)) {
|
||||
// we have a problem if zip file does not exist
|
||||
throw new coding_exception('backup_helper::store_backup_file() expects valid $filepath parameter');
|
||||
|
||||
}
|
||||
|
||||
// Calculate file storage options of id being backup
|
||||
@@ -232,6 +248,25 @@ abstract class backup_helper {
|
||||
if ($backupmode == backup::MODE_AUTOMATED) {
|
||||
// Automated backups have there own special area!
|
||||
$filearea = 'automated';
|
||||
|
||||
// If we're keeping the backup only in a chosen path, just move it there now
|
||||
// this saves copying from filepool to here later and filling trashdir.
|
||||
$config = get_config('backup');
|
||||
$dir = $config->backup_auto_destination;
|
||||
if ($config->backup_auto_storage == 1 and $dir and is_dir($dir) and is_writable($dir)) {
|
||||
$filedest = $dir.'/'.backup_plan_dbops::get_default_backup_filename($format, $backuptype, $courseid, $hasusers, $isannon, !$config->backup_shortname);
|
||||
// first try to move the file, if it is not possible copy and delete instead
|
||||
if (@rename($filepath, $filedest)) {
|
||||
return null;
|
||||
}
|
||||
umask(0000);
|
||||
if (copy($filepath, $filedest)) {
|
||||
@chmod($filedest, $CFG->filepermissions); // may fail because the permissions may not make sense outside of dataroot
|
||||
unlink($filepath);
|
||||
return null;
|
||||
}
|
||||
// bad luck, try to deal with the file the old way - keep backup in file area if we can not copy to ext system
|
||||
}
|
||||
}
|
||||
|
||||
// Backups of type HUB (by definition never have user info)
|
||||
@@ -275,7 +310,9 @@ abstract class backup_helper {
|
||||
$sf = $fs->get_file_by_hash($pathnamehash);
|
||||
$sf->delete();
|
||||
}
|
||||
return $fs->create_file_from_pathname($fr, $filepath);
|
||||
$file = $fs->create_file_from_pathname($fr, $filepath);
|
||||
unlink($filepath);
|
||||
return $file;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -294,7 +294,7 @@ abstract class base_setting {
|
||||
if ($this->is_circular_reference($dependency->get_dependent_setting())) {
|
||||
$a = new stdclass();
|
||||
$a->alreadydependent = $this->name;
|
||||
$a->main = $dependentsetting->get_name();
|
||||
$a->main = $dependency->get_dependent_setting()->get_name();
|
||||
throw new base_setting_exception('setting_circular_reference', $a);
|
||||
}
|
||||
$this->dependencies[$dependency->get_dependent_setting()->get_name()] = $dependency;
|
||||
|
||||
@@ -32,10 +32,12 @@ require_once($CFG->dirroot . '/backup/util/interfaces/checksumable.class.php');
|
||||
require_once($CFG->dirroot . '/backup/backup.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/settings/base_setting.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/settings/backup_setting.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/settings/setting_dependency.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/settings/root/root_backup_setting.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/settings/activity/activity_backup_setting.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/settings/section/section_backup_setting.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/settings/course/course_backup_setting.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/ui/backup_ui_setting.class.php');
|
||||
|
||||
/*
|
||||
* setting tests (all)
|
||||
@@ -209,6 +211,21 @@ class setting_test extends UnitTestCase {
|
||||
$this->assertEqual($e->a->alreadydependent, 'test4');
|
||||
}
|
||||
|
||||
$bs1 = new mock_base_setting('test1', base_setting::IS_INTEGER, null);
|
||||
$bs2 = new mock_base_setting('test2', base_setting::IS_INTEGER, null);
|
||||
$bs1->register_dependency(new setting_dependency_disabledif_empty($bs1, $bs2));
|
||||
try {
|
||||
// $bs1 is already dependent on $bs2 so this should fail.
|
||||
$bs2->register_dependency(new setting_dependency_disabledif_empty($bs2, $bs1));
|
||||
$this->assertTrue(false, 'base_setting_exception expected');
|
||||
} catch (exception $e) {
|
||||
$this->assertTrue($e instanceof base_setting_exception);
|
||||
$this->assertEqual($e->errorcode, 'setting_circular_reference');
|
||||
$this->assertTrue($e->a instanceof stdclass);
|
||||
$this->assertEqual($e->a->main, 'test1');
|
||||
$this->assertEqual($e->a->alreadydependent, 'test2');
|
||||
}
|
||||
|
||||
// Create 3 settings and observe between them, last one must
|
||||
// automatically inherit all the settings defined in the main one
|
||||
$bs1 = new mock_base_setting('test1', base_setting::IS_INTEGER, null);
|
||||
|
||||
@@ -129,7 +129,7 @@ class base_setting_ui {
|
||||
* @param string $label
|
||||
*/
|
||||
public function set_label($label) {
|
||||
if (empty($label) || $label !== clean_param($label, PARAM_TEXT)) {
|
||||
if ((string)$label === '' || $label !== clean_param($label, PARAM_TEXT)) {
|
||||
throw new base_setting_ui_exception('setting_invalid_ui_label');
|
||||
}
|
||||
$this->label = $label;
|
||||
|
||||
@@ -168,7 +168,7 @@ class block_completionstatus extends block_base {
|
||||
$a = new stdClass();
|
||||
$a->first = $prerequisites_complete;
|
||||
$a->second = count($prerequisites);
|
||||
$shtml .= get_string('firstofsecond', 'block_completionstatus', $a);
|
||||
$phtml .= get_string('firstofsecond', 'block_completionstatus', $a);
|
||||
$phtml .= '</td></tr>';
|
||||
|
||||
$shtml = $phtml . $shtml;
|
||||
|
||||
@@ -4,7 +4,7 @@ if (is_file($CFG->dirroot.'/mod/feedback/lib.php')) {
|
||||
define('FEEDBACK_BLOCK_LIB_IS_OK', true);
|
||||
}
|
||||
|
||||
class block_feedback extends block_base {
|
||||
class block_feedback extends block_list {
|
||||
|
||||
function init() {
|
||||
$this->title = get_string('feedback', 'block_feedback');
|
||||
@@ -21,10 +21,13 @@ class block_feedback extends block_base {
|
||||
return $this->content;
|
||||
}
|
||||
|
||||
$this->content = new stdClass;
|
||||
$this->content->items = array();
|
||||
$this->content->icons = array();
|
||||
$this->content->footer = '';
|
||||
|
||||
if (!defined('FEEDBACK_BLOCK_LIB_IS_OK')) {
|
||||
$this->content = new stdClass;
|
||||
$this->content->text = get_string('missing_feedback_module', 'block_feedback');
|
||||
$this->content->footer = '';
|
||||
$this->content->items = array(get_string('missing_feedback_module', 'block_feedback'));
|
||||
return $this->content;
|
||||
}
|
||||
|
||||
@@ -33,9 +36,7 @@ class block_feedback extends block_base {
|
||||
$courseid = SITEID;
|
||||
}
|
||||
|
||||
$this->content = new stdClass;
|
||||
$this->content->text = '';
|
||||
$this->content->footer = '';
|
||||
$icon = '<img src="'.$OUTPUT->pix_url('icon', 'feedback') . '" class="icon" alt="" />';
|
||||
|
||||
|
||||
if (empty($this->instance->pageid)) {
|
||||
@@ -47,8 +48,7 @@ class block_feedback extends block_base {
|
||||
foreach ($feedbacks as $feedback) {
|
||||
$url = new moodle_url($baseurl);
|
||||
$url->params(array('id'=>$feedback->cmid, 'courseid'=>$courseid));
|
||||
$icon = '<img src="'.$OUTPUT->pix_url('icon', 'feedback') . '" class="icon" alt="" /> ';
|
||||
$this->content->text = ' <a href="'.$url->out().'">'.$icon.$feedback->name.'</a>';
|
||||
$this->content->items[] = '<a href="'.$url->out().'">'.$icon.$feedback->name.'</a>';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-3
@@ -292,9 +292,16 @@ class blog_entry {
|
||||
|
||||
$contentcell->text .= $OUTPUT->container_start('commands');
|
||||
|
||||
if (blog_user_can_edit_entry($this) && empty($this->uniquehash)) {
|
||||
$contentcell->text .= html_writer::link(new moodle_url('/blog/edit.php', array('action' => 'edit', 'entryid' => $this->id)), $stredit) . ' | ';
|
||||
$contentcell->text .= html_writer::link(new moodle_url('/blog/edit.php', array('action' => 'delete', 'entryid' => $this->id)), $strdelete) . ' | ';
|
||||
if (blog_user_can_edit_entry($this)) {
|
||||
if (empty($this->uniquehash)) {
|
||||
//External blog entries should not be edited
|
||||
$contentcell->text .= html_writer::link(new moodle_url('/blog/edit.php',
|
||||
array('action' => 'edit', 'entryid' => $this->id)),
|
||||
$stredit) . ' | ';
|
||||
}
|
||||
$contentcell->text .= html_writer::link(new moodle_url('/blog/edit.php',
|
||||
array('action' => 'delete', 'entryid' => $this->id)),
|
||||
$strdelete) . ' | ';
|
||||
}
|
||||
|
||||
$contentcell->text .= html_writer::link(new moodle_url('/blog/index.php', array('entryid' => $this->id)), get_string('permalink', 'blog'));
|
||||
|
||||
+8
-1
@@ -104,6 +104,11 @@ function blog_rss_get_params($filters) {
|
||||
function blog_rss_get_feed($context, $args) {
|
||||
global $CFG, $SITE, $DB;
|
||||
|
||||
if (empty($CFG->bloglevel)) {
|
||||
debugging('Blogging disabled on this site, RSS feeds are not available');
|
||||
return null;
|
||||
}
|
||||
|
||||
if (empty($CFG->enablerssfeeds)) {
|
||||
debugging('Sorry, RSS feeds are disabled on this site');
|
||||
return '';
|
||||
@@ -164,7 +169,9 @@ function blog_rss_get_feed($context, $args) {
|
||||
$item->title = $blog_entry->subject;
|
||||
$item->pubdate = $blog_entry->lastmodified;
|
||||
$item->link = $CFG->wwwroot.'/blog/index.php?entryid='.$blog_entry->id;
|
||||
$item->description = format_text($blog_entry->summary, $blog_entry->format);
|
||||
$summary = file_rewrite_pluginfile_urls($blog_entry->summary, 'pluginfile.php',
|
||||
$sitecontext->id, 'blog', 'post', $blog_entry->id);
|
||||
$item->description = format_text($summary, $blog_entry->format);
|
||||
if ( !empty($CFG->usetags) && ($blogtags = tag_get_tags_array('post', $blog_entry->id)) ) {
|
||||
if ($blogtags) {
|
||||
$item->tags = $blogtags;
|
||||
|
||||
+4
-1
@@ -121,7 +121,10 @@ echo $OUTPUT->box_end();
|
||||
|
||||
// Print the event so that people can visually confirm they have the correct event
|
||||
$event->time = calendar_format_event_time($event, time(), null, false);
|
||||
calendar_print_event($event, false);
|
||||
$renderer = $PAGE->get_renderer('core_calendar');
|
||||
echo $renderer->start_layout();
|
||||
echo $renderer->event($event);
|
||||
echo $renderer->complete_layout();
|
||||
|
||||
echo $OUTPUT->box_end();
|
||||
echo $OUTPUT->footer();
|
||||
|
||||
@@ -133,14 +133,16 @@ class event_form extends moodleform {
|
||||
$mform->setDefault('repeats', 1);
|
||||
$mform->disabledIf('repeats','repeat','notchecked');
|
||||
|
||||
} else if ($repeatedevents > 0) {
|
||||
} else if ($repeatedevents) {
|
||||
|
||||
$mform->addElement('hidden', 'repeatid');
|
||||
$mform->setType('repeatid', PARAM_INT);
|
||||
|
||||
$mform->addElement('header', 'repeatedevents', get_string('repeatedevents', 'calendar'));
|
||||
$mform->addElement('checkbox', 'repeateditall', null, get_string('repeateditall', 'calendar', $repeatedevents), 'repeat');
|
||||
$mform->setDefault('repeateditall', 'checked');
|
||||
$mform->addElement('radio', 'repeateditall', null, get_string('repeateditall', 'calendar', $this->_customdata->event->eventrepeats), 1);
|
||||
$mform->addElement('radio', 'repeateditall', null, get_string('repeateditthis', 'calendar'), 0);
|
||||
|
||||
$mform->setDefault('repeateditall', 1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ foreach($events as $event) {
|
||||
$ev = new iCalendar_event;
|
||||
$ev->add_property('uid', $event->id.'@'.$hostaddress);
|
||||
$ev->add_property('summary', $event->name);
|
||||
$ev->add_property('description', $event->description);
|
||||
$ev->add_property('description', clean_param($event->description, PARAM_NOTAGS));
|
||||
$ev->add_property('class', 'PUBLIC'); // PUBLIC / PRIVATE / CONFIDENTIAL
|
||||
$ev->add_property('last-modified', Bennu::timestamp_to_datetime($event->timemodified));
|
||||
$ev->add_property('dtstamp', Bennu::timestamp_to_datetime()); // now
|
||||
|
||||
+51
-23
@@ -209,7 +209,6 @@ function calendar_get_mini($courses, $groups, $users, $cal_month = false, $cal_y
|
||||
$days_title = calendar_get_days();
|
||||
|
||||
$summary = get_string('calendarheading', 'calendar', userdate(make_timestamp($y, $m), get_string('strftimemonthyear')));
|
||||
$summary = get_string('tabledata', 'access', $summary);
|
||||
$content .= '<table class="minicalendar calendartable" summary="'.$summary.'">'; // Begin table
|
||||
$content .= '<tr class="weekdays">'; // Header row: day names
|
||||
|
||||
@@ -1237,6 +1236,10 @@ function calendar_set_filters(array $courseeventsfrom, $ignorefilters = false) {
|
||||
$user = false;
|
||||
$group = false;
|
||||
|
||||
// capabilities that allow seeing group events from all groups
|
||||
// TODO: rewrite so that moodle/calendar:manageentries is not necessary here
|
||||
$allgroupscaps = array('moodle/site:accessallgroups', 'moodle/calendar:manageentries');
|
||||
|
||||
$isloggedin = isloggedin();
|
||||
|
||||
if ($ignorefilters || calendar_show_event_type(CALENDAR_EVENT_COURSE)) {
|
||||
@@ -1262,26 +1265,35 @@ function calendar_set_filters(array $courseeventsfrom, $ignorefilters = false) {
|
||||
|
||||
if (!empty($courseeventsfrom) && (calendar_show_event_type(CALENDAR_EVENT_GROUP) || $ignorefilters)) {
|
||||
|
||||
if (!empty($CFG->calendar_adminseesall) && has_capability('moodle/calendar:manageentries', get_system_context())) {
|
||||
$group = true;
|
||||
} else if ($isloggedin) {
|
||||
$groupids = array();
|
||||
|
||||
// We already have the courses to examine in $courses
|
||||
// For each course...
|
||||
foreach ($courseeventsfrom as $courseid => $course) {
|
||||
// If the user is an editing teacher in there,
|
||||
if (!empty($USER->groupmember[$course->id])) {
|
||||
// We've already cached the users groups for this course so we can just use that
|
||||
$groupids = array_merge($groupids, $USER->groupmember[$course->id]);
|
||||
} else if (($course->groupmode != NOGROUPS || !$course->groupmodeforce) && has_capability('moodle/calendar:manageentries', get_context_instance(CONTEXT_COURSE, $course->id))) {
|
||||
// If this course has groups, show events from all of them
|
||||
$coursegroups = groups_get_user_groups($course->id, $USER->id);
|
||||
$groupids = array_merge($groupids, $coursegroups['0']);
|
||||
}
|
||||
if (count($courseeventsfrom)==1) {
|
||||
$course = reset($courseeventsfrom);
|
||||
if (has_any_capability($allgroupscaps, get_context_instance(CONTEXT_COURSE, $course->id))) {
|
||||
$coursegroups = groups_get_all_groups($course->id, 0, 0, 'g.id');
|
||||
$group = array_keys($coursegroups);
|
||||
}
|
||||
if (!empty($groupids)) {
|
||||
$group = $groupids;
|
||||
}
|
||||
if ($group === false) {
|
||||
if (!empty($CFG->calendar_adminseesall) && has_any_capability($allgroupscaps, get_system_context())) {
|
||||
$group = true;
|
||||
} else if ($isloggedin) {
|
||||
$groupids = array();
|
||||
|
||||
// We already have the courses to examine in $courses
|
||||
// For each course...
|
||||
foreach ($courseeventsfrom as $courseid => $course) {
|
||||
// If the user is an editing teacher in there,
|
||||
if (!empty($USER->groupmember[$course->id])) {
|
||||
// We've already cached the users groups for this course so we can just use that
|
||||
$groupids = array_merge($groupids, $USER->groupmember[$course->id]);
|
||||
} else if ($course->groupmode != NOGROUPS || !$course->groupmodeforce) {
|
||||
// If this course has groups, show events from all of those related to the current user
|
||||
$coursegroups = groups_get_user_groups($course->id, $USER->id);
|
||||
$groupids = array_merge($groupids, $coursegroups['0']);
|
||||
}
|
||||
}
|
||||
if (!empty($groupids)) {
|
||||
$group = $groupids;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1351,10 +1363,11 @@ function calendar_get_default_courses() {
|
||||
$courses = array();
|
||||
if (!empty($CFG->calendar_adminseesall) && has_capability('moodle/calendar:manageentries', get_context_instance(CONTEXT_SYSTEM))) {
|
||||
list ($select, $join) = context_instance_preload_sql('c.id', CONTEXT_COURSE, 'ctx');
|
||||
$sql = "SELECT DISTINCT c.* $select
|
||||
$sql = "SELECT c.* $select
|
||||
FROM {course} c
|
||||
JOIN {event} e ON e.courseid = c.id
|
||||
$join";
|
||||
$join
|
||||
WHERE EXISTS (SELECT 1 FROM {event} e WHERE e.courseid = c.id)
|
||||
";
|
||||
$courses = $DB->get_records_sql($sql, null, 0, 20);
|
||||
foreach ($courses as $course) {
|
||||
context_instance_preload($course);
|
||||
@@ -1552,6 +1565,7 @@ function calendar_get_allowed_types(&$allowed, $course = null) {
|
||||
}
|
||||
if ($course->id != SITEID) {
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
$allowed->user = has_capability('moodle/calendar:manageownentries', $coursecontext);
|
||||
|
||||
if (has_capability('moodle/calendar:manageentries', $coursecontext)) {
|
||||
$allowed->courses = array($course->id => 1);
|
||||
@@ -2087,6 +2101,20 @@ class calendar_event {
|
||||
// Delete the event
|
||||
$DB->delete_records('event', array('id'=>$this->properties->id));
|
||||
|
||||
// If we are deleting parent of a repeated event series, promote the next event in the series as parent
|
||||
if (($this->properties->id == $this->properties->repeatid) && !$deleterepeated) {
|
||||
$newparent = $DB->get_field_sql("SELECT id from {event} where repeatid = ? order by id ASC", array($this->properties->id), IGNORE_MULTIPLE);
|
||||
if (!empty($newparent)) {
|
||||
$DB->execute("UPDATE {event} SET repeatid = ? WHERE repeatid = ?", array($newparent, $this->properties->id));
|
||||
// Get all records where the repeatid is the same as the event being removed
|
||||
$events = $DB->get_records('event', array('repeatid' => $newparent));
|
||||
// For each of the returned events trigger the event_update hook.
|
||||
foreach ($events as $event) {
|
||||
self::calendar_event_hook('update_event', array($event, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If the editor context hasn't already been set then set it now
|
||||
if ($this->editorcontext === null) {
|
||||
$this->editorcontext = $this->properties->context;
|
||||
|
||||
+17
-9
@@ -135,7 +135,9 @@ class core_calendar_renderer extends plugin_renderer_base {
|
||||
* @return string
|
||||
*/
|
||||
public function fake_block_filters($courseid, $day, $month, $year, $view, $courses) {
|
||||
return html_writer::tag('div', calendar_filter_controls($this->page->url), array('class'=>'calendar_filters filters'));
|
||||
$returnurl = $this->page->url;
|
||||
$returnurl->param('course', $courseid);
|
||||
return html_writer::tag('div', calendar_filter_controls($returnurl), array('class'=>'calendar_filters filters'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -413,6 +415,8 @@ class core_calendar_renderer extends plugin_renderer_base {
|
||||
|
||||
$table = new html_table();
|
||||
$table->attributes = array('class'=>'calendarmonth calendartable');
|
||||
$time = make_timestamp($calendar->year, $calendar->month);
|
||||
$table->summary = get_string('calendarheading', 'calendar', userdate($time, get_string('strftimemonthyear')));
|
||||
$table->data = array();
|
||||
|
||||
$header = new html_table_row();
|
||||
@@ -579,22 +583,24 @@ class core_calendar_renderer extends plugin_renderer_base {
|
||||
|
||||
// Global events
|
||||
$link = new moodle_url(CALENDAR_URL.'set.php', array('var' => 'showglobal', 'return' => base64_encode($returnurl->out(false)), 'sesskey'=>sesskey()));
|
||||
$strglobalevents = get_string('globalevents', 'calendar');
|
||||
if (calendar_show_event_type(CALENDAR_EVENT_GLOBAL)) {
|
||||
$output .= html_writer::tag('td', '', array('class'=>'calendar_event_global', 'style'=>'width:8px;'));
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', get_string('globalevents', 'calendar')).' '.get_string('shown', 'calendar').' ('.html_writer::link($link, get_string('clickhide', 'calendar')).')');
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', $strglobalevents).' '.get_string('shown', 'calendar').' ('.html_writer::link($link, get_string('clickhide', 'calendar').'<span class="accesshide">'.$strglobalevents.'</span>').')');
|
||||
} else {
|
||||
$output .= html_writer::tag('td', '', array('style'=>'width:8px;'));
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', get_string('globalevents', 'calendar')).' '.get_string('hidden', 'calendar').' ('.html_writer::link($link, get_string('clickshow', 'calendar')).')');
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', $strglobalevents).' '.get_string('hidden', 'calendar').' ('.html_writer::link($link, get_string('clickshow', 'calendar').'<span class="accesshide">'.$strglobalevents.'</span>').')');
|
||||
}
|
||||
|
||||
// Course events
|
||||
$link = new moodle_url(CALENDAR_URL.'set.php', array('var'=>'showcourses', 'return' => base64_encode($returnurl->out(false)), 'sesskey'=>sesskey()));
|
||||
$strcourseevents = get_string('courseevents', 'calendar');
|
||||
if (calendar_show_event_type(CALENDAR_EVENT_COURSE)) {
|
||||
$output .= html_writer::tag('td', '', array('class'=>'calendar_event_course', 'style'=>'width:8px;'));
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', get_string('courseevents', 'calendar')).' '.get_string('shown', 'calendar').' ('.html_writer::link($link, get_string('clickhide', 'calendar')).')');
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', $strcourseevents).' '.get_string('shown', 'calendar').' ('.html_writer::link($link, get_string('clickhide', 'calendar').'<span class="accesshide">'.$strcourseevents.'</span>').')');
|
||||
} else {
|
||||
$output .= html_writer::tag('td', '', array('style'=>'width:8px;'));
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', get_string('courseevents', 'calendar')).' '.get_string('hidden', 'calendar').' ('.html_writer::link($link, get_string('clickshow', 'calendar')).')');
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', $strcourseevents).' '.get_string('hidden', 'calendar').' ('.html_writer::link($link, get_string('clickshow', 'calendar').'<span class="accesshide">'.$strcourseevents.'</span>').')');
|
||||
}
|
||||
$output .= html_writer::end_tag('tr');
|
||||
|
||||
@@ -602,21 +608,23 @@ class core_calendar_renderer extends plugin_renderer_base {
|
||||
$output .= html_writer::start_tag('tr');
|
||||
// Group events
|
||||
$link = new moodle_url(CALENDAR_URL.'set.php', array('var'=>'showgroups', 'return' => base64_encode($returnurl->out(false)), 'sesskey'=>sesskey()));
|
||||
$strgroupevents = get_string('groupevents', 'calendar');
|
||||
if (calendar_show_event_type(CALENDAR_EVENT_GROUP)) {
|
||||
$output .= html_writer::tag('td', '', array('class'=>'calendar_event_group', 'style'=>'width:8px;'));
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', get_string('groupevents', 'calendar')).' '.get_string('shown', 'calendar').' ('.html_writer::link($link, get_string('clickhide', 'calendar')).')');
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', $strgroupevents).' '.get_string('shown', 'calendar').' ('.html_writer::link($link, get_string('clickhide', 'calendar').'<span class="accesshide">'.$strgroupevents.'</span>').')');
|
||||
} else {
|
||||
$output .= html_writer::tag('td', '', array('style'=>'width:8px;'));
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', get_string('groupevents', 'calendar')).' '.get_string('hidden', 'calendar').' ('.html_writer::link($link, get_string('clickshow', 'calendar')).')');
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', $strgroupevents).' '.get_string('hidden', 'calendar').' ('.html_writer::link($link, get_string('clickshow', 'calendar').'<span class="accesshide">'.$strgroupevents.'</span>').')');
|
||||
}
|
||||
// User events
|
||||
$link = new moodle_url(CALENDAR_URL.'set.php', array('var'=>'showuser', 'return' => base64_encode($returnurl->out(false)), 'sesskey'=>sesskey()));
|
||||
$struserevents = get_string('userevents', 'calendar');
|
||||
if (calendar_show_event_type(CALENDAR_EVENT_USER)) {
|
||||
$output .= html_writer::tag('td', '', array('class'=>'calendar_event_user', 'style'=>'width:8px;'));
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', get_string('userevents', 'calendar')).' '.get_string('shown', 'calendar').' ('.html_writer::link($link, get_string('clickhide', 'calendar')).')');
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', $struserevents).' '.get_string('shown', 'calendar').' ('.html_writer::link($link, get_string('clickhide', 'calendar').'<span class="accesshide">'.$struserevents.'</span>').')');
|
||||
} else {
|
||||
$output .= html_writer::tag('td', '', array('style'=>'width:8px;'));
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', get_string('userevents', 'calendar')).' '.get_string('hidden', 'calendar').' ('.html_writer::link($link, get_string('clickshow', 'calendar')).')');
|
||||
$output .= html_writer::tag('td', html_writer::tag('strong', $struserevents).' '.get_string('hidden', 'calendar').' ('.html_writer::link($link, get_string('clickshow', 'calendar').'<span class="accesshide">'.$struserevents.'</span>').')');
|
||||
}
|
||||
$output .= html_writer::end_tag('tr');
|
||||
}
|
||||
|
||||
+7
-2
@@ -45,8 +45,13 @@ require_sesskey();
|
||||
|
||||
$var = required_param('var', PARAM_ALPHA);
|
||||
$return = clean_param(base64_decode(required_param('return', PARAM_RAW)), PARAM_URL);
|
||||
|
||||
$url = new moodle_url('/calendar/set.php', array('return'=>base64_encode($return),'var'=>$var, 'sesskey'=>sesskey()));
|
||||
$courseid = optional_param('id', -1, PARAM_INT);
|
||||
if ($courseid != -1) {
|
||||
$return = new moodle_url($return, array('course' => $courseid));
|
||||
} else {
|
||||
$return = new moodle_url($return);
|
||||
}
|
||||
$url = new moodle_url('/calendar/set.php', array('return'=>base64_encode($return->out(false)), 'course' => $courseid, 'var'=>$var, 'sesskey'=>sesskey()));
|
||||
$PAGE->set_url($url);
|
||||
$PAGE->set_context(get_context_instance(CONTEXT_SYSTEM));
|
||||
|
||||
|
||||
+1
-1
@@ -127,7 +127,7 @@ switch($view) {
|
||||
echo $renderer->show_day($calendar);
|
||||
break;
|
||||
case 'month':
|
||||
echo $renderer->show_month_detailed($calendar);
|
||||
echo $renderer->show_month_detailed($calendar, $url);
|
||||
break;
|
||||
case 'upcoming':
|
||||
$defaultlookahead = CALENDAR_DEFAULT_UPCOMING_LOOKAHEAD;
|
||||
|
||||
@@ -49,7 +49,7 @@ class cohort_edit_form extends moodleform {
|
||||
$mform->addElement('select', 'contextid', get_string('context', 'role'), $options);
|
||||
|
||||
$mform->addElement('text', 'idnumber', get_string('idnumber', 'cohort'), 'maxlength="254" size="50"');
|
||||
$mform->setType('name', PARAM_RAW);
|
||||
$mform->setType('idnumber', PARAM_RAW); // idnumbers are plain text, must not be changed
|
||||
|
||||
$mform->addElement('editor', 'description_editor', get_string('description', 'cohort'), null, $editoroptions);
|
||||
$mform->setType('description_editor', PARAM_RAW);
|
||||
|
||||
+1
-1
@@ -76,7 +76,7 @@ $data = array();
|
||||
foreach($cohorts as $cohort) {
|
||||
$line = array();
|
||||
$line[] = format_string($cohort->name);
|
||||
$line[] = $cohort->idnumber;
|
||||
$line[] = s($cohort->idnumber); // plain text
|
||||
$line[] = format_text($cohort->description, $cohort->descriptionformat);
|
||||
|
||||
$line[] = $DB->count_records('cohort_members', array('cohortid'=>$cohort->id));
|
||||
|
||||
@@ -385,6 +385,9 @@ bodyContent: '<div class="comment-delete-confirm"><a href="#" id="confirmdelete-
|
||||
},
|
||||
toggle_textarea: function(focus) {
|
||||
var t = Y.one('#dlg-content-'+this.client_id);
|
||||
if (!t) {
|
||||
return false;
|
||||
}
|
||||
if (focus) {
|
||||
if (t.get('value') == M.str.moodle.addcomment) {
|
||||
t.set('value', '');
|
||||
|
||||
+1
-1
@@ -569,7 +569,7 @@ class comment {
|
||||
$c->format = $u->cformat;
|
||||
$c->timecreated = $u->ctimecreated;
|
||||
$url = new moodle_url('/user/view.php', array('id'=>$u->id, 'course'=>$this->courseid));
|
||||
$c->profileurl = $url->out();
|
||||
$c->profileurl = $url->out(false);
|
||||
$c->fullname = fullname($u);
|
||||
$c->time = userdate($c->timecreated, get_string('strftimerecent', 'langconfig'));
|
||||
$c->content = format_text($c->content, $c->format, $formatoptions);
|
||||
|
||||
+1
-1
@@ -377,7 +377,7 @@ $CFG->admin = 'admin';
|
||||
// memory limit to something higher.
|
||||
// The value for the settings should be a valid PHP memory value. e.g. 512M, 1G
|
||||
//
|
||||
// $CFG->extramemorylimit = 1G;
|
||||
// $CFG->extramemorylimit = '1G';
|
||||
//
|
||||
//=========================================================================
|
||||
// 8. SETTINGS FOR DEVELOPMENT SERVERS - not intended for production use!!!
|
||||
|
||||
+406
-397
@@ -1,444 +1,453 @@
|
||||
<?php
|
||||
// Displays the top level category or all courses
|
||||
// In editing mode, allows the admin to edit a category,
|
||||
// and rearrange courses
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
require_once("../config.php");
|
||||
require_once("lib.php");
|
||||
/**
|
||||
* Displays the top level category or all courses
|
||||
* In editing mode, allows the admin to edit a category,
|
||||
* and rearrange courses
|
||||
*
|
||||
* @package core
|
||||
* @subpackage course
|
||||
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
$id = required_param('id', PARAM_INT); // Category id
|
||||
$page = optional_param('page', 0, PARAM_INT); // which page to show
|
||||
$perpage = optional_param('perpage', $CFG->coursesperpage, PARAM_INT); // how many per page
|
||||
$categoryedit = optional_param('categoryedit', -1, PARAM_BOOL);
|
||||
$hide = optional_param('hide', 0, PARAM_INT);
|
||||
$show = optional_param('show', 0, PARAM_INT);
|
||||
$moveup = optional_param('moveup', 0, PARAM_INT);
|
||||
$movedown = optional_param('movedown', 0, PARAM_INT);
|
||||
$moveto = optional_param('moveto', 0, PARAM_INT);
|
||||
$resort = optional_param('resort', 0, PARAM_BOOL);
|
||||
require_once("../config.php");
|
||||
require_once($CFG->dirroot.'/course/lib.php');
|
||||
|
||||
$site = get_site();
|
||||
$id = required_param('id', PARAM_INT); // Category id
|
||||
$page = optional_param('page', 0, PARAM_INT); // which page to show
|
||||
$perpage = optional_param('perpage', $CFG->coursesperpage, PARAM_INT); // how many per page
|
||||
$categoryedit = optional_param('categoryedit', -1, PARAM_BOOL);
|
||||
$hide = optional_param('hide', 0, PARAM_INT);
|
||||
$show = optional_param('show', 0, PARAM_INT);
|
||||
$moveup = optional_param('moveup', 0, PARAM_INT);
|
||||
$movedown = optional_param('movedown', 0, PARAM_INT);
|
||||
$moveto = optional_param('moveto', 0, PARAM_INT);
|
||||
$resort = optional_param('resort', 0, PARAM_BOOL);
|
||||
$sesskey = optional_param('sesskey', '', PARAM_RAW);
|
||||
|
||||
if (empty($id)) {
|
||||
print_error("unknowcategory");
|
||||
if (empty($id)) {
|
||||
print_error("unknowcategory");
|
||||
}
|
||||
|
||||
$PAGE->set_category_by_id($id);
|
||||
$PAGE->set_url(new moodle_url('/course/category.php', array('id' => $id)));
|
||||
// This is sure to be the category context
|
||||
$context = $PAGE->context;
|
||||
// And the object has been loaded for us no need for another DB call
|
||||
$category = $PAGE->category;
|
||||
|
||||
$canedit = can_edit_in_category($category->id);
|
||||
if ($canedit) {
|
||||
if ($categoryedit !== -1) {
|
||||
$USER->editing = $categoryedit;
|
||||
}
|
||||
|
||||
$PAGE->set_category_by_id($id);
|
||||
$urlparams = array('id' => $id);
|
||||
if ($page) {
|
||||
$urlparams['page'] = $page;
|
||||
}
|
||||
if ($perpage) {
|
||||
$urlparams['perpage'] = $perpage;
|
||||
}
|
||||
$PAGE->set_url(new moodle_url('/course/category.php', array('id' => $id)));
|
||||
navigation_node::override_active_url($PAGE->url);
|
||||
$context = $PAGE->context;
|
||||
$category = $PAGE->category;
|
||||
|
||||
$canedit = can_edit_in_category($category->id);
|
||||
if ($canedit) {
|
||||
if ($categoryedit !== -1) {
|
||||
$USER->editing = $categoryedit;
|
||||
}
|
||||
require_login();
|
||||
$editingon = $PAGE->user_is_editing();
|
||||
} else {
|
||||
if ($CFG->forcelogin) {
|
||||
require_login();
|
||||
$editingon = $PAGE->user_is_editing();
|
||||
} else {
|
||||
if ($CFG->forcelogin) {
|
||||
require_login();
|
||||
}
|
||||
$editingon = false;
|
||||
}
|
||||
|
||||
if (!$category->visible) {
|
||||
require_capability('moodle/category:viewhiddencategories', $context);
|
||||
}
|
||||
|
||||
$canmanage = has_capability('moodle/category:manage', $context);
|
||||
$sesskeyprovided = !empty($sesskey) && confirm_sesskey($sesskey);
|
||||
|
||||
// Process any category actions.
|
||||
if ($canmanage && $resort && $sesskeyprovided) {
|
||||
// Resort the category if requested
|
||||
if ($courses = get_courses($category->id, "fullname ASC", 'c.id,c.fullname,c.sortorder')) {
|
||||
$i = 1;
|
||||
foreach ($courses as $course) {
|
||||
$DB->set_field('course', 'sortorder', $category->sortorder+$i, array('id'=>$course->id));
|
||||
$i++;
|
||||
}
|
||||
$editingon = false;
|
||||
fix_course_sortorder(); // should not be needed
|
||||
}
|
||||
}
|
||||
|
||||
if (!$category->visible) {
|
||||
require_capability('moodle/category:viewhiddencategories', $context);
|
||||
}
|
||||
// Process any course actions.
|
||||
if ($editingon && $sesskeyprovided) {
|
||||
|
||||
// Process any category actions.
|
||||
if (has_capability('moodle/category:manage', $context)) {
|
||||
/// Resort the category if requested
|
||||
if ($resort and confirm_sesskey()) {
|
||||
if ($courses = get_courses($category->id, "fullname ASC", 'c.id,c.fullname,c.sortorder')) {
|
||||
$i = 1;
|
||||
foreach ($courses as $course) {
|
||||
$DB->set_field('course', 'sortorder', $category->sortorder+$i, array('id'=>$course->id));
|
||||
$i++;
|
||||
}
|
||||
fix_course_sortorder(); // should not be needed
|
||||
}
|
||||
// Move a specified course to a new category
|
||||
if (!empty($moveto) and $data = data_submitted()) {
|
||||
// Some courses are being moved
|
||||
// user must have category update in both cats to perform this
|
||||
require_capability('moodle/category:manage', $context);
|
||||
require_capability('moodle/category:manage', get_context_instance(CONTEXT_COURSECAT, $moveto));
|
||||
|
||||
if (!$destcategory = $DB->get_record('course_categories', array('id' => $data->moveto))) {
|
||||
print_error('cannotfindcategory', '', '', $data->moveto);
|
||||
}
|
||||
}
|
||||
|
||||
// Process any course actions.
|
||||
if ($editingon) {
|
||||
/// Move a specified course to a new category
|
||||
if (!empty($moveto) and $data = data_submitted() and confirm_sesskey()) { // Some courses are being moved
|
||||
// user must have category update in both cats to perform this
|
||||
require_capability('moodle/category:manage', $context);
|
||||
require_capability('moodle/category:manage', get_context_instance(CONTEXT_COURSECAT, $moveto));
|
||||
$courses = array();
|
||||
foreach ($data as $key => $value) {
|
||||
if (preg_match('/^c\d+$/', $key)) {
|
||||
$courseid = substr($key, 1);
|
||||
array_push($courses, $courseid);
|
||||
|
||||
if (!$destcategory = $DB->get_record('course_categories', array('id' => $data->moveto))) {
|
||||
print_error('cannotfindcategory', '', '', $data->moveto);
|
||||
}
|
||||
|
||||
$courses = array();
|
||||
foreach ($data as $key => $value) {
|
||||
if (preg_match('/^c\d+$/', $key)) {
|
||||
$courseid = substr($key, 1);
|
||||
array_push($courses, $courseid);
|
||||
|
||||
// check this course's category
|
||||
if ($movingcourse = $DB->get_record('course', array('id'=>$courseid))) {
|
||||
if ($movingcourse->category != $id ) {
|
||||
print_error('coursedoesnotbelongtocategory');
|
||||
}
|
||||
} else {
|
||||
print_error('cannotfindcourse');
|
||||
// check this course's category
|
||||
if ($movingcourse = $DB->get_record('course', array('id'=>$courseid))) {
|
||||
if ($movingcourse->category != $id ) {
|
||||
print_error('coursedoesnotbelongtocategory');
|
||||
}
|
||||
} else {
|
||||
print_error('cannotfindcourse');
|
||||
}
|
||||
}
|
||||
move_courses($courses, $data->moveto);
|
||||
}
|
||||
|
||||
/// Hide or show a course
|
||||
if ((!empty($hide) or !empty($show)) and confirm_sesskey()) {
|
||||
if (!empty($hide)) {
|
||||
$course = $DB->get_record('course', array('id' => $hide));
|
||||
$visible = 0;
|
||||
} else {
|
||||
$course = $DB->get_record('course', array('id' => $show));
|
||||
$visible = 1;
|
||||
}
|
||||
|
||||
if ($course) {
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
require_capability('moodle/course:visibility', $coursecontext);
|
||||
$DB->set_field('course', 'visible', $visible, array('id' => $course->id));
|
||||
$DB->set_field('course', 'visibleold', $visible, array('id' => $course->id)); // we set the old flag when user manually changes visibility of course
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Move a course up or down
|
||||
if ((!empty($moveup) or !empty($movedown)) and confirm_sesskey()) {
|
||||
require_capability('moodle/category:manage', $context);
|
||||
|
||||
// Ensure the course order has continuous ordering
|
||||
fix_course_sortorder();
|
||||
$swapcourse = NULL;
|
||||
|
||||
if (!empty($moveup)) {
|
||||
if ($movecourse = $DB->get_record('course', array('id' => $moveup))) {
|
||||
$swapcourse = $DB->get_record('course', array('sortorder' => $movecourse->sortorder - 1));
|
||||
}
|
||||
} else {
|
||||
if ($movecourse = $DB->get_record('course', array('id' => $movedown))) {
|
||||
$swapcourse = $DB->get_record('course', array('sortorder' => $movecourse->sortorder + 1));
|
||||
}
|
||||
}
|
||||
if ($swapcourse and $movecourse) {
|
||||
// check course's category
|
||||
if ($movecourse->category != $id) {
|
||||
print_error('coursedoesnotbelongtocategory');
|
||||
}
|
||||
$DB->set_field('course', 'sortorder', $swapcourse->sortorder, array('id' => $movecourse->id));
|
||||
$DB->set_field('course', 'sortorder', $movecourse->sortorder, array('id' => $swapcourse->id));
|
||||
}
|
||||
}
|
||||
|
||||
} // End of editing stuff
|
||||
|
||||
// Print headings
|
||||
$numcategories = $DB->count_records('course_categories');
|
||||
|
||||
$stradministration = get_string('administration');
|
||||
$strcategories = get_string('categories');
|
||||
$strcategory = get_string('category');
|
||||
$strcourses = get_string('courses');
|
||||
|
||||
if ($editingon && can_edit_in_category()) {
|
||||
// Integrate into the admin tree only if the user can edit categories at the top level,
|
||||
// otherwise the admin block does not appear to this user, and you get an error.
|
||||
require_once($CFG->libdir . '/adminlib.php');
|
||||
admin_externalpage_setup('coursemgmt', '', $urlparams, $CFG->wwwroot . '/course/category.php');
|
||||
$PAGE->set_context($context); // Ensure that we are actually showing blocks etc for the cat context
|
||||
|
||||
$settingsnode = $PAGE->settingsnav->find_active_node();
|
||||
if ($settingsnode) {
|
||||
$settingsnode->make_inactive();
|
||||
$settingsnode->force_open();
|
||||
$PAGE->navbar->add($settingsnode->text, $settingsnode->action);
|
||||
}
|
||||
echo $OUTPUT->header();
|
||||
} else {
|
||||
$PAGE->set_title("$site->shortname: $category->name");
|
||||
$PAGE->set_heading($site->fullname);
|
||||
$PAGE->set_button(print_course_search('', true, 'navbar'));
|
||||
$PAGE->set_pagelayout('coursecategory');
|
||||
echo $OUTPUT->header();
|
||||
move_courses($courses, $data->moveto);
|
||||
}
|
||||
|
||||
// Hide or show a course
|
||||
if (!empty($hide) or !empty($show)) {
|
||||
if (!empty($hide)) {
|
||||
$course = $DB->get_record('course', array('id' => $hide));
|
||||
$visible = 0;
|
||||
} else {
|
||||
$course = $DB->get_record('course', array('id' => $show));
|
||||
$visible = 1;
|
||||
}
|
||||
|
||||
if ($course) {
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
require_capability('moodle/course:visibility', $coursecontext);
|
||||
// Set the visibility of the course. we set the old flag when user manually changes visibility of course.
|
||||
$DB->update_record('course', array('id' => $course->id, 'visible' => $visible, 'visibleold' => $visible, 'timemodified' => time()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Move a course up or down
|
||||
if (!empty($moveup) or !empty($movedown)) {
|
||||
require_capability('moodle/category:manage', $context);
|
||||
|
||||
// Ensure the course order has continuous ordering
|
||||
fix_course_sortorder();
|
||||
$swapcourse = NULL;
|
||||
|
||||
if (!empty($moveup)) {
|
||||
if ($movecourse = $DB->get_record('course', array('id' => $moveup))) {
|
||||
$swapcourse = $DB->get_record('course', array('sortorder' => $movecourse->sortorder - 1));
|
||||
}
|
||||
} else {
|
||||
if ($movecourse = $DB->get_record('course', array('id' => $movedown))) {
|
||||
$swapcourse = $DB->get_record('course', array('sortorder' => $movecourse->sortorder + 1));
|
||||
}
|
||||
}
|
||||
if ($swapcourse and $movecourse) {
|
||||
// check course's category
|
||||
if ($movecourse->category != $id) {
|
||||
print_error('coursedoesnotbelongtocategory');
|
||||
}
|
||||
$DB->set_field('course', 'sortorder', $swapcourse->sortorder, array('id' => $movecourse->id));
|
||||
$DB->set_field('course', 'sortorder', $movecourse->sortorder, array('id' => $swapcourse->id));
|
||||
}
|
||||
}
|
||||
|
||||
} // End of editing stuff
|
||||
|
||||
// Prepare the standard URL params for this page. We'll need them later.
|
||||
$urlparams = array('id' => $id);
|
||||
if ($page) {
|
||||
$urlparams['page'] = $page;
|
||||
}
|
||||
if ($perpage) {
|
||||
$urlparams['perpage'] = $perpage;
|
||||
}
|
||||
|
||||
// Begin output
|
||||
if ($editingon && can_edit_in_category()) {
|
||||
// Integrate into the admin tree only if the user can edit categories at the top level,
|
||||
// otherwise the admin block does not appear to this user, and you get an error.
|
||||
require_once($CFG->libdir . '/adminlib.php');
|
||||
admin_externalpage_setup('coursemgmt', '', $urlparams, $CFG->wwwroot . '/course/category.php');
|
||||
$PAGE->set_context($context); // Ensure that we are actually showing blocks etc for the cat context
|
||||
|
||||
$settingsnode = $PAGE->settingsnav->find_active_node();
|
||||
if ($settingsnode) {
|
||||
$settingsnode->make_inactive();
|
||||
$settingsnode->force_open();
|
||||
$PAGE->navbar->add($settingsnode->text, $settingsnode->action);
|
||||
}
|
||||
echo $OUTPUT->header();
|
||||
} else {
|
||||
$site = get_site();
|
||||
$PAGE->set_title("$site->shortname: $category->name");
|
||||
$PAGE->set_heading($site->fullname);
|
||||
$PAGE->set_button(print_course_search('', true, 'navbar'));
|
||||
$PAGE->set_pagelayout('coursecategory');
|
||||
echo $OUTPUT->header();
|
||||
}
|
||||
|
||||
/// Print the category selector
|
||||
$displaylist = array();
|
||||
$notused = array();
|
||||
make_categories_list($displaylist, $notused);
|
||||
$displaylist = array();
|
||||
$notused = array();
|
||||
make_categories_list($displaylist, $notused);
|
||||
|
||||
echo '<div class="categorypicker">';
|
||||
$select = new single_select(new moodle_url('category.php'), 'id', $displaylist, $category->id, null, 'switchcategory');
|
||||
$select->set_label($strcategories.':');
|
||||
echo $OUTPUT->render($select);
|
||||
echo '</div>';
|
||||
echo '<div class="categorypicker">';
|
||||
$select = new single_select(new moodle_url('/course/category.php'), 'id', $displaylist, $category->id, null, 'switchcategory');
|
||||
$select->set_label(get_string('categories').':');
|
||||
echo $OUTPUT->render($select);
|
||||
echo '</div>';
|
||||
|
||||
/// Print current category description
|
||||
if (!$editingon && $category->description) {
|
||||
echo $OUTPUT->box_start();
|
||||
$options = new stdClass;
|
||||
$options->noclean = true;
|
||||
$options->para = false;
|
||||
$options->overflowdiv = true;
|
||||
if (!isset($category->descriptionformat)) {
|
||||
$category->descriptionformat = FORMAT_MOODLE;
|
||||
}
|
||||
$text = file_rewrite_pluginfile_urls($category->description, 'pluginfile.php', $context->id, 'coursecat', 'description', null);
|
||||
echo format_text($text, $category->descriptionformat, $options);
|
||||
echo $OUTPUT->box_end();
|
||||
if (!$editingon && $category->description) {
|
||||
echo $OUTPUT->box_start();
|
||||
$options = new stdClass;
|
||||
$options->noclean = true;
|
||||
$options->para = false;
|
||||
$options->overflowdiv = true;
|
||||
if (!isset($category->descriptionformat)) {
|
||||
$category->descriptionformat = FORMAT_MOODLE;
|
||||
}
|
||||
$text = file_rewrite_pluginfile_urls($category->description, 'pluginfile.php', $context->id, 'coursecat', 'description', null);
|
||||
echo format_text($text, $category->descriptionformat, $options);
|
||||
echo $OUTPUT->box_end();
|
||||
}
|
||||
|
||||
if ($editingon && $canmanage) {
|
||||
echo $OUTPUT->container_start('buttons');
|
||||
|
||||
// Print button to update this category
|
||||
$url = new moodle_url('/course/editcategory.php', array('id' => $category->id));
|
||||
echo $OUTPUT->single_button($url, get_string('editcategorythis'), 'get');
|
||||
|
||||
// Print button for creating new categories
|
||||
$url = new moodle_url('/course/editcategory.php', array('parent' => $category->id));
|
||||
echo $OUTPUT->single_button($url, get_string('addsubcategory'), 'get');
|
||||
|
||||
echo $OUTPUT->container_end();
|
||||
}
|
||||
|
||||
// Print out all the sub-categories
|
||||
// In order to view hidden subcategories the user must have the viewhiddencategories
|
||||
// capability in the current category.
|
||||
if (has_capability('moodle/category:viewhiddencategories', $context)) {
|
||||
$categorywhere = '';
|
||||
} else {
|
||||
$categorywhere = 'AND cc.visible = 1';
|
||||
}
|
||||
// We're going to preload the context for the subcategory as we know that we
|
||||
// need it later on for formatting.
|
||||
list($ctxselect, $ctxjoin) = context_instance_preload_sql('cc.id', CONTEXT_COURSECAT, 'ctx');
|
||||
$sql = "SELECT cc.* $ctxselect
|
||||
FROM {course_categories} cc
|
||||
$ctxjoin
|
||||
WHERE cc.parent = :parentid
|
||||
$categorywhere
|
||||
ORDER BY cc.sortorder ASC";
|
||||
$subcategories = $DB->get_recordset_sql($sql, array('parentid' => $category->id));
|
||||
// Prepare a table to display the sub categories.
|
||||
$table = new html_table;
|
||||
$table->attributes = array('border' => '0', 'cellspacing' => '2', 'cellpadding' => '4', 'class' => 'generalbox boxaligncenter category_subcategories');
|
||||
$table->head = array(get_string('subcategories'));
|
||||
$table->data = array();
|
||||
$baseurl = new moodle_url('/course/category.php');
|
||||
foreach ($subcategories as $subcategory) {
|
||||
// Preload the context we will need it to format the category name shortly.
|
||||
context_instance_preload($subcategory);
|
||||
$context = get_context_instance(CONTEXT_COURSECAT, $subcategory->id);
|
||||
// Prepare the things we need to create a link to the subcategory
|
||||
$attributes = $subcategory->visible ? array() : array('class' => 'dimmed');
|
||||
$text = format_string($subcategory->name, true, array('context' => $context));
|
||||
// Add the subcategory to the table
|
||||
$baseurl->param('id', $subcategory->id);
|
||||
$table->data[] = array(html_writer::link($baseurl, $text, $attributes));
|
||||
}
|
||||
|
||||
$subcategorieswereshown = (count($table->data) > 0);
|
||||
if ($subcategorieswereshown) {
|
||||
echo html_writer::table($table);
|
||||
}
|
||||
|
||||
// Print out all the courses
|
||||
$courses = get_courses_page($category->id, 'c.sortorder ASC',
|
||||
'c.id,c.sortorder,c.shortname,c.fullname,c.summary,c.visible',
|
||||
$totalcount, $page*$perpage, $perpage);
|
||||
$numcourses = count($courses);
|
||||
|
||||
if (!$courses) {
|
||||
if (empty($subcategorieswereshown)) {
|
||||
echo $OUTPUT->heading(get_string("nocoursesyet"));
|
||||
}
|
||||
|
||||
if ($editingon && has_capability('moodle/category:manage', $context)) {
|
||||
echo $OUTPUT->container_start('buttons');
|
||||
} else if ($numcourses <= COURSE_MAX_SUMMARIES_PER_PAGE and !$page and !$editingon) {
|
||||
echo $OUTPUT->box_start('courseboxes');
|
||||
print_courses($category);
|
||||
echo $OUTPUT->box_end();
|
||||
|
||||
// Print button to update this category
|
||||
$options = array('id' => $category->id);
|
||||
echo $OUTPUT->single_button(new moodle_url('/course/editcategory.php', $options), get_string('editcategorythis'), 'get');
|
||||
|
||||
// Print button for creating new categories
|
||||
$options = array('parent' => $category->id);
|
||||
echo $OUTPUT->single_button(new moodle_url('/course/editcategory.php', $options), get_string('addsubcategory'), 'get');
|
||||
|
||||
echo $OUTPUT->container_end();
|
||||
}
|
||||
|
||||
/// Print out all the sub-categories
|
||||
if ($subcategories = $DB->get_records('course_categories', array('parent' => $category->id), 'sortorder ASC')) {
|
||||
$firstentry = true;
|
||||
foreach ($subcategories as $subcategory) {
|
||||
if ($subcategory->visible || has_capability('moodle/category:viewhiddencategories', $context)) {
|
||||
$subcategorieswereshown = true;
|
||||
if ($firstentry) {
|
||||
echo '<table border="0" cellspacing="2" cellpadding="4" class="generalbox boxaligncenter">';
|
||||
echo '<tr><th scope="col">'.get_string('subcategories').'</th></tr>';
|
||||
echo '<tr><td style="white-space: nowrap">';
|
||||
$firstentry = false;
|
||||
}
|
||||
$catlinkcss = $subcategory->visible ? '' : ' class="dimmed" ';
|
||||
echo '<a '.$catlinkcss.' href="category.php?id='.$subcategory->id.'">'.
|
||||
format_string($subcategory->name, true, array('context' => get_context_instance(CONTEXT_COURSECAT, $subcategory->id))).'</a><br />';
|
||||
}
|
||||
}
|
||||
if (!$firstentry) {
|
||||
echo '</td></tr></table>';
|
||||
echo '<br />';
|
||||
}
|
||||
}
|
||||
|
||||
/// Print out all the courses
|
||||
$courses = get_courses_page($category->id, 'c.sortorder ASC',
|
||||
'c.id,c.sortorder,c.shortname,c.fullname,c.summary,c.visible',
|
||||
$totalcount, $page*$perpage, $perpage);
|
||||
$numcourses = count($courses);
|
||||
|
||||
if (!$courses) {
|
||||
if (empty($subcategorieswereshown)) {
|
||||
echo $OUTPUT->heading(get_string("nocoursesyet"));
|
||||
}
|
||||
|
||||
} else if ($numcourses <= COURSE_MAX_SUMMARIES_PER_PAGE and !$page and !$editingon) {
|
||||
echo $OUTPUT->box_start('courseboxes');
|
||||
print_courses($category);
|
||||
echo $OUTPUT->box_end();
|
||||
} else {
|
||||
echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "/course/category.php?id=$category->id&perpage=$perpage");
|
||||
|
||||
echo '<form id="movecourses" action="category.php" method="post"><div>';
|
||||
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
|
||||
echo '<table border="0" cellspacing="2" cellpadding="4" class="generalbox boxaligncenter"><tr>';
|
||||
echo '<th class="header" scope="col">'.get_string('courses').'</th>';
|
||||
if ($editingon) {
|
||||
echo '<th class="header" scope="col">'.get_string('edit').'</th>';
|
||||
echo '<th class="header" scope="col">'.get_string('select').'</th>';
|
||||
} else {
|
||||
echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "/course/category.php?id=$category->id&perpage=$perpage");
|
||||
echo '<th class="header" scope="col"> </th>';
|
||||
}
|
||||
echo '</tr>';
|
||||
|
||||
$strcourses = get_string('courses');
|
||||
$strselect = get_string('select');
|
||||
$stredit = get_string('edit');
|
||||
$strdelete = get_string('delete');
|
||||
$strbackup = get_string('backup');
|
||||
$strrestore = get_string('restore');
|
||||
$strmoveup = get_string('moveup');
|
||||
$strmovedown = get_string('movedown');
|
||||
$strupdate = get_string('update');
|
||||
$strhide = get_string('hide');
|
||||
$strshow = get_string('show');
|
||||
$strsummary = get_string('summary');
|
||||
$strsettings = get_string('settings');
|
||||
$count = 0;
|
||||
$abletomovecourses = false; // for now
|
||||
|
||||
|
||||
echo '<form id="movecourses" action="category.php" method="post"><div>';
|
||||
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
|
||||
echo '<table border="0" cellspacing="2" cellpadding="4" class="generalbox boxaligncenter"><tr>';
|
||||
echo '<th class="header" scope="col">'.$strcourses.'</th>';
|
||||
if ($editingon) {
|
||||
echo '<th class="header" scope="col">'.$stredit.'</th>';
|
||||
echo '<th class="header" scope="col">'.$strselect.'</th>';
|
||||
// Checking if we are at the first or at the last page, to allow courses to
|
||||
// be moved up and down beyond the paging border
|
||||
if ($totalcount > $perpage) {
|
||||
$atfirstpage = ($page == 0);
|
||||
if ($perpage > 0) {
|
||||
$atlastpage = (($page + 1) == ceil($totalcount / $perpage));
|
||||
} else {
|
||||
echo '<th class="header" scope="col"> </th>';
|
||||
}
|
||||
echo '</tr>';
|
||||
|
||||
|
||||
$count = 0;
|
||||
$abletomovecourses = false; // for now
|
||||
|
||||
// Checking if we are at the first or at the last page, to allow courses to
|
||||
// be moved up and down beyond the paging border
|
||||
if ($totalcount > $perpage) {
|
||||
$atfirstpage = ($page == 0);
|
||||
if ($perpage > 0) {
|
||||
$atlastpage = (($page + 1) == ceil($totalcount / $perpage));
|
||||
} else {
|
||||
$atlastpage = true;
|
||||
}
|
||||
} else {
|
||||
$atfirstpage = true;
|
||||
$atlastpage = true;
|
||||
}
|
||||
} else {
|
||||
$atfirstpage = true;
|
||||
$atlastpage = true;
|
||||
}
|
||||
|
||||
foreach ($courses as $acourse) {
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $acourse->id);
|
||||
$baseurl = new moodle_url('/course/category.php', $urlparams + array('sesskey' => sesskey()));
|
||||
foreach ($courses as $acourse) {
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $acourse->id);
|
||||
|
||||
$count++;
|
||||
$up = ($count > 1 || !$atfirstpage);
|
||||
$down = ($count < $numcourses || !$atlastpage);
|
||||
$count++;
|
||||
$up = ($count > 1 || !$atfirstpage);
|
||||
$down = ($count < $numcourses || !$atlastpage);
|
||||
|
||||
$linkcss = $acourse->visible ? '' : ' class="dimmed" ';
|
||||
echo '<tr>';
|
||||
echo '<td><a '.$linkcss.' href="view.php?id='.$acourse->id.'">'. format_string($acourse->fullname) .'</a></td>';
|
||||
if ($editingon) {
|
||||
echo '<td>';
|
||||
if (has_capability('moodle/course:update', $coursecontext)) {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/course/edit.php',
|
||||
array('id' => $acourse->id, 'category' => $id, 'returnto' => 'category')),
|
||||
new pix_icon('t/edit', $strsettings));
|
||||
}
|
||||
|
||||
// role assignment link
|
||||
if (has_capability('moodle/course:enrolreview', $coursecontext)) {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/enrol/users.php', array('id' => $acourse->id)),
|
||||
new pix_icon('i/users', get_string('enrolledusers', 'enrol')));
|
||||
}
|
||||
|
||||
if (can_delete_course($acourse->id)) {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/course/delete.php', array('id' => $acourse->id)),
|
||||
new pix_icon('t/delete', $strdelete));
|
||||
}
|
||||
|
||||
// MDL-8885, users with no capability to view hidden courses, should not be able to lock themselves out
|
||||
if (has_capability('moodle/course:visibility', $coursecontext) && has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
|
||||
if (!empty($acourse->visible)) {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/course/category.php',
|
||||
array('id' => $category->id, 'page' => $page, 'perpage' => $perpage,
|
||||
'hide' => $acourse->id, 'sesskey' => sesskey())),
|
||||
new pix_icon('t/hide', $strhide));
|
||||
} else {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/course/category.php',
|
||||
array('id' => $category->id, 'page' => $page, 'perpage' => $perpage,
|
||||
'show' => $acourse->id, 'sesskey' => sesskey())),
|
||||
new pix_icon('t/show', $strshow));
|
||||
}
|
||||
}
|
||||
|
||||
if (has_capability('moodle/backup:backupcourse', $coursecontext)) {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/backup/backup.php', array('id' => $acourse->id)),
|
||||
new pix_icon('t/backup', $strbackup));
|
||||
}
|
||||
|
||||
if (has_capability('moodle/restore:restorecourse', $coursecontext)) {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/backup/restorefile.php', array('contextid' => $coursecontext->id)),
|
||||
new pix_icon('t/restore', $strrestore));
|
||||
}
|
||||
|
||||
if (has_capability('moodle/category:manage', $context)) {
|
||||
if ($up) {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/course/category.php',
|
||||
array('id' => $category->id, 'page' => $page, 'perpage' => $perpage,
|
||||
'moveup' => $acourse->id, 'sesskey' => sesskey())),
|
||||
new pix_icon('t/up', $strmoveup));
|
||||
}
|
||||
|
||||
if ($down) {
|
||||
echo $OUTPUT->action_icon(new moodle_url('/course/category.php',
|
||||
array('id' => $category->id, 'page' => $page, 'perpage' => $perpage,
|
||||
'movedown' => $acourse->id, 'sesskey' => sesskey())),
|
||||
new pix_icon('t/down', $strmovedown));
|
||||
}
|
||||
$abletomovecourses = true;
|
||||
}
|
||||
|
||||
echo '</td>';
|
||||
echo '<td align="center">';
|
||||
echo '<input type="checkbox" name="c'.$acourse->id.'" />';
|
||||
echo '</td>';
|
||||
} else {
|
||||
echo '<td align="right">';
|
||||
// print enrol info
|
||||
if ($icons = enrol_get_course_info_icons($acourse)) {
|
||||
foreach ($icons as $pix_icon) {
|
||||
echo $OUTPUT->render($pix_icon);
|
||||
}
|
||||
}
|
||||
if (!empty($acourse->summary)) {
|
||||
$link = new moodle_url("/course/info.php?id=$acourse->id");
|
||||
echo $OUTPUT->action_link($link, '<img alt="'.get_string('info').'" class="icon" src="'.$OUTPUT->pix_url('i/info') . '" />',
|
||||
new popup_action('click', $link, 'courseinfo'), array('title'=>$strsummary));
|
||||
}
|
||||
echo "</td>";
|
||||
$linkcss = $acourse->visible ? '' : ' class="dimmed" ';
|
||||
echo '<tr>';
|
||||
echo '<td><a '.$linkcss.' href="view.php?id='.$acourse->id.'">'. format_string($acourse->fullname) .'</a></td>';
|
||||
if ($editingon) {
|
||||
echo '<td>';
|
||||
if (has_capability('moodle/course:update', $coursecontext)) {
|
||||
$url = new moodle_url('/course/edit.php', array('id' => $acourse->id, 'category' => $id, 'returnto' => 'category'));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('t/edit', get_string('settings')));
|
||||
}
|
||||
echo "</tr>";
|
||||
|
||||
// role assignment link
|
||||
if (has_capability('moodle/course:enrolreview', $coursecontext)) {
|
||||
$url = new moodle_url('/enrol/users.php', array('id' => $acourse->id));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('i/users', get_string('enrolledusers', 'enrol')));
|
||||
}
|
||||
|
||||
if (can_delete_course($acourse->id)) {
|
||||
$url = new moodle_url('/course/delete.php', array('id' => $acourse->id));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('t/delete', get_string('delete')));
|
||||
}
|
||||
|
||||
// MDL-8885, users with no capability to view hidden courses, should not be able to lock themselves out
|
||||
if (has_capability('moodle/course:visibility', $coursecontext) && has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
|
||||
if (!empty($acourse->visible)) {
|
||||
$url = new moodle_url($baseurl, array('hide' => $acourse->id));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('t/hide', get_string('hide')));
|
||||
} else {
|
||||
$url = new moodle_url($baseurl, array('show' => $acourse->id));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('t/show', get_string('show')));
|
||||
}
|
||||
}
|
||||
|
||||
if (has_capability('moodle/backup:backupcourse', $coursecontext)) {
|
||||
$url = new moodle_url('/backup/backup.php', array('id' => $acourse->id));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('t/backup', get_string('backup')));
|
||||
}
|
||||
|
||||
if (has_capability('moodle/restore:restorecourse', $coursecontext)) {
|
||||
$url = new moodle_url('/backup/restorefile.php', array('contextid' => $coursecontext->id));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('t/restore', get_string('restore')));
|
||||
}
|
||||
|
||||
if ($canmanage) {
|
||||
if ($up) {
|
||||
$url = new moodle_url($baseurl, array('moveup' => $acourse->id));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('t/up', get_string('moveup')));
|
||||
}
|
||||
|
||||
if ($down) {
|
||||
$url = new moodle_url($baseurl, array('movedown' => $acourse->id));
|
||||
echo $OUTPUT->action_icon($url, new pix_icon('t/down', get_string('movedown')));
|
||||
}
|
||||
$abletomovecourses = true;
|
||||
}
|
||||
|
||||
echo '</td>';
|
||||
echo '<td align="center">';
|
||||
echo '<input type="checkbox" name="c'.$acourse->id.'" />';
|
||||
echo '</td>';
|
||||
} else {
|
||||
echo '<td align="right">';
|
||||
// print enrol info
|
||||
if ($icons = enrol_get_course_info_icons($acourse)) {
|
||||
foreach ($icons as $pix_icon) {
|
||||
echo $OUTPUT->render($pix_icon);
|
||||
}
|
||||
}
|
||||
if (!empty($acourse->summary)) {
|
||||
$url = new moodle_url("/course/info.php?id=$acourse->id");
|
||||
echo $OUTPUT->action_link($url, '<img alt="'.get_string('info').'" class="icon" src="'.$OUTPUT->pix_url('i/info') . '" />',
|
||||
new popup_action('click', $url, 'courseinfo'), array('title'=>get_string('summary')));
|
||||
}
|
||||
echo "</td>";
|
||||
}
|
||||
|
||||
if ($abletomovecourses) {
|
||||
$movetocategories = array();
|
||||
$notused = array();
|
||||
make_categories_list($movetocategories, $notused, 'moodle/category:manage');
|
||||
$movetocategories[$category->id] = get_string('moveselectedcoursesto');
|
||||
echo '<tr><td colspan="3" align="right">';
|
||||
echo html_writer::select($movetocategories, 'moveto', $category->id, null, array('id'=>'movetoid'));
|
||||
$PAGE->requires->js_init_call('M.util.init_select_autosubmit', array('movecourses', 'movetoid', false));
|
||||
echo '<input type="hidden" name="id" value="'.$category->id.'" />';
|
||||
echo '</td></tr>';
|
||||
}
|
||||
|
||||
echo '</table>';
|
||||
echo '</div></form>';
|
||||
echo '<br />';
|
||||
echo "</tr>";
|
||||
}
|
||||
|
||||
echo '<div class="buttons">';
|
||||
if (has_capability('moodle/category:manage', $context) and $numcourses > 1) {
|
||||
/// Print button to re-sort courses by name
|
||||
unset($options);
|
||||
$options['id'] = $category->id;
|
||||
$options['resort'] = 'name';
|
||||
$options['sesskey'] = sesskey();
|
||||
echo $OUTPUT->single_button(new moodle_url('category.php', $options), get_string('resortcoursesbyname'), 'get');
|
||||
if ($abletomovecourses) {
|
||||
$movetocategories = array();
|
||||
$notused = array();
|
||||
make_categories_list($movetocategories, $notused, 'moodle/category:manage');
|
||||
$movetocategories[$category->id] = get_string('moveselectedcoursesto');
|
||||
echo '<tr><td colspan="3" align="right">';
|
||||
echo html_writer::select($movetocategories, 'moveto', $category->id, null, array('id'=>'movetoid'));
|
||||
$PAGE->requires->js_init_call('M.util.init_select_autosubmit', array('movecourses', 'movetoid', false));
|
||||
echo '<input type="hidden" name="id" value="'.$category->id.'" />';
|
||||
echo '</td></tr>';
|
||||
}
|
||||
|
||||
if (has_capability('moodle/course:create', $context)) {
|
||||
/// Print button to create a new course
|
||||
unset($options);
|
||||
$options['category'] = $category->id;
|
||||
$options['returnto'] = 'category';
|
||||
echo $OUTPUT->single_button(new moodle_url('edit.php', $options), get_string('addnewcourse'), 'get');
|
||||
}
|
||||
echo '</table>';
|
||||
echo '</div></form>';
|
||||
echo '<br />';
|
||||
}
|
||||
|
||||
if (!empty($CFG->enablecourserequests) && $category->id == $CFG->defaultrequestcategory) {
|
||||
print_course_request_buttons(get_context_instance(CONTEXT_SYSTEM));
|
||||
}
|
||||
echo '</div>';
|
||||
echo '<div class="buttons">';
|
||||
if ($canmanage and $numcourses > 1) {
|
||||
// Print button to re-sort courses by name
|
||||
$url = new moodle_url('/course/category.php', array('id' => $category->id, 'resort' => 'name', 'sesskey' => sesskey()));
|
||||
echo $OUTPUT->single_button($url, get_string('resortcoursesbyname'), 'get');
|
||||
}
|
||||
|
||||
print_course_search();
|
||||
if (has_capability('moodle/course:create', $context)) {
|
||||
// Print button to create a new course
|
||||
$url = new moodle_url('/course/edit.php', array('category' => $category->id, 'returnto' => 'category'));
|
||||
echo $OUTPUT->single_button($url, get_string('addnewcourse'), 'get');
|
||||
}
|
||||
|
||||
echo $OUTPUT->footer();
|
||||
if (!empty($CFG->enablecourserequests) && $category->id == $CFG->defaultrequestcategory) {
|
||||
print_course_request_buttons(get_context_instance(CONTEXT_SYSTEM));
|
||||
}
|
||||
echo '</div>';
|
||||
|
||||
print_course_search();
|
||||
|
||||
echo $OUTPUT->footer();
|
||||
|
||||
+14
-6
@@ -18,17 +18,21 @@ M.core_completion.init = function(Y) {
|
||||
|
||||
} else {
|
||||
var current = args.state.get('value');
|
||||
|
||||
var modulename = args.modulename.get('value');
|
||||
if (current == 1) {
|
||||
var altstr = M.str.completion['completion-alt-manual-y'].replace('{$a}', modulename);
|
||||
var titlestr = M.str.completion['completion-title-manual-y'].replace('{$a}', modulename);
|
||||
args.state.set('value', 0);
|
||||
args.image.set('src', M.util.image_url('i/completion-manual-y', 'moodle'));
|
||||
args.image.set('alt', M.str.completion['completion-alt-manual-y']);
|
||||
args.image.set('title', M.str.completion['completion-title-manual-y']);
|
||||
args.image.set('alt', altstr);
|
||||
args.image.set('title', titlestr);
|
||||
} else {
|
||||
var altstr = M.str.completion['completion-alt-manual-n'].replace('{$a}', modulename);
|
||||
var titlestr = M.str.completion['completion-title-manual-n'].replace('{$a}', modulename);
|
||||
args.state.set('value', 1);
|
||||
args.image.set('src', M.util.image_url('i/completion-manual-n', 'moodle'));
|
||||
args.image.set('alt', M.str.completion['completion-alt-manual-n']);
|
||||
args.image.set('title', M.str.completion['completion-title-manual-n']);
|
||||
args.image.set('alt', altstr);
|
||||
args.image.set('title', titlestr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +52,7 @@ M.core_completion.init = function(Y) {
|
||||
var completionstate = 0;
|
||||
var state = null;
|
||||
var image = null;
|
||||
var modulename = null;
|
||||
|
||||
var inputs = Y.Node.getDOMNode(form).getElementsByTagName('input');
|
||||
for (var i=0; i<inputs.length; i++) {
|
||||
@@ -59,6 +64,9 @@ M.core_completion.init = function(Y) {
|
||||
completionstate = inputs[i].value;
|
||||
state = Y.one(inputs[i]);
|
||||
break;
|
||||
case 'modulename':
|
||||
modulename = Y.one(inputs[i]);
|
||||
break;
|
||||
}
|
||||
if (inputs[i].type == 'image') {
|
||||
image = Y.one(inputs[i]);
|
||||
@@ -76,7 +84,7 @@ M.core_completion.init = function(Y) {
|
||||
success: handle_success,
|
||||
failure: handle_failure
|
||||
},
|
||||
arguments: {state: state, image: image, ajax: ajax}
|
||||
arguments: {state: state, image: image, ajax: ajax, modulename: modulename}
|
||||
};
|
||||
|
||||
Y.use('io', function(Y) {
|
||||
|
||||
+18
-26
@@ -103,56 +103,48 @@ if ($form->is_cancelled()){
|
||||
|
||||
// Handle aggregation methods
|
||||
// Overall aggregation
|
||||
$aggregation = new completion_aggregation();
|
||||
$aggregation->course = $data->id;
|
||||
$aggregation->criteriatype = null;
|
||||
$aggdata = array(
|
||||
'course' => $data->id,
|
||||
'criteriatype' => null
|
||||
);
|
||||
$aggregation = new completion_aggregation($aggdata);
|
||||
$aggregation->setMethod($data->overall_aggregation);
|
||||
$aggregation->insert();
|
||||
$aggregation->save();
|
||||
|
||||
// Activity aggregation
|
||||
if (empty($data->activity_aggregation)) {
|
||||
$data->activity_aggregation = 0;
|
||||
}
|
||||
|
||||
$aggregation = new completion_aggregation();
|
||||
$aggregation->course = $data->id;
|
||||
$aggregation->criteriatype = COMPLETION_CRITERIA_TYPE_ACTIVITY;
|
||||
$aggdata['criteriatype'] = COMPLETION_CRITERIA_TYPE_ACTIVITY;
|
||||
$aggregation = new completion_aggregation($aggdata);
|
||||
$aggregation->setMethod($data->activity_aggregation);
|
||||
$aggregation->insert();
|
||||
$aggregation->save();
|
||||
|
||||
// Course aggregation
|
||||
if (empty($data->course_aggregation)) {
|
||||
$data->course_aggregation = 0;
|
||||
}
|
||||
|
||||
$aggregation = new completion_aggregation();
|
||||
$aggregation->course = $data->id;
|
||||
$aggregation->criteriatype = COMPLETION_CRITERIA_TYPE_COURSE;
|
||||
$aggdata['criteriatype'] = COMPLETION_CRITERIA_TYPE_COURSE;
|
||||
$aggregation = new completion_aggregation($aggdata);
|
||||
$aggregation->setMethod($data->course_aggregation);
|
||||
$aggregation->insert();
|
||||
$aggregation->save();
|
||||
|
||||
// Role aggregation
|
||||
if (empty($data->role_aggregation)) {
|
||||
$data->role_aggregation = 0;
|
||||
}
|
||||
|
||||
$aggregation = new completion_aggregation();
|
||||
$aggregation->course = $data->id;
|
||||
$aggregation->criteriatype = COMPLETION_CRITERIA_TYPE_ROLE;
|
||||
$aggdata['criteriatype'] = COMPLETION_CRITERIA_TYPE_ROLE;
|
||||
$aggregation = new completion_aggregation($aggdata);
|
||||
$aggregation->setMethod($data->role_aggregation);
|
||||
$aggregation->insert();
|
||||
$aggregation->save();
|
||||
|
||||
// Update course total passing grade
|
||||
if (!empty($data->criteria_grade)) {
|
||||
if ($grade_item = grade_category::fetch_course_category($course->id)->grade_item) {
|
||||
$grade_item->gradepass = $data->criteria_grade_value;
|
||||
if (method_exists($grade_item, 'update')) {
|
||||
$grade_item->update('course/completion.php');
|
||||
}
|
||||
}
|
||||
}
|
||||
add_to_log($course->id, 'course', 'completion updated', 'completion.php?id='.$course->id);
|
||||
|
||||
redirect($CFG->wwwroot."/course/view.php?id=$course->id", get_string('changessaved'));
|
||||
$url = new moodle_url('/course/view.php', array('id' => $course->id));
|
||||
redirect($url);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -179,10 +179,13 @@ class course_completion_form extends moodleform {
|
||||
$criteria->config_form_display($mform);
|
||||
|
||||
// Completion on course grade
|
||||
$mform->addElement('header', 'grade', get_string('grade'));
|
||||
$mform->addElement('header', 'grade', get_string('coursegrade', 'completion'));
|
||||
|
||||
// Grade enable and passing grade
|
||||
$course_grade = $DB->get_field('grade_items', 'gradepass', array('courseid' => $course->id, 'itemtype' => 'course'));
|
||||
if (!$course_grade) {
|
||||
$course_grade = '0.00000';
|
||||
}
|
||||
$criteria = new completion_criteria_grade($params);
|
||||
$criteria->config_form_display($mform, $course_grade);
|
||||
|
||||
|
||||
@@ -85,6 +85,13 @@ if (!empty($course)) {
|
||||
//editor should respect category context if course context is not set.
|
||||
$editoroptions['context'] = $catcontext;
|
||||
$course = file_prepare_standard_editor($course, 'summary', $editoroptions, null, 'course', 'summary', null);
|
||||
|
||||
// Set up the default restricted module list
|
||||
if (!empty($CFG->restrictbydefault)) {
|
||||
if (!empty($CFG->defaultallowedmodules)) {
|
||||
$course->allowedmods = explode(',', $CFG->defaultallowedmodules);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// first create the form
|
||||
|
||||
@@ -1,9 +1,29 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Page for creating or editing course category name/parent/description.
|
||||
* When called with an id parameter, edits the category with that id.
|
||||
* Otherwise it creates a new category with default parent from the parent
|
||||
* parameter, which may be 0.
|
||||
*
|
||||
* @package core
|
||||
* @subpackage course
|
||||
* @copyright 2007 Nicolas Connault
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
require_once('../config.php');
|
||||
@@ -107,6 +127,28 @@ if ($mform->is_cancelled()) {
|
||||
redirect('category.php?id='.$newcategory->id.'&categoryedit=on');
|
||||
}
|
||||
|
||||
// Unfortunately the navigation never generates correctly for this page because technically this page doesn't actually
|
||||
// exist on the navigation; you get here through the course management page.
|
||||
// First up we'll try to make the course management page active seeing as that is where the user thinks they are.
|
||||
// The big prolem here is that the course management page is a common page for both editing users and common users and
|
||||
// is only added to the admin tree if the user has permission to edit at the system level.
|
||||
$node = $PAGE->settingsnav->get('root');
|
||||
if ($node) {
|
||||
$node = $node->get('courses');
|
||||
if ($node) {
|
||||
$node = $node->get('coursemgmt');
|
||||
}
|
||||
}
|
||||
if ($node) {
|
||||
// The course management page exists so make that active.
|
||||
$node->make_active();
|
||||
} else {
|
||||
// Failing that we'll override the URL, not as accurate and chances are things
|
||||
// won't be 100% correct all the time but should work most times.
|
||||
// A common reason to arrive here is having the management capability within only a particular category (not at system level).
|
||||
navigation_node::override_active_url(new moodle_url('/course/index.php', array('categoryedit' => 'on')));
|
||||
}
|
||||
|
||||
$PAGE->set_title($title);
|
||||
$PAGE->set_heading($fullname);
|
||||
echo $OUTPUT->header();
|
||||
|
||||
@@ -52,7 +52,7 @@ class moodle_course_external extends external_api {
|
||||
* @param array $options
|
||||
* @return array
|
||||
*/
|
||||
public static function get_courses($options) {
|
||||
public static function get_courses($options = array()) {
|
||||
global $CFG, $DB;
|
||||
require_once($CFG->dirroot . "/course/lib.php");
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ function callback_topics_request_key() {
|
||||
|
||||
function callback_topics_get_section_name($course, $section) {
|
||||
// We can't add a node without any text
|
||||
if (!empty($section->name)) {
|
||||
if ((string)$section->name !== '') {
|
||||
return format_string($section->name, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
|
||||
} else if ($section->section == 0) {
|
||||
return get_string('section0name', 'format_topics');
|
||||
|
||||
@@ -76,7 +76,7 @@ function callback_weeks_request_key() {
|
||||
*/
|
||||
function callback_weeks_get_section_name($course, $section) {
|
||||
// We can't add a node without text
|
||||
if (!empty($section->name)) {
|
||||
if ((string)$section->name !== '') {
|
||||
// Return the name the user set
|
||||
return format_string($section->name, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
|
||||
} else if ($section->section == 0) {
|
||||
|
||||
+2
-1
@@ -177,6 +177,7 @@ if (!$categories = get_categories()) { /// No category yet!
|
||||
$tempcat->context = get_context_instance(CONTEXT_COURSECAT, $tempcat->id);
|
||||
mark_context_dirty('/'.SYSCONTEXTID);
|
||||
fix_course_sortorder(); // Required to build course_categories.depth and .path.
|
||||
set_config('defaultrequestcategory', $tempcat->id);
|
||||
}
|
||||
|
||||
/// Move a category to a new parent if required
|
||||
@@ -394,4 +395,4 @@ function print_category_edit($category, $displaylist, $parentslist, $depth=-1, $
|
||||
print_category_edit($cat, $displaylist, $parentslist, $depth+1, $up, $down);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-4
@@ -1719,9 +1719,9 @@ function print_section($course, $section, $mods, $modnamesused, $absolute=false,
|
||||
}
|
||||
if ($completionicon) {
|
||||
$imgsrc = $OUTPUT->pix_url('i/completion-'.$completionicon);
|
||||
$imgalt = s(get_string('completion-alt-'.$completionicon, 'completion'));
|
||||
$imgalt = s(get_string('completion-alt-'.$completionicon, 'completion', $mod->name));
|
||||
if ($completion == COMPLETION_TRACKING_MANUAL && !$isediting) {
|
||||
$imgtitle = s(get_string('completion-title-'.$completionicon, 'completion'));
|
||||
$imgtitle = s(get_string('completion-title-'.$completionicon, 'completion', $mod->name));
|
||||
$newstate =
|
||||
$completiondata->completionstate==COMPLETION_COMPLETE
|
||||
? COMPLETION_INCOMPLETE
|
||||
@@ -1740,6 +1740,7 @@ function print_section($course, $section, $mods, $modnamesused, $absolute=false,
|
||||
echo "
|
||||
<form class='togglecompletion$extraclass' method='post' action='".$CFG->wwwroot."/course/togglecompletion.php'><div>
|
||||
<input type='hidden' name='id' value='{$mod->id}' />
|
||||
<input type='hidden' name='modulename' value='".s($mod->name)."' />
|
||||
<input type='hidden' name='sesskey' value='".sesskey()."' />
|
||||
<input type='hidden' name='completionstate' value='$newstate' />
|
||||
<input type='image' src='$imgsrc' alt='$imgalt' title='$imgtitle' />
|
||||
@@ -1762,7 +1763,7 @@ function print_section($course, $section, $mods, $modnamesused, $absolute=false,
|
||||
// see the activity itself, or for staff)
|
||||
if (!$mod->uservisible) {
|
||||
echo '<div class="availabilityinfo">'.$mod->availableinfo.'</div>';
|
||||
} else if ($canviewhidden && !empty($CFG->enableavailability)) {
|
||||
} else if ($canviewhidden && !empty($CFG->enableavailability) && $mod->visible) {
|
||||
$ci = new condition_info($mod);
|
||||
$fullinfo = $ci->get_full_information();
|
||||
if($fullinfo) {
|
||||
@@ -2076,6 +2077,11 @@ function get_course_category_tree($id = 0, $depth = 0) {
|
||||
return array($categories, $categoryids);
|
||||
}
|
||||
|
||||
if (empty($categoryids)) {
|
||||
// No categories available (probably all hidden).
|
||||
return array();
|
||||
}
|
||||
|
||||
// The depth is 0 this function has just been called so we can finish it off
|
||||
|
||||
list($ccselect, $ccjoin) = context_instance_preload_sql('c.id', CONTEXT_COURSE, 'ctx');
|
||||
@@ -2835,6 +2841,8 @@ function delete_course_module($id) {
|
||||
// very quick on an empty table)
|
||||
$DB->delete_records('course_modules_completion', array('coursemoduleid' => $cm->id));
|
||||
$DB->delete_records('course_modules_availability', array('coursemoduleid'=> $cm->id));
|
||||
$DB->delete_records('course_completion_criteria', array('moduleinstance' => $cm->id,
|
||||
'criteriatype' => COMPLETION_CRITERIA_TYPE_ACTIVITY));
|
||||
|
||||
delete_context(CONTEXT_MODULE, $cm->id);
|
||||
return $DB->delete_records('course_modules', array('id'=>$cm->id));
|
||||
@@ -3770,7 +3778,7 @@ function create_course($data, $editoroptions = NULL) {
|
||||
fix_course_sortorder();
|
||||
|
||||
// update module restrictions
|
||||
if ($course->restrictmodules) {
|
||||
if ($course->restrictmodules || $CFG->restrictbydefault ) {
|
||||
if (isset($data->allowedmods)) {
|
||||
update_restricted_mods($course, $data->allowedmods);
|
||||
} else {
|
||||
|
||||
+11
-8
@@ -78,7 +78,7 @@ $PAGE->navbar->add($userinfo);
|
||||
$PAGE->set_title("$course->shortname: $strrecentactivity");
|
||||
$PAGE->set_heading($course->fullname);
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading(format_string($course->fullname) . ": $userinfo", 3);
|
||||
echo $OUTPUT->heading(format_string($course->fullname) . ": $userinfo", 2);
|
||||
|
||||
$mform->display();
|
||||
|
||||
@@ -221,7 +221,9 @@ if (!empty($activities)) {
|
||||
echo $OUTPUT->spacer(array('height'=>30, 'br'=>true)); // should be done with CSS instead
|
||||
}
|
||||
echo $OUTPUT->box_start();
|
||||
echo "<h2>$activity->name</h2>";
|
||||
if (!empty($activity->name)) {
|
||||
echo html_writer::tag('h2', $activity->name);
|
||||
}
|
||||
$inbox = true;
|
||||
|
||||
} else if ($activity->type == 'activity') {
|
||||
@@ -230,16 +232,17 @@ if (!empty($activities)) {
|
||||
$cm = $modinfo->cms[$activity->cmid];
|
||||
|
||||
if ($cm->visible) {
|
||||
$linkformat = '';
|
||||
$class = '';
|
||||
} else {
|
||||
$linkformat = 'class="dimmed"';
|
||||
$class = 'dimmed';
|
||||
}
|
||||
$name = format_string($cm->name);
|
||||
$modfullname = $modnames[$cm->modname];
|
||||
|
||||
$image = "<img src=\"" . $OUTPUT->pix_url('icon', $cm->modname) . "\" class=\"icon\" alt=\"$modfullname\" />";
|
||||
echo "<h4>$image $modfullname".
|
||||
" <a href=\"$CFG->wwwroot/mod/$cm->modname/view.php?id=$cm->id\" $linkformat>$name</a></h4>";
|
||||
$image = $OUTPUT->pix_icon('icon', $modfullname, $cm->modname, array('class' => 'icon smallicon'));
|
||||
$link = html_writer::link(new moodle_url("/mod/$cm->modname/view.php",
|
||||
array("id" => $cm->id)), $name, array('class' => $class));
|
||||
echo html_writer::tag('h3', "$image $modfullname $link");
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -269,7 +272,7 @@ if (!empty($activities)) {
|
||||
|
||||
} else {
|
||||
|
||||
echo '<h4><center>' . get_string('norecentactivity') . '</center></h2>';
|
||||
echo html_writer::tag('h3', get_string('norecentactivity'), array('class' => 'mdl-align'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -90,6 +90,9 @@ if($group === 0 && $course->groupmode == SEPARATEGROUPS) {
|
||||
* Load data
|
||||
*/
|
||||
|
||||
// Retrieve course_module data for all modules in the course
|
||||
$modinfo = get_fast_modinfo($course);
|
||||
|
||||
// Get criteria for course
|
||||
$completion = new completion_info($course);
|
||||
|
||||
@@ -333,6 +336,7 @@ if(!$csv) {
|
||||
exit;
|
||||
}
|
||||
|
||||
print '<div id="completion-progress-wrapper" class="no-overflow">';
|
||||
print '<table id="completion-progress" class="generaltable flexible boxaligncenter completionreport" style="text-align: left" cellpadding="5" border="1">';
|
||||
|
||||
// Print criteria group names
|
||||
@@ -486,13 +490,10 @@ if(!$csv) {
|
||||
switch ($criterion->criteriatype) {
|
||||
|
||||
case COMPLETION_CRITERIA_TYPE_ACTIVITY:
|
||||
// Load activity
|
||||
$activity = $criterion->get_mod_instance();
|
||||
|
||||
// Display icon
|
||||
$icon = $OUTPUT->pix_url('icon', $criterion->module);
|
||||
$iconlink = $CFG->wwwroot.'/mod/'.$criterion->module.'/view.php?id='.$criterion->moduleinstance;
|
||||
$icontitle = $activity->name;
|
||||
$icontitle = $modinfo->cms[$criterion->moduleinstance]->name;
|
||||
$iconalt = get_string('modulename', $criterion->module);
|
||||
break;
|
||||
|
||||
@@ -574,10 +575,7 @@ foreach ($progress as $user) {
|
||||
if ($criterion->criteriatype == COMPLETION_CRITERIA_TYPE_ACTIVITY) {
|
||||
|
||||
// Load activity
|
||||
$mod = $criterion->get_mod_instance();
|
||||
$activity = $DB->get_record('course_modules', array('id' => $criterion->moduleinstance));
|
||||
$activity->name = $mod->name;
|
||||
|
||||
$activity = $modinfo->cms[$criterion->moduleinstance];
|
||||
|
||||
// Get progress information and state
|
||||
if(array_key_exists($activity->id,$user->progress)) {
|
||||
@@ -603,7 +601,7 @@ foreach ($progress as $user) {
|
||||
($activity->completion==COMPLETION_TRACKING_AUTOMATIC ? 'auto' : 'manual').
|
||||
'-'.$completiontype;
|
||||
|
||||
$describe=get_string('completion-alt-auto-'.$completiontype,'completion');
|
||||
$describe = get_string('completion-' . $completiontype, 'completion');
|
||||
$a=new StdClass;
|
||||
$a->state=$describe;
|
||||
$a->date=$date;
|
||||
@@ -632,7 +630,7 @@ foreach ($progress as $user) {
|
||||
$completiontype = $is_complete ? 'y' : 'n';
|
||||
$completionicon = 'completion-auto-'.$completiontype;
|
||||
|
||||
$describe = get_string('completion-alt-auto-'.$completiontype, 'completion');
|
||||
$describe = get_string('completion-' . $completiontype, 'completion');
|
||||
|
||||
$a = new stdClass();
|
||||
$a->state = $describe;
|
||||
@@ -646,7 +644,7 @@ foreach ($progress as $user) {
|
||||
} else {
|
||||
|
||||
if ($allow_marking_criteria === $criterion->id) {
|
||||
$describe = get_string('completion-alt-auto-'.$completiontype,'completion');
|
||||
$describe = get_string('completion-' . $completiontype, 'completion');
|
||||
|
||||
print '<td class="completion-progresscell">'.
|
||||
'<a href="'.$CFG->wwwroot.'/course/togglecompletion.php?user='.$user->id.'&course='.$course->id.'&rolec='.$allow_marking_criteria.'&sesskey='.sesskey().'">'.
|
||||
@@ -671,7 +669,7 @@ foreach ($progress as $user) {
|
||||
$ccompletion = new completion_completion($params);
|
||||
$completiontype = $ccompletion->is_complete() ? 'y' : 'n';
|
||||
|
||||
$describe = get_string('completion-alt-auto-'.$completiontype, 'completion');
|
||||
$describe = get_string('completion-' . $completiontype, 'completion');
|
||||
|
||||
$a = new StdClass;
|
||||
$a->state = $describe;
|
||||
@@ -704,6 +702,7 @@ if($csv) {
|
||||
exit;
|
||||
}
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
print $pagingbar;
|
||||
|
||||
print '<ul class="progress-actions"><li><a href="index.php?course='.$course->id.
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
$group = optional_param('group', 0, PARAM_INT); // Group to display
|
||||
$user = optional_param('user', 0, PARAM_INT); // User to display
|
||||
$date = optional_param('date', 0, PARAM_FILE); // Date to display - number or some string
|
||||
$date = optional_param('date', 0, PARAM_INT); // Date to display
|
||||
$modname = optional_param('modname', '', PARAM_SAFEDIR); // course_module->id
|
||||
$modid = optional_param('modid', 0, PARAM_FILE); // number or 'site_errors'
|
||||
$modaction = optional_param('modaction', '', PARAM_PATH); // an action as recorded in the logs
|
||||
|
||||
@@ -259,6 +259,7 @@ if(!$csv) {
|
||||
exit;
|
||||
}
|
||||
|
||||
print '<div id="completion-progress-wrapper" class="no-overflow">';
|
||||
print '<table id="completion-progress" class="generaltable flexible boxaligncenter" style="text-align:left"><tr style="vertical-align:top">';
|
||||
|
||||
// User heading / sort option
|
||||
@@ -364,7 +365,7 @@ foreach($progress as $user) {
|
||||
($activity->completion==COMPLETION_TRACKING_AUTOMATIC ? 'auto' : 'manual').
|
||||
'-'.$completiontype;
|
||||
|
||||
$describe=get_string('completion-alt-auto-'.$completiontype,'completion');
|
||||
$describe = get_string('completion-' . $completiontype, 'completion');
|
||||
$a=new StdClass;
|
||||
$a->state=$describe;
|
||||
$a->date=$date;
|
||||
@@ -392,6 +393,7 @@ if($csv) {
|
||||
exit;
|
||||
}
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
print $pagingbar;
|
||||
|
||||
print '<ul class="progress-actions"><li><a href="index.php?course='.$course->id.
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ if (!$course = $DB->get_record('course', array('id'=>$id))) {
|
||||
$PAGE->set_url('/course/reset.php', array('id'=>$id));
|
||||
|
||||
require_login($course);
|
||||
require_capability('moodle/course:update', get_context_instance(CONTEXT_COURSE, $course->id));
|
||||
require_capability('moodle/course:reset', get_context_instance(CONTEXT_COURSE, $course->id));
|
||||
|
||||
$strreset = get_string('reset');
|
||||
$strresetcourse = get_string('resetcourse');
|
||||
|
||||
+75
-58
@@ -15,10 +15,19 @@
|
||||
$blocklist = optional_param('blocklist', 0, PARAM_INT);
|
||||
$modulelist= optional_param('modulelist', '', PARAM_ALPHAEXT);
|
||||
|
||||
$PAGE->set_url('/course/search.php', compact('search', 'page', 'perpage', 'blocklist', 'modulelist', 'edit'));
|
||||
$PAGE->set_context(get_context_instance(CONTEXT_SYSTEM));
|
||||
$search = trim(strip_tags($search)); // trim & clean raw searched string
|
||||
// List of minimum capabilities which user need to have for editing/moving course
|
||||
$capabilities = array('moodle/course:create', 'moodle/category:manage');
|
||||
|
||||
// List of category id's in which current user has course:create and category:manage capability.
|
||||
$usercatlist = array();
|
||||
|
||||
// List of parent category id's
|
||||
$catparentlist = array();
|
||||
|
||||
//Populate usercatlist with list of category id's with required capabilities.
|
||||
make_categories_list($usercatlist, $catparentlist, $capabilities);
|
||||
|
||||
$search = trim(strip_tags($search)); // trim & clean raw searched string
|
||||
if ($search) {
|
||||
$searchterms = explode(" ", $search); // Search for words independently
|
||||
foreach ($searchterms as $key => $searchterm) {
|
||||
@@ -32,7 +41,7 @@
|
||||
$site = get_site();
|
||||
|
||||
$urlparams = array();
|
||||
foreach (array('search', 'page', 'blocklist', 'modulelist') as $param) {
|
||||
foreach (array('search', 'page', 'blocklist', 'modulelist', 'edit') as $param) {
|
||||
if (!empty($$param)) {
|
||||
$urlparams[$param] = $$param;
|
||||
}
|
||||
@@ -48,11 +57,17 @@
|
||||
require_login();
|
||||
}
|
||||
|
||||
if (can_edit_in_category()) {
|
||||
//Editing is possible if user have system or category level create and manage capability
|
||||
if (can_edit_in_category() || !empty($usercatlist)) {
|
||||
if ($edit !== -1) {
|
||||
$USER->editing = $edit;
|
||||
}
|
||||
$adminediting = $PAGE->user_is_editing();
|
||||
|
||||
// Set perpage if user can edit in category
|
||||
if ($perpage != 99999) {
|
||||
$perpage = 30;
|
||||
}
|
||||
} else {
|
||||
$adminediting = false;
|
||||
}
|
||||
@@ -74,11 +89,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
$capabilities = array('moodle/course:create', 'moodle/category:manage');
|
||||
if (has_any_capability($capabilities, get_context_instance(CONTEXT_SYSTEM)) && ($perpage != 99999)) {
|
||||
$perpage = 30;
|
||||
}
|
||||
|
||||
$displaylist = array();
|
||||
$parentlist = array();
|
||||
make_categories_list($displaylist, $parentlist);
|
||||
@@ -94,7 +104,7 @@
|
||||
$strfrontpage = get_string('frontpage', 'admin');
|
||||
$strnovalidcourses = get_string('novalidcourses');
|
||||
|
||||
if (empty($search) and empty($blocklist) and empty($modulelist)) {
|
||||
if (empty($search) and empty($blocklist) and empty($modulelist) and empty($moveto) and ($edit != -1)) {
|
||||
$PAGE->navbar->add($strcourses, new moodle_url('/course/index.php'));
|
||||
$PAGE->navbar->add($strsearch);
|
||||
$PAGE->set_title("$site->fullname : $strsearch");
|
||||
@@ -114,18 +124,28 @@
|
||||
exit;
|
||||
}
|
||||
|
||||
$courses = array();
|
||||
if (!empty($moveto) and $data = data_submitted() and confirm_sesskey()) { // Some courses are being moved
|
||||
if (! $destcategory = $DB->get_record("course_categories", array("id"=>$data->moveto))) {
|
||||
print_error('cannotfindcategory', '', '', $data->moveto);
|
||||
if (!$destcategory = $DB->get_record("course_categories", array("id" => $moveto))) {
|
||||
print_error('cannotfindcategory', '', '', $moveto);
|
||||
}
|
||||
|
||||
$courses = array();
|
||||
//User should have manage and create capablity on destination category.
|
||||
require_capability('moodle/category:manage', get_context_instance(CONTEXT_COURSECAT, $moveto));
|
||||
require_capability('moodle/course:create', get_context_instance(CONTEXT_COURSECAT, $moveto));
|
||||
|
||||
foreach ( $data as $key => $value ) {
|
||||
if (preg_match('/^c\d+$/', $key)) {
|
||||
array_push($courses, substr($key, 1));
|
||||
$courseid = substr($key, 1);
|
||||
// user must have category:manage and course:create capability for the course to be moved.
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $courseid);
|
||||
foreach ($capabilities as $capability) {
|
||||
require_capability($capability, $coursecontext);
|
||||
array_push($courses, $courseid);
|
||||
}
|
||||
}
|
||||
}
|
||||
move_courses($courses, $data->moveto);
|
||||
move_courses($courses, $moveto);
|
||||
}
|
||||
|
||||
// get list of courses containing blocks if required
|
||||
@@ -148,9 +168,7 @@
|
||||
foreach ($courses as $course) {
|
||||
$courses[$course->id] = $course;
|
||||
}
|
||||
}
|
||||
// get list of courses containing modules if required
|
||||
elseif (!empty($modulelist) and confirm_sesskey()) {
|
||||
} elseif (!empty($modulelist) and confirm_sesskey()) { // get list of courses containing modules
|
||||
$modulename = $modulelist;
|
||||
$sql = "SELECT DISTINCT c.id FROM {".$modulelist."} module, {course} c"
|
||||
." WHERE module.course=c.id";
|
||||
@@ -172,34 +190,26 @@
|
||||
else {
|
||||
$totalcount = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else if (!empty($searchterm)) { //Donot do search for empty search request.
|
||||
$courses = get_courses_search($searchterms, "fullname ASC",
|
||||
$page, $perpage, $totalcount);
|
||||
}
|
||||
|
||||
$searchform = print_course_search($search, true, "navbar");
|
||||
|
||||
if (!empty($courses) && has_capability('moodle/course:create', get_context_instance(CONTEXT_SYSTEM))) {
|
||||
$searchform = '';
|
||||
// not sure if this capability is the best here
|
||||
if (has_capability('moodle/category:manage', get_context_instance(CONTEXT_SYSTEM))) {
|
||||
if ($PAGE->user_is_editing()) {
|
||||
$string = get_string("turneditingoff");
|
||||
$edit = "off";
|
||||
} else {
|
||||
$string = get_string("turneditingon");
|
||||
$edit = "on";
|
||||
}
|
||||
|
||||
$aurl = new moodle_url("$CFG->wwwroot/course/search.php", array(
|
||||
'edit' => $edit,
|
||||
'sesskey' => sesskey(),
|
||||
'search' => $search,
|
||||
'page' => $page,
|
||||
'perpage' => $perpage));
|
||||
$searchform = $OUTPUT->single_button($aurl, $string, 'get');
|
||||
$searchform = '';
|
||||
//Turn editing should be visible if user have system or category level capability
|
||||
if (!empty($courses) && (can_edit_in_category() || !empty($usercatlist))) {
|
||||
if ($PAGE->user_is_editing()) {
|
||||
$string = get_string("turneditingoff");
|
||||
$edit = "off";
|
||||
} else {
|
||||
$string = get_string("turneditingon");
|
||||
$edit = "on";
|
||||
}
|
||||
$params = array_merge($urlparams, array('sesskey' => sesskey(), 'edit' => $edit));
|
||||
$aurl = new moodle_url("$CFG->wwwroot/course/search.php", $params);
|
||||
$searchform = $OUTPUT->single_button($aurl, $string, 'get');
|
||||
} else {
|
||||
$searchform = print_course_search($search, true, "navbar");
|
||||
}
|
||||
|
||||
$PAGE->navbar->add($strcourses, new moodle_url('/course/index.php'));
|
||||
@@ -228,25 +238,30 @@
|
||||
|
||||
print_navigation_bar($totalcount, $page, $perpage, $encodedsearch, $modulelink);
|
||||
|
||||
if (!$adminediting) {
|
||||
// Show list of courses
|
||||
if (!$adminediting) { //Not editing mode
|
||||
foreach ($courses as $course) {
|
||||
|
||||
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
|
||||
|
||||
$course->summary .= "<br /><p class=\"category\">";
|
||||
$course->summary .= "$strcategory: <a href=\"category.php?id=$course->category\">";
|
||||
$course->summary .= $displaylist[$course->category];
|
||||
$course->summary .= "</a></p>";
|
||||
// front page don't belong to any category and block can exist.
|
||||
if ($course->category > 0) {
|
||||
$course->summary .= "<br /><p class=\"category\">";
|
||||
$course->summary .= "$strcategory: <a href=\"category.php?id=$course->category\">";
|
||||
$course->summary .= $displaylist[$course->category];
|
||||
$course->summary .= "</a></p>";
|
||||
}
|
||||
print_course($course, $search);
|
||||
echo $OUTPUT->spacer(array('height'=>5, 'width'=>5, 'br'=>true)); // should be done with CSS instead
|
||||
}
|
||||
} else {
|
||||
/// Show editing UI.
|
||||
} else { //editing mode
|
||||
echo "<form id=\"movecourses\" action=\"search.php\" method=\"post\">\n";
|
||||
echo "<div><input type=\"hidden\" name=\"sesskey\" value=\"".sesskey()."\" />\n";
|
||||
echo "<input type=\"hidden\" name=\"search\" value=\"".s($search)."\" />\n";
|
||||
echo "<input type=\"hidden\" name=\"page\" value=\"$page\" />\n";
|
||||
echo "<input type=\"hidden\" name=\"perpage\" value=\"$perpage\" /></div>\n";
|
||||
if (!empty($modulelist) and confirm_sesskey()) {
|
||||
echo "<input type=\"hidden\" name=\"modulelist\" value=\"$modulelist\" /></div>\n";
|
||||
} else if (!empty($blocklist) and confirm_sesskey()) {
|
||||
echo "<input type=\"hidden\" name=\"blocklist\" value=\"$blocklist\" /></div>\n";
|
||||
}
|
||||
echo "<table border=\"0\" cellspacing=\"2\" cellpadding=\"4\" class=\"generalbox boxaligncenter\">\n<tr>\n";
|
||||
echo "<th scope=\"col\">$strcourses</th>\n";
|
||||
echo "<th scope=\"col\">$strcategory</th>\n";
|
||||
@@ -278,9 +293,8 @@
|
||||
echo "<td>".$displaylist[$course->category]."</td>\n";
|
||||
echo "<td>\n";
|
||||
|
||||
// this is ok since this will get inherited from course category context
|
||||
// if it is set
|
||||
if (has_capability('moodle/category:manage', $coursecontext)) {
|
||||
// If user has all required capabilities to move course then show selectable checkbox
|
||||
if (has_all_capabilities($capabilities, $coursecontext)) {
|
||||
echo "<input type=\"checkbox\" name=\"c$course->id\" />\n";
|
||||
} else {
|
||||
echo "<input type=\"checkbox\" name=\"c$course->id\" disabled=\"disabled\" />\n";
|
||||
@@ -320,13 +334,15 @@
|
||||
|
||||
// checks whether user can do site backup
|
||||
if (has_capability('moodle/backup:backupcourse', $coursecontext)) {
|
||||
echo "<a title=\"".get_string("backup")."\" href=\"../backup/backup.php?id=$course->id\">\n<img".
|
||||
$backupurl = new moodle_url('/backup/backup.php', array('id' => $course->id));
|
||||
echo "<a title=\"".get_string("backup")."\" href=\"".$backupurl."\">\n<img".
|
||||
" src=\"" . $OUTPUT->pix_url('t/backup') . "\" class=\"iconsmall\" alt=\"".get_string("backup")."\" /></a>\n ";
|
||||
}
|
||||
|
||||
// checks whether user can do restore
|
||||
if (has_capability('moodle/restore:restorecourse', $coursecontext)) {
|
||||
echo "<a title=\"".get_string("restore")."\" href=\"../files/index.php?id=$course->id&wdir=/backupdata\">\n<img".
|
||||
$restoreurl = new moodle_url('/backup/restorefile.php', array('contextid' => $coursecontext->id));
|
||||
echo "<a title=\"".get_string("restore")."\" href=\"".$restoreurl."\">\n<img".
|
||||
" src=\"" . $OUTPUT->pix_url('t/restore') . "\" class=\"iconsmall\" alt=\"".get_string("restore")."\" /></a>\n ";
|
||||
}
|
||||
|
||||
@@ -336,7 +352,8 @@
|
||||
echo "<br />";
|
||||
echo "<input type=\"button\" onclick=\"checkall()\" value=\"$strselectall\" />\n";
|
||||
echo "<input type=\"button\" onclick=\"checknone()\" value=\"$strdeselectall\" />\n";
|
||||
echo html_writer::select($displaylist, 'moveto', '', array(''=>get_string('moveselectedcoursesto')), array('id'=>'movetoid'));
|
||||
//Select box should only show categories in which user has min capability to move course.
|
||||
echo html_writer::select($usercatlist, 'moveto', '', array(''=>get_string('moveselectedcoursesto')), array('id'=>'movetoid'));
|
||||
$PAGE->requires->js_init_call('M.util.init_select_autosubmit', array('movecourses', 'movetoid', false));
|
||||
echo "</td>\n</tr>\n";
|
||||
echo "</table>\n</form>";
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Defines message providers (types of message sent) for the PayPal enrolment plugin.
|
||||
*
|
||||
* @package enrol_authorize
|
||||
* @copyright 2012 Andrew Davis
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$messageproviders = array(
|
||||
'authorize_enrolment' => array(),
|
||||
);
|
||||
@@ -144,6 +144,7 @@ $string['invalidacctype'] = 'Invalid account type';
|
||||
$string['isbusinesschecking'] = 'Is business checking?';
|
||||
$string['logindesc'] = 'This option must be ON. <br /><br />Please ensure that you have turned <a href="{$a->url}">loginhttps ON</a> in Admin >> Variables >> Security.<br /><br />Turning this on will make Moodle use a secure https connection just for the login and payment pages.';
|
||||
$string['logininfo'] = 'When configuring your Authorize.Net account, the login name is required and you must enter <strong>either</strong> the transaction key <strong>or</strong> the password in the appropriate box. We recommend you enter the transaction key due to security precautions.';
|
||||
$string['messageprovider:authorize_enrolment'] = 'Authorize.Net enrolment messages';
|
||||
$string['methodcc'] = 'Credit card';
|
||||
$string['methodccdesc'] = 'Select credit card and accepted types below';
|
||||
$string['methodecheck'] = 'eCheck (ACH)';
|
||||
|
||||
@@ -233,7 +233,7 @@ function send_welcome_messages($orderdata) {
|
||||
$a->profileurl = "$CFG->wwwroot/user/view.php?id=$lastuserid";
|
||||
$a->paymenturl = "$CFG->wwwroot/enrol/authorize/index.php?user=$lastuserid";
|
||||
$emailmessage = get_string('welcometocoursesemail', 'enrol_authorize', $a);
|
||||
$subject = get_string("enrolmentnew", '', format_string($SITE->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID))));
|
||||
$subject = get_string("enrolmentnew", 'enrol', format_string($SITE->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID))));
|
||||
|
||||
$eventdata = new stdClass();
|
||||
$eventdata->modulename = 'moodle';
|
||||
|
||||
@@ -26,6 +26,6 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2010081203;
|
||||
$plugin->version = 2010081205;
|
||||
$plugin->requires = 2010090501;
|
||||
$plugin->cron = 180;
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Defines message providers (types of message sent) for the PayPal enrolment plugin.
|
||||
*
|
||||
* @package enrol_flatfile
|
||||
* @copyright 2012 Andrew Davis
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$messageproviders = array(
|
||||
'flatfile_enrolment' => array(),
|
||||
);
|
||||
@@ -30,6 +30,7 @@ $string['location'] = 'File location';
|
||||
$string['mailadmin'] = 'Notify admin by email';
|
||||
$string['mailstudents'] = 'Notify students by email';
|
||||
$string['mailteachers'] = 'Notify teachers by email';
|
||||
$string['messageprovider:flatfile_enrolment'] = 'Flat file enrolment messages';
|
||||
$string['mapping'] = 'Flat file mapping';
|
||||
$string['pluginname'] = 'Flat file (CSV)';
|
||||
$string['pluginname_desc'] = 'This method will repeatedly check for and process a specially-formatted text file in the location that you specify.
|
||||
|
||||
@@ -27,5 +27,5 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2010091400;
|
||||
$plugin->version = 2010091401;
|
||||
$plugin->cron = 60;
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Defines message providers (types of message sent) for the PayPal enrolment plugin.
|
||||
*
|
||||
* @package enrol_imsenterprise
|
||||
* @copyright 2012 Andrew Davis
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$messageproviders = array(
|
||||
'imsenterprise_enrolment' => array(),
|
||||
);
|
||||
@@ -54,6 +54,7 @@ $string['location'] = 'File location';
|
||||
$string['logtolocation'] = 'Log file output location (blank for no logging)';
|
||||
$string['mailadmins'] = 'Notify admin by email';
|
||||
$string['mailusers'] = 'Notify users by email';
|
||||
$string['messageprovider:imsenterprise_enrolment'] = 'IMS Enterprise enrolment messages';
|
||||
$string['miscsettings'] = 'Miscellaneous';
|
||||
$string['processphoto'] = 'Add user photo data to profile';
|
||||
$string['processphotowarning'] = 'Warning: Image processing is likely to add a significant burden to the server. You are recommended not to activate this option if large numbers of students are expected to be processed.';
|
||||
|
||||
@@ -26,5 +26,5 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2011013000;
|
||||
$plugin->version = 2011013001;
|
||||
$plugin->cron = 60;
|
||||
|
||||
+50
-27
@@ -757,24 +757,21 @@ class course_enrolment_manager {
|
||||
* @return array
|
||||
*/
|
||||
public function get_other_users_for_display(core_enrol_renderer $renderer, moodle_url $pageurl, $sort, $direction, $page, $perpage) {
|
||||
|
||||
global $CFG;
|
||||
$userroles = $this->get_other_users($sort, $direction, $page, $perpage);
|
||||
$roles = $this->get_all_roles();
|
||||
|
||||
$courseid = $this->get_course()->id;
|
||||
$context = $this->get_context();
|
||||
$now = time();
|
||||
$extrafields = array();
|
||||
if (!empty($CFG->extrauserselectorfields)) {
|
||||
$extrafields = explode(',', $CFG->extrauserselectorfields);
|
||||
}
|
||||
|
||||
$users = array();
|
||||
foreach ($userroles as $userrole) {
|
||||
if (!array_key_exists($userrole->id, $users)) {
|
||||
$users[$userrole->id] = array(
|
||||
'userid' => $userrole->id,
|
||||
'courseid' => $courseid,
|
||||
'picture' => new user_picture($userrole),
|
||||
'firstname' => fullname($userrole, true),
|
||||
'email' => $userrole->email,
|
||||
'roles' => array()
|
||||
);
|
||||
$users[$userrole->id] = $this->prepare_user_for_display($userrole, $extrafields, $now);
|
||||
}
|
||||
$a = new stdClass;
|
||||
$a->role = $roles[$userrole->roleid]->localname;
|
||||
@@ -797,6 +794,7 @@ class course_enrolment_manager {
|
||||
break;
|
||||
}
|
||||
}
|
||||
$users[$userrole->id]['roles'] = array();
|
||||
$users[$userrole->id]['roles'][$userrole->roleid] = array(
|
||||
'text' => $roletext,
|
||||
'unchangeable' => !$changeable
|
||||
@@ -818,11 +816,11 @@ class course_enrolment_manager {
|
||||
* @return array
|
||||
*/
|
||||
public function get_users_for_display(course_enrolment_manager $manager, $sort, $direction, $page, $perpage) {
|
||||
global $CFG;
|
||||
$pageurl = $manager->get_moodlepage()->url;
|
||||
$users = $this->get_users($sort, $direction, $page, $perpage);
|
||||
|
||||
$now = time();
|
||||
$strnever = get_string('never');
|
||||
$straddgroup = get_string('addgroup', 'group');
|
||||
$strunenrol = get_string('unenrol', 'enrol');
|
||||
$stredit = get_string('edit');
|
||||
@@ -830,42 +828,34 @@ class course_enrolment_manager {
|
||||
$allroles = $this->get_all_roles();
|
||||
$assignable = $this->get_assignable_roles();
|
||||
$allgroups = $this->get_all_groups();
|
||||
$courseid = $this->get_course()->id;
|
||||
$context = $this->get_context();
|
||||
$canmanagegroups = has_capability('moodle/course:managegroups', $context);
|
||||
|
||||
$url = new moodle_url($pageurl, $this->get_url_params());
|
||||
$extrafields = array();
|
||||
if (!empty($CFG->extrauserselectorfields)) {
|
||||
$extrafields = explode(',', $CFG->extrauserselectorfields);
|
||||
}
|
||||
|
||||
$userdetails = array();
|
||||
foreach ($users as $user) {
|
||||
$details = array(
|
||||
'userid' => $user->id,
|
||||
'courseid' => $courseid,
|
||||
'picture' => new user_picture($user),
|
||||
'firstname' => fullname($user, true),
|
||||
'email' => $user->email,
|
||||
'lastseen' => $strnever,
|
||||
'roles' => array(),
|
||||
'groups' => array(),
|
||||
'enrolments' => array()
|
||||
);
|
||||
|
||||
if ($user->lastaccess) {
|
||||
$details['lastseen'] = format_time($now - $user->lastaccess);
|
||||
}
|
||||
$details = $this->prepare_user_for_display($user, $extrafields, $now);
|
||||
|
||||
// Roles
|
||||
$details['roles'] = array();
|
||||
foreach ($this->get_user_roles($user->id) as $rid=>$rassignable) {
|
||||
$details['roles'][$rid] = array('text'=>$allroles[$rid]->localname, 'unchangeable'=>(!$rassignable || !isset($assignable[$rid])));
|
||||
}
|
||||
|
||||
// Users
|
||||
$usergroups = $this->get_user_groups($user->id);
|
||||
$details['groups'] = array();
|
||||
foreach($usergroups as $gid=>$unused) {
|
||||
$details['groups'][$gid] = $allgroups[$gid]->name;
|
||||
}
|
||||
|
||||
// Enrolments
|
||||
$details['enrolments'] = array();
|
||||
foreach ($this->get_user_enrolments($user->id) as $ue) {
|
||||
if ($ue->timestart and $ue->timeend) {
|
||||
$period = get_string('periodstartend', 'enrol', array('start'=>userdate($ue->timestart), 'end'=>userdate($ue->timeend)));
|
||||
@@ -892,6 +882,39 @@ class course_enrolment_manager {
|
||||
return $userdetails;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare a user record for display
|
||||
*
|
||||
* This function is called by both {@link get_users_for_display} and {@link get_other_users_for_display} to correctly
|
||||
* prepare user fields for display
|
||||
*
|
||||
* Please note that this function does not check capability for moodle/coures:viewhiddenuserfields
|
||||
*
|
||||
* @param object $user The user record
|
||||
* @param array $extrafields The list of fields as returned from get_extra_user_fields used to determine which
|
||||
* additional fields may be displayed
|
||||
* @param int $now The time used for lastaccess calculation
|
||||
* @return array The fields to be displayed including userid, courseid, picture, firstname, lastseen and any
|
||||
* additional fields from $extrafields
|
||||
*/
|
||||
private function prepare_user_for_display($user, $extrafields, $now) {
|
||||
$details = array(
|
||||
'userid' => $user->id,
|
||||
'courseid' => $this->get_course()->id,
|
||||
'picture' => new user_picture($user),
|
||||
'firstname' => fullname($user, has_capability('moodle/site:viewfullnames', $this->get_context())),
|
||||
'lastseen' => get_string('never'),
|
||||
);
|
||||
foreach ($extrafields as $field) {
|
||||
$details[$field] = $user->{$field};
|
||||
}
|
||||
|
||||
if ($user->lastaccess) {
|
||||
$details['lastseen'] = format_time($now - $user->lastaccess);
|
||||
}
|
||||
return $details;
|
||||
}
|
||||
|
||||
public function get_manual_enrol_buttons() {
|
||||
$plugins = $this->get_enrolment_plugins();
|
||||
$buttons = array();
|
||||
|
||||
@@ -26,4 +26,4 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2010071201;
|
||||
$plugin->version = 2010071202;
|
||||
|
||||
+5
-1
@@ -379,7 +379,11 @@ YUI.add('moodle-enrol_manual-quickenrolment', function(Y) {
|
||||
params['role'] = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.ROLE+' select').get('value');
|
||||
params['startdate'] = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.STARTDATE+' select').get('value');
|
||||
params['duration'] = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.DURATION+' select').get('value');
|
||||
params['recovergrades'] = this.get(UEP.BASE).one('#'+CSS.RECOVERGRADES).get('checked')?1:0;
|
||||
if (this.get(UEP.DISABLEGRADEHISTORY) != true) {
|
||||
params['recovergrades'] = this.get(UEP.BASE).one('#'+CSS.RECOVERGRADES).get('checked')?1:0;
|
||||
} else {
|
||||
params['recovergrades'] = 0;
|
||||
}
|
||||
|
||||
Y.io(M.cfg.wwwroot+this.get(UEP.AJAXURL), {
|
||||
method:'POST',
|
||||
|
||||
@@ -145,6 +145,8 @@ class enrol_mnet_mnetservice_enrol {
|
||||
// users {@link http://tracker.moodle.org/browse/MDL-21327}
|
||||
$user = mnet_strip_user((object)$userdata, mnet_fields_to_import($client));
|
||||
$user->mnethostid = $client->id;
|
||||
$user->auth = 'mnet';
|
||||
$user->confirmed = 1;
|
||||
try {
|
||||
$user->id = $DB->insert_record('user', $user);
|
||||
} catch (Exception $e) {
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
$string['error_multiplehost'] = 'Some instance of MNet enrolment plugin already exists for this host. Only one instance per host and/or one instance for \'All hosts\' is allowed.';
|
||||
$string['instancename'] = 'Enrolment method name';
|
||||
$string['instancename_help'] = 'You can optionally rename this instance of the MNet enrolment method. If you leave this field empty, the default instance name will be used, containing the name of the remote host and the assigned role for their users.';
|
||||
$string['mnet_enrol_description'] = 'Publish this service to allow administrators at {$a} to enrol their students in courses you have created on your server.<br/><ul><li><em>Dependency</em>: You must also <strong>publish</strong> the SSO (Service Provider) service to {$a}.</li><li><em>Dependency</em>: You must also <strong>subscribe</strong> to the SSO (Identity Provider) service on {$a}.</li></ul><br/>Subscribe to this service to be able to enrol your students in courses on {$a}.<br/><ul><li><em>Dependency</em>: You must also <strong>subscribe</strong> to the SSO (Service Provider) service on {$a}.</li><li><em>Dependency</em>: You must also <strong>publish</strong> the SSO (Identity Provider) service to {$a}.</li></ul><br/>';
|
||||
$string['mnet_enrol_description'] = 'Publish this service to allow administrators at {$a} to enrol their students in courses you have created on your server.<br/><ul><li><em>Dependency</em>: You must also <strong>subscribe</strong> to the SSO (Identity Provider) service on {$a}.</li><li><em>Dependency</em>: You must also <strong>publish</strong> the SSO (Service Provider) service to {$a}.</li></ul><br/>Subscribe to this service to be able to enrol your students in courses on {$a}.<br/><ul><li><em>Dependency</em>: You must also <strong>publish</strong> the SSO (Identity Provider) service to {$a}.</li><li><em>Dependency</em>: You must also <strong>subscribe</strong> to the SSO (Service Provider) service on {$a}.</li></ul><br/>';
|
||||
$string['mnet_enrol_name'] = 'Remote enrolment service';
|
||||
$string['pluginname'] = 'MNet remote enrolments';
|
||||
$string['pluginname_desc'] = 'Allows remote MNet host to enrol their users into our courses.';
|
||||
|
||||
+21
-22
@@ -48,33 +48,32 @@ $manager = new course_enrolment_manager($PAGE, $course, $filter);
|
||||
$table = new course_enrolment_other_users_table($manager, $PAGE);
|
||||
$PAGE->set_url('/enrol/otherusers.php', $manager->get_url_params()+$table->get_url_params());
|
||||
|
||||
/***
|
||||
* Actions will go here
|
||||
*/
|
||||
$userdetails = array (
|
||||
'picture' => false,
|
||||
'firstname' => get_string('firstname'),
|
||||
'lastname' => get_string('lastname'),
|
||||
);
|
||||
if (!empty($CFG->extrauserselectorfields)) {
|
||||
$extrafields = explode(',', $CFG->extrauserselectorfields);
|
||||
foreach ($extrafields as $field) {
|
||||
$userdetails[$field] = get_string($field);
|
||||
}
|
||||
}
|
||||
|
||||
/*$fields = array(
|
||||
'userdetails' => array (
|
||||
'picture' => false,
|
||||
'firstname' => get_string('firstname'),
|
||||
'lastname' => get_string('lastname'),
|
||||
'email' => get_string('email')
|
||||
),
|
||||
'lastseen' => get_string('lastaccess'),
|
||||
'role' => array(
|
||||
'roles' => get_string('roles', 'role'),
|
||||
'context' => get_string('context')
|
||||
)
|
||||
);*/
|
||||
$fields = array(
|
||||
'userdetails' => array (
|
||||
'picture' => false,
|
||||
'firstname' => get_string('firstname'),
|
||||
'lastname' => get_string('lastname'),
|
||||
'email' => get_string('email')
|
||||
),
|
||||
'userdetails' => $userdetails,
|
||||
'lastseen' => get_string('lastaccess'),
|
||||
'role' => get_string('roles', 'role')
|
||||
);
|
||||
|
||||
// Remove hidden fields if the user has no access
|
||||
if (!has_capability('moodle/course:viewhiddenuserfields', $context)) {
|
||||
$hiddenfields = array_flip(explode(',', $CFG->hiddenuserfields));
|
||||
if (isset($hiddenfields['lastaccess'])) {
|
||||
unset($fields['lastseen']);
|
||||
}
|
||||
}
|
||||
|
||||
$table->set_fields($fields, $OUTPUT);
|
||||
|
||||
//$users = $manager->get_other_users($table->sort, $table->sortdirection, $table->page, $table->perpage);
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Defines message providers (types of message sent) for the PayPal enrolment plugin.
|
||||
*
|
||||
* @package enrol_paypal
|
||||
* @copyright 2012 Chris Follin
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$messageproviders = array(
|
||||
'paypal_enrolment' => array(),
|
||||
);
|
||||
@@ -243,7 +243,7 @@ while (!feof($fp)) {
|
||||
$eventdata->name = 'paypal_enrolment';
|
||||
$eventdata->userfrom = $teacher;
|
||||
$eventdata->userto = $user;
|
||||
$eventdata->subject = get_string("enrolmentnew", '', $shortname);
|
||||
$eventdata->subject = get_string("enrolmentnew", 'enrol', $shortname);
|
||||
$eventdata->fullmessage = get_string('welcometocoursetext', '', $a);
|
||||
$eventdata->fullmessageformat = FORMAT_PLAIN;
|
||||
$eventdata->fullmessagehtml = '';
|
||||
@@ -262,8 +262,8 @@ while (!feof($fp)) {
|
||||
$eventdata->name = 'paypal_enrolment';
|
||||
$eventdata->userfrom = $user;
|
||||
$eventdata->userto = $teacher;
|
||||
$eventdata->subject = get_string("enrolmentnew", '', $shortname);
|
||||
$eventdata->fullmessage = get_string('enrolmentnewuser', '', $a);
|
||||
$eventdata->subject = get_string("enrolmentnew", 'enrol', $shortname);
|
||||
$eventdata->fullmessage = get_string('enrolmentnewuser', 'enrol', $a);
|
||||
$eventdata->fullmessageformat = FORMAT_PLAIN;
|
||||
$eventdata->fullmessagehtml = '';
|
||||
$eventdata->smallmessage = '';
|
||||
@@ -281,8 +281,8 @@ while (!feof($fp)) {
|
||||
$eventdata->name = 'paypal_enrolment';
|
||||
$eventdata->userfrom = $user;
|
||||
$eventdata->userto = $admin;
|
||||
$eventdata->subject = get_string("enrolmentnew", '', $shortname);
|
||||
$eventdata->fullmessage = get_string('enrolmentnewuser', '', $a);
|
||||
$eventdata->subject = get_string("enrolmentnew", 'enrol', $shortname);
|
||||
$eventdata->fullmessage = get_string('enrolmentnewuser', 'enrol', $a);
|
||||
$eventdata->fullmessageformat = FORMAT_PLAIN;
|
||||
$eventdata->fullmessagehtml = '';
|
||||
$eventdata->smallmessage = '';
|
||||
|
||||
@@ -44,6 +44,7 @@ $string['enrolstartdate_help'] = 'If enabled, users can be enrolled from this da
|
||||
$string['mailadmins'] = 'Notify admin';
|
||||
$string['mailstudents'] = 'Notify students';
|
||||
$string['mailteachers'] = 'Notify teachers';
|
||||
$string['messageprovider:paypal_enrolment'] = 'PayPal enrolment messages';
|
||||
$string['nocost'] = 'There is no cost associated with enrolling in this course!';
|
||||
$string['paypal:config'] = 'Configure PayPal enrol instances';
|
||||
$string['paypal:manage'] = 'Manage enrolled users';
|
||||
|
||||
@@ -26,5 +26,5 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2010073100;
|
||||
$plugin->version = 2010073101;
|
||||
$plugin->requires = 2010090501; // Requires this Moodle version
|
||||
|
||||
+26
-7
@@ -166,18 +166,37 @@ if ($action) {
|
||||
|
||||
|
||||
$renderer = $PAGE->get_renderer('core_enrol');
|
||||
|
||||
$userdetails = array (
|
||||
'picture' => false,
|
||||
'firstname' => get_string('firstname'),
|
||||
'lastname' => get_string('lastname'),
|
||||
);
|
||||
if (!empty($CFG->extrauserselectorfields)) {
|
||||
$extrafields = explode(',', $CFG->extrauserselectorfields);
|
||||
foreach ($extrafields as $field) {
|
||||
$userdetails[$field] = get_string($field);
|
||||
}
|
||||
}
|
||||
$fields = array(
|
||||
'userdetails' => array (
|
||||
'picture' => false,
|
||||
'firstname' => get_string('firstname'),
|
||||
'lastname' => get_string('lastname'),
|
||||
'email' => get_string('email')
|
||||
),
|
||||
'userdetails' => $userdetails,
|
||||
'lastseen' => get_string('lastaccess'),
|
||||
'role' => get_string('roles', 'role'),
|
||||
'group' => get_string('groups', 'group'),
|
||||
'enrol' => get_string('enrolmentinstances', 'enrol')
|
||||
);
|
||||
|
||||
// Remove hidden fields if the user has no access
|
||||
if (!has_capability('moodle/course:viewhiddenuserfields', $context)) {
|
||||
$hiddenfields = array_flip(explode(',', $CFG->hiddenuserfields));
|
||||
if (isset($hiddenfields['lastaccess'])) {
|
||||
unset($fields['lastseen']);
|
||||
}
|
||||
if (isset($hiddenfields['groups'])) {
|
||||
unset($fields['group']);
|
||||
}
|
||||
}
|
||||
|
||||
$table->set_fields($fields, $renderer);
|
||||
|
||||
$canassign = has_capability('moodle/role:assign', $manager->get_context());
|
||||
@@ -197,4 +216,4 @@ $PAGE->set_heading($PAGE->title);
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading(get_string('enrolledusers', 'enrol'));
|
||||
echo $renderer->render($table);
|
||||
echo $OUTPUT->footer();
|
||||
echo $OUTPUT->footer();
|
||||
|
||||
@@ -114,7 +114,7 @@ class edit_outcome_form extends moodleform {
|
||||
if (empty($courseid)) {
|
||||
$mform->hardFreeze('standard');
|
||||
|
||||
} else if (empty($outcome->courseid) and !has_capability('moodle/grade:manage', get_context_instance(CONTEXT_SYSTEM))) {
|
||||
} else if (!has_capability('moodle/grade:manage', get_context_instance(CONTEXT_SYSTEM))) {
|
||||
$mform->hardFreeze('standard');
|
||||
|
||||
} else if ($coursecount and empty($outcome->courseid)) {
|
||||
|
||||
@@ -163,7 +163,7 @@ if ($mform->is_cancelled()) {
|
||||
// form processing
|
||||
} else if ($data = $mform->get_data(false)) {
|
||||
|
||||
if (is_array($data->feedback)) {
|
||||
if (isset($data->feedback) && is_array($data->feedback)) {
|
||||
$data->feedbackformat = $data->feedback['format'];
|
||||
$data->feedback = $data->feedback['text'];
|
||||
}
|
||||
@@ -193,20 +193,18 @@ if ($mform->is_cancelled()) {
|
||||
$data->feedbackformat = $old_grade_grade->feedbackformat;
|
||||
}
|
||||
// update final grade or feedback
|
||||
// when we set override grade the first time, it happens here
|
||||
$grade_item->update_final_grade($data->userid, $data->finalgrade, 'editgrade', $data->feedback, $data->feedbackformat);
|
||||
|
||||
$grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true);
|
||||
$grade_grade->grade_item =& $grade_item; // no db fetching
|
||||
|
||||
if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:edit', $context)) {
|
||||
if (!grade_floats_different($data->finalgrade, $old_grade_grade->finalgrade)
|
||||
and $data->feedback === $old_grade_grade->feedback) {
|
||||
// change overridden flag only if grade or feedback not changed
|
||||
if (!isset($data->overridden)) {
|
||||
$data->overridden = 0; // checkbox
|
||||
}
|
||||
$grade_grade->set_overridden($data->overridden);
|
||||
// change overridden flag
|
||||
if (!isset($data->overridden)) {
|
||||
$data->overridden = 0; // checkbox unticked
|
||||
}
|
||||
$grade_grade->set_overridden($data->overridden);
|
||||
}
|
||||
|
||||
if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:hide', $context)) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user