notebook
This commit is contained in:
2
ow_vm_management/__init__.py
Normal file
2
ow_vm_management/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
from . import models
|
||||||
|
from . import controllers
|
||||||
23
ow_vm_management/__manifest__.py
Normal file
23
ow_vm_management/__manifest__.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
'name': 'VPS Server Management',
|
||||||
|
'version': '16.0.1.0.0',
|
||||||
|
'category': 'Services/VPS',
|
||||||
|
'summary': 'Manage VPS servers for customers',
|
||||||
|
'description': """
|
||||||
|
This module allows you to record and manage VPS servers for customers.
|
||||||
|
Customers can view their VPS server information in the portal.
|
||||||
|
""",
|
||||||
|
'author': 'Your Company',
|
||||||
|
'website': 'https://www.yourcompany.com',
|
||||||
|
'depends': ['base', 'portal'],
|
||||||
|
'data': [
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'views/vps_server_views.xml',
|
||||||
|
'views/res_partner_views.xml',
|
||||||
|
'views/portal_templates.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': False,
|
||||||
|
'auto_install': False,
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
}
|
||||||
BIN
ow_vm_management/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
ow_vm_management/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
1
ow_vm_management/controllers/__init__.py
Normal file
1
ow_vm_management/controllers/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import portal
|
||||||
BIN
ow_vm_management/controllers/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
ow_vm_management/controllers/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
ow_vm_management/controllers/__pycache__/portal.cpython-39.pyc
Normal file
BIN
ow_vm_management/controllers/__pycache__/portal.cpython-39.pyc
Normal file
Binary file not shown.
80
ow_vm_management/controllers/portal.py
Normal file
80
ow_vm_management/controllers/portal.py
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
from odoo import http, _
|
||||||
|
from odoo.exceptions import AccessError, MissingError
|
||||||
|
from odoo.http import request
|
||||||
|
from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager
|
||||||
|
from odoo.osv.expression import OR
|
||||||
|
|
||||||
|
class CustomerPortalVPS(CustomerPortal):
|
||||||
|
|
||||||
|
def _prepare_home_portal_values(self, counters):
|
||||||
|
values = super()._prepare_home_portal_values(counters)
|
||||||
|
if 'vps_server_count' in counters:
|
||||||
|
values['vps_server_count'] = request.env['vps.server'].search_count([('customer_id', '=', request.env.user.partner_id.id)])
|
||||||
|
return values
|
||||||
|
|
||||||
|
@http.route(['/my/vps-servers', '/my/vps-servers/page/<int:page>'], type='http', auth="user", website=True)
|
||||||
|
def portal_my_vps_servers(self, page=1, date_begin=None, date_end=None, sortby=None, **kw):
|
||||||
|
values = self._prepare_portal_layout_values()
|
||||||
|
VPSServer = request.env['vps.server']
|
||||||
|
|
||||||
|
domain = [('customer_id', '=', request.env.user.partner_id.id)]
|
||||||
|
|
||||||
|
searchbar_sortings = {
|
||||||
|
'name': {'label': _('Name'), 'order': 'name'},
|
||||||
|
'ip_address': {'label': _('IP Address'), 'order': 'ip_address'},
|
||||||
|
}
|
||||||
|
|
||||||
|
if not sortby:
|
||||||
|
sortby = 'name'
|
||||||
|
sort_order = searchbar_sortings[sortby]['order']
|
||||||
|
|
||||||
|
if date_begin and date_end:
|
||||||
|
domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)]
|
||||||
|
|
||||||
|
# count for pager
|
||||||
|
vps_server_count = VPSServer.search_count(domain)
|
||||||
|
|
||||||
|
# make pager
|
||||||
|
pager = portal_pager(
|
||||||
|
url="/my/vps-servers",
|
||||||
|
url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby},
|
||||||
|
total=vps_server_count,
|
||||||
|
page=page,
|
||||||
|
step=self._items_per_page
|
||||||
|
)
|
||||||
|
|
||||||
|
# search the count to display, according to the pager data
|
||||||
|
vps_servers = VPSServer.search(
|
||||||
|
domain,
|
||||||
|
order=sort_order,
|
||||||
|
limit=self._items_per_page,
|
||||||
|
offset=pager['offset']
|
||||||
|
)
|
||||||
|
|
||||||
|
values.update({
|
||||||
|
'date': date_begin,
|
||||||
|
'vps_servers': vps_servers,
|
||||||
|
'page_name': 'vps_server',
|
||||||
|
'pager': pager,
|
||||||
|
'default_url': '/my/vps-servers',
|
||||||
|
'searchbar_sortings': searchbar_sortings,
|
||||||
|
'sortby': sortby,
|
||||||
|
})
|
||||||
|
return request.render("ow_vm_management.portal_my_vps_servers", values)
|
||||||
|
|
||||||
|
@http.route(['/my/vps-servers/<int:vps_server_id>'], type='http', auth="user", website=True)
|
||||||
|
def portal_my_vps_server(self, vps_server_id=None, access_token=None, **kw):
|
||||||
|
try:
|
||||||
|
vps_server_sudo = self._document_check_access('vps.server', vps_server_id, access_token)
|
||||||
|
except (AccessError, MissingError):
|
||||||
|
return request.redirect('/my')
|
||||||
|
|
||||||
|
values = self._vps_server_get_page_view_values(vps_server_sudo, access_token, **kw)
|
||||||
|
return request.render("ow_vm_management.portal_vps_server_page", values)
|
||||||
|
|
||||||
|
def _vps_server_get_page_view_values(self, vps_server, access_token, **kwargs):
|
||||||
|
values = {
|
||||||
|
'page_name': 'vps_server',
|
||||||
|
'vps_server': vps_server,
|
||||||
|
}
|
||||||
|
return self._get_page_view_values(vps_server, access_token, values, 'my_vps_servers_history', False, **kwargs)
|
||||||
2
ow_vm_management/models/__init__.py
Normal file
2
ow_vm_management/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
from . import vps_server
|
||||||
|
from . import res_partner
|
||||||
BIN
ow_vm_management/models/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
ow_vm_management/models/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
ow_vm_management/models/__pycache__/res_partner.cpython-39.pyc
Normal file
BIN
ow_vm_management/models/__pycache__/res_partner.cpython-39.pyc
Normal file
Binary file not shown.
BIN
ow_vm_management/models/__pycache__/vps_server.cpython-39.pyc
Normal file
BIN
ow_vm_management/models/__pycache__/vps_server.cpython-39.pyc
Normal file
Binary file not shown.
6
ow_vm_management/models/res_partner.py
Normal file
6
ow_vm_management/models/res_partner.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from odoo import models, fields
|
||||||
|
|
||||||
|
class ResPartner(models.Model):
|
||||||
|
_inherit = 'res.partner'
|
||||||
|
|
||||||
|
vps_server_ids = fields.One2many('vps.server', 'customer_id', string='VPS Servers')
|
||||||
19
ow_vm_management/models/vps_server.py
Normal file
19
ow_vm_management/models/vps_server.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from odoo import models, fields, api
|
||||||
|
|
||||||
|
class VPSServer(models.Model):
|
||||||
|
_name = 'vps.server'
|
||||||
|
_description = 'VPS Server'
|
||||||
|
_inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin']
|
||||||
|
|
||||||
|
name = fields.Char(string='Server Name', required=True)
|
||||||
|
ip_address = fields.Char(string='IP Address', required=True)
|
||||||
|
cpu = fields.Integer(string='CPU Cores')
|
||||||
|
ram = fields.Float(string='RAM (GB)')
|
||||||
|
storage = fields.Float(string='Storage (GB)')
|
||||||
|
os = fields.Char(string='Operating System')
|
||||||
|
customer_id = fields.Many2one('res.partner', string='Customer', required=True)
|
||||||
|
|
||||||
|
def _compute_access_url(self):
|
||||||
|
super()._compute_access_url()
|
||||||
|
for server in self:
|
||||||
|
server.access_url = '/my/vps-servers/%s' % server.id
|
||||||
3
ow_vm_management/security/ir.model.access.csv
Normal file
3
ow_vm_management/security/ir.model.access.csv
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_vps_server_user,vps.server.user,model_vps_server,base.group_user,1,1,1,1
|
||||||
|
access_vps_server_portal,vps.server.portal,model_vps_server,base.group_portal,1,0,0,0
|
||||||
|
90
ow_vm_management/views/portal_templates.xml
Normal file
90
ow_vm_management/views/portal_templates.xml
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<template id="portal_my_home_vps_servers" name="Portal My Home : VPS Servers" inherit_id="portal.portal_my_home" customize_show="True" priority="30">
|
||||||
|
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
|
||||||
|
<t t-call="portal.portal_docs_entry">
|
||||||
|
<t t-set="title">VPS Servers</t>
|
||||||
|
<t t-set="url" t-value="'/my/vps-servers'" />
|
||||||
|
<t t-set="placeholder_count" t-value="'vps_server_count'" />
|
||||||
|
</t>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template id="portal_my_vps_servers" name="My VPS Servers">
|
||||||
|
<t t-call="portal.portal_layout">
|
||||||
|
<t t-set="breadcrumbs_searchbar" t-value="True" />
|
||||||
|
<t t-call="portal.portal_searchbar">
|
||||||
|
<t t-set="title">VPS Servers</t>
|
||||||
|
</t>
|
||||||
|
<t t-if="vps_servers" t-call="portal.portal_table">
|
||||||
|
<thead>
|
||||||
|
<tr class="active">
|
||||||
|
<th>Server Name</th>
|
||||||
|
<th class='d-none d-md-table-cell'>IP Address</th>
|
||||||
|
<th class='d-none d-md-table-cell'>CPU</th>
|
||||||
|
<th class='text-right'>RAM</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<t t-foreach="vps_servers" t-as="server">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a t-att-href="server.get_portal_url()"
|
||||||
|
t-attf-class="tr_vps_server_link"
|
||||||
|
t-att-title="server.name">
|
||||||
|
<t t-esc="server.name" />
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td class="d-none d-md-table-cell">
|
||||||
|
<span t-field="server.ip_address" />
|
||||||
|
</td>
|
||||||
|
<td class="d-none d-md-table-cell">
|
||||||
|
<span t-field="server.cpu" />
|
||||||
|
</td>
|
||||||
|
<td class='text-right'>
|
||||||
|
<span t-field="server.ram" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</t>
|
||||||
|
</tbody>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template id="portal_vps_server_page" name="VPS Server Page">
|
||||||
|
<t t-call="portal.portal_layout">
|
||||||
|
<t t-set="o_portal_fullwidth_alert" groups="base.group_user">
|
||||||
|
<t t-call="portal.portal_back_in_edit_mode">
|
||||||
|
<t t-set="backend_url" t-value="'/web#return_label=Website&model=vps.server&id=%s&view_type=form' % (vps_server.id)"/>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
<t t-call="portal.portal_record_layout">
|
||||||
|
<t t-set="card_header">
|
||||||
|
<h5 class="mb-0">
|
||||||
|
<span t-field="vps_server.name"/>
|
||||||
|
</h5>
|
||||||
|
</t>
|
||||||
|
<t t-set="card_body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 col-md-6">
|
||||||
|
<strong>IP Address:</strong> <span t-field="vps_server.ip_address"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-6">
|
||||||
|
<strong>CPU:</strong> <span t-field="vps_server.cpu"/> cores
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-6">
|
||||||
|
<strong>RAM:</strong> <span t-field="vps_server.ram"/> GB
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-6">
|
||||||
|
<strong>Storage:</strong> <span t-field="vps_server.storage"/> GB
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-6">
|
||||||
|
<strong>Operating System:</strong> <span t-field="vps_server.os"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
</odoo>
|
||||||
25
ow_vm_management/views/res_partner_views.xml
Normal file
25
ow_vm_management/views/res_partner_views.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="view_partner_form_inherit_vps" model="ir.ui.view">
|
||||||
|
<field name="name">res.partner.form.inherit.vps</field>
|
||||||
|
<field name="model">res.partner</field>
|
||||||
|
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//notebook" position="inside">
|
||||||
|
<page string="VPS Servers" attrs="{'invisible': [('is_company', '=', False)]}">
|
||||||
|
<field name="is_company" invisible="1"/>
|
||||||
|
<field name="vps_server_ids" readonly="1">
|
||||||
|
<tree>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="ip_address"/>
|
||||||
|
<field name="cpu"/>
|
||||||
|
<field name="ram"/>
|
||||||
|
<field name="storage"/>
|
||||||
|
<field name="os"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
59
ow_vm_management/views/vps_server_views.xml
Normal file
59
ow_vm_management/views/vps_server_views.xml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="view_vps_server_form" model="ir.ui.view">
|
||||||
|
<field name="name">vps.server.form</field>
|
||||||
|
<field name="model">vps.server</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="ip_address"/>
|
||||||
|
<field name="cpu"/>
|
||||||
|
<field name="ram"/>
|
||||||
|
<field name="storage"/>
|
||||||
|
<field name="os"/>
|
||||||
|
<field name="customer_id"/>
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_vps_server_tree" model="ir.ui.view">
|
||||||
|
<field name="name">vps.server.tree</field>
|
||||||
|
<field name="model">vps.server</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="ip_address"/>
|
||||||
|
<field name="customer_id"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_vps_server" model="ir.actions.act_window">
|
||||||
|
<field name="name">VPS Servers</field>
|
||||||
|
<field name="res_model">vps.server</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Top-level menu: no parent -->
|
||||||
|
<menuitem id="menu_ow_vm_management_root"
|
||||||
|
name="VPS Management"
|
||||||
|
sequence="10"/>
|
||||||
|
|
||||||
|
<!-- A first level in the left side menu is needed
|
||||||
|
before using action= attribute -->
|
||||||
|
<menuitem id="menu_ow_vm_management"
|
||||||
|
name="VPS Management"
|
||||||
|
parent="menu_ow_vm_management_root"
|
||||||
|
sequence="10"/>
|
||||||
|
|
||||||
|
<!-- Second level -->
|
||||||
|
<menuitem id="menu_vps_server"
|
||||||
|
name="VPS Servers"
|
||||||
|
action="action_vps_server"
|
||||||
|
parent="menu_ow_vm_management"
|
||||||
|
sequence="10"/>
|
||||||
|
</odoo>
|
||||||
Reference in New Issue
Block a user