odoo-saas-kubernetes/kk_odoo_saas/models/saas_app_website.py

103 lines
3.5 KiB
Python
Executable File

import logging
from odoo import api, fields, models
_logger = logging.getLogger(__name__)
class SaasApp(models.Model):
_name = "saas.app"
_description = "SaaS App"
_order = "name"
_inherit = "saas.period.product.mixin"
name = fields.Char("Technical Name", required=True, index=True)
shortdesc = fields.Char("Module Name", required=True)
dependency_ids = fields.Many2many("saas.app", "saas_apps_dependency_rel", "dep_id", "app_id", string="Dependencies")
icon_image = fields.Binary("Icon")
allow_to_sell = fields.Boolean(default=True, string="Sellable")
@api.model
def create(self, vals):
res = super(SaasApp, self).create(vals)
if not res.product_tmpl_id:
res.product_tmpl_id = self.env["product.template"].create({
"name": res.shortdesc,
"image_1920": res.icon_image,
"saas_app_id": res.id,
"is_saas_product": True,
"type": 'service',
"purchase_ok": False,
"subscription_template_id": self.env.ref("sale_subscription.monthly_subscription").id,
"recurring_invoice": True,
"website_published": True,
"list_price": 0,
})
return res
def write(self, vals):
res = super(SaasApp, self).write(vals)
if vals.get('month_price', None) is not None or vals.get('year_price', None) is not None:
self._update_variant_prices()
return res
def _update_variant_prices(self):
for app in self:
for variant in app.product_tmpl_id.product_variant_ids:
for attr in variant.product_template_attribute_value_ids:
if attr.name == "Monthly":
attr.update({'price_extra': app.month_price})
if attr.name == "Annually":
attr.update({'price_extra': app.year_price})
def _search_or_create(self, ir_module):
app = self.search([("name", "=", ir_module.name)])
if not app:
app = self.env["saas.app"].create({
"name": ir_module.name,
"shortdesc": ir_module.shortdesc,
"icon_image": ir_module.icon_image
})
return app
def dependencies_str(self):
self.ensure_one()
visited_saas_module_ids = set()
def make_list(deps):
result = []
for dep in deps:
if dep.id in visited_saas_module_ids:
continue
visited_saas_module_ids.add(dep.id)
result += [dep.name] + make_list(dep.dependency_ids)
return result
return ",".join(make_list(self.dependency_ids))
@api.model
def action_make_applist_from_local_instance(self):
for x in map(self.browse, self._search([])):
x.unlink()
def walk(parent_ir_module_name, parent_app_name=None):
modules = self.env["ir.module.module.dependency"].sudo().search([("name", "=", parent_ir_module_name)]).mapped("module_id")
for m in modules:
app_name = None
if m.application:
app = self.env["saas.app"]._search_or_create(m)
if parent_app_name:
app.dependency_ids |= self.env["saas.app"].search([("name", "=", parent_app_name)])
app_name = app.name
else:
app_name = parent_app_name
walk(m.name, app_name)
walk("base")