Skip to content

Commit 58ce0b8

Browse files
committed
Added Classmates tab content
1 parent 23e4958 commit 58ce0b8

File tree

11 files changed

+301
-12
lines changed

11 files changed

+301
-12
lines changed

include/data/Classmate.hpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* Copyright 2018 <David Corbin, Mitchell Harvey>
3+
*/
4+
5+
#ifndef INCLUDE_DATA_CLASSMATE_HPP_
6+
#define INCLUDE_DATA_CLASSMATE_HPP_
7+
8+
#include <include/data/Login.hpp>
9+
#include <include/types/Student.hpp>
10+
#include <include/FileManager.hpp>
11+
#include <string>
12+
#include <vector>
13+
14+
class Classmate : public QObject {
15+
Q_OBJECT
16+
17+
public:
18+
/**
19+
* Constructor that sets login.
20+
* @param login login object
21+
*/
22+
explicit Classmate(Login *login);
23+
24+
/**
25+
* Constructor without login.
26+
*/
27+
Classmate();
28+
29+
void loadClassmates(std::string *token, std::string *courseCode);
30+
31+
std::vector<Student *> *getClassmates() const;
32+
33+
/**
34+
* Get login object.
35+
* @return login object
36+
*/
37+
Login *getLogin() const;
38+
39+
/**
40+
* Set login object.
41+
* @param login login object
42+
*/
43+
void setLogin(Login *login);
44+
45+
private:
46+
bool classmatesRec;
47+
std::vector<Student *> *students;
48+
Login *login;
49+
std::string *courseCode;
50+
QNetworkAccessManager *nam;
51+
QNetworkAccessManager *imgDlnam;
52+
FileManager *fm;
53+
54+
void parseClassmatesJson(QJsonObject object);
55+
void sortClassmates();
56+
void setupConnections();
57+
void downloadImage(std::string *url);
58+
59+
signals: // NOLINT
60+
void classmatesReceived();
61+
void imageDownloaded(std::string *filename);
62+
};
63+
64+
#endif // INCLUDE_DATA_CLASSMATE_HPP_

