e-grades– building block replaces bubble sheets tracy (ting-hong) tan analyst/programmer...

32
E-grades– Building Block Replaces Bubble Sheets Tracy (Ting-Hong) Tan Analyst/Programmer California State University, East Bay (formerly CSU Hayward)

Upload: ginger-kelly

Post on 30-Dec-2015

213 views

Category:

Documents


0 download

TRANSCRIPT

E-grades– Building Block Replaces Bubble Sheets

Tracy (Ting-Hong) Tan

Analyst/Programmer

California State University, East Bay (formerly CSU Hayward)

Overview

• Show the old paper grade process• Show the new E-grades process• Why choose a Blackboard building block• How we implement it and the technical considerations we

have to make• Usage and feedback from instructors• Issues that stop us from developing import from Blackboard

Grade book to E-grades

Reason to implement online grading

• While students can register for classes, view grades, view classes/schedule/catalog online, or even take online courses, instructors still need to pick up a paper grade roster, use a pencil to fill in a bubble sheet, then turn it in to the department office. Moving this grading process online makes their life a lot easier and makes the grading process less painful.

• Paper grade process is time consuming and tedious, a lot of errors could happen.

• Students could view their grades a lot sooner, once we go 100% E-grades.

Paper Grade Process

Enrollment services print

out grade roster (bubble sheet)

Distribute grade roster to

academic departments

Department distribute grade

roster to instructors

Instructor bubble the grade roster

using #2 pencil

Scan bubble sheet to generate grade file

Instructor turn in the grade roster to department

before due date

Academic departments collect the grade roster and send them back to

Enrollment Services

Update Student Information System

with Grades

Pap

er

Gra

de

E-G

rade

Update Student Information System

with Grades

Enrollment services print

out grade roster (bubble sheet)

Distribute grade roster to

academic departments

Department distribute grade

roster to instructors

Instructor bubble the grade roster

using #2 pencil

Scan bubble sheet to generate grade file

Instructor turn in the grade roster to department

before due date

Academic departments collect the grade roster and send them back to

Enrollment Services

Instructor sign on to Blackboard

Start online grading within 2 weeks grading cycle

Generate grade file on due date

Why choose a Blackboard Building Block?

Blackboard contains the most current course roster and contains valid users group - considered to be the best platform on campus to implement this service. In addition, instructors are already familiar with how to logon to Blackboard and familiar with its user interface.

Our update schedule:Course enrollment – snapshot control, updated once a dayUsers – snapshot control, updated twice a day from campus

Identity Management system. Users get enabled/disabled based on the status in IMS.

Design concept

• Simple and easy to use• Make it foolproof, instructors can only pick the grades which are

acceptable for their course.• Instructors are not required to use Blackboard course

management - they can login to fill out grades only.• Familiar user interface in the Blackboard environment• Accessibility

Show course list

Enter Grades for Student

View Grades Page

Instructor of this course?

Yes

Error MessageNo

E-Grade Building Block on Portal Page

Show saved grades

Save to Oracle Database

Agreement Page

Agree to the term and condition?

Yes

No

Select Regular university or Continuing Education course to grade

Select Regular University or Continuing Education

Select “I Agree” to continue

Select the course to grade

Select the course for grading.

Using Tag Libraries to create the User Interface

<%@ taglib uri="/bbData" prefix="bbData"%><%@ taglib uri="/bbUI" prefix="bbUI"%>... ...<bbUI:step title="Select a Course" number="1"><bbUI:instructions>Welcome to the CSU Hayward Online Grade Submission program.<br><label for="CourseSelection">Please select a course:</label><br></bbUI:instructions><bbUI:stepContent><form action="<%=PlugInUtil.getUri("csuh", "grades",

"module/edit_grades.jsp")%>" method="post">… …</bbUI:stepContent></bbUI:step><bbUI:stepSubmit title="Go to the Grade Roster" instructions="Click \"Submit\"

to continue to the next step." number="2" cancelUrl="/"/>

Select grade for each student

Based on Grade rule/type, show different grade options

Click “Save” button to save grades; “Cancel” will bring them back to courses selection page

<bbUI:stepSubmit title="Save Grades" instructions="<%=instruction%>" number="2" cancelUrl="courses.jsp?termtype=reg" submitButton="save" />

Review the grade rosterNote: If a grade is not selected, the default grade of “WU” will be inserted.

Click “Modify” button to go back and modify the grades for this course; “Return” to continue grading other courses

To see grades for completed courses, first select a course from the View Grade Only section on the E-Grades module.

