This commit is contained in:
Mario
2024-08-04 01:30:06 +02:00
commit 04d1057a8a
17 changed files with 310 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
from . import models
from . import controllers

View 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',
}

Binary file not shown.

View File

@@ -0,0 +1 @@
from . import portal

View 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)

View File

@@ -0,0 +1,2 @@
from . import vps_server
from . import res_partner

View 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')

View 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

View 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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_vps_server_user vps.server.user model_vps_server base.group_user 1 1 1 1
3 access_vps_server_portal vps.server.portal model_vps_server base.group_portal 1 0 0 0

View 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&amp;model=vps.server&amp;id=%s&amp;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>

View 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>

View 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>