From 49ffcb34c88c61ac614f3d8ca559bf85b01b2003 Mon Sep 17 00:00:00 2001 From: Cristian Salamea Date: Fri, 28 Jul 2017 09:45:09 -0500 Subject: [PATCH] [IMP] module to manage DNS zones --- saas_domains/__init__.py | 3 ++ saas_domains/__manifest__.py | 15 +++++++ saas_domains/models/__init__.py | 3 ++ saas_domains/models/models.py | 70 +++++++++++++++++++++++++++++ saas_domains/views/domain_views.xml | 56 +++++++++++++++++++++++ 5 files changed, 147 insertions(+) create mode 100644 saas_domains/__init__.py create mode 100644 saas_domains/__manifest__.py create mode 100644 saas_domains/models/__init__.py create mode 100644 saas_domains/models/models.py create mode 100644 saas_domains/views/domain_views.xml diff --git a/saas_domains/__init__.py b/saas_domains/__init__.py new file mode 100644 index 000000000..cde864bae --- /dev/null +++ b/saas_domains/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/saas_domains/__manifest__.py b/saas_domains/__manifest__.py new file mode 100644 index 000000000..dfa5ae91c --- /dev/null +++ b/saas_domains/__manifest__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'SaaS Sysadmin DNS Manager', + 'version': '10.0.1.0.0', + 'author': 'Cristian Salamea', + 'license': 'LGPL-3', + 'category': 'SaaS', + "support": "apps@it-projects.info", + 'website': 'https://it-projects.info', + 'depends': ['saas_sysadmin'], + 'data': [ + 'views/domain_views.xml' + ], + 'installable': True, +} diff --git a/saas_domains/models/__init__.py b/saas_domains/models/__init__.py new file mode 100644 index 000000000..cde864bae --- /dev/null +++ b/saas_domains/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/saas_domains/models/models.py b/saas_domains/models/models.py new file mode 100644 index 000000000..2869032f1 --- /dev/null +++ b/saas_domains/models/models.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models, fields + + +class SaasDomainZone(models.Model): + _name = 'saas_sysadmin.domain.zone' + + name = fields.Char('Domain', required=True) + soa_email = fields.Char('SOA Email', required=True) + a_record_ids = fields.One2many('saas_sysadmin.domain.record', 'zone_id', 'A/AAA Records') + dns_provider = fields.Selection( + [ + ('route53', 'AWS Route53'), + ('linode', 'Linode') + ], + string='DNS Provider', + required=True, + default='route53' + ) + + @api.multi + def action_pull_records(self): + raise NotImplementedError + + @api.multi + def action_push_records(self): + raise NotImplementedError + + +class SaasDomainRecord(models.Model): + _name = 'saas_sysadmin.domain.record' + + hostname = fields.Char('Hostname', required=True) + ttl_value = fields.Char('TTL') + type = fields.Selection( + [ + ('ns', 'NS'), + ('mx', 'MX'), + ('a', 'A/AAA'), + ('cname', 'CNAME'), + ('txt', 'TXT') + ], + required=True, + default='a' + ) + ip_address = fields.Char('IP Address') + zone_id = fields.Many2one(comodel_name='saas_sysadmin.domain.zone', string='Zone', ondelete='cascade') + auto_sync = fields.Boolean('Auto Sync with Provider (CRUD)') + + @api.multi + def action_sync(self, method='POST'): + """ + based on method will call API + """ + raise NotImplementedError + + @api.model + def create(self, values): + record = super(SaasDomainRecord, self).create(values) + if record.auto_sync: + self.action_sync() + return record + + @api.multi + def unlink(self): + for obj in self: + if obj.auto_sync: + self.action_sync('DELETE') + return True diff --git a/saas_domains/views/domain_views.xml b/saas_domains/views/domain_views.xml new file mode 100644 index 000000000..866e065d6 --- /dev/null +++ b/saas_domains/views/domain_views.xml @@ -0,0 +1,56 @@ + + + + + + + view.domain.zone.tree + saas_sysadmin.domain.zone + + + + + + + + + + + view.domain.zone.form + saas_sysadmin.domain.zone + +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ + + Domain Zone + ir.actions.act_window + saas_sysadmin.domain.zone + form + tree,form + + + +
+