include/types/Course.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <include/types/NetworkFile.hpp>
1111
#include <include/types/ClassTime.hpp>
1212
#include <include/data/Homework.hpp>
13+
#include <include/data/Classmate.hpp>
1314
#include <QJsonObject>
1415
#include <string>
1516
#include <vector>
@@ -39,10 +40,13 @@ class Course {
3940
void setTimes(std::vector<ClassTime> *times);
4041
Homework *getHomeworkObj() const;
4142
void setHomeworkObj(Homework *homeworkObj);
43+
Classmate *getClassMateObj() const;
44+
void setClassmateObj(Classmate *classmateObj);
4245
std::string *getCourseCodeWithSpaces() const;
4346
void setCourseCodeWithSpaces(std::string *courseCodeWithSpaces);
4447

4548
void loadHomework(Login *login);
49+
void loadStudents(Login *login);
4650

4751
private:
4852
std::string *name;
@@ -56,6 +60,7 @@ class Course {
5660
std::vector<Student *> *students;
5761
std::vector<NetworkFile *> *files;
5862
Homework *homeworkObj;
63+
Classmate *classmateObj;
5964
};
6065

6166
#endif // INCLUDE_TYPES_COURSE_HPP_

include/ui/ClassroomView.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@
99
#include <include/ui/ClassroomViewItem.hpp>
1010
#include <QWidget>
1111
#include <QGridLayout>
12+
#include <string>
1213
#include <vector>
1314

1415
class ClassroomView : public QWidget {
16+
Q_OBJECT
17+
1518
public:
1619
explicit ClassroomView(Course *course);
1720
void setup();
@@ -20,6 +23,9 @@ class ClassroomView : public QWidget {
2023
Course *course;
2124
QGridLayout *grid;
2225
std::vector<ClassroomViewItem*> *classroomViewItems;
26+
27+
private slots: // NOLINT
28+
void updatePhoto(std::string *filename);
2329
};
2430

2531
#endif // INCLUDE_UI_CLASSROOMVIEW_HPP_

include/ui/ClassroomViewItem.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@
1212

1313
class ClassroomViewItem : public QWidget {
1414
public:
15+
Student *student;
16+
1517
explicit ClassroomViewItem(Student *student);
1618
void setup();
19+
void updateImage();
1720

1821
private:
1922
QVBoxLayout *verticalLayout;

include/ui/CourseView.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ class CourseView : public QWidget {
3131
ClassroomView *classroomView;
3232

3333
void setupTabBar();
34-
void setupFileView();
35-
void setupClassroomView();
3634

3735
private slots: // NOLINT
3836
void tabBarClicked();
3937
void setupAssignmentView();
38+
void setupFileView();
39+
void setupClassroomView();
4040
};
4141

4242
#endif // INCLUDE_UI_COURSEVIEW_HPP_

src/data/Classmate.cpp

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
/**
2+
* Copyright 2018 <David Corbin, Mitchell Harvey>
3+
*/
4+
5+
#include <include/data/Classmate.hpp>
6+
#include <string>
7+
#include <vector>
8+
#include <algorithm>
9+
10+
#define CLASSMATE_URL "http://localhost:8080/1/class/"
11+
#define HTTP_CONTENT_TYPE "application/json"
12+
#define MYGCC_BASE "https://my.gcc.edu"
13+
#define IMAGE_CACHE_DIR "/imgcache"
14+
15+
Classmate::Classmate(Login *login) : login(login) {
16+
classmatesRec = false;
17+
students = new std::vector<Student *>();
18+
nam = new QNetworkAccessManager;
19+
imgDlnam = new QNetworkAccessManager;
20+
fm = new FileManager();
21+
setupConnections();
22+
}
23+
24+
Classmate::Classmate() {
25+
classmatesRec = false;
26+
students = new std::vector<Student *>();
27+
nam = new QNetworkAccessManager;
28+
imgDlnam = new QNetworkAccessManager;
29+
fm = new FileManager();
30+
setupConnections();
31+
}
32+
33+
void Classmate::setupConnections() {
34+
QObject::connect(nam, &QNetworkAccessManager::finished,
35+
[=](QNetworkReply *reply) -> void {
36+
if (reply->error()) {
37+
if (reply->error() ==
38+
QNetworkReply::ConnectionRefusedError) {
39+
QJsonObject emptyObject;
40+
parseClassmatesJson(emptyObject);
41+
return;
42+
}
43+
qDebug() << "Error:" << reply->errorString();
44+
return;
45+
}
46+
auto response = reply->readAll();
47+
QJsonDocument loadDoc(QJsonDocument::fromJson(response));
48+
49+
// If invalid json object, return
50+
if (!loadDoc.isObject()) {
51+
qDebug("Invalid json response: expected json object");
52+
return;
53+
}
54+
55+
classmatesRec = true;
56+
qDebug() << "Retrieved classmates for" <<
57+
courseCode->c_str();
58+
parseClassmatesJson(loadDoc.object());
59+
});
60+
61+
QObject::connect(imgDlnam, &QNetworkAccessManager::finished,
62+
[=](QNetworkReply *reply) -> void {
63+
auto reply_url = reply->url().toString().toLower().toStdString();
64+
unsigned first = reply_url.find_last_of("/");
65+
unsigned last = reply_url.find("?");
66+
auto filename = reply_url.substr(first+1, last-first-1);
67+
68+
auto dd = fm->getDataDir();
69+
auto imageCacheDir = (new std::string(dd + IMAGE_CACHE_DIR))->c_str();
70+
71+
// Create image cached directory if it doesn't exist
72+
QDir dir(imageCacheDir);
73+
if (!dir.exists()) {
74+
qDebug() << "Creating image cache directory at:" << imageCacheDir;
75+
dir.mkdir(imageCacheDir);
76+
}
77+
78+
auto imagePath = (new std::string
79+
(dd + IMAGE_CACHE_DIR + "/" + filename))->c_str();
80+
81+
QByteArray downloadedData = reply->readAll();
82+
QFile newImg(imagePath);
83+
if (newImg.exists()) {
84+
emit imageDownloaded(new std::string(filename));
85+
return;
86+
}
87+
if (newImg.open(QIODevice::WriteOnly)) {
88+
newImg.write(downloadedData);
89+
}
90+
newImg.close();
91+
92+
reply->deleteLater();
93+
94+
emit imageDownloaded(new std::string(filename));
95+
});
96+
}
97+
98+
void Classmate::loadClassmates(std::string *token, std::string *courseCode) {
99+
Classmate::courseCode = courseCode;
100+
std::string cc = std::string(*courseCode);
101+
std::string url = std::string(CLASSMATE_URL) + cc + "/collaboration";
102+
QNetworkRequest request(QUrl(url.c_str()));
103+
request.setHeader(QNetworkRequest::ContentTypeHeader, HTTP_CONTENT_TYPE);
104+
request.setRawHeader("Authorization",
105+
(QString::fromStdString(*token)).toUtf8());
106+
nam->get(request);
107+
}
108+
109+
void Classmate::parseClassmatesJson(QJsonObject object) {
110+
auto dataKey = object.take("data");
111+
if (!dataKey.isArray()) {
112+
qWarning("Error: JSON array expected");
113+
return;
114+
}
115+
auto collabArray = dataKey.toArray();
116+
for (const auto& studentObj : collabArray) {
117+
if (!studentObj.isObject()) {
118+
qWarning("Error: JSON object expected");
119+
return;
120+
}
121+
auto studentData = studentObj.toObject();
122+
123+
auto image_url = studentData["image"].toString().toStdString();
124+
auto isFaculty = studentData["isFaculty"].toBool();
125+
auto name = studentData["name"].toString().toStdString();
126+
auto idNum = studentData["id"].toString().toInt();
127+
128+
downloadImage(new std::string(image_url));
129+
130+
auto *student = new Student(new std::string(image_url),
131+
isFaculty,
132+
new std::string(name),
133+
idNum);
134+
students->push_back(student);
135+
}
136+
137+
sortClassmates();
138+
139+
emit classmatesReceived();
140+
}
141+
142+
void Classmate::sortClassmates() {
143+
}
144+
145+
void Classmate::downloadImage(std::string *url) {
146+
unsigned first = url->find_last_of("/");
147+
unsigned last = url->find("?");
148+
auto filename = url->substr(first+1, last-first-1);
149+
150+
auto imagePath = (new std::string
151+
(fm->getDataDir() + IMAGE_CACHE_DIR + "/" + filename))->c_str();
152+
153+
QFile img(imagePath);
154+
if (img.exists()) {
155+
emit imageDownloaded(new std::string(filename));
156+
return;
157+
}
158+
159+
auto full_url = QUrl((MYGCC_BASE + *url).c_str());
160+
QNetworkRequest request(full_url);
161+
imgDlnam->get(request);
162+
}
163+
164+
Login *Classmate::getLogin() const {
165+
return login;
166+
}
167+
168+
void Classmate::setLogin(Login *login) {
169+
Classmate::login = login;
170+
}
171+
172+
std::vector<Student *> *Classmate::getClassmates() const {
173+
return students;
174+
}

src/data/Schedule.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,6 @@ void Schedule::setScheduleRetrieved(bool scheduleRetrieved) {
8181
void Schedule::getHomework() {
8282
for (auto cour : *coursesS) {
8383
cour->loadHomework(login);
84+
cour->loadStudents(login);
8485
}
8586
}

src/types/Course.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Course::Course(std::string *name,
1818
professor = new std::vector<std::string *>();
1919
times = new std::vector<ClassTime>();
2020
homeworkObj = new Homework();
21+
classmateObj = new Classmate();
2122
}
2223

2324
Course::Course(QJsonObject jsonObject) {
@@ -67,6 +68,7 @@ Course::Course(QJsonObject jsonObject) {
6768
}
6869

6970
homeworkObj = new Homework();
71+
classmateObj = new Classmate();
7072
}
7173

7274
std::string* Course::getName() {
@@ -77,6 +79,11 @@ std::string* Course::getCourseCode() {
7779
return courseCode;
7880
}
7981

82+
void Course::loadStudents(Login *login) {
83+
classmateObj->setLogin(login);
84+
classmateObj->loadClassmates(login->getApiToken(), courseCode);
85+
}
86+
8087
void Course::addStudent(Student *student) {
8188
students->push_back(student);
8289
}
@@ -146,6 +153,14 @@ void Course::setHomeworkObj(Homework *homeworkObj) {
146153
Course::homeworkObj = homeworkObj;
147154
}
148155

156+
Classmate *Course::getClassMateObj() const {
157+
return classmateObj;
158+
}
159+
160+
void Course::setClassmateObj(Classmate *classmateObj) {
161+
Course::classmateObj = classmateObj;
162+
}
163+
149164
std::string *Course::getCourseCodeWithSpaces() const {
150165
return courseCodeWithSpaces;
151166
}

0 commit comments

Comments
 (0)