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.device = 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'))
except models.Abon.DoesNotExist:
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)
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,
dev_port__num=switch_port,
device=dev)

6
devapp/base_intr.py

@ -49,12 +49,14 @@ class DevBase(object, metaclass=ABCMeta):
def get_template_name(self) -> AnyStr:
"""Return path to html template for device"""
@property
@abstractmethod
def has_attachable_to_subscriber(self) -> bool:
"""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"""
# fixme: only that is abstract static

40
devapp/dev_types.py

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

14
devapp/models.py

@ -73,11 +73,11 @@ class Device(models.Model):
return self.status
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. '
'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
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):
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 %}
<td>{{ port.num_abons }}</td>
{% 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">
<span class="glyphicon glyphicon-eye-open"></span>
</a>

8
docs/dev.md

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

Loading…
Cancel
Save