Browse Source

Fix init device types

devel
bashmak 8 years ago
parent
commit
5c5630adc1
  1. 3
      abonapp/views.py
  2. 2
      agent/commands/dhcp.py
  3. 6
      devapp/base_intr.py
  4. 40
      devapp/dev_types.py
  5. 14
      devapp/models.py
  6. 2
      devapp/templates/devapp/manage_ports/list.html
  7. 8
      docs/dev.md

3
abonapp/views.py

@ -602,7 +602,8 @@ def clear_dev(request, gid, uname):
abon = models.Abon.objects.get(username=uname) abon = models.Abon.objects.get(username=uname)
abon.device = None abon.device = None
abon.dev_port = None abon.dev_port = None
abon.save(update_fields=('device', 'dev_port'))
abon.is_dynamic_ip = False
abon.save(update_fields=('device', 'dev_port', 'is_dynamic_ip'))
messages.success(request, _('Device has successfully unattached')) messages.success(request, _('Device has successfully unattached'))
except models.Abon.DoesNotExist: except models.Abon.DoesNotExist:
messages.error(request, _('Abon does not exist')) messages.error(request, _('Abon does not exist'))

2
agent/commands/dhcp.py

@ -9,7 +9,7 @@ def dhcp_commit(client_ip: str, client_mac: str, switch_mac: str, switch_port: i
dev = Device.objects.get(mac_addr=switch_mac) dev = Device.objects.get(mac_addr=switch_mac)
mngr_class = dev.get_manager_klass() mngr_class = dev.get_manager_klass()
if mngr_class.is_use_device_port():
if mngr_class.is_use_device_port:
abon = Abon.objects.get(dev_port__device=dev, abon = Abon.objects.get(dev_port__device=dev,
dev_port__num=switch_port, dev_port__num=switch_port,
device=dev) device=dev)

6
devapp/base_intr.py

@ -49,12 +49,14 @@ class DevBase(object, metaclass=ABCMeta):
def get_template_name(self) -> AnyStr: def get_template_name(self) -> AnyStr:
"""Return path to html template for device""" """Return path to html template for device"""
@property
@abstractmethod @abstractmethod
def has_attachable_to_subscriber(self) -> bool: def has_attachable_to_subscriber(self) -> bool:
"""Can connect device to subscriber""" """Can connect device to subscriber"""
@abstract_static_method
def is_use_device_port() -> bool:
@property
@abstractmethod
def is_use_device_port(self) -> bool:
"""True if used device port while opt82 authorization""" """True if used device port while opt82 authorization"""
# fixme: only that is abstract static # fixme: only that is abstract static

40
devapp/dev_types.py

@ -60,6 +60,9 @@ class DLinkPort(BasePort):
class DLinkDevice(DevBase, SNMPBaseWorker): class DLinkDevice(DevBase, SNMPBaseWorker):
has_attachable_to_subscriber = True
is_use_device_port = True
def __init__(self, dev_instance): def __init__(self, dev_instance):
DevBase.__init__(self, dev_instance) DevBase.__init__(self, dev_instance)
SNMPBaseWorker.__init__(self, dev_instance.ip_address, dev_instance.man_passw, 2) SNMPBaseWorker.__init__(self, dev_instance.ip_address, dev_instance.man_passw, 2)
@ -103,13 +106,6 @@ class DLinkDevice(DevBase, SNMPBaseWorker):
def get_template_name(self): def get_template_name(self):
return 'ports.html' return 'ports.html'
def has_attachable_to_subscriber(self) -> bool:
return True
@staticmethod
def is_use_device_port():
return True
@staticmethod @staticmethod
def validate_extra_snmp_info(v: str) -> None: def validate_extra_snmp_info(v: str) -> None:
# Dlink has no require snmp info # Dlink has no require snmp info
@ -142,6 +138,9 @@ class ONUdev(BasePort):
class OLTDevice(DevBase, SNMPBaseWorker): class OLTDevice(DevBase, SNMPBaseWorker):
has_attachable_to_subscriber = False
is_use_device_port = False
def __init__(self, dev_instance): def __init__(self, dev_instance):
DevBase.__init__(self, dev_instance) DevBase.__init__(self, dev_instance)
SNMPBaseWorker.__init__(self, dev_instance.ip_address, dev_instance.man_passw, 2) SNMPBaseWorker.__init__(self, dev_instance.ip_address, dev_instance.man_passw, 2)
@ -187,13 +186,6 @@ class OLTDevice(DevBase, SNMPBaseWorker):
def get_template_name(self): def get_template_name(self):
return 'olt.html' return 'olt.html'
def has_attachable_to_subscriber(self) -> bool:
return False
@staticmethod
def is_use_device_port():
return False
@staticmethod @staticmethod
def validate_extra_snmp_info(v: str) -> None: def validate_extra_snmp_info(v: str) -> None:
# Olt has no require snmp info # Olt has no require snmp info
@ -208,6 +200,9 @@ class OLTDevice(DevBase, SNMPBaseWorker):
class OnuDevice(DevBase, SNMPBaseWorker): class OnuDevice(DevBase, SNMPBaseWorker):
has_attachable_to_subscriber = True
is_use_device_port = False
def __init__(self, dev_instance): def __init__(self, dev_instance):
DevBase.__init__(self, dev_instance) DevBase.__init__(self, dev_instance)
dev_ip_addr = None dev_ip_addr = None
@ -242,13 +237,6 @@ class OnuDevice(DevBase, SNMPBaseWorker):
def get_template_name(self): def get_template_name(self):
return "onu.html" return "onu.html"
def has_attachable_to_subscriber(self) -> bool:
return True
@staticmethod
def is_use_device_port():
return False
def get_details(self): def get_details(self):
if self.db_instance is None: if self.db_instance is None:
return return
@ -330,6 +318,9 @@ class EltexPort(BasePort):
class EltexSwitch(DLinkDevice): class EltexSwitch(DLinkDevice):
has_attachable_to_subscriber = True
is_use_device_port = False
@staticmethod @staticmethod
def description(): def description():
return _('Eltex switch') return _('Eltex switch')
@ -355,13 +346,6 @@ class EltexSwitch(DLinkDevice):
tm = RuTimedelta(timedelta(seconds=uptimestamp / 100)) or RuTimedelta(timedelta()) tm = RuTimedelta(timedelta(seconds=uptimestamp / 100)) or RuTimedelta(timedelta())
return tm return tm
def has_attachable_to_subscriber(self) -> bool:
return True
@staticmethod
def is_use_device_port():
return False
def monitoring_template(self, *args, **kwargs) -> Optional[str]: def monitoring_template(self, *args, **kwargs) -> Optional[str]:
device = self.db_instance device = self.db_instance
return plain_ip_device_mon_template(device) return plain_ip_device_mon_template(device)

14
devapp/models.py

@ -73,11 +73,11 @@ class Device(models.Model):
return self.status return self.status
def get_manager_klass(self): def get_manager_klass(self):
klasses = tuple(kl for kl in self.DEVICE_TYPES if kl[0] == self.devtype)
if len(klasses) > 0:
res = klasses[0][1]
if issubclass(res, DevBase):
return res
klasses = next(kl for kl in self.DEVICE_TYPES if kl[0] == self.devtype)
if klasses:
code, dev_class = klasses
if issubclass(dev_class, DevBase):
return dev_class
raise TypeError('one of types is not subclass of DevBase. ' raise TypeError('one of types is not subclass of DevBase. '
'Or implementation of that device type is not found') 'Or implementation of that device type is not found')
@ -89,8 +89,8 @@ class Device(models.Model):
# Can attach device to subscriber in subscriber page # Can attach device to subscriber in subscriber page
def has_attachable_to_subscriber(self) -> bool: def has_attachable_to_subscriber(self) -> bool:
mngr = self.get_manager_object()
return mngr.has_attachable_to_subscriber()
mngr = self.get_manager_klass()
return mngr.has_attachable_to_subscriber
def __str__(self): def __str__(self):
return "%s: (%s) %s %s" % (self.comment, self.get_devtype_display(), self.ip_address or '', self.mac_addr or '') return "%s: (%s) %s %s" % (self.comment, self.get_devtype_display(), self.ip_address or '', self.mac_addr or '')

2
devapp/templates/devapp/manage_ports/list.html

@ -27,7 +27,7 @@
{% else %} {% else %}
<td>{{ port.num_abons }}</td> <td>{{ port.num_abons }}</td>
{% endif %} {% endif %}
<td class="btn-group btn-group-sm">
<td class="btn-group btn-group-sm btn-group-justified">
<a href="{% url 'devapp:show_subscriber_on_port' gid did port.id %}" class="btn btn-default btn-modal" title="{% trans 'Show subscriber on port' %}" data-toggle="tooltip"> <a href="{% url 'devapp:show_subscriber_on_port' gid did port.id %}" class="btn btn-default btn-modal" title="{% trans 'Show subscriber on port' %}" data-toggle="tooltip">
<span class="glyphicon glyphicon-eye-open"></span> <span class="glyphicon glyphicon-eye-open"></span>
</a> </a>

8
docs/dev.md

@ -47,6 +47,7 @@ class EltexPort(BasePort):
Теперь реализация для свича: Теперь реализация для свича:
```python ```python
class EltexSwitch(DLinkDevice): class EltexSwitch(DLinkDevice):
is_use_device_port = False
@staticmethod @staticmethod
def description(): def description():
@ -80,9 +81,6 @@ class EltexSwitch(DLinkDevice):
def has_attachable_to_subscriber(self) -> bool: def has_attachable_to_subscriber(self) -> bool:
return False return False
@staticmethod
def is_use_device_port():
return False
``` ```
Метод **@description** Просто отображает человекопонятное название вашего устройства в биллинге. Метод **@description** Просто отображает человекопонятное название вашего устройства в биллинге.
Заметьте что строка на английском и заключена в процедуру **_** (это ugettext_lazy, см. в импорте вверху файла), Заметьте что строка на английском и заключена в процедуру **_** (это ugettext_lazy, см. в импорте вверху файла),
@ -102,9 +100,9 @@ class EltexSwitch(DLinkDevice):
Например у Dlink стоит True потому что Dlink стоит во многих местах на доступе, и его порты принадлежат Например у Dlink стоит True потому что Dlink стоит во многих местах на доступе, и его порты принадлежат
абонентам при авторизации. абонентам при авторизации.
Статический метод **@is_use_device_port** используется в DHCP чтоб понять что мы используем для привязки к абоненту всё устройство или
Статическое свойство **@is_use_device_port** используется в DHCP чтоб понять что мы используем для привязки к абоненту всё устройство или
только порт устройства. Например, если у устройства только 1 порт абонента (PON ONU), и мы привязываем этого абонента ко всему устройству только порт устройства. Например, если у устройства только 1 порт абонента (PON ONU), и мы привязываем этого абонента ко всему устройству
а не к порту, то нужно вернуть False, На обычных свичах где мы авторизуем абонента на порту возвращаем True.
а не к порту, то нужно указать False, На обычных свичах где мы авторизуем абонента на порту возвращаем True.
Реализация SNMPBaseWorker по сути не нужна, класс абстрактных методов не имеет. Реализация SNMPBaseWorker по сути не нужна, класс абстрактных методов не имеет.
Потому когда наследуем наследуемся от *DevBase* то в базовые классы добавим и SNMPBaseWorker, как это сделано в *DLinkDevice*: Потому когда наследуем наследуемся от *DevBase* то в базовые классы добавим и SNMPBaseWorker, как это сделано в *DLinkDevice*:

Loading…
Cancel
Save