farkam135 / myrmey-assist Goto Github PK
View Code? Open in Web Editor NEWThe all-in-one UCI SOC
Home Page: https://myrmeyassist.com
License: MIT License
The all-in-one UCI SOC
Home Page: https://myrmeyassist.com
License: MIT License
Create a POST /api/addCompletedCourse
and POST /api/removeCompletedCourse
that takes in 2 parameters, the student's myrmeyid jwt and the name of a course to add to their completed list or remove. The handler should then verify the myrmeyid and use their hashed id
in the myrmeyid payload and the course name parameter to call MYRMEYDB.addCompletedCourse and MYRMEYDB.removeCompletedCourse (needs to be added to myrmeydb as well) and return the result.
Currently year_term is pulled automatically but this creates issues with summer sessions
Create an in house ratemyprofessor. Create a professors table that has all the professors and their ratings and allow students to add ratings if they have had the professor before.
We will need a postgreSQL instance setup to store grades and additional student courses. Setup a table called grades and courses and create a connection to the instance within server.js.
grades table columns:
courses table columns:
i can't log in
Component that represents the UCI WebSoc search results.
The search results are a list of course titles along with their course offerings. The course offerings should be their own component! Refer to the results page of any search on UCI's WebSoc.
addCourseOffering: Function that is called when a user adds a course offering to their planned list. Should pass the course offering object that was added as a parameter.
courses: The search results to display.
Example courses:
[
{
"dept": "COMPSCI",
"num": "113",
"name": "CMPTR GAME DEVLPMNT",
"offerings": [
{
"Code": "34010",
"Type": "Lec",
"Sec": "A",
"Units": "4",
"Instructor": [
"DENENBERG, D.",
"DEVANIRA, D.",
"BAER, N."
],
"Time": "MWF 5:00- 5:50p",
"Place": {
"value": "HG 1800",
"href": "http://www.classrooms.uci.edu/GAC/HG1800.html"
},
"Max": "131",
"Enr": "73 / 110",
"WL": "n/a",
"Req": "183",
"Rstr": "A",
"Textbooks": {
"value": "Bookstore",
"href": "http://uci.bncollege.com"
},
"Web": {
"value": "Web",
"href": "http://www.ics.uci.edu/~ddenenbe/113-125/"
},
"Status": "OPEN"
}
]
},
{
"dept": "COMPSCI",
"num": "115",
"name": "COMPUTER SIMULATION",
"offerings": [
{
"Code": "34020",
"Type": "Lec",
"Sec": "A",
"Units": "4",
"Instructor": [
"HAYES, W.",
"STAHLHEBER, S."
],
"Time": "TuTh 2:00- 3:20p",
"Place": {
"value": "PSCB 140",
"href": "http://www.classrooms.uci.edu/GAC/PSCB140.html"
},
"Max": "75",
"Enr": "51",
"WL": "n/a",
"Req": "179",
"Rstr": "A",
"Textbooks": {
"value": "Bookstore",
"href": "http://uci.bncollege.com"
},
"Web": {
"value": "Web",
"href": "http://www.ics.uci.edu/~wayne/courses/cs115/"
},
"Status": "OPEN"
}
]
}
]
Note: For offering fields that are objects (i.e. Textbooks, Web, Place). Recreate the hyperlink using value as the text and href as the ref.
Develop a degreeworks component that lists out a student's degreeworks and their progress to graduate, should also show course offerings that satisfy certain requirements. More details on props coming...
Used to show information about a course. The full title, description, prereqs, professor's teaching it and their grade distributions, as well as the expected grade of the student.
course: The course object
Example:
{
"COMPSCI 161": {
"offerings": [
{
"Code": "34190",
"Type": "Lec",
"Sec": "A",
"Units": "4",
"Instructor": [
"DILLENCOURT, M."
],
"Time": "MWF 3:00- 3:50p",
"Place": {
"value": "SSLH 100",
"href": "http://www.classrooms.uci.edu/GAC/SSLH100.html"
},
"Rstr": "A and N",
"Textbooks": {
"value": "Bookstore",
"href": "http://uci.bncollege.com"
},
"Web": {
"value": "Web",
"href": "http://www.ics.uci.edu/~dillenco/compsci161/"
}
},
{
"Code": "34191",
"Type": "Dis",
"Sec": "1",
"Units": "0",
"Instructor": [
"JORGENSEN, J.",
"DILLENCOURT, M."
],
"Time": "TuTh 5:00- 5:50p",
"Place": {
"value": "SH 134",
"href": "http://www.classrooms.uci.edu/GAC/SH134.html"
},
"Rstr": "A and N",
"Textbooks": {
"value": "Bookstore",
"href": "http://uci.bncollege.com"
},
"Web": " "
},
{
"Code": "34192",
"Type": "Dis",
"Sec": "2",
"Units": "0",
"Instructor": [
"ASCENSAO FERRE, P.",
"DILLENCOURT, M."
],
"Time": "TuTh 6:00- 6:50p",
"Place": {
"value": "SH 134",
"href": "http://www.classrooms.uci.edu/GAC/SH134.html"
},
"Rstr": "A and N",
"Textbooks": {
"value": "Bookstore",
"href": "http://uci.bncollege.com"
},
"Web": " "
},
{
"Code": "34193",
"Type": "Dis",
"Sec": "3",
"Units": "0",
"Instructor": [
"KUMAR, A.",
"DILLENCOURT, M."
],
"Time": "TuTh 7:00- 7:50p",
"Place": {
"value": "SSL 270",
"href": "http://www.classrooms.uci.edu/GAC/SSL270.html"
},
"Rstr": "A and N",
"Textbooks": {
"value": "Bookstore",
"href": "http://uci.bncollege.com"
},
"Web": " "
},
{
"Code": "34194",
"Type": "Dis",
"Sec": "4",
"Units": "0",
"Instructor": [
"JORGENSEN, J.",
"KUMAR, A.",
"ASCENSAO FERRE, P."
],
"Time": "TuTh 8:00- 8:50p",
"Place": {
"value": "SSL 270",
"href": "http://www.classrooms.uci.edu/GAC/SSL270.html"
},
"Rstr": "A and N",
"Textbooks": {
"value": "Bookstore",
"href": "http://uci.bncollege.com"
},
"Web": " "
}
],
"dept": "COMPSCI",
"num": "161",
"name": "DES&ANALYS OF ALGOR",
"prereqs": [
[
"I&C SCI 23",
"CSE 23",
"I&C SCI H23",
"I&C SCI 46",
"CSE 46"
],
[
"I&C SCI 6B"
],
[
"I&C SCI 6D"
],
[
"MATH 2B",
"AP CALCULUS BC"
]
],
"fullName": "Design and Analysis of Algorithms",
"description": "Techniques for efficient algorithm design, including divide-and-conquer and dynamic programming, and time/space analysis. Fast algorithms for problems applicable to networks, computer games, and scientific computing, such as sorting, shortest paths, minimum spanning trees, network flow, and pattern matching.",
"gradeDistribution": {
"DILLENCOURT, M.": {
"total": 150,
"F": 150
}
}
}
}
The inspector is a component used to render another component as well as contain quick tabs to quickly switch to other components. The inspector component is what will be to the right of the calendar at all times.
pushScreen: Function that is called to push a screen onto the inspector. An object with {screenName: string, data: object}
popScreen: Function that is called to pop a screen off the inspector (go back)
All the data retrieved and set in this.state.user in App.js should be moved to a redux store.
Develop a component that shows the grade distribution given professors and grades. The table should just be a (1+p)x7 table where the top row are the headers (which would be the instructor + grades + total count) and the bottom row would be a % which represents how many % of students got that grade.
grades: An array of object with they keys being the letter grade and the value being the count, + a key total with the total # of grades counted.
Example:
[
{
"instructor": {
id: 123456789,
name: "Dr. Professor"
},
"total": 8,
"F": 0,
"D": 1,
"C": 1,
"B": 3,
"A": 3
}]
Instructor | A | B | C | D | F | TOTAL # OF GRADES |
---|---|---|---|---|---|---|
Dr. Professor | 82% | 15% | 3% | 0% | 0% | 12 |
Currently the only information students get back when logging in is the information pulled from uci. However as more services are built around MyrmeyAssist we need a way to authenticate users. We cannot use just their student id and name since that can be spoofed, and we don't want to store any of their personal info on the server so we need to develop a myrmeyid using jwt. Currently the only other services we have linked to MyrmeyAssist that requires some form of authentication is MyrmeyMessenger and the ML server (MyrmeyPredict?). The MyrmeyPredict server needs to know the student's hashed id (student id + full name + salt) in order to find their grades and MyrmeyMessenger needs to know what courses the student is enrolled in so they can fetch and send messages to that course's channel. So when a user is logged in MyrmeyServer should create a jwt with the payload representing with the secret being the same secret that is used in hashing their id:
{
id: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
courses: ['CS 161','CS 177','CS 178','CS 143B']
}
and send it back in the key 'myrmeyid'.
Develop a component that acts as a week calendar showing students what times and days their classes are. The component should stretch vertically and horizontally filling up all available space. There should be a minimum amount of time per slot so if the vertical window gets too small the calendar starts to scroll.
courses: An object containing course objects.
Example:
{
"COMPSCI 143B": {
"YearTerm": "2017-92",
"code": "34150",
"days": "Tu Th",
"dept": "COMPSCI",
"instructor": "BIC, L.",
"location": "BS3 1200",
"num": "143B",
"time": "12:30- 1:50p",
"title": "PROJ IN OPERATING SYS"
},
"COMPSCI 161": {
"YearTerm": "2017-92",
"code": "34190",
"days": "Mo We Fr",
"dept": "COMPSCI",
"instructor": "DILLENCOURT, M.",
"location": "SSLH 100",
"num": "161",
"time": "3:00- 3:50p",
"title": "DES&ANALYS OF ALGOR",
"DIS": {
...
}
},
...
}
Note how if a course has a discussion class or lab class that is a key within the course object and the keys of the DIS or LAB will be another course object. On the calendar all courses should be different colors except they should share the same color as the corresponding DIS or LAB course.
Develop a ml data model using generated student grades to predict an expected grade. I think we should use the naive bayes model, since all the grades are independent of each other. We have to figure out how to create it with features that aren't just binary values, since each feature (course) has 14 values (A+,A,A-,B+,...,F). Also we shouldn't expect an exact match, if Jon took CS 1, CS 2, CS 3 and got a 'B+' in all of them, and Ryan took CS 1, CS 2 and got an 'A' in both of them, then an A should be predicted for Ryan taking CS 3. For now our base classifier (or a freshie/transfer) should just be the most probable grade given a professor and course.
Add inspector navigation functions and configuration to App.
The inspector consists of an object "inspectorScreens" where the keys are just screen names and the value is the actual screen component. There should be a pushScreen and popScreen function.
Create a courses_planned table in postgresql that has 2 columns, the hashed id, and the course code of the planned course. There should be 2 helper functions in myrmeydb.js, a get planned courses which pulls the course codes and runs a searchSchedule on them to get the full course object and a delete planned course which takes a hashed id and course code and removes it from the db table. This should then be called in getStudentData in server.js and added to the courses object under key 'planned'.
Add the /api/searchSchedule post which should accept a search object (body will be application/json), run the UCI.SOC.searchSchedule function and return the result. For details on the input check out the searchSchedule function in the UCI-API repo in the ucisoc resource.
For the searchSchedule handler make sure to convert them to objects and assign their ratemyprofessor details, for example:
UCI-API searchSchedule will return something like this for instructors:
['Prof, A.','Prof, B.']
the searchSchedule handler should use UCI.PROFS.getProfessor for each of those and convert it to such:
[
{
"name": "Prof, A.",
"rmp": {
"id": 123,
"rating": 5,
"firstName": "Arnold",
"lastName": "Prof",
"name": "Prof, A."
}
},
{
"name": "Prof, B."
}
]
In the example above for Prof, A. the rmp object is exactly what is returned from UCI.PROFS.getProfessor, notice how Prof, B. does not have a rmp object, that means either they aren't on rmp or they have no ratings, but even in that instance they should be converted to an object where the only key is then 'name'.
Add the /api/getCourseDetails post which should accept an array of course names (body will be application/json), run the UCI.SOC.getCourseDetails function and return the result. For details on the input check out the getCourseDetails function in the UCI-API repo in the ucisoc resource.
Create a watchlist so that students can add themselves to a watchlist to be notified when a given course code is no longer full.
Add a getGrades function to myrmeydb that takes in a search object and queries the db, returning back all the rows of the search.
search: Object that contains selectors for the db query. Possible keys: id, year_term, dept, num, instructor, grade. If search is not provided getGrades should return everything
example:
{
dept: 'COMPSCI',
num: '161'
}
Returns all grades received for COMPSCI 161.
An array of objects with the keys: id, year_term, dept, num, instructor, grade.
example:
[
{
id: '123',
year_term: '2017-03',
dept: 'COMPSCI',
num: '161',
instructor: 'DILLENCOURT, M.'
grade: 'A'
},
{
id: '124',
year_term: '2017-03',
dept: 'COMPSCI',
num: '161',
instructor: 'DILLENCOURT, M.'
grade: 'A+'
}
]
Component that represents the UCI WebSoc search.
Fields will be limited to Breadth, Dept Name, Course Code, Course Num, Division, Course Type, Full courses. Either a course code range, department, or breadth have to be specified before a search is submitted, so have some input validation. Refer to WebSoc and UCI-API/resources/ucisoc/searchSchedule for default values.
onSearch: Function that is called when a user hits search. Passed an object where the keys are search fields and values are the search values.
Example of onSearch parameter:
{
Breadth: "ANY",
Dept: "ALL",
CourseCodes: "",
CourseNum: "161",
Division: "ANY",
ClassType: "ALL",
FullCourses: "ANY"
}
On search schedule the final column is not being pulled.
Might be a UCI-API bug.
Change the SOC Search Component to represent the table similar to WebSOC
Currently there are courses where the OPT is nothing, so student's don't get a grade in that class. I don't know what those classes are, but I don't believe we need to show them, since they don't have course days or a grade. Currently it pulls that class but even if it's completed since it doesn't have a grade it will always show as 'in progress'.
2 people should work on this ticket since the frontend and backend should be developed pretty close together.
Develop a backend server using socket.io (MyrmeyMessenger server) and a frontend component that connects to that backend server in order to create a realtime chatting system. The MyrmeyMessenger server should have a connection to the postgreSQL db, and interact with the 'messages' table. When an onconnect message is established the frontend component should send the MyrmeyMessenger their myrmeyid, this id is a jwt which contains their id (SHA256(student id + full name + salt)) as well as an array of courses they are enrolled in. The server should verify this jwt and send back the the message history of the courses they are enrolled in as well as the general uci channel. The same concept applies to sending messages, if a student sends a send message event it should check their myrmeyid to make sure they are authorized to send to that specific course channel. For now a simple text only solution will suffice, but if possible add custom emoji support. Here is a good module for a emoji picker that supports custom emojis: https://github.com/missive/emoji-mart
Develop a component that shows the prereqs of a course and whether or not the student meets the prereq. There should also be an add button, since the UCI-API only pulls UCI courses, transfer students would have to manually add a lot of courses they meet the prereq for from a transfer course, so if they don't meet a requirement there should be a button that adds that course.
studentCourses: An array of course names the student has already taken
Example:
['COMPSCI 121', 'COMPSCI 161','ICS 139W']
prereqs: A prereqs array. This is a 2-D array, each index in the main array represents requirements, each requirement has to be fulfilled to take the class. Each requirement is another array, in order for the requirement to be fulfilled only one of those classes have to be taken.
Example:
[
[
"I&C SCI 23",
"CSE 23",
"I&C SCI H23",
"I&C SCI 46",
"CSE 46"
],
[
"I&C SCI 6B"
],
[
"I&C SCI 6D"
],
[
"MATH 2B",
"AP CALCULUS BC"
]
]
In this example there are 4 requirements. In the first requirement if the student took any of those 5 classes the requirement is met, the 2nd and 3rd requirement are only met if they took 6B and 6D, and the 4th requirement is met if they took MATH 2B or AP CALC BC. So one possible combination of meeting all the requirements would be ['CSE 23','I&C SCI 6B','I&C SCI 6D','MATH 2B'].
addStudentCourse: A function that takes in a course name (i.e 'CS 161') and adds it to the student's taken courses.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.