Inspiration

Now that all classes are online, it's been exponentially more difficult to stay organized. Some students use the built-in calendar on Canvas to keep track of their classes and assignments, but this calendar is often cluttered with events from other discussion sections or office hours that you may not want to attend. This calendar also is barely customizable, so some students choose to use other online calendars such as Google Calendar.

We wanted to create something that helps users declutter their Canvas calendar to improve the viability of the export calendar feature that already exists in Canvas.

Note: This only works for UC Davis Canvas calendars. If you are not a current UC Davis student but would still like to demo this project, you can try it with this link.

What it does

CalCleaner takes a Canvas calendar link (.ics) and gives back a decluttered calendar (.ics) according the the user's specifications.

Decluttering

Problem: Canvas calendar often has unwanted events such as other discussion section Zoom meetings and office hours.

Solution: Users can remove events that contain certain words/phrases with our blacklist feature.

Problem: Exported Canvas calendar contains remnants of previous classes even when they are over.

Solution: Users can set a start date and end date for their calendar.

Problem: Exported Canvas Calendar only contains individual events, making it difficult to edit events even in web tools such as Google Calendar.

Solution: Events are automatically made recurring, allowing for users to change settings for all recurring events easily. There is also a feature to split each class into a different calendar.

Problem: While manually adding classes to calendar web tools such as Google Calendar may not take too long because they are recurring, individually adding assignments from Canvas to Google Calendar is tedious.

Solution: Users can opt to only get a calendar containing assignments and tests.

How we built it

Tim: We used React.js for the front end to allow us to fully customize every aspect of the user interface and experience.

Aidan: To connect our frontend to backend, a RESTful API was implemented using flask-restx. Rest-X allows us to route our API endpoints so it is easily callable by the the JS frontend. Marshmallow was used to develop schemas that model the incoming JSON payload and load into into python dictionary. RestX also provides an easy graphical interface to document and test API functionality.

Peter: I implemented the recurring event feature in the backend. I used Python with the icalendar package which converted .ics files into Calendar and Event objects.

Jun: I implemented the functions for filtering the raw .ics data using Python and the icalendar library. The user's specifications for the filtering is given to the script in the form of a dictionary. The script then takes in the specifications and outputs a filtered .ics file accordingly. The script also takes care of generating multiple files with unique names when seperating the calendar by classes.

Challenges we ran into

Tim: Since we've all never interacted with a full stack before, it was quite a challenge to integrate everything together.

Aidan: We encountered issues creating the REStful API, as I was unfamiliar with how it is supposed to be used. Additionally, some libraries were unable to process the data as we wished. Therefore, we had trouble coverting the JSON payload into data that could be processed by the backend scripts. Some of the library documentation was also unclear, making it difficult to implement some features.

Peter: The icalendar package I used had little documentation so I had to read the source code in order to understand how to use the package. This was also my first time using Python so I had to spend a lot of time just figuring out how to implement simple features like loops.

I also had trouble with figuring out which event should be recurring. The Canvas calendar file denotes each event as an individual event with a unique ID, so I had to compare the names of the events to solve this. However, events with the same name are not necessarily recurring, so I ended up having to compare the event names and times to see if they were weekly recurrences. Also, the icalendar package did not have support for an event recurring multiple times per week.

Jun: Getting accquainted with the iCalendar package was a bit of a challenge. I also had to familliarize myself with the .ics format and figure out what attributes needed looked for when filtering. For example, what class an event belongs to can't be recognized from the summary because a math lecture may be simply named "Lecture." Instead we need to look for a 6-digit code in the 'URL' attribute in the .ics file that is unique for each course. Splitting the calendars based on classes was also difficult, as each event had to correctly be categorized and the .ics files had to be given unique names.

Accomplishments that we're proud of

Tim: I'm proud of the fact that in the end, we were able to create a full-stack functioning project.

Aidan: I'm proud that we were able to develop a full-stack project with a middleman API, even with our limited experience in this development field. Developing the API was stressful, but I'm happy that were able to solve most of the issues.

Peter: I'm happy that I actually managed to get the feature working because I was so lost in the beginning of the project. I spent around 6 hours to understand the icalendar package and Python. I then spent 6 more hours writing the feature, but then had to scrap it due to a major bug. I restarted and completed it much faster the second time.

Jun: I'm proud of the whole filtering process. Seeing the decluttered schedule in my google calendar and comparing that with the original schedule was also satisfying, and I had a bit of fun toggling between the two. I'm also proud of how our team effectively split off into frontend/API/.ics files and communicated to put everything together.

What we learned

Tim: I learned even more about working on the front end and UX development.

Aidan: This project allowed me to learn a lot about APIs and web development in general. I'm glad we were able to effectively collaborate to put together a somewhat functioning project, while learning new languages and frameworks along the way.

Peter: I'm happy that I actually managed to get the feature working because I was so lost in the beginning of the project. I spent around 6 hours to understand the icalendar package and Python. I then spent 6 more hours writing the feature, but then had to scrap it due to a major bug. I restarted and completed it much faster the second time.

Jun: I've never worked on a full stack project before, so I had no idea how the user's input would be delivered to the Python script. Communicating with the team members that were working on the frontend/API gave me a look into the process.

What's next for CalCleaner

We want to add more features such as color coding events, whitelisting, and setting up notifications for events.

Share this project:

Updates