package com.instructure.canvasapi.model;
import android.os.Parcel;
import com.instructure.canvasapi.utilities.APIHelpers;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
/**
* Copyright (c) 2015 Instructure. All rights reserved.
*/
public class Course extends CanvasContext implements Comparable<CanvasContext>{
// Variables from API
private long id;
private String name;
private String original_name;
private String course_code;
private String start_at;
private String end_at;
private String syllabus_body;
private boolean hide_final_grades;
private boolean is_public;
private String license;
private Term term;
private List<Enrollment> enrollments = new ArrayList<Enrollment>();
private long needs_grading_count;
private boolean apply_assignment_group_weights;
// Helper variables
private Double currentScore;
private Double finalScore;
private boolean checkedCurrentGrade;
private boolean checkedFinalGrade;
private String currentGrade;
private String finalGrade;
private boolean is_favorite;
private boolean access_restricted_by_date;
private boolean restrict_enrollments_to_course_dates;
///////////////////////////////////////////////////////////////////////////
// Getters and Setters
///////////////////////////////////////////////////////////////////////////
@Override
public long getId() {
return id;
}
@Override
public Type getType(){return Type.COURSE;}
@Override
public String getName() {
return name;
}
public String getOriginalName() {
return this.original_name;
}
public void setId(long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public String getCourseCode() {
return course_code;
}
public void setCourseCode(String courseCode) {
course_code = courseCode;
}
public Date getStartDate() {
return APIHelpers.stringToDate(start_at);
}
public Date getEndDate() {
return APIHelpers.stringToDate(end_at);
}
public String getSyllabusBody() {
return syllabus_body;
}
public void setSyllabusBody(String syllabusBody) {
syllabus_body = syllabusBody;
}
public boolean isPublic() {
return is_public;
}
public void setIsPublic(boolean isPublic) {
this.is_public = isPublic;
}
public boolean isFinalGradeHidden() {
return hide_final_grades;
}
public void setHideFinalGrades(boolean hide_final_grades) {
this.hide_final_grades = hide_final_grades;
}
public Term getTerm() {
return term;
}
public List<Enrollment> getEnrollments() {
return enrollments;
}
public String getHomePage() {
return default_view;
}
public boolean isFavorite() {
return is_favorite;
}
public void setFavorite(boolean isFavorite) {
this.is_favorite = isFavorite;
}
public boolean isAccessRestrictedByDate() {
return access_restricted_by_date;
}
public void setAccessRestrictedByDate(boolean accessRestrictedByDate) {
this.access_restricted_by_date = accessRestrictedByDate;
}
///////////////////////////////////////////////////////////////////////////
// Constructors
///////////////////////////////////////////////////////////////////////////
public Course() {}
///////////////////////////////////////////////////////////////////////////
// Helpers
///////////////////////////////////////////////////////////////////////////
public boolean isStudent() {
for(Enrollment enrollment : enrollments) {
if(enrollment.isStudent()) {
return true;
}
}
return false;
}
public boolean isTeacher() {
if (enrollments == null){
return false;
}
for(Enrollment enrollment : enrollments) {
if(enrollment.isTeacher()) {
return true;
}
}
return false;
}
public boolean isTA() {
if (enrollments == null){
return false;
}
for(Enrollment enrollment : enrollments) {
if(enrollment.isTA()) {
return true;
}
}
return false;
}
public boolean isObserver()
{
for(Enrollment enrollment : enrollments) {
if(enrollment.isObserver()) {
return true;
}
}
return false;
}
public List<Enrollment> getEnrollmentsNoDuplicates() {
if(enrollments == null) {
return null;
}
if(enrollments.size() <= 1) {
return enrollments;
}
return new ArrayList<Enrollment>(new LinkedHashSet<Enrollment>(enrollments));
}
public double getCurrentScore() {
if (currentScore == null) {
for (Enrollment enrollment : enrollments) {
if (enrollment.isStudent() || enrollment.isObserver()) {
if(enrollment.isMultipleGradingPeriodsEnabled()) {
currentScore = enrollment.getCurrentPeriodComputedCurrentScore();
} else {
currentScore = enrollment.getCurrentScore();
}
return currentScore;
}
}
currentScore = 0.0;
}
return currentScore;
}
public String getCurrentGrade() {
if (!checkedCurrentGrade) {
checkedCurrentGrade = true;
for (Enrollment enrollment : enrollments) {
if (enrollment.isStudent() || enrollment.isObserver()) {
if (enrollment.isMultipleGradingPeriodsEnabled()) {
currentGrade = enrollment.getCurrentPeriodComputedCurrentGrade();
} else {
currentGrade = enrollment.getCurrentGrade();
}
return currentGrade;
}
}
}
return currentGrade;
}
public double getFinalScore() {
if (finalScore == null) {
for (Enrollment enrollment : enrollments) {
if (enrollment.isStudent() || enrollment.isObserver()) {
if (enrollment.isMultipleGradingPeriodsEnabled()) {
finalScore = enrollment.getCurrentPeriodComputedFinalScore();
} else {
finalScore = enrollment.getFinalScore();
}
return finalScore;
}
}
finalScore = 0.0;
}
return finalScore;
}
public String getFinalGrade() {
if (!checkedFinalGrade) {
checkedFinalGrade = true;
for (Enrollment enrollment : enrollments) {
if (enrollment.isStudent() || enrollment.isObserver()) {
if (enrollment.isMultipleGradingPeriodsEnabled()) {
finalGrade = enrollment.getCurrentPeriodComputedFinalGrade();
} else {
finalGrade = enrollment.getFinalGrade();
}
}
}
}
return finalGrade;
}
public void addEnrollment(Enrollment enrollment) {
if (enrollments == null || enrollments.size() == 0) {
enrollments = new ArrayList<Enrollment>();
enrollments.add(enrollment);
} else {
enrollments.add(enrollment);
}
}
public long getNeedsGradingCount() { return needs_grading_count; }
public void setNeedsGradingCount(long needs_grading_count) { this.needs_grading_count = needs_grading_count; }
public void setApplyAssignmentGroupWeights(boolean b){ apply_assignment_group_weights = b;}
public boolean getApplyAssignmentGroupWeights(){ return apply_assignment_group_weights; }
/**
* License
*/
public enum LICENSE {PRIVATE_COPYRIGHTED, CC_ATTRIBUTION_NON_COMMERCIAL_NO_DERIVATIVE, CC_ATTRIBUTION_NON_COMMERCIAL_SHARE_ALIKE,
CC_ATTRIBUTION_NON_COMMERCIAL, CC_ATTRIBUTION_NO_DERIVATIVE, CC_ATTRIBUTION_SHARE_ALIKE, CC_ATTRIBUTION, PUBLIC_DOMAIN}
public static String licenseToAPIString(LICENSE license){
if(license == null){
return null;
}
switch (license){
case PRIVATE_COPYRIGHTED:
return "private";
case CC_ATTRIBUTION_NON_COMMERCIAL_NO_DERIVATIVE:
return "cc_by_nc_nd";
case CC_ATTRIBUTION_NON_COMMERCIAL_SHARE_ALIKE:
return "c_by_nc_sa";
case CC_ATTRIBUTION_NON_COMMERCIAL:
return "cc_by_nc";
case CC_ATTRIBUTION_NO_DERIVATIVE:
return "cc_by_nd";
case CC_ATTRIBUTION_SHARE_ALIKE:
return "cc_by_sa";
case CC_ATTRIBUTION:
return "cc_by";
case PUBLIC_DOMAIN:
return "public_domain";
default:
return "";
}
}
public static String licenseToPrettyPrint(LICENSE license){
switch (license){
case PRIVATE_COPYRIGHTED:
return "Private (Copyrighted)";
case CC_ATTRIBUTION_NON_COMMERCIAL_NO_DERIVATIVE:
return "CC Attribution Non-Commercial No Derivatives";
case CC_ATTRIBUTION_NON_COMMERCIAL_SHARE_ALIKE:
return "CC Attribution Non-Commercial Share Alike";
case CC_ATTRIBUTION_NON_COMMERCIAL:
return "CC Attribution Non-Commercial";
case CC_ATTRIBUTION_NO_DERIVATIVE:
return "CC Attribution No Derivatives";
case CC_ATTRIBUTION_SHARE_ALIKE:
return "CC Attribution Share Alike";
case CC_ATTRIBUTION:
return "CC Attribution";
case PUBLIC_DOMAIN:
return "Public Domain";
default:
return "";
}
}
public String getLicensePrettyPrint(){
return licenseToPrettyPrint(getLicense());
}
public void setLicense(LICENSE license){
this.license = licenseToAPIString(license);
}
public LICENSE getLicense(){
if("public_domain".equals(license)){
return LICENSE.PUBLIC_DOMAIN;
} else if ("cc_by_nc_nd".equals(license)){
return LICENSE.CC_ATTRIBUTION_NON_COMMERCIAL_NO_DERIVATIVE;
} else if ("c_by_nc_sa".equals(license)){
return LICENSE.CC_ATTRIBUTION_NON_COMMERCIAL_SHARE_ALIKE;
} else if ("cc_by_nc".equals(license)){
return LICENSE.CC_ATTRIBUTION_NON_COMMERCIAL;
} else if ("cc_by_nd".equals(license)){
return LICENSE.CC_ATTRIBUTION_NO_DERIVATIVE;
} else if ("cc_by_sa".equals(license)){
return LICENSE.CC_ATTRIBUTION_SHARE_ALIKE;
} else if ("cc_by".equals(license)){
return LICENSE.CC_ATTRIBUTION;
} else {
return LICENSE.PRIVATE_COPYRIGHTED;
}
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(this.id);
dest.writeString(this.name);
dest.writeString(this.original_name);
dest.writeString(this.course_code);
dest.writeString(this.start_at);
dest.writeString(this.end_at);
dest.writeString(this.syllabus_body);
dest.writeByte(hide_final_grades ? (byte) 1 : (byte) 0);
dest.writeByte(is_public ? (byte) 1 : (byte) 0);
dest.writeString(this.license);
dest.writeParcelable(this.term, flags);
dest.writeList(this.enrollments);
dest.writeValue(this.currentScore);
dest.writeValue(this.finalScore);
dest.writeByte(checkedCurrentGrade ? (byte) 1 : (byte) 0);
dest.writeByte(checkedFinalGrade ? (byte) 1 : (byte) 0);
dest.writeString(this.currentGrade);
dest.writeString(this.finalGrade);
dest.writeByte(is_favorite ? (byte) 1 : (byte) 0);
dest.writeString(this.default_view);
dest.writeParcelable(this.permissions, flags);
dest.writeLong(this.needs_grading_count);
dest.writeByte(apply_assignment_group_weights ? (byte) 1 : (byte) 0);
dest.writeByte(access_restricted_by_date ? (byte) 1 : (byte) 0);
}
private Course(Parcel in) {
this.id = in.readLong();
this.name = in.readString();
this.original_name = in.readString();
this.course_code = in.readString();
this.start_at = in.readString();
this.end_at = in.readString();
this.syllabus_body = in.readString();
this.hide_final_grades = in.readByte() != 0;
this.is_public = in.readByte() != 0;
this.license = in.readString();
this.term = in.readParcelable(Term.class.getClassLoader());
in.readList(this.enrollments, Enrollment.class.getClassLoader());
this.currentScore = (Double) in.readValue(Double.class.getClassLoader());
this.finalScore = (Double) in.readValue(Double.class.getClassLoader());
this.checkedCurrentGrade = in.readByte() != 0;
this.checkedFinalGrade = in.readByte() != 0;
this.currentGrade = in.readString();
this.finalGrade = in.readString();
this.is_favorite = in.readByte() != 0;
this.default_view = in.readString();
this.permissions = in.readParcelable(CanvasContextPermission.class.getClassLoader());
this.needs_grading_count = in.readLong();
this.apply_assignment_group_weights = in.readByte() != 0;
this.access_restricted_by_date = in.readByte() != 0;
}
public static Creator<Course> CREATOR = new Creator<Course>() {
public Course createFromParcel(Parcel source) {
return new Course(source);
}
public Course[] newArray(int size) {
return new Course[size];
}
};
}