 It happens in the rarest occasions. My daughter, she's two years old. She approaches me and touches my face with her little palms and whispers, the Pashut, the Pashut Mushlam. It's perfect. I really envy her having that ability to feel that everything is or can be perfect. I mean, if you're anything like me, which implies you've been living on earth for the past few years and you listen to the news every once in a while, you've probably reached the same side conclusion I've reached not long ago. We're going to lose. I could say more, but I probably don't have to. I have a feeling you know exactly what I'm talking about. Me and my brother are bolder climbing together twice a week. Before one of the climbing lessons, I told him I'm going to rewrite organic groups. He's an industrial designer, so he really doesn't know or care much about computers, but still he was interested in understanding why I'm doing it. Is it about getting to the essence of things, he asks? Shut up and start climbing, I say. And no, it's not. Even though he's my older brother, I climb better than him. So I tried to help him to solve this ridiculously complicated climbing route he's been trying to solve for almost a month. After a few more unsuccessful attempts, he asks me, is it because you got it wrong before? No, I say, but listen, concentrate. You need to catch the grip properly and bend your knee inside just a little more. After almost two hours, my brother is completely exhausted, physically and mentally. So what is it he asks while breathing heavily? I don't answer and just point my finger back to the climbing route. I like being tough with him. Two attempts later, he succeeds. If you've been climbing, you would know how the smallest movement and the most subtle change of the angle of the body makes a difference. I did it, he says, all excited. Yes, you did, I answer. You got it all right. He knows I wasn't talking only about climbing. He knows me well, my brother. We go back home happy. We're both thinking about the next climbing route we would like to try to solve next week. It's that time of the year again where my mother asked me to explain to her what's that exactly that I'm doing. You know how it is. You start with a very basic explanation, but you see that your mother is just staring at you. So you step back and you try to give even wider background to side building. 15 minutes later, you find yourself doing a silly puppet show trying to explain to her what the internet is. One hand is Mr. Internet and the other is Mrs. Browser. You're both frustrated, but for her it's even worse because your explanation made her feel old and stupid. So you stop, think a bit, and you say, you know, mom, honestly, I myself don't really understand how this internet is working. She likes that, and she's smiling again. She brings you coffee and the chocolate cake she made for you, the one that you love since childhood. Even though she already gave me the recipe, I'm unable to explain why it's so delicious. In a way, I would say, it seems that my mother's chocolate cake and the internet aren't so different from each other. I have this uncle that comes to us every Friday evening to our family dinner. Ever since I told him about Drupal, he calls me a communist. Do you get it? For six long years, every Friday evening, I hear that I'm a communist. And then it goes on and on about his investments in real technology as if he was at least Bill Gates and not my poor uncle. And I haven't even told you about his really annoying habit of taxing my dessert. You see, my uncle is 68 years old, but when it comes to my dessert, he's as fast as a young athlete. He shoves his spoon rapidly into my dessert and steals a far too big portion of it. Prim and Nocta, he calls it. No matter how many times I try to explain to him, it doesn't make any sense. Plus, very gross. Plus, learning history from Braveheart is very sad. But my uncle doesn't care. Prim and Nocta communist. Prim and Nocta, he gloats and another dessert goes down his throat. Two weeks ago, I told him about commerce guys, about how they got a funding of $5 million. Honestly, I didn't think it would have such an impact on him. He looked really disturbed. It seemed as if some kind of a fuse in his mind just burned, and as if his brain was unable to accept this piece of information about not real technology getting such a huge funding. He's my uncle and all, and I like him, but obviously he's a little crazy. So I'm not even trying to understand what goes in his mind. But this time, for the first time in six years, when his hand and spoon flew in the speed of light, trying to prim and noct my dessert, I caught it forcefully. And with my other hand, I took my own spoon, and while looking at him deep in the eyes, I slowly ate all his dessert. Power to the people, uncle, I said with my mouth full, power to the people. I think it's an ear infection again. I'll take her to the doctor tomorrow morning, my wife says, and pushes me to the side of the bed and gets inside with the kid. It's 5.30 a.m. and still dark outside. I was up until almost 2 a.m., busy rolling out another organic group's release. I should probably be feeling sleepy, but I'm not. I'm pretty energized. My head is still throbbing from too much computer hours, but I think I got it right this time. My daughter is very calm next to me, and at this point I know there is a 50-50 chance she'll either sleep or stay awake until the morning. I look at my wife and so does my child, and we see she's already fast asleep. We laugh quietly and then go back to staring at the ceiling. After some time, my daughter gets closer. It's good. It means we're going to sleep. I hug her, and then the most peculiar thing happens. You see, I'm 33 years old, and I know so much more than her. She's only two years old, and she knows so little. But still, somehow, seconds before we fall asleep, we have the exact same thought. The Pashut, the Pashut Muslim. Hello. So my name is Amitai Burstein. This is Brie Slanfa. We're from Gisra Company. You might have heard about us from models such as organic groups and message model, or from our sexually confused Drupal video tutorials such as deep preprocessing under the theme layer. And let me alter your page. Today, I would like to speak about organic groups seven. It's a rewrite, it has gone, undergone a rewrite, and I would like to cover it, all the new features and bug fixes and on. And first, let's talk about the goals of OG. Basically, I will go quickly over it. So first thing, what is OG, organic groups model? The first thing is about associating content, meaning one node belongs to another node, a user belongs to a node, and so on. Very similar to what we know as node reference model or user reference. The second is the roles and permissions per group. The same thing as we have roles and permissions site-wide, the same UI that we have. Basically, OG takes it and gives every group its own roles and permission. The second thing, I call it try to have more time, and it's basically about me being lazy and not trying to write too much code and just try to leverage other good models such as the field API, which is in Drupal core, or views, or entity API, and so on. A few months ago, Demian, from Commerce Guys, he released a new model called entity reference. And basically, when I saw this model, I said I can redefine my goal, because what I wanted is that entity reference, similar to node reference, similar to user reference, but you can reference every entity. Basically, entity reference will take care of all the referencing, all the associating the content. Organic groups will deal with only roles and permission, and basically, it will say I will have more time. However, after I decided this thing, I got an email from Demian saying, I'd like you to be commentator of entity reference. So I replied with an email. I said, thank you, Demian, I'm very flattered, but no, thanks, I prefer being lazy. So I got an email from him basically saying, I wasn't asking, I was telling you. So, okay, I got the attitude and I say, okay, listen, Demian, I have self-respect. I said no, so there's no freaking way in the world that I'm gonna do it. And then I got this email. As the commentator of entity reference, I had to again redefine my goals. So let's see, OG in action. Do you see it, okay, okay. So again, this session I will not cover because I've covered in many different sessions and there are lots of tutorials talking about how to approach a new project in OG. This session will be mostly covering all the new changes. So first, let's talk about really, what was the problem with OG and why it deserved a rewrite? So one of the problems of OG was that in a way it tried to be a bit too much flexible because up until now you had the node which was a group and in the same time you had an entity called the group which was the group. So the node ID and the group ID were different and basically you were able to reference from one field all the different groups in the site whether it was a node or user or whatever and as we say on the paper it sounded okay but it was a bit too flexible. That was the first thing so it made it a bit more, not a bit, more difficult to interact with other models such as views for example. And the second thing is we didn't need it in a way you can say that most models assume that when you are referencing a different entity it will always be that certain entity. It will be a node, it will be a user and we don't need to make it too flexible and entity reference it takes the same approach and what happens is OG is just interacting with entity, interacting with entity reference and just hooks in the correct places. So let's see the different content types for example we have here. I have a group and a post content type. Let me go into the managed fields. Again if you've been using OG7, the first version, the first brand sorry, you knew there was actually a hard coding on the field name, the group audience, that same field that associates content together, it was the field name was hard coded, it is no longer hard coded. If I'm editing the content type you can see that the UI changed a bit and I'm saying this content type is a group content and it's referencing one type of entity over here, this is the target type and the target bundles. Again if I'll go into the managed fields over here and I'll go into the settings, we can see we have different OG settings and one of the most important for us is this setting which is saying which groups does it reference and over here you can read my groups, other groups or all groups. One of the problem, another problem of OG that it had problems to scale, in what sense? When you are, if you have like, I don't know, 10,000 groups and you try to show all those 10,000 groups in a select list, then there is a problem. It won't scale or 100,000 groups and so it won't scale nicely. So what you actually want to have is probably a select list to show a user only my groups and an autocomplete field to show all the other groups. Let's, I'll show you it in action. Right now you can see we have two fields over here, the groups audience and the other groups and when I create a new content, a new post, here you can see I have a short select list showing only the groups that belong to me and in the other groups, all the groups that don't belong to me. So I can do over here, and I just try to add something and I'll save it. And that field that you actually saw over here, it's actually kind of a dummy field. Because if I'll go into the develop, using the develop model, you can see that only one field is holding both of the groups. The other groups isn't holding anything. Okay, and it makes sense when you're trying to build a view and you want to extract all the group information from one field, you don't want it from other groups because my groups and other groups definition is per user. Every user will see if they will try to edit the post, they will see it a bit differently because I'm as they admin. This is my group audience and the other group is something else. Another user, user demo, will see the select list of the my groups and the other groups differently according to his own groups. Okay, so over here, we are seeing a group, another small feature that OG in the two branch has is now when you're creating a group. Again, if you've been using OG before, you don't see anymore the checkbox of saying either it's a group or not a group. Basically, we're just hiding this field and when we save it, it becomes a group. And over here, what you see is this node view. This is actually, I'm using panels. I'm a very heavy panel's user. Sorry. This is panel just showing my node. It knows that it's a group and it calls the different views and different C tools, plugins. It needs. So, I'll open this same page as a demo user. Up until now, we saw it as an administrator and now I'll request a group membership. Please, please. Here nothing special here, but now the new thing is that now OG is using views bulk operation to administer the people per group. I see you are all excited. That's why you are clapping your hands. Okay, basically this is a view that you can control and show whatever you want. You have the request message and everything. And here I'd like to authorize demo user. So, I have different operations that I can do over here. Right now I'll set the state in the group to this user. I'll set it to active and the user is active. Okay, another change in OG and when we're talking about the roles and permission, basically OG's main focus is really having like subsections, mini sites in your own site that people can, different groups can easily manage themselves. What the difference in the second branch is right now we have, I would say, three layers of roles and permissions. The first layer, the topmost layer, it's the global roles and permission, okay? And the same as it's written over here, it's used for inheritance. We'll see in a minute what it means, the inheritance. Whatever checkbox you'll click over here, it has absolutely no effect on the user themselves. What does it affect? It affects what I call the per bundle roles and permissions. Bundle is Drupal's complex way of saying like there is a node in the node type, so it's actually the node and the bundle, okay? So over here I have two different node types that are groups, one I called group and one I call club, okay? Different group types. So what I have is that every node type, every per bundle has its own roles and permissions and it really makes sense if you think about it when you have different groups in your site, for example, one group will be clubs and one group will be restaurants and each group has different meaning and it should have different permission. In one group, a user should be able to create new content and in another group, it should be able to edit different content. So this is the per bundle. So over here, for example, we can see another new feature is that we have create permission right now. As you can see, our demo user is unable to create new content in the group. Right now, if I'll check create post comment under the node group, did I check? No, now I can create a post. So I'd like to show you this is something that it doesn't belong to OG itself, but this is interaction, this is a model called entity reference, sorry entity reference prepopulate. Again, this is because now we are using the entity reference model. So there is like a small ecosystem of different models that are leveraging entity reference. So the entity reference prepopulate model basically allows you to prepopulate a field. As you can see, I'm just passing in the URL down below on the top, on the bottom left, you can see the URL and when I click it, it prepopulates it. Again, all this definition about what action should the prepopulate take if there is something in the URL or if there isn't something in the URL, everything is defined in the field. So again, OG is trying to be very strict about the different field settings. I will just show you the over here, entity reference prepopulate. I'm just saying if for example I passed something in the URL, I passed a legitimate idea of the node that I want to prepopulate the field now, I can disable the field. Otherwise I can maybe hide the field if I want. So right now it's hidden. Let's just disable it. Okay, another thing, and now when we are talking about the fact that the field itself isn't hard coded, the name isn't hard coded, and I'm able to create different, I call it group audience fields. Let's create a new group audience field. So let's create demo ref. Just show you the process of how we're doing. We select an entity reference, let's make a select list for example. And over here, the entity selection mode, I select organic groups as you can see. It automatically recognizes which are the legitimate target bundles. In our case, which are the group types, and I can say these fields should specifically reference only the club nodes. It should not reference the group nodes. So now I'll have another field that will show me. I don't have any clubs that belong to me, so I'll create a new club. This means that as site administrators we can easily create different fields if we want to allow our user to select different groups and so on and just switch those fields. Just show them or hide them or do whatever we want. Another important thing, and this is, I don't know, I know there is a use case for that. I myself don't have the use case, but I never had the product that needed it, but there is in the issue queue a long issue about having what we call the field cardinality, meaning how many values can be in the field, and I'll explain it. Since we can have multiple group audience fields, so again we'll look at the post content type, look at the name, the name is OG group ref. Now I'll go to the user. The user again, it's an entity just like node entity, and in the user we see that the group membership is called OG user group ref. It's a different name, which means that I can, for example, set the field cardinality, that's the hardcore name of saying the number of values, instead of unlimited to one group. What does it mean? Right now, the setting's right now. It means that our post can be associated with unlimited number of groups, but the user can be subscribed only to one group, okay? So the user demo, for example, this is a new group. User demo doesn't see a link to subscribe to the group. Why? Because OG is smart enough to understand that we are unable to subscribe in. I mean, if I change the same settings again to unlimited, now we see the request, okay? So OG is very strict about, OG is very strict about all the different field settings, even if you try to programmatically save an entity, user or a node associated with another group, but the field cardinality doesn't allow it, it will throw an exception, okay? So as developers or site builders, you need to make sure you have a lot of power, a lot of flexibility over here, but as site builders, you need to make sure that you don't try to exceed the limitation of the field cardinality. The same thing goes, again, I'll change it. I'll change the number of values again to one. As we know, when in OG, when you create a new group, you are actually the group manager. It automatically subscribes you to that node. So what will happen again, will it work? When I try to create this group with the administrator user and I'll save it, it tells me that I cannot save it because the user admin cannot be subscribed to the group because, again, this is the field cardinality. If in your site you will see this, again, something that I'm saying that's in my opinion, if in your site when you're building it, the user will see this error message, it's best for usability, okay? You should have probably prevented them from accessing this create node page. However, OG is just trying to make sure you don't see any errors and stop you. But this is like the border, just safekeeping you. Another small thing that we have is if you've been using the OG access and you're familiar with the fact that, again, defining OG is, I don't think I've enabled OG access over here. Basically, OG access, you attach a field to the group and you attach a field to the post saying whether it should be private or public or whatever. Right now in the new branch, it's enough for you to attach that field to the group saying everything, every content under that group should be private and that's it. Every post that you will create will look at the group and will automatically become private. So you don't have to let your user select a different permission or do some work yourself. Questions until now? Up until now? Yeah. If, can you use that mic or? Before you got rid of the link, if they weren't able to do something, why not get rid of the create group link if they can't create new groups because they already have too many groups? You know what I mean? Yeah, I had the reason why I didn't do it, but. Ah, yeah, I remember. As administrator, I'm able to create a node but to change the author of it to somebody else. And that somebody else might be able, okay, so, let's just, okay. So user demo no longer has groups associated with him or her, I don't know. So when I'll save it for demo, it will allow me to save and it's a legitimate save. So that's the reason why I don't prevent access to the node. Any more questions up until now? Okay, so what I want to do is also talk. Basically, I could go a bit more about, yeah. Sorry, I got a bit late there. Is there a way to, I'm in a situation where I need to add a group to another group so the entire group has access to everything inside this other group? Sorry, again. Okay, so if I have one group, I need to invite an entire another group to be a part of their group to have access to some of the content. I'd love to see the model that does this. So, yeah, I mean, there's no such thing currently. Okay, so I could go and show you more features of OG but that's the most important stuff. And basically, I don't think it's very important to show you because the most important guy to show him new feature is probably Johann Falk from Node One that he does all the tutorials and he teaches much better than me. So what I'd like to do is talk about another model and that's the message model. Is there somebody here familiar with the message model? Not the messaging and notification, the message model. Yeah, I see everybody is familiar with the message model, so it's good. And what the message model is doing and this is, it relates also to OG and I'll show how it relates to OG. Message model is another answer like we have heartbeat and we have activity to creating activity streams but it does more than activity streams, okay. What is the message model? The message model is a very small model that exposes a new entity to the system called a message and you have like different message types the same if you're thinking about the analogy we have a node type and a node. So over here we have a message type and a message and with that we are creating activity streams. Now activity streams are pretty difficult to create because there are so many use cases. So basically message model has zero assumptions about how you want to show your activity stream or even what you're gonna do with it. It can be an activity stream, it can be some kind of a log or you can send emails, multilingual emails using the message. I'm gonna show you over here in the message model there are two example models right now in the dev version that I've committed a few days ago. One is called message example, message example, the other is message OG example. And over here we can see a very simple activity stream, very naive in the sense that I've just created different operations in the site and now I'm showing it. So I want to show you how we built it. Over here we have different message types. For example, when we're creating a node I created a new example. So I create a new message type and over here you can see I'm using tokens. These are not, let's call them arguments. These are not the tokens that we know from the tokens model. We'll soon see what are those token and how we are using it. So over here we can see I'm gonna show the user picture and over here you can see I'm gonna link to the user URL, show the username, created, blah, blah, blah, blah. So I have different message types that we can use. Most of them are similar. Over here I will show a teaser of the node. I'm gonna show just a little code in the message example. Again, this is intended for developers. If you are not a developer, don't use it. Or hire a developer or learn PHP, it's not that difficult. And over here what we are doing is creating a new message. We're creating a new entity when there is a node insert operation. So we are creating different arguments and we are saving the message. How does it look? I will just print an existing and loading message, whatever, 240 or just DPM it here. This is the message entity, a very small one. It has different arguments that look like this. Okay, I have this argument or this token, this strudel, do you say strudel in English? No. Ad sign, how do you say strudel? Ad sign, very good. Your English is very well. Okay, so I have two options. Either I'm hard coding the argument, saying the username is whatever is written over here and it will never change. Or I can have something that on render time it will take a bit longer, but it will be accurate and I'm using callbacks over here. So for example, if I want to show the user URL, okay, and the URL can have a path alias. So I'm saying my callback is the URL function, the same URL function we know from Drupal. And the callback arguments is user slash 30. So even if we're changing the user URL alias, it will change accordingly. Over here in the teaser, for example, we are seeing that we have a callback, okay? Without any callback arguments, but we are saying pass the message. This means that we'll pass the message entity itself into the callback function and it can operate on it. And why should it operate on it? The answer is over here. The message entity is a fieldable entity, which means you can attach fields to it, like entity reference, like whatever you want, and have all this information over here. So if you think about it, if you want to show, for example, show me the same way as OG will do, okay? Show me all the messages that are related to a certain group, meaning a certain node ID. I will attach the node ID. I will attach the node ID to an entity reference and in the views, it will be very simple to create an activity stream. Although you don't have to use views because, again, if you're doing complicated activity stream with access and everything, you might have your own custom logic to do a query builder to get all the messages. So again, if we are relating it to OG itself and if we're talking about how to create a message that is specific to OG, again, there is nothing specific because the activity stream is very, usually is very custom to your own business logic. We have another model in the message called message OG. I'll show here, for example, over here, we're interacting through the hook OG membership insert. It means there is a new association between a user and the group, okay? So I have different checks that I'm checking that indeed the association is between a user and not a node, for example, because the OG membership entity is being created for every type of association and then I'm creating my own message example and I save it. And then in my views, let me just disable this, develop. So in my views, the contextual filter is I'm saying over here provide default value, the OG groups of the logged in user. So you hardly need to do anything yourself. You get most of it for free from the integration of OG and views. OG will make sure to check to pass all the groups that all the node groups that this user belongs to views and then views us all the rest. And over here, I'd like to show you a nice feature that we are using and it's called, it's in the message model, it's called a partial. What does it mean? As we seen in the message type, the message text over here, what we're going to render out, this is actually a field, okay? And it's a translatable field, by the way, that you can have different messages in Spanish, in English, in Hebrew, whatever. So each, like each delta over here, each section is in the field, I call it a partial. So over here in the view itself, I'm instructing views over here when I'm adding, for example, a new message. When I want to render a message, I can render everything as a whole or I can render just a partial, just the first section or the second section. And it's really nice if you're using it again, if you're using panels, so you have a style plugin in views called the panel fields, if you're familiar with it, that basically allows you to, let me just remove that, basically allows each row in views to be rendered inside the layout. So over here I'm telling views, listen, the user put picture, put it on the left side, the operation info on the right side, the teaser on the right side, and whatever. And I can very easily play with this layout and without changing any HTML in the message itself. This means that you can have different activity streams layout differently without changing the message type. And this is pretty powerful. Again, I don't know how many of you have had the need for an activity stream, but usually it gets a little complicated. Another use that we are doing with the message model, I won't show it because I'll just talk about it briefly, is a model we call message notify that basically allows us to send emails multilingual emails. Basically there are a few ways of engaging users with the site. One is the activity stream when you show all the different operation and actions that happened on the site. And the second is sending emails about different operation. It's right for OG and it's right also for users that are for sites that are not using organic groups. So what happens is we create a different, I'll just enable the, sorry, I'm enabling the locale model. Basically what it will mean, I'm able to define different messages that they will be able to use the same tokens, the same arguments, but in different languages. I'll be able to select it from here if it's English or French or whatever. So when I want to send emails in different language, because the message can be different, the links can be different, whatever, I'm creating a message, I tell the message isn't you need to be in French because this guy speaks French. I don't know why he speaks French, but he speaks French. This guy is speaking Spanish. Just send the email and then there is an advantage because when we are sending emails, normally the email is sent and we are like, okay, I guess it was sent, right? And if not, it's like gone somewhere in the cyberspace and I have no information about it and what was sent. If we are using the message model and the message notify is aware of that, we can save that entity. We can save that message. So message notify on failure, it knows, or also on success, it knows how to save the message itself. So you actually have a logo of all the emails, of all the different emails that were sent from your site. You can just create a simple view and view it. And when you have too much messages in the end in your database, you can just purge the messages either by saying if there are more than 1,000 message or after 30 days or something like that, just purge all the different messages. Okay, and now imagine you are seeing a slide saying questions and answers, which implies you ask questions and I answer, yeah. Oh yeah, there is already somebody at the mic, yeah, sorry. My question is about panels using a contextual filter for a view to get the current group. In panels, when I select the context to pass to the view, I see three contexts named groups, but I don't know how they differ and none of them seem to work appropriately. Yeah, I kind of fucked it up in the first version. So. But in the second version, the node ID is the group ID. So you just pass it, so it's very simple. I like your approach with messaging and notifications, but what was your reason for not going with the existing messaging and notifications module? First, it's not maintained so well for seven, as far as I know, and I talked with Jose before doing it. It's a whole different approach. It's much more light. It's really, if you look at the model, there's not much going on there, just doing it correctly, and it's a multipurpose model. It doesn't care what you do with the message, what you do with the message itself, and there's absolutely no notifications going on here. Notification, I would say, you'd probably implement it using some flag model or something like that, and the message will send the email or log itself or whatever. And its integration with OG is just like a submodule? There is no integration. There is the message OG example, which is absolutely just an example. I took a lot of the experience that we got from building different user activities with OG or without, and I put it in the message example models with a lot of documents. But again, this is for developers because it's probably very custom. Brith and myself were planning to do a buff about message and activities streams, so it would be interesting to hear different approaches to this. Cool, thank you. I have a situation coming up where I'd like to have not just the groups, but actually be able to subgroup them out to have sort of a parent-child relationship where a whole section of an organization has the authority, the permissions to add, edit, create the whole crud, and then actually subgroups limited to permissions within those. Does this support anything like that out of the box? So there is the model called OG subgroups, which imagine or not it does subgroups. It works for the first branch, okay? And nobody ported it yet to the second branch, although it shouldn't be that difficult to do it. Basically what OG is doing, like there is the user access function in Drupal, so there is OG user access. It really tries to copy a lot from core. So there is the OG user access and then there is an alter function, Drupal alter, that allows other functions to alter it on the fly. That's how you can create cascading permissions, what we call it, so somebody from another group can see other groups. So yeah, it works for the first branch, for sure for the second, when somebody will write a decent patch. Great, thank you. Any more questions? I have like eight more minutes, we can stand silently again, again, sorry. I feel for you, but I don't know. You have to try, I don't know. Yeah, these abling models in Drupal 7 was hard. Yeah, more question? Yeah, okay, another question. What if I wanted to make my own group number ID, like let's say I have to follow HIPAA or something like that. There is no group ID now, it's the entity ID. If you know like the node is the node ID, no longer group ID, this is something that was, let's call it experimental. No, it made sense at the time, but not enough probably. Okay. What, what? Yeah, so when I did it, I thought that we'll also be able, also the group entity was fieldable, so I thought maybe people will use it to attach different information to it. But that's why we have the second version. Hi, I have a question, I come from college. Our college website, Drupal, we use one installation and one database for all departments, all offices and organizations, something like that. So we have like for each department, we have one content type for them and have one menu for each of them. I'm thinking about is approaching the organic group module to such thing. You have different content type for every department? Yes. Yeah, so it sounds like you're doing it wrong, honestly. That's right, that's a big problem. Do we have a big list for the menu block, content type list or non-list? Usually OG is, when I hear university in college, usually OG is absolutely the right solution. That's from my experience of having a lot of project like that because you have indeed different faculties, different departments and so on and different people have different roles and permissions over there. So you should definitely look at OG. Okay, thank you. You're welcome. So let's take two more questions and... First of all, thank you for OG7. It's been a delight to use even in the first branch. You heard it, right? He said. Yeah, especially compared to OG for six. What does the upgrade path look like for the 1.x branch to two? It looks good. There is one. There are some people reporting different bugs. You know, it's still the alpha version. Although from what I checked because every time they say I have a problem, I say, I listen, disable everything. If it's a dev site and just attach the DB dump and I'll check it on my local. And usually it was something corrupted in their own database that wasn't related. So I tried to make it not too strict the migration so it won't fail. But I mean, I think it works. But yeah, I deserve some love. Thank you. How's it going? Hi. Justin. Hi, Justin. Do you have any intentions of creating an OG messaging module? Because I have a lot of clients with... It seems like a lot of the messages and message types they're gonna be the same. You know, there's the new, there's the updates, the comments. Maybe someone's added to a group. All that stuff. I don't wanna have to go set that up. Every time I push a new. I think this is something we should talk about above. To see if there is really a base to do such a model or everybody's very custom. I don't know. I have a feeling that everybody has something a bit custom about it, but it will be interesting to hear the different... We both agree that activity streams are really underdone and any type of group system is gonna wanna have sort of push notifications when someone joins it, things like that. Yeah, so this is, again, this is the message model and it's doing a terrific job, but somehow it's underused. So when more people will use it, we'll probably see more models. Wrap it up. Let it all in one. Power to the people. Okay.