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