Added teaching assistant relation to student teams and proper generation of repositories with readme.
This commit is contained in:
parent
10403b4be5
commit
a5cfdfbbc9
12
pom.xml
12
pom.xml
|
@ -85,6 +85,18 @@
|
||||||
<artifactId>commons-csv</artifactId>
|
<artifactId>commons-csv</artifactId>
|
||||||
<version>1.5</version>
|
<version>1.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- Apache HTTP Library -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<version>4.5.6</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- Github API Object Library -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.kohsuke</groupId>
|
||||||
|
<artifactId>github-api</artifactId>
|
||||||
|
<version>1.95</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -29,7 +29,8 @@ public class CourseEntity {
|
||||||
*/
|
*/
|
||||||
@GetMapping("/courses/{code}")
|
@GetMapping("/courses/{code}")
|
||||||
public String get(@PathVariable String code, Model model) {
|
public String get(@PathVariable String code, Model model) {
|
||||||
this.addCourseToModelIfExists(code, model);
|
Optional<Course> courseOptional = this.courseRepository.findByCode(code);
|
||||||
|
courseOptional.ifPresent(course -> model.addAttribute("course", course));
|
||||||
return "courses/entity";
|
return "courses/entity";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,10 +42,24 @@ public class CourseEntity {
|
||||||
*/
|
*/
|
||||||
@GetMapping("/courses/{code}/student_teams")
|
@GetMapping("/courses/{code}/student_teams")
|
||||||
public String getStudentTeams(@PathVariable String code, Model model) {
|
public String getStudentTeams(@PathVariable String code, Model model) {
|
||||||
this.addCourseToModelIfExists(code, model);
|
Optional<Course> courseOptional = this.courseRepository.findByCode(code);
|
||||||
|
courseOptional.ifPresent(course -> model.addAttribute("course", course));
|
||||||
return "courses/entity/student_teams";
|
return "courses/entity/student_teams";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the teaching assistant teams for a particular course.
|
||||||
|
* @param code The course code.
|
||||||
|
* @param model The view model.
|
||||||
|
* @return The template for viewing the list of student teams.
|
||||||
|
*/
|
||||||
|
@GetMapping("/courses/{code}/teaching_assistant_teams")
|
||||||
|
public String getTeachingAssistantTeams(@PathVariable String code, Model model) {
|
||||||
|
Optional<Course> courseOptional = this.courseRepository.findByCode(code);
|
||||||
|
courseOptional.ifPresent(course -> model.addAttribute("course", course));
|
||||||
|
return "courses/entity/teaching_assistant_teams";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the students for a particular course.
|
* Gets the students for a particular course.
|
||||||
* @param code The course code.
|
* @param code The course code.
|
||||||
|
@ -53,18 +68,22 @@ public class CourseEntity {
|
||||||
*/
|
*/
|
||||||
@GetMapping("/courses/{code}/students")
|
@GetMapping("/courses/{code}/students")
|
||||||
public String getStudents(@PathVariable String code, Model model) {
|
public String getStudents(@PathVariable String code, Model model) {
|
||||||
this.addCourseToModelIfExists(code, model);
|
Optional<Course> courseOptional = this.courseRepository.findByCode(code);
|
||||||
|
courseOptional.ifPresent(course -> model.addAttribute("course", course));
|
||||||
return "courses/entity/students";
|
return "courses/entity/students";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds the course found by a certain code to the list of model attributes.
|
* Gets the teaching assistants for a particular course.
|
||||||
* @param courseCode The unique code used to identify this course.
|
* @param code The course code.
|
||||||
* @param model The view model to add the course data to.
|
* @param model The view model.
|
||||||
|
* @return The template for viewing the list of teaching assistants.
|
||||||
*/
|
*/
|
||||||
private void addCourseToModelIfExists(String courseCode, Model model) {
|
@GetMapping("/courses/{code}/teaching_assistants")
|
||||||
Optional<Course> courseOptional = this.courseRepository.findByCode(courseCode);
|
public String getTeachingAssistants(@PathVariable String code, Model model) {
|
||||||
|
Optional<Course> courseOptional = this.courseRepository.findByCode(code);
|
||||||
courseOptional.ifPresent(course -> model.addAttribute("course", course));
|
courseOptional.ifPresent(course -> model.addAttribute("course", course));
|
||||||
|
return "courses/entity/teaching_assistants";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,14 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses.entity.s
|
||||||
|
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.Course;
|
import nl.andrewlalis.teaching_assistant_assistant.model.Course;
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository;
|
import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository;
|
||||||
|
import nl.andrewlalis.teaching_assistant_assistant.util.github.GithubManager;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
|
@ -33,6 +35,16 @@ public class GenerateRepositories {
|
||||||
)
|
)
|
||||||
public String post(@PathVariable String courseCode) {
|
public String post(@PathVariable String courseCode) {
|
||||||
System.out.println("Post received for " + courseCode);
|
System.out.println("Post received for " + courseCode);
|
||||||
|
Optional<Course> optionalCourse = this.courseRepository.findByCode(courseCode);
|
||||||
|
optionalCourse.ifPresent(course -> {
|
||||||
|
course.setGithubOrganizationName("InitializerTesting");
|
||||||
|
try {
|
||||||
|
GithubManager manager = new GithubManager("andrewlalis", "scrubstub43");
|
||||||
|
manager.generateStudentTeamRepository(course.getStudentTeams().get(0));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return "redirect:/courses/{courseCode}";
|
return "redirect:/courses/{courseCode}";
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package nl.andrewlalis.teaching_assistant_assistant.model;
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.assignments.Assignment;
|
import nl.andrewlalis.teaching_assistant_assistant.model.assignments.Assignment;
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.people.Person;
|
import nl.andrewlalis.teaching_assistant_assistant.model.people.Person;
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.people.Student;
|
import nl.andrewlalis.teaching_assistant_assistant.model.people.Student;
|
||||||
|
import nl.andrewlalis.teaching_assistant_assistant.model.people.TeachingAssistant;
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam;
|
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam;
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.TeachingAssistantTeam;
|
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.TeachingAssistantTeam;
|
||||||
|
|
||||||
|
@ -155,6 +156,16 @@ public class Course extends BasicEntity {
|
||||||
return students;
|
return students;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<TeachingAssistant> getTeachingAssistants() {
|
||||||
|
List<TeachingAssistant> teachingAssistants = new ArrayList<>();
|
||||||
|
this.participants.forEach(participant -> {
|
||||||
|
if (participant instanceof TeachingAssistant) {
|
||||||
|
teachingAssistants.add((TeachingAssistant) participant);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return teachingAssistants;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder sb = new StringBuilder(this.getName()).append('\n');
|
StringBuilder sb = new StringBuilder(this.getName()).append('\n');
|
||||||
|
|
|
@ -4,10 +4,7 @@ import nl.andrewlalis.teaching_assistant_assistant.model.assignments.grades.Assi
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.people.Person;
|
import nl.andrewlalis.teaching_assistant_assistant.model.people.Person;
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.people.Student;
|
import nl.andrewlalis.teaching_assistant_assistant.model.people.Student;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import javax.persistence.*;
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.FetchType;
|
|
||||||
import javax.persistence.OneToMany;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -23,6 +20,14 @@ public class StudentTeam extends Team {
|
||||||
@Column
|
@Column
|
||||||
private String githubRepositoryName;
|
private String githubRepositoryName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The teaching assistant team to which this student team is assigned.
|
||||||
|
*/
|
||||||
|
@ManyToOne(
|
||||||
|
fetch = FetchType.LAZY
|
||||||
|
)
|
||||||
|
private TeachingAssistantTeam assignedTeachingAssistantTeam;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The list of assignment grades which this student group has received.
|
* The list of assignment grades which this student group has received.
|
||||||
*/
|
*/
|
||||||
|
@ -53,4 +58,12 @@ public class StudentTeam extends Team {
|
||||||
this.githubRepositoryName = name;
|
this.githubRepositoryName = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TeachingAssistantTeam getAssignedTeachingAssistantTeam() {
|
||||||
|
return this.assignedTeachingAssistantTeam;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAssignedTeachingAssistantTeam(TeachingAssistantTeam team) {
|
||||||
|
this.assignedTeachingAssistantTeam = team;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,12 +24,24 @@ public class TeachingAssistantTeam extends Team {
|
||||||
@Column
|
@Column
|
||||||
private TeachingAssistantRole role;
|
private TeachingAssistantRole role;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The string name of this team.
|
||||||
|
*/
|
||||||
|
@Column
|
||||||
|
private String githubTeamName;
|
||||||
|
|
||||||
@OneToMany
|
@OneToMany
|
||||||
@JoinColumn(
|
@JoinColumn(
|
||||||
name = "teaching_assistant_team_id"
|
name = "teaching_assistant_team_id"
|
||||||
)
|
)
|
||||||
private List<SectionGrade> sectionGrades;
|
private List<SectionGrade> sectionGrades;
|
||||||
|
|
||||||
|
@OneToMany
|
||||||
|
@JoinColumn(
|
||||||
|
name = "teaching_assistant_team_id"
|
||||||
|
)
|
||||||
|
private List<StudentTeam> assignedStudentTeams;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor for JPA.
|
* Default constructor for JPA.
|
||||||
*/
|
*/
|
||||||
|
@ -41,4 +53,12 @@ public class TeachingAssistantTeam extends Team {
|
||||||
people.forEach(person -> teachingAssistants.add((TeachingAssistant) person));
|
people.forEach(person -> teachingAssistants.add((TeachingAssistant) person));
|
||||||
return teachingAssistants;
|
return teachingAssistants;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getGithubTeamName() {
|
||||||
|
return this.githubTeamName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGithubTeamName(String name) {
|
||||||
|
this.githubTeamName = name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
package nl.andrewlalis.teaching_assistant_assistant.util.github;
|
||||||
|
|
||||||
|
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam;
|
||||||
|
import org.kohsuke.github.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class GithubManager {
|
||||||
|
|
||||||
|
private GitHub github;
|
||||||
|
|
||||||
|
public GithubManager(String apiKey) throws IOException {
|
||||||
|
this.github = GitHub.connectUsingOAuth(apiKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GithubManager(String username, String password) throws IOException {
|
||||||
|
this.github = GitHub.connectUsingPassword(username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generateStudentTeamRepository(StudentTeam team) throws IOException {
|
||||||
|
GHOrganization organization = this.github.getOrganization(team.getCourse().getGithubOrganizationName());
|
||||||
|
Calendar today = Calendar.getInstance();
|
||||||
|
int year = today.get(Calendar.YEAR);
|
||||||
|
String repositoryName = year + "_Team_" + team.getId();
|
||||||
|
|
||||||
|
// Get the TA team which manages this repository.
|
||||||
|
GHTeam teachingAssistantGithubTeam = organization.getTeamByName(team.getAssignedTeachingAssistantTeam().getGithubTeamName());
|
||||||
|
|
||||||
|
// Create the repo
|
||||||
|
GHCreateRepositoryBuilder repositoryBuilder = organization.createRepository(repositoryName);
|
||||||
|
repositoryBuilder.wiki(false);
|
||||||
|
repositoryBuilder.issues(false);
|
||||||
|
repositoryBuilder.description("University of Groningen OOP Student Repository");
|
||||||
|
repositoryBuilder.private_(false);
|
||||||
|
repositoryBuilder.autoInit(false);
|
||||||
|
repositoryBuilder.team(teachingAssistantGithubTeam);
|
||||||
|
GHRepository repository = repositoryBuilder.create();
|
||||||
|
|
||||||
|
// Add getting started file.
|
||||||
|
GHContentBuilder contentBuilder = repository.createContent();
|
||||||
|
contentBuilder.branch("master");
|
||||||
|
contentBuilder.message("Initial Commit");
|
||||||
|
File f = new File(getClass().getClassLoader().getResource("program_resources/getting_started.md").getFile());
|
||||||
|
contentBuilder.content(Files.readAllBytes(f.toPath()));
|
||||||
|
contentBuilder.path("getting_started.md");
|
||||||
|
contentBuilder.commit();
|
||||||
|
|
||||||
|
// Create the development branch.
|
||||||
|
try {
|
||||||
|
String sha1 = repository.getBranch(repository.getDefaultBranch()).getSHA1();
|
||||||
|
repository.createRef("refs/heads/development", sha1);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Protect master branch.
|
||||||
|
GHBranchProtectionBuilder protectionBuilder = repository.getBranch("master").enableProtection();
|
||||||
|
protectionBuilder.includeAdmins(false);
|
||||||
|
protectionBuilder.restrictPushAccess();
|
||||||
|
protectionBuilder.teamPushAccess(teachingAssistantGithubTeam);
|
||||||
|
protectionBuilder.addRequiredChecks("ci/circleci");
|
||||||
|
protectionBuilder.enable();
|
||||||
|
|
||||||
|
List<GHUser> studentUsers = new ArrayList<>(team.getMembers().size());
|
||||||
|
team.getStudents().forEach(student -> {
|
||||||
|
try {
|
||||||
|
studentUsers.add(this.github.getUser(student.getGithubUsername()));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//repository.addCollaborators(studentUsers);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
# Getting Started
|
||||||
|
Welcome to the University of Groningen's Object Oriented Programming course! We're glad to have you. Read the instructions provided here carefully so that you can have a smooth start to the course.
|
||||||
|
|
||||||
|
## Setting Up
|
||||||
|
To begin, you'll need to download this repository you're looking at right now. To do that, run the following command (where `repository_url` is the URL of this repository):
|
||||||
|
```
|
||||||
|
git clone <repository_url>
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you should have a local directory with the same name as this repository. Checkout your `development` branch, since you do not have permission as a student to make changes to the master branch. From here, we need to copy the files from the assignments repository into ours. To do this, we first add a new 'remote' to our git repository, and then pull from that repository's `master` branch.
|
||||||
|
```
|
||||||
|
git checkout development
|
||||||
|
|
||||||
|
git remote add assignments https://github.com/rug-oop/2019_assignments
|
||||||
|
|
||||||
|
git pull assignments master --allow-unrelated-histories
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you should see all the files just as they appear in the assignments repository.
|
||||||
|
|
||||||
|
## Developing Your Code and Submitting
|
||||||
|
While previous knowledge of git may be useful, it should not really be needed for you to do well in this course.
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<a th:href="@{${'https://www.github.com/' + course.getGithubOrganizationName()}}">Github Organization</a>
|
Github Organization: <a th:href="@{${'https://www.github.com/' + course.getGithubOrganizationName()}}" th:text="${course.getGithubOrganizationName()}"></a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a th:href="@{/courses/{code}/teaching_assistant_teams(code=${course.getCode()})}">Teaching Assistant Teams</a>
|
<a th:href="@{/courses/{code}/teaching_assistant_teams(code=${course.getCode()})}">Teaching Assistant Teams</a>
|
||||||
|
@ -23,6 +23,9 @@
|
||||||
<li>
|
<li>
|
||||||
<a th:href="@{/courses/{code}/students(code=${course.getCode()})}">All Students</a>
|
<a th:href="@{/courses/{code}/students(code=${course.getCode()})}">All Students</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a th:href="@{/courses/{code}/teaching_assistants(code=${course.getCode()})}">All Teaching Assistants</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,23 @@
|
||||||
<div id="content">
|
<div id="content">
|
||||||
<h1>Teaching Assistant Teams for <span th:text="${course.getName()}"></span></h1>
|
<h1>Teaching Assistant Teams for <span th:text="${course.getName()}"></span></h1>
|
||||||
|
|
||||||
|
<div th:if="${course.getTeachingAssistantTeams().isEmpty()}">
|
||||||
|
<p>No teaching assistant teams.</p>
|
||||||
|
</div>
|
||||||
<table>
|
<table>
|
||||||
|
<tr th:each="taTeam: ${course.getTeachingAssistantTeams()}">
|
||||||
|
<td>
|
||||||
|
<a
|
||||||
|
th:href="@{/courses/{code}/teaching_assistant_teams/{team_id}
|
||||||
|
(code=${course.getCode()}, team_id=${taTeam.getId()})}">
|
||||||
|
Teaching Assistant Team <span th:text="${taTeam.getId()}"></span>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td th:each="ta: ${taTeam.getStudents()}">
|
||||||
|
<span th:text="${ta.getFullName()}"></span>
|
||||||
|
</td>
|
||||||
|
<td th:text="${taTeam.getGithubRepositoryName()}"></td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org" th:replace="~{layouts/basic_page :: layout (~{::title}, ~{::#content}, ~{::#sidebar})}">
|
||||||
|
<head>
|
||||||
|
<title>Teaching Assistants</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="content">
|
||||||
|
<h1>Teaching Assistants for <span th:text="${course.getName()}"></span></h1>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr th:each="teachingAssistant: ${course.getTeachingAssistants()}">
|
||||||
|
<td>
|
||||||
|
<a th:href="@{/teaching_assistants/{id}(id=${teachingAssistant.getId()})}"><span th:text="${teachingAssistant.getFullName()}"></span></a>
|
||||||
|
</td>
|
||||||
|
<td th:text="${teachingAssistant.getEmailAddress()}"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="sidebar">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -13,6 +13,7 @@
|
||||||
<ul class="header_link_list">
|
<ul class="header_link_list">
|
||||||
<li><a href="/" th:href="@{/}">Home</a>
|
<li><a href="/" th:href="@{/}">Home</a>
|
||||||
<li><a href="/courses" th:href="@{/courses}">Courses</a>
|
<li><a href="/courses" th:href="@{/courses}">Courses</a>
|
||||||
|
<li><a href="/students" th:href="@{/students}">Students</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue