forked from neomatrix369/learning-path-index
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodels.py
105 lines (84 loc) · 2.91 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from csv import writer
from typing import Optional
from urllib.parse import urljoin
from pydantic import BaseModel, validator
KAGGLE_LEARN_URL = "https://www.kaggle.com/learn/"
KAGGLE_URL = "https://www.kaggle.com"
EMPTY_CSV_ROW = []
def convert_relative_url_to_absolute(
relative_url: str, domain: str = KAGGLE_LEARN_URL
) -> str:
return urljoin(domain, relative_url)
class KaggleLesson(BaseModel):
class KaggleTutorial(BaseModel):
name: str
url: str # E.g "/code/ryanholbrook/what-is-feature-engineering"
authorUsername: str
@validator("url", each_item=True)
def convert_to_absolute_url(cls, url):
return convert_relative_url_to_absolute(url, domain=KAGGLE_URL)
description: str
learnTutorial: KaggleTutorial
class KagglePrerequsite(BaseModel):
name: str
trackSlug: str
@validator("trackSlug", each_item=True)
def convert_to_absolute_url(cls, trackSlug):
return convert_relative_url_to_absolute(trackSlug, domain=KAGGLE_LEARN_URL)
class KaggleAuthor(BaseModel):
displayName: str
userName: str
class KaggleCourse(BaseModel):
name: str
description: str
estimatedTimeHours: int
trackSlug: str
lessons: list[KaggleLesson]
prerequisites: Optional[list[KagglePrerequsite]]
authors: list[KaggleAuthor]
@validator("trackSlug", each_item=True)
def convert_to_absolute_url(cls, trackSlug):
return convert_relative_url_to_absolute(trackSlug, domain=KAGGLE_LEARN_URL)
@property
def processed_authors(self):
return ",".join(
[f"{author.userName}|{author.displayName}" for author in self.authors]
)
def write_course_summary_to_file(self, f):
csvwriter = writer(f)
csvwriter.writerow(["name", "description", "duration", "url", "authors"])
csvwriter.writerows(
[
[
self.name,
self.description,
self.estimatedTimeHours,
self.trackSlug,
self.processed_authors,
],
EMPTY_CSV_ROW,
]
)
if self.prerequisites:
# Write prerequisites
csvwriter.writerow(
["prerequisites"],
)
csvwriter.writerows(
[[p.name, p.trackSlug] for p in self.prerequisites] + EMPTY_CSV_ROW
)
# Write lessons
csvwriter.writerow(["lessons"])
csvwriter.writerow(["name", "description", "url", "authorUserName"])
csvwriter.writerows(
[
[
lesson.learnTutorial.name,
lesson.description,
lesson.learnTutorial.url,
lesson.learnTutorial.authorUsername,
]
for lesson in self.lessons
]
)
csvwriter.writerow(EMPTY_CSV_ROW)