Compare commits

..

667 Commits

Author SHA1 Message Date
64df38f2a9 fix(build): minor haskell typos/errors
The code was written without having a working compiler, hence some accidental code kinks remained.
2025-03-28 08:58:35 +01:00
3c6a580808 chore(git): add ghci history to gitignore 2025-03-28 08:52:58 +01:00
a3762ce938 Merge branch 'master' of https://dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive 2025-03-28 08:33:22 +01:00
573abcf43f refactor(lms): fix hlint suggestions 2025-03-28 08:32:30 +01:00
89d2462974 Merged PR 18750: refactor haskell build container 2025-03-27 12:09:47 +00:00
599d2c1c7a build(backend/Dockerfile): switch to custom-built haskell/stack Dockerfile to supply missing LLVM 2025-03-27 12:52:49 +01:00
d2105c8894 build(backend/Dockerfile): prevent chown of backend files by allow-different-user in stack config 2025-03-27 12:52:07 +01:00
7b486702f4 Add map creating utility after merge confligt 2025-03-27 11:33:06 +00:00
bf88b19f1c Merged PR 18721: chore(tutorial): granting qualification automatically picks better expiry date
chore(tutorial): granting qualification automatically picks better expiry date

Previously, the form for granting tutorial users a qualification suggested the minimum of all expiry dates, if there where several course qualficiations. This lead to some users being granted driving licences being valid for only one month.

The expiry date can now be left blank, using the validDuration of the selected qualification instead.

The default is blank, if there are more than one course qualification having disagreeing qualification dates.
2025-03-27 11:29:18 +00:00
5fd52768bc build(Makefile): add list-projects target 2025-03-27 11:35:01 +01:00
123e9eb057 build(Makefile): fix shell and ghci targets for entrypoint 2025-03-27 11:30:54 +01:00
5ab47c6c4f chore: update gitignore [skip ci] 2025-03-27 11:30:05 +01:00
fd6ba5b0c5 build(backend/Dockerfile): add ENTRYPOINT to support launching ghci with given SRC, etc. 2025-03-27 11:07:14 +01:00
f784f645a6 docs(Makefile): add missing help entries for shell and ghci 2025-03-27 11:06:15 +01:00
92ff99a36e chore(tutorial): granting qualification automatically picks better expiry date
Previously, the form for granting tutorial users a qualification suggested the minimum of all expiry dates, if there where several course qualficiations. This lead to some users being granted driving licences being valid for only one month.

The expiry date can now be left blank, using the validDuration of the selected qualification instead.

The default is blank, if there are more than one course qualification having disagreeing qualification dates.
2025-03-26 16:58:07 +01:00
5a5e4886b7 fix(build): merge from 145-build-system-rewrite neglected newer files
some directories were moved, which ignored files added later on
2025-03-25 18:23:00 +01:00
506b26ddd5 Merged PR 18679: build(Makefile): hard-kill containers before cleaning images
build(Makefile): hard-kill containers before cleaning images
2025-03-25 16:46:14 +00:00
aa664a5822 build(Makefile): hard-kill containers before cleaning images 2025-03-25 17:45:54 +01:00
487069b29e Merged PR 18678: build(Makefile): start: exec instead of run
build(Makefile): start: exec instead of run
2025-03-25 16:41:23 +00:00
f5d701a871 build(Makefile): start: exec instead of run 2025-03-25 17:41:07 +01:00
579ea86503 Merged PR 18677: build(Makefile): launch bash in shell-$SERVICE; add ghci target
build(Makefile): launch bash in shell-$SERVICE; add ghci target
2025-03-25 16:27:50 +00:00
9c1b074adf build(Makefile): launch bash in shell-$SERVICE; add ghci target 2025-03-25 17:27:21 +01:00
a01398f1db Merged PR 18675: add shell-service 2025-03-25 16:16:51 +00:00
020486819f build(Makefile): add shell-$SERVICE target 2025-03-25 17:15:31 +01:00
cd8a7a8322 build(compose.yaml): fix backend binary path bind; add bin path to PATH 2025-03-25 16:52:32 +01:00
79e0d5a642 Merged PR 18666: Update to docker compose 2025-03-25 15:21:18 +00:00
27c5f61299 build(compose.yaml): restrict help service permissions 2025-03-25 15:51:41 +01:00
69b5818427 build(Makefile): remove images too on clean-all 2025-03-25 15:46:39 +01:00
e5e7612e9b build(Makefile): Clean containers on clean-all 2025-03-25 15:44:00 +01:00
ebf71b7135 build(compose.yaml): fix help command 2025-03-25 15:34:14 +01:00
e7c7ec7a82 docs(Makefile): add help messages 2025-03-25 15:33:45 +01:00
d55efd77f7 build(Makefile): rework help and clean 2025-03-25 15:20:21 +01:00
72f5a9fb37 build: move backend-related files into backend dir; implement and connect services via docker-compose
TODOs left: reimplement clean and help, sync static,well-known and assets between services
2025-03-23 04:52:49 +01:00
f1ec60a5b6 build: start to rewrite containerized-Makefile logic for docker-compose; restructure frontend build 2025-03-23 01:44:38 +01:00
5c01ea36c1 chore(release): 27.4.59-0.0.20+145-build-system-rewrite 2025-03-19 02:19:27 +01:00
26b34eee15 build(docker/backend): disable tlmgr for now, to be fixed elsewhere 2025-03-19 02:19:17 +01:00
efa55c8f72 Merged PR 18403: Static ports for development
Commit babee7af: build(Makefile): use static port and dir settings for memcached, minio and maildev
2025-03-18 13:57:20 +00:00
babee7afa2 build(Makefile): use static port and dir settings for memcached, minio and maildev 2025-03-18 14:02:46 +01:00
0cee6f01e8 build(Makefile): fortify PROD var 2025-03-18 14:02:09 +01:00
fdd4283b0d Merged PR 18302: Various Container Fixes
- SET_IMAGE problem fixed
- Static files via memcached
2025-03-17 12:03:42 +00:00
0ac972bf22 chore(release): 27.4.59-0.0.19+145-build-system-rewrite 2025-03-17 10:18:25 +01:00
f40818c1cc build(docker/backend): tlmgr init-usertree 2025-03-17 10:18:06 +01:00
d33a792045 build(Makefile): remove SET_IMAGE in favour of LOCAL_CONTAINERFILE; use non-local postgres with launch args 2025-03-17 10:15:16 +01:00
9ce3b5d146 chore(release): 27.4.59-0.0.18+145-build-system-rewrite 2025-03-17 09:41:54 +01:00
570cfc238b fix(static): fix addStaticContent by using memcached again to supply static files 2025-03-14 20:19:26 +01:00
4fb7a71cfc Merged PR 18230: build(frontend): fix frontend manifest generation
build(frontend): fix frontend manifest generation
2025-03-13 14:05:37 +00:00
b8f6581064 build(frontend): fix frontend manifest generation 2025-03-12 01:21:13 +01:00
c9613e2982 fix(docker): add latex packages to backend container 2025-03-11 17:45:04 +01:00
19c64616f0 fix(build): changing tlmgr setup 2025-03-11 17:06:23 +01:00
e403b6bfb2 Merge branch 'master' of https://dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive 2025-03-11 16:26:32 +01:00
87da02048c Merged PR 18093: build(docker/backend): install texlive only for use with tlmgr; setup tlmgr
build(docker/backend): install texlive only for use with tlmgr; setup tlmgr
2025-03-11 15:25:19 +00:00
3dc74de68e fix(job): jobworkers not working due to dev-settings 2025-03-11 16:21:13 +01:00
b4f85f155a chore(make): add start maildev to start 2025-03-11 16:20:13 +01:00
a97dc071a3 chore(job): add interface for sleep job adding 2025-03-11 12:28:43 +01:00
ee5a79398f chore(job): add sleep job for testing
also show running job workers
2025-03-10 18:24:17 +01:00
e069d6be46 build(docker/backend): install texlive only for use with tlmgr; setup tlmgr 2025-03-10 17:38:30 +01:00
6b32cddeac Merged PR 18029: merge maildev 2025-03-10 16:01:24 +00:00
553e699b56 build(Makefile): add maildev target for local testing 2025-03-10 16:31:33 +01:00
479e807d6d Merged PR 18025: Mail search function implemented
- searching emails
- show course qualification in separate columns

Related work items: #2978, #2979
2025-03-10 15:16:12 +00:00
9d1a97172e fix(tutorial): fix #2978 by having one column per course qualification 2025-03-10 15:57:06 +01:00
24196cc2cd fix(mail): day filtering working in comms center 2025-03-10 12:01:43 +01:00
9ba7a82449 fix(mail): fix #2979 by completing simple mail resent function 2025-03-10 11:41:48 +01:00
695bd18763 build(Makefile): implement compile-release for local release container builds 2025-03-08 16:13:07 +01:00
7e61e56ae1 chore(mail): towards #2979 by providing simple mail resent function 2025-03-07 18:00:55 +01:00
207a304192 chore(mail): towards #2979 by allowing to filter by content in mail center 2025-03-07 17:54:05 +01:00
1b8c6c33a7 chore(latex): try latex-full
does not work either :(
2025-03-07 15:25:02 +01:00
bee015c1f2 fix(job): reenable full jobworkers for test settings 2025-03-07 15:24:04 +01:00
1521d08355 chroe(latex): adjust dockerfiles to be similar with respect to latex 2025-03-06 18:23:11 +01:00
bb047da360 Merge branch '145-build-system-rewrite' 2025-03-06 16:17:10 +01:00
6f90c04b1b build(Makefile): only call make in containers when appropriate; use SET_IMAGE for postgres 2025-03-06 16:16:26 +01:00
1633c41b1d Merged PR 17901: build(Makefile): add dependencies targets as explicit prerequisite for compil...
build(Makefile): add dependencies targets as explicit prerequisite for compiles and starts
2025-03-06 10:58:34 +00:00
20faec8973 build(Makefile): add dependencies targets as explicit prerequisite for compiles and starts 2025-03-06 11:31:40 +01:00
65cb75921d Merged PR 17873: fix yesod-bin
build(Makefile): move yesod-bin and hpack installs to dependencies-backend for more robustness
2025-03-06 07:41:40 +00:00
8104ce96cc build(Makefile): move yesod-bin and hpack installs to dependencies-backend for more robustness 2025-03-05 18:09:48 +01:00
396b365a31 build(Makefile): make backend compiles/starts dependent on .stack target 2025-03-05 18:07:37 +01:00
ff3d33bbf4 build(docker/backend): switch from Dockerfile-based yesod-bin+hpack install to Makefile-based install 2025-03-05 18:05:37 +01:00
82ea44c63f build(docker/backend): use non-mounted directory as stack root; install yesod-bin and hpack in CI too 2025-03-05 17:07:52 +01:00
926dbae09a Merged PR 17790: build(Makefile): really clean everything on clean-all
build(Makefile): really clean everything on clean-all
2025-03-04 15:41:01 +00:00
eb67136c0c build(Makefile): really clean everything on clean-all 2025-03-04 16:35:58 +01:00
b37954d452 Merged PR 17760: build(docker/backend): try backend build without chmod to avoid filemode diffs
build(docker/backend): try backend build without chmod to avoid filemode diffs
2025-03-04 12:43:40 +00:00
5752b4b8da build(docker/backend): try backend build without chmod to avoid filemode diffs 2025-03-04 13:24:30 +01:00
3929bccd6e Manual copy from branch 145-build-system-rewrite due to botched-merge 2025-03-03 11:56:07 +01:00
aae5a5f997 fix spdx copyright year having 2 digits only 2025-03-03 11:44:03 +01:00
1fc948711a Manual copy from branch merge-rewrite-jost due to botched-merge 2025-03-03 11:32:14 +01:00
088587549d chore(profile): show examiners in profile data, towards #2347 2025-03-03 10:47:59 +01:00
bc63324ddf chore(profile): towards exam table in profile data (WIP)
towards #2347
2025-03-03 10:46:53 +01:00
9a12e00f7f refactor(i18n): make SomeMessages more flexible to distinguish it from UniWorXMessages, deprecated the latter 2025-02-28 19:02:28 +01:00
06cd87f360 fix(umlaut): renamee files with german umlaut for ease of use 2025-02-28 18:47:52 +01:00
095002637f chore(qualification): prepare stub for edit handler
also fix some minor navigation issues
2025-02-28 17:29:23 +01:00
ffae8553d5 fix(day): fix #2347 by adding repeated examiner check to day consistency check for day exam occurrences 2025-02-28 17:26:33 +01:00
2ad61c73f1 fix(day): fix #2347 by adding repeated examiner check to day consistency check for day exam occurrences 2025-02-28 17:12:48 +01:00
7dcd0b7297 chore(profile): show examiners in profile data, towards #2347 2025-02-28 17:12:48 +01:00
5881973906 chore(exams): allow email for exam result entry as well 2025-02-28 17:12:48 +01:00
d7dcf0acf5 fix(widgets): fix erroneous whitespace in name widget 2025-02-28 17:12:48 +01:00
1f484f7781 chore(profile): towards exam table in profile data (WIP)
towards #2347
2025-02-28 17:12:48 +01:00
9fbab25ecc chore(tutorial): assigning exam occurrences may check duplicate examiners
towards #2347
2025-02-28 17:12:48 +01:00
be18af08c6 chore(tutorial): user view warns against duplicate examiners
towards #2347
2025-02-28 17:12:48 +01:00
b12de8be15 refactor(admin): problem caching indicator made human readable 2025-02-28 17:12:48 +01:00
4156b3b553 chore(avs): add debug log info after not finding an error in company supervision switching after avs update 2025-02-28 17:09:03 +01:00
7b7c0d4053 fix(linter): disable unnecessary linter warning 2025-02-28 17:09:03 +01:00
6441bc5562 chore(firm): finalize supervision discrepancy view 2025-02-28 17:09:03 +01:00
2a1cff4cd0 fix(build) 2025-02-28 17:09:03 +01:00
aefafa32d1 chore(firm): filter working on supervision discrepancy view 2025-02-28 17:09:03 +01:00
8e0eb401b5 chore(admin): minor reorder admin problem page 2025-02-28 17:09:03 +01:00
8adcdf69fe refactor(db): widen the type for DBRead for more flexibility also - change some AdminProblemR DB actions to DBRead instead - add insane supervision warning to AdminProblem page 2025-02-28 17:09:03 +01:00
d6b4afe975 chore(firm): add working view for supervision discrepancy by firm
show if a supervisionship-company is unrelated to either supervisor or supervisee
2025-02-28 17:09:03 +01:00
cce4b2b27d chore(lms): fix #2605
- Implement a mechanism that deletes those users after a short while
- Never delete numerical LMS logins
- Allow admins to terminate an E-Learning manually
- Option to terminate E-Learning upon longtime renewal
- Detection of unnecessary E-Learning (i.e. long valid durations)
2025-02-28 17:08:59 +01:00
12e01238c4 fix(lms): do not delete orphans with all numerical idents
lms idents with all numerical idents are used for testing and thus should not be deleted, even if orphaned
2025-02-28 17:08:05 +01:00
130f592491 chore(lms): add longter,m validity filter, towards #2605 2025-02-28 17:08:05 +01:00
d1dcdcfe91 fix(avs): updateReceivers should not re-insert formerly known receivers 2025-02-28 17:08:05 +01:00
5e0df28444 chore(mail): view page for receivers working now and polished 2025-02-28 17:08:05 +01:00
0a4ad611c7 chore(mail): add i18n for mail receivers view 2025-02-28 17:08:05 +01:00
2109996387 Added de-de-formal.hamlet for receivers 2025-02-28 17:08:05 +01:00
4f5c7d56b0 chore(mail): add modal computing actual receivers at postal pref columns 2025-02-28 17:08:05 +01:00
05bc06df47 chore(firm): add company preference for email pin passwords
companies may be set such that their users have no email pin password by default
switching to such a company deletes the pin password
2025-02-28 17:07:51 +01:00
38606949b0 chore(lms): implement lms termination action
also:
- track last LmsSate for orphans
- make note searchable

towards #2605
2025-02-28 17:06:33 +01:00
f3f2f397fc fix(audit): add user id who caused company superior change to audit log 2025-02-28 17:06:12 +01:00
d06bc10408 fix(tutorial): truly fix #2696 template choice respects school, course, term, etc.
Template course names may contain Vorlage or Template and the type in any order somewhere within the name
2025-02-28 17:05:54 +01:00
490b89e174 refactor(lms): use runDBRead and caching for FilterColumnHandler used in LMS Orphans 2025-02-28 17:05:54 +01:00
d5bbec9fa3 chore(lms): complete view for orphaned lms logins
towards #2605
2025-02-28 17:05:54 +01:00
fbd99f2394 chore(lms): add note to orphans and create working filter 2025-02-28 17:05:54 +01:00
593ee2cf76 fix(build): remove erroneous + from settings.yml 2025-02-28 17:05:54 +01:00
2360375385 chore(lms): add route and breadcrumbs for lms oprhan view 2025-02-28 17:05:54 +01:00
56aa06097b chore(lms): create stub for lms oprhan view 2025-02-28 17:05:54 +01:00
e9fefa75bd refactor(lms): ensure days/months in qualification settings are always used correctly and implement settings for orphans
- extensive refactoring for qualification lms settings
- qualificationAuditDuration changed from months to days
- qualificationAuditDuration no longer optional
- qualificationAuditDuration is only used for LMS; clarified
- three new settings:
    + orphan-deletion-days:
    + orphan-deletion-batch:
    + orphan-deletion-repeat-hours:
2025-02-28 17:05:50 +01:00
0ffd594a04 chore(lms): register and display orphaned LMS idents
towards #2605
2025-02-28 17:03:26 +01:00
ab340aa715 chore(avs): test AVSneo problems
AVSneo will no longer have unique AVS CardNo: PersonSearch will return one card per company, all having the same CardNo, but possibly different colors

Test shows that FRADrive will handle this just fine, provided the old AVS workaround firing several requests at once remain in place
2025-02-28 17:02:04 +01:00
5128f9b74c fix(i18n): disambiguate between course-type and type of course both in german and english
- english: course type -> course category = Kursart
- german: Art des Kurses-> Kurstyp = Tutorial-Type
2025-02-28 17:01:03 +01:00
558402ac47 fix(avs): prevent empty contact and status queries 2025-02-28 17:01:03 +01:00
1b35c57660 fix(tutorial): fix #2696 template choice respects school, course, term, etc. 2025-02-28 17:00:55 +01:00
56b8a8de86 refactor(lms): remove now obsolete lms edit stub 2025-02-28 17:00:20 +01:00
48096c6b81 fix(hlint): remove superfluous dollar 2025-02-28 16:59:09 +01:00
e8a21610a4 chore(tutorial): convenience button to show tutorial exam results
required new filter on exam participants page
2025-02-28 16:59:09 +01:00
c1ed89a30b various minor code refactors 2025-02-28 16:59:09 +01:00
cf8fc90db7 chore(qualification): finish qualification edit handler 2025-02-28 16:59:09 +01:00
b26dd285df chore(form): create calendarDiffDaysField 2025-02-28 16:58:46 +01:00
e5cf120af2 refactor(UniWorxMessages): eliminate superfluous whitespace
also: some tutorial code cleaning
2025-02-28 16:56:11 +01:00
ad12b8f927 refactor(tutorial): fix and complete exam occurrence form function 2025-02-28 16:56:11 +01:00
9fe78541d7 refactor(tutorial): exam occurrence form function and appearance 2025-02-28 16:56:11 +01:00
a0604637bd refactor(tutorial): exam occurrence editing received specialised page 2025-02-28 16:56:11 +01:00
5e41c2073f chore(tutorial): add separate exam occurrence edit page (WIP) 2025-02-28 16:56:11 +01:00
50c7d18b53 chore(exam): add convenience function to duplicate exam occurrences to another day 2025-02-28 16:56:11 +01:00
f996976f65 chore(exam): auto name generation for examOccurrences 2025-02-28 16:56:11 +01:00
f04a40c0a3 chore(tutorial): add covenience button to full exam editing 2025-02-28 16:56:11 +01:00
6cc929e377 fix(tutorial): fix exam occurrence form
works better, but still not 100%
some debugging added
2025-02-28 16:56:11 +01:00
11bcef67f8 chore(tutorial): switch relevant exams from registerFrom/To to examStart/End
registering is of users/supervisors, but this page is for admins, so  examStart/examEnd are only relevant for when it is actually happening
2025-02-28 16:56:11 +01:00
7b7ffab109 chore(tutorial): towards #2347 exam occurrence form design finished, but buggy somehow (WIP)
Propably due to multiActionAForm badly interacting with contained massInputForm
2025-02-28 16:56:11 +01:00
afbeb86762 chore(pathpiecel): PathPiece instance for lists of exam occurrence ids
towards #2347
2025-02-28 16:56:11 +01:00
9af4a3a22e chore(tutorial): towards #2347 exam occurrence form mostly working (WIP)
form is completed, but the initial call needs proper arguments from DB about all apropriate exams
2025-02-28 16:56:11 +01:00
4241c75afe chore(tutorial): towards #2347 exam occurrence form added (WIP) 2025-02-28 16:56:11 +01:00
afa2f9bf0e chore(tutorial): towards #2347 add convenience buttons to add exam tutorial (STUB)
This is STUB add a multiform action that is not yet evaluated. Form Handler is to be implemented next.
2025-02-28 16:56:11 +01:00
f44d66cb91 chore(tutorial): assign exam rooms for tutorial users ad hoc 2025-02-28 16:56:11 +01:00
1d68ed9c5e refactor(saltine): fix hlint and ghc warnings 2025-02-28 16:56:07 +01:00
cd84d0a932 refactor(daily): move caching into own submodule
we need those methods in Handler.Tutorial.Users as well
2025-02-28 16:54:19 +01:00
f467f6086e chore(daily): add function to retrieve all exam occurrences for given days
the function uses the memcachedByClass mechanism, which was slightly refined as well to include the class within the memcached keys for added correctness
2025-02-28 16:53:34 +01:00
4f524bd8d2 refactor(form): make all userField variants consistent with each other 2025-02-28 16:53:20 +01:00
aaf72f7255 chore(exam): show exam occurrences in participants views for tutorial and course 2025-02-28 16:53:20 +01:00
36a3b04ad8 chore(exam): add examiner to occurrence options
we intend to use the exam examiner for adding occurrences through tutorials
2025-02-28 16:53:20 +01:00
ae6d3b0fc3 fix(form): knownUserField not working as intended (WIP) 2025-02-28 16:53:20 +01:00
6f3dd408bb fix(form): knownUserField not working as intended (WIP) 2025-02-28 16:53:20 +01:00
c0c1665ccb refactor(form): knownUserField not working as intended (WIP) 2025-02-28 16:53:20 +01:00
c2e0f6b2b8 chore(form): add knownUserField accepting known users only 2025-02-28 16:53:20 +01:00
a1d7f16427 fix(fill): exam prefill dates work now 2025-02-28 16:53:20 +01:00
5f3d8a88e2 fix(hlint): implement hlint suggestion 2025-02-28 16:53:20 +01:00
b42e93e891 chore(daily): implement left-over todos and i18n 2025-02-28 16:53:17 +01:00
e53be8ddf9 fix(icons): fix some botched icon definitions, for real 2025-02-28 16:52:22 +01:00
6d583fe8c4 fix(icons): fix some botched icon definitions 2025-02-28 16:52:22 +01:00
954e86c95a fix(ghci): ghci works now as expected 2025-02-28 16:52:17 +01:00
f47528c741 chore(daily): fix #2349 completing daily sanity check 2025-02-28 16:51:10 +01:00
ad1d235bea chore(daily): towards #2347 check complete, except i18n
also missing: displaying memcached check results in each line of day view
2025-02-28 16:50:23 +01:00
d4d915bd60 chore(daily): towards #2347 by caching and sorting results 2025-02-28 16:47:46 +01:00
07cfc0adcb fix(hlint): implement some hlint suggestions 2025-02-28 16:42:37 +01:00
f6c82009ee chore(job): disable jobworkers in development in order to reduce log output 2025-02-28 16:42:37 +01:00
c08d6ae0d0 chore(daily): properly implement note suggestion caching and invalidation 2025-02-28 16:42:37 +01:00
6a0876ae55 chore(daily): basic functionality #1939 completed and checked - filters now work as intended - textField suggestions now work as intended 2025-02-28 16:42:37 +01:00
75a4f52a80 fix(icon): add missing icon 2025-02-28 16:42:27 +01:00
1f7e9b6a2f chore(daily): adjust css, improve suggestions 2025-02-28 16:42:03 +01:00
564488d5fa chore(day): attempt to fix participant note suggestions 2025-02-28 16:40:57 +01:00
500c9a749a chore(daily): add suggestions to note fiels (WIP) 2025-02-28 16:40:57 +01:00
ede00deb86 refactor(daily): user company discrepancies 2025-02-28 16:40:16 +01:00
9eb075836f fix(daily): form submit now works as intended 2025-02-28 16:39:33 +01:00
d546e5da0f minor adjustments to routes and icons 2025-02-28 16:39:33 +01:00
162c44a44f fix(msg): minor uni2wok to fradrive message change
Primarly done to the the new build environment start-backend file watcher and see whether a restart enables the website
2025-02-28 16:39:33 +01:00
0a29540089 fix(doc): Update outdated GitLab references to DevOps work items 2025-02-28 16:39:33 +01:00
6f1ad811f7 chore(firm): add action to add non-avs firm associates 2025-02-28 16:39:33 +01:00
d2f69dc023 fix(doc): minor haddock fixes 2025-02-28 16:39:33 +01:00
cd76bdd4e7 chore(day): complete form columns for daily view (untested)
unfortunately `make start` does not enter DEVELOPMENT mode currently, so this is not yet testeted.
2025-02-28 16:39:33 +01:00
e1dca7d6b0 chore(day): make form columns compile eventually 2025-02-28 16:39:33 +01:00
5d46479a33 chore(icons): add instructions on how to add icons 2025-02-28 16:39:28 +01:00
fcf1b6d9d8 fix(icons): add missing icons 2025-02-28 16:38:58 +01:00
7e09636a2b chore(day): add missing form columns 2025-02-28 16:38:42 +01:00
8317f682d8 chore(tutorial): (WIP) towards #90 write form columns 2025-02-28 16:38:41 +01:00
85511091cc fix(test): fix test problem and add tests for UserEyeExam and UserDrivingPermit 2025-02-28 16:38:41 +01:00
02d10006fc fix(build) 2025-02-28 16:38:41 +01:00
2fdb132140 chore(tutorial): show additional columns for #90
columns are distinguished by user and the entities given in parenthesis:
- driving permit (tutorial)
- eye exam (tutrial)
- tutorial note (tutorial)
- attendance (tutorial & day)
- attendance-note (tutorial & day)
- parking permit (day)
2025-02-28 16:38:41 +01:00
fba0b71d50 chore(tutorial): build model for #90 2025-02-28 16:38:41 +01:00
4934f5f89d fix(room): deduplicate room column and fix order 2025-02-28 16:38:41 +01:00
133a8d3739 chore(daily): show rooms for tutorial lessons 2025-02-28 16:38:41 +01:00
e8af2b8da9 refactor(TH): minor code clean up 2025-02-28 16:38:41 +01:00
ac766ea217 refactor(TH): add sqlMIXproj' using reify on TableExpr for more comfort 2025-02-28 16:38:41 +01:00
a113d43089 chore(TH): add sqlMIXproj to improve dbTable usage, also add card-nos to DayTask Table 2025-02-28 16:38:41 +01:00
14140c982b refactor(memcached): checking memcached key security mechanisms
RESULTS:

Keys for memcached use their Binary representation!

This means that the following three are all interchangeable as a key:
      newtype Foo1 = Foo1 { someInt1 :: Int } deriving newtype (Binary)
      data    Foo2 = Foo2 { someInt2 :: Int } deriving         (Binary)
      type    Foo3 = Int
Therefore it is best to use $(memcachedHere) or $(memcachedByHere) if possible or add another type
2025-02-28 16:38:41 +01:00
ce125b6495 chore(daily): show course associated qualifications 2025-02-28 16:38:41 +01:00
0c78996260 fix(avs): fix #225 by skipping firm updates entirely if AVS FirmInfo is unchanged for previously seen values for AVS User to be updated 2025-02-28 16:38:18 +01:00
b78c898ebf fix(avs): fix #224 repeated superior changes no longer occur
furthermore AdminProblems are only inserted if the same problem does not exist unsolved
2025-02-28 16:35:13 +01:00
4bca7580d0 refactor(occurrences): fold RoomReference into Occurrences, completed 2025-02-28 16:32:52 +01:00
46f777740f fix(memcached): using memcachedHere did not compile due to staging problems 2025-02-28 16:32:52 +01:00
a7b08b1ae5 fix(occurrences): room occurrence form works now 2025-02-28 16:32:52 +01:00
452cdf4442 fix(test): add arbitrart instances and adjust argument changes to tests 2025-02-28 16:32:52 +01:00
f6b87a09b0 fix(build): occurrences no longer have a READ instance 2025-02-28 16:32:52 +01:00
0a5b0fceff chore(build): limit max compile cpu cores to 5 2025-02-28 16:32:52 +01:00
3e6717904a chore(occurrences): workaround provide simple room field with least recent suggestions 2025-02-28 16:32:52 +01:00
2059d678ee refactor(memcached): remove ARC cache and LRU logic some more
more leftover dead code was removed, especially cache prewarm options that no longer had an effect on a non-existing ARC cache
2025-02-28 16:32:52 +01:00
225af31943 chore(occurrences): add GIN index for JSONB columns 2025-02-28 16:32:52 +01:00
9d26c1c171 refactor(occurrences): fix migration 2025-02-28 16:32:52 +01:00
22d6cf737e refactor(occurrences): remove RoomReference from model and add migration 2025-02-28 16:32:52 +01:00
35cadda2e8 refactor(occurrences): fold RoomReference into Occurrences (WIP)
Each Occurrence now has its own RoomReference, i.e. Mondays may have a different Room assigned than Tuesdays

WIP Problem: occurrencesAFrom does not work, always insists on Room missing
2025-02-28 16:32:52 +01:00
692350677f fix(build): minor 2025-02-28 16:32:52 +01:00
36b481a548 fix(occurrences): occurringLessons had an erroneously inverted condition 2025-02-28 16:32:52 +01:00
cb58c20ca1 chore(occurrences): add datatype LessonTime for dealing timetable intervals 2025-02-28 16:32:52 +01:00
e757209b80 refactor(memcached): remove ARC cache entirely
NOTE: this was a crude surgery, removing everything ARC related; some dead code artifacts may have remained.

Especially check PrewarmCacheConf

Reason for removall: adding `memcachedInvalidateClass` was difficult to implement with ARC active; ARC was known to be problematic; removal was easier (see #2 2024-09-23)
2025-02-28 16:32:25 +01:00
74c330bd24 chore(memcached): add key classes for easy invalidation 2025-02-28 16:29:45 +01:00
cac0a47d01 refactor(daily): factor our tutorial selection function 2025-02-28 16:25:43 +01:00
5c70b1099c fix(firm): filtering by active supervisor working 2025-02-28 16:25:43 +01:00
26ea39dc67 fix(lpr): print log sorting works now 2025-02-28 16:25:43 +01:00
2385d989a8 fix(build) 2025-02-28 16:25:43 +01:00
0105aa8c3f refactor(model): move JSONB instance to proper module 2025-02-28 16:25:43 +01:00
3bae365b37 chore(lpr): improve lpr log display 2025-02-28 16:25:43 +01:00
1d01897757 chore(daily): make company a property of TutorialParticipant, towards #90 2025-02-28 16:25:43 +01:00
ce62b99d2b chore(daily): add more columns #90 2025-02-28 16:25:43 +01:00
4dbe005709 chore(daily): add page actions #90 2025-02-28 16:25:43 +01:00
11ef856b2b refactor(jsonb): change DB using JSONB, to improve stub #90 2025-02-28 16:25:43 +01:00
5a03d1cabe chore(daily): improve stub #90 change DB to JSONB (WIP) 2025-02-28 16:25:43 +01:00
0264c87510 chore(daily): create stub in preparation for #90 2025-02-28 16:25:43 +01:00
e9a4c838a8 refactor(map): clarify some unnecessarily obfuscated code
also, using Map.fromList is more efficient if the list happens to be ordered
2025-02-28 16:25:43 +01:00
733324a732 chore(config): add config/develop-settings.yml only active if DEVELOPMENT
Ensure that certain settings are NOT seen in production, but automatically active in development without using environment variables.
2025-02-28 16:25:43 +01:00
757d383d33 chore(gitlab-ci): install and decode font ttfs 2025-02-28 15:56:15 +01:00
ee02a50bdd chore(node-deps): add ttf2woff as dev dep 2025-02-28 15:55:40 +01:00
c859974495 chore(gitignore): do not publish font files (for now) 2025-02-28 15:51:59 +01:00
ce35c8efc9 Merge branch '145-build-system-rewrite' 2025-02-28 15:37:36 +01:00
3151be6f41 build(Makefile): add documentation 2025-02-21 12:49:35 +01:00
61fb8b7ea9 build(Makefile): add help text for clean-images 2025-02-20 17:34:50 +01:00
0ecb342e8f build(Makefile): add clean-images target 2025-02-20 17:33:31 +01:00
8198559a94 build(Makefile): fill uniworxdb before starting backend 2025-02-20 16:14:52 +01:00
fbd3c6d7c5 build(release): make release versions compliant with semver-specifications 2025-02-20 13:34:13 +01:00
a8420aaf56 build(release): remove v-prefix from release versions 2025-02-20 12:46:24 +01:00
1bd0225522 chore(release): v27.4.59-test-g0.0.17 2025-02-18 13:28:30 +01:00
71a2a8e76a build(docker/fradrive): fix entrypoint script 2025-02-18 13:28:26 +01:00
bd48469b3c chore(release): v27.4.59-test-f0.0.17 2025-02-17 11:26:31 +01:00
28b94351da build(docker/fradrive): simplify entrypoint 2025-02-17 11:26:12 +01:00
59985d11c2 chore(release): v27.4.59-test-g0.0.16 2025-02-16 23:44:39 +01:00
d7e8adc24d build(docker/fradrive): add libpq-dev runtime dependency 2025-02-16 23:44:36 +01:00
3168f5c49e chore(release): v27.4.59-test-f0.0.16 2025-02-16 15:30:58 +01:00
758f4db9d8 build(docker/fradrive): set DEBIAN_FRONTEND and TZ to avoid user interaction when installing tzdata 2025-02-16 15:30:53 +01:00
c033243038 chore(release): v27.4.59-test-f0.0.15 2025-02-15 18:34:46 +01:00
3dfab76761 build(docker/fradrive): update latex runtime dependency list 2025-02-15 18:34:41 +01:00
497d0355d9 build(docker/fradrive): fix libsodium source package name 2025-02-15 18:31:40 +01:00
4d2ac71f73 chore(release): v27.4.59-test-e0.0.15 2025-02-14 21:32:54 +01:00
2b76d673f8 ci(azure-pipelines): add build-args to release build for network access 2025-02-14 21:32:49 +01:00
81fdec5068 build(docker/fradrive): install release runtime dependencies 2025-02-14 21:25:39 +01:00
2eb423b4a1 chore(release): v27.4.59-test-f0.0.14 2025-02-14 16:56:19 +01:00
f23da55693 build(docker/fradrive): remove path-quoting for settings files 2025-02-14 16:55:40 +01:00
7b2d2bedb7 build(docker/fradrive): chmod /usr/bin contents 2025-02-14 16:11:15 +01:00
167872c332 build(Makefile): git push commits when releasing again 2025-02-14 16:10:01 +01:00
25c880c8ba chore(release): v27.4.59-test-e0.0.14 2025-02-13 15:08:39 +01:00
5d1dc8c3c0 build(docker/fradrive): COPY entrypoint script into release container 2025-02-13 15:08:23 +01:00
640f3bbba5 ci(azure-pipelines): tweak image artifact name/location 2025-02-13 11:10:51 +01:00
760ab5f069 chore(release): v27.4.59-test-e0.0.13 2025-02-12 16:20:14 +01:00
7c1a7e1e9e ci(azure-pipelines): fix release repository 2025-02-12 16:19:48 +01:00
2d80c6e0ab ci(azure-pipelines): fix image version check for build 2025-02-12 15:18:44 +01:00
010fb965d9 ci(azure-pipelines): publish built images as artifacts 2025-02-12 15:15:55 +01:00
32441fc9c7 ci(azure-pipelines): do not use latest images if images have been rebuilt 2025-02-12 15:04:56 +01:00
ea92e17949 ci(azure-pipelines): fix master-branch check for updating latest 2025-02-12 15:02:15 +01:00
a04732b5fb build(Makefile): remove obsolete git push for release [skip ci] 2025-02-12 13:36:16 +01:00
53d9c17fb5 chore(release): v27.4.59-test-e0.0.12 2025-02-12 13:29:19 +01:00
8e1bb82017 ci(azure-pipelines): fix release repository 2025-02-12 13:28:46 +01:00
7ed6b843bf chore(release): v27.4.59-test-d0.0.12 2025-02-11 23:25:03 +01:00
20954b1351 build(Makefile): fix release target using correct template splice 2025-02-11 23:21:58 +01:00
c3399c49b3 chore(release): v27.4.59-test-d0.0.11 2025-02-11 23:21:18 +01:00
88342f7336 chore(release): v27.4.59-test-c0.0.11 2025-02-11 23:20:17 +01:00
3a1b6cf72c chore(release): v27.4.59-test-b0.0.11 [skip ci] 2025-02-11 23:19:29 +01:00
f351c7485e chore(release): v27.4.59-test-c0.0.10 2025-02-11 23:15:42 +01:00
5c65c04ce7 chore(release): v27.4.59-test-b0.0.10 2025-02-11 23:15:01 +01:00
7d621f0e0f build(Makefile): release - wait before tagging [skip ci] 2025-02-11 23:14:53 +01:00
6dda12cc66 chore(release): v27.4.59-test-a0.0.10 2025-02-11 23:14:12 +01:00
965ae3da29 build(Makefile): push commit separately for release 2025-02-11 23:13:57 +01:00
9d16a22fd7 ci(azure-pipelines): add repository for release push 2025-02-11 23:12:54 +01:00
4661eab218 ci(azure-pipelines): contd 2025-02-10 19:30:58 +01:00
db75978dcf ci(azure-pipelines): temporarily disable tests 2025-02-10 19:30:09 +01:00
406c14dd86 ci(azure-pipelines): fix STACK_CORES 2025-02-10 16:50:20 +01:00
7e8d910496 ci(azure-pipelines): restrict number of used cores everywhere to allow for canceling jobs 2025-02-10 15:56:59 +01:00
7a1139807d ci(azure-pipelines): use caches for testing 2025-02-10 15:20:09 +01:00
6b3775b9b9 ci(azure-pipelines): run tests in correct service containers 2025-02-10 15:18:28 +01:00
0821b74fb7 ci(azure-pipelines): make tests dependent on build instead of setup only 2025-02-10 15:14:48 +01:00
9f49cef214 ci(azure-pipelines): perform registry login/logout for testing 2025-02-10 15:13:02 +01:00
9f411e329d ci(azure-pipelines): remove job-level dependsOn for test 2025-02-10 15:07:41 +01:00
dea9faa055 ci(azure-pipelines): fix test container step 2025-02-10 15:06:43 +01:00
084b9258dd ci(azure-pipelines): start postgres container for tests 2025-02-10 15:04:47 +01:00
258a240a77 chore(release): v27.4.59-test-a0.0.9 2025-02-10 14:09:58 +01:00
ee498be12f revert(azure-pipelines): revert path exclude 2025-02-10 14:09:34 +01:00
5e76a77821 chore(release): v27.4.59-test-a0.0.8 2025-02-10 14:08:56 +01:00
df67718241 ci(azure-pipelines): exclude CHANGELOG changes as trigger [skip ci] 2025-02-10 14:08:46 +01:00
3cd48bdea1 chore(release): v27.4.59-test-a0.0.7 2025-02-10 14:08:04 +01:00
019d6475c5 build(Makefile): fix release target 2025-02-10 14:07:46 +01:00
b9486187d8 ci(azure-pipelines): tweak triggers 2025-02-10 13:55:47 +01:00
6e3286b8a7 ci(azure-pipelines): push releases to registry 2025-02-10 13:47:42 +01:00
586550f2fd build(docker/fradrive): fix uniworxdb binary destination path [skip ci] 2025-02-09 19:10:19 +01:00
043b9344f6 build(docker/fradrive): remove locale-gen [skip ci] 2025-02-09 12:34:38 +01:00
0aeb28088d ci(azure-pipelines): fix release binary download path 2025-02-08 15:40:06 +01:00
235d03d173 chore(release): v27.4.59-test-a0.0.6 2025-02-08 01:03:14 +01:00
fc713fdbd0 ci(azure-pipelines): rename artifact-download yaml 2025-02-08 00:14:59 +01:00
b2a9a3b4b4 ci(azure-pipelines): reuse parameters.service.dependsOn as identifier for required artifacts 2025-02-08 00:14:12 +01:00
0325bb7a63 ci(azure-pipelines): apply pool and timeout params for build jobs 2025-02-07 23:03:56 +01:00
77d737026e chore(release): v27.4.59-test-a0.0.5 2025-02-07 21:38:33 +01:00
f310df9647 ci(azure-pipelines): fix cache param reference 2025-02-07 21:37:52 +01:00
640956df20 ci(azure-pipelines): restore dependency caches for build 2025-02-07 21:37:15 +01:00
248c8ca42e ci(azure-pipelines): templatify caching; use cache template for dependencies 2025-02-07 21:34:13 +01:00
fb2647803b ci(azure-pipelines): fix build artifact reference 2025-02-07 21:27:57 +01:00
00711e42c0 ci(azure-pipelines): tweak triggers 2025-02-07 21:06:28 +01:00
08084b619f chore(release): v27.4.59-test-a0.0.4 2025-02-07 21:03:43 +01:00
dcc4c70ec2 ci(azure-pipelines): fix path typo 2025-02-07 18:07:30 +01:00
8cf41831f0 ci(azure-pipelines): fix cache keys 2025-02-07 17:47:32 +01:00
078f46e5a5 ci(azure-pipelines): fix dependencies caches type 2025-02-07 17:19:14 +01:00
8157746fea ci(azure-pipelines): properly implement multi-entity caches for dependencies 2025-02-07 17:17:25 +01:00
6a279d262f ci(azure-pipelines): use dependency cache instead of artifacts 2025-02-07 16:50:44 +01:00
87e80db4aa ci(azure-pipelines): fix dependenciesArtifacts param 2025-02-07 16:21:49 +01:00
7fe8fcb5f6 ci(azure-pipelines): reintroduce timeout for dependency builds 2025-02-07 16:19:18 +01:00
c62c435638 ci(azure-pipelines): fix and deduplicate condition when to setup images 2025-02-06 18:57:12 +01:00
17c7ed89c5 ci(azure-pipelines): always run dependency build when not on update branch 2025-02-06 18:50:47 +01:00
517144c0cf ci(azure-pipelines): use build container for Build jobs 2025-02-06 18:46:32 +01:00
11b17ab1e2 ci(azure-pipelines): disable Test stage for now 2025-02-06 18:25:37 +01:00
224f55852f ci(azure-pipelines): make stages depend on each other 2025-02-06 18:22:05 +01:00
622ba07b8f ci(azure-pipelines): fix dependsOn contd ? 2025-02-06 18:20:03 +01:00
2a1f114f48 ci(azure-pipelines): fix job dependsOn contd 2025-02-06 18:16:59 +01:00
b77356d73d ci(azure-pipelines): fix job dependsOn 2025-02-06 18:12:28 +01:00
ee244e34a4 ci(azure-pipelines): fix template locations contd 2025-02-06 18:10:46 +01:00
ed8f859c1e ci(azure-pipelines): fix template locations 2025-02-06 18:09:58 +01:00
f969c23bac ci(azure-pipelines): fix param splices 2025-02-06 18:08:28 +01:00
1a3c18a8bd ci(azure-pipelines): fix param name contd 2025-02-06 18:07:20 +01:00
fc13ac7a6d ci(azure-pipelines): fix param name 2025-02-06 18:06:41 +01:00
ef9f4a9345 ci(azure-pipelines): restructure pipeline workflow 2025-02-06 18:04:55 +01:00
ba7b2de4cf ci(azure-pipelines): restructure pipeline workflow - build images [skip ci] 2025-02-06 17:35:18 +01:00
6012286250 ci(azure-pipelines): implement more general make-target pipeline template [skip ci] 2025-02-06 17:33:36 +01:00
cfb48b6a1c ci(azure-pipelines): imageUpstream -> buildImageUpstream [skip ci] 2025-02-06 17:30:27 +01:00
32f449ec12 ci(azure-pipelines): restructure params contd [skip ci] 2025-02-06 17:28:08 +01:00
7b68b128a8 ci(azure-pipelines): remove .stack dir from backend artifacts [skip ci] 2025-02-06 17:00:35 +01:00
6564e8f975 ci(azure-pipelines): refactor params [skip ci] 2025-02-06 17:00:21 +01:00
cb7946b156 ci(azure-pipelines): trigger pipeline on any tag [skip ci] 2025-02-06 16:59:44 +01:00
81203be811 ci(azure-pipelines): set custom triggers; allow tag pipelines [skip ci] 2025-02-06 16:55:03 +01:00
0345f4a5e6 chore(release): v27.4.59-test-a0.0.3 2025-02-06 10:24:26 +01:00
85105cb931 ci(azure-pipelines): fix releaseTag param [skip ci] 2025-02-06 10:24:15 +01:00
51267bfd7c build(release): fix version script (again) [skip ci] 2025-02-05 13:17:39 +01:00
8136d92e48 chore(release): v27.4.59-test-a0.0.2 2025-02-05 13:16:26 +01:00
8e42e4140d docs(Makefile): add TODO [skip ci] 2025-02-05 11:50:29 +01:00
59c49116b5 ci(azure-pipelines): add release tag [skip ci] 2025-02-05 11:46:07 +01:00
3bce50c1fe ci(azure-pipelines): work on release [skip ci] 2025-02-05 11:44:20 +01:00
2c7858139a ci(azure-pipelines): parametrize release endpoint [skip ci] 2025-02-05 11:40:30 +01:00
f48afbca43 ci(azure-pipelines): only run release stage under forceRelease || tag condition [skip ci] 2025-02-05 11:32:00 +01:00
30ad995a40 ci(azure-pipelines): templatify release [skip ci] 2025-02-05 11:31:36 +01:00
871cc72995 chore(release): v27.4.59-test-a0.0.1 2025-02-05 11:04:29 +01:00
a92fd673ab build(docker/fradrive): do not install locales manually [skip ci] 2025-02-05 11:04:15 +01:00
d89e9f6781 build(docker/fradrive): update apt repositories before install [skip ci] 2025-02-05 11:03:47 +01:00
12d8f49a65 build(release): fix version script [skip ci] 2025-02-05 11:02:39 +01:00
bf0642ccb8 build(release): fix release branchversion comparison in release script [skip ci] 2025-02-04 13:42:35 +01:00
eac726f364 ci(azure-pipelines): use cached dependencies when variable is set 2025-02-04 13:33:39 +01:00
c487513116 docs(Makefile): add documentation for shell-ghci target [skip ci] 2025-02-04 13:28:08 +01:00
5761b96282 ci(azure-pipelines): include all binaries in artifact uploads [skip ci] 2025-02-04 11:44:07 +01:00
84a91be87f ci(azure-pipelines): fix bin path for release artifact copy [skip ci] 2025-02-04 11:42:05 +01:00
9e3a16011b build(docker/fradrive): use relative bin path for binary copy [skip ci] 2025-02-04 11:40:53 +01:00
4ec521361d build(Makefile): fix release target [skip ci] 2025-02-03 18:30:58 +01:00
72920caf4c ci(azure-pipelines): fix release artifact patterns 2025-02-03 18:27:49 +01:00
0538142aa8 ci(azure-pipelines): refer to devfra registry in lower-case only [skip ci] 2025-02-03 18:24:46 +01:00
c03fd0c81f chore: move version helper script to utils [skip ci] 2025-02-03 18:22:36 +01:00
252641337a chore: tweak versioning script [skip ci] 2025-02-03 18:20:21 +01:00
3cbeba956e ci(azure-pipelines): fix buildSteps [skip ci] 2025-01-29 17:05:27 +01:00
0a104db666 ci(azure-pipelines): add skipTests logic [skip ci] 2025-01-29 14:22:08 +01:00
311ba5234d ci(azure-pipelines): add condition param to artifacts 2025-01-29 12:15:55 +01:00
b14821e3b4 ci(azure-pipelines): add continueOnError param to artifacts 2025-01-29 12:14:11 +01:00
78d0d9e853 ci(azure-pipelines): hardcode pipeline artifact download project 2025-01-29 11:34:05 +01:00
96059f0a7b ci(azure-pipelines): fix artifact project contd 2025-01-29 11:26:18 +01:00
21ad3f06af ci(azure-pipelines): try yaml-compiletime project def splice 2025-01-29 11:25:37 +01:00
55531ef692 ci(azure-pipelines): use project id for artifact download project 2025-01-29 11:01:53 +01:00
8a22a86399 ci(azure-pipelines): add release stage and image build 2025-01-29 10:24:44 +01:00
ecfc0f7461 build(docker/fradrive): prepare fradrive Dockerfile for release [skip ci] 2025-01-29 10:12:05 +01:00
83a92b05dd ci(azure-pipelines): try collection id as artifacts download project 2025-01-27 19:04:22 +01:00
100422db41 ci(azure-pipelines): fix artifact project contd 2025-01-27 18:08:43 +01:00
0988079b86 ci(azure-pipelines): fix artifact project 2025-01-27 18:02:19 +01:00
9fc8ba2315 ci(azure-pipelines): fix params 2025-01-27 17:42:45 +01:00
2200b85120 ci(azure-pipelines): fix param refs 2025-01-27 17:41:50 +01:00
c7ee91d26b ci(azure-pipelines): distinguish between dependsOn and requiredArtifacts 2025-01-27 17:40:15 +01:00
09ccd12b29 ci(azure-pipelines): add backend-dependencies dep for backend job 2025-01-27 17:36:37 +01:00
422f6bc5b5 ci(azure-pipelines): add more parameters to service dependencies; allow downloading dependencies from previous runs 2025-01-27 17:35:46 +01:00
204d57cb96 ci(azure-pipelines): add more params to dependencies 2025-01-27 17:20:36 +01:00
a2dbb1f5f3 ci(azure-pipelines): add .stack dir contents to backend artifacts for dependency caching 2025-01-27 17:13:00 +01:00
4ea031ed6b refactor(backend): hlint 2025-01-27 13:37:49 +01:00
9e7631deeb ci(azure-pipelines): remove debug print step 2025-01-27 13:11:56 +01:00
2b7412d27e ci(azure-pipelines): add debug print before dependency build 2025-01-27 02:22:46 +01:00
96f735a2f5 ci(azure-pipelines): use DownloadPipelineArtifact task for more granular control 2025-01-27 02:08:19 +01:00
93f968a03b ci(azure-pipelines): copy artifacts from service dependencies 2025-01-26 14:49:35 +01:00
39ab2ce8a1 ci(azure-pipelines): move build timeout to build instead of image build 2025-01-24 19:13:53 +01:00
7e1cddfa46 build(docker/backend): use PROJECT_DIR as build-arg and env [skip ci] 2025-01-24 15:50:38 +01:00
e997616e33 build(Makefile): chown PROJECT_DIR before building backend dependencies [skip ci] 2025-01-24 15:28:00 +01:00
1dd5c5dd79 build(docker/backend): chmod PROJECT_DIR permissions separately [skip ci] 2025-01-24 14:42:59 +01:00
082ce971aa build(docker/backend): allow even more for PROJECT_DIR 2025-01-24 14:39:03 +01:00
b739c66444 build(docker/backend): allow PROJECT_DIR access for everyone [skip ci] 2025-01-24 14:19:30 +01:00
6dc59e5098 build(docker/backend): let stack manage its root dir 2025-01-24 14:04:52 +01:00
e02c66de1a build(docker/backend): fix syntax [skip ci] 2025-01-24 13:42:07 +01:00
e8adb2c27d build(azure-pipelines): do not download redundant stack packages in ci 2025-01-24 13:26:45 +01:00
114bceb57e build(frontend): add karma-esbuild to package lock [skip ci] 2025-01-24 12:37:46 +01:00
e2cb0edec5 ci(azure-pipelines): refine artifacts paths 2025-01-24 12:37:14 +01:00
d5e4e67779 ci(azure-pipelines): download artifacts from dependencies for services 2025-01-24 11:59:27 +01:00
3f9abfdcc2 build(docker/backend): tweak stack root, remove mounts [skip ci] 2025-01-24 11:55:28 +01:00
609e4310da ci(azure-pipelines): add service dependencies 2025-01-24 11:47:24 +01:00
cfa669bda6 ci(azure-pipelines): move pool definition to stage level 2025-01-24 11:35:47 +01:00
3549cd1649 ci(azure-pipelines): separate services into stages 2025-01-24 11:34:22 +01:00
89326ded56 ci(azure-pipelines): use PROJECT_DIR on repository path [skip ci] 2025-01-24 11:08:03 +01:00
2af27e2624 build(docker/backend): refactor backend Dockerfile 2025-01-24 11:04:52 +01:00
c83ed1fc39 build(Makefile): eliminate MOUNT_DIR in favor of PROJECT_DIR [skip ci] 2025-01-24 02:39:28 +01:00
3416942591 ci(azure-pipelines): add job timeout param 2025-01-24 02:26:09 +01:00
53226e6c6f build(Makefile): use 2 cores for backend dependencies [skip ci] 2025-01-24 02:20:07 +01:00
85bea8d12c build(docker/backend): tweak stack root [skip ci] 2025-01-24 00:20:34 +01:00
24046ef0fc build(Makefile): remove explicit uniworx.cabal dependency [skip ci] 2025-01-24 00:20:01 +01:00
325f07feca build(docker/backend): add rw permissions for stack mounts [skip ci] 2025-01-23 17:20:42 +01:00
6895313887 build(docker/backend): replace more COPY with mount [skip ci] 2025-01-23 17:15:45 +01:00
e95ad62436 ci(azure-pipelines): fix debug prints [skip ci] 2025-01-23 17:14:30 +01:00
c0ec8d2a9d build(docker/backend): mount on prebuild to relative location [skip ci] 2025-01-23 17:10:27 +01:00
65ec7f0de5 build(docker/backend): RUN --mount instead of late COPY [skip ci] 2025-01-23 16:51:07 +01:00
073ffb8483 ci(azure-pipelines): add debug prints 2025-01-23 16:42:13 +01:00
be645b8c8b ci(azure-pipelines): make parameter pool available for image build jobs 2025-01-23 15:28:41 +01:00
8906f3d705 ci(azure-pipelines): use DS3 2025-01-23 15:08:15 +01:00
7a44af0a0b build(Makefile): limit dependency build to 3G mem 2025-01-23 12:29:00 +01:00
d030c5d0cc build(Makefile): restrict backend dependency builds to 1 cpu core 2025-01-23 11:00:03 +01:00
56d7fec466 ci(azure-pipelines): add debug print for pool 2025-01-23 10:51:29 +01:00
e67091cb47 ci(azure-pipelines): introduce forcePushLatest variable 2025-01-22 23:09:25 +01:00
acb5dbfb28 ci(azure-pipelines): remove service dependencies contd 2025-01-22 22:58:29 +01:00
78b3a38076 ci(azure-pipelines): remove service dependencies contd 2025-01-22 22:57:53 +01:00
865073a6a1 ci(azure-pipelines): remove dependencies parameter 2025-01-22 22:57:07 +01:00
6112f9f229 ci(azure-pipelines): provide non-empty parameter service values 2025-01-22 22:55:43 +01:00
d35c524f99 ci(azure-pipelines): 2025-01-22 22:54:21 +01:00
7e014c037e ci(azure-pipelines): fix syntax 2025-01-22 22:39:43 +01:00
2cece492e9 revert(azure-pipelines): use pool on job level 2025-01-22 22:39:12 +01:00
e9dc8be826 ci(azure-pipelines): fix service pool 2025-01-22 22:35:40 +01:00
eec396ec98 ci(azure-pipelines): use DS2 pool for backend service 2025-01-22 22:34:28 +01:00
4ef188f2ed ci(azure-pipelines): disable dependsOn for service for now 2025-01-22 22:31:38 +01:00
bcfee0f14f ci(azure-pipelines): simplify service conditions contd 2025-01-22 22:29:19 +01:00
fdaaccb28a ci(azure-pipelines): simplify service conditions contd 2025-01-22 22:27:43 +01:00
53edb0dfeb ci(azure-pipelines): simplify service run conditions 2025-01-22 22:19:35 +01:00
c8a9e5a57d ci(azure-pipelines): fix service build condition contd 2025-01-22 22:14:50 +01:00
66879a4fb0 ci(azure-pipelines): fix service build condition 2025-01-22 22:11:08 +01:00
34fd73e17b ci(azure-pipelines): fix backend dependsOn type 2025-01-22 22:10:24 +01:00
a8e9a59edf ci(azure-pipelines): use reduce for dependsOn service mapping 2025-01-22 22:09:46 +01:00
e0d1777fb9 ci(azure-pipelines): add dependsOn to parameter for services 2025-01-22 21:50:02 +01:00
8c47b51cef ci(azure-pipelines): fix image build dependency contd 2025-01-22 21:41:59 +01:00
0ffbbfdb18 ci(azure-pipelines): fix image build dependency 2025-01-22 21:40:48 +01:00
7c6da61d13 ci(azure-pipelines): Build jobs depend on ImageBuild jobs now 2025-01-22 21:37:10 +01:00
ded2049f33 ci(azure-pipelines): add backend service 2025-01-22 21:13:58 +01:00
14b8406937 build(frontend): add dummy target for test-frontend 2025-01-22 12:02:36 +01:00
453c283438 build(frontend): only lint frontend/src files to avoid ignored ignore-patterns 2025-01-22 11:40:41 +01:00
6168349ed2 build(frontend): dont ignore well-known when linting 2025-01-22 11:26:06 +01:00
57bbc5ba9c build(frontend): ignore static and well-known when linting 2025-01-22 11:14:48 +01:00
ab3b01cbfd build(frontend): ignore webpack config in lint too 2025-01-22 11:13:33 +01:00
e85dfde4d9 chore(frontend): partially disable storage-manager util (broken and currently not used) 2025-01-22 11:01:27 +01:00
fd1edb292c build(frontend): ignore webpack config for eslint 2025-01-22 10:56:08 +01:00
0ad82f6275 refactor(frontend): eslint contd 2025-01-22 10:54:52 +01:00
f9f79b2a42 refactor(frontend): eslint 2025-01-22 10:51:33 +01:00
5c73ee676a build(frontend): frontend audit 2025-01-22 10:50:43 +01:00
be13a64d50 build(frontend): add lintfix npm script 2025-01-22 10:49:23 +01:00
9f8af30e6d build(frontend): ignore .stack folder for eslint 2025-01-22 10:48:42 +01:00
8f9f6ba8e2 build(frontend): add --color flag for eslint color in pipeline output 2025-01-22 10:35:34 +01:00
775ec4c948 ci(azure-pipelines): rename build steps for azure naming scheme 2025-01-21 23:56:12 +01:00
0c808ca393 build(frontend): add eslint 2025-01-21 19:03:33 +01:00
0e45938886 chore(frontend): modernize eslint config 2025-01-21 19:03:13 +01:00
1d357550d6 ci(azure-pipelines): rename build-steps 2025-01-21 18:46:19 +01:00
21d6975ea3 ci(azure-pipelines): parametrize build artifacts 2025-01-21 18:39:17 +01:00
efa14e0301 ci(azure-pipelines): fix template path 2025-01-21 18:37:41 +01:00
dfb97df72b ci(azure-pipelines): parametrize build steps 2025-01-21 18:36:33 +01:00
189205767f ci(azure-pipelines): rename service template 2025-01-21 18:17:43 +01:00
03d85be290 ci(azure-pipelines): reintroduce image-build conditions 2025-01-21 17:28:53 +01:00
5d54275446 ci(azure-pipelines): disable extraBuildOptions for now 2025-01-21 17:18:32 +01:00
e84e7e57d8 ci(azure-pipelines): fix templating contd 2025-01-21 17:14:47 +01:00
b51caba851 ci(azure-pipelines): add targetImage service parameter 2025-01-21 17:03:46 +01:00
e2f6ee4294 ci(azure-pipelines): fix service extraBuildOptions default 2025-01-21 16:56:40 +01:00
50c3134a1b ci(azure-pipelines): fix templating contd 2025-01-21 16:55:50 +01:00
31f670b143 ci(azure-pipelines): fix templating syntax 2025-01-21 16:53:28 +01:00
81c4838e29 ci(azure-pipelines): fix syntax 2025-01-21 16:50:16 +01:00
7717b2ce45 ci(azure-pipelines): temporarily remove image build conditions for refresh 2025-01-21 16:32:38 +01:00
60626cd841 ci(azure-pipelines): move variables decl to main yaml 2025-01-21 16:31:34 +01:00
3122a36ac8 ci(azure-pipelines): parametrize frontend service 2025-01-21 16:28:27 +01:00
12aee272c4 ci(azure-pipelines): add icons to frontend artifacts 2025-01-21 15:45:58 +01:00
5b8edf86ff ci(azure-pipelines): try to remove redundant npm-proxy call 2025-01-21 15:44:09 +01:00
733d6ea218 ci(azure-pipelines): remove debug prints 2025-01-21 15:42:59 +01:00
1d88e98fb4 ci(azure-pipelines): add PROJECT_DIR to env per-task 2025-01-21 15:23:55 +01:00
8e3c82c1e6 build(docker/frontend): remove LC_ALL 2025-01-21 15:18:14 +01:00
5e30ae8b5f ci(azure-pipelines): fix debug info 2025-01-21 15:14:49 +01:00
6c2b57ca4c ci(azure-pipelines): remove dummy backend image build 2025-01-21 15:13:49 +01:00
cfa10a1c16 ci(azure-pipelines): add debug info contd 2025-01-21 15:11:44 +01:00
315e668ff6 ci(azure-pipelines): tweak debug info 2025-01-21 15:05:11 +01:00
b7227f9ce3 ci(azure-pipelines): use Build.Repository.LocalPath as PROJECT_DIR 2025-01-21 14:57:53 +01:00
492a758723 ci(azure-pipelines): only rebuild frontend image on master or update/... branches 2025-01-21 14:46:01 +01:00
1cc140a1cc ci(azure-pipelines): fix push latest 2025-01-21 14:38:42 +01:00
e2ad23ab2b ci(azure-pipelines): temporarily pin frontend image build 2025-01-21 14:27:45 +01:00
956e939f9a ci(azure-pipelines): add more debug info 2025-01-21 14:23:28 +01:00
cd3c327c4c ci(azure-pipelines): add debug info 2025-01-21 14:10:17 +01:00
f463f3d503 ci(azure-pipelines): additionally set env vars for proxy in dependency task 2025-01-21 13:59:59 +01:00
4f7f54424c ci(azure-pipelines): set npm proxy manually 2025-01-21 10:46:13 +01:00
8b37d788a7 ci(azure-pipelines): dont use azure artifacts; fix node ca certs 2025-01-21 10:03:07 +01:00
47a7fe15fd ci(azure-pipelines): try npm login 2025-01-20 16:42:33 +01:00
8532af38a5 ci(azure-pipelines): build frontend dependencies in separate step 2025-01-20 16:15:23 +01:00
f3d0c3e2a8 ci(azure-pipelines): add debug info 2025-01-20 14:41:40 +01:00
44b84e1e83 ci(azure-pipelines): fix syntax contd 2025-01-20 14:17:27 +01:00
7263a19085 ci(azure-pipelines): fix syntax 2025-01-20 14:16:55 +01:00
d7c45dadac ci(azure-pipelines): fix syntax 2025-01-20 14:13:12 +01:00
47678dde2c ci(azure-pipelines): fix master branch check 2025-01-20 14:08:04 +01:00
351421e903 ci(azure-pipelines): fix branch ref 2025-01-20 14:04:19 +01:00
66fff83ff8 ci(azure-pipelines): fix syntax 2025-01-20 13:10:02 +01:00
10a9d8c51d build(Makefile): rename CONTAINER_CMD -> IMAGE; remove unnecessary make calls in Dockerfile 2025-01-20 13:06:00 +01:00
2e526e0cb3 ci(azure-pipelines): update frontend:latest on master 2025-01-20 13:04:12 +01:00
91273e57eb ci(azure-pipelines): parametrize image builds 2025-01-20 13:03:49 +01:00
18585db1aa build(docker/frontend): fix npm registry parametrization 2025-01-20 12:13:26 +01:00
0de102805a ci(azure-pipelines): remove entrypoint def 2025-01-18 04:02:00 +01:00
9bd7459849 ci(azure-pipelines): fix step def 2025-01-18 03:40:56 +01:00
ecd0a443b4 build(docker/backend): envify PROJECT_DIR for runtime access 2025-01-18 03:39:03 +01:00
0ae8eddc5b ci(azure-pipelines): use basic step script for frontend-compile 2025-01-18 03:38:31 +01:00
178bce90c9 build(docker/frontend): temporarily remove chromium install 2025-01-18 03:33:26 +01:00
82655fd4db build(docker/frontend): fix default make-target 2025-01-18 03:27:53 +01:00
9f490d16c3 ci(azure-pipelines): provide frontend image with non-terminating entrypoint on compile 2025-01-18 03:11:12 +01:00
aa44d6fe9c ci(azure-pipelines): add env vars to frontend container 2025-01-18 02:59:17 +01:00
101890ac2a build(docker/frontend): add locale env vars to stop perl from complaining 2025-01-18 02:50:47 +01:00
1406ea9c13 ci(azure-pipelines): add build-arg for custom npm registry 2025-01-18 02:44:51 +01:00
d02024138f ci(azure-pipelines): add PROJECT_DIR to make-call for frontend compile 2025-01-18 02:30:12 +01:00
999724dc85 ci(azure-pipelines): set make target via env for testing 2025-01-17 18:05:07 +01:00
a9fd747469 build(Makefile): avoid unnecessary double-static build for dependencies 2025-01-17 17:50:32 +01:00
2e45db2efa build(Makefile): mount project dir rw 2025-01-17 17:50:06 +01:00
714709894a build(docker/frontend): only preinstall dependencies instead of static 2025-01-17 17:49:41 +01:00
a80088fe66 build(docker/frontend): reintroduce cp with bind mount configured 2025-01-17 17:48:56 +01:00
ba8d39a7c5 build(docker/frontend): remove debris 2025-01-17 17:48:36 +01:00
adf53f07bc ci(azure-pipelines): replace backend image build with dummy script to stop unnecessary load 2025-01-17 17:47:59 +01:00
77c856b842 ci(azure-pipelines): rename jobs/tasks 2025-01-17 17:47:11 +01:00
64a8c0dee0 ci(azure-pipelines): remove npm tasks for frontend compile 2025-01-17 17:43:13 +01:00
42b1a8fcfe ci(azure-pipelines): switch back to DS1 until build for authorisation succeeds 2025-01-17 15:41:33 +01:00
1bd98525fa ci(azure-pipelines): temporarily remove job dependencies 2025-01-17 15:33:06 +01:00
e755b7a2b0 ci(azure-pipelines): use DS2 pool for backend image build 2025-01-17 15:24:11 +01:00
f4c83b3e96 ci(azure-pipelines): add npm tasks 2025-01-17 15:14:23 +01:00
f212d831d1 build(docker/frontend): remove make-entrypoint for more control over exec targets in pipeline 2025-01-16 14:56:55 +01:00
9d85d67ce8 ci(azure-pipelines): use uncontainerized make-targets in CompileFrontend job 2025-01-16 14:39:51 +01:00
fac186f5c7 ci(azure-pipelines): move frontend artifact push to compile job 2025-01-16 14:23:52 +01:00
7250392d5e ci(azure-pipelines): first try at publishing frontend build artifacts 2025-01-16 14:23:07 +01:00
7f7f3c4e9e ci(azure-pipelines): fix frontend image tags 2025-01-16 14:06:50 +01:00
ead1bcfeaa ci(azure-pipelines): exec CompileFrontend only after frontend image build succeeded 2025-01-16 13:58:25 +01:00
af69c8d4a7 ci(azure-pipelines): push frontend image 2025-01-16 13:56:29 +01:00
d0f5abf854 ci(azure-pipelines): fix backend image tags 2025-01-16 13:54:45 +01:00
866cc3d95d ci(azure-pipelines): fix frontend image tags 2025-01-16 13:53:50 +01:00
a9e6496db2 ci(azure-pipelines): list docker images for frontend image build (prepare push) 2025-01-16 13:42:42 +01:00
cd15ddea2f ci(azure-pipelines): add frontend build job 2025-01-16 12:01:07 +01:00
15f6dd9211 build(docker/backend): copy stack yamls before stack-install 2025-01-16 11:59:07 +01:00
88367a9219 chore(frontend): splice PROJECT_DIR into icon import sass 2025-01-16 11:27:59 +01:00
d2c8522ffe ci(azure-pipelines): separate frontend and backend image build into separate jobs 2025-01-16 10:48:11 +01:00
23dec225a9 build(docker/frontend): fix conditional npm proxy conf 2025-01-15 15:18:15 +01:00
7228868f08 ci(azure-pipelines): switch back to npm image for frontend builds with npm proxy 2025-01-15 15:10:46 +01:00
18adf4dfc7 ci(azure-pipelines): switch to npm-v2 for proxy usage 2025-01-15 14:56:40 +01:00
3d86cd3225 build(docker/frontend): configure npm proxy if supported 2025-01-15 14:55:15 +01:00
66b64b818b build(docker/frontend): switch order 2025-01-15 14:37:56 +01:00
e826856bea ci(azure-pipelines): use correct dockerfile for frontend build 2025-01-15 14:23:54 +01:00
318e9752f2 ci(azure-pipelines): add build tags 2025-01-15 13:39:57 +01:00
dac20928d4 ci(azure-pipelines): fix Bash@3 frontend task 2025-01-15 13:39:41 +01:00
1c25f06853 ci(azure-pipelines): switch frontend image build to Bash@3 task 2025-01-15 13:36:47 +01:00
34567311d0 ci(azure-pipelines): fix docker task syntax 2025-01-15 13:28:19 +01:00
d8425ac562 build(docker/backend): prebuild dependencies before COPY, temporarily COPY everything 2025-01-15 13:25:26 +01:00
61bd28a21c ci(azure-pipelines): add frontend image build 2025-01-15 13:22:53 +01:00
fb518ac4ef build(docker/frontend): prepare Dockerfile for pipeline usage 2025-01-14 18:41:03 +01:00
c9999d9b06 ci(azure-pipelines): rename backend task 2025-01-14 17:29:22 +01:00
e729cccf23 ci(azure-pipelines): do docker logout 2025-01-14 17:27:52 +01:00
4766dea3d5 ci(azure-pipelines): cleanup yaml 2025-01-14 17:27:01 +01:00
425804e4b6 build(docker/backend): refine COPY sources 2025-01-14 17:17:42 +01:00
6d0161c598 build(docker/backend): do stack-install before dependency build 2025-01-14 08:41:25 +01:00
3c3cabc909 build(docker/backend): remove debug prints 2025-01-14 08:40:39 +01:00
c3fee55090 build(docker/backend): remove debug prints 2025-01-13 22:25:51 +01:00
6f5cc4da20 ci(azure-pipelines): perform docker-login before any docker calls 2025-01-13 22:16:42 +01:00
f140342e2d ci(azure-pipelines): use Dockerfile in root dir 2025-01-13 19:00:50 +01:00
09a44d13cc ci(azure-pipelines): use Dockerfile with --file 2025-01-13 18:57:37 +01:00
67108a8f84 ci(azure-pipelines): use docker build in Bash@3 2025-01-13 18:55:10 +01:00
5787796eac build(docker/backend): try COPY instead of RUN cp 2025-01-13 18:49:19 +01:00
2149189394 ci(azure-pipelines): add bash debug output; checkout self 2025-01-13 18:43:14 +01:00
d455cb4f71 build(docker/backend): add more debug info 2025-01-13 18:35:39 +01:00
Sarah Vaupel
181b18460e Update azure-pipelines.yaml for Azure Pipelines 2025-01-13 17:27:44 +00:00
e8353f6200 build(docker/backend): add debug info 2025-01-13 18:20:03 +01:00
1dce3ab2b1 build(docker/backend): use cache mounts for apt-installs 2025-01-13 17:50:20 +01:00
1a344feaa3 Merge branch '145-build-system-rewrite' of https://dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive into 145-build-system-rewrite 2025-01-13 17:17:17 +01:00
55d9097ca8 build(docker/backend): try mount param in RUN for dependency cache 2025-01-13 17:17:14 +01:00
Sarah Vaupel
9a25ae6d63 Update azure-pipelines.yaml for Azure Pipelines 2025-01-13 14:20:30 +00:00
Sarah Vaupel
33f33b1f44 Update azure-pipelines.yaml for Azure Pipelines 2025-01-13 14:12:03 +00:00
Sarah Vaupel
d441ff40ef Update azure-pipelines.yaml for Azure Pipelines 2025-01-13 14:06:32 +00:00
e90d11682b fix(lms): eliminate unlikely possible discrepancy for LMS deletion indicator
It was theoretically possible for LMS Learner deletion tag to be not correctly shown in LMS table.

Also see #2605 for further related issues.
2025-01-10 16:49:53 +01:00
19cc34d21f ci(azure-pipelines): tweak mount dir 2025-01-09 16:29:32 +01:00
9aa1de6a4a ci(azure-pipelines): change mount dir to work dir as reported from previous runs 2025-01-09 16:24:07 +01:00
0b9e55cfea ci(azure-pipelines): use /work/1 as mount-dir; copy repository recursively again 2024-12-20 16:59:26 +01:00
4669a47d9b build(docker/backend): copy complete directory to PROJECT_DIR 2024-12-20 16:28:41 +01:00
6acaa3f796 ci(azure-pipelines): use Pipeline.Workspace instead of Build.Repository.LocalPath 2024-12-20 16:19:58 +01:00
98880f67ee ci(azure-pipelines): use correct local-repository path 2024-12-20 16:07:19 +01:00
4fbf0ba72d build(docker/backend): fix typo 2024-12-20 15:50:30 +01:00
ef669aeb06 ci(azure-pipelines): supply fraport-internal haskell image url as build-arg 2024-12-20 15:42:48 +01:00
5bb77d8b2b chore(docker): remove obsolote image definitions 2024-12-20 15:40:18 +01:00
db9481cffb build(docker/backend): make FROM image and tag configurable by build-arg
use docker.io haskell image per default as build-arg, and later use fraport-internal args for pipeline
2024-12-20 15:39:12 +01:00
82ed04008a ci(docker/haskell): do not use root 2024-12-19 16:03:27 +01:00
6ddfbe959e ci(docker/backend): prepare Dockerfiles for separate image artifact push step 2024-12-19 14:22:22 +01:00
376c88e724 build(docker/backend): use BaseImage; add dependencies 2024-12-19 14:03:49 +01:00
b068e46480 build(Makefile): use YESOD_IP_FROM_HEADER to fix reverse-proxy issues 2024-12-15 01:28:26 +01:00
84a5cb37d9 build(docker/backend): switch to official stack snapshot image 2024-12-15 01:07:52 +01:00
1ab8a93b53 refactor: backport saltine (0.2.0.0->0.1.1.1) for compatibility with proper lts-18.0 stack snapshot image 2024-12-15 01:02:45 +01:00
3b4b1f2fa9 ci(azure-pipelines): tweak PROJECT_DIR and MOUNT_DIR 2024-12-10 16:08:31 +01:00
2b91095391 ci(azure-pipelines): add PROJECT_DIR and MOUNT_DIR build-args 2024-12-10 15:44:37 +01:00
16001df5be build(docker/backend): tmp-remove more deps 2024-12-10 15:33:29 +01:00
a2bdd4bbb8 build(docker/backend): remove unused dependency 2024-12-10 15:27:15 +01:00
13ec339f9b build(docker/backend): tmp-remove deps 2024-12-10 15:22:35 +01:00
ebae2b386e build(docker/backend): remove test-only dependencies temporarily 2024-12-10 15:18:00 +01:00
f47cb17230 build(docker/backend): remove locales (and thus tzdata) installs for testing purposes 2024-12-10 15:12:31 +01:00
d0cd45e60e build(docker/backend): add temporary tools FROM for pipeline test 2024-12-10 15:01:19 +01:00
09f22e52c7 build(docker/backend): remove unused dependency 2024-12-10 15:00:19 +01:00
3946090dab build(docker/backend): add debug print for apt sources info 2024-12-10 14:59:45 +01:00
2033976381 build(docker/backend): add texlive-base and more tex runtime dependencies 2024-12-10 14:40:51 +01:00
d8c88d167f build(Makefile): revisit stop targets 2024-12-06 17:03:50 +01:00
f8681826b2 build(docker/backend): add roboto and lualatex dependencies 2024-12-04 16:32:04 +01:00
ca4eac3af9 build(docker/backend): fix tzdata install requiring confirmation 2024-12-04 16:31:38 +01:00
6c525bc986 build(docker/backend): remove debug output 2024-12-04 16:30:35 +01:00
c3117dbdcd fix(ghci): ghci works now as expected 2024-12-02 17:38:59 +01:00
0e605386cc build(Makefile): add SRC option to ghci target 2024-12-02 16:32:41 +01:00
082dd74bb0 ci(azure-pipelines): proxy vars without parentheses 2024-11-28 14:03:45 +01:00
304c8c2ca9 ci(azure-pipelines): add multiple build-args 2024-11-28 12:01:43 +01:00
a20ade7c52 ci(azure-pipelines): fix newline escaping 2024-11-28 11:58:09 +01:00
dec0f2667d ci(azure-pipelines): add build args via arguments 2024-11-28 11:56:03 +01:00
609adaa960 build(docker/backend): remove debug info 2024-11-28 11:48:45 +01:00
8967837155 ci(azure-pipelines): try http(s) proxy without password 2024-11-28 11:46:48 +01:00
fc68777826 build(docker/backend): remove debug prints 2024-11-28 11:43:19 +01:00
d1126b3acf build(docker/backend): add debug info prints for ci 2024-11-28 11:40:20 +01:00
9df3b18680 ci(azure-pipelines): set http/https proxy env variables 2024-11-28 11:01:30 +01:00
a2bd5c35c8 build(docker/backend): reintroduce apt-get update 2024-11-28 10:57:24 +01:00
Sarah Vaupel
33ccd36a14 ci(docker/backend): remove apt-get update due to missing connection to archive.ubuntu.com 2024-11-26 13:05:34 +00:00
Sarah Vaupel
29427a02c6 chore(docker/backend): switch base image, print version info 2024-11-26 12:58:00 +00:00
Sarah Vaupel
fe9a92fd3f Update azure-pipelines.yaml for Azure Pipelines 2024-11-26 12:23:04 +00:00
cc7fa8333c chore(icons): contribute to #2397 by improving the comment instructions 2024-11-26 09:02:53 +01:00
26831fde6e build(Makefile): do not compile backend before start 2024-11-25 16:19:25 +01:00
ebbf52dd15 build(Makefile): switch back to yesod-devel for start-backend 2024-11-24 02:01:02 +01:00
fbc8271e86 build(Makefile): set PORT env var on start-backend 2024-11-24 02:00:43 +01:00
cbfcd17c77 build(utils/develop-status.pl): Changed output order. 2024-11-21 00:18:23 +01:00
9a281f040e fix(print): apcidents somehow include newlines after DB update; strip these 2024-11-18 12:36:05 +01:00
b844e3028c build(Makefile): ensure frontend compilation is done before starting backend 2024-11-17 01:02:18 +01:00
891a6e7c64 build(Makefile): compile-backend before start-backend for bin 2024-11-17 00:37:39 +01:00
1018e9dac5 build(Makefile): abandon yesod-devel for basic uniworx binary execution in start-backend 2024-11-14 00:31:20 +01:00
d646a03325 build(backend): use localhost with IPv6-enabled pg_hba.conf 2024-11-14 00:02:41 +01:00
81f689cfdf build(Makefile): update documentation 2024-11-13 04:00:52 +01:00
9f862bcfd6 build(Makefile): explicitely execute hpack on missing uniworx.cabal for robustness 2024-11-13 03:48:57 +01:00
cbf167d197 build(Makefile): add/reimplement shell-% and ghci targets 2024-11-13 03:37:46 +01:00
4d19773223 build(Makefile): resort to default .stack-work for all jobs 2024-11-12 01:15:02 +01:00
0b70036a02 fix(LMS): fix #2235 by notifying LMS user upon reset 2024-11-08 13:47:16 +01:00
3b0029ba04 fix(avs): fix #225 by skipping firm updates entirely if AVS FirmInfo is unchanged for previously seen values for AVS User to be updated 2024-10-09 12:50:32 +02:00
e554048f5a fix(avs): avs firm update no longer may update wrong company
Note: noticed while working on #225
2024-10-09 12:50:32 +02:00
e59fff352f fix(avs): fix #224 repeated superior changes no longer occur
furthermore AdminProblems are only inserted if the same problem does not exist unsolved
2024-10-09 12:50:32 +02:00
e9d4174b83 chore(release): 27.4.79 2024-09-10 17:56:40 +02:00
90613faf72 Merge branch 'fradrive/jost' 2024-09-10 17:55:52 +02:00
d92d23bc99 chore(release): 27.4.78 2024-09-05 17:55:54 +02:00
4959736c90 Merge branch 'fradrive/jost' 2024-09-05 17:55:09 +02:00
547f34d2ec chore(release): 27.4.77 2024-09-02 10:50:31 +02:00
08788427a8 Merge branch 'fradrive/jost' into 'master'
HOTFIX(avs): switch company did not always increase priority

Closes #175 and #174

See merge request fradrive/fradrive!41
2024-09-02 08:42:32 +00:00
6d1b177ce9 Merge branch 'fradrive/jost' into 'master'
Fradrive/jost - two minor fixes

See merge request fradrive/fradrive!40
2024-08-26 18:04:38 +00:00
e1a02879d6 Merge branch 'fradrive/jost' into 'master'
chore(health): augement #154 by adding option to disable interface warnings

See merge request fradrive/fradrive!39
2024-08-22 18:08:52 +00:00
97446aa9ef Merge branch 'fradrive/jost' into 'master'
minor update

Closes #154 and #5

See merge request fradrive/fradrive!38
2024-08-21 17:59:22 +00:00
776e6b6736 Merge branch 'fradrive/jost' into 'master'
AVS automatic synchronisation

See merge request fradrive/fradrive!37
2024-08-12 18:29:21 +00:00
1311 changed files with 26059 additions and 22729 deletions

View 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 }}'

View 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.)

View 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

View 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'

View 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)'

View 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}}'

View 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}}

View File

@ -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

View File

@ -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
View File

@ -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

View File

@ -1,3 +0,0 @@
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
SPDX-License-Identifier: AGPL-3.0-or-later

View File

@ -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}}',
};

View File

@ -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
View File

@ -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

View File

@ -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
View 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]}}

View File

40
backend/Dockerfile Normal file
View 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
View 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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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").

View File

@ -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"}

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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 (;)

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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: ELearning Id
PrintJobs: Druckaufräge
PrintLetterType: Brieftypkürzel
MCActDummy: Platzhalter
MCActResendEmail: EMail Kopie versenden
MCActResendEmailTooltip: Eine unveränderte Kopie der EMail erneut versenden. Nur die vorherigen Empfänger werden offiziell aufgeführt, sie erhalten jedoch keine neue Kopie.
MCActResendEmailInfo n@Int recv@Text: #{pluralDEnN n "EMail Kopie"} wurden an #{recv} versandt.
CCActDummy: Platzhalter

Some files were not shown because too many files have changed in this diff Show More