feat(corrections): override rating_done & documentation

Fixes #525
Fixes #274
This commit is contained in:
Gregor Kleen 2020-06-17 14:38:11 +02:00
parent af7947328d
commit bbbfa946e1
20 changed files with 245 additions and 69 deletions

View File

@ -636,8 +636,8 @@ CorrectionTime: Korrekturdauer
AssignSubmissionsRandomWarning: Die Zuteilungsvorschau kann von der tatsächlichen Zuteilung abweichen, wenn mehrere Blätter auf einmal zugeteilt werden, da beim Ausgleich der Kontigente nur bereits zugeteilte Abgaben berücksichtigt werden. Da es ein randomisierte Prozess ist, kann es auch bei einzelnen Blättern gerinfgügige Abweichungen geben.
AssignSubmissionsAssignableSheets: Korrekturen verteilen für:
CorrectionsUploaded num@Int64: #{num} Korrekturen wurden gespeichert:
NoCorrectionsUploaded: In der hochgeladenen Datei wurden keine Korrekturen gefunden.
CorrectionsUploaded num@Int64: #{num} #{pluralDE num "Korrektur wurde" "Korrekturen wurden"} gespeichert
NoCorrectionsUploaded: In den hochgeladenen Dateien wurden keine Korrekturen gefunden.
RatingBy: Korrigiert von
HasCorrector: Korrektor zugeteilt
@ -2632,4 +2632,10 @@ RatingYAMLChangePointsComment: TODO: Hier die Punktezahl statt null eintragen (b
RatingYAMLChangePassedComment: TODO: Hier true oder false statt null eintragen (true entspricht Bestanden)
RatingYAMLChangeDoneComment: TODO: Von false auf true setzen, sobald Bewertung abgeschlossen; sonst Korrektur für die Studierenden nicht sichtbar und keine Anrechnung auf Klausurbonus
RatingYAMLChangeCommentComment: TODO: Korrektur-Kommentar für die Studierenden unterhalb der Abtrennung (...) eintragen
RatingYAMLSubmissionIdComment: Abgabenummer; wird beim Hochladen mit dem Dateinamen abgeglichen
RatingYAMLSubmissionIdComment: Abgabenummer; wird beim Hochladen mit dem Dateinamen abgeglichen
SubmissionDoneNever: Nie
SubmissionDoneByFile: Je nach Bewertungsdatei
SubmissionDoneAlways: Immer
CorrUploadSubmissionDoneMode: Bewertung abgeschlossen
CorrUploadSubmissionDoneModeTip: Sollen hochgeladene Korrekturen als abgeschlossen markiert werden? Bewertungen sind erst für Studierende sichtbar und zählen gegen Examboni, wenn sie abgeschlossen sind.

View File

@ -634,8 +634,8 @@ CorrectionTime: Correction time
AssignSubmissionsRandomWarning: The assignment preview might be different from the actual assignment if multiple sheets are being distributed. This is due to the fact that only assigned submissions are considered when handling corrector-deficits. Due to this being a randomised process small differences are also possible for a single sheet.
AssignSubmissionsAssignableSheets: Distribute corrections for:
CorrectionsUploaded num: Successfully saved #{num} #{pluralEN num "correction" "corrections"}:
NoCorrectionsUploaded: No corrections could be found within the uploaded file.
CorrectionsUploaded num: Successfully saved #{num} #{pluralEN num "correction" "corrections"}
NoCorrectionsUploaded: No corrections could be found within the uploaded files.
RatingBy: Marked by
HasCorrector: Corrector assigned
@ -2633,3 +2633,9 @@ RatingYAMLChangePassedComment: TODO: Set true or false instead of null (true mea
RatingYAMLChangeDoneComment: TODO: Set to true instead of false, when correction is finished; otherwise correction will not be visible to students and won't be counted for exam bonus
RatingYAMLChangeCommentComment: TODO: Enter correction comment after the separator below (...)
RatingYAMLSubmissionIdComment: Submission id; will be compared to the filename during upload
SubmissionDoneNever: Never
SubmissionDoneByFile: According to correction file
SubmissionDoneAlways: Always
CorrUploadSubmissionDoneMode: Rating finished
CorrUploadSubmissionDoneModeTip: Should uploaded corrections be marked as finished? The rating is only visible to the submittors and considered for any exam bonuses if it is finished.

2
routes
View File

@ -60,7 +60,7 @@
/health HealthR GET !free
/instance InstanceR GET !free
/info InfoR GET !free
/info/lecturer InfoLecturerR GET !lecturer
/info/lecturer InfoLecturerR GET !free
/info/legal LegalR GET !free
/info/allocation InfoAllocationR GET !free
/info/glossary GlossaryR GET !free

View File

@ -2881,7 +2881,7 @@ defaultLinks = fmap catMaybes . mapM runMaybeT $ -- Define the menu items of the
, NavLink
{ navLabel = MsgInfoLecturerTitle
, navRoute = InfoLecturerR
, navAccess' = return True
, navAccess' = hasWriteAccessTo CourseNewR
, navType = NavTypeLink { navModal = False }
, navQuick' = mempty
, navForceActive = False
@ -3206,7 +3206,7 @@ pageActions InfoR = return
{ navLink = NavLink
{ navLabel = MsgInfoLecturerTitle
, navRoute = InfoLecturerR
, navAccess' = return True
, navAccess' = hasWriteAccessTo CourseNewR
, navType = NavTypeLink { navModal = False }
, navQuick' = mempty
, navForceActive = False
@ -3252,7 +3252,7 @@ pageActions VersionR = return
{ navLink = NavLink
{ navLabel = MsgInfoLecturerTitle
, navRoute = InfoLecturerR
, navAccess' = return True
, navAccess' = hasWriteAccessTo CourseNewR
, navType = NavTypeLink { navModal = False }
, navQuick' = mempty
, navForceActive = False
@ -3335,7 +3335,7 @@ pageActions HelpR = return
{ navLink = NavLink
{ navLabel = MsgInfoLecturerTitle
, navRoute = InfoLecturerR
, navAccess' = return True
, navAccess' = hasWriteAccessTo CourseNewR
, navType = NavTypeLink { navModal = False }
, navQuick' = mempty
, navForceActive = False

View File

@ -16,27 +16,57 @@ import Data.List (genericLength)
import qualified Data.Conduit.List as C
data SubmissionDoneMode
= SubmissionDoneNever
| SubmissionDoneByFile
| SubmissionDoneAlways
deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable)
deriving anyclass (Universe, Finite)
nullaryPathPiece ''SubmissionDoneMode $ camelToPathPiece' 2
embedRenderMessage ''UniWorX ''SubmissionDoneMode id
explainSubmissionDoneMode :: SubmissionDoneMode -> MaybeT Handler Widget
explainSubmissionDoneMode SubmissionDoneNever = return $(i18nWidgetFile "submission-done-tip/never")
explainSubmissionDoneMode SubmissionDoneAlways = return $(i18nWidgetFile "submission-done-tip/always")
explainSubmissionDoneMode SubmissionDoneByFile = return $(i18nWidgetFile "submission-done-tip/by-file")
getCorrectionsUploadR, postCorrectionsUploadR :: Handler Html
getCorrectionsUploadR = postCorrectionsUploadR
postCorrectionsUploadR = do
((uploadRes, upload), uploadEncoding) <- runFormPost . identifyForm FIDcorrectionsUpload . renderAForm FormStandard $
areq (zipFileField True Nothing) (fslI MsgCorrUploadField) Nothing
((uploadRes, upload), uploadEncoding) <- runFormPost . identifyForm FIDcorrectionsUpload . renderAForm FormStandard $ (,)
<$> areq (zipFileField True Nothing) (fslI MsgCorrUploadField) Nothing
<*> apopt (explainedSelectionField Nothing $ explainOptionList optionsFinite explainSubmissionDoneMode) (fslI MsgCorrUploadSubmissionDoneMode & setTooltip MsgCorrUploadSubmissionDoneModeTip) (Just SubmissionDoneByFile)
case uploadRes of
FormMissing -> return ()
FormFailure errs -> mapM_ (addMessage Error . toHtml) errs
FormSuccess files -> do
uid <- requireAuthId
mbSubs <- msgSubmissionErrors . runDBJobs . runConduit $ transPipe (lift . lift) files .| C.mapM (either get404 return) .| extractRatingsMsg .| sinkMultiSubmission uid True
case mbSubs of
Nothing -> return ()
(Just subs)
| null subs -> addMessageI Warning MsgNoCorrectionsUploaded
| otherwise -> do
subs' <- traverse (\x -> (,) <$> encrypt x <*> encrypt x) $ Set.toList subs :: Handler [(CryptoFileNameSubmission, CryptoUUIDSubmission)]
let trigger = [whamlet|_{MsgCorrectionsUploaded (genericLength subs')}|]
content = Right $(widgetFile "messages/correctionsUploaded")
addMessageModal Success trigger content
formResult uploadRes $ \(files, doneMode) -> do
let
setDone (Right (subId, rating))
= Right ( subId
, rating & _ratingDone %~ setDone'
)
where setDone' = case doneMode of
SubmissionDoneNever -> const False
SubmissionDoneByFile -> id
SubmissionDoneAlways -> const True
setDone other = other
uid <- requireAuthId
mbSubs <- msgSubmissionErrors . runDBJobs . runConduit $
transPipe (lift . lift) files
.| C.mapM (either get404 return)
.| extractRatingsMsg
.| C.map setDone
.| sinkMultiSubmission uid True
forM_ mbSubs $ \subs -> if
| null subs -> addMessageI Warning MsgNoCorrectionsUploaded
| otherwise -> do
subs' <- traverse (\x -> (,) <$> encrypt x <*> encrypt x) $ Set.toList subs :: Handler [(CryptoFileNameSubmission, CryptoUUIDSubmission)]
let trigger = [whamlet|_{MsgCorrectionsUploaded (genericLength subs')}|]
content = Right $(widgetFile "messages/correctionsUploaded")
addMessageModal Success trigger content
redirect CorrectionsR
let uploadForm = wrapForm upload def
{ formAction = Just $ SomeRoute CorrectionsUploadR

View File

@ -6,6 +6,7 @@ module Utils.Lens ( module Utils.Lens ) where
import Import.NoModel
import Model
import Model.Rating
import qualified ClassyPrelude.Yesod as Yesod (HasHttpManager(..))
import Control.Lens as Utils.Lens
@ -230,6 +231,8 @@ makeLenses_ ''ExternalExam
makeLenses_ ''ExternalExamOfficeSchool
makeLenses_ ''ExternalExamStaff
makeLenses_ ''ExternalExamResult
makeLenses_ ''Rating'
-- makeClassy_ ''Load

View File

@ -1,5 +1,12 @@
$newline never
<dl .deflist>
<dt .deflist__dt>
^{formatGregorianW 2020 06 17}
<dd .deflist__dd>
<ul>
<li>
Neues (YAML-basiertes) Format für Bewertungsdateien
<dt .deflist__dt>
^{formatGregorianW 2020 06 14}
<dd .deflist__dd>

View File

@ -1,5 +1,12 @@
$newline never
<dl .deflist>
<dt .deflist__dt>
^{formatGregorianW 2020 06 17}
<dd .deflist__dd>
<ul>
<li>
New (YAML-based) format for correction files
<dt .deflist__dt>
^{formatGregorianW 2020 06 14}
<dd .deflist__dd>

View File

@ -3,15 +3,9 @@ $newline never
<section>
<p>
Das Hochladen einer Korrekturen markiert die entsprechende Abgabe #
automatisch als "korrigiert" (Bewertung abgeschlossen), falls #
Ihnen die Abgabe zugeteilt gewesen war.
<p>
Lädt jedoch ein Assistent Korrekturen hoch, welche anderen #
Korrektoren oder noch nicht zugeteilt wurden, so werden diese #
Abgaben noch nicht als "korrigiert" markiert.
Das aktuelle (YAML-basierte) Format für Bewertungsdatei enthält #
ein Feld, ob die jeweilige Abgabe als „korrigiert“ (Bewertung #
abgeschlossen) markiert werden soll.
<p>
@ -19,15 +13,19 @@ $newline never
<p>
Es ist geplant, dass die Bewertungsdatei in Zukunft ein eigenes #
Feld enthält, in dem Korrektoren angeben können, ob die Korrektur #
abgeschlossen ist oder nicht.
Bei Bewertungsdateien im veralteten Format (nur Text) werden #
Abgaben nur dann automatisch als „korrigiert“ markiert, wenn das #
entsprechende Auswahlfeld („_{MsgCorrUploadSubmissionDoneMode}“) #
auf „_{SubmissionDoneAlways}“ gestellt wird.
<p>
Im Gegensatz zu UniWorX enthalten die heruntergeladenen Abgaben #
immer den aktuellen Stand der Bewertung. Dies betrifft ggf. auch #
geänderte Dateien!
Die heruntergeladenen Abgaben enthalten immer den aktuellen Stand #
der Bewertung.
<br>
Dies betrifft ggf. auch geänderte Dateien!
<section>
<p>
@ -37,8 +35,8 @@ $newline never
<br>
Die Abgebenden werden entsprechend informiert, sobald die Abgabe #
als "korrigiert" markiert wurde.
Die Abgebenden werden entsprechend informiert, sobald die #
Abgabe als „korrigiert“ markiert wurde.
<p>

View File

@ -3,13 +3,9 @@ $newline never
<section>
<p>
Uploading a correction automatically marks it finished iff you #
were assigned that correction.
<p>
If an administrator that was not assigned the correction uploads #
it, it will not be marked finished.
The current (YAML-based) format for correction files contains a #
field determining whether the respective correction should be #
marked as finished.
<p>
@ -17,13 +13,15 @@ $newline never
<p>
It is expected that rating files will, in the future, contain a #
field to mark the correction as finished or not.
When using rating files in the legacy format (plaintext only) #
corrections will only be marked as finished if the appropriate #
selection (“_{MsgCorrUploadSubmissionDoneMode}” set to #
“_{SubmissionDoneAlways}”) has been made.
<p>
Contrary to UniWorX downloaded submissions always reflect the #
current state of the correction.
Downloaded submissions always reflect the current state of the #
correction.
<br>

View File

@ -39,7 +39,7 @@ $newline text
<dd .deflist__dd>
<p>
^{newU2WFeat} Uni2work unterstüzt die Verwaltung von mehreren Instituten, d.h.
Kursnamen wie "[MATH]" für Kurse des mathematischen Instituts werden ab sofort nicht mehr benötigt.
Kursnamen wie "[MATH]" für Kurse des mathematischen Instituts werden nicht mehr benötigt.
Stattdessen gibt es nun Instituts-Filter für Kurslisten.
<p>
Die Berechtigungen der Uni2work-Administratoren sind auf Kurse des jeweiligen Instituts eingeschränkt,
@ -52,7 +52,7 @@ $newline text
<dt .deflist__dt> Materialien veröffentlichen
<dd .deflist__dd>
Folien, Code-Bündel, usw. können nun bequem
Folien, Code-Bündel, usw. können bequem
per Uni2work an die Teilnehmer verteilt werden, ggf. auch geschützt.
<dt .deflist__dt> Kurs-Passwort
@ -75,7 +75,7 @@ $newline text
Die Dozenten Berechtigung wird nach Instituten unterschieden.
Assistenten haben nur Zugriff auf einen speziellen Kurs,
aber innerhalb dieses Kurses die gleichen Rechte wie Dozenten.
aber innerhalb dieses Kurses die gleichen Rechte wie die jeweiligen Dozenten.
<p>
In UniWorX gab es die Rolle "Assistent",
@ -106,7 +106,6 @@ $newline text
^{probFeatInline} Es kann sein, dass ein "gröberer" Studiengang
angezeigt wird, als tatsächlich studiert wird (z.B. Medieninformatik
statt Mensch-Computer-Interaktion).
Dieses Problem soll demnächst behoben werden.
<dt .deflist__dt> Aus Studentensicht
<dd .deflist__dd>
@ -123,7 +122,7 @@ $newline text
^{newFeat 2019 10 7} Es lassen sich direkt auf der Kursübersichtsseite Neuigkeiten in Bezug
auf die Veranstaltung publizieren ("Aktuelles").
<p>
In Zukunft sind ein RSS-Feed und (opt-in) E-Mail-Benachrichtigungen
In Zukunft sind ein RSS-Feed und E-Mail-Benachrichtigungen
hierfür geplant.
<dt .deflist__dt> Termine
@ -143,7 +142,7 @@ $newline text
<dt .deflist__dt> Korrektoren
<dd .deflist__dd>
^{newU2WFeat} Korrektoren und Korrekturweise werden ad hoc pro Übungsblatt vom Veranstalter festgelegt;
es gibt keine Eintragung von Korrektoren in der Veranstaltungskonfiguration mehr.<br />
es gibt keine Eintragung von Korrektoren in der Veranstaltungskonfiguration.<br />
Um reinen Tutoren vorab Zugriff auf Lösungen zu gewähren, sollten diese
als Korrektoren mit Korrekturanteil 0 eingetragen werden.
@ -152,6 +151,12 @@ $newline text
<dt .deflist__dt> Verteilung
<dd .deflist__dd>
Jeder Abgabe für ein Übungsblatt kann ein Korrektor zugewiesen werden.
Eine automatische, möglichst faire, Zuteilung kann sowohl
manuell als auch automatisch mit Ende des Abgabezeitraums
ausgelöst werden.
^{newU2WFeat} Korrektoren können pro Blatt auch als Abwesend oder Entschuldigt
markiert werden und bekommen dann keine Abgaben automatisch zugeteilt.
@ -195,7 +200,7 @@ $newline text
<dt .deflist__dt> Externe Abgaben
<dd .deflist__dd>
Externe Abgaben Form (z.B. Papierabgaben)
Externe Abgaben (z.B. Papierabgaben)
können mit Pseudonymen verwaltet werden:
<ul>
<li>
@ -228,6 +233,34 @@ $newline text
Verteilung von Übungsblättern
dem jeweiligen Korrektor zum Arbeitspensum angerechnet.
<dt .deflist__dt #correction-files> Korrekturdateien
<dd .deflist__dd>
<p>
Zugeteilte Korrektoren und Kursverwalter haben die Möglichkeit einzelne oder auch Sammlungen von Abgaben als ZIP-Archiv herunterzuladen.
<p>
Es wird hierbei jeder Abgabe eine Bewertungsdatei beigelegt.
<p>
^{newU2WFeat} Das Format der Bewertungsdatei ist primär
<a href="https://yaml.org">YAML (Englisch)
\ und somit maschinell einfach zu interpretieren und zu verändern.
<p>
Zusätzlich zum YAML-Teil besteht die Möglichkeit ans Ende der Datei einen Bewertungskommentar für die jeweiligen Studierenden anzuhängen.
Alternativ (für maschinelle Bearbeitung) kann ein Feld
<code>comment
eingefügt werden, dass den Kommentar als String enthält.
<p>
YAML ist kompatibel zu
<a href="https://www.json.org/json-de.html">JSON
.
Bewertungsdateien können also beim Upload durch äquivalente JSON-Dateien (mit den gleichen Feldnamen) ersetzt werden.
<p>
Genauer Name und Dateiendung der Bewertungsdateien ist unerheblich; Uni2work prüft nur ob eine valide Abgabennummer teil des Dateinamen ist.
<section>
<h2 #tutorials>_{MsgInfoLecturerTutorials}

View File

@ -109,7 +109,7 @@ $newline text
^{newFeat 2019 10 7} On the course overview page, one can directly publish news concerning
the course ("News").
<p>
An RSS feed and (opt-in) email notifications for course news are planned in the future.
An RSS feed and email notifications for course news are planned in the future.
<dt .deflist__dt> Dates
<dd .deflist__dd>
@ -134,6 +134,10 @@ $newline text
<dt .deflist__dt> Distribution
<dd .deflist__dd>
Each submission can be assigned to a corrector.
An automatic assignment (which aims to be as fair as possible) can be triggered either manually or automatically with the end of the submission period.
^{newU2WFeat} Correctors can be marked as Absent or Excused per exercise sheet. This way, they will not be
automatically assigned as correctors of any submissions.
@ -198,6 +202,34 @@ $newline text
Such submissions will be accounted for in the next distribution of
submissions according to the corrector's correction proportions.
<dt .deflist__dt #correction-files> Correction files
<dd .deflist__dd>
<p>
Assigned correctors and course administrators can download submissions or collections thereof as ZIP archives.
<p>
When doing so correction files are added to each submission.
<p>
^{newU2WFeat} Correction files are formatted primarily as
<a href="https://yaml.org">YAML
\ and are thus easy to parse and edit automatically.
<p>
In addition to the YAML part each correction file may contain contain an appended correction comment for the respective students.
Alternatively (for automatic editing) the comment may be added as a YAML field
<code>comment
which then contains the comment as a string.
<p>
YAML is compatible with
<a href="https://www.json.org/json-en.html">JSON
.
Correction files may thus be replaced with equivalent JSON files for upload (keeping the same field names).
<p>
The exact name or file extension of correction files do not matter; Uni2work only checks whether the filename contains a valid submission number.
<section>
<h2 #tutorials>_{MsgInfoLecturerTutorials}

View File

@ -1,9 +1,7 @@
$newline never
<p>
Stand: ^{formatGregorianW 2020 04 28}
Stand: ^{formatGregorianW 2020 06 17}
<ul>
<li>
Format von Bewertungsdateien ist noch provisorisch
<li>
Zahlen und Prüfungsergebnisse werden nicht internationalisiert #
(betrifft auch CSV-Import und Export)

View File

@ -1,9 +1,7 @@
$newline never
<p>
Last updated: ^{formatGregorianW 2020 04 28}
Last updated: ^{formatGregorianW 2020 06 17}
<ul>
<li>
Format of rating files is provisional
<li>
Numbers and exam results are not internationalised (also affects #
csv-import and export)

View File

@ -0,0 +1,5 @@
$newline never
<p>
Alle, in den hochgeladenen Dateien referenzierten, Abgaben werden #
als „korrigiert“ markiert.

View File

@ -0,0 +1,5 @@
$newline never
<p>
All submission referenced in the uploaded corrections are marked #
as finished.

View File

@ -0,0 +1,16 @@
$newline never
<p>
Die, in den hochgeladenen Dateien referenzierten, Abgaben werden #
entweder als „korrigiert“ markiert, oder zurückgesetzt, ja nach #
Einstellung in den jeweiligen Korrekturdateien.
<p>
Abgaben, für die die jeweilige Korrekturdatei keine Einstellung #
enthält, werden zurückgesetzt.
<br>
Abgaben mit Korrekturdateien im veralteten Format (nur Text) werden #
zurückgesetzt.

View File

@ -0,0 +1,16 @@
$newline never
<p>
Submissions referenced in the uploaded files are either marked as #
finished or their state reset, according to the setting in the #
respective correction file.
<p>
Submissions for which the respective correction file contains no #
setting are reset.
<br>
Submissions for which the respective correction file is in legacy #
format (plaintext only) are reset.

View File

@ -0,0 +1,9 @@
$newline never
<p>
Keine der, in den hochgeladenen Dateien referenzierten, Abgaben wird #
als „korrigiert“ markiert.
<br>
Bereits als „korrigiert“ markierte Abgaben werden zurückgesetzt.

View File

@ -0,0 +1,9 @@
$newline never
<p>
No submission referenced in the uploaded files is marked as #
finished.
<br>
Corrections already marked as finished have their state reset.