 Good afternoon everyone, I am Bharat, this is Kanika and Komal and our project is to develop a notification system to the existing collaborative community's portal. So nowadays in all the modern consumer web applications, notification system has become a very important part of it. So in collaborative community's portal, the main job of notification system is to keep the users updated about all the events which are happening in the system. So the main motivation behind this is that we wanted to simplify the process through which a user needs to go in order to keep himself updated with all the activities happening in the system. So these are few technologies used by us in this project and those two frameworks are used for building notifications and feeds which we will talk about in the next section. We basically divided the notification system into two subsystems, one for sending personal notifications and therefore feeds. So what is the difference is that basically notifications and feeds, they are similar in the sense that both of them are used for sending some messages or some information to the users. But the difference is that one is specific to users. This personal notifications is specific for a particular user whereas feeds are common to members of a community or members of a group. So this is actually the workflow of the Django notifications framework. We use this framework to build the notifications. So whenever an activity occurs in the system, a notification signal is sent and all the attributes which are given to that signal define that activity and when that signal is sent, it is saved to database as an instance and then when the user goes to notification tab, they are retrieved from database and they are filtered based on the recipient and then they are showed to the user. And it is similar for Django activity stream which we used for, Django activity stream is the framework which we used for building feeds and it is similar, the only difference is that feeds are filtered on basis of the recipient rather than a particular user. So these are the features we have given to our notifications or feeds that are the basic features that is marked as red, marked as unread, delete, delete all unread or delete all red. The basic, the major feature of our notification or feed is the linking part that is like our notifications looks like this and if you will click to this PQR group, it will redirect you to this group and it will be automatically marked as red. What was the major feature and the basic features are here like you can delete an individual notification and you can mark any notification as red or unread or this all notification and unread notification are basically the filters and mark as red, unread, delete, all delete, red and delete, unread are the functionalities we provided for our notifications. And yeah, so for a notification or a feed to exist, there must exist some events. So be it a community or a group, the major event is joining or leaving to a community or there may be article state change or there may be role changes in community or a group. So here is the flow chart of all the article state changes, be it a community or a group or the role management of author, publisher or admin. So each arrow here depicts a notification or a feed or both. So yeah, this is the basic structure we kept for notification and feed and this target, verb, sender, these are all arguments that are sent along with our signal that will further put it into our database and these underlined ones are the links we have given to notification or feed. So for example, suppose article state is changed from publishable to published. So author should get a notification saying that congratulations, your article got published. So this is the example where sender is publisher because a publisher can only publish the article and recipient will be the author itself and it's the notification generated saying that your article got published. So the feeds, as she said, when an article state is changed from publishable to published, the author of the article gets a notification saying that your article has been published along with that a feed is sent in the community to all the members so that they come to know about the published article. Feeds are sent using action signal. So these are the arguments which are sent and this is the structure of a feed. IIT Bombay is the name of the article and the verb is article has been published and root is the author of the article. So the main challenge in the notification system was to make it real time. For example, when a new notification comes, the user doesn't have to refresh the page to check for the upcoming notifications. For that, we added a batch which shows the under notification count which updates itself without page refresh and this is done using a JavaScript API which sends HTTP requests at regular intervals of time. Futurescope right now sending requests at regular intervals of time consumes a lot of resources. So this problem can be overcome by the use of web sockets and the notification system has not been integrated with the reputation system. Like when an event occurs due to a user's reputation, notification is not sent in that case. Thank you. So actually event logging their work is to store all the events which are occurring and corresponding to each event which occurs, we are sending a notification or a feed. So that part is done only the part related to reputation. Like for example, an author's reputation goes down. So we are not sending a feed to the community that this reputation has gone down. So since these projects were independent, so the integration of reputation system and notification system has not been done but otherwise corresponding to all the events which are occurring right now in collaborative communities, all the notifications and feeds are going. But maybe this can be integrated with that. This is very easy to integrate but it was like their system got integrated a bit later and our system had been joined. So somewhere I saw also the term called group. So what's the difference between community and group? The difference between a community has certain groups. A group can be public or private group. For example, there is a community named Psyche. Okay, it's just like a sub-community. So just one more thing, it's maybe common to all the people working on collaborative systems. Like somewhere I felt that you are not considering edits after an article has been published. Once an article has been published, it cannot be edited. It cannot be edited. But in fact, papers are itself being retracted these days. Yeah, it's not a major issue but yes, it's right. Refining is done. Like if an article is in draft state and it changes to visible state. Visible state that means only community members can edit it. So they can refine it to a bit more level. It's not published yet. So they'll refine it. And then after visible state, it will move to publishable state. That is only publishers can refine or edit or view it. Then if publisher feels so that it can be published and it is refined and it is good, then the article will be published. So then it can't be edited anymore. But there is a refinement going on. So it is a separate system, independent system, correct? So how easy or difficult is it to combine with or attach it with some other system? So we have used frameworks. We have used Django framework and Django notification framework. And for feed, we have used activity stream framework. All we used is the function provided by them. So we modularized our code and we just made a new separate app. So it's like using that framework would be very easy. You just have to design your own display and template and that's it. According to your needs. So basically my system should have an event logging mechanism. No. It's not that. Already merged. So event logging and this as a combined unit can be used in some other system. But again, we have to look into several features because once the event is there, it is for what you said you are not displaying. So some community member got a vote down. So a reputation system goes down for some and that event is there. And that event comes to your feed or not. No, it doesn't come. It's like we are sending. Suppose for example, we are sending a notification when a role gets demoted or promoted. So suppose someone is publisher and its reputation goes down and he becomes an author now. So he will get a notification that you are no more a publisher now because he should be informed. Okay. He or she should be informed. So that will be implemented with reputation system. Event logging. So the event, okay, not event. So there's an event that some person's reputation goes down. Okay. Then reputation system also goes down. Okay. It's like suppose you click on some button. Suppose there is any event. I mean we are sending the notification and event being stored. These two are happening. No, that I got that you are sending notification. But there are some rules on which you are sending notification. Correct. So you are filtering some things. So for example, that if reputation system goes down, so you are filtering it to decide whether this need to be sent to an author or to group or to nobody. Correct. So if I have a system and I want to use your system, that also means that I need to program your system in some manner so that it can understand the verbs or the functionality of my system. Okay. So can that be modularized? So at least that particular thing that what are the events and what should be the feed? At least that should be modularized. So it will be very easy to integrate their system. Yes. Okay. Thank you. Hi. I have a question. So you said the regular intervals. So how frequent are those? Right now it's five seconds but you can change it. So how frequent are you willing to go before you go to WebSockets? No, no, no. I'm just saying. I'm just saying how about you make it one second? Yeah. So why did you not use WebSockets? This functionality was provided by the framework itself. Okay. So when do you think would the WebSocket make sense? At what frequency do you think the WebSocket would make sense? WebSockets maintain a continuous. Yeah. WebSockets will consume much less resources than those. So I will just say just read on this because on non-chrome browsers, the WebSocket implementation is still a pooled Ajax request. Yes. So if you're not on Chrome, then your users are still going to be following the same thing. There is something called Django channels. So what it basically does is whenever you like, if you implement your system using that, it will check whether the browser is compatible with WebSockets or not. If at all it's not compatible, then it will fall back to things like long polling, polling, short polling, those kind of things. Cool. Thank you.