mirror of
https://github.com/Code-For-Groningen/temmies.git
synced 2025-03-15 15:10:15 +01:00
Some work. Too confused to work today.😵
This commit is contained in:
parent
a9b0764cba
commit
078034faf2
30
Folder.py
Normal file
30
Folder.py
Normal file
@ -0,0 +1,30 @@
|
||||
# Module to handle each assignment (most difficult part)
|
||||
|
||||
from Base import Base
|
||||
from Exercise import Exercise
|
||||
from requests import Session
|
||||
|
||||
|
||||
class Assignment(Base):
|
||||
def __init__(self, url:str, name:str, session:Session, parent):
|
||||
super().__init__(url, name, session, parent)
|
||||
self.download = Downloadable(name, session, self)
|
||||
|
||||
def __str__(self):
|
||||
return f"Assignment {self.name} in course {self.parent.name}"
|
||||
|
||||
def getExercises(self) -> list[Exercise]:
|
||||
# Find li large
|
||||
ul = self.soup.find('ul', class_='round')
|
||||
|
||||
# Turn each li to an exercise instance
|
||||
return self.liLargeToExercises(ul, self.session, self)
|
||||
|
||||
def getExercise(self, name:str) -> Exercise:
|
||||
# Get the exercise
|
||||
r = self.session.get(self.url)
|
||||
soup = BeautifulSoup(r.text, 'lxml')
|
||||
# Search by name
|
||||
exercise = soup.find('a', text=name)
|
||||
# Get the url and transform it into an exercise object
|
||||
return Exercise(url=exercise['href'], name=name, session=self.session, assignment=self)
|
21
src/Base.py
21
src/Base.py
@ -70,24 +70,3 @@ class Base:
|
||||
submissions.append(self.__parseCfgBlock(div))
|
||||
return self.__parseCfgBlock(divs[0]), submissions
|
||||
|
||||
def liLargeToAssignments(self, ul:BeautifulSoup) -> list:
|
||||
# Assume that ul is the block surrounding the li elements
|
||||
# Get all the li elements
|
||||
lis = ul.find_all('li', class_='large')
|
||||
# Turn each to an assignment instance
|
||||
assignments = []
|
||||
for li in lis:
|
||||
assignments.append(Base(li.a['href'], li.a.text, self.session, self.parent))
|
||||
return assignments
|
||||
|
||||
def liLargeToExercises(self, ul:BeautifulSoup) -> list:
|
||||
# Assume that ul is the block surrounding the li elements
|
||||
# Get all the li elements
|
||||
lis = ul.find_all('li', class_='large')
|
||||
# Turn each to an exercise instance
|
||||
exercises = []
|
||||
for li in lis:
|
||||
exercises.append(Base(li.a['href'], li.a.text, self.session, self.parent))
|
||||
return exercises
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Class to handle courses
|
||||
from bs4 import BeautifulSoup
|
||||
from requests import Session
|
||||
from Assignment import Assignment
|
||||
from ExerciseGroup import ExerciseGroup
|
||||
import re
|
||||
from Base import Base
|
||||
from exceptions.CourseUnavailable import CourseUnavailable
|
||||
@ -24,12 +24,12 @@ class Course(Base):
|
||||
|
||||
def __courseAvailable(self, r):
|
||||
# Check if we got an error
|
||||
print(self.url)
|
||||
# print(self.url)
|
||||
if "Something went wrong" in r.text:
|
||||
raise CourseUnavailable()
|
||||
|
||||
@property
|
||||
def courseInfo(self):
|
||||
def info(self):
|
||||
return {
|
||||
"name": self.name,
|
||||
"year": self.parent.year,
|
||||
@ -37,36 +37,9 @@ class Course(Base):
|
||||
"assignments": [x.name for x in self.assignments]
|
||||
}
|
||||
|
||||
def getAssignment(self, name:str) -> Assignment:
|
||||
# Optimization: if we already have the assignments, don't get them again
|
||||
try:
|
||||
if name in [x.name for x in self.assignments]:
|
||||
return name
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
# Get the assignment
|
||||
def getExerciseGroups(self):
|
||||
r = self.session.get(self.url)
|
||||
soup = BeautifulSoup(r.text, 'lxml')
|
||||
|
||||
# Search by name
|
||||
assignment = soup.find('a', text=name)
|
||||
# Get the url and transform it into an assignment object
|
||||
return Assignment(url=assignment['href'], name=name, session=self.session, parent=self)
|
||||
|
||||
|
||||
def getAssignments(self) -> list[Assignment]:
|
||||
# For each link in the course page, get the assignment
|
||||
r = self.session.get(self.url)
|
||||
soup = BeautifulSoup(r.text, 'lxml')
|
||||
# Find the big ul
|
||||
# print(soup)
|
||||
section = soup.find('div', class_="ass-children")
|
||||
ul = section.find('ul', class_='round')
|
||||
|
||||
# IDEA: They sometimes put other stuff in these li's, so we have to filter them out
|
||||
# print(ul)
|
||||
# print(type(ul))
|
||||
# Transform them into Assignment objects
|
||||
# I want to call the __liLargeToAssignments method from the Base class
|
||||
return self.liLargeToAssignments(ul)
|
||||
entries = section.find_all('a', href=True)
|
||||
return [ExerciseGroup(f"https://themis.housing.rug.nl{x['href']}", x.text, self.session, self) for x in entries]
|
@ -13,9 +13,9 @@ class Exercise(Base):
|
||||
def __str__(self):
|
||||
return f"Exercise {self.name} in assignment {self.parent.name}"
|
||||
|
||||
# IDEA: Implement test case downloading
|
||||
def getTests(self) -> list[str]:
|
||||
pass
|
||||
|
||||
# IDEA : Make this async, so we don't have to wait for the whole output to load
|
||||
def submit(self, file:str, comment:str) -> str:
|
||||
# Submit a file
|
||||
# The form is in the page with class "cfg-container round"
|
||||
|
39
src/ExerciseGroup.py
Normal file
39
src/ExerciseGroup.py
Normal file
@ -0,0 +1,39 @@
|
||||
from Base import Base
|
||||
from bs4 import BeautifulSoup\
|
||||
|
||||
class ExerciseGroup(Base):
|
||||
# I can't tell if I'm already an exercise :C
|
||||
|
||||
def __init__(self, url:str, name:str, session, parent):
|
||||
super().__init__(url, name, session, parent)
|
||||
self.exercises = self.getExercises()
|
||||
self.folders = self.getFolders()
|
||||
|
||||
def __str__(self):
|
||||
return f"ExerciseGroup {self.name} in course {self.parent.name}"
|
||||
|
||||
def getExercises(self) -> list:
|
||||
r = self.session.get(self.url)
|
||||
soup = BeautifulSoup(r.text, 'lxml')
|
||||
section = soup.find('div', class_="ass-children")
|
||||
try:
|
||||
submittables = section.find_all('a', class_="ass-submitable")
|
||||
except AttributeError:
|
||||
return None
|
||||
|
||||
return submittables
|
||||
|
||||
# Returns a list of names of the folders
|
||||
def getFolders(self) -> list:
|
||||
r = self.session.get(self.url)
|
||||
soup = BeautifulSoup(r.text, 'lxml')
|
||||
section = soup.find('div', class_="ass-children")
|
||||
try:
|
||||
folders = section.find_all('a', class_="ass-group")
|
||||
except AttributeError:
|
||||
return None
|
||||
|
||||
return [x.text for x in folders]
|
||||
|
||||
def recurse(self, folder:str):
|
||||
print(self.url)
|
Loading…
x
Reference in New Issue
Block a user