Browse Source

Add markers on map

devel
bashmak 8 years ago
parent
commit
e531974d42
  1. 1
      README.md
  2. 2
      agent/monitoring_agent.py
  3. 2
      devapp/urls.py
  4. 15
      devapp/views.py
  5. 18
      docs/map.md
  6. 6
      mapapp/locale/ru/LC_MESSAGES/django.po
  7. 40
      mapapp/templates/maps/ya_index.html
  8. 4
      mapapp/urls.py
  9. 44
      mapapp/views.py
  10. BIN
      static/img/gmarkers/relay_rack.png

1
README.md

@ -11,3 +11,4 @@ P.S. Возможно понадобится **Python 3.5** и выше из-з
* [Разработка расширений](./docs/dev.md)
* [Сбор информации трафика по netflow](./docs/netflow.md)
* [Работа с представлениями](./docs/views.md)
* [Карта](./docs/map.md)

2
agent/monitoring_agent.py

@ -43,7 +43,7 @@ def validate_status(text):
def send_request(ip, status, sign):
r = requests.get(
"%(domain)s/dev/on_device_down/" % {'domain': SERVER_DOMAIN},
"%(domain)s/dev/on_device_event/" % {'domain': SERVER_DOMAIN},
params={
'ip': ip,
'status': status,

2
devapp/urls.py

@ -26,5 +26,5 @@ urlpatterns = [
url(r'^search_dev$', views.search_dev),
# Monitoring api
url(r'^on_device_down/$', views.OnDevDown.as_view())
url(r'^on_device_event/$', views.OnDeviceMonitoringEvent.as_view())
]

15
devapp/views.py

@ -513,7 +513,7 @@ def fix_port_conflict(request, group_id, device_id, port_id):
})
class OnDevDown(global_base_views.AllowedSubnetMixin, global_base_views.HashAuthView):
class OnDeviceMonitoringEvent(global_base_views.AllowedSubnetMixin, global_base_views.HashAuthView):
#
# Api view for monitoring devices
#
@ -535,12 +535,6 @@ class OnDevDown(global_base_views.AllowedSubnetMixin, global_base_views.HashAuth
if device_down is None:
return {'text': 'Devices with ip %s does not exist' % dev_ip}
if not device_down.is_noticeable:
return {'text': 'Notification for %s is unnecessary' % device_down.ip_address}
recipients = UserProfile.objects.get_profiles_by_group(device_down.group.pk)
names = list()
if dev_status == 'UP':
device_down.status = 'up'
notify_text = 'Device %(device_name)s is up'
@ -553,8 +547,15 @@ class OnDevDown(global_base_views.AllowedSubnetMixin, global_base_views.HashAuth
else:
device_down.status = 'und'
notify_text = 'Device %(device_name)s getting undefined status code'
device_down.save(update_fields=['status'])
if not device_down.is_noticeable:
return {'text': 'Notification for %s is unnecessary' % device_down.ip_address}
recipients = UserProfile.objects.get_profiles_by_group(device_down.group.pk)
names = list()
for recipient in recipients:
send_notify(
msg_text=gettext(notify_text) % {

18
docs/map.md

@ -0,0 +1,18 @@
### Маркеры
На карте есть 5 видов маркеров, хранятся файлы этих маркеров в папке *djing/static/img/gmarkers*.
Каждый из них отличается цветом и иконкой в центре. Так зелёный маркер с значком HDD в
центре означает что устройство получило статус *в сети* от мониторинга. Так они выглядят:
* ![UP](../static/img/gmarkers/dev_ok.png) - UP, устройство в сети.
* ![DOWN](../static/img/gmarkers/dev_bug.png) - DOWN | UNREACHABLE, устройство не в сети или
не доступно
* ![undefined](../static/img/gmarkers/dev.png) - устройство имеет не определённый статус,
скорее всего мониторинг ещё не передавал статус этому устройству.
* ![No device](../static/img/gmarkers/flag_black.png) - на этой точке нет ни одного
устройства. Значит надо назначить в настройках карты устройства на эту точку.
* ![rack](../static/img/gmarkers/relay_rack.png) - Это [рэковая стойка](https://ru.wikipedia.org/wiki/Телекоммуникационная_стойка).
Значит на этой точке назначены несколько устройств.
### Список групп
Справа есть блок в котором перечислены список групп, созданных в меню *Группы*, при нажатии
на какую-либо из элементов этого списка будут показаны все точки, устройства которых
состоят в этой группе.

6
mapapp/locale/ru/LC_MESSAGES/django.po

@ -165,3 +165,9 @@ msgstr "Геоточка не найдена"
#, python-format
msgid "Map point '%(title)s' has been deleted"
msgstr "Геоточка '%(title)s' была удалена"
msgid "Please allow popups for this website"
msgstr "Разрешите сайту открывать всплывающие окна"
msgid "Help"
nsgstr "Справка"

40
mapapp/templates/maps/ya_index.html

@ -17,26 +17,47 @@
plcmrk.properties.set('balloonContent', html);
}
function open_in_new_window(e){
var data = e.get('target').properties._data;
var win = window.open("{% url 'mapapp:to_single_dev' %}?dot_id=" + data.dot_id, '_blank');
if (win)
win.focus();
else
showErr("{% trans 'Please allow popups for this website' %}");
}
function load_dots(r){
for(let e of r){
var iconname='flag_black.png';
if(e.devcount > 0)
iconname='dev_ok.png';
var iconname = 'dev.png';;
var click_callback = placemark_click;
if(e.devcount > 1){
iconname='relay_rack.png';
}else if(e.devcount == 1){
var dev = e.device;
console.log(dev.status);
if(dev.status == 'unr' || dev.status == 'dwn')
iconname='dev_bug.png';
else if(dev.status == 'up')
iconname='dev_ok.png';
click_callback = open_in_new_window;
}else{
iconname='flag_black.png';
}
dot_place([e.latitude, e.longitude], {
hintContent: e.title,
dot_id: e.pk
}, iconname);
}, click_callback, iconname);
}
}
function dot_place(pos, opts, icon_name='dev_ok.png'){
function dot_place(pos, opts, click_callback, icon_name='dev_ok.png'){
var dot = new ymaps.Placemark(pos, opts, {
iconLayout: 'default#image',
iconImageHref: '/static/img/gmarkers/'+icon_name,
iconImageSize: [32, 48],
iconImageOffset: [-16, -48]
});
dot.events.add('click', placemark_click);
dot.events.add('click', click_callback);
myMap.geoObjects.add(dot);
}
@ -52,7 +73,7 @@
dot_place([d.latitude, d.longitude], {
hintContent: d.title,
dot_id: d.pk
});
}, placemark_click);
}
function add_dot(e){
@ -142,7 +163,10 @@
<div class="panel panel-default hidden-sm hidden-xs" id="yapanel">
<div class="panel-heading">
<h4 class="modal-title">{% trans 'Layers' %}</h4>
<h4 class="modal-title">
{% trans 'Layers' %}
<a href="https://github.com/nerosketch/djing/blob/master/docs/map.md" title="{% trans 'Help' %}" target="_blank" data-toggle="tooltip">?</a>
</h4>
</div>
<div class="list-group">
{% for grp in groups %}

4
mapapp/urls.py

@ -1,4 +1,3 @@
# -*- coding:utf-8 -*-
from django.conf.urls import url
from . import views
@ -19,6 +18,7 @@ urlpatterns = [
url(r'^modal_add_dot$', views.modal_add_dot, name='modal_add_dot'),
url(r'^j_dot_tooltip$', views.dot_tooltip, name='dot_tooltip'),
url(r'^resolve_dots_by_group(?P<grp_id>\d+)$', views.resolve_dots_by_group, name='resolve_dots_by_group')
url(r'^resolve_dots_by_group(?P<grp_id>\d+)$', views.resolve_dots_by_group, name='resolve_dots_by_group'),
url(r'^to_single_dev/$', views.to_single_dev, name='to_single_dev')
]

44
mapapp/views.py

@ -2,20 +2,21 @@ from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.gis.shortcuts import render_to_text
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, HttpResponseBadRequest
from django.shortcuts import render, redirect, get_object_or_404, resolve_url
from django.utils.translation import gettext_lazy as _
from django.utils.translation import gettext_lazy as _, gettext
from django.utils.decorators import method_decorator
from django.db.models import Count
from django.views.generic import ListView
from django.conf import settings
from jsonview.decorators import json_view
from group_app.models import Group
from .models import Dot
from .forms import DotForm
from mydefs import safe_int
from devapp.models import Device
from guardian.decorators import permission_required
from json import dumps
class BaseListView(ListView):
@ -46,6 +47,7 @@ class OptionsListView(BaseListView):
return redirect('/')
return super(OptionsListView, self).get(request, *args, **kwargs)
@login_required
def dot(request, did=0):
if not request.user.is_superuser:
@ -95,18 +97,27 @@ def remove(request, did):
@login_required
@json_view
def get_dots(request):
if not request.user.is_superuser:
return HttpResponseForbidden('you have not super user')
dots = Dot.objects.all().annotate(devcount=Count('devices'))
dots = Dot.objects.prefetch_related('devices').annotate(devcount=Count('devices')).defer('attachment')
def fill_dev(dev):
return {
'status': dev.status,
'comment': dev.comment
} if dev is not None else None
res = [{
'devcount': e.devcount,
'latitude': e.latitude,
'longitude': e.longitude,
'title': e.title,
'pk': e.pk
'pk': e.pk,
'device': fill_dev(e.devices.first())
} for e in dots]
return HttpResponse(dumps(res), content_type='application/json')
return res
@login_required
@ -127,6 +138,7 @@ def modal_add_dot(request):
res = {
'error': _('fix form errors')
}
from json import dumps
return HttpResponse(dumps(res))
else:
coords = request.GET.get('coords')
@ -205,10 +217,24 @@ def add_dev(request, did):
@login_required
@json_view
def resolve_dots_by_group(request, grp_id):
if not request.user.is_superuser:
return HttpResponseForbidden('you have not super user')
devs = Device.objects.filter(group__id=grp_id)
dots = Dot.objects.filter(devices__in=devs).annotate(devcount=Count('devices')).only('pk')
res = [dot.pk for dot in dots]
return HttpResponse(dumps(res), content_type='application/json')
dots = Dot.objects.filter(devices__in=devs).only('pk').values_list('pk')
res = [dot[0] for dot in dots]
return res
@login_required
def to_single_dev(request):
dot_id = safe_int(request.GET.get('dot_id'))
if dot_id <= 0:
return HttpResponseBadRequest
dev = Device.objects.filter(dot__id=dot_id).first()
if dev is None:
messages.error(request, gettext('Devices is not found on the dot'))
return redirect('mapapp:edit_dot', dot_id)
grp_id = dev.group.pk
return redirect('devapp:view', grp_id, dev.pk)

BIN
static/img/gmarkers/relay_rack.png

After

Width: 32  |  Height: 48  |  Size: 2.0 KiB

Loading…
Cancel
Save