 So we will try to make it short, like around 35 minutes. So what I want to do is first, five minutes, just give you a few information about what is Odo. And after, we'll do a small demonstration about the product. And then I will show you a little bit of code to see how it works behind the scenes. So let's start with some information about Odo. Odo is actually a big project. But it's not very well known among the Python community. It started 10 years ago in 2005. And actually, the reason why we did it in Python, so I was at the university around 2000 in Belgium. And there is a guy. And I was coding in C in PHP. We were doing a lot of websites. And one day, there was a guy that came. And his name is Denis Frère here. I just found an email from that era. You see, people were talking about hosting some Perl web application, and he says, you should do it in Python. And he came to the university, to the dorms. And he showed us what was Python. And we started to learn Python. And since that time, Python is my main programming language. So I've been programming in Python for 15 years. And OK, let's go back to Odo itself. So Odo is a framework and also a set of applications built on that framework. The total code base of Odo is around 140K lines of code. 40K lines of code are the frameworks. And the rest is the 30 main apps. So we are a company. The company is named Odo. We edit the software. The software is also named Odo. And that software is actually 30 different business apps. And I will show you a demonstration of a few of them after. And then after, you have a lot of people that are doing other apps and using the framework or extending the apps that we ship. And so you have a very vivid community around Odo. We have around 400 contributors in the core with a truck factor of 11. So a truck factor is the number of people you have to kill if you want to kill the project. And if you compare to Django, for example, it's five percent. If you kill five percent Django, we'll probably stop. And Rails is seven. Odo is 11. The Linux kernel is around 150. And if you take account of the people that doesn't contribute to the core but to other modules, then there is around 2,000 contributors. So it's a very big project. And there is around 500 companies that do their living because of Odo. And some of them are in Spain. We have 2,800 stars on GitHub. And we have two millions of users. So by users, I mean somebody who every day sits at these computers and use Odo. Maybe not the whole day, but at least some part of the day. So every day, we have two million people that would log and use Odo. Why is it different? I think it's superior to many frameworks. Actually, to almost every framework. Maybe there are some frameworks that I don't know. But because it's very modular. And all frameworks say they are modular. But Odo is modular in a different way. And I will show you some examples after. It's business-oriented. So it has all the features you need to do business apps, like the security mechanism to people in the company might not see some information that other people can see. So all that kind of thing is built in. And it's only since one year that it's fully web-based. Before that, it was not fully web-based. It was at first started as a client and server application. So you had to run a client application on every PCs and you were running a server. Since one year, it's fully web-based. And it uses a special templating engines that nobody else uses. But I will show you why I think it's superior. And also, it has a small JavaScript framework built on standard libraries. And so it has a rich client. It's a full native application in JavaScript. And also, it is very simple. Because it's only 40K lines of code for the framework. And the API is around 30 functions. So if you know those 30 functions, you know how to consume and program everything you know. And the power of Odo comes from what is already available, from its add-ons. And you have add-ons for everything, everything related to business. So when you do, you need to make invoices, payment, manage product, deal with customers, with physical products, accounting, those kind of things, they are built in Odo. So I think many people who develop new web applications, they spend most of their time reinventing the wheel. Because when you do a new, for example, a new startup, at some point, you have to invoice customers. You have to do payment. You have to manage people. So those sets of features, they are built in Odo. And you don't waste your time doing that again and again. So why isn't it more popular? I think there are a few reasons. One of them is because it's business-oriented and business is not fun. People prefer to do games instead of business. It's wrong. Actually, doing business apps is very fun. Also, it was not web-based before. So now you can build web applications using Odo before it was not possible. It was just a tool to manage companies. So it's very recent. And also, we had no documentation or bad documentation. It's only since December that we have a good documentation. And also, Odo is not a good Python citizen. It's not packaged on PIP, for example. So you cannot do PIP install Odo. Because Odo is quite a big project. And it's actually also lots of JavaScript, lots of other things. It uses PostgreSQL as a database storage. So it's not just a Python library. And also, there were a lot of ugly code, ugly quirks in Odo. And we fixed most of them in the V8 APIs that we released in September last year. So no, it's much more cleaner, much more Python-ing that it was before. Because we started at the time when RRM didn't exist. SQL object was the first in Python that I used. But it was much later after we started Odo. Yeah, so Odo was named OpenERP before. And before that, it was also named TinyERP. So we changed the name two times. So I will show you what it looks like. Let's go. So I will show you the new UI. The new UI is still alpha. So sometimes I might switch to the stable tree because some things might not work in the development version. That's the master tree. So basically, at least at the beginning, Odo was just a tool to manage company. And I will show you just a simple flow of what happens every day in not every but many companies. So we will look at the CRM. The CRM is a tool to organize your sales. So how it works is like this. And it's the same in many, many companies. So you first have a contact with the customers. And this is this, this customer that wants to buy some keyboards. So that's the first contact you have with the person. And what will happen is that you will call the customers, discuss with him, qualify his needs. Then probably you will do a concrete proposition about selling him something. And then there is sometimes a negotiation phase. And then after we get a deal, we lost the deal. So opportunities are just one of the simple objects that Odo managed. And you saw here, that's the view with the flows of opportunities. And I can show you what an opportunity looks like. It's just a few information with some fields. Like, OK, who's the customers? This is Agro-Lay. And what's the revenue we expect from that deal? What's the probability? And there, so it's just crud. So it's just information that you save. And you can see the flow there. And you see at the bottom of the document, we have what we call the chatter. It's just like a Facebook thread. And it's available on every business document in Odo. So when I look at the opportunity, I can discuss with my customers using this here. I need to add this email address. OK, it's already done. So I send in a message. What are you interested in, blah, blah, blah, blah? It will send him an email. If the person's reply by email, it will come back on the thread below. So I can manage all my communication from the opportunity itself. So at what point, the customer will say, OK, I want to buy this or this. So what I do, I will create a quotation. A quotation is just a set of things that I propose to sell to our customers, like maybe some keyboard here. And after, I can send the quotation by email. I send the quotation by email. The person can reply on the quotation. It will appear below. And then after, there are two ways you can close the deal. One of them would be, OK, the customers by phone say, yes, I want to buy this, send me the goods. Or you can also use an online version where I click here. I can see the quotation here. And the person can accept the quotation online, sign. It's difficult with the mouse. And here, I accepted the quotation. I go back into sales. And after the quotation is done, what we will do is to create an invoice. I create an invoice. And also, it will create a delivery order. So the delivery order, it's just a document that goes to the warehouse. And the people will deliver the goods to the customers. And the invoice is the order part. It's the customers that has to pay the money. And after the person's pay, I won't go into all the details because I want to make it quick. But you get the ID. After, the customers will pay. And we can reconcile. That's the old UI. I just wanted to show you here. It's the way you reconcile invoices with the payments. So you get some money on the bank account. You have some invoices. And then you reconcile them. And then the deal is completely finished because we've delivered the goods. And we've got the money from the customers. Very simple flow. And what's available also in Odo, we have a, oh, OK. I have lost the Wi-Fi. I wanted to show you, I had another version online with more data and more things installed. But I think I don't have internet anymore. So I want to show. OK, I can show it here. So you have also tools to do reports. For example, you want to know the sales made by every country, by every sales team. OK, it's always the same here. And you can also get nice. I will just install something. OK. So what you see here are all the application of Odo, the basic ones, the ones that we as the company Odo edit. And there are plenty more outside that are made by other companies. And I'm installing the CRM so that we get more data here. Let's go back to OK. So what we saw was just a simple sales flow. But there are other way to sell your stuff. One other way would be to have a shop. And Odo also has a point of sale. I hope it's open here. And the point of sale is just touch base. So you can click here, click, click, click, and pay. So that's what the person will use in his shop at the, I don't know, in French we say à la caisse, à la casa, maybe in Spanish. So here I pay some amount. I can validate. OK, I need to pay at least the amount, OK. Here, OK. And then I go to the next order, you see. So that's another sales channel. And I told you recently we added the web layer on top of Odo. Odo was already using HTTP because the client server protocol was XML-RPC. So we had a small web layer. But we decided that because we had almost everything that a company needs to manage itself, we were just lacking one step was the website part of the company. So we say, OK, let's do a CMS. And I know Plone was supposed, Plone or Zope was supposed to be the killer app at the time I've started with Python, but it didn't happen. So I will show you what the web layer of Odo looks like. Let's go now on the website. So we say, OK, because we have information about many things that happens in the company. And the company needs to be public, needs to have a presence on the web. So we wanted to make a simple tool to allow people to create their own website. And there are many CMS available, maybe hundreds, at least, of them. So we wanted to make something different, something really easy to use. And we made this website builder. The website builder works with blocks. So what you do is you drag and drop different kinds of blocks like this, OK, and you say. And then you edit these blocks. And that's the basic blocks that you see. But I will show you some team after. And then you can edit the content here and change it. And because you use blocks, you are not creating all the layout yourself. So you can have beautiful looking websites because some designers created some very fancy blocks for you. So for example, if you want to compare price, you can use this block to compare price and say, OK, we have three offers with that price, that price, et cetera. OK. And that's just static pages. After, because we use the same system, for example, here, I have a contact form. And when I fill my contact form here, it's linked with the back end I showed you before. So when I will fill the contact form, if I go on to sales, I can see that I have a new opportunity. Actually, it's a lead here. It's here. So each time I fill a form, I arrive in my CRM, and then the flow of sales begins, OK? Pretty straightforward. And after, we said, OK, we have all the information about the product. So let's do an e-commerce. And we just published the product online here. And we added the had to cart button. And when you do add to cart, you actually do a sales order like I did before. I did the sales order myself. Now it's the customer itself that creates the sales order. But the object behind is the same. So for the whole e-commerce that you can see here, I need to fill all the information, blah, blah, blah. OK, shipping to the same address. And then I can pay. Here, I only install wire transfer, but we have integration with many payment provider, OK? And the whole e-commerce flow that you saw here takes only 1,000 lines of code, because we had all the built-ins in Odu already. And I only showed you the easy stuff, because you can add more and more features and get very complex flow in the companies by adding some options. So the forms I showed you when I do a sales order, it's just one or two fields. Let's go back to a sales order. It's very simple. Name of the customer's address, things to sell. But you have many cases where you need more. It's OK. You go in configuration, in settings, and then you enable new stuff. Like, for example, I want to display margin on the sales order, so I want to know how much I get when I sell something 100 euro, how much do I gain on it. And I go back to my sales order, OK? And here, you see there is a new field. And you can add many, many things. And at the end, you get 20 fields. And it's very complex. But the way it's designed is so that people can start easy. But if they have complex things, they can manage it. So let's go back to my web website. And what's displayed on the website, what you can see here, if I edit, I can edit everything. So here, if I edit this, it will change the name of the product, OK? If I change the price, it will change the price. So everything that appears on the screen, you can edit it. And we do that because we have a special template engines. And we know when we display something on the screen where it comes from in the database. And so you can edit everything. And the same system to edit static page can be used to edit products. So I can use also my building blocks here. And here, I save the description of the product. OK, so what I showed you is just two applications, the CRM and invoicing. And we also host it online for people. So we have a cloud offer. That's the pricing of the cloud offer. But you can see there are lots of more applications like managing, manufacturing, accounting, project management, inventory, point of sale, events. So if you want to manage an event like this, you can use also a do. Also, yeah, I wanted to say the guy who introduced me to Python. That guy, Denis Frère, was the guy who started Europe Python. So he started the first year in Charleroi. I remember we're organizing the event with him. So if you are all here today, it's because also of him. Let's go back to my, yeah. So I finished my demonstration. I don't want to be complete. I just want to tease your curiosity. So that after, you might go and say, that Python project looks interesting. So let's dive into the code and look what it looks like and why I think it's superior to many frameworks. OK, hello. It's big enough so that people can read. So in Odo, you define object like I think in many frameworks like Django or Rails by defining the fields. So for example, we will check an invoice. An invoice, that's a chore now. Let's take an invoice here, OK. Yeah, it's an invoice. So there are many types of fields. Odo stores its data into PostgreSQL, OK. So you have chart fields, selection fields, integer, Boolean, dates, and relational fields. So you have many to one when it's a relation to one other object and many to many when you have multiple relations between two objects. Pretty common. And what you have a special in Odo is the compute attribute. So when you say, for example, amount tax or maybe amount total, it's easier. Amount total is the amount of the invoice and it depends on the other order data. So it's a compute field. So you say, OK, this field, it's not a real field that is simply stored. It's a field that you compute when other value changes. So I will let's check, OK. So this function is called each time a dependency fields of the amount each change. So each time, for example, you add a line on the invoice, you have to compute the total again. So it's just a function here that you define and it will compute the value. And then you have two different ways to use compute fields. One of them is to say, OK, each time I need the field, just compute it. Or you can store it. So you say, store true. So it means that we compute it when it change, but then we store it in database. And by storing in the database, it's much more easier to after search for the value of the fields. Because if you want to search for a value, if it's not stored, you have to compute all the values to know which one is the correct. So you use it like a regular field, but it's computed. And many of the business logic in Odo goes into those compute fields. After, you have a few functions, business function, that are linked to the different buttons on the object. So for example, when I click Confirm an invoice, what should it do? So that's all the code that we see here. And after, you have the view, so how to display the invoice on the screen. And I show you the back end view of it's in XML. So let's check a continuous. So that's the view description. So it's just the list of fields to display, with some layouting, like I want to see different tabs or group the fields together. And that's it. After, you have also web pages. But we don't have web pages for invoice. But for the sales order or the product page, I will show you what the page looks like. Website sales. No, I want to show you that. I will show you the extension mechanism. But it's also just an XML-based template, like Genshi, or Kid, or Zop template. Actually, it was inspired by Zop template. And what I want to show you is how to add new stuff on Odo. And that's the strength of Odo. That you can say, OK, I show you that I install product margin. It's just a module that adds a field and show you the margin. How does it do that? You can inherit object and override method. But everybody knows how to. It's common in Python, so it's very easy. But what you can do is you can add new columns on those objects. So you can add new fields. And once you've added those fields here, I added the compute fields. That's the old syntax. And I added the two functions to compute the fields. After, I want to display the field somewhere. So I go on the view, and I say, OK, I want to extend the view. And after this part of the view, I want to display this. And everything is constructed this way. That's why I showed you at the beginning that my form view was very simple. Where is it? I show you my form view is very simple. But the more and more module I install, the more complex it gets. And it's really small Lego bricks that you can build on up to. And you get a very, very complex system. And everything works together. I think I will ask if you have any question. I will take question. And I hope that I teased your curiosity and that you will look at or do. If you have any question after the talk, feel free to come to see me. I'll be there this afternoon. And also, I'll be there at the social event. So don't hesitate to come and ask me a question. Thank you. And let's proceed with the question if somebody has questions. Hello. I would like to know how you compute the read access and write access for documents. So we have two mechanisms of security. One is the access control list. So you can say this person from this group doesn't have the right to read, right to create things. It's almost like ACL in Unix. And you have a second mechanism. It's record rules. It's more precise. It can give you visibility. So you say, every time somebody do this operation, apply this set of criteria. I didn't show you, but we have a filter mechanism here where you can say, I want to seal the sales order that are to these customers. So we have a syntax to express filters. And it's called domains. And you can apply domains based on the person who uses it. So for example, you can say, every salesman can only see his invoices or that kind of things. And it was built into Hadoo since the very beginning and it didn't change. How do you deal with large data sets? Because I'm familiar with the approach. The biggest deployment of Hadoo is 50 terabytes of data. And we don't do nothing. It's just Postgres is very cool. And Postgres can deal with a lot of data. So we rely on Postgres. And also, when you have blobs, attachments, image, they are stored outside the database. So only the business data are stored in Postgres. I didn't perform my question precisely enough. How do you deal with situations where a subset of users in these really large data sets, when a particular user only has access to a very small amount of documents? For instance, you have 100,000 documents. And the user can only see 15. And what's the problem? Well, if there's no, your implementation bypasses that. Yes, no, you can use this syntax. But what's the criteria? You have thousands of documents. Why does only, why does he see only 15? It's for whatever reasons. So, OK. You have to define the, once you define the reason, you get the system work. You just define why. And it just applies. OK. I can show you an example if you want. Hi. I have two quick questions. One is, if you start with a managed solution, is there a possibility to go to a hosted solution, so that you retain all the data? Actually, yes. So if you start with what you have for the 10 euros, I don't know, a month, and then want to host it yourself, if you can do it and retain all the data? So in the cloud solution, we only ship the basic apps, the one that, the 30 basic one. When you, if you want to use, sorry, I don't have access. If you want to use external modules, you need to be self-hosted. So you need to be on-premise. So the cloud solution is just for people, for small companies, because for simple companies. When you have complexity, probably, you need to go self-hosted. OK. And the other question is, when you have saved fields. When you have what? Saved fields. The fields where they save. You can add custom fields. And actually, I didn't show you. But you can do it from the UI. You can add fields and customize everything from the UI. You can do it in Python modules, or you can do it in the database itself. When do they know when to update? When you are on the cloud, we migrate database from version to version. So we keep the customization. And sometimes it's manual work, because we have to make sure everything works. And that's part of our offer. If you are on your own, you have to be careful with your customization when you migrate from version to version. Is it clear? Just come to see me after. Any other question? Yes. Hey, do you know about any company using Odo in Brazil? Yeah, I don't know the names. But there is a partner named Acresion. That's a company that integrates Odo there. And they have plenty of reference. I don't have internet access, but I could show you. No problem. Just curious, because in Brazil we have some business logic with this particular to the country. Oh, yeah. I know they told me that it's a hell about accounting and the paperwork you have to do. So they have a lot of module to deal with that. And I know it's very complex. So this is already done. So if I install Odo, and I can just use it in Brazil? Yeah, you can use it. And I forgot to mention, also in Portugal it's not in Spain. But in Portugal, the biggest installation of Odo is 500,000 people. It's all the teachers in Portugal that have to use Odo, because they use Odo to schedule to assign teachers to the school and that kind of work. So the Ministry of Education uses Odo for everything now. They replaced, I think, 1,000 different applications no, 100 different applications with Odo. Cool, thank you. We still have time for a very short question. Which one is the shortest? I have a short question. Yeah, OK. The answer may be long. When you go into price, one of the common challenges is integration. You have legacy apps. Some of those will go away. Some of those need to stay forever. So you need, at some point, to consider how to bring in data, either live or migrating, into and out of Odo. So would you think this is a good framework for that? Yeah, you can do it both ways. Either you access the Odo API using Gson RPC or XML RPC from the other apps, or you do it from within Odo using any Python library. You access the database or the API of other systems. So there's a lot of work and connectors for other systems. Yeah. Well, thank you again, Anthony. And the lunch is happening now. So just try to get some food.