public async Task <IActionResult> Submit(int?userId)
        {
            if (userId == null)
            {
                userId = User.Id;
            }

            if (userId != User.Id && ClassroomRole < ClassroomRole.Admin)
            {
                return(Forbid());
            }

            if (ClassroomRole < ClassroomRole.Admin)
            {
                var unreadFeedback = await SubmissionService.GetUnreadFeedbackAsync
                                     (
                    ClassroomName,
                    userId.Value
                                     );

                if (unreadFeedback.Any())
                {
                    var viewModel = unreadFeedback.Select
                                    (
                        uf => new UnreadFeedbackViewModel
                        (
                            uf,
                            (projectName, checkpointName, submissionId) => Url.Action
                            (
                                "ViewFeedback",
                                "Submission",
                                new
                    {
                        projectName,
                        checkpointName,
                        submissionId
                    }
                            ),
                            TimeZoneProvider
                        )
                                    ).ToList();

                    return(View("UnreadFeedback", viewModel));
                }
            }

            var candidates = await SubmissionService.GetSubmissionCandidatesAsync
                             (
                ClassroomName,
                ProjectName,
                userId.Value
                             );

            var submissions = await SubmissionService.GetUserSubmissionsAsync
                              (
                ClassroomName,
                ProjectName,
                userId.Value
                              );

            var user = await UserService.GetUserAsync(userId.Value);

            var candidatesViewModel = new SubmissionCandidatesViewModel
                                      (
                user,
                candidates,
                commit => commit.GetCommitUrl(Url),
                Checkpoint,
                submissions
                .OrderByDescending(s => s.DateSubmitted)
                .FirstOrDefault(s => s.Checkpoint == Checkpoint),
                TimeZoneProvider
                                      );

            return(View(candidatesViewModel));
        }