Skip to content

Commit fbaebef

Browse files
committed
[Data]: Create Django database script
1 parent 8ee4d87 commit fbaebef

File tree

7 files changed

+216
-0
lines changed

7 files changed

+216
-0
lines changed

app/data/__init__.py

Whitespace-only changes.

app/data/admins.xlsx

6.81 KB
Binary file not shown.

app/data/courses.xlsx

34.7 KB
Binary file not shown.

app/data/departments.xlsx

7.06 KB
Binary file not shown.

app/data/generate_dump_django.py

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
"""
2+
Converts the xlsx files into csv and populates the database
3+
"""
4+
5+
import pandas as pd
6+
import random
7+
8+
from datetime import (
9+
date,
10+
datetime,
11+
timedelta,
12+
)
13+
from django.db.utils import IntegrityError
14+
15+
from core.models import (
16+
Student,
17+
Teacher,
18+
User,
19+
)
20+
from school.models import (
21+
Course,
22+
Department,
23+
)
24+
25+
26+
def parse(xlsx_file_path):
27+
"""
28+
Converts the file to a list of dictionaries.
29+
returns a list of rows of the data to use by the writeTable classes
30+
Returns:
31+
list: list of dictionaries of {key: column name, value: cell value}
32+
"""
33+
34+
df = pd.read_excel(
35+
xlsx_file_path,
36+
sheet_name="Sheet1",
37+
header=0,
38+
)
39+
40+
dtype = {
41+
"first_name": str,
42+
"last_name": str,
43+
"email": str,
44+
"password": str,
45+
"recovery_question": str,
46+
"recovery_answer": str,
47+
"age": int,
48+
"id": str,
49+
"name": str,
50+
"level": int,
51+
"department_id": str,
52+
"teacher_id": str,
53+
"created_at": str,
54+
"start_level": int,
55+
"current_level": int,
56+
"matric_no": str,
57+
}
58+
59+
defined = df.columns.tolist()
60+
dtypes = {}
61+
for key in defined:
62+
dtypes[key] = dtype[key]
63+
df.astype(dtypes)
64+
65+
if "created_at" in df.columns:
66+
df.rename(columns={"created_at": "created"}, inplace=True)
67+
68+
list_dict = df.to_dict(orient="records")
69+
return list_dict
70+
71+
72+
def writeDjangoAdmin():
73+
"""Executes django attributes to create a superuser"""
74+
database = parse("admins.xlsx")
75+
logs = "\t=====Admins=====\n"
76+
for user_data in database:
77+
try:
78+
user = User.objects.create_superuser(**user_data)
79+
user.save()
80+
logs += f"SuperUser created successfully\n {user}\n"
81+
except IntegrityError as e:
82+
logs += f"SuperUser creation failed\n {e.args[1]}\n"
83+
return logs
84+
85+
86+
def writeDjangoDept():
87+
"""Executes django attributes to create a department"""
88+
database = parse("departments.xlsx")
89+
logs = "\t=====Departments=====\n"
90+
for department in database:
91+
try:
92+
dept = Department.objects.create(**department)
93+
dept.save()
94+
logs += f"Department created successfully\n {dept}\n"
95+
except IntegrityError as e:
96+
logs += f"Department creation failed\n {e.args[1]}\n"
97+
return logs
98+
99+
100+
def writeDjangoTeach():
101+
"""Executes django attributes to create a teacher"""
102+
database = parse("teachers.xlsx")
103+
logs = "\t=====Teachers=====\n"
104+
for teacher in database:
105+
try:
106+
user_data = {
107+
"first_name": teacher["first_name"],
108+
"last_name": teacher["last_name"],
109+
"email": teacher["email"],
110+
"password": teacher["password"],
111+
"recovery_question": teacher["recovery_question"],
112+
"recovery_answer": teacher["recovery_answer"],
113+
}
114+
user = User.objects.create(**user_data)
115+
user.save()
116+
teacher_data = {
117+
"id": teacher["id"],
118+
"created": teacher["created"],
119+
"user": user,
120+
}
121+
teacher = Teacher.objects.create(**teacher_data)
122+
teacher.save()
123+
logs += f"Teacher created successfully\n {user}\n"
124+
except IntegrityError as e:
125+
logs += f"Teacher creation failed\n {e.args[1]}\n"
126+
return logs
127+
128+
129+
def writeDjangoCourse():
130+
"""Executes django attributes to create a course"""
131+
database = parse("courses.xlsx")
132+
logs = "\t=====Courses=====\n"
133+
for course in database:
134+
try:
135+
dept = Department.objects.get(id=course["department_id"])
136+
teach = Teacher.objects.get(id=course["teacher_id"])
137+
course_data = {
138+
"id": course["id"],
139+
"created": course["created"],
140+
"name": course["name"],
141+
"level": course["level"],
142+
"department": dept,
143+
"teacher": teach,
144+
}
145+
course = Course.objects.create(**course_data)
146+
course.save()
147+
logs += f"Course created successfully\n {course}\n"
148+
except (Teacher.DoesNotExist, Department.DoesNotExist) as e:
149+
logs += f"Course creation failed: Missing or incorrect data\n {e.args[1]}\n"
150+
except IntegrityError as e:
151+
logs += f"Course creation failed\n {e.args[1]}\n"
152+
return logs
153+
154+
155+
def writeDjangoStudent():
156+
"""Executes django attributes to create a student"""
157+
database = parse("students.xlsx")
158+
logs = "\t=====Students=====\n"
159+
for student in database:
160+
random_year = date.today().replace(
161+
year=date.today().year - student["age"]
162+
)
163+
random_day = timedelta(days=random.randint(0, 365))
164+
dob = random_year - random_day
165+
try:
166+
user_data = {
167+
"first_name": student["first_name"],
168+
"last_name": student["last_name"],
169+
"email": student["email"],
170+
"password": student["password"],
171+
"recovery_question": student["recovery_question"],
172+
"recovery_answer": student["recovery_answer"],
173+
}
174+
user = User.objects.create(**user_data)
175+
user.save()
176+
dept = Department.objects.get(id=student["department_id"])
177+
178+
student_data = {
179+
"id": student["id"],
180+
"created": student["created"],
181+
# "age": student["age"],
182+
"start_level": student["start_level"],
183+
"current_level": student["current_level"],
184+
"matric_no": student["matric_no"],
185+
"department": dept,
186+
"user": user,
187+
"date_of_birth": dob,
188+
}
189+
student = Student.objects.create(**student_data)
190+
student.save()
191+
logs += f"Student created successfully\n {user}\n"
192+
except Department.DoesNotExist as e:
193+
logs += f"Student creation failed: Missing or incorrect data\n {e.args[1]}\n"
194+
except IntegrityError as e:
195+
logs += f"Student creation failed\n {e.args[1]}\n"
196+
return logs
197+
198+
199+
def generateSQL():
200+
"""Creates the log file to record data sent to the database"""
201+
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
202+
with open(f"dump_{timestamp}.log", "w") as dump:
203+
statements = [
204+
f"\t===== {datetime.now()} =====\n",
205+
writeDjangoAdmin(),
206+
writeDjangoDept(),
207+
writeDjangoTeach(),
208+
writeDjangoCourse(),
209+
writeDjangoStudent(),
210+
]
211+
dump.writelines(statements)
212+
return "OK"
213+
214+
215+
if __name__ == "__main__":
216+
generateSQL()

app/data/students.xlsx

201 KB
Binary file not shown.

app/data/teachers.xlsx

13.8 KB
Binary file not shown.

0 commit comments

Comments
 (0)