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.HashMap;
import java.util.Map;
/**
* Created by Brady Larson
*
* Copyright (c) 2014 Instructure. All rights reserved.
*/
public class Submission extends CanvasModel<Submission>{
private long id;
private String grade;
private double score;
private long attempt;
private String submitted_at;
private ArrayList<SubmissionComment> submission_comments = new ArrayList<SubmissionComment>();
private Date commentCreated;
private String mediaContentType;
private String mediaCommentUrl;
private String mediaCommentDisplay;
private ArrayList<Submission> submission_history = new ArrayList<Submission>();
private ArrayList<Attachment> attachments = new ArrayList<Attachment>();
private String body;
private HashMap<String,RubricCriterionRating> rubric_assessment = new HashMap<>();
private boolean grade_matches_current_submission;
private String workflow_state;
private String submission_type;
private String preview_url;
private String url;
private boolean late;
private boolean excused;
private MediaComment media_comment;
//Conversation Stuff
private long assignment_id;
private Assignment assignment;
private long user_id;
private long grader_id;
private User user;
//this value could be null. Currently will only be returned when getting the submission for
//a user when the submission_type is discussion_topic
private ArrayList<DiscussionEntry> discussion_entries = new ArrayList<DiscussionEntry>();
// Group Info only available when including groups in the Submissions#index endpoint
private Group group;
///////////////////////////////////////////////////////////////////////////
// Helpers
///////////////////////////////////////////////////////////////////////////
public boolean isWithoutGradedSubmission() {
return !isGraded() && getSubmissionType() == null;
}
public boolean isGraded() {
return getGrade() != null;
}
///////////////////////////////////////////////////////////////////////////
// Getters and Setters
///////////////////////////////////////////////////////////////////////////
@Override
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getUser_id(){return user_id;}
public void setUser_id(long user_id){this.user_id = user_id;}
public ArrayList<SubmissionComment> getComments() {
return submission_comments;
}
public void setComments(ArrayList<SubmissionComment> comments) {
this.submission_comments = comments;
}
public Date getCommentCreated() {
return commentCreated;
}
public void setCommentCreated(Date commentCreated) {
this.commentCreated = commentCreated;
}
public String getMediaContentType() {
return mediaContentType;
}
public void setMediaContentType(String mediaContentType) {
this.mediaContentType = mediaContentType;
}
public String getMediaCommentUrl() {
return mediaCommentUrl;
}
public void setMediaCommentUrl(String mediaCommentUrl) {
this.mediaCommentUrl = mediaCommentUrl;
}
public String getMediaCommentDisplay() {
return mediaCommentDisplay;
}
public void setMediaCommentDisplay(String mediaCommentDisplay) {
this.mediaCommentDisplay = mediaCommentDisplay;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public long getAssignment_id() {return assignment_id;}
public void setAssignment_id(long assignment_id) {this.assignment_id = assignment_id;}
public Assignment getAssignment(){
return assignment;
}
public void setAssignment(Assignment assignment){this.assignment = assignment;}
public long getGraderID(){
return grader_id;
}
public boolean isExcused(){ return excused; }
public void setExcused(boolean excused){
this.excused = excused;
}
public Date getSubmitDate() {
if(submitted_at == null) {
return null;
}
return APIHelpers.stringToDate(submitted_at);
}
public void setSubmitDate(String submitDate) {
if(submitDate == null) {
this.submitted_at = null;
}
else {
this.submitted_at = submitDate;
}
}
public void setSubmissionHistory(ArrayList<Submission> history) {
this.submission_history = history;
}
public ArrayList<Submission> getSubmissionHistory() {
return submission_history;
}
public ArrayList<Attachment> getAttachments() {
return attachments;
}
public void setAttachments(ArrayList<Attachment> attachments) {
this.attachments = attachments;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public boolean isGradeMatchesCurrentSubmission() {
return grade_matches_current_submission;
}
public void setGradeMatchesCurrentSubmission(
boolean gradeMatchesCurrentSubmission) {
this.grade_matches_current_submission = gradeMatchesCurrentSubmission;
}
public String getWorkflowState() {
return workflow_state;
}
public void setWorkflowState(String workflowState) {
this.workflow_state = workflowState;
}
public String getSubmissionType() {
return submission_type;
}
public void setSubmissionType(String submissionType) {
this.submission_type = submissionType;
}
public String getPreviewUrl() {
return preview_url;
}
public void setPreviewUrl(String previewUrl) {
this.preview_url = previewUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public RubricAssessment getRubricAssessment() {
RubricAssessment assessment = new RubricAssessment();
ArrayList<RubricCriterionRating> ratings = new ArrayList<RubricCriterionRating>();
if (rubric_assessment != null) {
for (Map.Entry<String, RubricCriterionRating> entry : rubric_assessment.entrySet()) {
RubricCriterionRating rating = entry.getValue();
rating.setCriterionId(entry.getKey());
ratings.add(rating);
}
}
assessment.setRatings(ratings);
return assessment;
}
public HashMap<String,RubricCriterionRating> getRubricAssessmentHash(){
return this.rubric_assessment;
}
public void setRubricAssessment(HashMap<String,RubricCriterionRating> ratings){
this.rubric_assessment = ratings;
}
public ArrayList<DiscussionEntry> getDiscussion_entries() {
return discussion_entries;
}
public void setDiscussion_entries(ArrayList<DiscussionEntry> discussion_entries) {
this.discussion_entries = discussion_entries;
}
public MediaComment getMediaComment() { return media_comment; }
public void setMediaComment(MediaComment media_comment) {
this.media_comment = media_comment;
}
public long getAttempt() { return attempt; }
public void setAttempt(long attempt) {
this.attempt = attempt;
}
public boolean isLate() { return late; }
public void setIslate(boolean late){
this.late = late;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
///////////////////////////////////////////////////////////////////////////
// Required Overrides
///////////////////////////////////////////////////////////////////////////
@Override
public Date getComparisonDate() {
return getSubmitDate();
}
@Override
public String getComparisonString() {
return getSubmissionType();
}
///////////////////////////////////////////////////////////////////////////
// Constructors
///////////////////////////////////////////////////////////////////////////
public Submission() {}
///////////////////////////////////////////////////////////////////////////
// Helpers
///////////////////////////////////////////////////////////////////////////
public ArrayList<Long> getUserIds() {
ArrayList<Long> ids = new ArrayList<Long>();
for(int i = 0; i < submission_comments.size(); i++)
{
ids.add(submission_comments.get(i).getAuthorID());
}
return ids;
}
/*
* Submissions will have dummy submissions if they grade an assignment with no actual submissions.
* We want to see if any are not dummy submissions
*/
public boolean hasRealSubmission(){
if(submission_history != null) {
for (Submission submission : submission_history) {
if (submission != null && submission.getSubmissionType() != null) {
return true;
}
}
}
return false;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(this.id);
dest.writeString(this.grade);
dest.writeDouble(this.score);
dest.writeString(this.submitted_at);
dest.writeList(this.submission_comments);
dest.writeLong(commentCreated != null ? commentCreated.getTime() : -1);
dest.writeString(this.mediaContentType);
dest.writeString(this.mediaCommentUrl);
dest.writeString(this.mediaCommentDisplay);
dest.writeList(this.submission_history);
dest.writeList(this.attachments);
dest.writeString(this.body);
dest.writeSerializable(this.rubric_assessment);
dest.writeByte(grade_matches_current_submission ? (byte) 1 : (byte) 0);
dest.writeString(this.workflow_state);
dest.writeString(this.submission_type);
dest.writeString(this.preview_url);
dest.writeString(this.url);
dest.writeParcelable(this.assignment, flags);
dest.writeLong(this.user_id);
dest.writeLong(this.grader_id);
dest.writeLong(this.assignment_id);
dest.writeParcelable(this.user, flags);
dest.writeParcelable(this.media_comment, flags);
dest.writeList(this.discussion_entries);
dest.writeLong(this.attempt);
dest.writeByte(this.excused ? (byte) 1 : (byte) 0);
dest.writeByte(this.late ? (byte) 1 : (byte) 0);
dest.writeParcelable(this.group, flags);
}
private Submission(Parcel in) {
this.assignment = new Assignment();
this.id = in.readLong();
this.grade = in.readString();
this.score = in.readDouble();
this.submitted_at = in.readString();
in.readList(this.submission_comments, SubmissionComment.class.getClassLoader());
long tmpCommentCreated = in.readLong();
this.commentCreated = tmpCommentCreated == -1 ? null : new Date(tmpCommentCreated);
this.mediaContentType = in.readString();
this.mediaCommentUrl = in.readString();
this.mediaCommentDisplay = in.readString();
in.readList(this.submission_history, Submission.class.getClassLoader());
in.readList(this.attachments, Attachment.class.getClassLoader());
this.body = in.readString();
this.rubric_assessment =(HashMap<String,RubricCriterionRating>) in.readSerializable();
this.grade_matches_current_submission = in.readByte() != 0;
this.workflow_state = in.readString();
this.submission_type = in.readString();
this.preview_url = in.readString();
this.url = in.readString();
this.assignment = in.readParcelable(Assignment.class.getClassLoader());
this.user_id = in.readLong();
this.grader_id = in.readLong();
this.assignment_id = in.readLong();
this.user = in.readParcelable(User.class.getClassLoader());
this.media_comment = in.readParcelable(MediaComment.class.getClassLoader());
in.readList(this.discussion_entries, DiscussionEntry.class.getClassLoader());
this.attempt = in.readLong();
this.excused = in.readByte() != 0;
this.late = in.readByte() != 0;
this.group = in.readParcelable(Group.class.getClassLoader());
}
public static Creator<Submission> CREATOR = new Creator<Submission>() {
public Submission createFromParcel(Parcel source) {
return new Submission(source);
}
public Submission[] newArray(int size) {
return new Submission[size];
}
};
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}