Compare commits
667 Commits
fradrive/m
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 64df38f2a9 | |||
| 3c6a580808 | |||
| a3762ce938 | |||
| 573abcf43f | |||
| 89d2462974 | |||
| 599d2c1c7a | |||
| d2105c8894 | |||
| 7b486702f4 | |||
| bf88b19f1c | |||
| 5fd52768bc | |||
| 123e9eb057 | |||
| 5ab47c6c4f | |||
| fd6ba5b0c5 | |||
| f784f645a6 | |||
| 92ff99a36e | |||
| 5a5e4886b7 | |||
| 506b26ddd5 | |||
| aa664a5822 | |||
| 487069b29e | |||
| f5d701a871 | |||
| 579ea86503 | |||
| 9c1b074adf | |||
| a01398f1db | |||
| 020486819f | |||
| cd8a7a8322 | |||
| 79e0d5a642 | |||
| 27c5f61299 | |||
| 69b5818427 | |||
| e5e7612e9b | |||
| ebf71b7135 | |||
| e7c7ec7a82 | |||
| d55efd77f7 | |||
| 72f5a9fb37 | |||
| f1ec60a5b6 | |||
| 5c01ea36c1 | |||
| 26b34eee15 | |||
| efa55c8f72 | |||
| babee7afa2 | |||
| 0cee6f01e8 | |||
| fdd4283b0d | |||
| 0ac972bf22 | |||
| f40818c1cc | |||
| d33a792045 | |||
| 9ce3b5d146 | |||
| 570cfc238b | |||
| 4fb7a71cfc | |||
| b8f6581064 | |||
| c9613e2982 | |||
| 19c64616f0 | |||
| e403b6bfb2 | |||
| 87da02048c | |||
| 3dc74de68e | |||
| b4f85f155a | |||
| a97dc071a3 | |||
| ee5a79398f | |||
| e069d6be46 | |||
| 6b32cddeac | |||
| 553e699b56 | |||
| 479e807d6d | |||
| 9d1a97172e | |||
| 24196cc2cd | |||
| 9ba7a82449 | |||
| 695bd18763 | |||
| 7e61e56ae1 | |||
| 207a304192 | |||
| 1b8c6c33a7 | |||
| bee015c1f2 | |||
| 1521d08355 | |||
| bb047da360 | |||
| 6f90c04b1b | |||
| 1633c41b1d | |||
| 20faec8973 | |||
| 65cb75921d | |||
| 8104ce96cc | |||
| 396b365a31 | |||
| ff3d33bbf4 | |||
| 82ea44c63f | |||
| 926dbae09a | |||
| eb67136c0c | |||
| b37954d452 | |||
| 5752b4b8da | |||
| 3929bccd6e | |||
| aae5a5f997 | |||
| 1fc948711a | |||
| 088587549d | |||
| bc63324ddf | |||
| 9a12e00f7f | |||
| 06cd87f360 | |||
| 095002637f | |||
| ffae8553d5 | |||
| 2ad61c73f1 | |||
| 7dcd0b7297 | |||
| 5881973906 | |||
| d7dcf0acf5 | |||
| 1f484f7781 | |||
| 9fbab25ecc | |||
| be18af08c6 | |||
| b12de8be15 | |||
| 4156b3b553 | |||
| 7b7c0d4053 | |||
| 6441bc5562 | |||
| 2a1cff4cd0 | |||
| aefafa32d1 | |||
| 8e0eb401b5 | |||
| 8adcdf69fe | |||
| d6b4afe975 | |||
| cce4b2b27d | |||
| 12e01238c4 | |||
| 130f592491 | |||
| d1dcdcfe91 | |||
| 5e0df28444 | |||
| 0a4ad611c7 | |||
| 2109996387 | |||
| 4f5c7d56b0 | |||
| 05bc06df47 | |||
| 38606949b0 | |||
| f3f2f397fc | |||
| d06bc10408 | |||
| 490b89e174 | |||
| d5bbec9fa3 | |||
| fbd99f2394 | |||
| 593ee2cf76 | |||
| 2360375385 | |||
| 56aa06097b | |||
| e9fefa75bd | |||
| 0ffd594a04 | |||
| ab340aa715 | |||
| 5128f9b74c | |||
| 558402ac47 | |||
| 1b35c57660 | |||
| 56b8a8de86 | |||
| 48096c6b81 | |||
| e8a21610a4 | |||
| c1ed89a30b | |||
| cf8fc90db7 | |||
| b26dd285df | |||
| e5cf120af2 | |||
| ad12b8f927 | |||
| 9fe78541d7 | |||
| a0604637bd | |||
| 5e41c2073f | |||
| 50c7d18b53 | |||
| f996976f65 | |||
| f04a40c0a3 | |||
| 6cc929e377 | |||
| 11bcef67f8 | |||
| 7b7ffab109 | |||
| afbeb86762 | |||
| 9af4a3a22e | |||
| 4241c75afe | |||
| afa2f9bf0e | |||
| f44d66cb91 | |||
| 1d68ed9c5e | |||
| cd84d0a932 | |||
| f467f6086e | |||
| 4f524bd8d2 | |||
| aaf72f7255 | |||
| 36a3b04ad8 | |||
| ae6d3b0fc3 | |||
| 6f3dd408bb | |||
| c0c1665ccb | |||
| c2e0f6b2b8 | |||
| a1d7f16427 | |||
| 5f3d8a88e2 | |||
| b42e93e891 | |||
| e53be8ddf9 | |||
| 6d583fe8c4 | |||
| 954e86c95a | |||
| f47528c741 | |||
| ad1d235bea | |||
| d4d915bd60 | |||
| 07cfc0adcb | |||
| f6c82009ee | |||
| c08d6ae0d0 | |||
| 6a0876ae55 | |||
| 75a4f52a80 | |||
| 1f7e9b6a2f | |||
| 564488d5fa | |||
| 500c9a749a | |||
| ede00deb86 | |||
| 9eb075836f | |||
| d546e5da0f | |||
| 162c44a44f | |||
| 0a29540089 | |||
| 6f1ad811f7 | |||
| d2f69dc023 | |||
| cd76bdd4e7 | |||
| e1dca7d6b0 | |||
| 5d46479a33 | |||
| fcf1b6d9d8 | |||
| 7e09636a2b | |||
| 8317f682d8 | |||
| 85511091cc | |||
| 02d10006fc | |||
| 2fdb132140 | |||
| fba0b71d50 | |||
| 4934f5f89d | |||
| 133a8d3739 | |||
| e8af2b8da9 | |||
| ac766ea217 | |||
| a113d43089 | |||
| 14140c982b | |||
| ce125b6495 | |||
| 0c78996260 | |||
| b78c898ebf | |||
| 4bca7580d0 | |||
| 46f777740f | |||
| a7b08b1ae5 | |||
| 452cdf4442 | |||
| f6b87a09b0 | |||
| 0a5b0fceff | |||
| 3e6717904a | |||
| 2059d678ee | |||
| 225af31943 | |||
| 9d26c1c171 | |||
| 22d6cf737e | |||
| 35cadda2e8 | |||
| 692350677f | |||
| 36b481a548 | |||
| cb58c20ca1 | |||
| e757209b80 | |||
| 74c330bd24 | |||
| cac0a47d01 | |||
| 5c70b1099c | |||
| 26ea39dc67 | |||
| 2385d989a8 | |||
| 0105aa8c3f | |||
| 3bae365b37 | |||
| 1d01897757 | |||
| ce62b99d2b | |||
| 4dbe005709 | |||
| 11ef856b2b | |||
| 5a03d1cabe | |||
| 0264c87510 | |||
| e9a4c838a8 | |||
| 733324a732 | |||
| 757d383d33 | |||
| ee02a50bdd | |||
| c859974495 | |||
| ce35c8efc9 | |||
| 3151be6f41 | |||
| 61fb8b7ea9 | |||
| 0ecb342e8f | |||
| 8198559a94 | |||
| fbd3c6d7c5 | |||
| a8420aaf56 | |||
| 1bd0225522 | |||
| 71a2a8e76a | |||
| bd48469b3c | |||
| 28b94351da | |||
| 59985d11c2 | |||
| d7e8adc24d | |||
| 3168f5c49e | |||
| 758f4db9d8 | |||
| c033243038 | |||
| 3dfab76761 | |||
| 497d0355d9 | |||
| 4d2ac71f73 | |||
| 2b76d673f8 | |||
| 81fdec5068 | |||
| 2eb423b4a1 | |||
| f23da55693 | |||
| 7b2d2bedb7 | |||
| 167872c332 | |||
| 25c880c8ba | |||
| 5d1dc8c3c0 | |||
| 640f3bbba5 | |||
| 760ab5f069 | |||
| 7c1a7e1e9e | |||
| 2d80c6e0ab | |||
| 010fb965d9 | |||
| 32441fc9c7 | |||
| ea92e17949 | |||
| a04732b5fb | |||
| 53d9c17fb5 | |||
| 8e1bb82017 | |||
| 7ed6b843bf | |||
| 20954b1351 | |||
| c3399c49b3 | |||
| 88342f7336 | |||
| 3a1b6cf72c | |||
| f351c7485e | |||
| 5c65c04ce7 | |||
| 7d621f0e0f | |||
| 6dda12cc66 | |||
| 965ae3da29 | |||
| 9d16a22fd7 | |||
| 4661eab218 | |||
| db75978dcf | |||
| 406c14dd86 | |||
| 7e8d910496 | |||
| 7a1139807d | |||
| 6b3775b9b9 | |||
| 0821b74fb7 | |||
| 9f49cef214 | |||
| 9f411e329d | |||
| dea9faa055 | |||
| 084b9258dd | |||
| 258a240a77 | |||
| ee498be12f | |||
| 5e76a77821 | |||
| df67718241 | |||
| 3cd48bdea1 | |||
| 019d6475c5 | |||
| b9486187d8 | |||
| 6e3286b8a7 | |||
| 586550f2fd | |||
| 043b9344f6 | |||
| 0aeb28088d | |||
| 235d03d173 | |||
| fc713fdbd0 | |||
| b2a9a3b4b4 | |||
| 0325bb7a63 | |||
| 77d737026e | |||
| f310df9647 | |||
| 640956df20 | |||
| 248c8ca42e | |||
| fb2647803b | |||
| 00711e42c0 | |||
| 08084b619f | |||
| dcc4c70ec2 | |||
| 8cf41831f0 | |||
| 078f46e5a5 | |||
| 8157746fea | |||
| 6a279d262f | |||
| 87e80db4aa | |||
| 7fe8fcb5f6 | |||
| c62c435638 | |||
| 17c7ed89c5 | |||
| 517144c0cf | |||
| 11b17ab1e2 | |||
| 224f55852f | |||
| 622ba07b8f | |||
| 2a1f114f48 | |||
| b77356d73d | |||
| ee244e34a4 | |||
| ed8f859c1e | |||
| f969c23bac | |||
| 1a3c18a8bd | |||
| fc13ac7a6d | |||
| ef9f4a9345 | |||
| ba7b2de4cf | |||
| 6012286250 | |||
| cfb48b6a1c | |||
| 32f449ec12 | |||
| 7b68b128a8 | |||
| 6564e8f975 | |||
| cb7946b156 | |||
| 81203be811 | |||
| 0345f4a5e6 | |||
| 85105cb931 | |||
| 51267bfd7c | |||
| 8136d92e48 | |||
| 8e42e4140d | |||
| 59c49116b5 | |||
| 3bce50c1fe | |||
| 2c7858139a | |||
| f48afbca43 | |||
| 30ad995a40 | |||
| 871cc72995 | |||
| a92fd673ab | |||
| d89e9f6781 | |||
| 12d8f49a65 | |||
| bf0642ccb8 | |||
| eac726f364 | |||
| c487513116 | |||
| 5761b96282 | |||
| 84a91be87f | |||
| 9e3a16011b | |||
| 4ec521361d | |||
| 72920caf4c | |||
| 0538142aa8 | |||
| c03fd0c81f | |||
| 252641337a | |||
| 3cbeba956e | |||
| 0a104db666 | |||
| 311ba5234d | |||
| b14821e3b4 | |||
| 78d0d9e853 | |||
| 96059f0a7b | |||
| 21ad3f06af | |||
| 55531ef692 | |||
| 8a22a86399 | |||
| ecfc0f7461 | |||
| 83a92b05dd | |||
| 100422db41 | |||
| 0988079b86 | |||
| 9fc8ba2315 | |||
| 2200b85120 | |||
| c7ee91d26b | |||
| 09ccd12b29 | |||
| 422f6bc5b5 | |||
| 204d57cb96 | |||
| a2dbb1f5f3 | |||
| 4ea031ed6b | |||
| 9e7631deeb | |||
| 2b7412d27e | |||
| 96f735a2f5 | |||
| 93f968a03b | |||
| 39ab2ce8a1 | |||
| 7e1cddfa46 | |||
| e997616e33 | |||
| 1dd5c5dd79 | |||
| 082ce971aa | |||
| b739c66444 | |||
| 6dc59e5098 | |||
| e02c66de1a | |||
| e8adb2c27d | |||
| 114bceb57e | |||
| e2cb0edec5 | |||
| d5e4e67779 | |||
| 3f9abfdcc2 | |||
| 609e4310da | |||
| cfa669bda6 | |||
| 3549cd1649 | |||
| 89326ded56 | |||
| 2af27e2624 | |||
| c83ed1fc39 | |||
| 3416942591 | |||
| 53226e6c6f | |||
| 85bea8d12c | |||
| 24046ef0fc | |||
| 325f07feca | |||
| 6895313887 | |||
| e95ad62436 | |||
| c0ec8d2a9d | |||
| 65ec7f0de5 | |||
| 073ffb8483 | |||
| be645b8c8b | |||
| 8906f3d705 | |||
| 7a44af0a0b | |||
| d030c5d0cc | |||
| 56d7fec466 | |||
| e67091cb47 | |||
| acb5dbfb28 | |||
| 78b3a38076 | |||
| 865073a6a1 | |||
| 6112f9f229 | |||
| d35c524f99 | |||
| 7e014c037e | |||
| 2cece492e9 | |||
| e9dc8be826 | |||
| eec396ec98 | |||
| 4ef188f2ed | |||
| bcfee0f14f | |||
| fdaaccb28a | |||
| 53edb0dfeb | |||
| c8a9e5a57d | |||
| 66879a4fb0 | |||
| 34fd73e17b | |||
| a8e9a59edf | |||
| e0d1777fb9 | |||
| 8c47b51cef | |||
| 0ffbbfdb18 | |||
| 7c6da61d13 | |||
| ded2049f33 | |||
| 14b8406937 | |||
| 453c283438 | |||
| 6168349ed2 | |||
| 57bbc5ba9c | |||
| ab3b01cbfd | |||
| e85dfde4d9 | |||
| fd1edb292c | |||
| 0ad82f6275 | |||
| f9f79b2a42 | |||
| 5c73ee676a | |||
| be13a64d50 | |||
| 9f8af30e6d | |||
| 8f9f6ba8e2 | |||
| 775ec4c948 | |||
| 0c808ca393 | |||
| 0e45938886 | |||
| 1d357550d6 | |||
| 21d6975ea3 | |||
| efa14e0301 | |||
| dfb97df72b | |||
| 189205767f | |||
| 03d85be290 | |||
| 5d54275446 | |||
| e84e7e57d8 | |||
| b51caba851 | |||
| e2f6ee4294 | |||
| 50c3134a1b | |||
| 31f670b143 | |||
| 81c4838e29 | |||
| 7717b2ce45 | |||
| 60626cd841 | |||
| 3122a36ac8 | |||
| 12aee272c4 | |||
| 5b8edf86ff | |||
| 733d6ea218 | |||
| 1d88e98fb4 | |||
| 8e3c82c1e6 | |||
| 5e30ae8b5f | |||
| 6c2b57ca4c | |||
| cfa10a1c16 | |||
| 315e668ff6 | |||
| b7227f9ce3 | |||
| 492a758723 | |||
| 1cc140a1cc | |||
| e2ad23ab2b | |||
| 956e939f9a | |||
| cd3c327c4c | |||
| f463f3d503 | |||
| 4f7f54424c | |||
| 8b37d788a7 | |||
| 47a7fe15fd | |||
| 8532af38a5 | |||
| f3d0c3e2a8 | |||
| 44b84e1e83 | |||
| 7263a19085 | |||
| d7c45dadac | |||
| 47678dde2c | |||
| 351421e903 | |||
| 66fff83ff8 | |||
| 10a9d8c51d | |||
| 2e526e0cb3 | |||
| 91273e57eb | |||
| 18585db1aa | |||
| 0de102805a | |||
| 9bd7459849 | |||
| ecd0a443b4 | |||
| 0ae8eddc5b | |||
| 178bce90c9 | |||
| 82655fd4db | |||
| 9f490d16c3 | |||
| aa44d6fe9c | |||
| 101890ac2a | |||
| 1406ea9c13 | |||
| d02024138f | |||
| 999724dc85 | |||
| a9fd747469 | |||
| 2e45db2efa | |||
| 714709894a | |||
| a80088fe66 | |||
| ba8d39a7c5 | |||
| adf53f07bc | |||
| 77c856b842 | |||
| 64a8c0dee0 | |||
| 42b1a8fcfe | |||
| 1bd98525fa | |||
| e755b7a2b0 | |||
| f4c83b3e96 | |||
| f212d831d1 | |||
| 9d85d67ce8 | |||
| fac186f5c7 | |||
| 7250392d5e | |||
| 7f7f3c4e9e | |||
| ead1bcfeaa | |||
| af69c8d4a7 | |||
| d0f5abf854 | |||
| 866cc3d95d | |||
| a9e6496db2 | |||
| cd15ddea2f | |||
| 15f6dd9211 | |||
| 88367a9219 | |||
| d2c8522ffe | |||
| 23dec225a9 | |||
| 7228868f08 | |||
| 18adf4dfc7 | |||
| 3d86cd3225 | |||
| 66b64b818b | |||
| e826856bea | |||
| 318e9752f2 | |||
| dac20928d4 | |||
| 1c25f06853 | |||
| 34567311d0 | |||
| d8425ac562 | |||
| 61bd28a21c | |||
| fb518ac4ef | |||
| c9999d9b06 | |||
| e729cccf23 | |||
| 4766dea3d5 | |||
| 425804e4b6 | |||
| 6d0161c598 | |||
| 3c3cabc909 | |||
| c3fee55090 | |||
| 6f5cc4da20 | |||
| f140342e2d | |||
| 09a44d13cc | |||
| 67108a8f84 | |||
| 5787796eac | |||
| 2149189394 | |||
| d455cb4f71 | |||
|
|
181b18460e | ||
| e8353f6200 | |||
| 1dce3ab2b1 | |||
| 1a344feaa3 | |||
| 55d9097ca8 | |||
|
|
9a25ae6d63 | ||
|
|
33f33b1f44 | ||
|
|
d441ff40ef | ||
| e90d11682b | |||
| 19cc34d21f | |||
| 9aa1de6a4a | |||
| 0b9e55cfea | |||
| 4669a47d9b | |||
| 6acaa3f796 | |||
| 98880f67ee | |||
| 4fbf0ba72d | |||
| ef669aeb06 | |||
| 5bb77d8b2b | |||
| db9481cffb | |||
| 82ed04008a | |||
| 6ddfbe959e | |||
| 376c88e724 | |||
| b068e46480 | |||
| 84a5cb37d9 | |||
| 1ab8a93b53 | |||
| 3b4b1f2fa9 | |||
| 2b91095391 | |||
| 16001df5be | |||
| a2bdd4bbb8 | |||
| 13ec339f9b | |||
| ebae2b386e | |||
| f47cb17230 | |||
| d0cd45e60e | |||
| 09f22e52c7 | |||
| 3946090dab | |||
| 2033976381 | |||
| d8c88d167f | |||
| f8681826b2 | |||
| ca4eac3af9 | |||
| 6c525bc986 | |||
| c3117dbdcd | |||
| 0e605386cc | |||
| 082dd74bb0 | |||
| 304c8c2ca9 | |||
| a20ade7c52 | |||
| dec0f2667d | |||
| 609adaa960 | |||
| 8967837155 | |||
| fc68777826 | |||
| d1126b3acf | |||
| 9df3b18680 | |||
| a2bd5c35c8 | |||
|
|
33ccd36a14 | ||
|
|
29427a02c6 | ||
|
|
fe9a92fd3f | ||
| cc7fa8333c | |||
| 26831fde6e | |||
| ebbf52dd15 | |||
| fbc8271e86 | |||
| cbfcd17c77 | |||
| 9a281f040e | |||
| b844e3028c | |||
| 891a6e7c64 | |||
| 1018e9dac5 | |||
| d646a03325 | |||
| 81f689cfdf | |||
| 9f862bcfd6 | |||
| cbf167d197 | |||
| 4d19773223 | |||
| 0b70036a02 | |||
| 3b0029ba04 | |||
| e554048f5a | |||
| e59fff352f | |||
| e9d4174b83 | |||
| 90613faf72 | |||
| d92d23bc99 | |||
| 4959736c90 | |||
| 547f34d2ec | |||
| 08788427a8 | |||
| 6d1b177ce9 | |||
| e1a02879d6 | |||
| 97446aa9ef | |||
| 776e6b6736 |
65
.azure-pipelines/templates/jobs/release.yaml
Normal file
65
.azure-pipelines/templates/jobs/release.yaml
Normal file
@ -0,0 +1,65 @@
|
||||
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: releaseTag
|
||||
type: string
|
||||
- name: releaseEndpoint
|
||||
type: string
|
||||
default: 'devfra'
|
||||
values:
|
||||
- 'devfra'
|
||||
- 'prodfra'
|
||||
|
||||
jobs:
|
||||
- job: Release
|
||||
displayName: Release ${{ parameters.releaseTag }}
|
||||
container:
|
||||
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||
endpoint: devfra
|
||||
steps:
|
||||
|
||||
# Download required artifacts from pipeline
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download FraDrive binaries
|
||||
inputs:
|
||||
artifactName: Build_backend
|
||||
patterns: 'Build_backend/bin/*'
|
||||
targetPath: '$(Build.Repository.LocalPath)'
|
||||
|
||||
- task: Docker@2
|
||||
displayName: Login to container registry
|
||||
inputs:
|
||||
command: login
|
||||
containerRegistry: '${{ parameters.releaseEndpoint }}'
|
||||
- task: Bash@3
|
||||
displayName: Build FraDrive container
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
cp docker/fradrive/Dockerfile .
|
||||
docker build \
|
||||
--tag $(buildImageUpstream)/fradrive:$(Build.BuildNumber) \
|
||||
--tag $(buildImageUpstream)/fradrive:${{parameters.releaseTag}} \
|
||||
--build-arg FROM_IMG=devfra.azurecr.io/de.fraport.trusted/ubuntu \
|
||||
--build-arg FROM_TAG=20.04 \
|
||||
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||
--build-arg IN_CI=true \
|
||||
--build-arg IN_CONTAINER=true \
|
||||
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||
.
|
||||
- task: Docker@2
|
||||
displayName: Push container to registry
|
||||
inputs:
|
||||
command: push
|
||||
repository: 'de.fraport.fradrive.build/fradrive'
|
||||
tags: '$(Build.BuildNumber),${{parameters.releaseTag}}'
|
||||
- task: Docker@2
|
||||
displayName: Logout from container registry
|
||||
inputs:
|
||||
command: logout
|
||||
containerRegistry: '${{ parameters.releaseEndpoint }}'
|
||||
61
.azure-pipelines/templates/jobs/setup_dependencies.yaml
Normal file
61
.azure-pipelines/templates/jobs/setup_dependencies.yaml
Normal file
@ -0,0 +1,61 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: serviceName
|
||||
type: string
|
||||
- name: dependenciesCaches
|
||||
type: object
|
||||
default: []
|
||||
- name: dependenciesBuildPool
|
||||
type: string
|
||||
default: 'Prod Private Agent Pool'
|
||||
values:
|
||||
- 'Prod Private Agent Pool'
|
||||
- 'Prod Private Agent Pool DS2'
|
||||
- 'Prod Private Agent Pool DS3'
|
||||
- name: dependenciesBuildCores
|
||||
type: number
|
||||
default: 1
|
||||
- name: dependenciesBuildTimeout
|
||||
type: number
|
||||
default: 60
|
||||
|
||||
jobs:
|
||||
- job: SetupDependencies_${{parameters.serviceName}}
|
||||
displayName: Install ${{parameters.serviceName}} dependencies
|
||||
dependsOn: SetupImage_${{parameters.serviceName}}
|
||||
${{ if eq(variables.setupImages, true) }}:
|
||||
condition: succeeded()
|
||||
${{ else }}:
|
||||
condition: always()
|
||||
pool: '${{parameters.dependenciesBuildPool}}'
|
||||
timeoutInMinutes: ${{parameters.dependenciesBuildTimeout}}
|
||||
container:
|
||||
${{ if variables.setupImages }}:
|
||||
image: $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber)
|
||||
${{ else }}:
|
||||
image: $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||
endpoint: devfra
|
||||
env:
|
||||
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
IN_CONTAINER: true
|
||||
IN_CI: true
|
||||
steps:
|
||||
# Restore previously-built dependencies from caches
|
||||
- ${{ each cache in parameters.dependenciesCaches }}:
|
||||
- template: ./../../steps/cache.yaml
|
||||
parameters:
|
||||
cacheIdent: '${{parameters.serviceName}}-dependencies'
|
||||
cacheKeys: '${{cache.key}}'
|
||||
cachePath: '${{cache.path}}'
|
||||
|
||||
# Compile dependencies
|
||||
- template: ./../../steps/make.yaml
|
||||
parameters:
|
||||
makeJob: dependencies
|
||||
makeService: ${{parameters.serviceName}}
|
||||
makeVars: 'CPU_CORES=${{parameters.dependenciesBuildCores}} STACK_CORES=-j${{parameters.dependenciesBuildCores}}'
|
||||
|
||||
# (Note: a post-job for updating the dependency cache is automatically created, so no further step is due here.)
|
||||
72
.azure-pipelines/templates/jobs/setup_image.yaml
Normal file
72
.azure-pipelines/templates/jobs/setup_image.yaml
Normal file
@ -0,0 +1,72 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: imageName
|
||||
type: string
|
||||
- name: imageBase
|
||||
type: object
|
||||
|
||||
jobs:
|
||||
- job: SetupImage_${{parameters.imageName}}
|
||||
displayName: Build ${{parameters.imageName}} image
|
||||
condition: eq(variables.setupImages, true)
|
||||
container:
|
||||
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||
endpoint: devfra
|
||||
steps:
|
||||
- task: Docker@2
|
||||
displayName: Login to container registry
|
||||
inputs:
|
||||
command: login
|
||||
containerRegistry: devfra
|
||||
- task: Bash@3
|
||||
displayName: Build ${{parameters.imageName}} image
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
cp docker/${{parameters.imageName}}/Dockerfile .
|
||||
docker build \
|
||||
--tag $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber) \
|
||||
--build-arg FROM_IMG=${{parameters.imageBase.image}} \
|
||||
--build-arg FROM_TAG=${{parameters.imageBase.tag}} \
|
||||
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||
--build-arg IN_CI=true \
|
||||
--build-arg IN_CONTAINER=true \
|
||||
.
|
||||
- task: Bash@3
|
||||
displayName: Push ${{parameters.imageName}} image
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker push $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber)
|
||||
- task: Bash@3
|
||||
displayName: Update latest ${{parameters.imageName}} image
|
||||
condition: or(eq(variables.forcePushLatest, true), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker tag $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber) $(buildImageUpstream)/${{parameters.imageName}}:latest
|
||||
docker push $(buildImageUpstream)/${{parameters.imageName}}:latest
|
||||
- task: Bash@3
|
||||
displayName: Save image for publication
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker image save --output=$(Build.ArtifactStagingDirectory)/${{parameters.imageName}}.tar $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber)
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish image as artifact
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: Image_${{parameters.imageName}}
|
||||
publishLocation: 'Container'
|
||||
- task: Docker@2
|
||||
displayName: Logout from container registry
|
||||
inputs:
|
||||
command: logout
|
||||
containerRegistry: devfra
|
||||
141
.azure-pipelines/templates/service.yaml
Executable file
141
.azure-pipelines/templates/service.yaml
Executable file
@ -0,0 +1,141 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: serviceName
|
||||
type: string
|
||||
default: serviceName
|
||||
- name: serviceBase
|
||||
type: object
|
||||
default:
|
||||
image: baseImage
|
||||
tag: baseImageTag
|
||||
- name: servicePool
|
||||
type: string
|
||||
default: 'Prod Private Agent Pool'
|
||||
- name: serviceTimeout
|
||||
type: number
|
||||
default: 60
|
||||
# extraBuildOptions: ''
|
||||
- name: serviceDependsOn
|
||||
type: object
|
||||
default: []
|
||||
- name: serviceRequiredArtifacts
|
||||
type: object
|
||||
default: []
|
||||
- name: serviceArtifacts
|
||||
type: string
|
||||
default: ''
|
||||
- name: buildSteps
|
||||
type: object
|
||||
|
||||
stages:
|
||||
- stage: ${{ parameters.serviceName }}
|
||||
dependsOn: ${{ parameters.serviceDependsOn }}
|
||||
pool: '${{ parameters.servicePool }}'
|
||||
jobs:
|
||||
- job: ImageBuild_${{parameters.serviceName}}
|
||||
displayName: Build ${{parameters.serviceName}} image
|
||||
condition: or(eq(variables.forcePushLatest, true), eq(variables.onMasterBranch, true), eq(variables.onUpdateBranch, true))
|
||||
container:
|
||||
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||
endpoint: devfra
|
||||
steps:
|
||||
- checkout: self
|
||||
- task: Docker@2
|
||||
displayName: Login to container registry
|
||||
inputs:
|
||||
command: login
|
||||
containerRegistry: devFra
|
||||
- script: |
|
||||
ls -a .
|
||||
pwd
|
||||
find .
|
||||
- task: Bash@3
|
||||
displayName: Build ${{parameters.serviceName}} image
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
cp docker/${{parameters.serviceName}}/Dockerfile .
|
||||
docker build \
|
||||
--tag $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber) \
|
||||
--build-arg FROM_IMG=${{parameters.serviceBase.image}} \
|
||||
--build-arg FROM_TAG=${{parameters.serviceBase.tag}} \
|
||||
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||
--build-arg IN_CI=true \
|
||||
--build-arg IN_CONTAINER=true \
|
||||
.
|
||||
- task: Bash@3
|
||||
displayName: Push ${{ parameters.serviceName }} image
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker push $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber)
|
||||
- task: Bash@3
|
||||
displayName: Update latest ${{parameters.serviceName}} image
|
||||
condition: or(eq(variables.forcePushLatest, true), eq(variables.onMasterBranch, true))
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker tag $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber) $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||
docker push $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||
- task: Docker@2
|
||||
displayName: Logout from container registry
|
||||
inputs:
|
||||
command: logout
|
||||
containerRegistry: devFra
|
||||
|
||||
- job: Build_${{parameters.serviceName}}
|
||||
displayName: Build ${{parameters.serviceName}}
|
||||
dependsOn:
|
||||
- ImageBuild_${{parameters.serviceName}}
|
||||
condition: in(dependencies.ImageBuild_${{parameters.serviceName}}.result, 'Succeeded', 'Skipped')
|
||||
timeoutInMinutes: ${{ parameters.serviceTimeout }}
|
||||
container:
|
||||
# TODO: use BuildNumber instead of latest in update branches
|
||||
# image: devfra.azurecr.io/de.fraport.fradrive.build/frontend:$(Build.BuildNumber)
|
||||
image: $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||
endpoint: devfra
|
||||
env:
|
||||
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
IN_CONTAINER: true
|
||||
IN_CI: true
|
||||
steps:
|
||||
- checkout: self
|
||||
- ${{ each dependency in parameters.serviceRequiredArtifacts }}:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download artifacts from ${{ dependency.name }} dependency
|
||||
continueOnError: ${{ dependency.continueOnError }}
|
||||
condition: ${{ dependency.condition }}
|
||||
inputs:
|
||||
artifactName: ${{ dependency.artifact }}
|
||||
source: ${{ dependency.source }}
|
||||
project: 'Fahrerausbildung'
|
||||
pipeline: $(System.DefinitionId)
|
||||
buildVersionToDownload: '${{ dependency.version }}'
|
||||
tags: '${{ dependency.artifact }}'
|
||||
allowPartiallySucceededBuilds: true
|
||||
allowFailedBuilds: true
|
||||
patterns: '${{ dependency.patterns }}'
|
||||
targetPath: '$(Build.Repository.LocalPath)'
|
||||
- ${{ each buildStep in parameters.buildSteps }}:
|
||||
- template: ./service/build-step.yaml
|
||||
parameters:
|
||||
service: ${{ parameters.serviceName }}
|
||||
buildStep: ${{ buildStep }}
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy ${{parameters.serviceName}} artifacts
|
||||
inputs:
|
||||
Contents: ${{ parameters.serviceArtifacts }}
|
||||
TargetFolder: '$(Build.ArtifactStagingDirectory)'
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish ${{parameters.serviceName}} artifacts
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: '${{parameters.serviceName}}'
|
||||
publishLocation: 'Container'
|
||||
15
.azure-pipelines/templates/steps/artifact-download.yaml
Normal file
15
.azure-pipelines/templates/steps/artifact-download.yaml
Normal file
@ -0,0 +1,15 @@
|
||||
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: artifactName
|
||||
type: string
|
||||
|
||||
steps:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download artifacts from ${{parameters.artifactName}}
|
||||
inputs:
|
||||
source: 'current'
|
||||
artifactName: '${{parameters.artifactName}}'
|
||||
targetPath: '$(Build.Repository.LocalPath)'
|
||||
18
.azure-pipelines/templates/steps/cache.yaml
Normal file
18
.azure-pipelines/templates/steps/cache.yaml
Normal file
@ -0,0 +1,18 @@
|
||||
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: cacheIdent
|
||||
type: string
|
||||
- name: cacheKeys
|
||||
type: string
|
||||
- name: cachePath
|
||||
type: string
|
||||
|
||||
steps:
|
||||
- task: Cache@2
|
||||
displayName: Restore ${{parameters.cacheIdent}} cache
|
||||
inputs:
|
||||
key: '"${{parameters.cacheIdent}}" | ${{parameters.cacheKeys}}'
|
||||
path: '${{parameters.cachePath}}'
|
||||
35
.azure-pipelines/templates/steps/make.yaml
Normal file
35
.azure-pipelines/templates/steps/make.yaml
Normal file
@ -0,0 +1,35 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: makeJob
|
||||
type: string
|
||||
values:
|
||||
- dependencies
|
||||
- compile
|
||||
- lint
|
||||
- test
|
||||
- name: makeService
|
||||
type: string
|
||||
values:
|
||||
- frontend
|
||||
- backend
|
||||
- name: makeVars
|
||||
type: string
|
||||
default: ''
|
||||
|
||||
steps:
|
||||
- task: Bash@3
|
||||
name: ${{parameters.makeJob}}_${{parameters.makeService}}
|
||||
displayName: make ${{parameters.makeJob}}-${{parameters.makeService}}
|
||||
env:
|
||||
HTTPS_PROXY: http://proxy.frankfurt-airport.de:8080
|
||||
HTTP_PROXY: http://proxy.frankfurt-airport.de:8080
|
||||
NO_PROXY: 'localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io'
|
||||
FRAPORT_NOPROXY: 'dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de'
|
||||
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
make -- --${{parameters.makeJob}}-${{parameters.makeService}} IN_CONTAINER=true IN_CI=true PROJECT_DIR=${PROJECT_DIR} ${{parameters.makeVars}}
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Felix Hamann <felix.hamann@campus.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
20
.gitignore
vendored
20
.gitignore
vendored
@ -2,9 +2,12 @@
|
||||
dist*
|
||||
develop
|
||||
node_modules/
|
||||
assets/icons
|
||||
assets/favicons
|
||||
.npm/
|
||||
.node_repl_history
|
||||
**/assets/icons
|
||||
**/assets/favicons
|
||||
bin/
|
||||
assets/fonts/
|
||||
*.hi
|
||||
*.o
|
||||
*.sqlite3
|
||||
@ -39,19 +42,19 @@ src/Handler/Assist.bak
|
||||
src/Handler/Course.SnapCustom.hs
|
||||
*.orig
|
||||
/instance
|
||||
backend/instance
|
||||
.stack-work-*
|
||||
.stack-work.lock
|
||||
.directory
|
||||
tags
|
||||
test.log
|
||||
*.dump-splices
|
||||
/.stack-work.lock
|
||||
/.npmrc
|
||||
/.npm/
|
||||
/config/manifest.json
|
||||
tunnel.log
|
||||
/static
|
||||
/well-known
|
||||
/.well-known-cache
|
||||
static
|
||||
well-known
|
||||
.well-known-cache
|
||||
manifest.json
|
||||
/.nix-well-known
|
||||
/**/tmp-*
|
||||
/testdata/bigAlloc_*.csv
|
||||
@ -65,3 +68,4 @@ tunnel.log
|
||||
**/result-*
|
||||
.develop.cmd
|
||||
/.vscode
|
||||
backend/.ghc/ghci_history
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
@ -7,33 +7,33 @@ const standardVersionUpdaterYaml = require.resolve('standard-version-updater-yam
|
||||
module.exports = {
|
||||
scripts: {
|
||||
// postbump: './sync-versions.hs && git add -- package.yaml', // moved to bumpFiles
|
||||
postchangelog: 'sed \'s/^### \\[/## [/g\' -i CHANGELOG.md'
|
||||
postchangelog: 'sed \'s/^### \\[/## [/g\' -i CHANGELOG.md',
|
||||
},
|
||||
packageFiles: ['package.json', 'package.yaml'],
|
||||
bumpFiles: [
|
||||
{
|
||||
filename: 'package.json',
|
||||
type: 'json'
|
||||
type: 'json',
|
||||
},
|
||||
{
|
||||
filename: 'package-lock.json',
|
||||
type: 'json'
|
||||
type: 'json',
|
||||
},
|
||||
{
|
||||
filename: 'package.yaml',
|
||||
updater: standardVersionUpdaterYaml
|
||||
updater: standardVersionUpdaterYaml,
|
||||
},
|
||||
{
|
||||
filename: 'nix/docker/version.json',
|
||||
type: 'json'
|
||||
type: 'json',
|
||||
},
|
||||
{
|
||||
filename: 'nix/docker/demo-version.json',
|
||||
type: 'json'
|
||||
}
|
||||
type: 'json',
|
||||
},
|
||||
],
|
||||
commitUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/{{hash}}',
|
||||
compareUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/{{previousTag}}...{{currentTag}}',
|
||||
issueUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/{{id}}',
|
||||
userUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/{{user}}'
|
||||
userUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/{{user}}',
|
||||
};
|
||||
|
||||
243
CHANGELOG.md
243
CHANGELOG.md
@ -2,6 +2,72 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
## [27.4.59-0.0.20+145-build-system-rewrite](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/27.4.59-0.0.19+145-build-system-rewrite...27.4.59-0.0.20+145-build-system-rewrite) (2025-03-19)
|
||||
|
||||
## [27.4.59-0.0.19+145-build-system-rewrite](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/27.4.59-0.0.18+145-build-system-rewrite...27.4.59-0.0.19+145-build-system-rewrite) (2025-03-17)
|
||||
|
||||
## [27.4.59-0.0.18+145-build-system-rewrite](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-g0.0.17...27.4.59-0.0.18+145-build-system-rewrite) (2025-03-17)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **static:** fix addStaticContent by using memcached again to supply static files ([570cfc2](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/570cfc238bdccd3438124f96290b9272c8e82f0f))
|
||||
|
||||
## [v27.4.59-test-g0.0.17](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.17...v27.4.59-test-g0.0.17) (2025-02-18)
|
||||
|
||||
## [v27.4.59-test-f0.0.17](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-g0.0.16...v27.4.59-test-f0.0.17) (2025-02-17)
|
||||
|
||||
## [v27.4.59-test-g0.0.16](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.16...v27.4.59-test-g0.0.16) (2025-02-16)
|
||||
|
||||
## [v27.4.59-test-f0.0.16](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.15...v27.4.59-test-f0.0.16) (2025-02-16)
|
||||
|
||||
## [v27.4.59-test-f0.0.15](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.15...v27.4.59-test-f0.0.15) (2025-02-15)
|
||||
|
||||
## [v27.4.59-test-e0.0.15](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.14...v27.4.59-test-e0.0.15) (2025-02-14)
|
||||
|
||||
## [v27.4.59-test-f0.0.14](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.14...v27.4.59-test-f0.0.14) (2025-02-14)
|
||||
|
||||
## [v27.4.59-test-e0.0.14](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.13...v27.4.59-test-e0.0.14) (2025-02-13)
|
||||
|
||||
## [v27.4.59-test-e0.0.13](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.12...v27.4.59-test-e0.0.13) (2025-02-12)
|
||||
|
||||
## [v27.4.59-test-e0.0.12](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-d0.0.12...v27.4.59-test-e0.0.12) (2025-02-12)
|
||||
|
||||
## [v27.4.59-test-d0.0.12](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-d0.0.11...v27.4.59-test-d0.0.12) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-d0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-c0.0.11...v27.4.59-test-d0.0.11) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-c0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-b0.0.11...v27.4.59-test-c0.0.11) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-b0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-c0.0.10...v27.4.59-test-b0.0.11) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-c0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-b0.0.10...v27.4.59-test-c0.0.10) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-b0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.10...v27.4.59-test-b0.0.10) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-a0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.9...v27.4.59-test-a0.0.10) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-a0.0.9](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.8...v27.4.59-test-a0.0.9) (2025-02-10)
|
||||
|
||||
## [v27.4.59-test-a0.0.8](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.7...v27.4.59-test-a0.0.8) (2025-02-10)
|
||||
|
||||
## [v27.4.59-test-a0.0.7](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.6...v27.4.59-test-a0.0.7) (2025-02-10)
|
||||
|
||||
## [v27.4.59-test-a0.0.6](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.5...v27.4.59-test-a0.0.6) (2025-02-08)
|
||||
|
||||
## [v27.4.59-test-a0.0.5](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.4...v27.4.59-test-a0.0.5) (2025-02-07)
|
||||
|
||||
## [v27.4.59-test-a0.0.4](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.3...v27.4.59-test-a0.0.4) (2025-02-07)
|
||||
|
||||
## [v27.4.59-test-a0.0.3](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.2...v27.4.59-test-a0.0.3) (2025-02-06)
|
||||
|
||||
## [v27.4.59-test-a0.0.2](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.1...v27.4.59-test-a0.0.2) (2025-02-05)
|
||||
|
||||
## [v27.4.59-test-a0.0.1](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.0...v27.4.59-test-a0.0.1) (2025-02-05)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **ghci:** ghci works now as expected ([c3117db](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/c3117dbdcd1de9ef9f0751afa45018e2ebce2c42))
|
||||
|
||||
## [v27.4.59-test-a0.0.0](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59...v27.4.59-test-a0.0.0) (2024-10-25)
|
||||
|
||||
### Features
|
||||
@ -18,183 +84,6 @@ All notable changes to this project will be documented in this file. See [standa
|
||||
* **Makefile:** add missing dependency on well-known for backend-builds ([a09dc59](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/a09dc59f260843f8815c382576bb5254d21104bf))
|
||||
* **frontend:** fixed icon colour in table headers ([4c4571d](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/4c4571d2d0879e89f2572eba6015d34a7f4794c8))
|
||||
* **doc:** minor haddock problems ([d4f8a6c](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/d4f8a6c77b2a4a4540935f7f0beca0d0605508c8))
|
||||
## [27.4.76](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.75...v27.4.76) (2024-08-08)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **ap:** disambiguate action message ([8b0466e](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/8b0466e74e36e1d0d07518fd317d46b00ab53eff))
|
||||
* **avs:** fix [#173](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/173) by not using firm superior email as display email ([43f5c5f](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/43f5c5f4854d1ab2af27b479e72a58e2818a5696))
|
||||
* **avs:** towards [#117](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/117) update if current value is Nothing even if oldval == newval ([d1fa01f](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d1fa01fcc5125c4adee8849f9c944884926f78ad))
|
||||
* **avs:** using firm superior as UserEmail is a no-go due to uniqueness constraints ([507a7e0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/507a7e02fc68476d01031dc9f9ee1a669a453ed1))
|
||||
* **build:** linter likes it ([f929e03](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f929e03129378e08c8a08ed4bd6f8e8716401813))
|
||||
* **course:** fix [#150](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/150) course edit for associated qualifications requires school admin or lecturer rights ([5b6e4e6](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5b6e4e60e7d2957fbce93ee2e2d6d3464b4e3db7))
|
||||
* **course:** fix [#148](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/148) course qualification ordering ([cfd2534](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/cfd25348ad3b63ac6bc5031467a3c4ead2e07eed)), closes [#150](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/150)
|
||||
* **course:** fix [#149](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/149) course cloning proposes associated qualifications ([e141976](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e1419766f3a06f702abad0ea42f6552305504ba0))
|
||||
* **course:** fix [#150](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/150) no longer allow duplicated associated qualifications and orders due to editing existing ([ec02767](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ec027675525b30198378745ed281f60a42471807))
|
||||
* **course:** WIP course cloning should propose same associated qualifications, towards [#149](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/149) ([bc47387](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/bc47387c91dda60a2f12e52dba28ea7b079316f0))
|
||||
* **lms:** max e-learning tries default removed and info added to lms overview ([11fdcf0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/11fdcf0d445b8cfe97c3a3c26513a9229937c536))
|
||||
* **user:** format userDisplayNames having umlaut substitutes with respect to userSurname correctly ([e35a5e9](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e35a5e99a6cea0976fd1c28f919e7d0ac0338503))
|
||||
|
||||
## [27.4.75](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.74...v27.4.75) (2024-07-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **build:** make linter happy again ([c17c18f](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/c17c18f9247ef322bc051602a3cb4a52cd50affa))
|
||||
* **build:** minor ([ab28c8c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ab28c8c2437680023d80e6ab43113d4328b3a151))
|
||||
* **firm:** fix [#157](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/157) by removing redundant duplicated code in firm user and supervision handling ([28e2739](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/28e2739e515700d15c75647c0efe2fe9a9cf15b1))
|
||||
* **job:** change some queueJob' to queueJob instead ([fa0541a](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/fa0541aa4eaf10f98535a0959593b148b8346109))
|
||||
* **lms:** allow 2nd reminders to be independent of renewal period ([d853e85](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d853e8559b753865ee818bf24764f5c8d2e2303f))
|
||||
* **lms:** move lms reuse info from QualificationR to LmsR ([468af9d](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/468af9de9da44a8ad685ca4bb6890a3e630b58be))
|
||||
* **lms:** send second reminder indepentently from renewal period ([a97c3a5](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/a97c3a5c9d3cb9dddf90f561712f0845400893bd))
|
||||
* **nix:** workaround parsing port numbers failed in nix-shell ([b5215cc](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/b5215cc7e8df3a7ad636271c8e6950979b2b8e42))
|
||||
* **users:** nameHtml no longer complains about differing case for surname and displayname ([a1668f8](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/a1668f891a36b887439afb098f016ef22535af42))
|
||||
* **users:** remove users with company post address from list of unreachable users ([c813c66](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/c813c665ed306135b7813d91d23310341c689f41))
|
||||
|
||||
## [27.4.74](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.73...v27.4.74) (2024-07-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **lms:** fix [#161](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/161) lms for multiple joint qualifications ([f869a82](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f869a829d2c1a726930864b3af62d1f0fbebe955))
|
||||
|
||||
## [27.4.73](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.72...v27.4.73) (2024-07-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **letter:** rephrase some minor letter parts ([0ac75e0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/0ac75e0d5948cb90855d0e36ca8e99c22a0f6fcb))
|
||||
|
||||
## [27.4.72](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.71...v27.4.72) (2024-07-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** do not associate users by AvsInfoPersonEmail ([9e2f221](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/9e2f2214ce5c7ee1e8d80e6fa75298b7a70d9043))
|
||||
* **avs:** fix superfluous quotes for matriculation numbers on newly created users ([ff9014c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ff9014ce05d197c1dc0fce0774a640789cb38b26))
|
||||
* **avs:** towards [#169](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/169) - superiors are elevated to max priority for that company ([5bf8539](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5bf85394d4db6de8f10b4e318d667130d37601ac))
|
||||
* **firm:** supervisor secondary did not work as intended ([d4f3ce7](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d4f3ce7bf3d208b16f95ab81971b47dfa752939a))
|
||||
|
||||
## [27.4.71](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.70...v27.4.71) (2024-06-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** company superior emails become company wide supervisors ([37efc89](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/37efc89e0723452e6d271ba5b43d6bd026642190))
|
||||
* **avs:** match mobile number better between LDAP and AVS ([f108c6c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f108c6cfec2d94d866e7c1605b0abe5471fd0f2b))
|
||||
* **avs:** new AVS from existing LDAP user no longer misses fields ([2559346](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/2559346d963ede802321dfc8cbd2088d9a5de685))
|
||||
* **avs:** priority for picking primary email demote superior ([e4fa1dd](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e4fa1ddd6873910bef82d569fe16aca936efc567))
|
||||
* **build:** add missing license file ([8721bdb](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/8721bdb3f349658baab144d64c19942bfd7fa49a))
|
||||
* **build:** hlint wants a newtype instead ([18cdc52](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/18cdc52df094b9dbccd4f015561367cea59e33fe))
|
||||
* **doc:** fix erroneous unintentional haddock annotations ([3dfc7f8](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/3dfc7f8c8b12dd6ef87848a75f1669d700fffe4c))
|
||||
* **i18n:** add missing translation for new primary company ([c212f2e](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/c212f2e8d735616e59c9b8111a34118e3a48fd47))
|
||||
* **i18n:** add missing translation for new primary company ([2cc529b](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/2cc529be39655c317ca028f8f09fa80826ec668d))
|
||||
* **ldap:** match mobile number better between LDAP and AVS ([47e5628](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/47e56280fce4ad37e6bc3b9f1c61cb7867069cc5))
|
||||
* **letter:** adjust spacing, pin location and interpolation ([d4a0e1f](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d4a0e1f201151f76e8e9afd67b456cc878d2afde))
|
||||
* **letter:** convenience links working again ([5f1af13](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5f1af130edae7ada2f0c7f7829890bbe0d4f395a))
|
||||
* **letter:** expiry and valid dates were wrong ([f8c3663](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f8c36636ff1f2591507e993af32ed01af94cf1fc))
|
||||
* **letter:** switch markdown for renewal letter too ([c38e87e](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/c38e87e1e0e9285a10c00521b7440cd8246af88a))
|
||||
* **print:** fix [#167](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/167) by sotring affected user in PrintJob ([73aecc2](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/73aecc2df833bdeed93a113b6c756e36b50491b7))
|
||||
|
||||
## [27.4.70](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.69...v27.4.70) (2024-06-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **build:** hlint wants a newtype instead ([0766351](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/07663516e520814e26740d671325b7cd10855dd4))
|
||||
|
||||
## [27.4.69](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.68...v27.4.69) (2024-06-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** fix type causing avs surname upate not working ([822c43c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/822c43c8a7db2086954ad187502ec2c4f1811d17))
|
||||
* **avs:** keep company on unchange address/email only if either is non-empty ([766b858](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/766b8589d6945df21fc6ce90d35a004655ffa471))
|
||||
* **avs:** synch job deletes used row instead of truncation ([d7acc7a](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d7acc7a2d0fe5fc18929a8cb2d9c9f8a259c9944))
|
||||
|
||||
## [27.4.68](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.67...v27.4.68) (2024-06-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **letter:** minor ([2ae11dc](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/2ae11dc25c000486af9acc26439a0580f5c687f2))
|
||||
|
||||
## [27.4.67](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.66...v27.4.67) (2024-06-17)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** fix rare avs update bug involving values optional in avs but compulsory in user entity ([a6d0105](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/a6d0105903caba0eb47715eeb217ea2c53d99e23))
|
||||
|
||||
## [27.4.66](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.65...v27.4.66) (2024-06-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** fix [#164](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/164) by removing companyPersonalNumber and companyDepartment upon ldap sync expiry ([da74b95](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/da74b957295caefb010c90297af557f997b18e7c))
|
||||
* **avs:** fix [#165](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/165) by updating userCompanyDepartmen and userCompanyPersonalNumer ([76e0710](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/76e0710c7b54a40d2c236299ea4fabd009d3f35a))
|
||||
* **avs:** repeated avs sync enqueue no longe violates duplicate db uniqueness constraints ([996e6a0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/996e6a0ce563bda96638863efd40ce38fce8ac2b))
|
||||
* **avs:** update email on manual company switch ([9fd80f2](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/9fd80f25526eefce217c659f6ea2991771c11ece)), closes [#164](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/164)
|
||||
|
||||
## [27.4.65](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.64...v27.4.65) (2024-06-10)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** company update no longer fails on duplicate key ([bb101de](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/bb101dee7b40cd3d8ba10a559af642396d5b87b5))
|
||||
* **avs:** profile page correctly indicates automatic email and postal addresses ([e553ad4](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e553ad4358a71fc96fa946533f0441d4af5202c9))
|
||||
* **avs:** steps towards [#164](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/164) ([aa1d230](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/aa1d230e497f0e59dbea9f4fd5c7da773f5a4280))
|
||||
* **lette:** adjust window for new pin letters ([6acfd84](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6acfd849aeb473a018f7a9c34e69f61b3c22b6f8))
|
||||
|
||||
## [27.4.64](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.63...v27.4.64) (2024-05-27)
|
||||
|
||||
## [27.4.63](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.62...v27.4.63) (2024-05-23)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** company update checks uniques and ignores those updates if necessary ([9451d90](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/9451d90a9e00d08a2a7d169c4674d99ff1018ee9))
|
||||
|
||||
## [27.4.62](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.61...v27.4.62) (2024-05-19)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** avs update on company shorthands working now ([ff2347b](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ff2347b1c950c7a2bb281cdcd07a52925e23b9f0))
|
||||
* **avs:** deal gracefully with empty card status results ([ccf9340](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ccf934044938277d821eb4b9ea08a8a134e84189))
|
||||
|
||||
## [27.4.61](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.60...v27.4.61) (2024-05-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** fix [#76](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/76) allowing company changes and fix [#69](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/69) ([3c4a0b8](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/3c4a0b86c1e3d8a28405ab73b964ba1b988d2822))
|
||||
* **build:** add missing tex packages ([6750798](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6750798920dc76882f4e8ef39b47018fb7b77e44))
|
||||
* **build:** workaround non modal form result handler ([2fbd281](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/2fbd28154cd7aea282eaa2604a42263ac90e3b1e))
|
||||
|
||||
## [27.4.60](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.59...v27.4.60) (2024-04-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **avs:** disable caching by 0s no longer causes an exception ([d578e80](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d578e80282c8bf6872fa6040514a9d2c85582707))
|
||||
* **avs:** fix [#152](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/152) by providing new online avs card filter throughout ([ad2375b](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ad2375b338866f37c8b7825a9eab12fa6c9abccb))
|
||||
* **avs:** fix [#36](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/36) and remove dead code ([4f8850b](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4f8850b3b4f710f9cf59163175b27599c97ac5c0))
|
||||
* **avs:** fix [#69](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/69) by redesigning live avs status page ([697979c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/697979c277ce7198f4573d6cea30373a1fcc17da))
|
||||
* **avs:** invalidate contact cache after licence writes ([c382be9](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/c382be9325fcc92e13cb5dc2ad7c20b198db26fc))
|
||||
* **avs:** several minor bugfixes ([a52c8a6](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/a52c8a6ad709029a8822d383370b0d2bdd25e7d7)), closes [#158](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/158)
|
||||
* **build:** add import needed for production only ([724e4a0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/724e4a0bec343ab9c6d172d8e93b8040bbe3fe7d))
|
||||
* **build:** migration needs to check for table existens first ([f439ea4](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f439ea45af9b1c4a029fc1b9b6383f3c97194ed0))
|
||||
* **build:** minor error non-development code ([66eaa4f](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/66eaa4f7dcc124b631414d4a1adbe555a4029100))
|
||||
* **build:** missing parameters added ([83afdf7](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/83afdf760f93fc1a553de3a122b444412ed84ba4))
|
||||
* **build:** simple type error ([d56a1cd](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d56a1cdd46259418faa737b9bb0a9d9ffba442e0))
|
||||
* **build:** type error in test db fill data ([f465cc9](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f465cc972367233a4944dd0aeb81b223a187bb85))
|
||||
* **doc:** minor haddock problems ([d4f8a6c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d4f8a6c77b2a4a4540935f7f0beca0d0605508c8))
|
||||
* **firm:** supervisor filter acts weird in test environment ([b566e59](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/b566e59eb1325485fe26dc4f0b5cb63165c58f74))
|
||||
* **i18n:** fix some bad plurals ([890f8ad](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/890f8ad8b60115533faa6b99f4c4504243cbfb1d))
|
||||
* **lint:** remove minor superfluous dollar ([64a1233](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/64a123387f3539b73649d02a6ecd97de577097e6))
|
||||
* **qualification:** fix [#159](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/159) by removing an misleadingly named column for user qualification table ([fd6a538](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/fd6a5384d3517958a3c7726e32eed3bad197a591))
|
||||
|
||||
## [27.4.59](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.58...v27.4.59) (2024-02-13)
|
||||
|
||||
|
||||
459
Makefile
459
Makefile
@ -1,400 +1,123 @@
|
||||
|
||||
export SHELL=bash
|
||||
|
||||
# MAKE=make -f Makefile-loggingsymbols
|
||||
# MAKE=make -d
|
||||
|
||||
# System information
|
||||
export CPU_CORES = $(shell cat /proc/cpuinfo | grep '^processor' | wc -l)
|
||||
|
||||
export CONTAINER_COMMAND ?= podman
|
||||
export CONTAINER_BGRUN ?= $(CONTAINER_COMMAND) run -dit --network=host --replace
|
||||
export CONTAINER_FGRUN ?= $(CONTAINER_COMMAND) run -it --network=host --replace
|
||||
|
||||
export IMAGE_REGISTRY = docker.io
|
||||
export MEMCACHED_IMAGE = $(IMAGE_REGISTRY)/memcached:latest
|
||||
export MINIO_IMAGE = $(IMAGE_REGISTRY)/minio/minio:latest
|
||||
export MAILDEV_IMAGE = $(IMAGE_REGISTRY)/maildev/maildev:latest # TODO: needs different port than 1025 to avoid conflicts
|
||||
|
||||
export IN_CONTAINER ?= false
|
||||
export IN_CI ?= false
|
||||
export CONTAINER_FILE
|
||||
export CONTAINER_IDENT
|
||||
export CF_PREFIX
|
||||
export DEVELOP
|
||||
export MOUNT_DIR=/mnt/fradrive
|
||||
export CONTAINER_ATTACHED
|
||||
export CONTAINER_INIT
|
||||
export CONTAINER_CLEANUP
|
||||
|
||||
# export STACK_INIT="./utils/stack-work-init.sh"
|
||||
# export STACK_CLEANUP="rm -f .stack-work.lock"
|
||||
|
||||
export SERVICE
|
||||
export SERVICE_VARIANT ?= $(SERVICE)
|
||||
export JOB
|
||||
export CONTAINER_CMD
|
||||
export SET_CONTAINER_CMD
|
||||
export ENTRYPOINT
|
||||
export EXEC_OPTS
|
||||
|
||||
export STACK_CORES = $(shell echo $(($(CPU_CORES)/2)))
|
||||
export BASE_PORTS
|
||||
export UNIWORXDB_OPTS ?= -cf
|
||||
export PROD ?= false
|
||||
|
||||
ifneq ($(PROD),true)
|
||||
export --DEVELOPMENT=--flag uniworx:dev
|
||||
endif
|
||||
|
||||
export DATE := $(shell date +'%Y-%m-%dT%H-%M-%S')
|
||||
|
||||
export CURR_DEV = $(shell cat develop/.current 2>/dev/null)
|
||||
export SET_DEVELOP = $(eval DEVELOP=develop/$$(CURR_DEV))
|
||||
export NEW_DEVELOP = $(eval DEVELOP=develop/$$(DATE))
|
||||
export CLEAN_DEPENDENCIES ?= false
|
||||
export CLEAN_IMAGES ?= false
|
||||
|
||||
export ENTRYPOINT ?= bash
|
||||
export SRC
|
||||
|
||||
.PHONY: help
|
||||
# HELP: print out this help message
|
||||
help:
|
||||
@if [ -z "$$(which perl 2>/dev/null)" ] ; then \
|
||||
$(CONTAINER_FGRUN) .:/mnt 'debian:12.5' '/mnt/utils/makehelp.pl' '/mnt/Makefile' ; \
|
||||
else \
|
||||
utils/makehelp.pl Makefile ; \
|
||||
fi
|
||||
docker compose run help
|
||||
|
||||
.PHONY: clean
|
||||
# HELP: stop all running containers and remove all compilation results in the directory (but leave images including dependencies unharmed)
|
||||
# HELP: clean compilation caches
|
||||
clean:
|
||||
rm -rf develop
|
||||
-rm -rf node_modules .npm .cache assets/icons assets/favicons static well-known config/manifest.json
|
||||
-rm -rf .job-*
|
||||
-rm -rf bin .Dockerfile develop
|
||||
-$(CONTAINER_COMMAND) container prune --force
|
||||
$(MAKE) clean-frontend CLEAN_DEPENDENCIES=$(CLEAN_DEPENDENCIES) CLEAN_IMAGES=$(CLEAN_IMAGES)
|
||||
$(MAKE) clean-backend CLEAN_DEPENDENCIES=$(CLEAN_DEPENDENCIES) CLEAN_IMAGES=$(CLEAN_IMAGES)
|
||||
.PHONY: clean-all
|
||||
# HELP: like clean but with full container, image, and volume prune
|
||||
clean-all: clean
|
||||
-rm -rf .stack
|
||||
-$(CONTAINER_COMMAND) system prune --all --force --volumes
|
||||
-$(CONTAINER_COMMAND) image prune --all --force
|
||||
-$(CONTAINER_COMMAND) volume prune --force
|
||||
# HELP: clean everything, including dependency and image caches
|
||||
clean-all: CLEAN_DEPENDENCIES = true
|
||||
clean-all: CLEAN_IMAGES = true
|
||||
clean-all: clean ;
|
||||
|
||||
.PHONY: clean-%
|
||||
# HELP(clean-$SERVICE): invalidate caches for a given service. Supported services: frontend, backend.
|
||||
clean-%:
|
||||
$(MAKE) stop-$*
|
||||
@$(MAKE) -- --clean-$*
|
||||
@echo "Cleaned $* build files and binaries."
|
||||
ifeq ("$(CLEAN_DEPENDENCIES)", "true")
|
||||
@$(MAKE) -- --clean-$*-deps
|
||||
@echo "Cleaned $* dependencies."
|
||||
endif
|
||||
ifeq ("$(CLEAN_IMAGES)", "true")
|
||||
$(MAKE) kill-$*
|
||||
docker compose rm --force --volumes
|
||||
docker compose down --rmi 'all' --volumes
|
||||
@echo "Cleaned $* image."
|
||||
endif
|
||||
--clean-frontend:
|
||||
-rm -rf assets/icons assets/favicons
|
||||
-rm -rf static well-known
|
||||
--clean-frontend-deps:
|
||||
-rm -rf frontend/node_modules
|
||||
-rm -rf frontend/.npm
|
||||
--clean-backend:
|
||||
-rm -rf backend/.stack-work
|
||||
-rm -rf bin/
|
||||
--clean-backend-deps:
|
||||
-rf -rf backend/.stack
|
||||
|
||||
|
||||
# TODO: only release when build and tests are passing!!!
|
||||
.PHONY: release
|
||||
# HELP: create, commit and push a new release
|
||||
release:
|
||||
./.gitlab-ci/version.pl -changelog CHANGELOG.md
|
||||
git add CHANGELOG.md
|
||||
VERSION=`.gitlab-ci/version.pl`
|
||||
git tag $${VERSION}
|
||||
git commit -m "chore(release): $${VERSION}"
|
||||
# git push
|
||||
VERSION=`./utils/version.pl -changelog CHANGELOG.md -v` ; \
|
||||
git add CHANGELOG.md ; \
|
||||
git commit -m "chore(release): $${VERSION}" ; \
|
||||
git push ; \
|
||||
git tag $${VERSION} ; \
|
||||
git push origin $${VERSION}
|
||||
|
||||
.PHONY: compile
|
||||
compile:
|
||||
$(MAKE) compile-frontend
|
||||
$(MAKE) compile-backend
|
||||
# HELP: perform full compilation (frontend and backend)
|
||||
compile: compile-frontend compile-backend ;
|
||||
.PHONY: compile-%
|
||||
# HELP(compile-$SERVICE): compile a given service once
|
||||
compile-%:
|
||||
docker compose run --remove-orphans --build --no-deps $* make compile
|
||||
|
||||
.PHONY: start
|
||||
start:
|
||||
$(MAKE) start-postgres
|
||||
$(MAKE) start-memcached
|
||||
$(MAKE) start-minio
|
||||
$(MAKE) start-frontend
|
||||
$(MAKE) start-backend
|
||||
|
||||
.PHONY: %-backend
|
||||
%-backend: SERVICE=backend
|
||||
%-backend: SERVICE_VARIANT=backend
|
||||
%-backend: CONTAINER_CMD=localhost/fradrive/backend
|
||||
# %-backend: CONTAINER_INIT="$(STACK_INIT)"
|
||||
# %-backend: CONTAINER_CLEANUP="$(STACK_CLEANUP)"
|
||||
%-backend: BASE_PORTS = "DEV_PORT_HTTP=3000" "DEV_PORT_HTTPS=3443"
|
||||
|
||||
.PHONY: %-uniworxdb
|
||||
%-uniworxdb: SERVICE=backend
|
||||
%-uniworxdb: SERVICE_VARIANT=uniworxdb
|
||||
%-uniworxdb: CONTAINER_CMD=localhost/fradrive/backend
|
||||
# %-uniworxdb: CONTAINER_INIT="$(STACK_INIT)"
|
||||
# %-uniworxdb: CONTAINER_CLEANUP="$(STACK_CLEANUP)"
|
||||
|
||||
.PHONY: %-hoogle
|
||||
%-hoogle: SERVICE=backend
|
||||
%-hoogle: SERVICE_VARIANT=hoogle
|
||||
%-hoogle: BASE_PORTS = "HOOGLE_PORT=8081"
|
||||
%-hoogle: CONTAINER_CMD=localhost/fradrive/backend
|
||||
# %-hoogle: CONTAINER_INIT="$(STACK_INIT)"
|
||||
# %-hoogle: CONTAINER_CLEANUP="$(STACK_CLEANUP)"
|
||||
--start-hoogle:
|
||||
HOOGLE_PORT=`cat $(CONTAINER_FILE) | grep 'HOOGLE_PORT=' | sed 's/HOOGLE_PORT=//'` ; \
|
||||
stack $(STACK_CORES) hoogle -- server --local --port $${HOOGLE_PORT}
|
||||
|
||||
.PHONY: %-frontend
|
||||
%-frontend: SERVICE=frontend
|
||||
%-frontend: SERVICE_VARIANT=frontend
|
||||
%-frontend: CONTAINER_CMD=localhost/fradrive/frontend
|
||||
|
||||
.PHONY: %-postgres
|
||||
%-postgres: SERVICE=postgres
|
||||
%-postgres: SERVICE_VARIANT=postgres
|
||||
%-postgres: BASE_PORTS = "PGPORT=5432"
|
||||
%-postgres: CONTAINER_CMD=localhost/fradrive/postgres
|
||||
|
||||
.PHONY: %-memcached
|
||||
%-memcached: SERVICE=memcached
|
||||
%-memcached: SERVICE_VARIANT=memcached
|
||||
%-memcached: SET_CONTAINER_CMD=$$(MEMCACHED_IMAGE) --port=`cat $$(CONTAINER_FILE) | grep 'MEMCACHED_PORT=' | sed 's/MEMCACHED_PORT=//'`
|
||||
%-memcached: BASE_PORTS = "MEMCACHED_PORT=11211"
|
||||
|
||||
.PHONY: %-minio
|
||||
%-minio: SERVICE=minio
|
||||
%-minio: SERVICE_VARIANT=minio
|
||||
%-minio: SET_CONTAINER_CMD=$$(MINIO_IMAGE) -- server `mktemp` --address=:`cat $$(CONTAINER_FILE) | grep 'UPLOAD_S3_PORT=' | sed 's/UPLOAD_S3_PORT=//'`
|
||||
%-minio: BASE_PORTS = "UPLOAD_S3_PORT=9000"
|
||||
|
||||
# HELP: start complete development environment with a fresh test database
|
||||
start: start-postgres start-maildev start-memcached start-minio start-backend
|
||||
docker compose exec backend make start
|
||||
.PHONY: start-%
|
||||
start-%: JOB=start
|
||||
start-%: CF_PREFIX = start-
|
||||
start-%: CONTAINER_ATTACHED = false
|
||||
start-%: --act ;
|
||||
|
||||
.PHONY: compile-%
|
||||
compile-%: JOB=compile
|
||||
compile-%: CF_PREFIX = compile-
|
||||
compile-%: CONTAINER_ATTACHED = true
|
||||
compile-%: --act ;
|
||||
|
||||
.PHONY: dependencies-%
|
||||
dependencies-%: JOB=dependencies
|
||||
dependencies-%: CF_PREFIX = dependencies-
|
||||
dependencies-%: CONTAINER_ATTACHED = true
|
||||
dependencies-%: --act ;
|
||||
|
||||
.PHONY: test-%
|
||||
test-%: JOB=test
|
||||
test-%: CF_PREFIX = test-
|
||||
test-%: CONTAINER_ATTACHED = true
|
||||
test-%: --act ;
|
||||
|
||||
.PHONY: lint-%
|
||||
lint-%: JOB=lint
|
||||
lint-%: CF_PREFIX = lint-
|
||||
lint-%: CONTAINER_ATTACHED = true
|
||||
lint-%: --act ;
|
||||
|
||||
--act: --develop_containerized;
|
||||
|
||||
--develop_%: PORTS = $(foreach PORT,$(BASE_PORTS),$(shell utils/next_free_port.pl $(PORT)))
|
||||
--develop_%: --ensure-develop
|
||||
DEVELOP=develop/`cat develop/.current` ; \
|
||||
CONTAINER_IDENT=$(CF_PREFIX)$(SERVICE_VARIANT) ; \
|
||||
CONTAINER_FILE=$${DEVELOP}/$${CONTAINER_IDENT} ; \
|
||||
if [[ -e $${CONTAINER_FILE} ]]; then \
|
||||
>&2 echo "Another $* service is already running! Use \"make new-develop\" to start a new develop instance despite currently running services." ; \
|
||||
exit 1 ; \
|
||||
fi ; \
|
||||
echo "$(PORTS)" | sed 's/ /\n/g' > $${CONTAINER_FILE} ; \
|
||||
$(MAKE) -- --$* CONTAINER_FILE=$${CONTAINER_FILE} CONTAINER_IDENT=$${CONTAINER_IDENT} JOB=$(JOB)
|
||||
|
||||
.PHONY: rebuild-%
|
||||
# HELP(rebuild-{backend,frontend,database,memcached,minio}): force-rebuild the stated docker image
|
||||
rebuild-%:
|
||||
$(MAKE) -- --image-build SERVICE=$* NO_CACHE=--no-cache
|
||||
--image-build:
|
||||
ifeq "$(CONTAINER_CMD)" "localhost/fradrive/$(SERVICE)"
|
||||
rm -f .Dockerfile
|
||||
ln -s docker/$(SERVICE)/Dockerfile .Dockerfile
|
||||
$(MAKE) .job-$(JOB)
|
||||
MOUNT_DIR=/mnt/fradrive; \
|
||||
PROJECT_DIR=/mnt/fradrive; \
|
||||
if [ "$(IN_CI)" == "true" ] ; then \
|
||||
PROJECT_DIR=/fradrive; \
|
||||
fi; \
|
||||
if [ "$(IN_CONTAINER)" == "false" ] ; then \
|
||||
$(CONTAINER_COMMAND) build $(NO_CACHE) \
|
||||
-v $(PWD):$${MOUNT_DIR} \
|
||||
--build-arg MOUNT_DIR=$(MOUNT_DIR) \
|
||||
--build-arg PROJECT_DIR=$${PROJECT_DIR} \
|
||||
--env IN_CONTAINER=true \
|
||||
--env JOB=$(JOB) \
|
||||
--tag fradrive/$(SERVICE) \
|
||||
--file $(PWD)/.Dockerfile ; \
|
||||
fi
|
||||
else
|
||||
:
|
||||
endif
|
||||
|
||||
--containerized:
|
||||
$(MAKE) .job-$(JOB)
|
||||
$(MAKE) -- --image-build
|
||||
DEVELOP=`cat develop/.current` ; \
|
||||
./utils/watchcontainerrun.sh "$(CONTAINER_COMMAND)" "$(CONTAINER_FILE)" "$(CONTAINER_INIT)" "$(CONTAINER_CLEANUP)" & \
|
||||
CONTAINER_NAME=fradrive.$(CURR_DEV).$(CONTAINER_IDENT) ; \
|
||||
if ! [ -z "$(SET_CONTAINER_CMD)" ] ; \
|
||||
then \
|
||||
CONTAINER_CMD="$(SET_CONTAINER_CMD)" ; \
|
||||
else \
|
||||
CONTAINER_CMD=$(CONTAINER_CMD) ; \
|
||||
fi ; \
|
||||
CONTAINER_ID=`$(CONTAINER_BGRUN) \
|
||||
-v $(PWD):$(MOUNT_DIR) \
|
||||
--env IN_CONTAINER=true \
|
||||
--env FRADRIVE_MAKE_TARGET="--$(JOB)-$(SERVICE_VARIANT)" \
|
||||
--env CONTAINER_FILE=$(CONTAINER_FILE) \
|
||||
--env CONTAINER_NAME=$${CONTAINER_NAME} \
|
||||
--env JOB=$(JOB) \
|
||||
--name $${CONTAINER_NAME} \
|
||||
$${CONTAINER_CMD} \
|
||||
` ; \
|
||||
printf "CONTAINER_ID=$${CONTAINER_ID}" >> "$(CONTAINER_FILE)" ; \
|
||||
if [[ "true" == "$(CONTAINER_ATTACHED)" ]] ; then \
|
||||
$(CONTAINER_COMMAND) attach $${CONTAINER_ID} || : ; \
|
||||
fi
|
||||
|
||||
# HELP(start-backend): start yesod-devel instance
|
||||
--start-backend:
|
||||
export DEV_PORT_HTTP=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTP=' | sed 's/DEV_PORT_HTTP=//'`; \
|
||||
export DEV_PORT_HTTPS=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTPS=' | sed 's/DEV_PORT_HTTPS=//'`; \
|
||||
export HOST=`hostname -s` ; \
|
||||
export DETAILED_LOGGING=$${DETAILED_LOGGING:-true} ; \
|
||||
export LOG_ALL=$${LOG_ALL:-false} ; \
|
||||
export LOGLEVEL=$${LOGLEVEL:-info} ; \
|
||||
export DUMMY_LOGIN=$${DUMMY_LOGIN:-true} ; \
|
||||
export SERVER_SESSION_ACID_FALLBACK=$${SERVER_SESSION_ACID_FALLBACK:-true} ; \
|
||||
export SERVER_SESSION_COOKIES_SECURE=$${SERVER_SESSION_COOKIES_SECURE:-false} ; \
|
||||
export COOKIES_SECURE=$${COOKIES_SECURE:-false} ; \
|
||||
export ALLOW_DEPRECATED=$${ALLOW_DEPRECATED:-true} ; \
|
||||
export ENCRYPT_ERRORS=$${ENCRYPT_ERRORS:-false} ; \
|
||||
export RIBBON=$${RIBBON:-$${HOST:-localhost}} ; \
|
||||
export APPROOT=$${APPROOT:-http://localhost:$${DEV_PORT_HTTP}} ; \
|
||||
export AVSPASS=$${AVSPASS:-nopasswordset} ; \
|
||||
stack $(STACK_CORES) exec --local-bin-path $$(pwd)/bin -- yesod devel -p "$${DEV_PORT_HTTP}" -q "$${DEV_PORT_HTTPS}"
|
||||
# HELP(compile-backend): compile backend binaries
|
||||
--compile-backend:
|
||||
stack build $(STACK_CORES) --fast --profile --library-profiling --executable-profiling --flag uniworx:-library-only $(--DEVELOPMENT) --local-bin-path $$(pwd)/bin
|
||||
# HELP(dependencies-backend): (re-)build backend dependencies
|
||||
--dependencies-backend: stack.yaml stack.yaml.lock package.yaml
|
||||
stack build $(STACK_CORES) --fast --only-dependencies
|
||||
# HELP(lint-backend): lint backend
|
||||
--lint-backend:
|
||||
stack build $(STACK_CORES) --test --fast --flag uniworx:library-only $(--DEVELOPMENT) uniworx:test:hlint
|
||||
# HELP(test-backend): test backend
|
||||
--test-backend:
|
||||
stack build $(STACK_CORES) --test --coverage --fast --flag uniworx:library-only $(--DEVELOPMENT)
|
||||
.PHONY: .job-%
|
||||
.job-%:
|
||||
./utils/dirsymlink.pl ".job-$*" .stack-work
|
||||
|
||||
# HELP(compile-frontend): compile frontend assets
|
||||
--compile-frontend: node_modules assets esbuild.config.mjs
|
||||
npm run build
|
||||
--start-frontend: --compile-frontend;
|
||||
--dependencies-frontend: node_modules assets static well-known;
|
||||
node_modules: package.json package-lock.json
|
||||
npm ci --cache .npm --prefer-offline
|
||||
package-lock.json: package.json
|
||||
npm install --cache .npm --prefer-offline
|
||||
assets: assets/favicons assets/icons;
|
||||
assets/favicons:
|
||||
./utils/faviconize.pl assets/favicon.svg long assets/favicons
|
||||
assets/icons: node_modules assets/icons-src/fontawesome.json
|
||||
./utils/renamer.pl node_modules/@fortawesome/fontawesome-free/svgs/solid assets/icons-src/fontawesome.json assets/icons/fradrive
|
||||
./utils/renamer.pl node_modules/@fortawesome/fontawesome-free/svgs/regular assets/icons-src/fontawesome.json assets/icons/fradrive
|
||||
-cp assets/icons-src/*.svg assets/icons/fradrive
|
||||
static: node_modules assets esbuild.config.mjs
|
||||
npm run build
|
||||
well-known: static;
|
||||
|
||||
# HELP(compile-uniworxdb): clear and fill database. requires running postgres
|
||||
# TODO (db-m-$MIGRATION-backend): apply migration (see src/Model/Migration/Definition.hs for list of available migrations)
|
||||
--compile-uniworxdb: --compile-backend
|
||||
SERVER_SESSION_ACID_FALLBACK=${SERVER_SESSION_ACID_FALLBACK:-true} ; \
|
||||
AVSPASS=${AVSPASS:-nopasswordset} ; \
|
||||
stack exec uniworxdb -- $(UNIWORXDB_OPTS)
|
||||
|
||||
# HELP(start-minio): start minio service
|
||||
|
||||
.PHONY: status
|
||||
# HELP: print develop status: running containers, used ports
|
||||
status:
|
||||
@./utils/develop-status.pl -a
|
||||
|
||||
.PHONY: log-%
|
||||
# HELP(log-$(JOB)-$(SERVICE)): inspect output of a given service. The service must be currently running When a service supports multiple running instances in one develop (i.e. backend), you need to specify the exact instance by its associated file (e.g. backend-1, backend-2, etc.), please check the contents of the develop/ directory for a list of running instances.
|
||||
log-%:
|
||||
DEVELOP=develop/`cat develop/.current` ; \
|
||||
SEARCH_FILE="$${DEVELOP}/$*" ; \
|
||||
if [[ ! -e "$${SEARCH_FILE}" ]] ; then \
|
||||
SEARCH_FILE="$${DEVELOP}/.exited.$*" ; \
|
||||
fi ; \
|
||||
if [[ -e "$${SEARCH_FILE}" ]] ; then \
|
||||
$(CONTAINER_COMMAND) logs --follow `cat "$${SEARCH_FILE}" | grep CONTAINER_ID= | sed 's/^CONTAINER_ID=//'` ; \
|
||||
else \
|
||||
>&2 echo "Cannot show log: No develop file found for '$*'" ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
|
||||
.PHONY: enter
|
||||
# HELP: launch (bash) shell inside a currently running container. Use ./enter shell wrapper for more convenient usage, possibly with tab-completion in the future
|
||||
enter: --ensure-develop
|
||||
$(MAKE) -- --shell
|
||||
|
||||
.PHONY: psql
|
||||
# HELP: enter psql (postgresql) cli inside a currently running database container
|
||||
psql: ENTRYPOINT=/usr/bin/psql -d uniworx
|
||||
psql: EXEC_OPTS=--user postgres
|
||||
psql: --ensure-develop
|
||||
$(MAKE) -- --shell CONTAINER_FILE=develop/`cat develop/.current`/start-postgres
|
||||
# HELP(start-$SERVICE): start a given service
|
||||
start-%:
|
||||
docker compose up -d --build $*
|
||||
|
||||
.PHONY: shell-%
|
||||
# HELP(shell-$SERVICE): launch a (bash) shell inside a given service
|
||||
shell-%:
|
||||
docker compose run --build --no-deps --entrypoint="$(ENTRYPOINT)" $*
|
||||
.PHONY: ghci
|
||||
# HELP: launch new backend instance and enter interactive ghci shell (WIP)
|
||||
ghci: ENTRYPOINT=stack ghci
|
||||
ghci: --shell;
|
||||
|
||||
--shell:
|
||||
CONTAINER_ID=`cat $(CONTAINER_FILE) | grep 'CONTAINER_ID=' | sed 's/CONTAINER_ID=//'` ; \
|
||||
$(CONTAINER_COMMAND) exec -it $(EXEC_OPTS) $${CONTAINER_ID} $(if $(ENTRYPOINT),$(ENTRYPOINT),/bin/bash)
|
||||
# HELP: launch ghci instance. Use in combination with SRC to specify the modules to be loaded by ghci: make ghci SRC=src/SomeModule.hs
|
||||
ghci: ENTRYPOINT=stack ghci $(SRC)
|
||||
ghci: shell-backend ;
|
||||
|
||||
.PHONY: stop
|
||||
# HELP: stop all currently running develop instances
|
||||
# HELP: stop all services
|
||||
stop:
|
||||
rm -rf develop
|
||||
docker compose down
|
||||
.PHONY: stop-%
|
||||
# HELP(stop-{database,memcached,minio,backend,frontend,hoogle}): stop all currently running develop instances of a given type
|
||||
# HELP(stop-$SERVICE): stop a given service
|
||||
stop-%:
|
||||
$(SET_DEVELOP)
|
||||
rm -rf $(DEVELOP)/$*
|
||||
stop-container-by-file:
|
||||
rm $(CONTAINER_FILE)
|
||||
stop-container-by-id:
|
||||
$(CONTAINER_COMMAND) stop $(CONTAINER_ID)
|
||||
# CONTAINER_ID=`grep 'CONTAINER_ID=' $(CONTAINER_FILE) | sed 's/CONTAINER_ID=//'` ; \
|
||||
# $(MAKE) stop-container-by-id CONTAINER_ID=$${CONTAINER_ID}
|
||||
docker compose down $*
|
||||
.PHONY: kill-%
|
||||
# HELP(kill-$SERVICE): kill a given service the hard way. Use this if the servive does not respond to stop.
|
||||
kill-%:
|
||||
docker compose kill $*
|
||||
|
||||
.PHONY: new-develop
|
||||
# HELP: instantiate new development bundle, i.e. create new directory under develop/
|
||||
new-develop:
|
||||
$(NEW_DEVELOP)
|
||||
mkdir -p $(DEVELOP)
|
||||
$(MAKE) develop/.current
|
||||
.PHONY: switch-develop
|
||||
# HELP: switch current develop instance to DEVELOP=...
|
||||
switch-develop:
|
||||
if ! [ -e develop/$(DEVELOP) ]; then \
|
||||
echo "Specified develop $(DEVELOP) does not exist! Not switching." ; \
|
||||
exit 1 ; \
|
||||
fi ; \
|
||||
echo "$(DEVELOP)" > develop/.current
|
||||
--ensure-develop:
|
||||
if ! [[ -e develop ]]; then \
|
||||
$(MAKE) new-develop; \
|
||||
fi
|
||||
$(MAKE) develop/.current
|
||||
$(SET_DEVELOP)
|
||||
.PHONY: develop/.current
|
||||
develop/.current:
|
||||
ls -1 develop | tail -n1 > develop/.current
|
||||
.PHONY: status
|
||||
# HELP: print an overview of currently running services and their health
|
||||
status:
|
||||
docker compose ps
|
||||
.PHONY: top
|
||||
# HELP: print an overview of the ressource usage of the currently running services
|
||||
top:
|
||||
docker compose stats
|
||||
.PHONY: list-projects
|
||||
# HELP: list all currently running projects on this machine
|
||||
list-projects:
|
||||
docker compose ls
|
||||
|
||||
stack.yaml.lock: --dependencies-backend;
|
||||
.PHONY: log-%
|
||||
# HELP(log-$SERVICE): follow the output of a given service. Service must be running.
|
||||
log-%:
|
||||
docker compose logs --follow --timestamps $*
|
||||
|
||||
.PHONY: --%
|
||||
.SUFFIXES: # Delete all default suffixes
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
"file-upload": "file-arrow-up",
|
||||
"file-zip": "file-zipper",
|
||||
"file-csv": "file-csv",
|
||||
"file-missing": "file-circle-minus",
|
||||
"sft-question": "circle-question",
|
||||
"sft-hint": "life-ring",
|
||||
"sft-solution": "circle-exclamation",
|
||||
@ -76,7 +77,7 @@
|
||||
"submission-no-users": "user-slash",
|
||||
"reset": "arrow-rotate-left",
|
||||
"blocked": "ban",
|
||||
"certificate": "certificate",
|
||||
"certificate": "car-side",
|
||||
"print-center": "envelopes-bulk",
|
||||
"letter": "envelopes-bulk",
|
||||
"at": "at",
|
||||
@ -90,12 +91,18 @@
|
||||
"trash": "trash",
|
||||
"reset-tries": "trash-can-arrow-up",
|
||||
"company": "building",
|
||||
"company-warning": "building-circle-exclamation",
|
||||
"edit": "pen-to-square",
|
||||
"user-edit": "user-pen",
|
||||
"loading": "spinner",
|
||||
"placeholder": "notdef",
|
||||
"reroute": "diamond-turn-right",
|
||||
"top": "award",
|
||||
"wildcard": "asterisk"
|
||||
"wildcard": "asterisk",
|
||||
"user-unknown": "user-slash",
|
||||
"user-badge": "id-badge",
|
||||
"glasses": "glasses",
|
||||
"missing": "question",
|
||||
"pin-protect": "key"
|
||||
}
|
||||
|
||||
|
||||
239
azure-pipelines.yaml
Normal file → Executable file
239
azure-pipelines.yaml
Normal file → Executable file
@ -1,52 +1,197 @@
|
||||
# SPDX-FileCopyrightText: 2024 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- '*'
|
||||
tags:
|
||||
include:
|
||||
- '*'
|
||||
#paths:
|
||||
# exclude:
|
||||
# - CHANGELOG.md
|
||||
|
||||
parameters:
|
||||
- name: services
|
||||
type: object
|
||||
default:
|
||||
- name: frontend
|
||||
imageBase:
|
||||
image: devfra.azurecr.io/de.fraport.build/npm
|
||||
tag: node-20
|
||||
# extraBuildOptions: |
|
||||
# --build-arg NPM_CUSTOM_REGISTRY=https://pkgs.dev.azure.com/fraport/_packaging/packages/npm/registry/
|
||||
dependsOn: []
|
||||
dependenciesCaches:
|
||||
- key: package.json | package-lock.json
|
||||
path: node_modules/
|
||||
- key: package.json | package-lock.json
|
||||
path: .npm/
|
||||
- key: package.json | esbuild.config.mjs | utils/renamer.pl | utils/faviconize.pl | frontend/src/icons.scss
|
||||
path: assets/icons/
|
||||
- key: package.json | esbuild.config.mjs | utils/renamer.pl | utils/faviconize.pl | frontend/src/icons.scss
|
||||
path: assets/favicons/
|
||||
buildPool: 'Prod Private Agent Pool'
|
||||
buildCores: 1
|
||||
buildTimeout: 60
|
||||
buildArtifacts: |
|
||||
assets/icons/fradrive/*.svg
|
||||
assets/favicons/*.png
|
||||
assets/favicons/include.html
|
||||
frontend/src/env.sass
|
||||
config/manifest.json
|
||||
static/**/*
|
||||
well-known/**/*
|
||||
- name: backend
|
||||
imageBase:
|
||||
image: devfra.azurecr.io/de.fraport.build/haskell
|
||||
tag: 8.10.4
|
||||
dependsOn:
|
||||
- Build_frontend
|
||||
dependenciesCaches:
|
||||
- key: stack.yaml | stack.yaml.lock
|
||||
path: .stack/
|
||||
buildPool: 'Prod Private Agent Pool DS3'
|
||||
buildCores: 3
|
||||
buildTimeout: 1440
|
||||
buildArtifacts: |
|
||||
bin/*
|
||||
|
||||
variables:
|
||||
buildImageUpstream: devfra.azurecr.io/de.fraport.fradrive.build
|
||||
setupImages: $[ or( eq(variables.forcePushLatest, true), eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/update'), startsWith(variables['Build.SourceBranch'], 'refs/tags/') ) ]
|
||||
|
||||
pool: 'Prod Private Agent Pool'
|
||||
|
||||
jobs:
|
||||
# - job: HelloWorld
|
||||
# container:
|
||||
# image: 'devfra.azurecr.io/de.fraport.trusted/ubuntu:22.04'
|
||||
# endpoint: devfra
|
||||
# steps:
|
||||
# - script: echo Hello, world!
|
||||
# displayName: 'Run a one-line script'
|
||||
# - script: |
|
||||
# echo Add other tasks to build, test, and deploy your project.
|
||||
# echo See https://aka.ms/yaml
|
||||
# displayName: 'Run a multi-line script'
|
||||
# - job: DockerTaskTest
|
||||
# container:
|
||||
# image: 'devfra.azurecr.io/de.fraport.trusted/ubuntu:22.04'
|
||||
# endpoint: devfra
|
||||
# steps:
|
||||
# - task: Docker@2
|
||||
# displayName: Image build test
|
||||
# inputs:
|
||||
# command: buildAndPush
|
||||
# Dockerfile: docker/backend/Dockerfile
|
||||
# buildContext: .
|
||||
# tags: backend
|
||||
# - job: BuildKitTest
|
||||
# container:
|
||||
# image: 'devfra.azurecr.io/de.fraport.trusted/buildkit:0.12.1'
|
||||
# endpoint: devfra
|
||||
# steps:
|
||||
# - script: buildctl build \
|
||||
# --frontend=dockerfile.v0 \
|
||||
# --local context=. \
|
||||
# --local dockerfile=docker/backend/Dockerfile
|
||||
# displayName: BuildKit test
|
||||
- job: CustomBuildahTest
|
||||
container:
|
||||
image: 'devfra.azurecr.io/de.fraport.trusted/ubuntu:22.04'
|
||||
endpoint: devfra
|
||||
steps:
|
||||
- script: |
|
||||
id
|
||||
docker build --help
|
||||
sudo apt-get -y update
|
||||
sudo apt-get -y install buildah
|
||||
buildah bud -t fradrive-backend-test --volume .:/mnt/fradrive --file docker/backend/Dockerfile
|
||||
displayName: Build buildah image
|
||||
stages:
|
||||
|
||||
- stage: Setup
|
||||
jobs:
|
||||
- ${{ each service in parameters.services }}:
|
||||
- template: .azure-pipelines/templates/jobs/setup_image.yaml
|
||||
parameters:
|
||||
imageName: ${{service.name}}
|
||||
imageBase: ${{service.imageBase}}
|
||||
- template: .azure-pipelines/templates/jobs/setup_dependencies.yaml
|
||||
parameters:
|
||||
serviceName: ${{service.name}}
|
||||
dependenciesCaches: ${{service.dependenciesCaches}}
|
||||
dependenciesBuildPool: ${{service.buildPool}}
|
||||
dependenciesBuildCores: ${{service.buildCores}}
|
||||
dependenciesBuildTimeout: ${{service.buildTimeout}}
|
||||
|
||||
- stage: Build
|
||||
dependsOn: Setup
|
||||
jobs:
|
||||
- ${{ each service in parameters.services }}:
|
||||
- job: Build_${{service.name}}
|
||||
displayName: Compile ${{service.name}}
|
||||
dependsOn: ${{service.dependsOn}}
|
||||
pool: '${{service.buildPool}}'
|
||||
timeoutInMinutes: ${{service.buildTimeout}}
|
||||
container:
|
||||
${{ if eq(variables.setupImages, true) }}:
|
||||
image: $(buildImageUpstream)/${{service.name}}:$(Build.BuildNumber)
|
||||
${{ else }}:
|
||||
image: $(buildImageUpstream)/${{service.name}}:latest
|
||||
endpoint: devfra
|
||||
env:
|
||||
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
IN_CONTAINER: true
|
||||
IN_CI: true
|
||||
steps:
|
||||
- ${{ each dependencyCache in service.dependenciesCaches }}:
|
||||
- template: .azure-pipelines/templates/steps/cache.yaml
|
||||
parameters:
|
||||
cacheIdent: '${{service.name}}-dependencies'
|
||||
cacheKeys: '${{dependencyCache.key}}'
|
||||
cachePath: '${{dependencyCache.path}}'
|
||||
- ${{ each dependency in service.dependsOn }}:
|
||||
- template: .azure-pipelines/templates/steps/artifact-download.yaml
|
||||
parameters:
|
||||
artifactName: '${{dependency}}'
|
||||
- template: .azure-pipelines/templates/steps/make.yaml
|
||||
parameters:
|
||||
makeJob: compile
|
||||
makeService: ${{service.name}}
|
||||
makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||
- task: CopyFiles@2
|
||||
displayName: Prepare ${{service.name}} build artifacts for upload
|
||||
inputs:
|
||||
Contents: '${{service.buildArtifacts}}'
|
||||
TargetFolder: '$(Build.ArtifactStagingDirectory)'
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish ${{service.name}} build artifacts
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: 'Build_${{service.name}}'
|
||||
publishLocation: 'Container'
|
||||
|
||||
# - stage: Test
|
||||
# dependsOn: Build
|
||||
# condition: eq(variables.skipTests, false)
|
||||
# jobs:
|
||||
# - ${{ each service in parameters.services }}:
|
||||
# - job: Test_${{service.name}}
|
||||
# displayName: Run ${{service.name}} tests
|
||||
# pool: '${{service.buildPool}}'
|
||||
# timeoutInMinutes: ${{service.buildTimeout}}
|
||||
# container:
|
||||
# # TODO: do not use latest on update branches
|
||||
# image: $(buildImageUpstream)/${{service.name}}:latest
|
||||
# endpoint: devfra
|
||||
# env:
|
||||
# PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
# IN_CONTAINER: true
|
||||
# IN_CI: true
|
||||
# steps:
|
||||
# - ${{ each dependencyCache in service.dependenciesCaches }}:
|
||||
# - template: .azure-pipelines/templates/steps/cache.yaml
|
||||
# parameters:
|
||||
# cacheIdent: '${{service.name}}-dependencies'
|
||||
# cacheKeys: '${{dependencyCache.key}}'
|
||||
# cachePath: '${{dependencyCache.path}}'
|
||||
# - ${{ each dependency in service.dependsOn }}:
|
||||
# - template: .azure-pipelines/templates/steps/artifact-download.yaml
|
||||
# parameters:
|
||||
# artifactName: '${{dependency}}'
|
||||
# - task: Docker@2
|
||||
# displayName: Login to container registry
|
||||
# inputs:
|
||||
# command: login
|
||||
# containerRegistry: devfra
|
||||
# - task: Bash@3
|
||||
# displayName: Start database container for testing
|
||||
# inputs:
|
||||
# targetType: inline
|
||||
# script: |
|
||||
# docker run -d devfra.azurecr.io/de.fraport.trusted/postgres:16.1-bookworm
|
||||
# - template: .azure-pipelines/templates/steps/make.yaml
|
||||
# parameters:
|
||||
# makeJob: lint
|
||||
# makeService: ${{service.name}}
|
||||
# makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||
# - template: .azure-pipelines/templates/steps/make.yaml
|
||||
# parameters:
|
||||
# makeJob: test
|
||||
# makeService: ${{service.name}}
|
||||
# makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||
# - task: Docker@2
|
||||
# displayName: Logout from container registry
|
||||
# inputs:
|
||||
# command: logout
|
||||
# containerRegistry: devfra
|
||||
# - job: TestReport_${{service.name}}
|
||||
# displayName: Upload test reports for ${{service.name}}
|
||||
# steps:
|
||||
# - script: echo "Work in progress" # TODO
|
||||
|
||||
- stage: Release
|
||||
dependsOn: Build # TODO Test
|
||||
condition: or(eq(variables.forceRelease, true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
|
||||
jobs:
|
||||
- template: .azure-pipelines/templates/jobs/release.yaml
|
||||
parameters:
|
||||
releaseTag: ${{split(variables['Build.SourceBranch'], '/')[2]}}
|
||||
0
backend/.ghc/ghci_history
Normal file
0
backend/.ghc/ghci_history
Normal file
40
backend/Dockerfile
Normal file
40
backend/Dockerfile
Normal file
@ -0,0 +1,40 @@
|
||||
ARG FROM_IMG=docker.io/library/debian
|
||||
ARG FROM_TAG=12.5
|
||||
|
||||
FROM ${FROM_IMG}:${FROM_TAG}
|
||||
|
||||
ENV LANG=de_DE.UTF-8
|
||||
|
||||
# basic dependencies
|
||||
RUN apt-get -y update && apt-get -y install git
|
||||
RUN apt-get -y update && apt-get -y install haskell-stack
|
||||
RUN apt-get -y update && apt-get -y install llvm
|
||||
RUN apt-get -y update && apt-get install -y --no-install-recommends locales locales-all
|
||||
|
||||
# compile-time dependencies
|
||||
RUN apt-get -y update && apt-get install -y libpq-dev libsodium-dev
|
||||
RUN apt-get -y update && apt-get -y install g++ libghc-zlib-dev libpq-dev libsodium-dev pkg-config
|
||||
RUN apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
|
||||
|
||||
# run-time dependencies for uniworx binary
|
||||
RUN apt-get -y update && apt-get -y install fonts-roboto
|
||||
# RUN apt-get -y update && apt-get -y install pdftk
|
||||
# RUN apt-get -y update && apt-get -y install \
|
||||
# texlive texlive-latex-recommended texlive-luatex texlive-plain-generic texlive-lang-german texlive-lang-english
|
||||
RUN apt-get -y update && apt-get -y install texlive
|
||||
# RUN ls /usr/local/texlive
|
||||
# RUN chown -hR root /usr/local/texlive/2018
|
||||
# RUN tlmgr init-usertree
|
||||
# RUN tlmgr option repository ftp://tug.org/historic/systems/texlive/2018/tlnet-final
|
||||
# RUN tlmgr update --self --all
|
||||
|
||||
ARG PROJECT_DIR=/fradrive
|
||||
ENV PROJECT_DIR=${PROJECT_DIR}
|
||||
# RUN mkdir -p "${PROJECT_DIR}"; chmod -R 777 "${PROJECT_DIR}"
|
||||
WORKDIR ${PROJECT_DIR}
|
||||
ENV HOME=${PROJECT_DIR}
|
||||
ENV STACK_ROOT="${PROJECT_DIR}/.stack"
|
||||
|
||||
ENV STACK_SRC=""
|
||||
ENV STACK_ENTRY="ghci ${STACK_SRC}"
|
||||
ENTRYPOINT stack ${STACK_ENTRY}
|
||||
51
backend/Makefile
Normal file
51
backend/Makefile
Normal file
@ -0,0 +1,51 @@
|
||||
export CPU_CORES = $(shell cat /proc/cpuinfo | grep '^processor' | wc -l)
|
||||
export STACK_CORES = $(shell echo $(($(CPU_CORES)/2)))
|
||||
|
||||
ifeq ($(PROD),true)
|
||||
export --DEVELOPMENT=--flag uniworx:-dev
|
||||
else
|
||||
export --DEVELOPMENT=--flag uniworx:dev
|
||||
endif
|
||||
|
||||
.PHONY: dependencies
|
||||
dependencies:
|
||||
stack install hpack; stack install yesod-bin; \
|
||||
stack build -j2 --only-dependencies
|
||||
|
||||
.PHONY: compile
|
||||
compile: dependencies
|
||||
stack build $(STACK_CORES) --fast --profile --library-profiling --executable-profiling --flag uniworx:-library-only $(--DEVELOPMENT) --local-bin-path $$(pwd)/bin --copy-bins
|
||||
|
||||
.PHONY: lint
|
||||
lint:
|
||||
stack build $(STACK_CORES) --test --fast --flag uniworx:library-only $(--DEVELOPMENT) uniworx:test:hlint
|
||||
|
||||
.PHONY: test
|
||||
test:
|
||||
stack build $(STACK_CORES) --test --coverage --fast --flag uniworx:library-only $(--DEVELOPMENT)
|
||||
|
||||
# For Reverse Proxy Problem see: https://groups.google.com/g/yesodweb/c/2EO53kSOuy0/m/Lw6tq2VYat4J
|
||||
.PHONY: start
|
||||
start: dependencies
|
||||
export YESOD_IP_FROM_HEADER=true; \
|
||||
export DEV_PORT_HTTP=3000; \
|
||||
export DEV_PORT_HTTPS=3443; \
|
||||
export HOST=127.0.0.1 ; \
|
||||
export PORT=$${PORT:-$${DEV_PORT_HTTP}} ; \
|
||||
export DETAILED_LOGGING=$${DETAILED_LOGGING:-true} ; \
|
||||
export LOG_ALL=$${LOG_ALL:-false} ; \
|
||||
export LOGLEVEL=$${LOGLEVEL:-info} ; \
|
||||
export DUMMY_LOGIN=$${DUMMY_LOGIN:-true} ; \
|
||||
export SERVER_SESSION_ACID_FALLBACK=$${SERVER_SESSION_ACID_FALLBACK:-true} ; \
|
||||
export SERVER_SESSION_COOKIES_SECURE=$${SERVER_SESSION_COOKIES_SECURE:-false} ; \
|
||||
export COOKIES_SECURE=$${COOKIES_SECURE:-false} ; \
|
||||
export ALLOW_DEPRECATED=$${ALLOW_DEPRECATED:-true} ; \
|
||||
export ENCRYPT_ERRORS=$${ENCRYPT_ERRORS:-false} ; \
|
||||
export RIBBON=$${RIBBON:-$${HOST:-localhost}} ; \
|
||||
export APPROOT=$${APPROOT:-http://localhost:$${DEV_PORT_HTTP}} ; \
|
||||
export AVSPASS=$${AVSPASS:-nopasswordset} ; \
|
||||
stack $(STACK_CORES) exec --local-bin-path $$(pwd)/bin --copy-bins -- yesod devel -p "$${DEV_PORT_HTTP}" -q "$${DEV_PORT_HTTPS}"
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf .stack-work .stack uniworx.cabal .ghc
|
||||
@ -8,7 +8,7 @@
|
||||
# See https://github.com/yesodweb/yesod/wiki/Configuration#parsing-numeric-values-as-strings
|
||||
|
||||
|
||||
#DEVELOPMENT ONLY, NOT TO BE USED IN PRODUCTION
|
||||
# DEVELOPMENT ONLY, NOT TO BE USED IN PRODUCTION
|
||||
|
||||
avs-licence-synch:
|
||||
times: [12]
|
||||
@ -16,6 +16,17 @@ avs-licence-synch:
|
||||
reason-filter: "(firm|block)"
|
||||
max-changes: 999
|
||||
|
||||
mail-reroute-to:
|
||||
name: "FRADrive-QA-Umleitungen"
|
||||
email: "FRADrive-TEST-Umleitungen@fraport.de"
|
||||
|
||||
# Enqueue at specified hour, a few minutes later
|
||||
job-lms-qualifications-enqueue-hour: 16
|
||||
job-lms-qualifications-dequeue-hour: 4
|
||||
|
||||
# Using these setting kills the job-workers somehow
|
||||
# job-workers: 5
|
||||
# job-flush-interval: 600
|
||||
# job-stale-threshold: 3600
|
||||
# job-move-threshold: 60
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>
|
||||
# SPDX-FileCopyrightText: 2022-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -120,7 +120,7 @@ auth-pw-hash:
|
||||
database:
|
||||
user: "_env:PGUSER:uniworx"
|
||||
password: "_env:PGPASS:uniworx"
|
||||
host: "_env:PGHOST:host.docker.internal"
|
||||
host: "_env:PGHOST:localhost"
|
||||
port: "_env:PGPORT:5432"
|
||||
# See config/test-settings.yml for an override during tests
|
||||
database: "_env:PGDATABASE:uniworx"
|
||||
@ -146,12 +146,14 @@ ldap:
|
||||
ldap-re-test-failover: 60
|
||||
|
||||
lms-direct:
|
||||
upload-header: "_env:LMSUPLOADHEADER:true"
|
||||
upload-delimiter: "_env:LMSUPLOADDELIMITER:"
|
||||
download-header: "_env:LMSDOWNLOADHEADER:true"
|
||||
download-delimiter: "_env:LMSDOWNLOADDELIMITER:,"
|
||||
download-cr-lf: "_env:LMSDOWNLOADCRLF:true"
|
||||
deletion-days: "_env:LMSDELETIONDAYS:7"
|
||||
upload-header: "_env:LMSUPLOADHEADER:true"
|
||||
upload-delimiter: "_env:LMSUPLOADDELIMITER:"
|
||||
download-header: "_env:LMSDOWNLOADHEADER:true"
|
||||
download-delimiter: "_env:LMSDOWNLOADDELIMITER:,"
|
||||
download-cr-lf: "_env:LMSDOWNLOADCRLF:true"
|
||||
orphan-deletion-days: "_env:LMSORPHANDELETIONDAYS:33"
|
||||
orphan-deletion-batch: "_env:LMSORPHANDELETIONBATCH:12"
|
||||
orphan-deletion-repeat-hours: "_env:LMSORPHANDELETIONREPEATHOURS:24"
|
||||
|
||||
avs:
|
||||
host: "_env:AVSHOST:skytest.fra.fraport.de"
|
||||
@ -180,7 +182,7 @@ smtp:
|
||||
limit: "_env:SMTPLIMIT:10"
|
||||
|
||||
widget-memcached:
|
||||
host: "_env:WIDGET_MEMCACHED_HOST:host.docker.internal"
|
||||
host: "_env:WIDGET_MEMCACHED_HOST:localhost"
|
||||
port: "_env:WIDGET_MEMCACHED_PORT:11211"
|
||||
auth: []
|
||||
limit: "_env:WIDGET_MEMCACHED_LIMIT:1024"
|
||||
@ -189,7 +191,7 @@ widget-memcached:
|
||||
expiration: "_env:WIDGET_MEMCACHED_EXPIRATION:3600"
|
||||
|
||||
session-memcached:
|
||||
host: "_env:SESSION_MEMCACHED_HOST:host.docker.internal"
|
||||
host: "_env:SESSION_MEMCACHED_HOST:localhost"
|
||||
port: "_env:SESSION_MEMCACHED_PORT:11211"
|
||||
auth: []
|
||||
limit: "_env:SESSION_MEMCACHED_LIMIT:1024"
|
||||
@ -199,7 +201,7 @@ session-memcached:
|
||||
|
||||
# TODO: this one seems to be required!
|
||||
memcached:
|
||||
host: "_env:MEMCACHED_HOST:host.docker.internal"
|
||||
host: "_env:MEMCACHED_HOST:localhost"
|
||||
port: "_env:MEMCACHED_PORT:11211"
|
||||
auth: []
|
||||
limit: "_env:MEMCACHED_LIMIT:1024"
|
||||
@ -16,5 +16,4 @@ log-settings:
|
||||
auth-dummy-login: true
|
||||
server-session-acid-fallback: true
|
||||
|
||||
job-cron-interval: null
|
||||
job-workers: 1
|
||||
job-workers: 20
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022-24 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
# SPDX-FileCopyrightText: 2022-25 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -109,9 +109,10 @@ ProblemsDriverSynch1up: Alle gültigen Vorfeld-Fahrberechtigungen 'F' sind im AV
|
||||
ProblemsDriverSynch2: Alle gültigen Rollfeld-Fahrberechtigungen 'R' sind im AVS eingetragen
|
||||
ProblemsRDriversHaveFs: Alle Inhaber einer Rollfeld-Fahrberechtigung besitzen auch eine gültige Vorfeld-Fahrberechtigung
|
||||
ProblemsDriversHaveAvsIds: Alle Inhaber einer Fahrberechtigung konnten einer AVS Identifikationsnummer zugeordnet werden
|
||||
ProblemsUsersAreReachable: Für alle Benutzer ist eine E-Mail oder postalische Adresse bekannt
|
||||
ProblemsUsersAreReachable: Für alle Benutzer ist eine E-Mail oder postalische Adresse bekannt
|
||||
ProblemsNoStalePrintJobs n@Integer: Alle Briefversandaufträge #{pluralDE n "des vergangenen Tages" ("der vergangenen "<> tshow n <> " Tage")} wurden von der Druckerei bestätigt
|
||||
ProblemsNoBadAPCIds: Alle kürzlich empfangenen Druckauftragsbestätigungen waren gültig
|
||||
ProblemsNoInsaneCompanySupervisions: Sind alle Firmen-bezogenen Ansprechpartnerbeziehungen zwischen passenden Firmenangehörigen?
|
||||
ProblemsUnreachableHeading: Unerreichbare Benutzer
|
||||
ProblemsUnreachableBody: Benutzer ohne E-Mail oder Postadresse, welche z.B. bei ablaufenden Berechtigungen nicht benachrichtigt werden können:
|
||||
ProblemsUnreachableButtons: Synchronisation für Unerreichbare starten
|
||||
@ -123,6 +124,7 @@ ProblemsAvsSynchHeading: Synchronisation AVS Fahrberechtigungen
|
||||
ProblemsAvsErrorHeading: Fehlermeldungen
|
||||
ProblemsInterfaceSince: Berücksichtigt werden nur Erfolge und Fehler seit
|
||||
ProblemAvsUsrHadR: Momentan gültiges R im AVS
|
||||
ProblemLastCheckTime t@Text: Letzte Prüfung vor #{t}
|
||||
|
||||
AdminProblemSolved: Erledigt
|
||||
AdminProblemSolver: Bearbeitet von
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022-24 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
# SPDX-FileCopyrightText: 2022-25 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -112,6 +112,7 @@ ProblemsDriversHaveAvsIds: All driving licence holder could be matched with thei
|
||||
ProblemsUsersAreReachable: Either Email or postal address is known for all users
|
||||
ProblemsNoStalePrintJobs n: All requests for letter mailing within the last #{pluralENsN n "day"} were acknowledged as printed by the airport printing center
|
||||
ProblemsNoBadAPCIds: All recently received print job ids from Airport Print Center were legit
|
||||
ProblemsNoInsaneCompanySupervisions: All company related supervisions are between company-associated users
|
||||
ProblemsUnreachableHeading: Unreachable Users
|
||||
ProblemsUnreachableBody: Users without Email nor postal address, who thus cannot be notified about expiring qualifications:
|
||||
ProblemsUnreachableButtons: Start synchronisation for unreachable users only
|
||||
@ -123,6 +124,7 @@ ProblemsAvsSynchHeading: Synchronisation AVS Driving Licences
|
||||
ProblemsAvsErrorHeading: Error Log
|
||||
ProblemsInterfaceSince: Only considering successes and errors since
|
||||
ProblemAvsUsrHadR: Currenlt R valid in AVS
|
||||
ProblemLastCheckTime t: Last checked #{t} ago
|
||||
|
||||
AdminProblemSolved: Done
|
||||
AdminProblemSolver: Solved by
|
||||
@ -26,30 +26,30 @@ UnauthorizedSiteAdmin: You are no system-wide administrator.
|
||||
UnauthorizedSchoolAdmin: You are no administrator for this department.
|
||||
UnauthorizedAdminEscalation: You aren't an administrator for all departments for which this user is an administrator.
|
||||
UnauthorizedExamOffice: You are not part of an exam office.
|
||||
UnauthorizedEvaluation: You are not charged with course type evaluation.
|
||||
UnauthorizedEvaluation: You are not charged with course category evaluation.
|
||||
UnauthorizedExamExamOffice: You are not part of the appropriate exam office for any of the participants of this exam.
|
||||
UnauthorizedSchoolExamOffice: You are not part of an exam office for this school.
|
||||
UnauthorizedSystemExamOffice: You are not charged with system wide exam administration.
|
||||
UnauthorizedSystemPrinter: You are not charged with system wide letter printing.
|
||||
UnauthorizedExternalExamExamOffice: You are not part of the appropriate exam office for any of the participants of this exam.
|
||||
UnauthorizedSchoolLecturer: You are no course administrator for this department.
|
||||
UnauthorizedLecturer: You are no administrator for this course type.
|
||||
UnauthorizedCorrector: You are no sheet corrector for this course type.
|
||||
UnauthorizedLecturer: You are no administrator for this course category.
|
||||
UnauthorizedCorrector: You are no sheet corrector for this course category.
|
||||
UnauthorizedSheetCorrector: You are no corrector for this sheet.
|
||||
UnauthorizedExamCorrector: You are no corrector for this exam.
|
||||
UnauthorizedCorrectorAny: You are no corrector for any course type.
|
||||
UnauthorizedRegistered: You are no participant in this course type.
|
||||
UnauthorizedCorrectorAny: You are no corrector for any course category.
|
||||
UnauthorizedRegistered: You are no participant in this course category.
|
||||
UnauthorizedRegisteredExam: You are not registered for this exam.
|
||||
UnauthorizedRegisteredAnyExam: You are not registered for an exam.
|
||||
UnauthorizedExamResult: You have no results in this exam.
|
||||
UnauthorizedExamOccurrenceRegistration: Registration for exam is not done including occurrence/room.
|
||||
UnauthorizedExternalExamResult: You have no results in this exam.
|
||||
UnauthorizedParticipant: The specified user is no participant of this course type.
|
||||
UnauthorizedParticipantSelf: You are no participant of this course type.
|
||||
UnauthorizedCourseTime: This course type is not currently available.
|
||||
UnauthorizedCourseRegistrationTime: This course type does not currently allow enrollment.
|
||||
UnauthorizedParticipant: The specified user is no participant of this course category.
|
||||
UnauthorizedParticipantSelf: You are no participant of this course category.
|
||||
UnauthorizedCourseTime: This course category is not currently available.
|
||||
UnauthorizedCourseRegistrationTime: This course category does not currently allow enrollment.
|
||||
UnauthorizedSheetTime: This sheet is not currently available.
|
||||
UnauthorizedMaterialTime: This course type material is not currently available.
|
||||
UnauthorizedMaterialTime: This course category material is not currently available.
|
||||
UnauthorizedTutorialTime: This course does not currently allow registration.
|
||||
UnauthorizedCourseNewsTime: This news item is not currently available.
|
||||
UnauthorizedExamTime: This exam is not currently available.
|
||||
@ -61,7 +61,7 @@ UnauthorizedUserSubmission: Users may not directly submit for this exercise shee
|
||||
UnauthorizedCorrectorSubmission: Correctors may not create submissions for this exercise sheet.
|
||||
UnauthorizedCorrectionAnonymous: Correction is not anonymised.
|
||||
DeprecatedRoute: This view is deprecated and will be removed.
|
||||
UnfreeMaterials: Course type material are not publicly accessable.
|
||||
UnfreeMaterials: Course category material are not publicly accessable.
|
||||
UnauthorizedWrite: You do not have the write permission necessary to perform this action
|
||||
UnauthorizedSystemMessageTime: This system-message is not currently available.
|
||||
UnauthorizedSystemMessageAuth: This system-message is only available to logged in users.
|
||||
@ -94,7 +94,7 @@ WorkflowRoleAlreadyInitiated: This workflow was already initiated
|
||||
WorkflowRoleNoSuchWorkflowWorkflow: The given workflow could not be found
|
||||
WorkflowRoleNoPayload: This workflow does not contain any data
|
||||
|
||||
CourseNoCapacity: Course type has reached maximum capacity
|
||||
CourseNoCapacity: Course category has reached maximum capacity
|
||||
TutorialNoCapacity: Course has reached maximum capacity
|
||||
ExamOccurrenceNoCapacity: Occurrence/Room has reached maximum capacity
|
||||
CourseNotEmpty: There are currently no participants enrolled for this course.
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022 Steffen Jost <jost@tcs.ifi.lmu.de>
|
||||
# SPDX-FileCopyrightText: 2022-25 Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
AvsPersonInfo: AVS Personendaten
|
||||
@ -54,10 +54,14 @@ AvsUserUnassociated user@UserDisplayName: AVS Id unbekannt für Nutzer #{user}
|
||||
AvsUserUnknownByAvs api@AvsPersonId: AVS kennt Id #{tshow api} nicht (mehr)
|
||||
AvsUserAmbiguous api@AvsPersonId: AVS Id #{tshow api} ist nicht eindeutig
|
||||
AvsStatusSearchEmpty: AVS lieferte keine Ausweisinformationen
|
||||
AvsPersonSearchEmpty: AVS Suche lieferte leeres Ergebnis
|
||||
AvsPersonSearchAmbiguous: AVS Suche lieferte mehrere uneindeutige Ergebnisse
|
||||
AvsPersonSearchEmpty: Suche im AVS lieferte kein Ergebnis
|
||||
AvsPersonSearchAmbiguous: Suche im AVS lieferte mehrere uneindeutige Ergebnisse
|
||||
AvsSetLicencesFailed reason@Text: Setzen der Fahrlizenz im AVS fehlgeschlagen. Grund: #{reason}
|
||||
AvsIdMismatch api1@AvsPersonId api2@AvsPersonId: AVS Suche für Id #{tshow api1} lieferte stattdessen Id #{tshow api2}
|
||||
AvsUserCreationFailed api@AvsPersonId: Für AVS Id #{tshow api} konnte kein neuer Benutzer angelegt werden, da es eine gemeinsame Id (z.B. Personalnummer) mit einem existierenden, aber verschiedenen Nutzer gibt.
|
||||
AvsCardsEmpty: AVS Suche lieferte keinerlei Ausweiskarten
|
||||
AvsCurrentData: Alle angezeigte Daten wurden kürzlich direkt über die AVS Schnittstelle abgerufen.
|
||||
AvsCardsEmpty: Suche im AVS lieferte keinerlei Ausweiskarten
|
||||
AvsCurrentData: Alle angezeigte Daten wurden kürzlich direkt über die AVS Schnittstelle abgerufen.
|
||||
AvsUpdateDayCheck: Zusätzlich wird im Hintergrund ein AVS Datenabgleich für alle in der Tagesansicht vorkommenden Personen angestoßen (einmal pro Tag).
|
||||
|
||||
AvsNoApronCard: Kein gültiger Ausweis mit Vorfeld-Zugang vorhanden
|
||||
AvsNoCompanyCard mcn@(Maybe CompanyName): Für buchende Firma #{maybeEmpty mcn ciOriginal} liegt kein gültiger Ausweis vor
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022 Steffen Jost <jost@tcs.ifi.lmu.de>
|
||||
# SPDX-FileCopyrightText: 2022-25 Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
AvsPersonInfo: AVS person info
|
||||
@ -61,4 +61,8 @@ AvsSetLicencesFailed reason: Set driving licence within AVS failed. Reason: #{re
|
||||
AvsIdMismatch api1 api2: AVS search for id #{tshow api1} returned id #{tshow api2} instead
|
||||
AvsUserCreationFailed api@AvsPersonId: No new user could be created for AVS Id #{tshow api}, since an existing user shares at least one id presumed as unique
|
||||
AvsCardsEmpty: AVS search returned no id cards
|
||||
AvsCurrentData: All shown data has been recently received via the AVS interface.
|
||||
AvsCurrentData: All shown data has been recently received via the AVS interface.
|
||||
AvsUpdateDayCheck: In addition, a background AVS update has been scheduled for all persons occrring within the day agenda (once per Day).
|
||||
|
||||
AvsNoApronCard: No valid card granting apron access found
|
||||
AvsNoCompanyCard mcn@(Maybe CompanyName): No valid card for booking company #{maybeEmpty mcn ciOriginal} found
|
||||
@ -70,9 +70,9 @@ CourseInvalidInput: Eingaben bitte korrigieren.
|
||||
CourseEditTitle: Kursart editieren/anlegen
|
||||
CourseEditOk tid@TermId ssh@SchoolId csh@CourseShorthand: Kursart #{tid}-#{ssh}-#{csh} wurde erfolgreich geändert.
|
||||
CourseEditDupShort tid@TermId ssh@SchoolId csh@CourseShorthand: Kursart #{tid}-#{ssh}-#{csh} konnte nicht geändert werden: Es gibt bereits einen andere Kursart mit dem selben Kürzel oder Titel in diesem Jahr und Bereich.
|
||||
CourseEditQualificationFail: Eine Qualifikation konnte uas unbekanntem Grund nicht mit diesem Kurs assoziert werden.
|
||||
CourseEditQualificationFailRights qsh@QualificationShorthand ssh@SchoolId: Qualifikation #{qsh} konnte nicht mit diesem Kurs assoziert werden, da Ihre Berechtigungen für Bereich #{ssh} dazu nicht ausreichen.
|
||||
CourseEditQualificationFailExists: Diese Qualifikation ist bereits assoziert
|
||||
CourseEditQualificationFail: Eine Qualifikation konnte uas unbekanntem Grund nicht mit diesem Kurs assoziiert werden.
|
||||
CourseEditQualificationFailRights qsh@QualificationShorthand ssh@SchoolId: Qualifikation #{qsh} konnte nicht mit diesem Kurs assoziiert werden, da Ihre Berechtigungen für Bereich #{ssh} dazu nicht ausreichen.
|
||||
CourseEditQualificationFailExists: Diese Qualifikation ist bereits assoziiert
|
||||
CourseEditQualificationFailOrder: Diese Sortierpriorität existiert bereits
|
||||
CourseLecturer: Kursverwalter:in
|
||||
MailSubjectParticipantInvitation tid@TermId ssh@SchoolId csh@CourseShorthand: [#{tid}-#{ssh}-#{csh}] Einladung zur Kursartteilnahme
|
||||
@ -94,6 +94,8 @@ CourseParticipantsRegisterTutorialFieldTip: Ist aktuell keine Kurs mit diesem Na
|
||||
CourseParticipantsRegisterNoneGiven: Es wurden keine anzumeldenden Personen angegeben!
|
||||
CourseParticipantsRegisterNotFoundInAvs n@Int: Zu #{n} #{pluralDE n "Angabe konnte keine übereinstimmende Person" "Angaben konnten keine übereinstimmenden Personen"} im AVS gefunden werden
|
||||
CourseParticipantsRegisterTutorialFirstDayTip: Wenn ein neuer Kurs gemäß einer Vorlage erstellt wird, werden die Zeiten gemäß dem Starttag angepasst
|
||||
CourseParticipantsTutorialType: Typ der Vorlage
|
||||
CourseParticipantsTutorialTypeTooltip: Ein neuer Kurs wird wie ein Kurs namens "Vorlage_[typ]" erstellt, wobei zuerst in der aktuellen Kursart, danach in Kursarten gleichen Namens und möglichst neuem Datum gesucht wird.
|
||||
|
||||
CourseParticipantsInvited n@Int: #{n} #{pluralDE n "Einladung" "Einladungen"} per E-Mail verschickt
|
||||
CourseParticipantsAlreadyRegistered n@Int: #{n} #{pluralDE n "Teinehmer:in" "Teilnehmer:innen"} #{pluralDE n "ist" "sind"} bereits zur Kursart angemeldet
|
||||
@ -135,6 +137,9 @@ CourseUserTutorialsDeregistered count@Int64: Teilnehmer:in von #{show count} #{p
|
||||
CourseUserNoTutorialsDeregistered: Teilnehmer:in ist zu keinem der gewählten Kurse angemeldet
|
||||
CourseUserTutorials: Angemeldete Kurse
|
||||
CourseUserExams: Angemeldete Prüfungen
|
||||
CourseUserExamOccurrences: Prüfungstermin
|
||||
CourseUserExamOccurrenceOverride: Ggf. vorhandenen Prüfungstermin überschreiben
|
||||
CourseUserExamOccurrenceAgainExaminer: Ggf. vorherige Prüfer erneut erlauben
|
||||
CourseUserSheets: Übungsblätter
|
||||
CsvColumnUserName: Voller Name des/der Teilnehmers/Teilnehmerin
|
||||
CsvColumnUserMatriculation: AVS Nummer des/der Teilnehmers/Teilnehmerin
|
||||
@ -239,7 +244,7 @@ UtilEditedBy name@Text time@Text: #{time} durch #{name}
|
||||
CourseDate: Datum
|
||||
MailSubjectLecturerInvitation tid@TermId ssh@SchoolId csh@CourseShorthand: [#{tid}-#{ssh}-#{csh}] Einladung als Kursverwalter:in
|
||||
LecturerInvitationAccepted lType@Text csh@CourseShorthand: Sie wurden als #{lType} für #{csh} eingetragen
|
||||
CourseExamRegistrationTime: Angemeldet seit
|
||||
CourseExamRegistrationTime: Angemeldet am
|
||||
CourseParticipantStateIsActiveFilter: Ansicht
|
||||
CourseApply: Zur Kursart bewerben
|
||||
CourseAdministrator: Kursadministrator:in
|
||||
@ -2,7 +2,7 @@
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
FilterCourse: Course
|
||||
FilterCourse: Course category
|
||||
FilterCourseShort: Shorthand
|
||||
FilterTerm: Year
|
||||
FilterCourseSchoolShort: Department
|
||||
@ -15,7 +15,7 @@ FilterCourseRegisterOpen: Enrolment is allowed
|
||||
CourseRegistered: Enrolled
|
||||
CourseRegistration: Enrolment
|
||||
CourseDescription: Description
|
||||
CommCourseHeading: Course type message
|
||||
CommCourseHeading: Course category message
|
||||
CourseLecturers: Course administrators
|
||||
CourseLecturerEmail: Email
|
||||
CourseLecturerAlreadyAdded: This user is already configured as a course administrator
|
||||
@ -25,12 +25,12 @@ CourseLecturerRightsIdentical: All sorts of course administrators have the same
|
||||
CourseAcceptSubstitutesUntil: Accept substitute registrations until
|
||||
CourseAcceptSubstitutesUntilTip: Until which time should substitute registrations through the central allocation be accepted to fill free places in the course? If left empty no substitute registrations will be made. This deadline should not arbitrarily be set early or ommitted so as to not be an unneccesarily restrictive for students. For a seminar a valid choice might be a few hours before the first meeting in which topics will be assigned.
|
||||
CourseDeregisterNoShow: Record “no show” when deregistering
|
||||
CourseDeregisterNoShowTip: Should “no show” be recorded as the exam achievement for all exams associated with this course type automatically whenever a course type participant deregisters themselves? This would be done once upon deregistration (if no other achievement exists for the given exam) and automatically whenever a new exam is created.
|
||||
CourseDeregisterNoShowTip: Should “no show” be recorded as the exam achievement for all exams associated with this course category automatically whenever a course category participant deregisters themselves? This would be done once upon deregistration (if no other achievement exists for the given exam) and automatically whenever a new exam is created.
|
||||
CourseSchool: Department
|
||||
CourseSchoolMultipleTip: You may select from among multiple departments. Please ensure that you select the appropriate department for your course.
|
||||
CourseName: Title
|
||||
CourseShorthand: Shorthand
|
||||
CourseShorthandUnique: Needs to be unique within school and year. Will be used verbatim within the url of the course type page.
|
||||
CourseShorthandUnique: Needs to be unique within school and year. Will be used verbatim within the url of the course category page.
|
||||
CourseSemester: Year
|
||||
CourseDescriptionPlaceholder: Please include the module description
|
||||
CourseHomepageExternalPlaceholder: Optional external URL
|
||||
@ -38,14 +38,14 @@ CourseHomepageExternal: External homepage
|
||||
CourseSemesterMultipleTip: You are currently allowed to select from among multiple years. Please ensure that you select the appropriate year for your course.
|
||||
CourseVisibleFrom: Visible from
|
||||
CourseVisibleTo: Visible to
|
||||
CourseVisibleFromTip: The course type will be visible to others from this date onward. When left empty the course type will never be visible to other users. This does not affect course administrators, assistants, instructors, correctors, enrolled participants and applicants of/to this course. If the course type participates in a central allocation, the course type visibility will be forced during the application phase.
|
||||
CourseVisibleToTip: Other users will be able to see the course type from "Visible From" up to this date. When left empty visible courses will remain visible indefinitely.
|
||||
CourseMaterialFree: Course type material is publicly accessible
|
||||
CourseVisibleFromTip: The course category will be visible to others from this date onward. When left empty the course category will never be visible to other users. This does not affect course administrators, assistants, instructors, correctors, enrolled participants and applicants of/to this course. If the course category participates in a central allocation, the course category visibility will be forced during the application phase.
|
||||
CourseVisibleToTip: Other users will be able to see the course category from "Visible From" up to this date. When left empty visible courses will remain visible indefinitely.
|
||||
CourseMaterialFree: Course category material is publicly accessible
|
||||
CourseFormSectionRegistration: Registration
|
||||
CourseFormSectionAdministration: Administration
|
||||
CourseCapacity: Capacity
|
||||
CourseCapacityTip: Maximum permissable number of enrolments for this course; leave empty for unlimited capacity
|
||||
CourseSecretTip: Enrollment for this course type will require the password, if set
|
||||
CourseSecretTip: Enrollment for this course category will require the password, if set
|
||||
CourseSecretFormat: Arbitrary string
|
||||
CourseSecretWrong: Wrong password
|
||||
CourseSecret: Access password
|
||||
@ -59,17 +59,17 @@ CourseVisibilityEndMustBeAfterStart: The end of the visibility period must be af
|
||||
CourseRegistrationEndMustBeAfterStart: The end of the registration period must be after its start
|
||||
CourseDeregistrationEndMustBeAfterStart: The end of the deregistration period must be after the start of the registration period
|
||||
CourseUserMustBeLecturer: The current user needs to be a course administrator
|
||||
CourseShorthandTooLong: Long course type shorthands may lead to display issues and might complicate communication with students. Please choose a more concise shorthand if possible.
|
||||
CourseNotAlwaysVisibleDuringRegistration: To allow for students to register, the course type should also be visible during the entire registration period (which is currently not the case).
|
||||
CourseShorthandTooLong: Long course category shorthands may lead to display issues and might complicate communication with students. Please choose a more concise shorthand if possible.
|
||||
CourseNotAlwaysVisibleDuringRegistration: To allow for students to register, the course category should also be visible during the entire registration period (which is currently not the case).
|
||||
NoSuchTerm tid: Year #{tid} does not exist.
|
||||
NoSuchSchool ssh: Department #{ssh} does not exist.
|
||||
NoSuchCourseShorthand csh: There is no course type with shorthand #{csh}.
|
||||
NoSuchCourse: No such course type found.
|
||||
CourseNewDupShort tid ssh csh: Could not create course type #{tid}-#{ssh}-#{csh}. Another course type with the same shorthand or title already exists for the given year and school.
|
||||
NoSuchCourseShorthand csh: There is no course category with shorthand #{csh}.
|
||||
NoSuchCourse: No such course category found.
|
||||
CourseNewDupShort tid ssh csh: Could not create course category #{tid}-#{ssh}-#{csh}. Another course category with the same shorthand or title already exists for the given year and school.
|
||||
CourseInvalidInput: Invalid input
|
||||
CourseEditTitle: Edit/Create course
|
||||
CourseEditOk tid ssh csh: Successfully edited course type #{tid}-#{ssh}-#{csh}
|
||||
CourseEditDupShort tid ssh csh: Could not edit course type #{tid}-#{ssh}-#{csh}. Another course type with the same shorthand or title already exists for the given year and school.
|
||||
CourseEditOk tid ssh csh: Successfully edited course category #{tid}-#{ssh}-#{csh}
|
||||
CourseEditDupShort tid ssh csh: Could not edit course category #{tid}-#{ssh}-#{csh}. Another course category with the same shorthand or title already exists for the given year and school.
|
||||
CourseEditQualificationFail: A qualifikation could not be associated with this course for unknown reasons.
|
||||
CourseEditQualificationFailRights qsh ssh: Qualification #{qsh} could not be associated with this course, due to your insufficient rights for department #{ssh}.
|
||||
CourseEditQualificationFailExists: This qualification is already associated
|
||||
@ -83,21 +83,23 @@ CourseParticipantInvitationAccepted courseName: You were enrolled in #{courseNam
|
||||
CourseParticipantEnlistDirectly: Enrol known users directly
|
||||
CourseSubmissionGroup: Registered submission group
|
||||
SubmissionGroupEmptyIsUnsetTip: Leave empty to remove users from their respective submission groups
|
||||
CourseParticipantsRegisterHeading: Add course type participants
|
||||
CourseParticipantsRegisterActionAddParticipants: Add course type participants
|
||||
CourseParticipantsRegisterHeading: Add course category participants
|
||||
CourseParticipantsRegisterActionAddParticipants: Add course category participants
|
||||
CourseParticipantsRegisterActionAddTutorialMembers: Add course participants
|
||||
CourseParticipantsRegisterUsersField: Persons to register for course
|
||||
CourseParticipantsRegisterUsersFieldTip: Please enter id card no (including dot), Fraport personnel number or email. Please separate multiple entries with comma or space.
|
||||
CourseParticipantsRegisterTutorialOption: Register course type participants for course?
|
||||
CourseParticipantsRegisterTutorialOption: Register course category participants for course?
|
||||
CourseParticipantsRegisterTutorialField: Course
|
||||
CourseParticipantsRegisterTutorialFieldTip: If there is no course with this name, a new one will be created. If there is a course with this name, the course type participants will be registered for it.
|
||||
CourseParticipantsRegisterTutorialFieldTip: If there is no course with this name, a new one will be created. If there is a course with this name, the course category participants will be registered for it.
|
||||
CourseParticipantsRegisterNoneGiven: No persons given to register!
|
||||
CourseParticipantsRegisterNotFoundInAvs n: For #{n} #{pluralEN n "entry no corresponding person" "entries no corresponding persons"} could be found in AVS
|
||||
CourseParticipantsRegisterTutorialFirstDayTip: If a new course is created and a template exists, its dates are adjusted according to the start date
|
||||
CourseParticipantsRegisterUnnecessary: All requested registrations have already been saved. No actions have been performed.
|
||||
CourseParticipantsTutorialType: Template type
|
||||
CourseParticipantsTutorialTypeTooltip: A new course creation copies a course named "Template_[typ]", preferably from the same course category or another having the same name, the most recent being preferred.
|
||||
|
||||
CourseParticipantsInvited n: #{n} #{pluralEN n "invitation" "invitations"} sent via email
|
||||
CourseParticipantsAlreadyRegistered n: #{n} #{pluralEN n "participant is" "participants are"} already course type #{pluralEN n "member" "members"}
|
||||
CourseParticipantsAlreadyRegistered n: #{n} #{pluralEN n "participant is" "participants are"} already course category #{pluralEN n "member" "members"}
|
||||
CourseParticipantsAlreadyTutorialMember n: #{n} #{pluralEN n "participant is" "participants are"} already registered for this course
|
||||
CourseParticipantsRegistered n: Successfully registered #{n} #{pluralEN n "participant" "participants"} for course
|
||||
CourseParticipantsRegisteredTutorial n: Successfully registered #{n} #{pluralEN n "participant" "participants"} for course
|
||||
@ -110,9 +112,9 @@ CourseRegistrationFiles: Registration file(s)
|
||||
CourseRegistrationFilesNeedReupload: Registration files need to be reuploaded every time the registration is changed
|
||||
CourseRegistrationFile: Registration file
|
||||
CourseRegistrationArchive: Zip archive of registration files
|
||||
CourseDeregistrationNoShow: If you deregister from this course type “no show” will be recorded as your exam achievement for all exams associated with this course. If you have good reasons why you shold not be held accountable for leaving the course, please contact a course administrator. Course administrators can deregister you without incurring a permanent record.
|
||||
CourseDeregistrationFromInvisibleCourse: This course type is only visible to enrolled participants and applicants. If you deregister now, you will not be able to access the course type again!
|
||||
CourseDeregistrationNoReRegistration: If you deregister from the course type now, you will not be able to re-register yourself.
|
||||
CourseDeregistrationNoShow: If you deregister from this course category “no show” will be recorded as your exam achievement for all exams associated with this course. If you have good reasons why you shold not be held accountable for leaving the course, please contact a course administrator. Course administrators can deregister you without incurring a permanent record.
|
||||
CourseDeregistrationFromInvisibleCourse: This course category is only visible to enrolled participants and applicants. If you deregister now, you will not be able to access the course category again!
|
||||
CourseDeregistrationNoReRegistration: If you deregister from the course category now, you will not be able to re-register yourself.
|
||||
LoginNecessary: Please log in first!
|
||||
RegisterRetry: You haven't been enrolled. Press "Enrol for course" to enrol
|
||||
CourseRegisterOk: Successfully enrolled for course
|
||||
@ -135,6 +137,9 @@ CourseUserTutorialsDeregistered count: Sucessfully deregistered participant from
|
||||
CourseUserNoTutorialsDeregistered: Participant is not registered for any of the selected courses
|
||||
CourseUserTutorials: Registered courses
|
||||
CourseUserExams: Registered exams
|
||||
CourseUserExamOccurrences: Exam occurrence
|
||||
CourseUserExamOccurrenceOverride: Override other registrations for this exam, if any
|
||||
CourseUserExamOccurrenceAgainExaminer: Possibly allow previous examiners again
|
||||
CourseUserSheets: Exercise sheets
|
||||
CsvColumnUserName: Participant's full name
|
||||
CsvColumnUserMatriculation: Participant's AVS number
|
||||
@ -148,7 +153,7 @@ CsvColumnUserExam: Exams which the user is registered for, separated by semicolo
|
||||
CsvColumnUserSubmissionGroup: Registered submission group
|
||||
CsvColumnUserSurname: Participant's surname
|
||||
CsvColumnUserFirstName: Participant's given name
|
||||
CsvColumnUserNote: Course type notes for the participant
|
||||
CsvColumnUserNote: Course category notes for the participant
|
||||
CourseUserCsvName tid ssh csh: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-participants
|
||||
CourseUserTutorial: Registered course
|
||||
CourseUserExam: Registered exam
|
||||
@ -175,21 +180,21 @@ AssistantsFor: Assistants
|
||||
CourseAdminFor: Course administration
|
||||
TutorsFor n: #{pluralENs n "Instructor" }
|
||||
CorrectorsFor n: #{pluralEN n "Corrector" "Correctors"}
|
||||
CourseParticipantsHeading: Course type participants
|
||||
CourseParticipantsHeading: Course category participants
|
||||
CourseParticipantsCount n: #{n}
|
||||
CourseParticipantsCountOf n m: #{n} of #{m}
|
||||
CourseVisibility: Visibility
|
||||
CourseInvisible: This course type is currently only visible to course administrators, assistants, instructors, correctors, enrolled participants and applicants.
|
||||
CourseInvisible: This course category is currently only visible to course administrators, assistants, instructors, correctors, enrolled participants and applicants.
|
||||
CourseRegistrationInterval: Enrolment
|
||||
CourseDirectRegistrationInterval: Direct enrolment
|
||||
CourseDeregisterUntil time: Deregistration only until #{time}
|
||||
NotRegistered: Note enrolled for this course
|
||||
CourseMaterial: Material
|
||||
CourseMaterialNotFree: Course type material is only accessible to members of the course, e.g. for participants, instructors, correctors or administratiors.
|
||||
CourseMaterialsFoundHere: Material for this course type is available here
|
||||
CourseMaterialsNoneVisible: Currently there is no material for this course type or only material to which you don't have access (e.g. because of visibility settings)
|
||||
CourseSheetsFoundHere: Exercise sheets for this course type are available here
|
||||
CourseSheetsNoneVisible: Currently there are no exercise sheets for this course type or only exercise sheets to which you don't have access (e.g. because of visibility settings)
|
||||
CourseMaterialNotFree: Course category material is only accessible to members of the course, e.g. for participants, instructors, correctors or administratiors.
|
||||
CourseMaterialsFoundHere: Material for this course category is available here
|
||||
CourseMaterialsNoneVisible: Currently there is no material for this course category or only material to which you don't have access (e.g. because of visibility settings)
|
||||
CourseSheetsFoundHere: Exercise sheets for this course category are available here
|
||||
CourseSheetsNoneVisible: Currently there are no exercise sheets for this course category or only exercise sheets to which you don't have access (e.g. because of visibility settings)
|
||||
SheetListCourse: Exercise sheets
|
||||
CourseExams: Exams
|
||||
CourseTutorials: Courses
|
||||
@ -232,13 +237,13 @@ TutorialRegisterFrom: Register from
|
||||
TutorialRegisterTo: Register to
|
||||
|
||||
CourseDeleteQuestion: Are you sure you want to delete the below-mentioned course?
|
||||
CourseDeleted: Course type deleted
|
||||
CourseDeleted: Course category deleted
|
||||
|
||||
UtilEditedBy name time: #{time} by #{name}
|
||||
CourseDate: Date
|
||||
MailSubjectLecturerInvitation tid ssh csh: [#{tid}-#{ssh}-#{csh}] Invitation to be a course administrator
|
||||
LecturerInvitationAccepted lType csh: You were registered as #{lType} for #{csh}
|
||||
CourseExamRegistrationTime: Registered since
|
||||
CourseExamRegistrationTime: Registered on
|
||||
CourseParticipantStateIsActiveFilter: View
|
||||
CourseApply: Apply for course
|
||||
CourseAdministrator: Course administrator
|
||||
@ -3,7 +3,7 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
CourseEvents: Termine
|
||||
CourseEventType: Art
|
||||
CourseEventType: Kategorie
|
||||
CourseEventTypePlaceholder: Vorlesung, Zentralübung, ...
|
||||
CourseEventTime: Zeit
|
||||
CourseEventRoom: Regulärer Raum
|
||||
@ -8,17 +8,17 @@ CourseEventTypePlaceholder: Lecture, Exercise discussion, ...
|
||||
CourseEventTime: Time
|
||||
CourseEventRoom: Regular room
|
||||
CourseEventRoomHidden: Room only for participants
|
||||
CourseEventRoomHiddenTip: Should the room only be displayde to course type participants?
|
||||
CourseEventRoomHiddenTip: Should the room only be displayde to course category participants?
|
||||
CourseEventRoomIsUnset: —
|
||||
CourseEventRoomIsHidden: Room is only displayed to course type associated persons (participants, instructors, correctors, etc.)
|
||||
CourseEventRoomIsHidden: Room is only displayed to course category associated persons (participants, instructors, correctors, etc.)
|
||||
CourseEventNote: Note
|
||||
CourseEventActions: Actions
|
||||
CourseEventsActionEdit: Edit
|
||||
CourseEventsActionDelete: Delete
|
||||
CourseEventsActionCreate: New occurrence
|
||||
CourseEventCreated: Successfully created course type occurrence
|
||||
CourseEventEdited: Successfully edited course type occurrence
|
||||
CourseEventDeleteQuestion: Are you sure you want to delete the course type occurrence mentioned below?
|
||||
CourseEventDeleted: Successfully deleted course type occurrence
|
||||
CourseEventEdit: Edit course type occurrence
|
||||
CourseEventNew: New course type occurrence
|
||||
CourseEventCreated: Successfully created course category occurrence
|
||||
CourseEventEdited: Successfully edited course category occurrence
|
||||
CourseEventDeleteQuestion: Are you sure you want to delete the course category occurrence mentioned below?
|
||||
CourseEventDeleted: Successfully deleted course category occurrence
|
||||
CourseEventEdit: Edit course category occurrence
|
||||
CourseEventNew: New course category occurrence
|
||||
@ -9,17 +9,17 @@ CourseNewsLastEdited time: Last changed: #{time}
|
||||
CourseNewsActionEdit: Edit
|
||||
CourseNewsActionDelete: Delete
|
||||
CourseNewsActionCreate: Create new item
|
||||
CourseNewsVisibleFromEditWarning: This item of course type news has already been published and should no longer be changed sind this might confuse participants.
|
||||
CourseNewsVisibleFromEditWarning: This item of course category news has already been published and should no longer be changed sind this might confuse participants.
|
||||
CourseNewsVisibleFromTip: If left empty this item is never visible. Leave empty for unfinished items
|
||||
CourseNewsTitle: Title
|
||||
CourseNewsSummary: Summary
|
||||
CourseNewsSummaryTip: If specified this only the summary will be shown on the course type page, saving space. The content will be shown in a popup
|
||||
CourseNewsSummaryTip: If specified this only the summary will be shown on the course category page, saving space. The content will be shown in a popup
|
||||
CourseNewsContent: Content
|
||||
CourseNewsParticipantsOnly: Only for course type participants
|
||||
CourseNewsParticipantsOnly: Only for course category participants
|
||||
CourseNewsVisibleFrom: Visible from
|
||||
CourseNewsCreated: Successfully created item of course type news
|
||||
CourseNewsEdited: Successfully edited item of course type news
|
||||
CourseNewsDeleteQuestion: Are you sure you want to delete the item of course type news listed below?
|
||||
CourseNewsDeleted: Successfully deleted item of course type news
|
||||
CourseNewsNew: Add course type news
|
||||
CourseNewsEdit: Edit item of course type news
|
||||
CourseNewsCreated: Successfully created item of course category news
|
||||
CourseNewsEdited: Successfully edited item of course category news
|
||||
CourseNewsDeleteQuestion: Are you sure you want to delete the item of course category news listed below?
|
||||
CourseNewsDeleted: Successfully deleted item of course category news
|
||||
CourseNewsNew: Add course category news
|
||||
CourseNewsEdit: Edit item of course category news
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>
|
||||
# SPDX-FileCopyrightText: 2022-25 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -35,7 +35,7 @@ ExamEditHeading examn@ExamName: #{examn} bearbeiten
|
||||
ExamNameTip: Muss innerhalb der Veranstaltung eindeutig sein
|
||||
ExamDescription: Beschreibung
|
||||
ExamFormTimes: Zeiten
|
||||
ExamFormOccurrences: Prüfungstermine/Räume
|
||||
ExamFormOccurrences: Prüfungstermine / Räume
|
||||
ExamFormAutomaticFunctions: Automatische Funktionen
|
||||
ExamFormCorrection: Korrektur
|
||||
ExamFormParts: Teile
|
||||
@ -43,12 +43,13 @@ ExamFormMode: Ausgestaltung der Prüfung
|
||||
ExamFormGrades: Prüfungsleistungen
|
||||
ExamStart: Beginn
|
||||
ExamEnd: Ende
|
||||
ExamTimeTip: Nur zur Information der Studierenden, die tatsächliche Zeitangabe erfolgt pro Prüfungstermin/Raum
|
||||
ExamTimeTip: Nur zur Information, die tatsächliche Zeitangabe erfolgt pro Prüfungstermin/Raum.
|
||||
ExamTimeFilterTip: In der Kursansicht für Kursverwaltende wird diese Zeit zur Filterung verwendet.
|
||||
ExamVisibleFrom: Sichtbar ab
|
||||
ExamVisibleFromTip: Ohne Datum nie sichtbar und keine Anmeldung möglich
|
||||
ExamRegisterFrom: Anmeldung ab
|
||||
ExamRegisterTo: Anmeldung bis
|
||||
ExamRegisterFromTip: Zeitpunkt ab dem sich Kursartteilnehmer:innen selbständig zur Prüfung anmelden können; ohne Datum ist keine Anmeldung möglich
|
||||
ExamRegisterFromTip: Zeitpunkt ab dem sich Kursartteilnehmer:innen selbständig zur Prüfung anmelden können; ohne Datum ist keine selbständige Anmeldung möglich
|
||||
ExamDeregisterUntil: Abmeldung bis
|
||||
ExamPublishOccurrenceAssignments: Termin- bzw. Raumzuteilung den Teilnehmer:innen mitteilen um
|
||||
ExamPublishOccurrenceAssignmentsTip: Ab diesem Zeitpunkt können Teilnehmer:innen einsehen zu welcher Teilprüfung bzw. welchen Raum sie angemeldet sind
|
||||
@ -64,14 +65,15 @@ ExamAutomaticGradingTip: Sollen die Gesamtleistungen der Teilnehmer:innen automa
|
||||
ExamBonus: Bonuspunkte-System
|
||||
ExamGradingMode: Bewertungsmodus
|
||||
ExamGradingModeTip: In welcher Form werden Prüfungsleistungen für diese Prüfung eingetragen?
|
||||
ExamStaff: Prüfer:innen/Verantwortliche Hochschullehrer:innen
|
||||
ExamStaffTip: Geben Sie bitte in jedem Fall einen Namen an, der Prüfer:in/Veranstalter:in/Hochschullehrer:in eindeutig identifiziert! Sollte der Name des Prüfers/der Prüferin allein womöglich nicht eindeutig sein, so geben Sie bitte eindeutig identifizierende Zusatzinfos, wie beispielsweise den Lehrstuhl bzw. die LFE o.Ä., an.
|
||||
ExamStaff: Hauptverantworliche:r
|
||||
ExamStaffTip: Hauptverantwortliche:r Prüfer:in, Textfeld zur reinen Information der Teilnehmenden.
|
||||
ExamExamOfficeSchools: Zusätzliche Bereiche
|
||||
ExamExamOfficeSchoolsTip: Prüfungsbeauftragte von Bereichen, die Sie hier angeben, erhalten im System (zusätzlich zum primären Bereich der zugehörigen Kursart) volle Einsicht in sämtliche für diese Prüfung hinterlegten Leistungen, unabhängig von den Studiendaten der Teilnehmer:innen.
|
||||
ExamCorrectorEmail: E-Mail
|
||||
ExamCorrectors: Korrektor:innen
|
||||
ExamCorrectorsTip: Hier eingetragene Korrektor:innen können zwischen Beginn der Prüfung und "Bewertung abgeschlossen ab" Ergebnisse für alle Teilprüfungen und alle Teilnehmer:innen im System hinterlegen.
|
||||
ExamCorrectorAlreadyAdded: Ein Korrektor/eine Korrektorin mit dieser E-Mail ist bereits für diese Prüfung eingetragen
|
||||
ExamCorrectors: Prüfer:innen
|
||||
ExamCorrectorsTip: Hier eingetragene Prüfer:innen können zwischen Beginn der Prüfung und "Bewertung abgeschlossen ab" Ergebnisse für alle Teilprüfungen und alle Teilnehmer:innen im System hinterlegen.
|
||||
ExamCorrectorAlreadyAdded: Ein Prüfer:innen mit dieser E-Mail ist bereits für diese Prüfung eingetragen
|
||||
ExamParticipant: Prüfungsteilnehmer:in
|
||||
ExamRoom: Raum
|
||||
ExamRoomManual': Keine automatische bzw. selbstständige Zuteilung
|
||||
ExamRoomSurname': Nach Nachname
|
||||
@ -86,6 +88,7 @@ ExamRoomAlreadyExists: Prüfung ist bereits eingetragen
|
||||
ExamRoomName: Interne Bezeichnung
|
||||
ExamRoomCapacity: Kapazität
|
||||
ExamRoomCapacityNegative: Kapazität darf nicht negativ sein
|
||||
ExamRoomCapacityInsufficient n@Int: Kapazität reicht nicht aus, #{noneOneMoreDE n "keine Plätze" "nur noch ein Platz" ("nur noch " <> tshow n <> " Plätze")} verfügbar
|
||||
ExamRoomTime: Termin
|
||||
ExamRoomStart: Beginn
|
||||
ExamRoomEnd: Ende
|
||||
@ -123,6 +126,8 @@ ExamOccurrenceStartMustBeAfterExamStart eoName@ExamOccurrenceName: Beginn des Te
|
||||
ExamOccurrenceEndMustBeBeforeExamEnd eoName@ExamOccurrenceName: Ende des Termins #{eoName} liegt nach dem Ende der Prüfung
|
||||
ExamOccurrenceDuplicate eoRoom@Text eoRange@Text: Raum #{eoRoom}, Termin #{eoRange} kommt mehrfach mit der selben Beschreibung vor
|
||||
ExamOccurrenceDuplicateName eoName@ExamOccurrenceName: Interne Terminbezeichnung #{eoName} kommt mehrfach vor
|
||||
ExamOccurrenceExaminerIsUnset !ident-ok: —
|
||||
ExamOccurrenceExaminerIsHidden: Prüfer wird nur Teilnehmer:innen angezeigt
|
||||
ExamOccurrenceRoomIsUnset !ident-ok: —
|
||||
ExamOccurrenceRoomIsHidden: Raum wird nur Teilnehmer:innen angezeigt
|
||||
ExamOccurrenceCannotBeDeletedDueToRegistrations eoName@ExamOccurrenceName: Termin #{eoName} kann nicht gelöscht werden, da noch Teilnehmer:innen diesem Termin zugewiesen sind. Über die Liste von Prüfungsteilnehmern können Sie zunächst die entsprechenden Terminzuweisungen entfernen.
|
||||
@ -217,6 +222,13 @@ ExamOccurrenceRuleParticipant: Termin- bzw. Raumzuteilungsverfahren
|
||||
ExamRegisteredCount: Anmeldungen
|
||||
ExamRegisteredCountOf num@Int64 count@Int64 !ident-ok: #{num}/#{count}
|
||||
ExamOccurrences: Termine
|
||||
ExamOccurrencesCopied num@Int: #{pluralDEeN num "Prüfungstermin"} kopiert
|
||||
ExamOccurrencesEdited num@Int del@Int: #{pluralENsN num "Prüfungstermin"} geändert #{guardMonoid (del > 0) ("und " <> pluralENsN num "Prüfungstermin" <> " gelöscht")}
|
||||
ExamOccurrenceCopyNoStartDate: Dieser Kurs hat noch keine eigene Termine um Prüfungstermine zeitlich damit zu assoziieren
|
||||
ExamOccurrenceCopyFail: Keine passenden Prüfungstermine zum Kopieren gefunden
|
||||
ExaminerReocurrence examiner@Text: Mehrfache Prüfung durch #{examiner}!
|
||||
ExamProblemReoccurrence: Prüfungen mit wiederholt gleichem Prüfer
|
||||
ExamNoProblemReoccurrence: Heute keine Prüfungen mit wiederholtem Prüfer.
|
||||
GradingFrom: Ab
|
||||
ExamNoShow: Nicht erschienen
|
||||
ExamVoided: Entwertet
|
||||
@ -264,6 +276,7 @@ ExamAutoOccurrenceExceptionRoomTooSmall: Automatische Verteilung gescheitert. Ei
|
||||
ExamBonusInfoPoints: Zur Berechnung von Bonuspunkten werden nur jene Blätter herangezogen, deren Aktivitätszeitraum vor Start des jeweiligen Termin/Prüfung begonnen hat
|
||||
ExamUserCsvSheetName tid@TermId ssh@SchoolId csh@CourseShorthand examn@ExamName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase examn} Teilnehmer
|
||||
|
||||
ExamRoomExaminerTip: Nur bereits eingetragene Prüfer:innen sind hier erlaubt
|
||||
ExamRoomCapacityTip: Maximale Anzahl an Prüfungsteilnehmern für diesen Termin/Raum; leer lassen für unbeschränkte Teilnehmeranzahl
|
||||
ExamRoomMappingRandom: Verteilung
|
||||
ExamFinishHeading: Prüfungsergebnisse sichtbar schalten
|
||||
@ -1,11 +1,11 @@
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>
|
||||
# SPDX-FileCopyrightText: 2022-25 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
ExamRegistrationInviteDeadline: Invitation valid until
|
||||
ExamRegistrationEnlistDirectly: Register known users directly
|
||||
ExamRegistrationEnlistDirectlyTip: Should users whose email addresses are known to the system be registered for the exam directly? Otherwise invitations will be sent to alle users, which they will have to accept first in order to be registered. Unknown users always receive an invitation.
|
||||
ExamRegistrationRegisterCourse: Also enroll users in course type
|
||||
ExamRegistrationRegisterCourse: Also enroll users in course category
|
||||
ExamRegistrationRegisterCourseTip: Users that aren't enrolled already won't be registered for the exam otherwise.
|
||||
ExamRegistrationInviteField: Email addresses
|
||||
ExamParticipantsRegisterHeading: Add exam participants
|
||||
@ -35,7 +35,7 @@ ExamEditHeading examn: Edit #{examn}
|
||||
ExamNameTip: Needs to be unique within the course
|
||||
ExamDescription: Description
|
||||
ExamFormTimes: Times
|
||||
ExamFormOccurrences: Occurrences/rooms
|
||||
ExamFormOccurrences: Occurrences / Rooms
|
||||
ExamFormAutomaticFunctions: Automatic functions
|
||||
ExamFormCorrection: Correction
|
||||
ExamFormParts: Exam parts
|
||||
@ -43,12 +43,13 @@ ExamFormMode: Exam design
|
||||
ExamFormGrades: Exam achievements
|
||||
ExamStart: Start
|
||||
ExamEnd: End
|
||||
ExamTimeTip: Only for informational purposes. The actual times are set for each occurrence/room
|
||||
ExamTimeTip: Only for informational purposes. The actual times are set for each occurrence/room.
|
||||
ExamTimeFilterTip: Also used for Filtering in the course administrator course view.
|
||||
ExamVisibleFrom: Visible from
|
||||
ExamVisibleFromTip: If left empty the exam is never visible and course type participants may not register.
|
||||
ExamVisibleFromTip: If left empty the exam is never visible and course category participants may not register.
|
||||
ExamRegisterFrom: Register from
|
||||
ExamRegisterTo: Register to
|
||||
ExamRegisterFromTip: Start of the period in which course type participants may register themselves for the exam. If left empty participants are never allowed to register.
|
||||
ExamRegisterFromTip: Start of the period in which course category participants may register themselves for the exam. If left empty participants are never allowed to register themselves.
|
||||
ExamDeregisterUntil: Deregister until
|
||||
ExamPublishOccurrenceAssignments: Publish occurrence/room-assignments
|
||||
ExamPublishOccurrenceAssignmentsTip: At this time participants can find out to which occurrence/room they are assigned
|
||||
@ -64,14 +65,15 @@ ExamAutomaticGradingTip: Should the exam achievement be automatically computed f
|
||||
ExamBonus: Bonus point system
|
||||
ExamGradingMode: Grading mode
|
||||
ExamGradingModeTip: In which format should grades for this exam be entered?
|
||||
ExamStaff: Examiner/Responsible university teacher
|
||||
ExamStaffTip: Please always specify a name that uniquely identifies the examiner/organiser/repsonsible university teacher! If there is a possibility that the name alone is ambiguous please also specify some additional information e.g. the professorial chair or the educational and research unit.
|
||||
ExamStaff: Chief examiner
|
||||
ExamStaffTip: Primary responsible examiner, arbirary text field for pure informational purposes.
|
||||
ExamExamOfficeSchools: Additional departments
|
||||
ExamExamOfficeSchoolsTip: Exam offices of departments you specify here will also have full access to all results for this exam disregarding the individual participants' features of study.
|
||||
ExamCorrectorEmail: Email
|
||||
ExamCorrectors: Correctors
|
||||
ExamCorrectorsTip: Correctors configured here may, after the start of the exam and until "Results visible from", enter exam part results for all exam parts and participants.
|
||||
ExamCorrectorAlreadyAdded: A corrector with this email address already exists
|
||||
ExamCorrectors: Examiner
|
||||
ExamCorrectorsTip: Examiners configured here may, after the start of the exam and until "Results visible from", enter exam part results for all exam parts and participants.
|
||||
ExamCorrectorAlreadyAdded: An examiner with this email address already exists
|
||||
ExamParticipant: Examinee
|
||||
ExamRoom: Room
|
||||
ExamRoomManual': No automatic or autonomous assignment
|
||||
ExamRoomSurname': By surname
|
||||
@ -86,6 +88,7 @@ ExamRoomAlreadyExists: Occurrence already configured
|
||||
ExamRoomName: Internal name
|
||||
ExamRoomCapacity: Capacity
|
||||
ExamRoomCapacityNegative: Capacity may not be negative
|
||||
ExamRoomCapacityInsufficient n@Int: Insufficient capacity, #{noneOneMoreEN n "none" "just one" ("only " <> tshow n)} remaining
|
||||
ExamRoomTime: Time
|
||||
ExamRoomStart: Start
|
||||
ExamRoomEnd: End
|
||||
@ -123,8 +126,10 @@ ExamOccurrenceStartMustBeAfterExamStart eoName: Start of the occurrence #{eoName
|
||||
ExamOccurrenceEndMustBeBeforeExamEnd eoName: End of the occurrence #{eoName} must be before the exam end
|
||||
ExamOccurrenceDuplicate eoRoom eoRange: Combination of room #{eoRoom} and occurrence #{eoRange} occurs multiple times
|
||||
ExamOccurrenceDuplicateName eoName: Internal name #{eoName} occurs multiple times
|
||||
ExamOccurrenceExaminerIsUnset !ident-ok: —
|
||||
ExamOccurrenceExaminerIsHidden: Examiner only displayed to participants registered for this occurrence
|
||||
ExamOccurrenceRoomIsUnset: —
|
||||
ExamOccurrenceRoomIsHidden: Room is only displayed to participants registered for this occurrence/room
|
||||
ExamOccurrenceRoomIsHidden: Room only displayed to participants registered for this occurrence
|
||||
ExamOccurrenceCannotBeDeletedDueToRegistrations eoName: Occurrence #{eoName} cannot be deleted because participants are registered for it. You can remove the offending registrations via the list of exam participants.
|
||||
ExamRegistrationMustFollowSchoolSeparationFromStart dayCount: As per school rules there #{pluralEN dayCount "needs" "need"} to be at least #{dayCount} #{pluralEN dayCount "day" "days"} between "Register from" and "Start".
|
||||
ExamRegistrationMustFollowSchoolDuration dayCount: As per school rules there #{pluralEN dayCount "needs" "need"} to be at least #{dayCount} #{pluralEN dayCount "day" "days"} between "Register from" and "Register to".
|
||||
@ -159,7 +164,7 @@ CsvColumnExamUserExercisePassesMax: Maximum number of exercise sheets the partic
|
||||
CsvColumnExamUserBonus: Exam bonus points
|
||||
CsvColumnExamUserParts: Number of points the participant achieved per exam part. One column per exam part if applicable.
|
||||
CsvColumnExamUserResult: Exam achievement; "passed", "failed", "no-show", "voided", or any number grade ("1.0", "1.3", "1.7", ..., "4.0", "5.0")
|
||||
CsvColumnExamUserCourseNote: Course type notes for the participant
|
||||
CsvColumnExamUserCourseNote: Course category notes for the participant
|
||||
CsvColumnExamOfficeExamUserOccurrenceStart: Exam occurrence (ISO 8601)
|
||||
CsvColumnUserStudyFeatures: All relevant features of study for the participant, separated by semicolon (;)
|
||||
ExamUserCsvName tid ssh csh examn: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase examn}-participants
|
||||
@ -176,7 +181,7 @@ ExamAction: Action
|
||||
ExamUsersExamDataRequiresRegistration: If exam data (part-/result, occurrence/room, bonus) is to be modified/set, the relenvant participant needs to be registered for the exam.
|
||||
ExamNoOccurrence: No occurrence/room
|
||||
ExamBonusNone: No bonus points
|
||||
ExamUserCsvCourseNoteDeleted: Course type note will be deleted
|
||||
ExamUserCsvCourseNoteDeleted: Course category note will be deleted
|
||||
ExamUsersDeregistered count: Successfully deregistered #{show count} #{pluralEN count "participant" "participants"}
|
||||
ExamUsersOccurrenceUpdated count: Successfully assigned occurrence/room for #{show count} #{pluralEN count "participant" "participants"}
|
||||
ExamUsersResultsAccepted count: Successfully accepted computed result for #{show count} #{pluralEN count "participant" "participants"}
|
||||
@ -217,6 +222,13 @@ ExamOccurrenceRuleParticipant: Occurrence/room assignment procedure
|
||||
ExamRegisteredCount: Registrations
|
||||
ExamRegisteredCountOf num count: #{num}/#{count}
|
||||
ExamOccurrences: Exams
|
||||
ExamOccurrencesCopied num: #{pluralENsN num "exam occurrence"} copied
|
||||
ExamOccurrencesEdited num del: #{pluralENsN num "exam occurrence"} edited #{guardMonoid (del > 0) ("and " <> pluralENsN num "exam occurrence" <> " deleted")}
|
||||
ExamOccurrenceCopyNoStartDate: This course needs its own occurrence to copy associated exam occurrences.
|
||||
ExamOccurrenceCopyFail: No suitable exam occurrences found to copy from.
|
||||
ExaminerReocurrence examiner: Multiple examinations by #{examiner}!
|
||||
ExamProblemReoccurrence: Exams with reoccurring examiner
|
||||
ExamNoProblemReoccurrence: Today there are no exams with a reoccurring examiner.
|
||||
GradingFrom: From
|
||||
|
||||
#templates widgets/bonus-rule
|
||||
@ -262,6 +274,8 @@ ExamAutoOccurrenceExceptionNoUsers: No participants can be distributed with the
|
||||
ExamAutoOccurrenceExceptionRoomTooSmall: Automatic distribution failed. A different distribution procedure might succeed. Alternatively, minimizing rooms or removing small rooms might help.
|
||||
ExamBonusInfoPoints: When calculating an exam bonus only those sheets will be considered, for which the submission period started before the start of the relevant occurrence/room
|
||||
ExamUserCsvSheetName tid ssh csh examn: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase examn} Participants
|
||||
|
||||
ExamRoomExaminerTip: Only examiners allowed here, add beforehand
|
||||
ExamRoomCapacityTip: Maximum number of participants for this occurrence/room; leave empty for unlimited capacity
|
||||
ExamRoomMappingRandom: Distribution
|
||||
ExamFinishHeading: Make results visible
|
||||
@ -302,9 +316,9 @@ ExamUserCsvOverrideResult: Override exam result in contradiction of computed val
|
||||
ExamUserCsvSetBonus: Set bonus points
|
||||
ExamUserCsvSetResult: Set exam result
|
||||
ExamUserCsvSetPartResult: Set result for exam part
|
||||
ExamUserCsvSetCourseNote: Modify course type participant notes
|
||||
ExamUserCsvExceptionNoMatchingUser: Course type participant could not be identified uniquely. All identifiers (given name(s), surname, display name, matriculation, ..) must match exactly. You can try to remove some of the identifiers for the given line (i.e. all but matriculation). Uni2work will then search for users using only the remaining identifiers. In this case special care should be taken that Uni2work correctly identifies the intended user.
|
||||
ExamUserCsvExceptionMultipleMatchingUsers: Course type participant could not be identified uniquely. There are multiple users that match the given identifiers. You can try to add more identifiers for the given line to ensure that only the intended user can be identified with them.
|
||||
ExamUserCsvSetCourseNote: Modify course category participant notes
|
||||
ExamUserCsvExceptionNoMatchingUser: Course category participant could not be identified uniquely. All identifiers (given name(s), surname, display name, matriculation, ..) must match exactly. You can try to remove some of the identifiers for the given line (i.e. all but matriculation). Uni2work will then search for users using only the remaining identifiers. In this case special care should be taken that Uni2work correctly identifies the intended user.
|
||||
ExamUserCsvExceptionMultipleMatchingUsers: Course category participant could not be identified uniquely. There are multiple users that match the given identifiers. You can try to add more identifiers for the given line to ensure that only the intended user can be identified with them.
|
||||
ExamUserCsvExceptionNoMatchingStudyFeatures: The specified field did not match with any of the participant's fields of study. You can try to remove the field of study for the given line. Uni2work will then automatically choose a field of study.
|
||||
ExamUserCsvExceptionNoMatchingOccurrence: Occurrence/room could not be identified uniquely. Please ensure that the given line only contains internal room identifiers exactly as they have been configured for this exam.
|
||||
ExamUserCsvExceptionMismatchedGradingMode expectedGradingMode actualGradingMode: The imported data contained an exam achievement which does not match the grading mode for this exam. The expected grading mode can be changed at "Edit exam" ("Passed/Failed", "Numeric grades", or "Mixed").
|
||||
@ -15,8 +15,8 @@ ExternalExamCorrectErrorNeedleTooShort: This identifier is too short.
|
||||
UnauthorizedExternalExamCorrectorGrade: You may not enter overall exam achievements for this exam.
|
||||
ExternalExamCorrectErrorMultipleMatchingUsers: This identifier matches on multiple students.
|
||||
ExternalExamCorrectErrorNoMatchingUsers: This identifier does not match any student.
|
||||
ExternalExamEdited coursen@CourseName examn@ExamName: Succesfully edited exam “#{examn}” for course type “#{coursen}”.
|
||||
ExternalExamExists coursen@CourseName examn@ExamName: Exam “#{examn}” already exists for course type “#{coursen}”.
|
||||
ExternalExamEdited coursen@CourseName examn@ExamName: Succesfully edited exam “#{examn}” for course category “#{coursen}”.
|
||||
ExternalExamExists coursen@CourseName examn@ExamName: Exam “#{examn}” already exists for course category “#{coursen}”.
|
||||
ExternalExamEdit coursen examn: Edit: #{coursen}, #{examn}
|
||||
ExternalExamSemester: Year
|
||||
ExternalExamSchool: Department
|
||||
@ -41,10 +41,10 @@ ExternalExamStaffTip: The list of ssociated persons is shown to exam offices and
|
||||
ExternalExamStaffAlreadyAdded: Person is already associated with the exam.
|
||||
ExternalExamStaffEmail: Email
|
||||
ExternalExamUserMustBeStaff: You yourself must always be an associated person for exams you create.
|
||||
ExternalExamCourseExists: This course type already exists with FRADrive. Exams for courses that exist within FRADrive should be associated with the course type directly instead of being created as an external exam.
|
||||
ExternalExamCourseExists: This course category already exists with FRADrive. Exams for courses that exist within FRADrive should be associated with the course category directly instead of being created as an external exam.
|
||||
HeadingExternalExamList: External exams
|
||||
HeadingExternalExamNew: New external exam
|
||||
ExternalExamCreated coursen@CourseName examn@ExamName: Succesfully created exam “#{examn}” for course type “#{coursen}”.
|
||||
ExternalExamCreated coursen@CourseName examn@ExamName: Succesfully created exam “#{examn}” for course category “#{coursen}”.
|
||||
MailSubjectExternalExamStaffInvitation coursen examn: Invitation to act as examiner for “#{examn}” of “#{coursen}”
|
||||
ExternalExamOccurrenceEdited count: Successfully edited #{count} #{pluralEN count "occurrence" "occurrences"}
|
||||
ExternalExamResultEdited count: Successfully edited #{count} #{pluralEN count "exam result" "exam results"}
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
MaterialList !ident-ok: Material
|
||||
MaterialName !ident-ok: Name
|
||||
MaterialType: Art
|
||||
MaterialType: Typ
|
||||
MaterialTypePlaceholder: Folien, Code, Beispiel, ...
|
||||
MaterialTypeSlides: Folien
|
||||
MaterialTypeCode !ident-ok: Code
|
||||
@ -0,0 +1,38 @@
|
||||
# SPDX-FileCopyrightText: 2022 Winnie Ros <winnie.ros@campus.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
MaterialList: Material
|
||||
MaterialName: Name
|
||||
MaterialType: Type
|
||||
MaterialTypePlaceholder: Slides, Code, Example, ...
|
||||
MaterialTypeSlides: Slides
|
||||
MaterialTypeCode: Code
|
||||
MaterialTypeExample: Example
|
||||
MaterialDescription: Description
|
||||
MaterialVisibleFrom: Visible to participants from
|
||||
MaterialVisibleFromTip: Never visible to participants if left empty; leaving the date empty is only sensible for unfinished course category material or when course category material should be provided only to sheet correctors
|
||||
MaterialVisibleFromEditWarning: This course category material has already been published and should not be edited. Doing so might confuse the participants.
|
||||
MaterialInvisible: This course category material is currently invisible to participants!
|
||||
MaterialFiles: Files
|
||||
MaterialHeading materialName: #{materialName}
|
||||
MaterialListHeading: Course category materials
|
||||
MaterialNewHeading: Publish new course category material
|
||||
MaterialNewTitle: New course category material
|
||||
MaterialEditHeading materialName: Edit course category material “#{materialName}”
|
||||
MaterialEditTitle materialName: Edit course category material “#{materialName}”
|
||||
MaterialSaveOk tid ssh csh materialName: Successfully saved “#{materialName}” for course category #{tid}-#{ssh}-#{csh}
|
||||
MaterialNameDup tid ssh csh materialName: Course category material with the name “#{materialName}” already exists for course category #{tid}-#{ssh}-#{csh}
|
||||
MaterialDeleteCaption: Do you really want to delete the course category material mentioned below?
|
||||
MaterialDelHasFiles count: including #{count} #{pluralEN count "file" "files"}
|
||||
MaterialIsVisible: Caution, this course category material has already been published.
|
||||
MaterialDeleted materialName: Successfully deleted course category material “#{materialName}”
|
||||
MaterialArchiveName tid ssh csh materialName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase materialName}
|
||||
MaterialVideo materialName: #{materialName} - Video
|
||||
MaterialVideoUnsupported: Your browser does not seem to support embedded video
|
||||
MaterialVideoDownload: Download
|
||||
MaterialFree: Course category material is publicly available.
|
||||
AccessibleSince: Accessible since
|
||||
VisibleFrom: Published
|
||||
FilterMaterialNameSearch !ident-ok: Name
|
||||
FilterMaterialTypeAndDescriptionSearch: Type/description
|
||||
@ -2,16 +2,16 @@
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
ParticipantsList: Lists of course type participants
|
||||
ParticipantsIntersect: Common course type participants
|
||||
ParticipantsList: Lists of course category participants
|
||||
ParticipantsIntersect: Common course category participants
|
||||
ParticipantsCsvName tid ssh: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-participants
|
||||
ParticipantsIntersectCourseOption tid@TermId ssh@SchoolId coursen@CourseName: #{tid} - #{ssh} - #{coursen}
|
||||
ParticipantsIntersectCourses: Courses
|
||||
CourseParticipantsRegisteredWithoutField n: #{n} #{pluralEN n "participant was" "participants were"} registered without #{pluralEN n "an associated field of study" "associated fields of study"}, because #{pluralEN n "it" "they"} could not be determined uniquely.
|
||||
ParticipantsCsvSheetName tid ssh: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)} Participants
|
||||
CourseParticipants n: Currently #{n} course type #{pluralEN n "participant" "participants"}
|
||||
CourseParticipants n: Currently #{n} course category #{pluralEN n "participant" "participants"}
|
||||
ParticipantsIntersectNotOne: Intersection
|
||||
AllUsersUnion: Union of all participants
|
||||
AllUsersIntersection: Intersection of all participants
|
||||
CourseDeleteActiveParticipants: This course type still has active participants. Remove all active participants first if you really want to delete this course.
|
||||
CourseDeleteExistExams: This course type cannot be deleted, for as long as associated exams exist.
|
||||
CourseDeleteActiveParticipants: This course category still has active participants. Remove all active participants first if you really want to delete this course.
|
||||
CourseDeleteExistExams: This course category cannot be deleted, for as long as associated exams exist.
|
||||
@ -13,8 +13,8 @@ SheetDeleteQuestion: Do you really want to delete the below-mentioned exercise s
|
||||
SheetDeleted: Successfully deleted exercise sheet
|
||||
SheetArchiveName tid ssh csh shn: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn}
|
||||
SheetTypeArchiveName tid ssh csh shn renderedSft: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn}-#{foldCase renderedSft}
|
||||
SheetEditOk tid ssh csh sheetName: Successfully saved exercise sheet #{sheetName} in course type #{tid}-#{ssh}-#{csh}
|
||||
SheetNameDup tid ssh csh sheetName: There already is an exercise sheet #{sheetName} in course type #{tid}-#{ssh}-#{csh}
|
||||
SheetEditOk tid ssh csh sheetName: Successfully saved exercise sheet #{sheetName} in course category #{tid}-#{ssh}-#{csh}
|
||||
SheetNameDup tid ssh csh sheetName: There already is an exercise sheet #{sheetName} in course category #{tid}-#{ssh}-#{csh}
|
||||
SheetVisibleFrom: Visible from (for participants)
|
||||
SheetVisibleFromTip: Always invisible for participants and no submission possible if left empty; only leave this field empty for temporary/unfinished sheets
|
||||
SheetActiveFrom: Active from/Submission period start
|
||||
@ -24,7 +24,7 @@ SheetSolutionFromTip: Always invisible for participants if left empty; corrector
|
||||
SheetName: Name
|
||||
SheetDescription: Description
|
||||
SheetRequireExam: Require registration for an exam?
|
||||
SheetRequireExamTip: If registration for an exam is required, only course type participants that are registered for that exam at the time of submission will be allowed to create submission. Download of sheet files will also be restricted to course type participants registered for the exam.
|
||||
SheetRequireExamTip: If registration for an exam is required, only course category participants that are registered for that exam at the time of submission will be allowed to create submission. Download of sheet files will also be restricted to course category participants registered for the exam.
|
||||
SheetRequiredExam: Exam
|
||||
SheetFormType: Valuation & submission
|
||||
SheetFormTimes: Times
|
||||
@ -37,15 +37,15 @@ SheetMarkingFiles: Correction
|
||||
SheetMarkingTip: Instructions for correction, visible only to correctors
|
||||
SheetPersonalisedFilesDownload: Download personalised sheet files
|
||||
SheetPersonalisedFiles: Personalised sheet files
|
||||
SheetPersonalisedFilesTip: Should course type participants be assigned personalised sheet files in addition to the files configured above? Only the user to which a file has been assigned may view it.
|
||||
SheetPersonalisedFilesTip: Should course category participants be assigned personalised sheet files in addition to the files configured above? Only the user to which a file has been assigned may view it.
|
||||
SheetPersonalisedFilesUpload: Personalised sheet files
|
||||
SheetPersonalisedFilesUploadTip: Download the template for a ZIP-archive of personalised sheet files, move files into the directories corresponding to the desired users and upload the archive again. If the name of a personalised file matches the name of an unpersonalised file, the personalised file replaces the unpersonalised one from the respective participants' point of view.
|
||||
SheetPersonalisedFilesKeepExisting: Keep existing files
|
||||
SheetPersonalisedFilesKeepExistingTip: Should the personalised files you upload be added to the already existing ones, if applicable? Otherwise the files you upload will completely replace any existing files.
|
||||
SheetPersonalisedFilesAllowNonPersonalisedSubmission: Allow non-personalised submission
|
||||
SheetPersonalisedFilesAllowNonPersonalisedSubmissionTip: Should course type participants with no assigned personalised files be allowed to submit anyway?
|
||||
SheetPersonalisedFilesAllowNonPersonalisedSubmissionTip: Should course category participants with no assigned personalised files be allowed to submit anyway?
|
||||
SheetPersonalisedFilesDownloadTemplateHere: You can download a template for a ZIP-archive of personalised sheet files with the structure that Uni2work expects here:
|
||||
SheetPersonalisedFilesUsersList: List of course type participants who have personalised sheet files
|
||||
SheetPersonalisedFilesUsersList: List of course category participants who have personalised sheet files
|
||||
SheetPersonalisedFilesMetaYAMLSeedComment: This string was generated cryptographically from data uniquely identifying the user and exercise sheet. You can use it as a seed for a pseudorandom generator for generating (parts of) the personalised files.
|
||||
SheetPersonalisedFilesMetaYAMLNoSeedComment: There is not enough information available to generate a seed. You will have to create the exercise sheet in Uni2work first. Once seeds can be generated they will be generated cryptographically and you may use them to generate (parts of) the personalised files.
|
||||
SheetActiveFromTip: The exercise sheet's assignment will only be available for download and submission starting at this time. If left empty no submission or download of assignment is ever allowed
|
||||
@ -63,7 +63,7 @@ SheetErrDeadlineEarly: "Submission period end" must be after "Submission period
|
||||
SheetErrHintEarly: "Hint from" must be after "Submission period start"
|
||||
SheetErrSolutionEarly: "Solution from" must be after "Submission period end"
|
||||
SheetErrVisibleWithoutActive: If “Visible from (for participants)” is specified “Active from/Submission period start” must also be specified
|
||||
SheetSubmissionModeNoneWithoutNotGraded: The sheet was configured to be "No submission" but not "Not marked". Course type participants will not be able to submit.
|
||||
SheetSubmissionModeNoneWithoutNotGraded: The sheet was configured to be "No submission" but not "Not marked". Course category participants will not be able to submit.
|
||||
SheetWarnNoActiveTo: “Active to/Submission period end” should always be specified
|
||||
CountTutProp: Courses count against proportion
|
||||
CountTutPropTip: If submissions are assigned by course, do those assignments count with regard to the set proportion?
|
||||
@ -82,13 +82,13 @@ RatingPercent: Achieved
|
||||
IsRated: Marked
|
||||
SheetTypeIsExam: Rating „as an exam part“
|
||||
SheetGradingSummaryTitle intgr: #{intgr} #{pluralEN intgr "sheet" "sheets"}
|
||||
PersonalisedSheetFilesIgnored count: #{count} uploaded #{pluralEN count "file was" "files were"} ignored because #{pluralEN count "it" "they"} could not be associated with both a sheet file type and a course type participant.
|
||||
PersonalisedSheetFilesIgnored count: #{count} uploaded #{pluralEN count "file was" "files were"} ignored because #{pluralEN count "it" "they"} could not be associated with both a sheet file type and a course category participant.
|
||||
PersonalisedSheetFilesIgnoredIntro: The following files were ignored:
|
||||
PersonalisedSheetFilesDownloadRestrictByExamNone: No restriction
|
||||
PersonalisedSheetFilesDownloadRestrictByExam: Restrict to exam participants
|
||||
PersonalisedSheetFilesDownloadRestrictByExamTip: Only download personalised sheet files for participants also registered to a certain exam?
|
||||
PersonalisedSheetFilesDownloadAnonymousField: Anonymisation
|
||||
PersonalisedSheetFilesDownloadAnonymousFieldTip: Should the ZIP-archive of personalised files be anonymised (it would then contain no immediately identifiable information regard the course type participants) or should directory names be decorated with an identifiable feature of the user and the files of meta information contain additional personal data?
|
||||
PersonalisedSheetFilesDownloadAnonymousFieldTip: Should the ZIP-archive of personalised files be anonymised (it would then contain no immediately identifiable information regard the course category participants) or should directory names be decorated with an identifiable feature of the user and the files of meta information contain additional personal data?
|
||||
PersonalisedSheetFilesMetaFilename uid: meta-information_#{toPathPiece uid}.yaml
|
||||
PersonalisedSheetFilesArchiveName tid ssh csh shn: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase shn}-personalised_files
|
||||
SheetGeneratePseudonym: Generate
|
||||
@ -49,10 +49,10 @@ SubmissionArchive: Zip-archive of submission files
|
||||
SubmissionArchiveCorrected: Zip-archive of submission files including corrections
|
||||
SubmissionFile: Submission file
|
||||
SubmissionFiles: Submitted files
|
||||
EmailInvitationWarningPrevCoSubmittors: This address could not be matched to any course type participant with whom you have submitted for this course type before. An Invitation will be sent via email.
|
||||
EmailInvitationWarningCourseParticipants: This address coulde not be matched to any course type participant. An Invitation will be sent via email.
|
||||
MultiUserFieldExplanationPrevCoSubmittors: This input searches through the addresses of all course type participants for whom it could be determined, that you have already submitted with that person for this course.
|
||||
MultiUserFieldExplanationCourseParticipants: This input searches through the addresses of all course type participants.
|
||||
EmailInvitationWarningPrevCoSubmittors: This address could not be matched to any course category participant with whom you have submitted for this course category before. An Invitation will be sent via email.
|
||||
EmailInvitationWarningCourseParticipants: This address coulde not be matched to any course category participant. An Invitation will be sent via email.
|
||||
MultiUserFieldExplanationPrevCoSubmittors: This input searches through the addresses of all course category participants for whom it could be determined, that you have already submitted with that person for this course.
|
||||
MultiUserFieldExplanationCourseParticipants: This input searches through the addresses of all course category participants.
|
||||
SubmissionAlreadyExistsFor email: #{email} already has a submission for this sheet.
|
||||
SubmissionUsersEmpty: Submissions may not be created without submittors.
|
||||
SubmissionUserAlreadyAdded: This user is already configured as a submittor
|
||||
@ -155,7 +155,7 @@ SubmissionSomeUsersDuplicateWarning: Some submittors are also submittors for a d
|
||||
|
||||
EMailUnknown email: Email #{email} does not belong to any known user.
|
||||
CorDeficitProportion: Deficit (proportion)
|
||||
CosubmittorTip: Invitations are sent via email to exactly those addresses for which it cannot be determined, that you have already submitted for this course type with the associated person, at least once. If one of the specified addresses can be matched to a person with whom you have submitted at least once for this course type already, the name of that person will be shown and the submission will immediately be made in their name as well.
|
||||
CosubmittorTip: Invitations are sent via email to exactly those addresses for which it cannot be determined, that you have already submitted for this course category with the associated person, at least once. If one of the specified addresses can be matched to a person with whom you have submitted at least once for this course category already, the name of that person will be shown and the submission will immediately be made in their name as well.
|
||||
CorrDownload: Download
|
||||
SubmissionDownloadAnonymous: Anonymized
|
||||
SubmissionDownloadSurnames: With surnames
|
||||
@ -237,9 +237,9 @@ SubmissionFilterAuthorshipStatementCurrent: Current wording
|
||||
|
||||
SubmissionNoUsers: This submission has no associated users!
|
||||
|
||||
CsvColumnCorrectionTerm: Term of the course type of the submission
|
||||
CsvColumnCorrectionSchool: School of the course type of the submission
|
||||
CsvColumnCorrectionCourse: Shorthand of the course type of the submission
|
||||
CsvColumnCorrectionTerm: Term of the course category of the submission
|
||||
CsvColumnCorrectionSchool: School of the course category of the submission
|
||||
CsvColumnCorrectionCourse: Shorthand of the course category of the submission
|
||||
CsvColumnCorrectionSheet: Name of the sheet of the submission
|
||||
CsvColumnCorrectionSubmission: Number of the submission (uwa…)
|
||||
CsvColumnCorrectionSurname: Submittor's surnames, separated by semicolon (;)
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022-24 Winnie Ros <winnie.ros@campus.lmu.de>, Steffen Jost <s.jost@fraport.de>
|
||||
# SPDX-FileCopyrightText: 2022-25 Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -47,13 +47,26 @@ TutorialUserDeregister: Vom Kurs abmelden
|
||||
TutorialUserSendMail: Mitteilung verschicken
|
||||
TutorialUserPrintQualification: Zertifikat drucken
|
||||
TutorialUserGrantQualification: Qualifikation vergeben
|
||||
TutorialUserGrantQualificationDateTooltip: Leer lassen, um das Ablaufdatum auf das heutige Datum plus Standardgültigkeitsdauer zu setzen.
|
||||
TutorialUserGrantQualificationDateError qsh@QualificationShorthand: Qualifikation #{qsh} hat keine Standardgültigkeitsdauer, daher ist ein explizites Ablaufdatum erforderlich!
|
||||
TutorialUserRenewQualification: Qualifikation regulär verlängern
|
||||
TutorialUserRenewedQualification n@Int: Qualifikation für #{tshow n} Kurs-#{pluralDE n "Teilnehmer:in" "Teilnehmer:innen"} regulär verlängert
|
||||
TutorialUserGrantedQualification n@Int: Qualifikation erfolgreich an #{tshow n} Kurs-#{pluralDE n "Teilnehmer:in" "Teilnehmer:innen"} vergeben
|
||||
TutorialUserRenewedQualification qsh@QualificationShorthand n@Int: Qualifikation #{qsh} für #{tshow n} Kurs-#{pluralDE n "Teilnehmer:in" "Teilnehmer:innen"} regulär verlängert.
|
||||
TutorialUserGrantedQualification qsh@QualificationShorthand day@Text n@Int: Qualifikation #{qsh} bis #{day} erfolgreich an #{tshow n} Kurs-#{pluralDE n "Teilnehmer:in" "Teilnehmer:innen"} vergeben.
|
||||
TutorialUserAssignExam: Zur Prüfung einteilen
|
||||
TutorialUserExamAssignedFor n@Int m@Int p@Text: #{n}/#{m} zur Prüfung #{p} eingeteilt
|
||||
CommTutorial: Kursmitteilung
|
||||
TutorialDrivingPermit: Führerschein
|
||||
TutorialEyeExam: Sehtest
|
||||
TutorialNote: Kursnotiz
|
||||
TutorialDayAttendance day@Text: Anwesenheit am #{day}
|
||||
TutorialDayNote day@Text: Anwesenheitsnotiz für #{day}
|
||||
TutorialParticipantsDayEdits n@Int: #{tshow n} Kursteilnehmer-Tagesnotizen aktualisiert
|
||||
TutorialDayAttendance day@Text: Anwesenheit #{day}
|
||||
TutorialDayNote day@Text: Anwesenheitsnotiz #{day}
|
||||
TutorialParticipantsDayEdits day@Text: Kursteilnehmer-Tagesnotizen aktualisiert für #{day}
|
||||
|
||||
PossibleCheckResults: Mögliche Prüfungsergebnisse
|
||||
CheckEyePermitMissing: Sehtest oder Führerschein fehlen noch
|
||||
CheckEyePermitIncompatible: Sehtest und Führerschein passen nicht zusammen
|
||||
|
||||
GenTutActOccCopyLast: Prüfungstermine von früherem Kurs kopieren
|
||||
GenTutActOccCopyWeek: Prüfungstermine von früherer Woche kopieren
|
||||
GenTutActOccEdit: Relevante Prüfungstermine bearbeiten
|
||||
GenTutActShowExam: Prüfungsergebnisse der Kursteilnehmer anzeigen
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022-24 Winnie Ros <winnie.ros@campus.lmu.de>, Steffen Jost <s.jost@fraport.de>
|
||||
# SPDX-FileCopyrightText: 2022-25 Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -12,16 +12,16 @@ TutorialEdited tutn: Successfully edited course #{tutn}
|
||||
TutorialEditHeading tutn: Edit #{tutn}
|
||||
TutorEmail: Email
|
||||
TutorialTutorAlreadyAdded: An user with this email address is already registered as instructor
|
||||
TutorialNameTip: Needs to be unique within the course type
|
||||
TutorialNameTip: Needs to be unique within the course category
|
||||
TutorialTypePlaceholder: Tutorial, Driving lesson, ...
|
||||
TutorialTypeTip: Only for informational purposes
|
||||
TutorialRegGroupTip: Course type participants may only register for a maximum of one course per registration group. Courses that do not have a registration group are treated as being in different registration groups
|
||||
TutorialRegGroupTip: Course category participants may only register for a maximum of one course per registration group. Courses that do not have a registration group are treated as being in different registration groups
|
||||
TutorialRegGroup: Registration group
|
||||
TutorialTutorControlled: Instructors may edit course
|
||||
TutorialTutorControlledTip: Should instructors be allowed to edit arbitrary aspects of this course (name, registration group, room, time, other instructors, ...) at will?
|
||||
TutorialCapacity: Capacity
|
||||
TutorialCapacityNonPositive: Capacity may not be negative
|
||||
TutorialCapacityTip: Limits how many course type participants may register for this course
|
||||
TutorialCapacityTip: Limits how many course category participants may register for this course
|
||||
TutorialRoomHiddenTip: Should the room only be displayed to course participants?
|
||||
RegisterFrom: Enrolment starts
|
||||
RegisterTo: Enrolment ends
|
||||
@ -43,18 +43,30 @@ TutorInviteHeading tutn: Invitation to be instructor for #{tutn}
|
||||
TutorInviteExplanation: You were invited to be a instructor.
|
||||
TutorCorrectorInvitationAccepted shn: You are now a corrector for #{shn}
|
||||
TutorialUsersDeregistered count: Successfully deregistered #{show count} participants from course
|
||||
|
||||
TutorialUserDeregister: Deregister from course
|
||||
TutorialUserSendMail: Send mail
|
||||
TutorialUserPrintQualification: Print certificate
|
||||
TutorialUserGrantQualification: Grant qualification
|
||||
TutorialUserGrantQualificationDateTooltip: Leave blank for expiry on today's date plus standard qualification valid duration.
|
||||
TutorialUserGrantQualificationDateError qsh@QualificationShorthand: Qualification #{qsh} has no standard valid duration. Please provide an explicit expiry date!
|
||||
TutorialUserRenewQualification: Renew qualification
|
||||
TutorialUserRenewedQualification n@Int: Successfully renewed qualification #{tshow n} course #{pluralEN n "user" "users"}
|
||||
TutorialUserGrantedQualification n: Successfully granted qualification #{tshow n} course #{pluralEN n "user" "users"}
|
||||
TutorialUserRenewedQualification qsh n: Successfully renewed #{qsh} qualification for #{pluralENsN n "course participant"}
|
||||
TutorialUserGrantedQualification qsh day n: Successfully granted #{qsh} qualification until #{day} to #{pluralENsN n "course participant"}
|
||||
TutorialUserAssignExam: Register for examination
|
||||
TutorialUserExamAssignedFor n@Int m@Int p@Text: #{n}/#{m} enrolled for exam #{p}
|
||||
CommTutorial: Course message
|
||||
TutorialDrivingPermit: Driving permit
|
||||
TutorialEyeExam: Eye exam
|
||||
TutorialNote: Course note
|
||||
TutorialDayAttendance day: Attendance #{day}
|
||||
TutorialDayNote day: Attendance note #{day}
|
||||
TutorialParticipantsDayEdits n@Int: #{tshow n} course participant day notes updated
|
||||
TutorialParticipantsDayEdits day: course participant day notes updated for #{day}
|
||||
|
||||
PossibleCheckResults: Possible results
|
||||
CheckEyePermitMissing: Eye exam or driving permit missing
|
||||
CheckEyePermitIncompatible: Eye exam and driving permit are incompatible
|
||||
|
||||
GenTutActOccCopyLast: Copy exam occurrences from previous course
|
||||
GenTutActOccCopyWeek: Copy exam occurrences from course on previous week
|
||||
GenTutActOccEdit: Edit relevant exam occurrences
|
||||
GenTutActShowExam: Show exam results for course participants
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2023-24 Steffen Jost <s.jost@fraport.de>
|
||||
# SPDX-FileCopyrightText: 2023-25 Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -41,7 +41,7 @@ FirmUserActMkSuper: Zum Firmenansprechpartner ernennen
|
||||
FirmUserActChangeDetailsResult n@Int64 t@Int64: Firmenassoziation von #{n}/#{t} #{pluralDE n "Firmenangehörigen" "Firmenangehörige"} wurden aktualisiert
|
||||
FirmUserActChangeResult n@Int64 t@Int64: Benachrichtigungseinstellung für #{n}/#{t} #{pluralDE n "Firmenangehörigen" "Firmenangehörige"} wurden geändert
|
||||
FirmUserActRemoveResult uc@Int64: #{uc} #{pluralDE uc "Firmenassoziation" "Firmenassoziationen"} entfernt.
|
||||
FirmRemoveSupervision sup@Int64 sub@Int64: #{noneMoreDE sup "" (tshow sup <> " Ansprechpartnerbeziehungen wegen entferntem Ansprechpartner gelöscht. ")} #{noneOneMoreDE sub "Keine Ansprechpartnerbeziehung" "Eine Ansprechpartnerbeziehung" (tshow sup <> " Ansprechpartnerbeziehungen")} wegen entferntem Angesprochenem gelöscht.
|
||||
FirmRemoveSupervision sup@Int64 sub@Int64: #{noneMoreDE sup "" (tshow sup <> " Ansprechpartnerbeziehungen wegen entferntem Ansprechpartner gelöscht. ")} #{noneOneMoreDE sub "Keine Ansprechpartnerbeziehung" "Eine Ansprechpartnerbeziehung" (tshow sup <> " Ansprechpartnerbeziehungen")} wegen entferntem Klienten gelöscht.
|
||||
FirmNewSupervisor: Neue individuelle Ansprechpartner hinzufügen
|
||||
FirmSetSupervisor: Existierende Ansprechpartner hinzufügen
|
||||
FirmSetSupersReport nusr@Int64 nspr@Int64 nrem@Int64: Für #{nusr} Firmenangehörige wurden #{nspr} individuelle Ansprechpartner eingetragen#{bool "." (" und " <> tshow nrem <> " individuelle Ansprechpartnerbeziehungen gelöscht.") (nrem >0)}
|
||||
@ -73,9 +73,25 @@ TableSuperior: Vorgesetzter
|
||||
TableIsDefaultReroute: Standardumleitung
|
||||
FormFieldPostal: Benachrichtigungseinstellung
|
||||
FormFieldPostalTip: Gilt für alle Benachrichtigungen an diese Person, nicht nur für Umleitungen an diesen Ansprechpartner
|
||||
FormFieldPinPass: Sensible PDF-E-Mail-Anhänge mit Passwort schützen?
|
||||
FormFieldPinPassRemove: Passwortschutz für PDF-E-Mail-Anhänge entfernen?
|
||||
FirmSupervisionKeyData: Kennzahlen Ansprechpartner
|
||||
CompanyUserPriority: Firmenpriorität
|
||||
CompanyUserPriorityTip: Firmenpriorität ist lediglich relativ zu anderen Firmenassoziation der Person
|
||||
CompanyUserUseCompanyAddress: Verwendet Firmenkontaktaddresse
|
||||
CompanyUserUseCompanyAddressTip: sofern im Benutzer keine Postanschrift hinterlegt ist
|
||||
CompanyUserUseCompanyPostalError: Postalische Adresse muss leer bleiben, damit die Firmenanschrift genutzt wird!
|
||||
CompanySupervisorCompanyMissing fsh@CompanyShorthand: Empfänger ist nicht mit Firma #{fsh} aus Ansprechpartnerbeziehung assoziiert
|
||||
CompanySuperviseeCompanyMissing fsh@CompanyShorthand: Klient ist nicht mit Firma #{fsh} aus Ansprechpartnerbeziehung assoziiert
|
||||
FirmSupervisionRInfo: In folgenden Ansprechpartnerbeziehungen gehören entweder der Ansprechpartner oder der Klient nicht mehr der Firma an, welche als Begründung für die Beziehung eingetragen ist.
|
||||
SupervisionViolationChoice: Firmenassoziation fehlt für
|
||||
SupervisionViolationEither: Egal
|
||||
SupervisionViolationSupervisor: Ansprechpartner
|
||||
SupervisionViolationClient: Klient
|
||||
SupervisionViolationBoth: Beide
|
||||
SupervisionsRemoved n@Int64 m@Int64: #{n}/#{m} #{pluralDE n "Ansprechpartnerbeziehung" "Ansprechpartnerbeziehungen"} entfernt.
|
||||
SupervisionsEdited n@Int64 m@Int64: #{n}/#{m} #{pluralDE n "Ansprechpartnerbeziehung" "Ansprechpartnerbeziehungen"} geändert.
|
||||
ASChangeCompany: Begründungen für Ansprechpartnerbeziehung abändern
|
||||
ASRemoveAssociation: Ansprechpartnerbeziehung löschen
|
||||
FirmNameNotFound: Keine Firma mit diesen Namen/Kürzel/AVS-Nr gefunden.
|
||||
FirmNameAmbiguous: Firmenname/-kürzel oder AVS-Nr ist nicht eindeutig.
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2023-24 Steffen Jost <s.jost@fraport.de>
|
||||
# SPDX-FileCopyrightText: 2023-25 Steffen Jost <s.jost@fraport.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -15,7 +15,7 @@ FirmActionInfo: Affects alle company associates under your supervision.
|
||||
FirmActNotify: Send message
|
||||
FirmActResetSupervision: Reset supervisors for all company associates
|
||||
FirmActResetSuperKeep: Additionally keep existing supervisors of company associates?
|
||||
FirmActRemoveSupers: Terminate all company related supervisonships?
|
||||
FirmActRemoveSupers: Terminate all company related supervisionships?
|
||||
FirmActResetMutualSupervision: Supervisors supervise each other
|
||||
FirmActResetSupersKeepAll: Keep all
|
||||
FirmActResetSupersRemoveAps: Remove default supervisors only
|
||||
@ -25,7 +25,7 @@ FirmActAddAssociates: Associate users with company
|
||||
FirmActAddSupersEmpty: No new supervisors added!
|
||||
FirmActAddSupersSet n postal: #{n} default company supervisors changed #{maybeBoolMessage postal "" "and switched to postal notifications" "and switched to email notifications"}, but not yet activated.
|
||||
FirmActAddAssocsEmpty: No new company associated users added!
|
||||
FirmActAddAssocs n@Int64: #{pluralENsN n "company associated user"} added.
|
||||
FirmActAddAssocs n: #{pluralENsN n "company associated user"} added.
|
||||
RemoveSupervisors ndef: #{ndef} default supervisors removed.
|
||||
FirmActChangeContactUser: Change contact data for all company associates
|
||||
FirmActChangeContactFirm: Change company contact data
|
||||
@ -73,9 +73,25 @@ TableSuperior: Superior
|
||||
TableIsDefaultReroute: Default reroute
|
||||
FormFieldPostal: Notification type
|
||||
FormFieldPostalTip: Affects all notifications to this person, not just reroutes to this supervisor
|
||||
FormFieldPinPass: Protect sensitive PDF e-mail attachments by password?
|
||||
FormFieldPinPassRemove: Remove password protection for PDF e-mail attachments?
|
||||
FirmSupervisionKeyData: Supervision key data
|
||||
CompanyUserPriority: Company priority
|
||||
CompanyUserPriorityTip: Company priority is relative to other company associations for a user
|
||||
CompanyUserUseCompanyAddress: Use company postal address
|
||||
CompanyUserUseCompanyAddressTip: if and only if the postal address of the user is empty
|
||||
CompanyUserUseCompanyPostalError: Individual postal address must left empty for the company address to be used!
|
||||
CompanySupervisorCompanyMissing fsh: Receiver is not associated with #{fsh} given as reroute reason
|
||||
CompanySuperviseeCompanyMissing fsh: Supervisee is not associated with #{fsh} detailed as supervisionship reason
|
||||
FirmSupervisionRInfo: Shown are supervisionships where either supervisor or supervisee no longer belong to the company associated with the supervisionship.
|
||||
SupervisionViolationChoice: Company association missing for
|
||||
SupervisionViolationEither: anyone
|
||||
SupervisionViolationSupervisor: Supervisor
|
||||
SupervisionViolationClient: Supervisee
|
||||
SupervisionViolationBoth: both
|
||||
SupervisionsRemoved n m: #{n}/#{m} #{pluralENs n "Supervisionship"} removed.
|
||||
SupervisionsEdited n m: #{n}/#{m} #{pluralENs n "Supervisionship"} edited.
|
||||
ASChangeCompany: Change supervisionship annotations
|
||||
ASRemoveAssociation: Delete supervisionship
|
||||
FirmNameNotFound: No company found with this name/shorthand or AVS number.
|
||||
FirmNameAmbiguous: Company name/shorthand or AVS number is amiguous.
|
||||
@ -6,7 +6,7 @@ HeadingLegal: Legal
|
||||
InfoSupervisorTitle: Information for supervisors
|
||||
InfoLecturerTitle: Information for course administrators
|
||||
InfoLecturerCourses: Courses
|
||||
InfoLecturerExercises: Course type exercises
|
||||
InfoLecturerExercises: Course category exercises
|
||||
InfoLecturerTutorials: Courses
|
||||
InfoLecturerExams: Exams
|
||||
LecturerInfoTooltipNew: New feature
|
||||
@ -20,8 +20,8 @@ KnownBugs: Known bugs
|
||||
ImplementationDetails: Implementation
|
||||
Clone: Cloning
|
||||
Administrator: Administrator
|
||||
CommCourse: Course type message
|
||||
CommCourse: Course category message
|
||||
Corrector: Corrector
|
||||
DefinitionCourseEvents: Course type occurrences
|
||||
DefinitionCourseNews: Course type news
|
||||
DefinitionCourseEvents: Course category occurrences
|
||||
DefinitionCourseNews: Course category news
|
||||
Invitations: Invitations
|
||||
@ -17,7 +17,7 @@ PrintJobReprint n@Int m@Int: #{n}/#{m} #{pluralDE n "Druckauftrag" "Druckaufräg
|
||||
PrintJobAcknowledgeFailed: Keine Druckaufträge bestätigt aufgrund zwischenzeitlicher Änderungen. Bitte die Seite im Browser aktualisieren!
|
||||
PrintJobAcknowledgeQuestion n@Int d@Text: #{n} #{pluralDE n "Druckauftrag" "Druckaufräge"} vom #{d} als gedruckt und versendet bestätigen?
|
||||
PrintJobAcknowledgements: Versanddatum von Briefen an
|
||||
PrintRecipient: Empfänger
|
||||
PrintRecipient: Empfänger:innen
|
||||
PrintAffected: Betroffener
|
||||
PrintSender !ident-ok: Sender
|
||||
PrintCourse: Kursarten
|
||||
@ -28,5 +28,8 @@ PrintLmsUser: E‑Learning Id
|
||||
PrintJobs: Druckaufräge
|
||||
PrintLetterType: Brieftypkürzel
|
||||
|
||||
MCActDummy: Platzhalter
|
||||
MCActResendEmail: E‑Mail Kopie versenden
|
||||
MCActResendEmailTooltip: Eine unveränderte Kopie der E‑Mail erneut versenden. Nur die vorherigen Empfänger werden offiziell aufgeführt, sie erhalten jedoch keine neue Kopie.
|
||||
MCActResendEmailInfo n@Int recv@Text: #{pluralDEnN n "E‑Mail Kopie"} wurden an #{recv} versandt.
|
||||
|
||||
CCActDummy: Platzhalter
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user