perf: 优化协议,支持 port from addr

pull/10879/head
ibuler 2023-07-04 10:29:27 +08:00
parent 41e39c9614
commit 8dbe61100b
4 changed files with 16 additions and 4 deletions

View File

@ -56,7 +56,7 @@ class BaseType(TextChoices):
for k, v in cls.get_choices(): for k, v in cls.get_choices():
tp_base = {**base_default, **base.get(k, {})} tp_base = {**base_default, **base.get(k, {})}
tp_auto = {**automation_default, **automation.get(k, {})} tp_auto = {**automation_default, **automation.get(k, {})}
tp_protocols = {**protocols_default, **protocols.get(k, {})} tp_protocols = {**protocols_default, **{'port_from_addr': False}, **protocols.get(k, {})}
tp_protocols = cls._parse_protocols(tp_protocols, k) tp_protocols = cls._parse_protocols(tp_protocols, k)
tp_constrains = {**tp_base, 'protocols': tp_protocols, 'automation': tp_auto} tp_constrains = {**tp_base, 'protocols': tp_protocols, 'automation': tp_auto}
constrains[k] = tp_constrains constrains[k] = tp_constrains

View File

@ -2,6 +2,7 @@ from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from common.db.models import ChoicesMixin from common.db.models import ChoicesMixin
from common.decorators import cached_method
from .base import FillType from .base import FillType
__all__ = ['Protocol'] __all__ = ['Protocol']
@ -150,11 +151,13 @@ class Protocol(ChoicesMixin, models.TextChoices):
return { return {
cls.k8s: { cls.k8s: {
'port': 443, 'port': 443,
'port_from_addr': True,
'required': True, 'required': True,
'secret_types': ['token'], 'secret_types': ['token'],
}, },
cls.http: { cls.http: {
'port': 80, 'port': 80,
'port_from_addr': True,
'secret_types': ['password'], 'secret_types': ['password'],
'setting': { 'setting': {
'autofill': { 'autofill': {
@ -187,6 +190,7 @@ class Protocol(ChoicesMixin, models.TextChoices):
cls.chatgpt: { cls.chatgpt: {
'port': 443, 'port': 443,
'required': True, 'required': True,
'port_from_addr': True,
'secret_types': ['api_key'], 'secret_types': ['api_key'],
'setting': { 'setting': {
'api_mode': { 'api_mode': {
@ -205,6 +209,7 @@ class Protocol(ChoicesMixin, models.TextChoices):
} }
@classmethod @classmethod
@cached_method(ttl=600)
def settings(cls): def settings(cls):
return { return {
**cls.device_protocols(), **cls.device_protocols(),

View File

@ -8,6 +8,8 @@ from common.db.models import JMSBaseModel
__all__ = ['Platform', 'PlatformProtocol', 'PlatformAutomation'] __all__ = ['Platform', 'PlatformProtocol', 'PlatformAutomation']
from common.utils import lazyproperty
class PlatformProtocol(models.Model): class PlatformProtocol(models.Model):
name = models.CharField(max_length=32, verbose_name=_('Name')) name = models.CharField(max_length=32, verbose_name=_('Name'))
@ -26,6 +28,11 @@ class PlatformProtocol(models.Model):
def secret_types(self): def secret_types(self):
return Protocol.settings().get(self.name, {}).get('secret_types', ['password']) return Protocol.settings().get(self.name, {}).get('secret_types', ['password'])
@lazyproperty
def port_from_addr(self):
from assets.const.protocol import Protocol as ProtocolConst
return ProtocolConst.settings().get(self.name, {}).get('port_from_addr', False)
class PlatformAutomation(models.Model): class PlatformAutomation(models.Model):
ansible_enabled = models.BooleanField(default=False, verbose_name=_("Enabled")) ansible_enabled = models.BooleanField(default=False, verbose_name=_("Enabled"))

View File

@ -46,13 +46,13 @@ class PlatformAutomationSerializer(serializers.ModelSerializer):
class PlatformProtocolSerializer(serializers.ModelSerializer): class PlatformProtocolSerializer(serializers.ModelSerializer):
setting = MethodSerializer(required=False, label=_("Setting")) setting = MethodSerializer(required=False, label=_("Setting"))
port_from_addr = serializers.BooleanField(label=_("Port from addr"), read_only=True)
class Meta: class Meta:
model = PlatformProtocol model = PlatformProtocol
fields = [ fields = [
"id", "name", "port", "primary", "id", "name", "port", "port_from_addr", "primary",
"required", "default", "public", "required", "default", "public", "secret_types", "setting",
"secret_types", "setting",
] ]
extra_kwargs = { extra_kwargs = {
"primary": { "primary": {