To see grades for completed courses, select a course from the View Grade Only section.

View Grade PageA “Printer Friendly” version is available so that a copy can be printed for filing.

Can be sort by Student’s Name or NetID

Printer Friendly version

View grade page can be sort, using Tag library – <bbUI:list><% GenericFieldComparator stuName = new

GenericFieldComparator(BaseComparator.ASCENDING,"getFamilyName",User.class);stuName.appendSecondaryComparator(new GenericFieldComparator(BaseComparator.ASCENDING,"getGivenName",User.class));GenericFieldComparator netID = new GenericFieldComparator(BaseComparator.ASCENDING,"getUserName",User.class);//pre sort the listCollections.sort(SortedList,stuName);

%><bbUI:list collection="<%=SortedList%>" objectId="s" className="User" resultsPerPage="-1"><bbUI:listElement label="Name" name="name" comparator="<%=stuName%>"><%=s.getFamilyName()%>, <%=s.getGivenName()%></bbUI:listElement><bbUI:listElement label="NetID" name="netID" comparator="<%=netID%>"><%=s.getUserName()%></bbUI:listElement><bbUI:listElement label="Grade" name="grade"><% //get the grade value of student

stustatus = (String) currGrades.get(s.getBatchUid()); if(stustatus != null)

out.print(stustatus);stustatus = null;

%></bbUI:listElement></bbUI:list>

Show all data in one page

Can be sorted by student name

Can be sorted by NetID

E-grades custom tables

CSUH_GRADES

PK1BATCH_UIDCOURSE_IDGRADEUPDATED

CSUH_GRADES_LOGS

PK1COURSE_IDUSER_IDLASTUPDATEDIP

CSUH_GRADES_CYCLES

PK1TERMSTART_DATEEND_DATE

CSUH_GRADES_CRNC_INFO

PK1COURSE_IDBATCH_UIDSPECIAL_GRD_TYPE

GRD_TYPE

PK1COURSE_IDGRADETYPEGRADERULE

CRS_MERGE

PK1BATCH_UIDBB_COURSE_IDSAIL_COURSE_ID

Where do we store the data?

Oracle database, create a new schema to store custom data we have

Using JDBC connections for E-grades related data

<%ConfigurationService bbconf = BbSM.getConfigurationService();String dbhost = bbconf.getBbProperty("bbconfig.database.bbadmin.machine.machinename");Connection dbConn1 = null;Connection dbConn2 = null;boolean jdbcAvailable = false;String currqtr = null;

try{ Class.forName("oracle.jdbc.driver.OracleDriver"); dbConn1 = DriverManager.getConnection("jdbc:oracle:thin:@" + dbhost + ":1521:BB60", "bb_bb60", “password"); dbConn2 = DriverManager.getConnection("jdbc:oracle:thin:@" + dbhost + ":1521:BB60", "csuh_custom", “password"); jdbcAvailable = true;}catch (Exception e){ System.out.println(e.toString()); jdbcAvailable = false;}

%>

Technical considerations

1. Only show the course(s) taught by currently logged in user

2. Make sure only the instructor can grade the course

3. Only enrollments that come from SIS+ will show up in the grade roster

4. Based on grade rule/type information from SIS+, help limit the grade options on the grade roster - make it foolproof.

5. De-merge the courses before we send the grade file back to SIS+

<%User user = bbContext.getUser();%>… …<SELECT NAME="CourseID" id="CourseSelection"><OPTION VALUE="noneselected">Select a

Course</OPTION><%

//Get list of courses teach by current login userCourseDbLoader cLoader = CourseDbLoader.Default.getInstance();BbList courseList = cLoader.loadByUserIdAndCourseMembershipRole(user.getId(), CourseMembership.Role.INSTRUCTOR);

if (courseList.size() > 0) {String buffer = "";Object[] courses = courseList.toArray();for (int i = 0; i < courses.length; i++) { Course course = (Course)courses[i]; //Not showing system DSK courses, manual merged course, and ‘NG’ courses if (course.getDataSourceId().toExternalString().indexOf("_2_",0)== -1 &&

course.getCourseId().startsWith(qtr) && !course.getCourseId().endsWith("MRG") && !NGcourses.containsKey(course.getCourseId()) ) {

String CourseTitle = course.getTitle(); %><OPTION

VALUE="<%=course.getCourseId()%>"><%=course.getTitle()%></OPTION><% } //end if

} //end for loop } //end if%></SELECT>

Get list of courses taught by current user

Make sure only instructors can grade their courses<%

User user = bbContext.getUser();UserDbLoader userDbLoader = UserDbLoader.Default.getInstance();CourseMembershipDbLoader cmLoader = CourseMembershipDbLoader.Default.getInstance();CourseDbLoader cLoader = CourseDbLoader.Default.getInstance();Course course = cLoader.loadByCourseId(courseid);BbList courseMembershipList = cmLoader.loadByCourseId(course.getId());

//make sure the user currently login is one of the instructors of this courseCourseMembershipRoleFilter getInstructor =

new CourseMembershipRoleFilter(CourseMembership.Role.INSTRUCTOR);BbList instructorList = courseMembershipList.getFilteredSubList(getInstructor);

for (Iterator i=instructorList.iterator(); i.hasNext(); ) {CourseMembership cm_instructor = (CourseMembership) i.next();Id cm_inctructor_id = (Id)cm_instructor.getUserId();try { User t = userDbLoader.loadById(cm_inctructor_id); if(user.getUserName().equals(t.getUserName())) { isInstructor = true; }} catch(Exception e) { isInstructor = false;}

} %>

Only enrollments which come from SIS+ will show up in the grade roster

<% //get student enrollment listCourseMembershipRoleFilter getStudent = new CourseMembershipRoleFilter(CourseMembership.Role.STUDENT);BbList studentList = courseMembershipList.getFilteredSubList(getStudent);Object[] stuArray = studentList.toArray();CourseMembership cm = null;Id StuId = null;String DSKey = null;User student = null;BbList SortedList = new BbList();for (int i = 0; i < stuArray.length; i++) {

boolean disabled = false;cm = (CourseMembership)stuArray[i];//not show any user who's on system DSK (system DSK = 2)DSKey = cm.getDataSourceId().toExternalString();if(cm.getIsAvailable() && DSKey.indexOf("_2_",0)== -1) {

StuId = cm.getUserId(); try {

student = userDbLoader.loadById(StuId); }

catch (Exception e) { disabled = true; }

if (!disabled) { SortedList.add(student);

}}

}%>

Based on grade rule/type information from SIS+, limit the grade options on the grade roster - make it foolproof.

<select name="stu<%=s.getUserName()%>" <% if((rownum%2) == 0) out.print("class='bLight'"); %> id="StudentName<%=s.getUserName()%>" > <option value=" "<%if (stustatus == null) out.print(" SELECTED");%>>Please select a grade</option>

<% if( gradetype.equals("CN") || graderule.equals("CN") ) {%> <option value="CR"<%if (stustatus != null && stustatus.equals("CR")) out.print(" SELECTED");%>>CR</option> <option value="NC"<%if (stustatus != null && stustatus.equals("NC")) out.print(" SELECTED");%>>NC</option> <option value="I"<%if (stustatus != null && stustatus.equals("I")) out.print(" SELECTED");%>>I</option> <option value="RP"<%if (stustatus != null && stustatus.equals("RP")) out.print(" SELECTED");%>>RP</option>

<% } else if((graderule.equals("UR") && gradetype.equals("NB")) || (graderule.equals("U") && gradetype.equals("SU"))) {%> <option value="A"<%if (stustatus != null && stustatus.equals("A")) out.print(" SELECTED");%>>A</option> <option value="A-"<%if (stustatus != null && stustatus.equals("A-")) out.print(" SELECTED");%>>A-</option> … … <option value="NC"<%if (stustatus != null && stustatus.equals("NC")) out.print(" SELECTED");%>>NC</option>

<% } else {%> <option value="A"<%if (stustatus != null && stustatus.equals("A")) out.print(" SELECTED");%>>A</option> <option value="A-"<%if (stustatus != null && stustatus.equals("A-")) out.print(" SELECTED");%>>A-</option> <option value="B+"<%if (stustatus != null && stustatus.equals("B+")) out.print(" SELECTED");%>>B+</option> <option value="B"<%if (stustatus != null && stustatus.equals("B")) out.print(" SELECTED");%>>B</option> <option value="B-"<%if (stustatus != null && stustatus.equals("B-")) out.print(" SELECTED");%>>B-</option> <option value="C+"<%if (stustatus != null && stustatus.equals("C+")) out.print(" SELECTED");%>>C+</option> … … <option value="WU"<%if (stustatus != null && stustatus.equals("WU")) out.print(" SELECTED");%>>WU</option> <option value="I"<%if (stustatus != null && stustatus.equals("I")) out.print(" SELECTED");%>>I</option> <option value="RP"<%if (stustatus != null && stustatus.equals("RP")) out.print(" SELECTED");%>>RP</option>

<% } /* End Grade rule, Grade Type checking */%></select>

