Skip to content

Commit 3a4e146

Browse files
committed
Initialize new odoo module project.
0 parents  commit 3a4e146

15 files changed

+238
-0
lines changed

.gitignore

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# sphinx build directories
2+
_build/
3+
4+
# dotfiles
5+
.*
6+
!.gitignore
7+
!.mailmap
8+
# compiled python files
9+
*.py[co]
10+
__pycache__/
11+
# setup.py egg_info
12+
*.egg-info
13+
# emacs backup files
14+
*~
15+
# hg stuff
16+
*.orig
17+
status
18+
# odoo filestore
19+
odoo/filestore
20+
# maintenance migration scripts
21+
odoo/addons/base/maintenance
22+
23+
# generated for windows installer?
24+
install/win32/*.bat
25+
install/win32/meta.py
26+
27+
# needed only when building for win32
28+
setup/win32/static/less/
29+
setup/win32/static/wkhtmltopdf/
30+
setup/win32/static/postgresql*.exe
31+
32+
# various virtualenv
33+
/bin/
34+
/build/
35+
/dist/
36+
/include/
37+
/lib/
38+
/man/
39+
/share/
40+
/src/
41+
/.idea

__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from . import models
2+
from . import controllers

__manifest__.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
'name': 'Library Management Application',
3+
'description': 'Library books, members and book borrowing.',
4+
'author': 'Fernando',
5+
'depends': ['base'],
6+
'license': 'LGPL',
7+
'data': [
8+
'security/library_security.xml',
9+
'security/ir.model.access.csv',
10+
'views/library_menu.xml',
11+
'views/book_view.xml',
12+
'views/book_list_template.xml',
13+
],
14+
'application': True,
15+
'installable': True
16+
}

controllers/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import main

controllers/main.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from odoo import http
2+
3+
4+
class Books(http.Controller):
5+
@http.route('/library/books')
6+
def list(self, **kwargs):
7+
Book = http.request.env['library.book']
8+
books = Book.search([])
9+
return http.request.render(
10+
'library_app.book_list_template',
11+
{'books': books})

models/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import library_book

models/library_book.py

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from odoo import api, fields, models
2+
from odoo.exceptions import Warning
3+
4+
5+
class Book(models.Model):
6+
_name = 'library.book'
7+
_description = 'Book'
8+
9+
name = fields.Char('Title', required=True)
10+
isbn = fields.Char('ISBN')
11+
active = fields.Boolean('Active?', default=True)
12+
date_published = fields.Date()
13+
image = fields.Binary('Cover')
14+
publisher_id = fields.Many2one('res.partner', string='Publisher')
15+
author_ids = fields.Many2many('res.partner', string='Authors')
16+
17+
@api.multi
18+
def _check_isbn(self):
19+
"""Check one Book's ISBN"""
20+
self.ensure_one()
21+
digits = [int(x) for x in self.isbn if x.isdigit()]
22+
if len(digits) == 13:
23+
ponderators = [1, 3] * 6
24+
total = sum(a * b for a, b in zip(digits[:12], ponderators))
25+
remain = total % 10
26+
check = 10 - remain if remain != 0 else 0
27+
return digits[-1] == check
28+
29+
@api.multi
30+
def button_check_isbn(self):
31+
for book in self:
32+
if not book.isbn:
33+
raise Warning('Please provide an ISBN13 for %s' % book.name)
34+
if book.isbn and not book._check_isbn():
35+
raise Warning('%s is an invalid ISBD' % book.isbn)
36+
37+
return True

security/ir.model.access.csv

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2+
access_book_user,Book User Access,model_library_book,library_group_user,1,0,0,0
3+
access_book_manager,Book Manager Access,model_library_book,library_group_manager,1,1,1,1

security/library_security.xml

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<record id="module_library_category" model="ir.module.category">
4+
<field name="name">Library</field>
5+
</record>
6+
7+
<record id="library_group_user" model="res.groups">
8+
<field name="name">User</field>
9+
<field name="category_id" ref="module_library_category" />
10+
<field name="implied_ids"
11+
eval="[(4, ref('base.group_user'))]" />
12+
</record>
13+
14+
<record id="library_group_manager" model="res.groups">
15+
<field name="name">Manager</field>
16+
<field name="category_id" ref="module_library_category" />
17+
<field name="implied_ids"
18+
eval="[(4, ref('library_group_user'))]" />
19+
<field name="users"
20+
eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]" />
21+
</record>
22+
23+
<data noupdate="1">
24+
<record id="book_user_rule" model="ir.rule">
25+
<field name="name">Library Book User Access</field>
26+
<field name="model_id" ref="model_library_book" />
27+
<field name="domain_force">
28+
[('active', '=', True)]
29+
</field>
30+
<field name="groups" eval="[(4, ref('library_group_user'))]" />
31+
</record>
32+
</data>
33+
</odoo>

static/description/icon.png

2.35 KB
Loading

tests/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_book

tests/test_book.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from odoo.tests.common import TransactionCase
2+
3+
4+
class TestBook(TransactionCase):
5+
def setUp(self, *args, **kwargs):
6+
result = super(TestBook, self).setUp(*args, **kwargs)
7+
user_admin = self.env.ref('base.user_admin')
8+
self.env = self.env(user=user_admin)
9+
self.Book = self.env['library.book']
10+
self.book_ode = self.Book.create({
11+
'name': 'Odoo Development Essentials',
12+
'isbn': '978-1-78439-279-6'})
13+
return result
14+
15+
def test_create(self):
16+
"""Test Books are active by default"""
17+
self.assertEqual(self.book_ode.active, True)
18+
19+
def test_check_isbn(self):
20+
"""Check valid ISBN"""
21+
self.assertTrue(self.book_ode._check_isbn())

views/book_list_template.xml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<template id="book_list_template" name="Book List">
4+
<div id="wrap" class="container">
5+
<h1>Books</h1>
6+
<t t-foreach="books" t-as="book">
7+
<div class="row">
8+
<span t-field="book.name" />
9+
<span t-field="book.date_published" />
10+
<span t-field="book.publisher_id" />
11+
</div>
12+
</t>
13+
</div>
14+
</template>
15+
</odoo>

views/book_view.xml

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<record id="view_form_book" model="ir.ui.view">
4+
<field name="name">Book Form</field>
5+
<field name="model">library.book</field>
6+
<field name="arch" type="xml">
7+
<form String="Book">
8+
<header>
9+
<button name="button_check_isbn" type="object"
10+
string="Check ISBN" />
11+
</header>
12+
<sheet>
13+
<group>
14+
<field name="name" />
15+
<field name="author_ids" widget="many2many_tags" />
16+
<field name="publisher_id" />
17+
<field name="date_published" />
18+
<field name="isbn" />
19+
<field name="active" />
20+
<field name="image" widget="image" />
21+
</group>
22+
</sheet>
23+
</form>
24+
</field>
25+
</record>
26+
27+
<record id="view_search_book" model="ir.ui.view">
28+
<field name="name">Book Filters</field>
29+
<field name="model">library.book</field>
30+
<field name="arch" type="xml">
31+
<search>
32+
<field name="publisher_id" />
33+
<filter name="filter_inactive"
34+
string="Inactive"
35+
domain="[('active', '=', True)]" />
36+
<filter name="filter_active"
37+
string="Active"
38+
domain="[('active', '=', False)]" />
39+
</search>
40+
</field>
41+
</record>
42+
</odoo>

views/library_menu.xml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<menuitem id="library_menu" name="Library" />
4+
5+
<act_window id="action_library_book"
6+
name="Library Books"
7+
res_model="library.book"
8+
view_mode="tree,form"/>
9+
10+
<menuitem id="menu_library_book"
11+
name="Book"
12+
action="action_library_book"
13+
parent="library_menu" />
14+
</odoo>

0 commit comments

Comments
 (0)