[Ils-source] r1391 - in trunk: src/com/resolutions/ils/data webapp/WEB-INF/lib webapp/api/course/get webapp/api/courseattempt/get
scribe at crosswire.org
scribe at crosswire.org
Tue Feb 16 16:07:51 MST 2016
Author: scribe
Date: 2016-02-16 16:07:51 -0700 (Tue, 16 Feb 2016)
New Revision: 1391
Modified:
trunk/src/com/resolutions/ils/data/Course.java
trunk/src/com/resolutions/ils/data/CourseAttempt.java
trunk/webapp/WEB-INF/lib/crosswire.jar
trunk/webapp/api/course/get/index.jsp
trunk/webapp/api/courseattempt/get/index.jsp
Log:
Updated courseattempt/get and course/get API calls to latest template
Updated Course and CourseAttempt XML output to use camelCase and defer headers to foreign key objects
Updated to latest crosswire.jar which includes a new DETAIL level of BRIEF
Updated CourseAttempt notification of completed courses to post fields parallel with new XML entity names.
Modified: trunk/src/com/resolutions/ils/data/Course.java
===================================================================
--- trunk/src/com/resolutions/ils/data/Course.java 2016-02-03 22:59:59 UTC (rev 1390)
+++ trunk/src/com/resolutions/ils/data/Course.java 2016-02-16 23:07:51 UTC (rev 1391)
@@ -322,6 +322,10 @@
return getStringValue("COURSISIPRESTRICTED");
}
+ public boolean isCourseIPRestricted() {
+ return ("T".equals(getValue("COURSISIPRESTRICTED")));
+ }
+
public boolean isCourseCurriculum() {
return ("T".equals(getValue("COURSISCURRICULUM")));
}
@@ -419,6 +423,10 @@
setValue("COURSISIPRESTRICTED", val);
}
+ public void setCourseIPRestricted(boolean val) {
+ setValue("COURSISIPRESTRICTED", (val) ? "T" : "F");
+ }
+
public String getCourseSeatTimeText() {
return getNiceTimeText(getCourseSeatMinutes());
}
@@ -530,25 +538,36 @@
}
return super.equals(o);
}
- public String toFormattedXML() {
-
+
+ public String toXML() {
+ return toXML(DETAIL_COMPLETE);
+ }
+
+ public String toXML(int detail) {
StringBuffer xml = new StringBuffer();
- xml.append("<Course");
- xml.append(" id=\""+ getCourseID()+"\"");
- xml.append(" courseNum=\""+getCourseNum()+"\"");
- xml.append(">\n");
- xml.append(" <CourseName>"+HTTPUtils.canonize(getCourseName())+"</CourseName>\n");
- xml.append(" <CourseDescription>"+HTTPUtils.canonize(getCourseDesc())+"</CourseDescription>\n");
- xml.append(" <CourseType typeID=\""+getCourseTypeID()+"\">"+HTTPUtils.canonize(getCourseType())+"</CourseType>\n");
- xml.append(" <CourseIPRestricted>"+HTTPUtils.canonize(getCourseIPRestricted())+"</CourseIPRestricted>\n");
- xml.append(" <CourseSeatTime minutes=\""+getCourseSeatMinutes()+"\">"+HTTPUtils.canonize(getCourseSeatTimeText())+"</CourseSeatTime>\n");
- xml.append(" <CourseURL>"+HTTPUtils.canonize(getCourseURL())+"</CourseURL>\n");
- xml.append(" <CourseCost>"+getCourseCost()+"</CourseCost>\n");
- xml.append(" <CoursePass>"+getCoursePass()+"</CoursePass>\n");
- xml.append(" <CoursePassExpireDays>"+getCoursePassExpireDays()+"</CoursePassExpireDays>\n");
- xml.append(" <CoursePostDate>"+getCoursePostDate()+"</CoursePostDate>\n");
- xml.append(" <CourseReassignBeforeDays>"+getCourseReassignBeforeDays()+"</CourseReassignBeforeDays>\n");
- xml.append("</Course>\n");
+ xml.append("<course courseID=\"").append(getCourseID()+"\"");
+ xml.append(" courseTypeID=\"").append(getCourseTypeID()+"\"");
+ xml.append(" courseNumber=\"").append(HTTPUtils.canonize(getCourseNum())+"\"");
+ xml.append(" userData=\""+getStringValue("USERDATA")+"\"");
+ if (detail == DETAIL_HEADERONLY) {
+ xml.append("/>");
+ }
+ else {
+ xml.append(">");
+ xml.append("<courseName>"+HTTPUtils.canonize(getCourseName())+"</courseName>");
+ if (detail > DETAIL_BRIEF) {
+ xml.append("<description>"+HTTPUtils.canonize(getCourseDesc())+"</description>");
+ xml.append("<isIPRestricted>"+isCourseIPRestricted()+"</isIPRestricted>");
+ xml.append("<seatTime minutes=\""+getCourseSeatMinutes()+"\">"+HTTPUtils.canonize(getCourseSeatTimeText())+"</seatTime>");
+ xml.append("<courseURL>"+HTTPUtils.canonize(getCourseURL())+"</courseURL>");
+ xml.append("<cost>"+getCourseCost()+"</cost>");
+ xml.append("<passScore>"+getCoursePass()+"</passScore>");
+ xml.append("<passExpireDays>"+getCoursePassExpireDays()+"</passExpireDays>");
+ xml.append("<postDate>"+getCoursePostDate()+"</postDate>");
+ xml.append("<reassignBeforeDays>"+getCourseReassignBeforeDays()+"</reassignBeforeDays>");
+ }
+ xml.append("</course>");
+ }
return xml.toString();
}
Modified: trunk/src/com/resolutions/ils/data/CourseAttempt.java
===================================================================
--- trunk/src/com/resolutions/ils/data/CourseAttempt.java 2016-02-03 22:59:59 UTC (rev 1390)
+++ trunk/src/com/resolutions/ils/data/CourseAttempt.java 2016-02-16 23:07:51 UTC (rev 1391)
@@ -335,7 +335,7 @@
}
- public void passAllAssociatedCurriculum(ILSSession session) {
+ public void passAllAssociatedCurriculum(ILSSession session, HttpServletRequest request) {
Collection<Course> curs = Course.getUserCurricula(session, getCourseAttemptUserProfileID());
if (curs != null) {
for (Course cur : curs) {
@@ -408,7 +408,7 @@
String certgen = cur.getCourseCertificateGenerator();
if (certgen != null && certgen.trim().length() > 0) {
try {
- ca.saveCertificate(ca.generateCertificate());
+ ca.saveCertificate(ca.generateCertificate(session, request));
}
catch (Exception e) {
logger.error(e, e);
@@ -714,24 +714,22 @@
StringBuffer params = new StringBuffer();
UserProfile user = UserProfile.getUserProfile(session, getCourseAttemptUserProfileID());
Course course = Course.getCourse(session, getCourseAttemptCourseID());
- params.append("USERDATA=").append(URLEncoder.encode(user.getStringValue("USERDATA"), "UTF-8"));
- params.append("&COMPANYID=").append(getCompanyID());
- params.append("&USERPRID=").append(user.getUserProfileID());
- params.append("&USERPRNUM=").append(URLEncoder.encode(user.getUserProfileNum(), "UTF-8"));
- params.append("&COURSID=").append(course.getCourseID());
- params.append("&COURSNUM=").append(URLEncoder.encode(course.getCourseNum(), "UTF-8"));
- params.append("&COURSNAME=").append(URLEncoder.encode(course.getCourseName(), "UTF-8"));
- params.append("&CASTARTDATE=").append(URLEncoder.encode(getCourseAttemptStartDate().toString(), "UTF-8"));
- params.append("&CACOMPLETEDATE=").append(URLEncoder.encode(getCourseAttemptCompleteDate().toString(), "UTF-8"));
- params.append("&CASCORE=").append(getCourseAttemptScore());
- params.append("&CASTATUSID=").append(getCourseAttemptStatusID());
- params.append("&CASTATUSDESC=").append(passedFailed);
- params.append("&CASTAGE=").append(URLEncoder.encode(getCourseAttemptStage(), "UTF-8"));
- params.append("&CAISMGRAPPRVL=").append(isCourseAttemptManagerApproved());
- params.append("&COURSATTID=").append(getCourseAttemptID());
- // deprecated. for backward compat.
- params.append("&COURSEATTEMPTID=").append(getCourseAttemptID());
- params.append("&COURSENAME=").append(URLEncoder.encode(course.getCourseName(), "UTF-8"));
+ params.append("companyID=").append(getCompanyID());
+ params.append("&courseAttemptID=").append(getCourseAttemptID());
+ params.append("&userProfileUserData=").append(URLEncoder.encode(user.getStringValue("USERDATA"), "UTF-8"));
+ params.append("&userProfileID=").append(user.getUserProfileID());
+ params.append("&userProfileLoginID=").append(URLEncoder.encode(user.getUserProfileNum(), "UTF-8"));
+ params.append("&courseID=").append(course.getCourseID());
+ params.append("&courseNumber=").append(URLEncoder.encode(course.getCourseNum(), "UTF-8"));
+ params.append("&courseUserData=").append(URLEncoder.encode(course.getStringValue("USERDATA"), "UTF-8"));
+ params.append("&courseName=").append(URLEncoder.encode(course.getCourseName(), "UTF-8"));
+ params.append("&startDate=").append(URLEncoder.encode(getCourseAttemptStartDate().toString(), "UTF-8"));
+ params.append("&completeDate=").append(URLEncoder.encode(getCourseAttemptCompleteDate().toString(), "UTF-8"));
+ params.append("&score=").append(getCourseAttemptScore());
+ params.append("&statusID=").append(getCourseAttemptStatusID());
+ params.append("&statusDescription=").append(passedFailed);
+ params.append("&aiccStage=").append(URLEncoder.encode(getCourseAttemptStage(), "UTF-8"));
+ params.append("&isManagerApproved=").append(isCourseAttemptManagerApproved());
logger.debug("POSTING to callback URL: " + callbackURL);
logger.debug("POSTING data: " + params);
result = HTTPUtils.postURL(callbackURL, params.toString());
@@ -820,7 +818,11 @@
}
- public String toFormattedXML() {
+ public String toXML() {
+ return toXML(DETAIL_COMPLETE);
+ }
+
+ public String toXML(int detail) {
boolean error = false;
ILSSession session = ILSSession.getAnonymous(getCompanyID());
@@ -838,25 +840,26 @@
StringBuffer xml = new StringBuffer();
UserProfile user = UserProfile.getUserProfile(session, getCourseAttemptUserProfileID());
Course course = Course.getCourse(session, getCourseAttemptCourseID());
- xml.append("<CourseAttempt");
- xml.append(" id=\""+getCourseAttemptID()+"\"");
- xml.append(" companyID=\""+getCompanyID()+"\"");
- xml.append(">\n");
- xml.append(" <UserData>"+HTTPUtils.canonize(user.getStringValue("USERDATA"))+"</UserData>\n");
- xml.append(" <UserProfileID>"+user.getUserProfileID()+"</UserProfileID>\n");
- xml.append(" <UserProfileLogin>"+HTTPUtils.canonize(user.getUserProfileNum())+"</UserProfileLogin>\n");
- xml.append(" <CourseID>").append(course.getCourseID()+"</CourseID>\n");
- xml.append(" <CourseNumber>").append(HTTPUtils.canonize(course.getCourseNum())+"</CourseNumber>\n");
- xml.append(" <CourseName>").append(HTTPUtils.canonize(course.getCourseName())+"</CourseName>\n");
- xml.append(" <CourseAttemptStartDate>").append(HTTPUtils.canonize(df.format(getCourseAttemptStartDate()))+"</CourseAttemptStartDate>\n");
- xml.append(" <CourseAttemptCompleteDate>").append(HTTPUtils.canonize(df.format(getCourseAttemptCompleteDate()))+"</CourseAttemptCompleteDate>\n");
- xml.append(" <CourseAttemptScore>").append(getCourseAttemptScore()+"</CourseAttemptScore>\n");
- xml.append(" <CourseAttemptStatus>").append(getCourseAttemptStatusID()+"</CourseAttemptStatus>\n");
- xml.append(" <CourseAttemptStatusDescription>").append(passedFailed+"</CourseAttemptStatusDescription>\n");
- xml.append(" <CourseAttemptAICCStage>").append(HTTPUtils.canonize(getCourseAttemptStage())+"</CourseAttemptAICCStage>\n");
- xml.append(" <CourseAttemptIsManagerApproved>").append(isCourseAttemptManagerApproved()+"</CourseAttemptIsManagerApproved>\n");
- xml.append("</CourseAttempt>\n");
+ xml.append("<courseAttempt");
+ xml.append(" courseAttemptID=\""+getCourseAttemptID()+"\"");
+ if (detail == DETAIL_HEADERONLY) {
+ xml.append("/>");
+ }
+ else {
+ xml.append(">");
+ xml.append(user.toXML(DETAIL_HEADERONLY));
+ xml.append(course.toXML(DETAIL_BRIEF));
+
+ xml.append("<startDate>").append(HTTPUtils.canonize(df.format(getCourseAttemptStartDate()))+"</startDate>");
+ xml.append("<completeDate>").append(HTTPUtils.canonize(df.format(getCourseAttemptCompleteDate()))+"</completeDate>");
+ xml.append("<score>").append(getCourseAttemptScore()+"</score>");
+ xml.append("<status statusID=\"").append(getCourseAttemptStatusID()+"\">"+passedFailed+"</status>");
+ xml.append("<aiccStage>").append(HTTPUtils.canonize(getCourseAttemptStage())+"</aiccStage>");
+ xml.append("<isManagerApproved>").append(isCourseAttemptManagerApproved()+"</isManagerApproved>");
+ xml.append("</courseAttempt>");
+ }
+
return xml.toString();
}
Modified: trunk/webapp/WEB-INF/lib/crosswire.jar
===================================================================
(Binary files differ)
Modified: trunk/webapp/api/course/get/index.jsp
===================================================================
--- trunk/webapp/api/course/get/index.jsp 2016-02-03 22:59:59 UTC (rev 1390)
+++ trunk/webapp/api/course/get/index.jsp 2016-02-16 23:07:51 UTC (rev 1391)
@@ -20,36 +20,37 @@
<%
+ // standard service header ---------------------------------------
response.setContentType("text/xml");
- String errorMsg = "";
- //-- Company logic from login.jsp -------
- // TODO: consolidate this somewhere
- String requestURL = request.getRequestURL().toString() + "?" + request.getQueryString();
- String co = com.resolutions.ils.Utils.getCompanyFromConfig(session, requestURL);
- if (co == null) co = com.resolutions.ils.Utils.getSysConfig(session).getProperty("Company", null);
- if (co == null) co = request.getParameter("co");
- if (co != null) session.setAttribute("co", co);
- co = (String) session.getAttribute("co");
- Company company = Company.getCompany((co != null) ? Integer.parseInt(co):1);
-
+ int errCode = 0;
+ Company company = Company.getCompany(request);
+
boolean apiEnabled = "on".equals(Utils.getSysConfig(session.getServletContext(), company.getCompanyID()).getProperty("APIEnable", "off"));
+ ++errCode;
if (!apiEnabled) {
- out.print("<error message=\"API not enabled in system management settings.\" />");
- return;
+ out.print("<error code=\""+errCode+"\" message=\"API not enabled in system management settings.\"/>");
+ return;
}
- //-----------------------
- ILSSession ilsSession = null;
+
String userID = request.getParameter("ILSUSER");
String userPw = request.getParameter("ILSPASSWD");
- ilsSession = ILSSession.login(company.getCompanyName(), userID, userPw);
+ ILSSession ilsSession = (userID != null && userPw != null)
+ ? ILSSession.login(company.getCompanyName(), userID, userPw)
+ : (ILSSession)session.getAttribute("ilsSession");
+ ++errCode;
if (ilsSession == null) {
- out.print("<error message=\"Your iLS sign in information is not valid. Please try again.\" />");
+ out.print("<error code=\""+errCode+"\" message=\"Your iLS sign in information is not valid.\"/>");
return;
}
+ String detail = request.getParameter("detail");
+ int detailLevel = Course.DETAIL_COMPLETE;
+ if ("headeronly".equals(detail)) detailLevel = Course.DETAIL_HEADERONLY;
+ else if ("brief".equals(detail)) detailLevel = Course.DETAIL_BRIEF;
+ // end standard service header -----------------------------------
int courseID = -2; try { courseID = Integer.parseInt(request.getParameter("courseID")); } catch (Exception e) {}
if (courseID == -2) if ("ALL".equals(request.getParameter("courseID"))) courseID = -1;
- String courseNum = request.getParameter("courseNum");
+ String courseNumber = request.getParameter("courseNumber");
Logger logger = Logger.getLogger(this.getClass());
Logger eventsLogger = Logger.getLogger("EVENTS");
@@ -59,34 +60,38 @@
SimpleDateFormat df_out = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
df_out.setTimeZone(TimeZone.getTimeZone("GMT"));
- if (courseID > -2 || courseNum != null) {
+ if (courseID > -2 || courseNumber != null) {
Vector<Course> courses = null;
if (courseID == -1) courses = Course.getAllCourses(ilsSession);
else {
courses = new Vector<Course>();
if (courseID > -1) try { courses.add((Course)Course.getCourse(ilsSession, courseID)); } catch (Exception e) {}
- else if (courseNum != null) try { courses.add((Course)Course.getCourseByNum(ilsSession, courseNum)); } catch (Exception e) {}
+ else if (courseNumber != null) try { courses.add((Course)Course.getCourseByNum(ilsSession, courseNumber)); } catch (Exception e) {}
}
- out.print("<Courses count=\""+courses.size()+"\">\n");
+ out.print("<courses count=\""+courses.size()+"\">\n");
for (Object o : courses) {
- out.print(((Course)o).toFormattedXML());
+ out.print(((Course)o).toXML(detailLevel));
}
- out.print("</Courses>\n");
+ out.print("</courses>\n");
return;
}
response.setContentType("text/html");
%>
<html>
+<style>th { text-align:left; }</style>
<body>
<h1>course/get</h1>
<p>Retrieve Courses</p>
<h3>Parameters</h3>
<table border="1">
-<tr><td><b>courseID</b></td><td>CourseID to retrieve; ALL, for entire course catalog</td></tr>
-<tr><td><b>courseNum</b></td><td>CourseNum to retrieve</td></tr>
-<tr><td><b>ILSUSER</b></td><td>ILS Login Credentials. Used to validate this API request.</td></tr>
-<tr><td><b>ILSPASSWD</b></td><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+<tbody>
+<tr><th>courseID</th><td>CourseID to retrieve; ALL, for entire course catalog</td></tr>
+<tr><th>courseNumber</th><td>Course Number to retrieve</td></tr>
+<tr><th>detail</th><td>(complete), brief, headeronly</td></tr>
+<tr><th>ILSUSER</th><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+<tr><th>ILSPASSWD</th><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+</tbody>
<table>
</body>
</html>
Modified: trunk/webapp/api/courseattempt/get/index.jsp
===================================================================
--- trunk/webapp/api/courseattempt/get/index.jsp 2016-02-03 22:59:59 UTC (rev 1390)
+++ trunk/webapp/api/courseattempt/get/index.jsp 2016-02-16 23:07:51 UTC (rev 1391)
@@ -19,54 +19,60 @@
<%@ page import="org.apache.log4j.Logger" %>
<%
-
+ // standard service header ---------------------------------------
response.setContentType("text/xml");
- String errorMsg = "";
- //-- Company logic from login.jsp -------
- // TODO: consolidate this somewhere
- String requestURL = request.getRequestURL().toString() + "?" + request.getQueryString();
- String co = com.resolutions.ils.Utils.getCompanyFromConfig(session, requestURL);
- if (co == null) co = com.resolutions.ils.Utils.getSysConfig(session).getProperty("Company", null);
- if (co == null) co = request.getParameter("co");
- if (co != null) session.setAttribute("co", co);
- co = (String) session.getAttribute("co");
- Company company = Company.getCompany((co != null) ? Integer.parseInt(co):1);
- ILSSession ilsSession = (ILSSession)session.getAttribute("ilsSession");
-
+ int errCode = 0;
+ Company company = Company.getCompany(request);
+
boolean apiEnabled = "on".equals(Utils.getSysConfig(session.getServletContext(), company.getCompanyID()).getProperty("APIEnable", "off"));
- if (!apiEnabled && ilsSession == null) {
- out.print("<error message=\"API not enabled in system management settings.\" />");
- return;
+ ++errCode;
+ if (!apiEnabled) {
+ out.print("<error code=\""+errCode+"\" message=\"API not enabled in system management settings.\"/>");
+ return;
}
- //-----------------------
+
String userID = request.getParameter("ILSUSER");
String userPw = request.getParameter("ILSPASSWD");
- if (userID != null && userPw != null) {
- ilsSession = ILSSession.login(company.getCompanyName(), userID, userPw);
- }
-
+ ILSSession ilsSession = (userID != null && userPw != null)
+ ? ILSSession.login(company.getCompanyName(), userID, userPw)
+ : (ILSSession)session.getAttribute("ilsSession");
+ ++errCode;
if (ilsSession == null) {
- out.print("<error message=\"Your iLS sign in information is not valid. Please try again.\" />");
+ out.print("<error code=\""+errCode+"\" message=\"Your iLS sign in information is not valid.\"/>");
return;
}
+ String detail = request.getParameter("detail");
+ int detailLevel = org.crosswire.data.DataObject.DETAIL_COMPLETE;
+ if ("headeronly".equals(detail)) detailLevel = org.crosswire.data.DataObject.DETAIL_HEADERONLY;
+ else if ("brief".equals(detail)) detailLevel = org.crosswire.data.DataObject.DETAIL_BRIEF;
+ // end standard service header -----------------------------------
+
Logger logger = Logger.getLogger(this.getClass());
Logger eventsLogger = Logger.getLogger("EVENTS");
- String statusMsg = "";
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmm");
df.setTimeZone(TimeZone.getTimeZone("GMT"));
SimpleDateFormat df_out = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
df_out.setTimeZone(TimeZone.getTimeZone("GMT"));
- UserProfile current = new UserProfile();
- current.defaultAll();
- int currentRoleID = -1;
- int currentLocationID = -1;
- int profileID = -1;
+ int courseAttemptID = -1; try { courseAttemptID = Integer.parseInt( request.getParameter("courseAttemptID") ); } catch(Exception e) {}
String val = request.getParameter("startDateTime");
- Date startDateTime = null;
- try { startDateTime = df.parse(val); } catch (Exception e) {}
+ Date startDateTime = null; try { startDateTime = df.parse(val); } catch (Exception e) {}
+
+ Vector<CourseAttempt> cas = null;
+
+ ++errCode;
+ if (courseAttemptID != -1) {
+ cas = new Vector<CourseAttempt>();
+ CourseAttempt ca = CourseAttempt.getCourseAttempt(ilsSession, courseAttemptID);
+
+ if (ca == null) {
+ out.print("<error code=\""+errCode+"\" message=\"Course Attempt ID not found.\"/>");
+ return;
+ }
+ cas.add(ca);
+ }
if (startDateTime != null) {
val = request.getParameter("endDateTime");
Date endDateTime = null;
@@ -75,27 +81,35 @@
return;
}
- Vector cas = CourseAttempt.getCourseAttempts(ilsSession, startDateTime, endDateTime);
- out.print("<CourseAttempts count=\""+cas.size()+"\" startDateTime=\""+df_out.format(startDateTime)+"\">\n");
+ cas = CourseAttempt.getCourseAttempts(ilsSession, startDateTime, endDateTime);
+ }
+
+ if (cas != null) {
+ out.print("<courseAttempts count=\""+cas.size()+"\""+(startDateTime != null ? (" startDateTime=\""+df_out.format(startDateTime)+"\""):"")+">\n");
for (Object o : cas) {
- out.print(((CourseAttempt)o).toFormattedXML());
+ out.print(((CourseAttempt)o).toXML(detailLevel));
}
- out.print("</CourseAttempts>\n");
+ out.print("</courseAttempts>\n");
return;
}
response.setContentType("text/html");
%>
<html>
+<style>th { text-align:left; }</style>
<body>
<h1>courseattempt/get</h1>
<p>Retrieve Course Attempt records</p>
<h3>Parameters</h3>
<table border="1">
-<tr><td><b>startDateTime</b></td><td>the start of the date and time range for which to retrieve Course Attempt records, inclusive (yyyyMMddhhmm), e.g., 201201240000</td></tr>
-<tr><td><b>endDateTime</b></td><td>(optional) the end of the date and time range for which to retrieve Course Attempt records, exclusive (yyyyMMddhhmm), e.g., 201201250000</td></tr>
-<tr><td><b>profileID</b></td><td>(optional) restrict results to a single user</td></tr>
-<tr><td><b>ILSUSER</b></td><td>ILS Login Credentials. Used to validate this API request.</td></tr>
-<tr><td><b>ILSPASSWD</b></td><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+<tbody>
+<tr><th>courseAttemptID</th><td>retrieve a specific course attempt by ID</td></tr>
+<tr><th>startDateTime</th><td>retrieve a set of course attempts by filters, the start of the date and time range for which to retrieve Course Attempt records, inclusive (yyyyMMddhhmm), e.g., 201201240000</td></tr>
+<tr><th>endDateTime</th><td>(optional) the end of the date and time range for which to retrieve Course Attempt records, exclusive (yyyyMMddhhmm), e.g., 201201250000</td></tr>
+<tr><th>profileID</th><td>(optional) restrict results to a single user</td></tr>
+<tr><th>detail</th><td>(complete), brief, headeronly</td></tr>
+<tr><th>ILSUSER</th><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+<tr><th>ILSPASSWD</th><td>ILS Login Credentials. Used to validate this API request.</td></tr>
+</tbody>
<table>
</body>
</html>
More information about the Ils-source
mailing list