Planned Changes Soon Add javascript answerformat checkers to: calcinveral, calcntuple, calccomplex, calcmatrix extend lockout to allow options: exclude from emails, etc. textitems, etc. in calendar, click to popup item. Update printlayout to use assessment includes - fix \frac issue forum/thread subscriptions for students (currently forum, need indiv thread subscript) past due on calendar reply to several posts via by-name page? (can be done via AHAH if no text editor) link to forum from gradebook (which post?) turn off edit-in-place in quickview for accessing assessments/forums? Add date shift to copy course items. Partial credit (altanswers, altansweights - use with "or" arraying) postby/replyby on mass change dates page? Survey/polling upload multiple ofline grades at once? Expand all (blocks) (might be tricky with javascript; might be easiest to AJAX call block contents with force expand all in php) comments/feedback on assessment items comments for all assessments in one place automated emailing of grades? export assessment data as CSV (do survey module instead) top navigation bar at top of all pages (incorporate into header?) *allow reattempts when no score per question; best vs last attempt option *group numbers - make fixable, or at least have new groups show at end of list? Will require adding a table for unique group ids to use as agroupid. Will simplify breaking someone from group, but have to rewrite all that upload multiple grades at once (need to write new page, have format for CSV, etc) bug fix: New posts link on home page when not in group (group forums) (bypassed, not yet fixed) points earned (div by part) in showtest attempts bar - how get last attempt scores? Gradebook - replace low score with high score? all string to int comparisons - use intval image upload in editor (have editorcleanup include, takes old post, new post, compares for del images) rework all deletes to use delitembyid answertest - test on condition (how implement?) log student logins answerformats for Calculated Interval/N-tuple regex on diag username (javascript) Easy way to change private/not private Option to list first last rather than last, first Misc Zip files a/o files and specs on course item export all email links, mailto->masssend? Student email list (need to add student privacy settings first) photos of students student file - attachments and assessments Documentation Assessment Options *Force completion of question before moving on: oneattime and seq mode add reattempt whole assessment option (keep best of all full attempts) Must get all questions right to submit Don’t list potential questions if already added (option?) (find room for the option) Listing questions for assessment – have option to list the libraries of the questions that have already been added. (need to find room for it) Have practice-first option on assessments. (option for toggling to review mode) List questions once when in multiple libraries searched (have to work out list lib link) *points per problem - decimal/fraction, or point total for whole assessment (maybe scale assessment to __ pts, but would be weird from student perspective (pt values don't mean what they say) *extra credit inside assessment (put on question itself - if set, calculate points possible without it, but give it points in i_a_s. That part's easy; getting the display right in showtest will be tricky.) Add default tolerance option to assessment settings Gradebook add link to modify code / report error in gradebook assessment edit pagated gradebook? GPA, edittable and from lookup (need separate way to store GPA, fill stored from lookup when switched) customizable grade reports (select items to report) Groups Randomly assign students to groups of N Forums finish delete forum post option (error on remove first in thread?) (need to track if child exists, etc) Message System signature for emails/msgs (need field and page (chg user info?)) *Library/Question System attach notes/comments to libraries, questions Instructor specific library/question listing Rework question import/export to handle questions with images Assign libraries in preview New behavior to assign to libraries (popup?) Select from Assessment in question management (for assignment to libraries) Copy/Template libraries with structure assessment questions into new location (just messy to implement) Question Language adapt "equation" to work with inequalities (check if left-right is pos/neg, check that lt/lte matches) fix interpret: no mathphp inside quotes check equation answerformat - fail on extraneous vars? (???) if number answer is rounded, check if rounded correctly add "false" to NaN check; surpress output of divide by zero on testpoints new question testing -- add debugs Student User Interface allow students to control totals at top/bottom Admin fix old user delete to remove more than just userid (NEED to do - simple but messy) Admin feature: identify duplicate questions (equivalent code blocks) restores students/course Possibilities Javascript answer entry editor User customization of colors, fonts JavaScript question writing guider way in future: AJAX searches / libtree / page reordering to reduce amount reloaded JavaScript improvement: lib import/export checking system Replace SVG use with Canvas? Student generated review New questions review process Support IMS Common Course Cartridge, QTI, IMS Enterprise XML (student info system integration) Definable rights, grant rights on single question library Parent/tutor rights for single student? Inline question (towards interactive ebooks). How to handle gradebook for these things? Expand guided / conditional items. How to handle gradebook? Rework backtrack method to track itself Move unenroll/delete course to backup table for __ days Student portal/home page Course Calendar Image upload in editor (hard to track files so deleted when removed from item) Uniform user experience (major re-visioning of user interface needed) Tooltips for help (how to do? David M going to help) file attachements in posts (probably not needed) Track views / post dates / etc. Wait?? time graph of student grades new item flag (hmmm) Ignore case on equation variables (need $variable for it - has to be passed to clientside) Test without saving: Test, Save, Save As.. (need temp table.. ) collapse gradebook by blocks (no easy way to do this) Gradebook stats for students (no easy way to do this given current framework) Default library for course? (add to courses table, pull if library not specified. Tricker to add to course settings page) Multipart question; submit one part at a time (needs some majorish changes, will only make sense for one-by-one or skip-around) Use serialize for lastanswers and bestlastanswers { q1 -> { attempt 1 -> { (use array even if one part q?) part 1 } attempt 2 -> { part 1 } } } important things in new assessment storage design: 1) be able to keep whole assessment attempt data over multiple versions 2) allow the question ids to change (for question grouping) 3) be able to track full assessment attempt as well as question reattempts Assessment options: Reattempts (retrying same version) is done per assessment/question with penalty of __ for missed attempts [for "per assessment": on all questions/missed questions] max ___ attempts New versions are done per assessment/question with penalty of __ per regen [for "per assessment": on all questions / missed questions] max ___ regens keep best/last Redesign assessment result storage bestversion assessment version1 { q1 { version1 { question id seed attempts { attempt1 { submitted answer / lastanswer (for redisplay) (array if multipart) stuanswer referenable value of submitted answer (if applicable) rawscore [0-1] timestamp? } [override] { rawscore [0-1] timestamp } } } //maybe add for convenience of access //curquestions { // question id //} bestscores { //array of scores from best scoring version //based on assessment settings } } Files to Update /assessment printtest showtest /course addassessment addquestions courseshowitems exception gb-aidexport gb-itemanalysis gb-viewasid gb-table2 gradeallq isolateassessbygroup isolateassessgrade managestugrps massexception masssend modquestion /diag index /includes calendardisp filehandler stugroups Assessment Object priv init(aid) { load assessment data priv getQuestionInfo() { get question specific info (points, etc) pub chooseQuestions() { pub allowRegenAssessment() pub allowRegenQ(qn) pub showHints() pub showScoresDuring() pub showQScoresAtEnd() pub showFinalScore() pub getEndMessage(score) pub getPassword() Assessment Display Object init (assessment object, score object) pub basicShowQ(qn) pub showQInfoBar(qn) pub showSeqInfoBar(qn) pub printScore(qn) pub showStartOfTestMessage() pub getStatus(userid) //returns 'normal', 'inexception', 'review', 'closed' Score Object priv init(assessment object,userid) { load assessment attempt data (or create if blank) } priv createAssessmentData() { $aData = array(); $aData['versions'] = array(); $aData['versions'][] = createAssessmentVersion(); $aData['bestscores'] = array_fill(0,count($aData['versions'][0]['versions'][0]),0); $aData['bestversion'] = 0; return $aData; } priv createAssessmentVersion() { $aVersion = array(); $questions = $assessObject->chooseQuestions(); foreach ($questions as $question) { $questionarr = array(); $questionarr['versions'] = array(); $questionarr['versions'][] = createQuestionVersion($question); $questionarr['curqid'] = $questionarr['versions'][0]['id']; $questionarr['bestversion'] = 0; $aVersion[] = $questionarr; } return $aVersion; } priv createQuestionVersion($qid) { $qVersion = array(); $qVersion['id'] = $qid; $qVersion['seed'] = chooseSeed(); $qVersion['attempts'] = array(); return $qVersion; } priv chooseSeed() { return rand(1,9999); } //all these are the score based on assessment settings //need to update these to include attemptn pub getPointsQ(question number) pub getPointsAllQ(qn) pub getPointsTotal() pub getPointsPossibleTotal() pub getPointsPossibleQ(qn) pub getRemainingPossibleQ(qn) pub getRemainingPossibleAllQ(qn) pub isUnans(qn) { //if never attempted pub isTodo(qn) { //if reattempted or never attempted pub canImprove(qn) //does canImproveBest mean anything anymore pub canImproveAny() pub canReattemptQ(qn) { pub deleteAssessmentRecord() pub deleteAssessmentAttempt(attemptn) //remove completely pub deleteAssessmentScore(attemptn) //keep questions pub clearQAttempt(attemptn,qn) pub regenQ(qn) //assumes latest attempt pub regenQCanImprove() pub regenAssessment() pub reattemptQ(qn) //assumes latest attempt pub reattemptQCanImprove() pub reattemptAssessment() pub recordScoreQ(attemptn,qn) pub overrideScoreQ(attemptn,qn) priv updateBestScores() priv recordData() { So to get lastanswer, $data[last entry for last version][$qn][last entry for last version]['attempts'][last entry]['lastanswer'] to get score, have to know assessment settings, and go through and calculate best based on raw scores and assessment settings. Continue to use bestscores field; recalc after any assessment settings changes how to handle review? Keep whole other set of attempt data? Run as a separate version within the same structure?