De-merge the merged courses

What is a merged course? Example: cross-listed courses (Math and Computer Science) have two records in our Student Information System (SIS+), but only one instance in Blackboard. In SIS+, students can be enrolled in either course, so those enrollments need to be separated before submitting final grades back to SIS+.

De-merge information (which enrollments belong to which SIS+ courses) is sent by our SIS+ programmers, and at the end of the grading cycle, we use SQL to separate the grades for transfer back to SIS+.

SELECT '45B'||rpad(csuh_grades.BATCH_UID,9,' ')||'PST'||rpad(

CASE WHEN instr(crs_merge.sail_course_id,'_') > 0 THEN rpad(substr(crs_merge.sail_course_id,1,instr(crs_merge.sail_course_id,'_')-1),9,' ') || substr(crs_merge.sail_course_id,instr(crs_merge.sail_course_id,'_')+1) ELSE

crs_merge.sail_course_id END,23,' ') || lpad(

CASE WHEN (GRADE = ' ' AND graderule = 'UR' AND gradetype = 'NB' ) THEN 'NC' WHEN GRADE = ' ' AND not ( graderule = 'UR' AND gradetype = 'NB') THEN 'WU' ELSE GRADE END ,2,' ') ext, sail_course_id course_id FROM csuh_custom.csuh_grades, csuh_custom.crs_merge, csuh_custom.grd_type WHERE csuh_grades.course_id = crs_merge.bb_course_id AND csuh_grades.batch_uid = crs_merge.batch_uid AND (updated = 'N' or updated is null) AND trim(grd_type.course_id) = csuh_grades.course_id AND substr(csuh_grades.course_id, 1, 5) = '20052'

SQL to generate file to update SIS+

Usage of E-Grades

Positive Feedbacks from Instructors:

Using E-Grades was so fast and easy. I was completely finished in less than one hour. No more filling in the bubbles. My fingers used to get so tired! Thanks for streamlining the grading process!

Patricia LohmanhawkAssistant Professor, Department of Communicative Sciences & Disorders

Just one last "THANK YOU" to everyone who worked on the e-grading forms. I've just finished entering my grades in 1/5 the time it would have taken me using paper forms. And, I'm in LA while doing - on a vacation that I really, really needed. You folks are my heroes. May everything go smoothly in grade processing, and may all of you take a well deserved rest sometime soon! Best regards, Carol Moore

Carol MooreLecturer, Department of Management and Finance

This is the first time I used an on-line grade reporting system. It was great! Everyone should use it.

Peter WilsonDean, Contra Costa Campus

Great System! A vast improvement over the old paper process.David St. Clair

Professor, Department of Economics

Feedbacks from Instructors:The pull-down style of entering each grade is not a good choice. The original

demo had a much better choice of checking the appropriate grade box. Giving the user a choice should be easily programmable for you or the vendor. Please consider doing this and saving instructors lots of time and frustration.

Donald WolitzerProfessor, Mathematics & Computer Science

Please give us a second user interface option for entering grades. At my age it's far easier for me to type in the grades rather than selecting from a pull-down list for each student. And I find my occasional random mouse clicks quite disruptive as I have to check (and sometimes change) several previously-entered grades. Thanks.

Tony LimaProfessor, Department of Economics

I LOVE being able to submit my grades electronically. Now, why not make it so that we can simply export our Blackboard gradebook grades rather than having to reenter them?

Reed, Catherine Professor , Department of Teacher Education

Issues that stop us from developing import from Blackboard Grade book to E-grades

Setting up the column correctly in the Bb Gradebook requires the user to correctly fill out several fields: Name, Category, Description, Date, Points Possible, Display, Availability, and Include Item in GB Calculations. These fields are critical to the way Blackboard’s gradebook tool calculates and displays grades. If any one of the variables are set up improperly, the import could produce incorrect results.

Blackboard may rewrite the gradebook in the future – if this happens, E-Grades import would have to be rewritten

“Final” grade is a calculated field. Faculty members have very little control over how this field is calculated, so we would have to create a “best guess” algorithm to calculate the final grade.

Grade fields can be letters, numbers, and can be defined by faculty-created ranges of numbers. There are too many possibilities provided, therefore any calculation would only be a “best guess”, which is not acceptable for grading.

Questions?

Contact Information: Tracy Tan

[email protected]