103 lines
3.5 KiB
Python
Executable File
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")
|