Browse Source

Move ports page to device info page

devel
Dmitry Novikov 8 years ago
parent
commit
a2c52d93a9
  1. 2
      abonapp/views.py
  2. 2
      devapp/dev_types.py
  3. 4
      devapp/locale/ru/LC_MESSAGES/django.po
  4. 105
      devapp/templates/devapp/custom_dev_page/generic_switch.html
  5. 5
      devapp/templates/devapp/ext.htm
  6. 70
      devapp/templates/devapp/manage_ports/list.html
  7. 7
      devapp/urls.py
  8. 51
      devapp/views.py

2
abonapp/views.py

@ -837,7 +837,7 @@ def save_user_dev_port(request, gid: int, uname):
pass
except models.Abon.MultipleObjectsReturned:
messages.error(request, _('Multiple users on the same device port'))
return redirect('devapp:manage_ports', abon.device.group.pk, abon.device.pk)
return redirect('devapp:view', abon.device.group.pk, abon.device.pk)
abon.dev_port = port
if abon.is_dynamic_ip != is_dynamic_ip:

2
devapp/dev_types.py

@ -102,7 +102,7 @@ class DLinkDevice(DevBase, SNMPBaseWorker):
return tm
def get_template_name(self):
return 'ports.html'
return 'generic_switch.html'
@staticmethod
def validate_extra_snmp_info(v: str) -> None:

4
devapp/locale/ru/LC_MESSAGES/django.po

@ -378,8 +378,8 @@ msgid "Enable port"
msgstr "Включить порт"
#: templates/devapp/custom_dev_page/ports.html:80
msgid "Device log"
msgstr "Лог устройства"
msgid "Ports management"
msgstr "Управление портами"
#: templates/devapp/custom_dev_page/ports.html:87
msgid "Level"

105
devapp/templates/devapp/custom_dev_page/ports.html → devapp/templates/devapp/custom_dev_page/generic_switch.html

