// To-do: Show programs solved by the user func (this *UserController) Show() { if this.Ctx.Input.Param("0") == "" { this.Abort("404") } user := models.User{Username: this.Ctx.Input.Param("0")} if user.GetByUsername() { this.Data["title"] = user.Username this.Data["userDetails"] = user log := models.Problemlogs{Uid: user.Uid} logs, count := log.GetByUid() problems := make(map[int]models.Problem) if count == 0 { this.Data["solvedProblemsExist"] = false } else { this.Data["solvedProblemsExist"] = true for index, element := range logs { p := models.Problem{Pid: element.Pid} p.GetByPid() problems[index] = p } } this.Data["solvedProblems"] = problems this.Layout = "layout.tpl" this.TplNames = "user/show.tpl" this.LayoutSections = make(map[string]string) this.LayoutSections["HtmlHead"] = "" this.LayoutSections["Sidebar"] = "" } else { this.Abort("404") } }
func (this *ProblemController) AddTestCase() { if !this.isLoggedIn() { this.Redirect("/user/login", 302) return } //Redirect if user doesnt hold editor rights uid := this.GetSession("id") user := models.User{Uid: uid.(int)} if !user.IsEditor() { this.Redirect("/", 302) return } pid := this.Ctx.Input.Param(":id") id, _ := strconv.Atoi(pid) problem := models.Problem{Pid: id} problem.GetByPid() this.Data["problem"] = problem testcases := models.Testcases{Pid: id} cases, _ := testcases.GetAllByPid() this.Data["title"] = "Add Test Case" this.Data["cases"] = cases this.Layout = "layout.tpl" this.TplNames = "problem/addtest.tpl" this.LayoutSections = make(map[string]string) this.LayoutSections["HtmlHead"] = "" this.LayoutSections["Sidebar"] = "" }
func (this *ProblemController) Test() { pid := 1 problem := models.Problem{Pid: pid} problem.GetByPid() code := this.GetString("code") lang := this.GetString("language") stdin := this.GetString("stdin") output := models.Exec(pid, code, lang, stdin) js, _ := json.Marshal(output) this.Data["json"] = string(js) this.ServeJson() }
// Serves the Problem Page // To-do: Show recently solved users and their language on sidebar // To-do: Later, add least execution time log on sidebar func (this *ProblemController) ProblemById() { pid := this.Ctx.Input.Param(":id") id, err := strconv.Atoi(pid) if err != nil { // Redirect to 404 this.Abort("404") } p := models.Problem{Pid: id} p.GetById() if strings.Contains(p.Type, "contest") { this.Redirect("/", 302) return } log := models.Problemlogs{Pid: id} logs, count := log.GetRecentByPid() users := make(map[int]models.User) if count == 0 { this.Data["recentlySolvedUsersExist"] = false } else { this.Data["recentlySolvedUsersExist"] = true for index, element := range logs { u := models.User{Uid: element.Uid} u.GetUserInfo() users[index] = u } } //Author added user := models.User{} user.Uid = p.Uid user.GetUserInfo() this.Data["title"] = p.Statement this.Data["problem"] = p this.Data["Author"] = user.Username this.Data["recentlySolvedUsers"] = users // Handle problem log of a user if this.isLoggedIn() { problemLog := models.Problemlogs{} problemLog.Pid = p.Pid problemLog.Uid = p.Uid if problemLog.GetByPidUid() { this.Data["userScore"] = problemLog.Points this.Data["solvedCount"] = problemLog.Solved } } this.Layout = "layout.tpl" this.TplNames = "problem/show.tpl" this.LayoutSections = make(map[string]string) this.LayoutSections["HtmlHead"] = "problem/submit_head.tpl" this.LayoutSections["Sidebar"] = "sidebar/recently_solved_by.tpl" }
// Serves the problems list page func (this *ProblemController) List() { problem := models.Problem{} problems, _ := problem.GetRecent() this.Data["problems"] = problems this.Data["title"] = "Home | List " this.Data["types"], _ = problem.GetTypes() this.Layout = "layout.tpl" this.TplNames = "problem/list.tpl" this.LayoutSections = make(map[string]string) this.LayoutSections["HtmlHead"] = "" this.LayoutSections["Sidebar"] = "sidebar/showcategories.tpl" }
// Save Problem // To-do: Clean info before save - Ambigous // To-do: Check login and user previlages - Done func (this *ProblemController) SaveProblem() { if !this.isLoggedIn() { this.Redirect("/user/login", 302) return } //Redirect if user doesnt hold editor rights id := this.GetSession("id") user := models.User{} user.Uid = id.(int) if !user.IsEditor() { this.Redirect("/", 302) return } points, _ := strconv.Atoi(this.GetString("points")) //remove replace foe newlines sampleInput := strings.Replace(this.GetString("sample_input"), "\r", "", -1) sampleOutput := strings.Replace(this.GetString("sample_output"), "\r", "", -1) problem := models.Problem{ Statement: this.GetString("statement"), Description: this.GetString("description"), Constraints: this.GetString("constraints"), //Sample_input: this.GetString("sample_input"), //Sample_output: this.GetString("sample_output"), Type: this.GetString("type"), Difficulty: this.GetString("difficulty"), Points: points, Uid: id.(int), } problem.Sample_output = sampleOutput problem.Sample_input = sampleInput id, noerr := problem.Create() pid := strconv.Itoa(id.(int)) if noerr == true { this.Redirect("/problem/"+pid, 302) } this.Data["title"] = "Create Problem " this.Layout = "layout.tpl" this.TplNames = "problem/create.tpl" this.LayoutSections = make(map[string]string) this.LayoutSections["HtmlHead"] = "" this.LayoutSections["Sidebar"] = "" }
// /contest/:name/:pid func (this *ContestController) GetProblem() { pid := this.Ctx.Input.Param(":id") contestName := this.Ctx.Input.Param(":name") id, err := strconv.Atoi(pid) if err != nil { // Redirect to 404 this.Abort("404") } p := models.Problem{Pid: id} p.GetById() check := strings.Contains(p.Type, contestName) if !check { this.Redirect("/contest/"+contestName, 302) return } log := models.Problemlogs{Pid: id} logs, count := log.GetRecentByPid() users := make(map[int]models.User) if count == 0 { this.Data["recentlySolvedUsersExist"] = false } else { this.Data["recentlySolvedUsersExist"] = true for index, element := range logs { u := models.User{Uid: element.Uid} u.GetUserInfo() users[index] = u } } this.Data["title"] = p.Statement this.Data["problem"] = p this.Data["Author"] = contestName this.Data["recentlySolvedUsers"] = users // Handle problem log of a user if this.isLoggedIn() { problemLog := models.Problemlogs{} problemLog.Pid = p.Pid problemLog.Uid = p.Uid if problemLog.GetByPidUid() { this.Data["userScore"] = problemLog.Points this.Data["solvedCount"] = problemLog.Solved } } }
func (this *ProblemController) RunCode() { if !this.isLoggedIn() { this.Redirect("/user/login", 302) return } //uid := this.GetSession("id") pid, _ := strconv.Atoi(this.Ctx.Input.Param(":id")) problem := models.Problem{Pid: pid} problem.GetByPid() code := this.GetString("code") lang := this.GetString("language") stdin := this.GetString("stdin") output := models.Exec(pid, code, lang, stdin) js, _ := json.Marshal(output) this.Data["json"] = string(js) this.ServeJson() }
// Using list template here as well // To do : serve in pages, per page 10 problems - done func (this *ProblemController) ProblemByCategory() { problemType := this.Ctx.Input.Param(":type") page, _ := strconv.Atoi(this.Ctx.Input.Param(":page")) problem := models.Problem{Type: problemType} problems, count := problem.GetByType(page) if count == 0 { this.Redirect("/", 302) return } this.Data["problems"] = problems this.Data["title"] = "Home | List " this.Data["types"], _ = problem.GetTypes() this.Layout = "layout.tpl" this.TplNames = "problem/list.tpl" this.LayoutSections = make(map[string]string) this.LayoutSections["HtmlHead"] = "" this.LayoutSections["Sidebar"] = "sidebar/showcategories.tpl" }
// /contest/:name/saveproblem func (this *ContestController) saveProblem() { if !this.isAdmin() { return } contestName := this.Ctx.Input.Param(":name") id := this.GetSession("id") user := models.User{} user.Uid = id.(int) points, _ := strconv.Atoi(this.GetString("points")) //remove replace foe newlines sampleInput := strings.Replace(this.GetString("sample_input"), "\r", "", -1) sampleOutput := strings.Replace(this.GetString("sample_output"), "\r", "", -1) problem := models.Problem{ Statement: this.GetString("statement"), Description: this.GetString("description"), Constraints: this.GetString("constraints"), //Sample_input: this.GetString("sample_input"), //Sample_output: this.GetString("sample_output"), Difficulty: this.GetString("difficulty"), Points: points, Uid: id.(int), } problem.Sample_output = sampleOutput problem.Sample_input = sampleInput problem.Type = "contest" + contestName pid, status := problem.Create() if status { id := strconv.Itoa(pid) this.Redirect("/contest/"+contestName+"/"+id, 302) } // handle the failure }