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