@ -77,25 +77,64 @@
<div class="col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Device log' %}</h3>
<h3 class="panel-title">{% trans 'Ports management' %}</h3>
</div>
<div class="panel-body">
<table class="table table-responsive">
<thead>
<table class="table table-responsive">
<thead>
<tr>
<th class="col-sm-1">{% trans 'Number' %}</th>
<th class="col-sm-5">{% trans 'Description' %}</th>
<th class="col-sm-5">{% trans 'Count of subscribers' %}</th>
<th class="col-sm-1">#</th>
</tr>
</thead>
<tbody>
{% with gid=dev.group.pk did=dev.pk can_del_port=perms.devapp.delete_port can_edit_port=perms.devapp.change_port %}
{% for port in ports_db %}
<tr>
<td>ID</td>
<td>{% trans 'Level' %}</td>
<td>{% trans 'Description' %}</td>
<td>{% trans 'Date' %}</td>
<td>{{ port.num }}</td>
<td>{{ port.descr|default:'-' }}</td>
{% if port.num_abons > 1 %}
{% url 'devapp:fix_port_conflict' gid did port.id as fixurl %}
<td class="text-danger"><b>{{ port.num_abons }}</b>. {% blocktrans with furl=fixurl %}Port should not have more than one subscriber, <a href='{{ furl }}'>fix that</a>{% endblocktrans %}</td>
{% else %}
<td>{{ port.num_abons }}</td>
{% endif %}
<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>
{% if can_del_port %}
<a href="{% url 'devapp:del_port' gid did port.pk %}" class="btn btn-danger btn-modal" title="{% trans 'Delete' %}">
<span class="glyphicon glyphicon-remove-circle"></span>
</a>
{% endif %}
{% if can_edit_port %}
<a href="{% url 'devapp:edit_port' gid did port.pk %}" class="btn btn-primary btn-modal" title="{% trans 'Edit' %}">
<span class="glyphicon glyphicon-edit"></span>
</a>
{% endif %}
</td>
</tr>
</thead>
<tbody>
{% empty %}
<tr>
<td colspan="4">Coming soon..</td>
<td colspan="4">{% trans 'Ports not found' %}</td>
</tr>
</tbody>
</table>
</div>
{% endfor %}
{% endwith %}
</tbody>
<tfoot>
<tr>
<td colspan="4" class="btn-group">
{% if perms.devapp.add_port %}
<a href="{% url 'devapp:add_ports' dev.group.pk dev.pk %}" class="btn btn-sm btn-default" title="{% trans 'Add' %}">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add ports' %}
</a>
{% endif %}
</td>
</tr>
</tfoot>
</table>
</div>
</div>
<div class="col-sm-6">
@ -103,28 +142,26 @@
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Ports comment' %}</h3>
</div>
<div class="panel-body">
<table class="table table-responsive">
<thead>
<table class="table table-responsive">
<thead>
<tr>
<th width="50">{% trans 'Port' %}</th>
<th>{% trans 'Title' %}</th>
</tr>
</thead>
<tbody>
{% for port in ports %}
<tr>
<th width="50">{% trans 'Port' %}</th>
<th>{% trans 'Title' %}</th>
<td>{{ port.num }}</td>
<td>{{ port.nm|default:'-' }}</td>
</tr>
</thead>
<tbody>
{% for port in ports %}
<tr>
<td>{{ port.num }}</td>
<td>{{ port.nm|default:'-' }}</td>
</tr>
{% empty %}
<tr>
<td colspan="2">{% trans 'We have not received info for ports' %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% empty %}
<tr>
<td colspan="2">{% trans 'We have not received info for ports' %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>

5
devapp/templates/devapp/ext.htm

@ -37,11 +37,6 @@
<li{% if devapp_edit == request.path %} class="active"{% endif %}>
<a href="{{ devapp_edit }}">{% trans 'Edit' %}</a>
</li>
{% url 'devapp:manage_ports' dev.group.pk|default:0 dev.pk as devapp_mports %}
<li{% if devapp_mports == request.path %} class="active"{% endif %}>
<a href="{{ devapp_mports }}">{% trans 'Ports' %}</a>
</li>
{% endif %}
</ul>

70
devapp/templates/devapp/manage_ports/list.html

@ -1,70 +0,0 @@
{% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %}
{% load i18n %}
{% block content %}
<div class="row">
<div class="col-sm-12">
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th class="col-sm-1">{% trans 'Number' %}</th>
<th class="col-sm-5">{% trans 'Description' %}</th>
<th class="col-sm-5">{% trans 'Count of subscribers' %}</th>
<th class="col-sm-1">#</th>
</tr>
</thead>
<tbody>
{% with gid=dev.group.pk did=dev.pk can_del_port=perms.devapp.delete_port can_edit_port=perms.devapp.change_port %}
{% for port in ports %}
<tr>
<td>{{ port.num }}</td>
<td>{{ port.descr|default:'-' }}</td>
{% if port.num_abons > 1 %}
{% url 'devapp:fix_port_conflict' gid did port.id as fixurl %}
<td class="text-danger"><b>{{ port.num_abons }}</b>. {% blocktrans with furl=fixurl %}Port should not have more than one subscriber, <a href='{{ furl }}'>fix that</a>{% endblocktrans %}</td>
{% else %}
<td>{{ port.num_abons }}</td>
{% endif %}
<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>
{% if can_del_port %}
<a href="{% url 'devapp:del_port' gid did port.pk %}" class="btn btn-danger btn-modal" title="{% trans 'Delete' %}">
<span class="glyphicon glyphicon-remove-circle"></span>
</a>
{% endif %}
{% if can_edit_port %}
<a href="{% url 'devapp:edit_port' gid did port.pk %}" class="btn btn-primary btn-modal" title="{% trans 'Edit' %}">
<span class="glyphicon glyphicon-edit"></span>
</a>
{% endif %}
</td>
</tr>
{% empty %}
<tr>
<td colspan="4">{% trans 'Ports not found' %}</td>
</tr>
{% endfor %}
{% endwith %}
</tbody>
<tfoot>
<tr>
<td colspan="4" class="btn-group">
{% if perms.devapp.add_port %}
<a href="{% url 'devapp:add_ports' dev.group.pk dev.pk %}" class="btn btn-sm btn-default" title="{% trans 'Add' %}">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add ports' %}
</a>
{% endif %}
</td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
{% endblock %}

7
devapp/urls.py

@ -14,16 +14,15 @@ urlpatterns = [
path('<int:group_id>/<int:device_id>/add/', views.add_single_port, name='add_port'),
path('<int:group_id>/<int:device_id>/edit/', views.DeviceUpdate.as_view(), name='edit'),
path('<int:group_id>/<int:device_id>/edit_extra/', views.DeviceUpdateExtra.as_view(), name='extra_data_edit'),
path('<int:group_id>/<int:device_id>/ports/', views.manage_ports, name='manage_ports'),
path('<int:group_id>/<int:device_id>/ports/<int:port_id>/fix_port_conflict/', views.fix_port_conflict,
name='fix_port_conflict'),
path('<int:group_id>/<int:device_id>/ports/<int:port_id>/show_subscriber_on_port/',
views.ShowSubscriberOnPort.as_view(), name='show_subscriber_on_port'),
path('<int:group_id>/<int:device_id>/ports_add/', views.add_ports, name='add_ports'),
path('<int:group_id>/<int:device_id>/register_device/', views.register_device, name='dev_register'),
re_path('^(\d+)/(?P<device_id>\d+)/(?P<portid>\d+)_(?P<status>[0-1]{1})$', views.toggle_port, name='port_toggle'),
path('<int:group_id>/<int:device_id>/<int:portid>/del/', views.delete_single_port, name='del_port'),
path('<int:group_id>/<int:device_id>/<int:portid>/edit/', views.edit_single_port, name='edit_port'),
re_path('^(\d+)/(?P<device_id>\d+)/(?P<port_id>\d+)_(?P<status>[0-1]{1})$', views.toggle_port, name='port_toggle'),
path('<int:group_id>/<int:device_id>/<int:port_id>/del/', views.delete_single_port, name='del_port'),
path('<int:group_id>/<int:device_id>/<int:port_id>/edit/', views.edit_single_port, name='edit_port'),
path('fix_device_group/<int:device_id>/', views.fix_device_group, name='fix_device_group'),
path('search_dev/', views.search_dev),

51
devapp/views.py

@ -247,29 +247,6 @@ class DeviceUpdateExtra(UpdateView):
return r
@login_required
@only_admins
@permission_required('devapp.change_device')
def manage_ports(request, group_id: int, device_id: int):
device = ports = None
try:
device = Device.objects.get(pk=device_id)
if device.group is None:
messages.error(request, _('Device does not have a group, please fix that'))
return redirect('devapp:fix_device_group', device.pk)
ports = Port.objects.filter(device=device).annotate(num_abons=Count('abon'))
except Device.DoesNotExist:
messages.error(request, _('Device does not exist'))
return redirect('devapp:group_list')
except DeviceDBException as e:
messages.error(request, e)
return render(request, 'devapp/manage_ports/list.html', {
'ports': ports,
'dev': device
})
@method_decorator(login_decs, name='dispatch')
class ShowSubscriberOnPort(global_base_views.RedirectWhenErrorMixin, DetailView):
template_name = 'devapp/manage_ports/modal_show_subscriber_on_port.html'
@ -366,29 +343,29 @@ def add_ports(request, group_id: int, device_id: int):
@login_required
@only_admins
@permission_required('devapp.delete_port')
def delete_single_port(request, group_id, device_id, portid):
def delete_single_port(request, group_id, device_id, port_id):
try:
if request.method == 'POST':
if request.POST.get('confirm') == 'yes':
Port.objects.get(pk=portid).delete()
Port.objects.get(pk=port_id).delete()
messages.success(request, _('Port successfully removed'))
else:
return render(request, 'devapp/manage_ports/modal_del_port.html', {
'grp': group_id,
'did': device_id,
'port_id': portid
'port_id': port_id
})
except Port.DoesNotExist:
messages.error(request, _('Port does not exist'))
except DeviceDBException as e:
messages.error(request, e)
return redirect('devapp:manage_ports', group_id, device_id)
return redirect('devapp:view', group_id, device_id)
@login_required
@only_admins
@permission_required('devapp.add_port')
def edit_single_port(request, group_id, device_id, port_id):
def edit_single_port(request, group_id: int, device_id: int, port_id: int):
try:
port = Port.objects.get(pk=port_id)
if request.method == 'POST':
@ -398,7 +375,7 @@ def edit_single_port(request, group_id, device_id, port_id):
messages.success(request, _('Port successfully saved'))
else:
messages.error(request, _('Form is invalid, check fields and try again'))
return redirect('devapp:manage_ports', group_id, device_id)
return redirect('devapp:view', group_id, device_id)
frm = PortForm(instance=port)
return render(request, 'devapp/manage_ports/modal_add_edit_port.html', {
@ -411,7 +388,7 @@ def edit_single_port(request, group_id, device_id, port_id):
messages.error(request, _('Port does not exist'))
except (DeviceDBException, DuplicateEntry) as e:
messages.error(request, e)
return redirect('devapp:manage_ports', group_id, device_id)
return redirect('devapp:view', group_id, device_id)
@login_required
@ -425,7 +402,7 @@ def add_single_port(request, group_id, device_id):
if frm.is_valid():
frm.save()
messages.success(request, _('Port successfully saved'))
return redirect('devapp:manage_ports', group_id, device_id)
return redirect('devapp:view', group_id, device_id)
else:
messages.error(request, _('Form is invalid, check fields and try again'))
else:
@ -442,7 +419,7 @@ def add_single_port(request, group_id, device_id):
messages.error(request, _('Device does not exist'))
except (DeviceDBException, DuplicateEntry) as e:
messages.error(request, e)
return redirect('devapp:manage_ports', group_id, device_id)
return redirect('devapp:view', group_id, device_id)
@login_required
@ -474,7 +451,8 @@ def devview(request, group_id: int, device_id: int):
'dev': device,
'ports': ports,
'dev_accs': Abon.objects.filter(device=device),
'dev_manager': manager
'dev_manager': manager,
'ports_db': Port.objects.filter(device=device).annotate(num_abons=Count('abon')),
})
except EasySNMPError as e:
messages.error(request, "%s: %s" % (gettext('SNMP error on device'), e))
@ -502,8 +480,7 @@ def zte_port_view_uncfg(request, group_id: str, device_id: str, fiber_id: str):
@login_required
@only_admins
@permission_required('devapp.can_toggle_ports')
def toggle_port(request, device_id: int, portid: int, status=0):
portid = int(portid)
def toggle_port(request, device_id: int, port_id: int, status=0):
status = int(status)
device = get_object_or_404(Device, id=int(device_id))
try:
@ -512,9 +489,9 @@ def toggle_port(request, device_id: int, portid: int, status=0):
manager = device.get_manager_object()
ports = tuple(manager.get_ports())
if status:
ports[portid - 1].enable()
ports[port_id - 1].enable()
else:
ports[portid - 1].disable()
ports[port_id - 1].disable()
else:
messages.warning(request, _('Not Set snmp device password'))
else:

Loading…
Cancel
Save