├── .dockerignore
├── .gitattributes
├── .gitignore
├── LICENSE
├── LICENSES
├── README.md
├── VManagePlatform
├── __init__.py
├── admin.py
├── apps
│ ├── Base.py
│ └── __init__.py
├── const
│ ├── Buffer.py
│ ├── Const.py
│ └── __init__.py
├── models.py
├── restfull
│ ├── __init__.py
│ ├── rest_vMserver.py
│ ├── rest_vStorage.py
│ └── rest_vmlog.py
├── serializers.py
├── settings.py
├── static
│ ├── avatars
│ │ ├── Thumbs.db
│ │ ├── avatar.png
│ │ ├── avatar1.png
│ │ ├── avatar2.png
│ │ ├── avatar3.png
│ │ ├── avatar4.png
│ │ ├── avatar5.png
│ │ ├── profile-pic.jpg
│ │ └── user.jpg
│ ├── css
│ │ ├── ace-ie.min.css
│ │ ├── ace-rtl.min.css
│ │ ├── ace-skins.min.css
│ │ ├── ace.min.css
│ │ ├── add-ons.min.css
│ │ ├── bootstrap-editable.css
│ │ ├── bootstrap-multiselect.css
│ │ ├── bootstrap-select.min.css
│ │ ├── bootstrap-timepicker.css
│ │ ├── bootstrap.min.css
│ │ ├── chosen.css
│ │ ├── colorbox.css
│ │ ├── colorpicker.css
│ │ ├── datepicker.css
│ │ ├── daterangepicker.css
│ │ ├── dropzone.css
│ │ ├── font-awesome-ie7.min.css
│ │ ├── font-awesome.min.css
│ │ ├── fullcalendar.css
│ │ ├── images
│ │ │ ├── Thumbs.db
│ │ │ └── loading.gif
│ │ ├── jquery-ui-1.10.3.custom.min.css
│ │ ├── jquery-ui-1.10.3.full.min.css
│ │ ├── jquery.gritter.css
│ │ ├── select2.css
│ │ ├── style.min.css
│ │ ├── timeline.css
│ │ ├── ui.jqgrid.css
│ │ └── xcConfirm.css
│ ├── font
│ │ └── fontawesome-webfont.woff
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ └── glyphicons-halflings-regular.woff
│ ├── images
│ │ ├── alt.png
│ │ ├── clipboard.png
│ │ ├── connect.png
│ │ ├── ctrl.png
│ │ ├── ctrlaltdel.png
│ │ ├── disconnect.png
│ │ ├── drag.png
│ │ ├── esc.png
│ │ ├── favicon.ico
│ │ ├── favicon.png
│ │ ├── gallery
│ │ │ ├── image-1.jpg
│ │ │ ├── image-2.jpg
│ │ │ ├── image-3.jpg
│ │ │ ├── image-4.jpg
│ │ │ ├── image-5.jpg
│ │ │ ├── image-6.jpg
│ │ │ ├── thumb-1.jpg
│ │ │ ├── thumb-2.jpg
│ │ │ ├── thumb-3.jpg
│ │ │ ├── thumb-4.jpg
│ │ │ ├── thumb-5.jpg
│ │ │ └── thumb-6.jpg
│ │ ├── keyboard.png
│ │ ├── mouse_left.png
│ │ ├── mouse_middle.png
│ │ ├── mouse_none.png
│ │ ├── mouse_right.png
│ │ ├── power.png
│ │ ├── screen_320x460.png
│ │ ├── screen_57x57.png
│ │ ├── screen_700x700.png
│ │ ├── settings.png
│ │ ├── showextrakeys.png
│ │ └── tab.png
│ ├── img
│ │ └── icons.png
│ ├── include
│ │ ├── Orbitron700.ttf
│ │ ├── Orbitron700.woff
│ │ ├── base.css
│ │ ├── base64.js
│ │ ├── black.css
│ │ ├── blue.css
│ │ ├── chrome-app
│ │ │ └── tcp-client.js
│ │ ├── des.js
│ │ ├── display.js
│ │ ├── input.js
│ │ ├── jsunzip.js
│ │ ├── keyboard.js
│ │ ├── keysym.js
│ │ ├── keysymdef.js
│ │ ├── logo.js
│ │ ├── playback.js
│ │ ├── rfb.js
│ │ ├── ui.js
│ │ ├── util.js
│ │ ├── web-socket-js
│ │ │ ├── README.txt
│ │ │ ├── WebSocketMain.swf
│ │ │ ├── swfobject.js
│ │ │ └── web_socket.js
│ │ ├── websock.js
│ │ └── webutil.js
│ ├── js
│ │ ├── ace-elements.min.js
│ │ ├── ace-extra.min.js
│ │ ├── ace.min.js
│ │ ├── additional-methods.min.js
│ │ ├── bootbox.min.js
│ │ ├── bootstrap-colorpicker.min.js
│ │ ├── bootstrap-select.js
│ │ ├── bootstrap-select.min.js
│ │ ├── bootstrap-tag.min.js
│ │ ├── bootstrap-wysiwyg.min.js
│ │ ├── bootstrap.min.js
│ │ ├── chosen.jquery.min.js
│ │ ├── csrf.js
│ │ ├── date-time
│ │ │ ├── bootstrap-datepicker.min.js
│ │ │ ├── bootstrap-timepicker.min.js
│ │ │ ├── daterangepicker.min.js
│ │ │ └── moment.min.js
│ │ ├── dropzone.min.js
│ │ ├── echarts.js
│ │ ├── excanvas.min.js
│ │ ├── flot
│ │ │ ├── jquery.flot.min.js
│ │ │ ├── jquery.flot.pie.min.js
│ │ │ └── jquery.flot.resize.min.js
│ │ ├── fuelux
│ │ │ ├── data
│ │ │ │ └── fuelux.tree-sampledata.js
│ │ │ ├── fuelux.spinner.min.js
│ │ │ ├── fuelux.tree.min.js
│ │ │ └── fuelux.wizard.min.js
│ │ ├── fullcalendar.min.js
│ │ ├── highcharts.js
│ │ ├── html5shiv.js
│ │ ├── i18n
│ │ │ ├── defaults-ar_AR.js
│ │ │ ├── defaults-ar_AR.min.js
│ │ │ ├── defaults-bg_BG.js
│ │ │ ├── defaults-bg_BG.min.js
│ │ │ ├── defaults-cro_CRO.js
│ │ │ ├── defaults-cro_CRO.min.js
│ │ │ ├── defaults-cs_CZ.js
│ │ │ ├── defaults-cs_CZ.min.js
│ │ │ ├── defaults-da_DK.js
│ │ │ ├── defaults-da_DK.min.js
│ │ │ ├── defaults-de_DE.js
│ │ │ ├── defaults-de_DE.min.js
│ │ │ ├── defaults-en_US.js
│ │ │ ├── defaults-en_US.min.js
│ │ │ ├── defaults-es_CL.js
│ │ │ ├── defaults-es_CL.min.js
│ │ │ ├── defaults-es_ES.js
│ │ │ ├── defaults-es_ES.min.js
│ │ │ ├── defaults-eu.js
│ │ │ ├── defaults-eu.min.js
│ │ │ ├── defaults-fa_IR.js
│ │ │ ├── defaults-fa_IR.min.js
│ │ │ ├── defaults-fi_FI.js
│ │ │ ├── defaults-fi_FI.min.js
│ │ │ ├── defaults-fr_FR.js
│ │ │ ├── defaults-fr_FR.min.js
│ │ │ ├── defaults-hu_HU.js
│ │ │ ├── defaults-hu_HU.min.js
│ │ │ ├── defaults-id_ID.js
│ │ │ ├── defaults-id_ID.min.js
│ │ │ ├── defaults-it_IT.js
│ │ │ ├── defaults-it_IT.min.js
│ │ │ ├── defaults-ko_KR.js
│ │ │ ├── defaults-ko_KR.min.js
│ │ │ ├── defaults-lt_LT.js
│ │ │ ├── defaults-lt_LT.min.js
│ │ │ ├── defaults-nb_NO.js
│ │ │ ├── defaults-nb_NO.min.js
│ │ │ ├── defaults-nl_NL.js
│ │ │ ├── defaults-nl_NL.min.js
│ │ │ ├── defaults-pl_PL.js
│ │ │ ├── defaults-pl_PL.min.js
│ │ │ ├── defaults-pt_BR.js
│ │ │ ├── defaults-pt_BR.min.js
│ │ │ ├── defaults-pt_PT.js
│ │ │ ├── defaults-pt_PT.min.js
│ │ │ ├── defaults-ro_RO.js
│ │ │ ├── defaults-ro_RO.min.js
│ │ │ ├── defaults-ru_RU.js
│ │ │ ├── defaults-ru_RU.min.js
│ │ │ ├── defaults-sk_SK.js
│ │ │ ├── defaults-sk_SK.min.js
│ │ │ ├── defaults-sl_SI.js
│ │ │ ├── defaults-sl_SI.min.js
│ │ │ ├── defaults-sv_SE.js
│ │ │ ├── defaults-sv_SE.min.js
│ │ │ ├── defaults-tr_TR.js
│ │ │ ├── defaults-tr_TR.min.js
│ │ │ ├── defaults-ua_UA.js
│ │ │ ├── defaults-ua_UA.min.js
│ │ │ ├── defaults-zh_CN.js
│ │ │ ├── defaults-zh_CN.min.js
│ │ │ ├── defaults-zh_TW.js
│ │ │ └── defaults-zh_TW.min.js
│ │ ├── jqGrid
│ │ │ ├── i18n
│ │ │ │ └── grid.locale-en.js
│ │ │ └── jquery.jqGrid.min.js
│ │ ├── jquery-1.10.2.min.js
│ │ ├── jquery-1.11.1.min.js
│ │ ├── jquery-2.0.3.min.js
│ │ ├── jquery-ui-1.10.3.custom.min.js
│ │ ├── jquery-ui-1.10.3.full.min.js
│ │ ├── jquery.autosize.min.js
│ │ ├── jquery.colorbox-min.js
│ │ ├── jquery.dataTables.bootstrap.js
│ │ ├── jquery.dataTables.min.js
│ │ ├── jquery.easy-pie-chart.min.js
│ │ ├── jquery.form.js
│ │ ├── jquery.gritter.min.js
│ │ ├── jquery.hotkeys.min.js
│ │ ├── jquery.inputlimiter.1.3.1.min.js
│ │ ├── jquery.knob.min.js
│ │ ├── jquery.maskedinput.min.js
│ │ ├── jquery.min.js
│ │ ├── jquery.mobile.custom.min.js
│ │ ├── jquery.nestable.min.js
│ │ ├── jquery.slimscroll.min.js
│ │ ├── jquery.sparkline.min.js
│ │ ├── jquery.ui.touch-punch.min.js
│ │ ├── jquery.validate.min.js
│ │ ├── markdown
│ │ │ ├── bootstrap-markdown.min.js
│ │ │ └── markdown.min.js
│ │ ├── respond.min.js
│ │ ├── select2.min.js
│ │ ├── typeahead-bs2.min.js
│ │ ├── x-editable
│ │ │ ├── ace-editable.min.js
│ │ │ └── bootstrap-editable.min.js
│ │ └── xcConfirm.js
│ └── layer
│ │ ├── layer.js
│ │ ├── mobile
│ │ ├── layer.js
│ │ └── need
│ │ │ └── layer.css
│ │ └── theme
│ │ └── default
│ │ ├── icon-ext.png
│ │ ├── icon.png
│ │ ├── layer.css
│ │ ├── loading-0.gif
│ │ ├── loading-1.gif
│ │ └── loading-2.gif
├── tasks.py
├── templates
│ ├── 404.html
│ ├── index.html
│ ├── login.html
│ ├── noperm.html
│ ├── profile.html
│ ├── vmDhcp
│ │ └── dhcp_network.html
│ ├── vmInstance
│ │ ├── add_instance.html
│ │ ├── list_instance.html
│ │ ├── temp_instance.html
│ │ └── view_instance.html
│ ├── vmNetwork
│ │ └── add_network.html
│ ├── vmServer
│ │ ├── add_server.html
│ │ ├── index_server.html
│ │ └── list_server.html
│ ├── vmStorage
│ │ ├── add_storage.html
│ │ ├── add_storage_pop.html
│ │ ├── list_storage.html
│ │ └── view_storage.html
│ ├── vmTasks
│ │ ├── config_task.html
│ │ └── view_task.html
│ ├── vmUser
│ │ ├── group_manage.html
│ │ ├── user_manage.html
│ │ └── view_user.html
│ └── vnc
│ │ ├── vnc.html
│ │ └── vnc_auto.html
├── urls.py
├── utils
│ ├── LoggerUtils.py
│ ├── __init__.py
│ ├── rwlock.py
│ ├── vBrConfigUtils.py
│ ├── vConnUtils.py
│ ├── vDHCPConfigUtils.py
│ ├── vMConUtils.py
│ └── vMUtil.py
├── views
│ ├── __init__.py
│ ├── vComs.py
│ ├── vDhcps.py
│ ├── vInstance.py
│ ├── vNetwork.py
│ ├── vProfile.py
│ ├── vServer.py
│ ├── vSnapshot.py
│ ├── vStorage.py
│ ├── vTasks.py
│ ├── vUser.py
│ └── vVolume.py
└── wsgi.py
├── demo_images
├── consle.png
├── index.png
├── instance.png
├── login.png
├── profile.png
├── register.png
├── server.png
├── task.png
└── user.png
├── docker
├── Dockerfile-app
├── Dockerfile-base
├── README.md
├── build-app.sh
├── build-base.sh
└── start-app.sh
├── manage.py
├── requirements.txt
└── vnc
└── utils
├── Makefile
├── README.md
├── img2js.py
├── json2graph.py
├── launch.sh
├── nova-novncproxy
├── parse.js
├── rebind
├── rebind.c
├── u2x11
├── web.py
├── websocket.py
├── websockify
├── websockify.py
└── wsproxy.py
/.dockerignore:
--------------------------------------------------------------------------------
1 | .git
2 | .gitignore
3 | docker
4 | .dockerignore
5 | venv
6 | README.md
7 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.js linguist-language=Python
2 | *.css linguist-language=Python
3 | *.html linguist-language=Python
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .svn/
2 | .idea
3 | venv
4 | logs
5 | db.sqlite3
6 | vnc/utils/vnc_tokens
--------------------------------------------------------------------------------
/VManagePlatform/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/__init__.py
--------------------------------------------------------------------------------
/VManagePlatform/admin.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 | from django.contrib import admin
4 | from VManagePlatform import models
5 |
6 | admin.site.register(models.VmServer)
7 |
8 |
--------------------------------------------------------------------------------
/VManagePlatform/apps/Base.py:
--------------------------------------------------------------------------------
1 | # -*- coding=utf-8 -*-
2 | import logging
3 | from logging.handlers import RotatingFileHandler
4 | import os,sys
5 |
6 |
7 |
8 | gProDir = os.path.dirname(os.path.abspath(sys.argv[ 0])) + '/'
9 | gProDir = gProDir.replace('\\','/')
10 | gLoggerName = 'VManagePlatform'
11 | gLoggerFilePath = gProDir + '/logs/'
12 | gLoggerFileName = 'VManagePlatform.log'
13 | if not os.path.isdir(gLoggerFilePath):
14 | os.makedirs(gLoggerFilePath)
15 | gLogger = logging.getLogger(gLoggerName)
16 | gLoggerFormatter = logging.Formatter("[%(asctime)s]: %(message)s","%Y-%m-%d %H:%M:%S")
17 | fileHandler = RotatingFileHandler(gLoggerFilePath + gLoggerFileName, mode='a' , maxBytes=10 *1024 *1024 , backupCount=4)
18 | fileHandler.setFormatter(gLoggerFormatter)
19 | fileHandler.setLevel(logging.INFO)
20 | streamHandler = logging.StreamHandler()
21 | streamHandler.setFormatter(gLoggerFormatter)
22 | streamHandler.setLevel(logging.DEBUG)
23 | gLogger.addHandler(fileHandler)
24 | gLogger.addHandler(streamHandler)
25 | gLogger.setLevel(logging.DEBUG)
26 |
27 | class BaseLogging(object):
28 | @staticmethod
29 | def Logger(msg,level=None):
30 | if level == 'error':return gLogger.error(msg)
31 | elif level == 'warn':return gLogger.warn(msg)
32 | elif level == 'info':return gLogger.info(msg)
33 | elif level == 'debug':return gLogger.debug(msg)
--------------------------------------------------------------------------------
/VManagePlatform/apps/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/apps/__init__.py
--------------------------------------------------------------------------------
/VManagePlatform/const/Buffer.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/const/Buffer.py
--------------------------------------------------------------------------------
/VManagePlatform/const/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/const/__init__.py
--------------------------------------------------------------------------------
/VManagePlatform/restfull/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/restfull/__init__.py
--------------------------------------------------------------------------------
/VManagePlatform/restfull/rest_vMserver.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 | from rest_framework import viewsets,permissions
4 | from VManagePlatform.serializers import VmServerSerializer
5 | from rest_framework import status
6 | from django.http import Http404
7 | from rest_framework.views import APIView
8 | from rest_framework.response import Response
9 | from rest_framework.decorators import api_view
10 | from VManagePlatform.models import VmServer
11 | from django.views.decorators.csrf import ensure_csrf_cookie
12 |
13 |
14 |
15 |
16 | @api_view(['GET', 'POST' ])
17 | def vmServer_list(request,format=None):
18 | """
19 | List all order, or create a server assets order.
20 | """
21 | if request.method == 'GET':
22 | snippets = VmServer.objects.all()
23 | serializer = VmServerSerializer(snippets, many=True)
24 | return Response(serializer.data)
25 | elif request.method == 'POST':
26 | serializer = VmServerSerializer(data=request.data)
27 |
28 | if serializer.is_valid():
29 | serializer.save()
30 | return Response(serializer.data, status=status.HTTP_201_CREATED)
31 | return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
32 |
33 | @ensure_csrf_cookie
34 | @api_view(['GET', 'PUT', 'DELETE'])
35 | def vmServer_detail(request, id,format=None):
36 | """
37 | Retrieve, update or delete a server assets instance.
38 | """
39 | try:
40 | snippet = VmServer.objects.get(id=id)
41 | except VmServer.DoesNotExist:
42 | return Response(status=status.HTTP_404_NOT_FOUND)
43 |
44 | if request.method == 'GET':
45 | serializer = VmServerSerializer(snippet)
46 | return Response(serializer.data)
47 |
48 | elif request.method == 'PUT':
49 | serializer = VmServerSerializer(snippet, data=request.data)
50 | if serializer.is_valid():
51 | serializer.save()
52 | return Response(serializer.data)
53 | return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
54 |
55 | elif request.method == 'DELETE':
56 | if not request.user.has_perm('vmanageplatform.delete_vmserver'):
57 | return Response(status=status.HTTP_403_FORBIDDEN)
58 | snippet.delete()
59 | return Response(status=status.HTTP_204_NO_CONTENT)
60 |
61 |
62 | @api_view(['GET', 'PUT' ])
63 | def vmServer_hostname(request, id):
64 | try:
65 | vmServer = VmServer.objects.get(id=id)
66 | except VmServer.DoesNotExist:
67 | return Response(status=status.HTTP_404_NOT_FOUND)
68 |
69 | if request.method == 'GET':
70 | serializer = VmServerSerializer(vmServer)
71 | return Response(serializer.data)
72 | elif request.method == 'PUT':
73 | data = request.body
74 | vmServer.hostname = data
75 | vmServer.save()
76 | serializer = VmServerSerializer(vmServer)
77 | # return JsonResponse({"code":500,"msg":"卷不存在。","data":None})
78 | return Response(status=status.HTTP_200_OK)
79 |
80 |
81 |
82 | @api_view(['GET', 'PUT' ])
83 | def vmServer_desc(request, id):
84 | try:
85 | vmServer = VmServer.objects.get(id=id)
86 | except VmServer.DoesNotExist:
87 | return Response(status=status.HTTP_404_NOT_FOUND)
88 |
89 | if request.method == 'GET':
90 | serializer = VmServerSerializer(vmServer)
91 | return Response(serializer.data)
92 | elif request.method == 'PUT':
93 | data = request.body
94 | vmServer.description = data
95 | vmServer.save()
96 | serializer = VmServerSerializer(vmServer)
97 | return Response(status=status.HTTP_200_OK, data={'msg':'修改成功'})
98 |
99 |
--------------------------------------------------------------------------------
/VManagePlatform/restfull/rest_vStorage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 |
4 | from rest_framework import status
5 | from rest_framework.response import Response
6 | from rest_framework.decorators import api_view
7 | from VManagePlatform.models import VmServer
8 | from VManagePlatform.utils.vMConUtils import LibvirtManage
9 | from django.views.decorators.csrf import ensure_csrf_cookie
10 |
11 |
12 | @ensure_csrf_cookie
13 | @api_view(['GET', 'PUT', 'DELETE'])
14 | def vmStorage_detail(request, serverId, poolName, format=None):
15 | """
16 | Retrieve, update or delete a server assets instance.
17 | """
18 | try:
19 | vmServer = VmServer.objects.get(id=serverId)
20 | except VmServer.DoesNotExist:
21 | return Response(status=status.HTTP_404_NOT_FOUND)
22 |
23 | try:
24 | VMS = LibvirtManage(vmServer.server_ip, vmServer.username, vmServer.passwd, vmServer.vm_type)
25 | STORAGE = VMS.genre(model='storage')
26 | if STORAGE:
27 | storage = STORAGE.getStorageInfo(poolName)
28 | VMS.close()
29 | return Response(storage, status=status.HTTP_200_OK)
30 | else:
31 | return Response(status=status.HTTP_404_NOT_FOUND)
32 |
33 | except Exception, e:
34 | return Response(status=status.HTTP_404_NOT_FOUND)
35 |
36 |
--------------------------------------------------------------------------------
/VManagePlatform/restfull/rest_vmlog.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 | from VManagePlatform.serializers import VmLogsSerializer
4 | from rest_framework import status
5 | from django.http import Http404
6 | from rest_framework.views import APIView
7 | from rest_framework.response import Response
8 | from rest_framework.decorators import api_view
9 | from VManagePlatform.models import VmLogs
10 | from rest_framework import generics
11 | from django.db.models import Q
12 |
13 | @api_view(['GET', 'POST' ])
14 | def vmlog_list(request,format=None):
15 | """
16 | List all order, or create a server assets order.
17 | """
18 | if request.method == 'GET':
19 | snippets = VmLogs.objects.all()
20 | serializer = VmLogsSerializer(snippets, many=True)
21 | return Response(serializer.data)
22 |
23 |
24 | @api_view(['GET', 'PUT', 'DELETE'])
25 | def vmlog_detail(request, id,format=None):
26 | """
27 | Retrieve, update or delete a server assets instance.
28 | """
29 | try:
30 | snippet = VmLogs.objects.get(id=id)
31 | except VmLogs.DoesNotExist:
32 | return Response(status=status.HTTP_404_NOT_FOUND)
33 |
34 | if request.method == 'GET':
35 | serializer = VmLogsSerializer(snippet)
36 | return Response(serializer.data)
37 |
38 | elif request.method == 'PUT':
39 | serializer = VmLogsSerializer(snippet, data=request.data)
40 | if serializer.is_valid():
41 | serializer.save()
42 | return Response(serializer.data)
43 | return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
44 |
45 | elif request.method == 'DELETE':
46 | if not request.user.has_perm('vmanageplatform.delete_vmserver'):
47 | return Response(status=status.HTTP_403_FORBIDDEN)
48 | snippet.delete()
49 | return Response(status=status.HTTP_204_NO_CONTENT)
50 |
51 | class LogsList(generics.ListAPIView):
52 | serializer_class = VmLogsSerializer
53 | def get_queryset(self):
54 | user = self.request.user
55 | username = self.kwargs['username']
56 | if str(user) == str(username):
57 | return VmLogs.objects.filter(user=user,isRead=0).order_by("id")
58 | else:return []
--------------------------------------------------------------------------------
/VManagePlatform/serializers.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 | from rest_framework import serializers
4 | from VManagePlatform.models import VmServer,VmLogs
5 |
6 | class VmServerSerializer(serializers.ModelSerializer):
7 | class Meta:
8 | model = VmServer
9 | fields = ('id', 'server_ip', 'hostname', 'username','instance',
10 | 'passwd','mem','status','cpu_total','vm_type','createTime')
11 |
12 |
13 | class VmLogsSerializer(serializers.ModelSerializer):
14 | class Meta:
15 | model = VmLogs
16 | fields = ('id', 'server_id', 'vm_name', 'content','user',
17 | 'status','isRead','create_time','result')
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/Thumbs.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/Thumbs.db
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/avatar.png
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/avatar1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/avatar1.png
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/avatar2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/avatar2.png
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/avatar3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/avatar3.png
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/avatar4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/avatar4.png
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/avatar5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/avatar5.png
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/profile-pic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/profile-pic.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/avatars/user.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/avatars/user.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/css/bootstrap-multiselect.css:
--------------------------------------------------------------------------------
1 | .multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px 3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.radio,.multiselect-container>li>a>label.checkbox{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}
--------------------------------------------------------------------------------
/VManagePlatform/static/css/bootstrap-timepicker.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Timepicker Component for Twitter Bootstrap
3 | *
4 | * Copyright 2013 Joris de Wit
5 | *
6 | * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors
7 | *
8 | * For the full copyright and license information, please view the LICENSE
9 | * file that was distributed with this source code.
10 | */
11 | .bootstrap-timepicker {
12 | position: relative;
13 | }
14 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu {
15 | left: auto;
16 | right: 0;
17 | }
18 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before {
19 | left: auto;
20 | right: 12px;
21 | }
22 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after {
23 | left: auto;
24 | right: 13px;
25 | }
26 | .bootstrap-timepicker .add-on {
27 | cursor: pointer;
28 | }
29 | .bootstrap-timepicker .add-on i {
30 | display: inline-block;
31 | width: 16px;
32 | height: 16px;
33 | }
34 | .bootstrap-timepicker-widget.dropdown-menu {
35 | padding: 2px 3px 2px 2px;
36 | }
37 | .bootstrap-timepicker-widget.dropdown-menu.open {
38 | display: inline-block;
39 | }
40 | .bootstrap-timepicker-widget.dropdown-menu:before {
41 | border-bottom: 7px solid rgba(0, 0, 0, 0.2);
42 | border-left: 7px solid transparent;
43 | border-right: 7px solid transparent;
44 | content: "";
45 | display: inline-block;
46 | left: 9px;
47 | position: absolute;
48 | top: -7px;
49 | }
50 | .bootstrap-timepicker-widget.dropdown-menu:after {
51 | border-bottom: 6px solid #FFFFFF;
52 | border-left: 6px solid transparent;
53 | border-right: 6px solid transparent;
54 | content: "";
55 | display: inline-block;
56 | left: 10px;
57 | position: absolute;
58 | top: -6px;
59 | }
60 | .bootstrap-timepicker-widget a.btn,
61 | .bootstrap-timepicker-widget input {
62 | border-radius: 4px;
63 | }
64 | .bootstrap-timepicker-widget table {
65 | width: 100%;
66 | margin: 0;
67 | }
68 | .bootstrap-timepicker-widget table td {
69 | text-align: center;
70 | height: 30px;
71 | margin: 0;
72 | padding: 2px;
73 | }
74 | .bootstrap-timepicker-widget table td:not(.separator) {
75 | min-width: 30px;
76 | }
77 | .bootstrap-timepicker-widget table td span {
78 | width: 100%;
79 | }
80 | .bootstrap-timepicker-widget table td a {
81 | border: 1px transparent solid;
82 | width: 100%;
83 | display: inline-block;
84 | margin: 0;
85 | padding: 8px 0;
86 | outline: 0;
87 | color: #333;
88 | }
89 | .bootstrap-timepicker-widget table td a:hover {
90 | text-decoration: none;
91 | background-color: #eee;
92 | -webkit-border-radius: 4px;
93 | -moz-border-radius: 4px;
94 | border-radius: 4px;
95 | border-color: #ddd;
96 | }
97 | .bootstrap-timepicker-widget table td a i {
98 | margin-top: 2px;
99 | }
100 | .bootstrap-timepicker-widget table td input {
101 | width: 25px;
102 | margin: 0;
103 | text-align: center;
104 | }
105 | .bootstrap-timepicker-widget .modal-content {
106 | padding: 4px;
107 | }
108 | @media (min-width: 767px) {
109 | .bootstrap-timepicker-widget.modal {
110 | width: 200px;
111 | margin-left: -100px;
112 | }
113 | }
114 | @media (max-width: 767px) {
115 | .bootstrap-timepicker {
116 | width: 100%;
117 | }
118 | .bootstrap-timepicker .dropdown-menu {
119 | width: 100%;
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/VManagePlatform/static/css/colorpicker.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Colorpicker for Bootstrap
3 | *
4 | * Copyright 2012 Stefan Petre
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | */
9 | .colorpicker-saturation {
10 | width: 100px;
11 | height: 100px;
12 | background-image: url(img/saturation.png);
13 | cursor: crosshair;
14 | float: left;
15 | }
16 | .colorpicker-saturation i {
17 | display: block;
18 | height: 5px;
19 | width: 5px;
20 | border: 1px solid #000;
21 | -webkit-border-radius: 5px;
22 | -moz-border-radius: 5px;
23 | border-radius: 5px;
24 | position: absolute;
25 | top: 0;
26 | left: 0;
27 | margin: -4px 0 0 -4px;
28 | }
29 | .colorpicker-saturation i b {
30 | display: block;
31 | height: 5px;
32 | width: 5px;
33 | border: 1px solid #fff;
34 | -webkit-border-radius: 5px;
35 | -moz-border-radius: 5px;
36 | border-radius: 5px;
37 | }
38 | .colorpicker-hue, .colorpicker-alpha {
39 | width: 15px;
40 | height: 100px;
41 | float: left;
42 | cursor: row-resize;
43 | margin-left: 4px;
44 | margin-bottom: 4px;
45 | }
46 | .colorpicker-hue i, .colorpicker-alpha i {
47 | display: block;
48 | height: 1px;
49 | background: #000;
50 | border-top: 1px solid #fff;
51 | position: absolute;
52 | top: 0;
53 | left: 0;
54 | width: 100%;
55 | margin-top: -1px;
56 | }
57 | .colorpicker-hue {
58 | background-image: url(img/hue.png);
59 | }
60 | .colorpicker-alpha {
61 | background-image: url(img/alpha.png);
62 | display: none;
63 | }
64 | .colorpicker {
65 | *zoom: 1;
66 | top: 0;
67 | left: 0;
68 | padding: 4px;
69 | min-width: 120px;
70 | margin-top: 1px;
71 | -webkit-border-radius: 4px;
72 | -moz-border-radius: 4px;
73 | border-radius: 4px;
74 | }
75 | .colorpicker:before, .colorpicker:after {
76 | display: table;
77 | content: "";
78 | }
79 | .colorpicker:after {
80 | clear: both;
81 | }
82 | .colorpicker:before {
83 | content: '';
84 | display: inline-block;
85 | border-left: 7px solid transparent;
86 | border-right: 7px solid transparent;
87 | border-bottom: 7px solid #ccc;
88 | border-bottom-color: rgba(0, 0, 0, 0.2);
89 | position: absolute;
90 | top: -7px;
91 | left: 6px;
92 | }
93 | .colorpicker:after {
94 | content: '';
95 | display: inline-block;
96 | border-left: 6px solid transparent;
97 | border-right: 6px solid transparent;
98 | border-bottom: 6px solid #ffffff;
99 | position: absolute;
100 | top: -6px;
101 | left: 7px;
102 | }
103 | .colorpicker div {
104 | position: relative;
105 | }
106 | .colorpicker.alpha {
107 | min-width: 140px;
108 | }
109 | .colorpicker.alpha .colorpicker-alpha {
110 | display: block;
111 | }
112 | .colorpicker-color {
113 | height: 10px;
114 | margin-top: 5px;
115 | clear: both;
116 | background-image: url(img/alpha.png);
117 | background-position: 0 100%;
118 | }
119 | .colorpicker-color div {
120 | height: 10px;
121 | }
122 | .input-append.color .add-on i, .input-prepend.color .add-on i {
123 | display: block;
124 | cursor: pointer;
125 | width: 16px;
126 | height: 16px;
127 | }
--------------------------------------------------------------------------------
/VManagePlatform/static/css/images/Thumbs.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/css/images/Thumbs.db
--------------------------------------------------------------------------------
/VManagePlatform/static/css/images/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/css/images/loading.gif
--------------------------------------------------------------------------------
/VManagePlatform/static/css/jquery-ui-1.10.3.custom.min.css:
--------------------------------------------------------------------------------
1 | /*! jQuery UI - v1.10.3 - 2013-07-07
2 | * http://jqueryui.com
3 | * Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css
4 | * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
5 |
6 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}
--------------------------------------------------------------------------------
/VManagePlatform/static/css/jquery-ui-1.10.3.full.min.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/css/jquery-ui-1.10.3.full.min.css
--------------------------------------------------------------------------------
/VManagePlatform/static/css/jquery.gritter.css:
--------------------------------------------------------------------------------
1 | /* the norm */
2 | #gritter-notice-wrapper {
3 | position:fixed;
4 | top:20px;
5 | right:20px;
6 | width:301px;
7 | z-index:9999;
8 | }
9 | #gritter-notice-wrapper.top-left {
10 | left: 20px;
11 | right: auto;
12 | }
13 | #gritter-notice-wrapper.bottom-right {
14 | top: auto;
15 | left: auto;
16 | bottom: 20px;
17 | right: 20px;
18 | }
19 | #gritter-notice-wrapper.bottom-left {
20 | top: auto;
21 | right: auto;
22 | bottom: 20px;
23 | left: 20px;
24 | }
25 | .gritter-item-wrapper {
26 | position:relative;
27 | margin:0 0 10px 0;
28 | background:url('../images/ie-spacer.gif'); /* ie7/8 fix */
29 | }
30 | .gritter-top {
31 | background:url(../images/gritter.png) no-repeat left -30px;
32 | height:10px;
33 | }
34 | .hover .gritter-top {
35 | background-position:right -30px;
36 | }
37 | .gritter-bottom {
38 | background:url(../images/gritter.png) no-repeat left bottom;
39 | height:8px;
40 | margin:0;
41 | }
42 | .hover .gritter-bottom {
43 | background-position: bottom right;
44 | }
45 | .gritter-item {
46 | display:block;
47 | background:url(../images/gritter.png) no-repeat left -40px;
48 | color:#eee;
49 | padding:2px 11px 8px 11px;
50 | font-size: 11px;
51 | font-family:verdana;
52 | }
53 | .hover .gritter-item {
54 | background-position:right -40px;
55 | }
56 | .gritter-item p {
57 | padding:0;
58 | margin:0;
59 | word-wrap:break-word;
60 | }
61 | .gritter-close {
62 | display:none;
63 | position:absolute;
64 | top:5px;
65 | left:3px;
66 | background:url(../images/gritter.png) no-repeat left top;
67 | cursor:pointer;
68 | width:30px;
69 | height:30px;
70 | }
71 | .gritter-title {
72 | font-size:14px;
73 | font-weight:bold;
74 | padding:0 0 7px 0;
75 | display:block;
76 | text-shadow:1px 1px 0 #000; /* Not supported by IE :( */
77 | }
78 | .gritter-image {
79 | width:48px;
80 | height:48px;
81 | float:left;
82 | }
83 | .gritter-with-image,
84 | .gritter-without-image {
85 | padding:0;
86 | }
87 | .gritter-with-image {
88 | width:220px;
89 | float:right;
90 | }
91 | /* for the light (white) version of the gritter notice */
92 | .gritter-light .gritter-item,
93 | .gritter-light .gritter-bottom,
94 | .gritter-light .gritter-top,
95 | .gritter-light .gritter-close {
96 | background-image: url(../images/gritter-light.png);
97 | color: #222;
98 | }
99 | .gritter-light .gritter-title {
100 | text-shadow: none;
101 | }
102 |
--------------------------------------------------------------------------------
/VManagePlatform/static/css/timeline.css:
--------------------------------------------------------------------------------
1 | .timeline {
2 | list-style: none;
3 | padding: 20px 0 20px;
4 | position: relative;
5 | }
6 | .timeline:before {
7 | top: 0;
8 | bottom: 0;
9 | position: absolute;
10 | content: " ";
11 | width: 3px;
12 | background-color: #eeeeee;
13 | left: 50%;
14 | margin-left: -1.5px;
15 | }
16 | .timeline > li {
17 | margin-bottom: 20px;
18 | position: relative;
19 | }
20 | .timeline > li:before,
21 | .timeline > li:after {
22 | content: " ";
23 | display: table;
24 | }
25 | .timeline > li:after {
26 | clear: both;
27 | }
28 | .timeline > li:before,
29 | .timeline > li:after {
30 | content: " ";
31 | display: table;
32 | }
33 | .timeline > li:after {
34 | clear: both;
35 | }
36 | .timeline > li > .timeline-panel {
37 | width: 46%;
38 | float: left;
39 | border: 1px solid #d4d4d4;
40 | border-radius: 2px;
41 | padding: 20px;
42 | position: relative;
43 | -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175);
44 | box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175);
45 | }
46 | .timeline > li > .timeline-panel:before {
47 | position: absolute;
48 | top: 26px;
49 | right: -15px;
50 | display: inline-block;
51 | border-top: 15px solid transparent;
52 | border-left: 15px solid #ccc;
53 | border-right: 0 solid #ccc;
54 | border-bottom: 15px solid transparent;
55 | content: " ";
56 | }
57 | .timeline > li > .timeline-panel:after {
58 | position: absolute;
59 | top: 27px;
60 | right: -14px;
61 | display: inline-block;
62 | border-top: 14px solid transparent;
63 | border-left: 14px solid #fff;
64 | border-right: 0 solid #fff;
65 | border-bottom: 14px solid transparent;
66 | content: " ";
67 | }
68 | .timeline > li > .timeline-badge {
69 | color: #fff;
70 | width: 50px;
71 | height: 50px;
72 | line-height: 50px;
73 | font-size: 1.4em;
74 | text-align: center;
75 | position: absolute;
76 | top: 16px;
77 | left: 50%;
78 | margin-left: -25px;
79 | background-color: #999999;
80 | z-index: 100;
81 | border-top-right-radius: 50%;
82 | border-top-left-radius: 50%;
83 | border-bottom-right-radius: 50%;
84 | border-bottom-left-radius: 50%;
85 | }
86 | .timeline > li.timeline-inverted > .timeline-panel {
87 | float: right;
88 | }
89 | .timeline > li.timeline-inverted > .timeline-panel:before {
90 | border-left-width: 0;
91 | border-right-width: 15px;
92 | left: -15px;
93 | right: auto;
94 | }
95 | .timeline > li.timeline-inverted > .timeline-panel:after {
96 | border-left-width: 0;
97 | border-right-width: 14px;
98 | left: -14px;
99 | right: auto;
100 | }
101 | .timeline-badge.primary {
102 | background-color: #2e6da4 !important;
103 | }
104 | .timeline-badge.success {
105 | background-color: #3f903f !important;
106 | }
107 | .timeline-badge.warning {
108 | background-color: #f0ad4e !important;
109 | }
110 | .timeline-badge.danger {
111 | background-color: #d9534f !important;
112 | }
113 | .timeline-badge.info {
114 | background-color: #5bc0de !important;
115 | }
116 | .timeline-title {
117 | margin-top: 0;
118 | color: inherit;
119 | }
120 | .timeline-body > p,
121 | .timeline-body > ul {
122 | margin-bottom: 0;
123 | }
124 | .timeline-body > p + p {
125 | margin-top: 5px;
126 | }
--------------------------------------------------------------------------------
/VManagePlatform/static/css/xcConfirm.css:
--------------------------------------------------------------------------------
1 | /*垂直居中*/
2 | .verticalAlign{ vertical-align:middle; display:inline-block; height:100%; margin-left:-1px;}
3 |
4 | .xcConfirm .xc_layer{position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: #666666; opacity: 0.5; z-index: 2147000000;}
5 | .xcConfirm .popBox{position: fixed; left: 50%; top: 50%; background-color: #ffffff; z-index: 2147000001; width: 570px; height: 300px; margin-left: -285px; margin-top: -150px; border-radius: 5px; font-weight: bold; color: #535e66;}
6 | .xcConfirm .popBox .ttBox{height: 30px; line-height: 30px; padding: 14px 30px; border-bottom: solid 1px #eef0f1;}
7 | .xcConfirm .popBox .ttBox .tt{font-size: 18px; display: block; float: left; height: 30px; position: relative;}
8 | .xcConfirm .popBox .ttBox .clsBtn{display: block; cursor: pointer; width: 12px; height: 12px; position: absolute; top: 22px; right: 30px; background: url(../img/icons.png) -48px -96px no-repeat;}
9 | .xcConfirm .popBox .txtBox{margin: 40px 100px; height: 100px; overflow: hidden;}
10 | .xcConfirm .popBox .txtBox .bigIcon{float: left; margin-right: 20px; width: 48px; height: 48px; background-image: url(../img/icons.png); background-repeat: no-repeat; background-position: 48px 0;}
11 | .xcConfirm .popBox .txtBox p{ height: 84px; margin-top: 16px; line-height: 26px; overflow-x: hidden; overflow-y: auto;}
12 | .xcConfirm .popBox .txtBox p input{width: 364px; height: 30px; border: solid 1px #eef0f1; font-size: 18px; margin-top: 6px;}
13 | .xcConfirm .popBox .btnArea{border-top: solid 1px #eef0f1;}
14 | .xcConfirm .popBox .btnGroup{float: right;}
15 | .xcConfirm .popBox .btnGroup .sgBtn{margin-top: 14px; margin-right: 10px;}
16 | .xcConfirm .popBox .sgBtn{display: block; cursor: pointer; float: left; width: 95px; height: 35px; line-height: 35px; text-align: center; color: #FFFFFF; border-radius: 5px;}
17 | .xcConfirm .popBox .sgBtn.ok{background-color: #0095d9; color: #FFFFFF;}
18 | .xcConfirm .popBox .sgBtn.cancel{background-color: #546a79; color: #FFFFFF;}
--------------------------------------------------------------------------------
/VManagePlatform/static/font/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/font/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/VManagePlatform/static/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/VManagePlatform/static/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/VManagePlatform/static/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/VManagePlatform/static/images/alt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/alt.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/clipboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/clipboard.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/connect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/connect.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/ctrl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/ctrl.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/ctrlaltdel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/ctrlaltdel.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/disconnect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/disconnect.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/drag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/drag.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/esc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/esc.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/favicon.ico
--------------------------------------------------------------------------------
/VManagePlatform/static/images/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/favicon.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/image-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/image-1.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/image-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/image-2.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/image-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/image-3.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/image-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/image-4.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/image-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/image-5.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/image-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/image-6.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/thumb-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/thumb-1.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/thumb-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/thumb-2.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/thumb-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/thumb-3.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/thumb-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/thumb-4.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/thumb-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/thumb-5.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/gallery/thumb-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/gallery/thumb-6.jpg
--------------------------------------------------------------------------------
/VManagePlatform/static/images/keyboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/keyboard.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/mouse_left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/mouse_left.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/mouse_middle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/mouse_middle.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/mouse_none.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/mouse_none.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/mouse_right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/mouse_right.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/power.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/power.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/screen_320x460.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/screen_320x460.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/screen_57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/screen_57x57.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/screen_700x700.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/screen_700x700.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/settings.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/showextrakeys.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/showextrakeys.png
--------------------------------------------------------------------------------
/VManagePlatform/static/images/tab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/images/tab.png
--------------------------------------------------------------------------------
/VManagePlatform/static/img/icons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/img/icons.png
--------------------------------------------------------------------------------
/VManagePlatform/static/include/Orbitron700.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/include/Orbitron700.ttf
--------------------------------------------------------------------------------
/VManagePlatform/static/include/Orbitron700.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/include/Orbitron700.woff
--------------------------------------------------------------------------------
/VManagePlatform/static/include/blue.css:
--------------------------------------------------------------------------------
1 | /*
2 | * noVNC blue CSS
3 | * Copyright (C) 2012 Joel Martin
4 | * Copyright (C) 2013 Samuel Mannehed for Cendio AB
5 | * noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
6 | * This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
7 | */
8 |
9 | .noVNC_status_normal {
10 | background-color:#04073d;
11 | background-image: -webkit-gradient(
12 | linear,
13 | left bottom,
14 | left top,
15 | color-stop(0.54, rgb(10,15,79)),
16 | color-stop(0.5, rgb(4,7,61))
17 | );
18 | background-image: -moz-linear-gradient(
19 | center bottom,
20 | rgb(10,15,79) 54%,
21 | rgb(4,7,61) 50%
22 | );
23 | }
24 | .noVNC_status_error {
25 | background-color:#f04040;
26 | background-image: -webkit-gradient(
27 | linear,
28 | left bottom,
29 | left top,
30 | color-stop(0.54, rgb(240,64,64)),
31 | color-stop(0.5, rgb(4,7,61))
32 | );
33 | background-image: -moz-linear-gradient(
34 | center bottom,
35 | rgb(4,7,61) 54%,
36 | rgb(249,64,64) 50%
37 | );
38 | }
39 | .noVNC_status_warn {
40 | background-color:#f0f040;
41 | background-image: -webkit-gradient(
42 | linear,
43 | left bottom,
44 | left top,
45 | color-stop(0.54, rgb(240,240,64)),
46 | color-stop(0.5, rgb(4,7,61))
47 | );
48 | background-image: -moz-linear-gradient(
49 | center bottom,
50 | rgb(4,7,61) 54%,
51 | rgb(240,240,64) 50%
52 | );
53 | }
54 |
55 | .triangle-right {
56 | border:2px solid #fff;
57 | background:#04073d;
58 | color:#fff;
59 | }
60 |
61 | #keyboardinput {
62 | background-color:#04073d;
63 | }
64 |
65 |
--------------------------------------------------------------------------------
/VManagePlatform/static/include/playback.js:
--------------------------------------------------------------------------------
1 | /*
2 | * noVNC: HTML5 VNC client
3 | * Copyright (C) 2012 Joel Martin
4 | * Licensed under MPL 2.0 (see LICENSE.txt)
5 | */
6 |
7 | "use strict";
8 | /*jslint browser: true, white: false */
9 | /*global Util, VNC_frame_data, finish */
10 |
11 | var rfb, mode, test_state, frame_idx, frame_length,
12 | iteration, iterations, istart_time,
13 |
14 | // Pre-declarations for jslint
15 | send_array, next_iteration, queue_next_packet, do_packet;
16 |
17 | // Override send_array
18 | send_array = function (arr) {
19 | // Stub out send_array
20 | };
21 |
22 | next_iteration = function () {
23 | if (iteration === 0) {
24 | frame_length = VNC_frame_data.length;
25 | test_state = 'running';
26 | } else {
27 | rfb.disconnect();
28 | }
29 |
30 | if (test_state !== 'running') { return; }
31 |
32 | iteration += 1;
33 | if (iteration > iterations) {
34 | finish();
35 | return;
36 | }
37 |
38 | frame_idx = 0;
39 | istart_time = (new Date()).getTime();
40 | rfb.connect('test', 0, "bogus");
41 |
42 | queue_next_packet();
43 |
44 | };
45 |
46 | queue_next_packet = function () {
47 | var frame, foffset, toffset, delay;
48 | if (test_state !== 'running') { return; }
49 |
50 | frame = VNC_frame_data[frame_idx];
51 | while ((frame_idx < frame_length) && (frame.charAt(0) === "}")) {
52 | //Util.Debug("Send frame " + frame_idx);
53 | frame_idx += 1;
54 | frame = VNC_frame_data[frame_idx];
55 | }
56 |
57 | if (frame === 'EOF') {
58 | Util.Debug("Finished, found EOF");
59 | next_iteration();
60 | return;
61 | }
62 | if (frame_idx >= frame_length) {
63 | Util.Debug("Finished, no more frames");
64 | next_iteration();
65 | return;
66 | }
67 |
68 | if (mode === 'realtime') {
69 | foffset = frame.slice(1, frame.indexOf('{', 1));
70 | toffset = (new Date()).getTime() - istart_time;
71 | delay = foffset - toffset;
72 | if (delay < 1) {
73 | delay = 1;
74 | }
75 |
76 | setTimeout(do_packet, delay);
77 | } else {
78 | setTimeout(do_packet, 1);
79 | }
80 | };
81 |
82 | var bytes_processed = 0;
83 |
84 | do_packet = function () {
85 | //Util.Debug("Processing frame: " + frame_idx);
86 | var frame = VNC_frame_data[frame_idx],
87 | start = frame.indexOf('{', 1) + 1;
88 | bytes_processed += frame.length - start;
89 | if (VNC_frame_encoding === 'binary') {
90 | var u8 = new Uint8Array(frame.length - start);
91 | for (var i = 0; i < frame.length - start; i++) {
92 | u8[i] = frame.charCodeAt(start + i);
93 | }
94 | rfb.recv_message({'data' : u8});
95 | } else {
96 | rfb.recv_message({'data' : frame.slice(start)});
97 | }
98 | frame_idx += 1;
99 |
100 | queue_next_packet();
101 | };
102 |
103 |
--------------------------------------------------------------------------------
/VManagePlatform/static/include/web-socket-js/WebSocketMain.swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/static/include/web-socket-js/WebSocketMain.swf
--------------------------------------------------------------------------------
/VManagePlatform/static/js/bootstrap-tag.min.js:
--------------------------------------------------------------------------------
1 | !function(c){var b=function(e,d){this.element=c(e);this.options=c.extend(true,{},c.fn.tag.defaults,d);this.values=c.grep(c.map(this.element.val().split(","),c.trim),function(f){return f.length>0});this.show()};b.prototype={constructor:b,show:function(){var d=this;d.element.parent().prepend(d.element.detach().hide());d.element.wrap(c('
')).parent().on("click",function(){d.input.focus()});if(d.values.length){c.each(d.values,function(){d.createBadge(this)})}d.input=c('
').attr("placeholder",d.options.placeholder).insertAfter(d.element).on("focus",function(){d.element.parent().addClass("tags-hover")}).on("blur",function(){if(!d.skip){d.process();d.element.parent().removeClass("tags-hover");d.element.siblings(".tag").removeClass("tag-important")}d.skip=false}).on("keydown",function(g){if(g.keyCode==188||g.keyCode==13||g.keyCode==9){if(c.trim(c(this).val())&&(!d.element.siblings(".typeahead").length||d.element.siblings(".typeahead").is(":hidden"))){if(g.keyCode!=9){g.preventDefault()}d.process()}else{if(g.keyCode==188){if(!d.element.siblings(".typeahead").length||d.element.siblings(".typeahead").is(":hidden")){g.preventDefault()}else{d.input.data("typeahead").select();g.stopPropagation();g.preventDefault()}}}}else{if(!c.trim(c(this).val())&&g.keyCode==8){var f=d.element.siblings(".tag").length;if(f){var e=d.element.siblings(".tag:eq("+(f-1)+")");if(e.hasClass("tag-important")){d.remove(f-1)}else{e.addClass("tag-important")}}}else{d.element.siblings(".tag").removeClass("tag-important")}}}).typeahead({source:d.options.source,matcher:function(e){return ~e.toLowerCase().indexOf(this.query.toLowerCase())&&(d.inValues(e)==-1||d.options.allowDuplicates)},updater:c.proxy(d.add,d)});c(d.input.data("typeahead").$menu).on("mousedown",function(){d.skip=true});this.element.trigger("shown")},inValues:function(e){if(this.options.caseInsensitive){var d=-1;c.each(this.values,function(f,g){if(g.toLowerCase()==e.toLowerCase()){d=f;return false}});return d}else{return c.inArray(e,this.values)}},createBadge:function(e){var d=this;c("
",{"class":"tag"}).text(e).append(c('
').on("click",function(){d.remove(d.element.siblings(".tag").index(c(this).closest(".tag")))})).insertBefore(d.element)},add:function(g){var f=this;if(!f.options.allowDuplicates){var e=f.inValues(g);if(e!=-1){var d=f.element.siblings(".tag:eq("+e+")");d.addClass("tag-warning");setTimeout(function(){c(d).removeClass("tag-warning")},500);return}}this.values.push(g);this.createBadge(g);this.element.val(this.values.join(", "));this.element.trigger("added",[g])},remove:function(d){if(d>=0){var e=this.values.splice(d,1);this.element.siblings(".tag:eq("+d+")").remove();this.element.val(this.values.join(", "));this.element.trigger("removed",[e])}},process:function(){var d=c.grep(c.map(this.input.val().split(","),c.trim),function(f){return f.length>0}),e=this;c.each(d,function(){e.add(this)});this.input.val("")},skip:false};var a=c.fn.tag;c.fn.tag=function(d){return this.each(function(){var f=c(this),g=f.data("tag"),e=typeof d=="object"&&d;if(!g){f.data("tag",(g=new b(this,e)))}if(typeof d=="string"){g[d]()}})};c.fn.tag.defaults={allowDuplicates:false,caseInsensitive:true,placeholder:"",source:[]};c.fn.tag.Constructor=b;c.fn.tag.noConflict=function(){c.fn.tag=a;return this};c(window).on("load",function(){c('[data-provide="tag"]').each(function(){var d=c(this);if(d.data("tag")){return}d.tag(d.data())})})}(window.jQuery);
--------------------------------------------------------------------------------
/VManagePlatform/static/js/bootstrap-wysiwyg.min.js:
--------------------------------------------------------------------------------
1 | (function(b){var a=function(e){var c=b.Deferred(),d=new FileReader();d.onload=function(f){c.resolve(f.target.result)};d.onerror=c.reject;d.onprogress=c.notify;d.readAsDataURL(e);return c.promise()};b.fn.cleanHtml=function(){var c=b(this).html();return c&&c.replace(/(
|\s|
<\/div>| )*$/,"")};b.fn.wysiwyg=function(k){var l=this,h,q,d,p=function(){if(q.activeToolbarClass){b(q.toolbarSelector).find(d).each(function(){try{var s=b(this).data(q.commandRole);if(document.queryCommandState(s)){b(this).addClass(q.activeToolbarClass)}else{b(this).removeClass(q.activeToolbarClass)}}catch(r){}})}},o=function(r,s){var u=r.split(" "),v=u.shift(),t=u.join(" ")+(s||"");document.execCommand(v,0,t);p()},f=function(r){b.each(r,function(s,t){l.keydown(s,function(u){if(l.attr("contenteditable")&&l.is(":visible")){u.preventDefault();u.stopPropagation();o(t)}}).keyup(s,function(u){if(l.attr("contenteditable")&&l.is(":visible")){u.preventDefault();u.stopPropagation()}})})},g=function(){try{var r=window.getSelection();if(r.getRangeAt&&r.rangeCount){return r.getRangeAt(0)}}catch(s){}},i=function(){h=g()},e=function(){try{var s=window.getSelection();if(h){try{s.removeAllRanges()}catch(r){document.body.createTextRange().select();document.selection.empty()}s.addRange(h)}}catch(t){}},j=function(r){l.focus();b.each(r,function(s,t){if(/^image\//.test(t.type)){b.when(a(t)).done(function(u){o("insertimage",u)}).fail(function(u){q.fileUploadError("file-reader",u)})}else{q.fileUploadError("unsupported-file-type",t.type)}})},c=function(s,r){e();if(document.queryCommandSupported("hiliteColor")){document.execCommand("hiliteColor",0,r||"transparent")}i();s.data(q.selectionMarker,r)},m=function(s,r){s.find(d).click(function(){e();l.focus();o(b(this).data(r.commandRole));i()});s.find("[data-toggle=dropdown]").click(e);s.find("input[type=text][data-"+r.commandRole+"]").on("webkitspeechchange change",function(){var t=this.value;this.value="";e();if(t){l.focus();o(b(this).data(r.commandRole),t)}i()}).on("focus",function(){var t=b(this);if(!t.data(r.selectionMarker)){c(t,r.selectionColor);t.focus()}}).on("blur",function(){var t=b(this);if(t.data(r.selectionMarker)){c(t,false)}});s.find("input[type=file][data-"+r.commandRole+"]").change(function(){e();if(this.type==="file"&&this.files&&this.files.length>0){j(this.files)}i();this.value=""})},n=function(){l.on("dragenter dragover",false).on("drop",function(s){var r=s.originalEvent.dataTransfer;s.stopPropagation();s.preventDefault();if(r&&r.files&&r.files.length>0){j(r.files)}})};q=b.extend({},b.fn.wysiwyg.defaults,k);d="a[data-"+q.commandRole+"],button[data-"+q.commandRole+"],input[type=button][data-"+q.commandRole+"]";f(q.hotKeys);if(q.dragAndDropImages){n()}m(b(q.toolbarSelector),q);l.attr("contenteditable",true).on("mouseup keyup mouseout",function(){i();p()});b(window).bind("touchend",function(u){var t=(l.is(u.target)||l.has(u.target).length>0),s=g(),r=s&&(s.startContainer===s.endContainer&&s.startOffset===s.endOffset);if(!r||t){i();p()}});return this};b.fn.wysiwyg.defaults={hotKeys:{"ctrl+b meta+b":"bold","ctrl+i meta+i":"italic","ctrl+u meta+u":"underline","ctrl+z meta+z":"undo","ctrl+y meta+y meta+shift+z":"redo","ctrl+l meta+l":"justifyleft","ctrl+r meta+r":"justifyright","ctrl+e meta+e":"justifycenter","ctrl+j meta+j":"justifyfull","shift+tab":"outdent",tab:"indent"},toolbarSelector:"[data-role=editor-toolbar]",commandRole:"edit",activeToolbarClass:"btn-info",selectionMarker:"edit-focus-marker",selectionColor:"darkgrey",dragAndDropImages:true,fileUploadError:function(d,c){console.log("File upload error",d,c)}}}(window.jQuery));
--------------------------------------------------------------------------------
/VManagePlatform/static/js/csrf.js:
--------------------------------------------------------------------------------
1 | $(document).ajaxSend(function(event, xhr, settings) {
2 | function getCookie(name) {
3 | var cookieValue = null;
4 | if (document.cookie && document.cookie != '') {
5 | var cookies = document.cookie.split(';');
6 | for (var i = 0; i < cookies.length; i++) {
7 | var cookie = jQuery.trim(cookies[i]);
8 | // Does this cookie string begin with the name we want?
9 | if (cookie.substring(0, name.length + 1) == (name + '=')) {
10 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
11 | break;
12 | }
13 | }
14 | }
15 | return cookieValue;
16 | }
17 | function sameOrigin(url) {
18 | // url could be relative or scheme relative or absolute
19 | var host = document.location.host; // host + port
20 | var protocol = document.location.protocol;
21 | var sr_origin = '//' + host;
22 | var origin = protocol + sr_origin;
23 | // Allow absolute or scheme relative URLs to same origin
24 | return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
25 | (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
26 | // or any other URL that isn't scheme relative or absolute i.e relative.
27 | !(/^(\/\/|http:|https:).*/.test(url));
28 | }
29 | function safeMethod(method) {
30 | return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
31 | }
32 |
33 | if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
34 | xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
35 | }
36 | });
--------------------------------------------------------------------------------
/VManagePlatform/static/js/flot/jquery.flot.resize.min.js:
--------------------------------------------------------------------------------
1 | /* Flot plugin for automatically redrawing plots as the placeholder resizes.
2 |
3 | Copyright (c) 2007-2013 IOLA and Ole Laursen.
4 | Licensed under the MIT license.
5 |
6 | It works by listening for changes on the placeholder div (through the jQuery
7 | resize event plugin) - if the size changes, it will redraw the plot.
8 |
9 | There are no options. If you need to disable the plugin for some plots, you
10 | can just fix the size of their placeholders.
11 |
12 | *//* Inline dependency:
13 | * jQuery resize event - v1.1 - 3/14/2010
14 | * http://benalman.com/projects/jquery-resize-plugin/
15 | *
16 | * Copyright (c) 2010 "Cowboy" Ben Alman
17 | * Dual licensed under the MIT and GPL licenses.
18 | * http://benalman.com/about/license/
19 | */(function(e,t,n){function c(){s=t[o](function(){r.each(function(){var t=e(this),n=t.width(),r=t.height(),i=e.data(this,a);(n!==i.w||r!==i.h)&&t.trigger(u,[i.w=n,i.h=r])}),c()},i[f])}var r=e([]),i=e.resize=e.extend(e.resize,{}),s,o="setTimeout",u="resize",a=u+"-special-event",f="delay",l="throttleWindow";i[f]=250,i[l]=!0,e.event.special[u]={setup:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.add(t),e.data(this,a,{w:t.width(),h:t.height()}),r.length===1&&c()},teardown:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.not(t),t.removeData(a),r.length||clearTimeout(s)},add:function(t){function s(t,i,s){var o=e(this),u=e.data(this,a);u.w=i!==n?i:o.width(),u.h=s!==n?s:o.height(),r.apply(this,arguments)}if(!i[l]&&this[o])return!1;var r;if(e.isFunction(t))return r=t,s;r=t.handler,t.handler=s}}})(jQuery,this),function(e){function n(e){function t(){var t=e.getPlaceholder();if(t.width()==0||t.height()==0)return;e.resize(),e.setupGrid(),e.draw()}function n(e,n){e.getPlaceholder().resize(t)}function r(e,n){e.getPlaceholder().unbind("resize",t)}e.hooks.bindEvents.push(n),e.hooks.shutdown.push(r)}var t={};e.plot.plugins.push({init:n,options:t,name:"resize",version:"1.0"})}(jQuery);
--------------------------------------------------------------------------------
/VManagePlatform/static/js/fuelux/fuelux.spinner.min.js:
--------------------------------------------------------------------------------
1 | (function(b,c){var a=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.spinner.defaults,d);this.$input=this.$element.find(".spinner-input");this.$element.on("keyup",this.$input,b.proxy(this.change,this));if(this.options.hold){this.$element.on("mousedown",".spinner-up",b.proxy(function(){this.startSpin(true)},this));this.$element.on("mouseup",".spinner-up, .spinner-down",b.proxy(this.stopSpin,this));this.$element.on("mouseout",".spinner-up, .spinner-down",b.proxy(this.stopSpin,this));this.$element.on("mousedown",".spinner-down",b.proxy(function(){this.startSpin(false)},this))}else{this.$element.on("click",".spinner-up",b.proxy(function(){this.step(true)},this));this.$element.on("click",".spinner-down",b.proxy(function(){this.step(false)},this))}this.switches={count:1,enabled:true};if(this.options.speed==="medium"){this.switches.speed=300}else{if(this.options.speed==="fast"){this.switches.speed=100}else{this.switches.speed=500}}this.lastValue=null;this.render();if(this.options.disabled){this.disable()}};a.prototype={constructor:a,render:function(){this.$input.val(this.options.value);this.$input.attr("maxlength",(this.options.max+"").split("").length)},change:function(){var d=this.$input.val();if(d/1){this.options.value=d/1}else{d=d.replace(/[^0-9]/g,"");this.$input.val(d);this.options.value=d/1}this.triggerChangedEvent()},stopSpin:function(){clearTimeout(this.switches.timeout);this.switches.count=1;this.triggerChangedEvent()},triggerChangedEvent:function(){var d=this.value();if(d===this.lastValue){return}this.lastValue=d;this.$element.trigger("changed",d);this.$element.trigger("change")},startSpin:function(d){if(!this.options.disabled){var e=this.switches.count;if(e===1){this.step(d);e=1}else{if(e<3){e=1.5}else{if(e<8){e=2.5}else{e=4}}}this.switches.timeout=setTimeout(b.proxy(function(){this.iterator(d)},this),this.switches.speed/e);this.switches.count++}},iterator:function(d){this.step(d);this.startSpin(d)},step:function(e){var g=this.options.value;var f=e?this.options.max:this.options.min;if((e?gf)){var d=g+(e?1:-1)*this.options.step;if(e?d>f:dLoading...
",cacheItems:true};a.fn.tree.Constructor=b})(window.jQuery);
--------------------------------------------------------------------------------
/VManagePlatform/static/js/fuelux/fuelux.wizard.min.js:
--------------------------------------------------------------------------------
1 | (function(b,c){var a=function(f,e){var d;this.$element=b(f);this.options=b.extend({},b.fn.wizard.defaults,e);this.currentStep=1;this.numSteps=this.$element.find("li").length;this.$prevBtn=this.$element.find("button.btn-prev");this.$nextBtn=this.$element.find("button.btn-next");d=this.$nextBtn.children().detach();this.nextText=b.trim(this.$nextBtn.text());this.$nextBtn.append(d);this.$prevBtn.on("click",b.proxy(this.previous,this));this.$nextBtn.on("click",b.proxy(this.next,this));this.$element.on("click","li.complete",b.proxy(this.stepclicked,this));this.$stepContainer=this.$element.data("target")||"body";this.$stepContainer=b(this.$stepContainer)};a.prototype={constructor:a,setState:function(){var n=(this.currentStep>1);var o=(this.currentStep===1);var d=(this.currentStep===this.numSteps);this.$prevBtn.attr("disabled",(o===true||n===false));var h=this.$nextBtn.data();if(h&&h.last){this.lastText=h.last;if(typeof this.lastText!=="undefined"){var l=(d!==true)?this.nextText:this.lastText;var f=this.$nextBtn.children().detach();this.$nextBtn.text(l).append(f)}}var j=this.$element.find("li");j.removeClass("active").removeClass("complete");j.find("span.badge").removeClass("badge-info").removeClass("badge-success");var m="li:lt("+(this.currentStep-1)+")";var g=this.$element.find(m);g.addClass("complete");g.find("span.badge").addClass("badge-success");var e="li:eq("+(this.currentStep-1)+")";var k=this.$element.find(e);k.addClass("active");k.find("span.badge").addClass("badge-info");var i=k.data().target;this.$stepContainer.find(".step-pane").removeClass("active");b(i).addClass("active");this.$element.trigger("changed")},stepclicked:function(h){var d=b(h.currentTarget);var g=this.$element.find("li").index(d);var f=b.Event("stepclick");this.$element.trigger(f,{step:g+1});if(f.isDefaultPrevented()){return}this.currentStep=(g+1);this.setState()},previous:function(){var d=(this.currentStep>1);if(d){var f=b.Event("change");this.$element.trigger(f,{step:this.currentStep,direction:"previous"});if(f.isDefaultPrevented()){return}this.currentStep-=1;this.setState()}},next:function(){var g=(this.currentStep+1<=this.numSteps);var d=(this.currentStep===this.numSteps);if(g){var f=b.Event("change");this.$element.trigger(f,{step:this.currentStep,direction:"next"});if(f.isDefaultPrevented()){return}this.currentStep+=1;this.setState()}else{if(d){this.$element.trigger("finished")}}},selectedItem:function(d){return{step:this.currentStep}}};b.fn.wizard=function(e,g){var f;var d=this.each(function(){var j=b(this);var i=j.data("wizard");var h=typeof e==="object"&&e;if(!i){j.data("wizard",(i=new a(this,h)))}if(typeof e==="string"){f=i[e](g)}});return(f===c)?d:f};b.fn.wizard.defaults={};b.fn.wizard.Constructor=a;b(function(){b("body").on("mousedown.wizard.data-api",".wizard",function(){var d=b(this);if(d.data("wizard")){return}d.wizard(d.data())})})})(window.jQuery);
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ar_AR.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | /*!
25 | * Translated default messages for bootstrap-select.
26 | * Locale: AR (Arabic)
27 | * Author: Yasser Lotfy
28 | */
29 | (function ($) {
30 | $.fn.selectpicker.defaults = {
31 | noneSelectedText: 'لم يتم إختيار شئ',
32 | noneResultsText: 'لا توجد نتائج مطابقة لـ {0}',
33 | countSelectedText: function (numSelected, numTotal) {
34 | return (numSelected == 1) ? "{0} خيار تم إختياره" : "{0} خيارات تمت إختيارها";
35 | },
36 | maxOptionsText: function (numAll, numGroup) {
37 | return [
38 | (numAll == 1) ? 'تخطى الحد المسموح ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح ({n} خيارات بحد أقصى)',
39 | (numGroup == 1) ? 'تخطى الحد المسموح للمجموعة ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح للمجموعة ({n} خيارات بحد أقصى)'
40 | ];
41 | },
42 | selectAllText: 'إختيار الجميع',
43 | deselectAllText: 'إلغاء إختيار الجميع',
44 | multipleSeparator: '، '
45 | };
46 | })(jQuery);
47 |
48 |
49 | }));
50 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ar_AR.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){/*!
8 | * Translated default messages for bootstrap-select.
9 | * Locale: AR (Arabic)
10 | * Author: Yasser Lotfy
11 | */
12 | !function(a){a.fn.selectpicker.defaults={noneSelectedText:"لم يتم إختيار شئ",noneResultsText:"لا توجد نتائج مطابقة لـ {0}",countSelectedText:function(a,b){return 1==a?"{0} خيار تم إختياره":"{0} خيارات تمت إختيارها"},maxOptionsText:function(a,b){return[1==a?"تخطى الحد المسموح ({n} خيار بحد أقصى)":"تخطى الحد المسموح ({n} خيارات بحد أقصى)",1==b?"تخطى الحد المسموح للمجموعة ({n} خيار بحد أقصى)":"تخطى الحد المسموح للمجموعة ({n} خيارات بحد أقصى)"]},selectAllText:"إختيار الجميع",deselectAllText:"إلغاء إختيار الجميع",multipleSeparator:"، "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-bg_BG.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Нищо избрано',
27 | noneResultsText: 'Няма резултат за {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} избран елемент" : "{0} избрани елемента";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Лимита е достигнат ({n} елемент максимум)' : 'Лимита е достигнат ({n} елемента максимум)',
34 | (numGroup == 1) ? 'Груповия лимит е достигнат ({n} елемент максимум)' : 'Груповия лимит е достигнат ({n} елемента максимум)'
35 | ];
36 | },
37 | selectAllText: 'Избери всички',
38 | deselectAllText: 'Размаркирай всички',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-bg_BG.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Нищо избрано",noneResultsText:"Няма резултат за {0}",countSelectedText:function(a,b){return 1==a?"{0} избран елемент":"{0} избрани елемента"},maxOptionsText:function(a,b){return[1==a?"Лимита е достигнат ({n} елемент максимум)":"Лимита е достигнат ({n} елемента максимум)",1==b?"Груповия лимит е достигнат ({n} елемент максимум)":"Груповия лимит е достигнат ({n} елемента максимум)"]},selectAllText:"Избери всички",deselectAllText:"Размаркирай всички",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-cro_CRO.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Odaberite stavku',
27 | noneResultsText: 'Nema rezultata pretrage {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} stavka selektirana" : "{0} stavke selektirane";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Limit je postignut ({n} stvar maximalno)' : 'Limit je postignut ({n} stavke maksimalno)',
34 | (numGroup == 1) ? 'Grupni limit je postignut ({n} stvar maksimalno)' : 'Grupni limit je postignut ({n} stavke maksimalno)'
35 | ];
36 | },
37 | selectAllText: 'Selektiraj sve',
38 | deselectAllText: 'Deselektiraj sve',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-cro_CRO.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Odaberite stavku",noneResultsText:"Nema rezultata pretrage {0}",countSelectedText:function(a,b){return 1==a?"{0} stavka selektirana":"{0} stavke selektirane"},maxOptionsText:function(a,b){return[1==a?"Limit je postignut ({n} stvar maximalno)":"Limit je postignut ({n} stavke maksimalno)",1==b?"Grupni limit je postignut ({n} stvar maksimalno)":"Grupni limit je postignut ({n} stavke maksimalno)"]},selectAllText:"Selektiraj sve",deselectAllText:"Deselektiraj sve",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-cs_CZ.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Nic není vybráno',
27 | noneResultsText: 'Žádné výsledky {0}',
28 | countSelectedText: 'Označeno {0} z {1}',
29 | maxOptionsText: ['Limit překročen ({n} {var} max)', 'Limit skupiny překročen ({n} {var} max)', ['položek', 'položka']],
30 | multipleSeparator: ', '
31 | };
32 | })(jQuery);
33 |
34 |
35 | }));
36 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-cs_CZ.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nic není vybráno",noneResultsText:"Žádné výsledky {0}",countSelectedText:"Označeno {0} z {1}",maxOptionsText:["Limit překročen ({n} {var} max)","Limit skupiny překročen ({n} {var} max)",["položek","položka"]],multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-da_DK.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Intet valgt',
27 | noneResultsText: 'Ingen resultater fundet {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} valgt" : "{0} valgt";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Begrænsning nået (max {n} valgt)' : 'Begrænsning nået (max {n} valgte)',
34 | (numGroup == 1) ? 'Gruppe-begrænsning nået (max {n} valgt)' : 'Gruppe-begrænsning nået (max {n} valgte)'
35 | ];
36 | },
37 | selectAllText: 'Markér alle',
38 | deselectAllText: 'Afmarkér alle',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-da_DK.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Intet valgt",noneResultsText:"Ingen resultater fundet {0}",countSelectedText:function(a,b){return"{0} valgt"},maxOptionsText:function(a,b){return[1==a?"Begrænsning nået (max {n} valgt)":"Begrænsning nået (max {n} valgte)",1==b?"Gruppe-begrænsning nået (max {n} valgt)":"Gruppe-begrænsning nået (max {n} valgte)"]},selectAllText:"Markér alle",deselectAllText:"Afmarkér alle",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-de_DE.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Bitte wählen...',
27 | noneResultsText: 'Keine Ergebnisse für {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} Element ausgewählt" : "{0} Elemente ausgewählt";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Limit erreicht ({n} Element max.)' : 'Limit erreicht ({n} Elemente max.)',
34 | (numGroup == 1) ? 'Gruppen-Limit erreicht ({n} Element max.)' : 'Gruppen-Limit erreicht ({n} Elemente max.)'
35 | ];
36 | },
37 | selectAllText: 'Alles auswählen',
38 | deselectAllText: 'Nichts auswählen',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-de_DE.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Bitte wählen...",noneResultsText:"Keine Ergebnisse für {0}",countSelectedText:function(a,b){return 1==a?"{0} Element ausgewählt":"{0} Elemente ausgewählt"},maxOptionsText:function(a,b){return[1==a?"Limit erreicht ({n} Element max.)":"Limit erreicht ({n} Elemente max.)",1==b?"Gruppen-Limit erreicht ({n} Element max.)":"Gruppen-Limit erreicht ({n} Elemente max.)"]},selectAllText:"Alles auswählen",deselectAllText:"Nichts auswählen",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-en_US.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Nothing selected',
27 | noneResultsText: 'No results match {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} item selected" : "{0} items selected";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
34 | (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
35 | ];
36 | },
37 | selectAllText: 'Select All',
38 | deselectAllText: 'Deselect All',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-en_US.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nothing selected",noneResultsText:"No results match {0}",countSelectedText:function(a,b){return 1==a?"{0} item selected":"{0} items selected"},maxOptionsText:function(a,b){return[1==a?"Limit reached ({n} item max)":"Limit reached ({n} items max)",1==b?"Group limit reached ({n} item max)":"Group limit reached ({n} items max)"]},selectAllText:"Select All",deselectAllText:"Deselect All",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-es_CL.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'No hay selección',
27 | noneResultsText: 'No hay resultados {0}',
28 | countSelectedText: 'Seleccionados {0} de {1}',
29 | maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],
30 | multipleSeparator: ', ',
31 | selectAllText: 'Seleccionar Todos',
32 | deselectAllText: 'Desmarcar Todos'
33 | };
34 | })(jQuery);
35 |
36 |
37 | }));
38 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-es_CL.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"No hay selección",noneResultsText:"No hay resultados {0}",countSelectedText:"Seleccionados {0} de {1}",maxOptionsText:["Límite alcanzado ({n} {var} max)","Límite del grupo alcanzado({n} {var} max)",["elementos","element"]],multipleSeparator:", ",selectAllText:"Seleccionar Todos",deselectAllText:"Desmarcar Todos"}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-es_ES.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'No hay selección',
27 | noneResultsText: 'No hay resultados {0}',
28 | countSelectedText: 'Seleccionados {0} de {1}',
29 | maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],
30 | multipleSeparator: ', ',
31 | selectAllText: 'Seleccionar Todos',
32 | deselectAllText: 'Desmarcar Todos'
33 | };
34 | })(jQuery);
35 |
36 |
37 | }));
38 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-es_ES.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"No hay selección",noneResultsText:"No hay resultados {0}",countSelectedText:"Seleccionados {0} de {1}",maxOptionsText:["Límite alcanzado ({n} {var} max)","Límite del grupo alcanzado({n} {var} max)",["elementos","element"]],multipleSeparator:", ",selectAllText:"Seleccionar Todos",deselectAllText:"Desmarcar Todos"}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-eu.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Hautapenik ez',
27 | noneResultsText: 'Emaitzarik ez {0}',
28 | countSelectedText: '{1}(e)tik {0} hautatuta',
29 | maxOptionsText: ['Mugara iritsita ({n} {var} gehienez)', 'Taldearen mugara iritsita ({n} {var} gehienez)', ['elementu', 'elementu']],
30 | multipleSeparator: ', '
31 | };
32 | })(jQuery);
33 |
34 |
35 | }));
36 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-eu.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Hautapenik ez",noneResultsText:"Emaitzarik ez {0}",countSelectedText:"{1}(e)tik {0} hautatuta",maxOptionsText:["Mugara iritsita ({n} {var} gehienez)","Taldearen mugara iritsita ({n} {var} gehienez)",["elementu","elementu"]],multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-fa_IR.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'چیزی انتخاب نشده است',
27 | noneResultsText: 'هیج مشابهی برای {0} پیدا نشد',
28 | countSelectedText: "{0} از {1} مورد انتخاب شده",
29 | maxOptionsText: ['بیشتر ممکن نیست {حداکثر {n} عدد}', 'بیشتر ممکن نیست {حداکثر {n} عدد}'],
30 | selectAllText: 'انتخاب همه',
31 | deselectAllText: 'انتخاب هیچ کدام',
32 | multipleSeparator: ', '
33 | };
34 | })(jQuery);
35 |
36 |
37 | }));
38 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-fa_IR.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"چیزی انتخاب نشده است",noneResultsText:"هیج مشابهی برای {0} پیدا نشد",countSelectedText:"{0} از {1} مورد انتخاب شده",maxOptionsText:["بیشتر ممکن نیست {حداکثر {n} عدد}","بیشتر ممکن نیست {حداکثر {n} عدد}"],selectAllText:"انتخاب همه",deselectAllText:"انتخاب هیچ کدام",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-fi_FI.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Ei valintoja',
27 | noneResultsText: 'Ei hakutuloksia {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} valittu" : "{0} valitut";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Valintojen maksimimäärä ({n} saavutettu)' : 'Valintojen maksimimäärä ({n} saavutettu)',
34 | (numGroup == 1) ? 'Ryhmän maksimimäärä ({n} saavutettu)' : 'Ryhmän maksimimäärä ({n} saavutettu)'
35 | ];
36 | },
37 | selectAllText: 'Valitse kaikki',
38 | deselectAllText: 'Poista kaikki',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-fi_FI.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Ei valintoja",noneResultsText:"Ei hakutuloksia {0}",countSelectedText:function(a,b){return 1==a?"{0} valittu":"{0} valitut"},maxOptionsText:function(a,b){return["Valintojen maksimimäärä ({n} saavutettu)","Ryhmän maksimimäärä ({n} saavutettu)"]},selectAllText:"Valitse kaikki",deselectAllText:"Poista kaikki",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-fr_FR.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Aucune sélection',
27 | noneResultsText: 'Aucun résultat pour {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected > 1) ? "{0} éléments sélectionnés" : "{0} élément sélectionné";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll > 1) ? 'Limite atteinte ({n} éléments max)' : 'Limite atteinte ({n} élément max)',
34 | (numGroup > 1) ? 'Limite du groupe atteinte ({n} éléments max)' : 'Limite du groupe atteinte ({n} élément max)'
35 | ];
36 | },
37 | multipleSeparator: ', ',
38 | selectAllText: 'Tout Sélectionner',
39 | deselectAllText: 'Tout Dé-selectionner',
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-fr_FR.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Aucune sélection",noneResultsText:"Aucun résultat pour {0}",countSelectedText:function(a,b){return a>1?"{0} éléments sélectionnés":"{0} élément sélectionné"},maxOptionsText:function(a,b){return[a>1?"Limite atteinte ({n} éléments max)":"Limite atteinte ({n} élément max)",b>1?"Limite du groupe atteinte ({n} éléments max)":"Limite du groupe atteinte ({n} élément max)"]},multipleSeparator:", ",selectAllText:"Tout Sélectionner",deselectAllText:"Tout Dé-selectionner"}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-hu_HU.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Válasszon!',
27 | noneResultsText: 'Nincs találat {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return '{0} elem kiválasztva';
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | 'Legfeljebb {n} elem választható',
34 | 'A csoportban legfeljebb {n} elem választható'
35 | ];
36 | },
37 | selectAllText: 'Mind',
38 | deselectAllText: 'Egyik sem',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-hu_HU.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Válasszon!",noneResultsText:"Nincs találat {0}",countSelectedText:function(a,b){return"{0} elem kiválasztva"},maxOptionsText:function(a,b){return["Legfeljebb {n} elem választható","A csoportban legfeljebb {n} elem választható"]},selectAllText:"Mind",deselectAllText:"Egyik sem",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-id_ID.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Tidak ada yang dipilih',
27 | noneResultsText: 'Tidak ada yang cocok {0}',
28 | countSelectedText: '{0} terpilih',
29 | maxOptionsText: ['Mencapai batas (maksimum {n})', 'Mencapai batas grup (maksimum {n})'],
30 | selectAllText: 'Pilih Semua',
31 | deselectAllText: 'Hapus Semua',
32 | multipleSeparator: ', '
33 | };
34 | })(jQuery);
35 |
36 |
37 | }));
38 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-id_ID.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Tidak ada yang dipilih",noneResultsText:"Tidak ada yang cocok {0}",countSelectedText:"{0} terpilih",maxOptionsText:["Mencapai batas (maksimum {n})","Mencapai batas grup (maksimum {n})"],selectAllText:"Pilih Semua",deselectAllText:"Hapus Semua",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-it_IT.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Nessuna selezione',
27 | noneResultsText: 'Nessun risultato per {0}',
28 | countSelectedText: function (numSelected, numTotal){
29 | return (numSelected == 1) ? 'Selezionato {0} di {1}' : 'Selezionati {0} di {1}';
30 | },
31 | maxOptionsText: ['Limite raggiunto ({n} {var} max)', 'Limite del gruppo raggiunto ({n} {var} max)', ['elementi', 'elemento']],
32 | multipleSeparator: ', ',
33 | selectAllText: 'Seleziona Tutto',
34 | deselectAllText: 'Deseleziona Tutto'
35 | };
36 | })(jQuery);
37 |
38 |
39 | }));
40 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-it_IT.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nessuna selezione",noneResultsText:"Nessun risultato per {0}",countSelectedText:function(a,b){return 1==a?"Selezionato {0} di {1}":"Selezionati {0} di {1}"},maxOptionsText:["Limite raggiunto ({n} {var} max)","Limite del gruppo raggiunto ({n} {var} max)",["elementi","elemento"]],multipleSeparator:", ",selectAllText:"Seleziona Tutto",deselectAllText:"Deseleziona Tutto"}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ko_KR.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: '항목을 선택해주세요',
27 | noneResultsText: '{0} 검색 결과가 없습니다',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return "{0}개를 선택하였습니다";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | '{n}개까지 선택 가능합니다',
34 | '해당 그룹은 {n}개까지 선택 가능합니다'
35 | ];
36 | },
37 | selectAllText: '전체선택',
38 | deselectAllText: '전체해제',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ko_KR.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"항목을 선택해주세요",noneResultsText:"{0} 검색 결과가 없습니다",countSelectedText:function(a,b){return"{0}개를 선택하였습니다"},maxOptionsText:function(a,b){return["{n}개까지 선택 가능합니다","해당 그룹은 {n}개까지 선택 가능합니다"]},selectAllText:"전체선택",deselectAllText:"전체해제",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-lt_LT.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Niekas nepasirinkta',
27 | noneResultsText: 'Niekas nesutapo su {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} elementas pasirinktas" : "{0} elementai(-ų) pasirinkta";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Pasiekta riba ({n} elementas daugiausiai)' : 'Riba pasiekta ({n} elementai(-ų) daugiausiai)',
34 | (numGroup == 1) ? 'Grupės riba pasiekta ({n} elementas daugiausiai)' : 'Grupės riba pasiekta ({n} elementai(-ų) daugiausiai)'
35 | ];
36 | },
37 | selectAllText: 'Pasirinkti visus',
38 | deselectAllText: 'Atmesti visus',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-lt_LT.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Niekas nepasirinkta",noneResultsText:"Niekas nesutapo su {0}",countSelectedText:function(a,b){return 1==a?"{0} elementas pasirinktas":"{0} elementai(-ų) pasirinkta"},maxOptionsText:function(a,b){return[1==a?"Pasiekta riba ({n} elementas daugiausiai)":"Riba pasiekta ({n} elementai(-ų) daugiausiai)",1==b?"Grupės riba pasiekta ({n} elementas daugiausiai)":"Grupės riba pasiekta ({n} elementai(-ų) daugiausiai)"]},selectAllText:"Pasirinkti visus",deselectAllText:"Atmesti visus",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-nb_NO.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Ingen valgt',
27 | noneResultsText: 'Søket gir ingen treff {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} alternativ valgt" : "{0} alternativer valgt";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Grense nådd (maks {n} valg)' : 'Grense nådd (maks {n} valg)',
34 | (numGroup == 1) ? 'Grense for grupper nådd (maks {n} grupper)' : 'Grense for grupper nådd (maks {n} grupper)'
35 | ];
36 | },
37 | selectAllText: 'Merk alle',
38 | deselectAllText: 'Fjern alle',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-nb_NO.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Ingen valgt",noneResultsText:"Søket gir ingen treff {0}",countSelectedText:function(a,b){return 1==a?"{0} alternativ valgt":"{0} alternativer valgt"},maxOptionsText:function(a,b){return["Grense nådd (maks {n} valg)","Grense for grupper nådd (maks {n} grupper)"]},selectAllText:"Merk alle",deselectAllText:"Fjern alle",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-nl_NL.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Niets geselecteerd',
27 | noneResultsText: 'Geen resultaten gevonden voor {0}',
28 | countSelectedText: '{0} van {1} geselecteerd',
29 | maxOptionsText: ['Limiet bereikt ({n} {var} max)', 'Groep limiet bereikt ({n} {var} max)', ['items', 'item']],
30 | multipleSeparator: ', '
31 | };
32 | })(jQuery);
33 |
34 |
35 | }));
36 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-nl_NL.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Niets geselecteerd",noneResultsText:"Geen resultaten gevonden voor {0}",countSelectedText:"{0} van {1} geselecteerd",maxOptionsText:["Limiet bereikt ({n} {var} max)","Groep limiet bereikt ({n} {var} max)",["items","item"]],multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-pl_PL.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Nic nie zaznaczono',
27 | noneResultsText: 'Brak wyników wyszukiwania {0}',
28 | countSelectedText: 'Zaznaczono {0} z {1}',
29 | maxOptionsText: ['Osiągnięto limit ({n} {var} max)', 'Limit grupy osiągnięty ({n} {var} max)', ['elementy', 'element']],
30 | selectAll: 'Zaznacz wszystkie',
31 | deselectAll: 'Odznacz wszystkie',
32 | multipleSeparator: ', '
33 | };
34 | })(jQuery);
35 |
36 |
37 | }));
38 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-pl_PL.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nic nie zaznaczono",noneResultsText:"Brak wyników wyszukiwania {0}",countSelectedText:"Zaznaczono {0} z {1}",maxOptionsText:["Osiągnięto limit ({n} {var} max)","Limit grupy osiągnięty ({n} {var} max)",["elementy","element"]],selectAll:"Zaznacz wszystkie",deselectAll:"Odznacz wszystkie",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-pt_BR.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Nada selecionado',
27 | noneResultsText: 'Nada encontrado contendo {0}',
28 | countSelectedText: 'Selecionado {0} de {1}',
29 | maxOptionsText: ['Limite excedido (máx. {n} {var})', 'Limite do grupo excedido (máx. {n} {var})', ['itens', 'item']],
30 | multipleSeparator: ', '
31 | };
32 | })(jQuery);
33 |
34 |
35 | }));
36 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-pt_BR.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nada selecionado",noneResultsText:"Nada encontrado contendo {0}",countSelectedText:"Selecionado {0} de {1}",maxOptionsText:["Limite excedido (máx. {n} {var})","Limite do grupo excedido (máx. {n} {var})",["itens","item"]],multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-pt_PT.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Nenhum seleccionado',
27 | noneResultsText: 'Sem resultados contendo {0}',
28 | countSelectedText: 'Selecionado {0} de {1}',
29 | maxOptionsText: ['Limite ultrapassado (máx. {n} {var})', 'Limite de seleções ultrapassado (máx. {n} {var})', ['itens', 'item']],
30 | multipleSeparator: ', '
31 | };
32 | })(jQuery);
33 |
34 |
35 | }));
36 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-pt_PT.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nenhum seleccionado",noneResultsText:"Sem resultados contendo {0}",countSelectedText:"Selecionado {0} de {1}",maxOptionsText:["Limite ultrapassado (máx. {n} {var})","Limite de seleções ultrapassado (máx. {n} {var})",["itens","item"]],multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ro_RO.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Nu a fost selectat nimic',
27 | noneResultsText: 'Nu exista niciun rezultat {0}',
28 | countSelectedText: '{0} din {1} selectat(e)',
29 | maxOptionsText: ['Limita a fost atinsa ({n} {var} max)', 'Limita de grup a fost atinsa ({n} {var} max)', ['iteme', 'item']],
30 | multipleSeparator: ', '
31 | };
32 | })(jQuery);
33 |
34 |
35 | }));
36 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ro_RO.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nu a fost selectat nimic",noneResultsText:"Nu exista niciun rezultat {0}",countSelectedText:"{0} din {1} selectat(e)",maxOptionsText:["Limita a fost atinsa ({n} {var} max)","Limita de grup a fost atinsa ({n} {var} max)",["iteme","item"]],multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ru_RU.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Ничего не выбрано',
27 | noneResultsText: 'Совпадений не найдено {0}',
28 | countSelectedText: 'Выбрано {0} из {1}',
29 | maxOptionsText: ['Достигнут предел ({n} {var} максимум)', 'Достигнут предел в группе ({n} {var} максимум)', ['шт.', 'шт.']],
30 | doneButtonText: 'Закрыть',
31 | selectAllText: 'Выбрать все',
32 | deselectAllText: 'Отменить все',
33 | multipleSeparator: ', '
34 | };
35 | })(jQuery);
36 |
37 |
38 | }));
39 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ru_RU.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Ничего не выбрано",noneResultsText:"Совпадений не найдено {0}",countSelectedText:"Выбрано {0} из {1}",maxOptionsText:["Достигнут предел ({n} {var} максимум)","Достигнут предел в группе ({n} {var} максимум)",["шт.","шт."]],doneButtonText:"Закрыть",selectAllText:"Выбрать все",deselectAllText:"Отменить все",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-sk_SK.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Vyberte zo zoznamu',
27 | noneResultsText: 'Pre výraz {0} neboli nájdené žiadne výsledky',
28 | countSelectedText: 'Vybrané {0} z {1}',
29 | maxOptionsText: ['Limit prekročený ({n} {var} max)', 'Limit skupiny prekročený ({n} {var} max)', ['položiek', 'položka']],
30 | selectAllText: 'Vybrať všetky',
31 | deselectAllText: 'Zrušiť výber',
32 | multipleSeparator: ', '
33 | };
34 | })(jQuery);
35 |
36 |
37 | }));
38 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-sk_SK.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Vyberte zo zoznamu",noneResultsText:"Pre výraz {0} neboli nájdené žiadne výsledky",countSelectedText:"Vybrané {0} z {1}",maxOptionsText:["Limit prekročený ({n} {var} max)","Limit skupiny prekročený ({n} {var} max)",["položiek","položka"]],selectAllText:"Vybrať všetky",deselectAllText:"Zrušiť výber",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-sl_SI.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Nič izbranega',
27 | noneResultsText: 'Ni zadetkov za {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | "Število izbranih: {0}";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | 'Omejitev dosežena (max. izbranih: {n})',
34 | 'Omejitev skupine dosežena (max. izbranih: {n})'
35 | ];
36 | },
37 | selectAllText: 'Izberi vse',
38 | deselectAllText: 'Počisti izbor',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-sl_SI.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nič izbranega",noneResultsText:"Ni zadetkov za {0}",countSelectedText:function(a,b){"Število izbranih: {0}"},maxOptionsText:function(a,b){return["Omejitev dosežena (max. izbranih: {n})","Omejitev skupine dosežena (max. izbranih: {n})"]},selectAllText:"Izberi vse",deselectAllText:"Počisti izbor",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-sv_SE.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Inget valt',
27 | noneResultsText: 'Inget sökresultat matchar {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected === 1) ? "{0} alternativ valt" : "{0} alternativ valda";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | 'Gräns uppnåd (max {n} alternativ)',
34 | 'Gräns uppnåd (max {n} gruppalternativ)'
35 | ];
36 | },
37 | selectAllText: 'Markera alla',
38 | deselectAllText: 'Avmarkera alla',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-sv_SE.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Inget valt",noneResultsText:"Inget sökresultat matchar {0}",countSelectedText:function(a,b){return 1===a?"{0} alternativ valt":"{0} alternativ valda"},maxOptionsText:function(a,b){return["Gräns uppnåd (max {n} alternativ)","Gräns uppnåd (max {n} gruppalternativ)"]},selectAllText:"Markera alla",deselectAllText:"Avmarkera alla",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-tr_TR.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Hiçbiri seçilmedi',
27 | noneResultsText: 'Hiçbir sonuç bulunamadı {0}',
28 | countSelectedText: function (numSelected, numTotal) {
29 | return (numSelected == 1) ? "{0} öğe seçildi" : "{0} öğe seçildi";
30 | },
31 | maxOptionsText: function (numAll, numGroup) {
32 | return [
33 | (numAll == 1) ? 'Limit aşıldı (maksimum {n} sayıda öğe )' : 'Limit aşıldı (maksimum {n} sayıda öğe)',
34 | (numGroup == 1) ? 'Grup limiti aşıldı (maksimum {n} sayıda öğe)' : 'Grup limiti aşıldı (maksimum {n} sayıda öğe)'
35 | ];
36 | },
37 | selectAllText: 'Tümünü Seç',
38 | deselectAllText: 'Seçiniz',
39 | multipleSeparator: ', '
40 | };
41 | })(jQuery);
42 |
43 |
44 | }));
45 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-tr_TR.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Hiçbiri seçilmedi",noneResultsText:"Hiçbir sonuç bulunamadı {0}",countSelectedText:function(a,b){return"{0} öğe seçildi"},maxOptionsText:function(a,b){return[1==a?"Limit aşıldı (maksimum {n} sayıda öğe )":"Limit aşıldı (maksimum {n} sayıda öğe)","Grup limiti aşıldı (maksimum {n} sayıda öğe)"]},selectAllText:"Tümünü Seç",deselectAllText:"Seçiniz",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ua_UA.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: 'Нічого не вибрано',
27 | noneResultsText: 'Збігів не знайдено {0}',
28 | countSelectedText: 'Вибрано {0} із {1}',
29 | maxOptionsText: ['Досягнута межа ({n} {var} максимум)', 'Досягнута межа в групі ({n} {var} максимум)', ['items', 'item']],
30 | multipleSeparator: ', '
31 | };
32 | })(jQuery);
33 |
34 |
35 | }));
36 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-ua_UA.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Нічого не вибрано",noneResultsText:"Збігів не знайдено {0}",countSelectedText:"Вибрано {0} із {1}",maxOptionsText:["Досягнута межа ({n} {var} максимум)","Досягнута межа в групі ({n} {var} максимум)",["items","item"]],multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-zh_CN.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: '没有选中任何项',
27 | noneResultsText: '没有找到匹配项',
28 | countSelectedText: '选中{1}中的{0}项',
29 | maxOptionsText: ['超出限制 (最多选择{n}项)', '组选择超出限制(最多选择{n}组)'],
30 | multipleSeparator: ', '
31 | };
32 | })(jQuery);
33 |
34 |
35 | }));
36 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-zh_CN.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"没有选中任何项",noneResultsText:"没有找到匹配项",countSelectedText:"选中{1}中的{0}项",maxOptionsText:["超出限制 (最多选择{n}项)","组选择超出限制(最多选择{n}组)"],multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-zh_TW.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 |
8 | (function (root, factory) {
9 | if (typeof define === 'function' && define.amd) {
10 | // AMD. Register as an anonymous module unless amdModuleId is set
11 | define(["jquery"], function (a0) {
12 | return (factory(a0));
13 | });
14 | } else if (typeof module === 'object' && module.exports) {
15 | // Node. Does not work with strict CommonJS, but
16 | // only CommonJS-like environments that support module.exports,
17 | // like Node.
18 | module.exports = factory(require("jquery"));
19 | } else {
20 | factory(root["jQuery"]);
21 | }
22 | }(this, function (jQuery) {
23 |
24 | (function ($) {
25 | $.fn.selectpicker.defaults = {
26 | noneSelectedText: '沒有選取任何項目',
27 | noneResultsText: '沒有找到符合的結果',
28 | countSelectedText: '已經選取{0}個項目',
29 | maxOptionsText: ['超過限制 (最多選擇{n}項)', '超過限制(最多選擇{n}組)'],
30 | selectAllText: '選取全部',
31 | deselectAllText: '全部取消',
32 | multipleSeparator: ', '
33 | };
34 | })(jQuery);
35 |
36 |
37 | }));
38 |
--------------------------------------------------------------------------------
/VManagePlatform/static/js/i18n/defaults-zh_TW.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)
3 | *
4 | * Copyright 2013-2017 bootstrap-select
5 | * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
6 | */
7 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"沒有選取任何項目",noneResultsText:"沒有找到符合的結果",countSelectedText:"已經選取{0}個項目",maxOptionsText:["超過限制 (最多選擇{n}項)","超過限制(最多選擇{n}組)"],selectAllText:"選取全部",deselectAllText:"全部取消",multipleSeparator:", "}}(a)});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/jquery.autosize.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | Autosize v1.17.7 - 2013-09-03
3 | Automatically adjust textarea height based on user input.
4 | (c) 2013 Jack Moore - http://www.jacklmoore.com/autosize
5 | license: http://www.opensource.org/licenses/mit-license.php
6 | */
7 | (function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(window.jQuery||window.$)})(function(e){var t,o={className:"autosizejs",append:"",callback:!1,resizeDelay:10},i='',n=["fontFamily","fontSize","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent"],s=e(i).data("autosize",!0)[0];s.style.lineHeight="99px","99px"===e(s).css("lineHeight")&&n.push("lineHeight"),s.style.lineHeight="",e.fn.autosize=function(i){return i=e.extend({},o,i||{}),s.parentNode!==document.body&&e(document.body).append(s),this.each(function(){function o(){var t,o;"getComputedStyle"in window?(t=window.getComputedStyle(h),o=h.getBoundingClientRect().width,e.each(["paddingLeft","paddingRight","borderLeftWidth","borderRightWidth"],function(e,i){o-=parseInt(t[i],10)}),s.style.width=o+"px"):s.style.width=Math.max(p.width(),0)+"px"}function a(){var a={};if(t=h,s.className=i.className,d=parseInt(p.css("maxHeight"),10),e.each(n,function(e,t){a[t]=p.css(t)}),e(s).css(a),o(),window.chrome){var r=h.style.width;h.style.width="0px",h.offsetWidth,h.style.width=r}}function r(){var e,n;t!==h?a():o(),s.value=h.value+i.append,s.style.overflowY=h.style.overflowY,n=parseInt(h.style.height,10),s.scrollTop=0,s.scrollTop=9e4,e=s.scrollTop,d&&e>d?(h.style.overflowY="scroll",e=d):(h.style.overflowY="hidden",c>e&&(e=c)),e+=f,n!==e&&(h.style.height=e+"px",w&&i.callback.call(h,h))}function l(){clearTimeout(u),u=setTimeout(function(){var e=p.width();e!==y&&(y=e,r())},parseInt(i.resizeDelay,10))}var d,c,u,h=this,p=e(h),f=0,w=e.isFunction(i.callback),z={height:h.style.height,overflow:h.style.overflow,overflowY:h.style.overflowY,wordWrap:h.style.wordWrap,resize:h.style.resize},y=p.width();p.data("autosize")||(p.data("autosize",!0),("border-box"===p.css("box-sizing")||"border-box"===p.css("-moz-box-sizing")||"border-box"===p.css("-webkit-box-sizing"))&&(f=p.outerHeight()-p.height()),c=Math.max(parseInt(p.css("minHeight"),10)-f||0,p.height()),p.css({overflow:"hidden",overflowY:"hidden",wordWrap:"break-word",resize:"none"===p.css("resize")||"vertical"===p.css("resize")?"none":"horizontal"}),"onpropertychange"in h?"oninput"in h?p.on("input.autosize keyup.autosize",r):p.on("propertychange.autosize",function(){"value"===event.propertyName&&r()}):p.on("input.autosize",r),i.resizeDelay!==!1&&e(window).on("resize.autosize",l),p.on("autosize.resize",r),p.on("autosize.resizeIncludeStyle",function(){t=null,r()}),p.on("autosize.destroy",function(){t=null,clearTimeout(u),e(window).off("resize",l),p.off("autosize").off(".autosize").css(z).removeData("autosize")}),r())})}});
--------------------------------------------------------------------------------
/VManagePlatform/static/js/jquery.easy-pie-chart.min.js:
--------------------------------------------------------------------------------
1 | (function(a){a.easyPieChart=function(d,l){var f,g,i,j,c,k,e,b,h=this;this.el=d;this.$el=a(d);this.$el.data("easyPieChart",this);this.init=function(){var n,m;h.options=a.extend({},a.easyPieChart.defaultOptions,l);n=parseInt(h.$el.data("percent"),10);h.percentage=0;h.canvas=a("").get(0);h.$el.append(h.canvas);if(typeof G_vmlCanvasManager!=="undefined"&&G_vmlCanvasManager!==null){G_vmlCanvasManager.initElement(h.canvas)}h.ctx=h.canvas.getContext("2d");if(window.devicePixelRatio>1){m=window.devicePixelRatio;a(h.canvas).css({width:h.options.size,height:h.options.size});h.canvas.width*=m;h.canvas.height*=m;h.ctx.scale(m,m)}h.ctx.translate(h.options.size/2,h.options.size/2);h.ctx.rotate(h.options.rotate*Math.PI/180);h.$el.addClass("easyPieChart");h.$el.css({width:h.options.size,height:h.options.size,lineHeight:""+h.options.size+"px"});h.update(n);return h};this.update=function(m){m=parseFloat(m)||0;if(h.options.animate===false){i(m)}else{if(h.options.delay){g(h.percentage,0);setTimeout(function(){return g(h.percentage,m)},h.options.delay)}else{g(h.percentage,m)}}return h};e=function(){var n,o,m;h.ctx.fillStyle=h.options.scaleColor;h.ctx.lineWidth=1;m=[];for(n=o=0;o<=24;n=++o){m.push(f(n))}return m};f=function(m){var n;n=m%6===0?0:h.options.size*0.017;h.ctx.save();h.ctx.rotate(m*Math.PI/12);h.ctx.fillRect(h.options.size/2-n,0,-h.options.size*0.05+n,1);h.ctx.restore()};b=function(){var m;m=h.options.size/2-h.options.lineWidth/2;if(h.options.scaleColor!==false){m-=h.options.size*0.08}h.ctx.beginPath();h.ctx.arc(0,0,m,0,Math.PI*2,true);h.ctx.closePath();h.ctx.strokeStyle=h.options.trackColor;h.ctx.lineWidth=h.options.lineWidth;h.ctx.stroke()};k=function(){if(h.options.scaleColor!==false){e()}if(h.options.trackColor!==false){b()}};i=function(m){var n;k();h.ctx.strokeStyle=a.isFunction(h.options.barColor)?h.options.barColor(m):h.options.barColor;h.ctx.lineCap=h.options.lineCap;h.ctx.lineWidth=h.options.lineWidth;n=h.options.size/2-h.options.lineWidth/2;if(h.options.scaleColor!==false){n-=h.options.size*0.08}h.ctx.save();h.ctx.rotate(-Math.PI/2);h.ctx.beginPath();h.ctx.arc(0,0,n,0,Math.PI*2*m/100,false);h.ctx.stroke();h.ctx.restore()};c=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(m){return window.setTimeout(m,1000/60)}})();g=function(p,o){var n,m;h.options.onStart.call(h);h.percentage=o;Date.now||(Date.now=function(){return +(new Date)});m=Date.now();n=function(){var q,r;r=Math.min(Date.now()-m,h.options.animate);h.ctx.clearRect(-h.options.size/2,-h.options.size/2,h.options.size,h.options.size);k.call(h);q=[j(r,p,o-p,h.options.animate)];h.options.onStep.call(h,q);i.call(h,q);if(r>=h.options.animate){return h.options.onStop.call(h,q,o)}else{return c(n)}};c(n)};j=function(o,n,r,p){var m,q;m=function(s){return Math.pow(s,2)};q=function(s){if(s<1){return m(s)}else{return 2-m((s/2)*-2+2)}};o/=p/2;return r/2*q(o)+n};return this.init()};a.easyPieChart.defaultOptions={barColor:"#ef1e25",trackColor:"#f2f2f2",scaleColor:"#dfe0e0",lineCap:"round",rotate:0,size:110,lineWidth:3,animate:false,delay:false,onStart:a.noop,onStop:a.noop,onStep:a.noop};a.fn.easyPieChart=function(b){return a.each(this,function(d,e){var c,f;c=a(e);if(!c.data("easyPieChart")){f=a.extend({},b,c.data());return c.data("easyPieChart",new a.easyPieChart(e,f))}})};return void 0})(jQuery);
--------------------------------------------------------------------------------
/VManagePlatform/static/js/jquery.hotkeys.min.js:
--------------------------------------------------------------------------------
1 | (function(b){b.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",10:"return",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",186:";",191:"/",220:"\\",222:"'",224:"meta"},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"}};function a(d){if(typeof d.data=="undefined"){return}if(typeof d.data==="string"){d.data={keys:d.data}}if(!d.data||!d.data.keys||typeof d.data.keys!=="string"){return}var c=d.handler,e=d.data.keys.toLowerCase().split(" "),f=["text","password","number","email","url","range","date","month","week","time","datetime","datetime-local","search","color","tel"];d.handler=function(k){if(this!==k.target&&(/textarea|select/i.test(k.target.nodeName)||b.inArray(k.target.type,f)>-1)){return}var h=b.hotkeys.specialKeys[k.keyCode],m=(k.type==="keydown"||k.type==="keypress")&&String.fromCharCode(k.which).toLowerCase();modif="",possible={};if(k.altKey&&h!=="alt"){modif+="alt+"}if(k.ctrlKey&&h!=="ctrl"){modif+="ctrl+"}if(k.metaKey&&!k.ctrlKey&&h!=="meta"){modif+="meta+"}if(k.shiftKey&&h!=="shift"){modif+="shift+"}if(h){possible[modif+h]=true}if(m){possible[modif+m]=true;possible[modif+b.hotkeys.shiftNums[m]]=true;if(modif==="shift+"){possible[b.hotkeys.shiftNums[m]]=true}}for(var j=0,g=e.length;j0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery);
--------------------------------------------------------------------------------
/VManagePlatform/static/js/jquery.ui.touch-punch.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | * jQuery UI Touch Punch 0.2.2
3 | *
4 | * Copyright 2011, Dave Furfero
5 | * Dual licensed under the MIT or GPL Version 2 licenses.
6 | *
7 | * Depends:
8 | * jquery.ui.widget.js
9 | * jquery.ui.mouse.js
10 | */
11 | (function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return;}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return;}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent("MouseEvents");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f);}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return;}a=true;f._touchMoved=false;d(g,"mouseover");d(g,"mousemove");d(g,"mousedown");};c._touchMove=function(f){if(!a){return;}this._touchMoved=true;d(f,"mousemove");};c._touchEnd=function(f){if(!a){return;}d(f,"mouseup");d(f,"mouseout");if(!this._touchMoved){d(f,"click");}a=false;};c._mouseInit=function(){var f=this;f.element.bind("touchstart",b.proxy(f,"_touchStart")).bind("touchmove",b.proxy(f,"_touchMove")).bind("touchend",b.proxy(f,"_touchEnd"));e.call(f);};})(jQuery);
--------------------------------------------------------------------------------
/VManagePlatform/static/js/respond.min.js:
--------------------------------------------------------------------------------
1 | /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
2 | /*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
3 | window.matchMedia=window.matchMedia||function(a){"use strict";var c,d=a.documentElement,e=d.firstElementChild||d.firstChild,f=a.createElement("body"),g=a.createElement("div");return g.id="mq-test-1",g.style.cssText="position:absolute;top:-100em",f.style.background="none",f.appendChild(g),function(a){return g.innerHTML='',d.insertBefore(f,e),c=42===g.offsetWidth,d.removeChild(f),{matches:c,media:a}}}(document);
4 |
5 | /*! Respond.js v1.3.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */
6 | (function(a){"use strict";function x(){u(!0)}var b={};if(a.respond=b,b.update=function(){},b.mediaQueriesSupported=a.matchMedia&&a.matchMedia("only all").matches,!b.mediaQueriesSupported){var q,r,t,c=a.document,d=c.documentElement,e=[],f=[],g=[],h={},i=30,j=c.getElementsByTagName("head")[0]||d,k=c.getElementsByTagName("base")[0],l=j.getElementsByTagName("link"),m=[],n=function(){for(var b=0;l.length>b;b++){var c=l[b],d=c.href,e=c.media,f=c.rel&&"stylesheet"===c.rel.toLowerCase();d&&f&&!h[d]&&(c.styleSheet&&c.styleSheet.rawCssText?(p(c.styleSheet.rawCssText,d,e),h[d]=!0):(!/^([a-zA-Z:]*\/\/)/.test(d)&&!k||d.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&m.push({href:d,media:e}))}o()},o=function(){if(m.length){var b=m.shift();v(b.href,function(c){p(c,b.href,b.media),h[b.href]=!0,a.setTimeout(function(){o()},0)})}},p=function(a,b,c){var d=a.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),g=d&&d.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+b+"$2$3")},i=!g&&c;b.length&&(b+="/"),i&&(g=1);for(var j=0;g>j;j++){var k,l,m,n;i?(k=c,f.push(h(a))):(k=d[j].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,f.push(RegExp.$2&&h(RegExp.$2))),m=k.split(","),n=m.length;for(var o=0;n>o;o++)l=m[o],e.push({media:l.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:f.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},s=function(){var a,b=c.createElement("div"),e=c.body,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",e||(e=f=c.createElement("body"),e.style.background="none"),e.appendChild(b),d.insertBefore(e,d.firstChild),a=b.offsetWidth,f?d.removeChild(e):e.removeChild(b),a=t=parseFloat(a)},u=function(b){var h="clientWidth",k=d[h],m="CSS1Compat"===c.compatMode&&k||c.body[h]||k,n={},o=l[l.length-1],p=(new Date).getTime();if(b&&q&&i>p-q)return a.clearTimeout(r),r=a.setTimeout(u,i),void 0;q=p;for(var v in e)if(e.hasOwnProperty(v)){var w=e[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?t||s():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?t||s():1)),w.hasquery&&(z&&A||!(z||m>=x)||!(A||y>=m))||(n[w.media]||(n[w.media]=[]),n[w.media].push(f[w.rules]))}for(var C in g)g.hasOwnProperty(C)&&g[C]&&g[C].parentNode===j&&j.removeChild(g[C]);for(var D in n)if(n.hasOwnProperty(D)){var E=c.createElement("style"),F=n[D].join("\n");E.type="text/css",E.media=D,j.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(c.createTextNode(F)),g.push(E)}},v=function(a,b){var c=w();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},w=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}();n(),b.update=n,a.addEventListener?a.addEventListener("resize",x,!1):a.attachEvent&&a.attachEvent("onresize",x)}})(this);
7 |
--------------------------------------------------------------------------------
/VManagePlatform/static/layer/mobile/layer.js:
--------------------------------------------------------------------------------
1 | /*! layer mobile-v2.0.0 Web弹层组件 MIT License http://layer.layui.com/mobile By 贤心 */
2 | ;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?''+(e?n.title[0]:n.title)+"
":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e=''+n.btn[0]+"",2===t&&(e=''+n.btn[1]+""+e),''+e+"
"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content=''+(n.content||"")+"
"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"':"")+'",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o
6 |
7 |
8 |
9 |
10 | 404
11 |
12 | 主机链接连接失败
13 |
14 |
15 |
16 |
尝试链接Libvirt远程服务器,连接失败...
17 |
18 |
19 |
27 |
28 |
29 |
尝试检查一下操作:
30 |
31 |
32 | -
33 |
34 | Libvirt已经启动
35 |
36 | -
37 |
38 | Libvirt远程配置正确
39 |
40 | -
41 |
42 | Libvirt已配置允许远程访问
43 |
44 |
45 | -
46 |
47 | Libvirt已经开放防火墙端口
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
66 |
67 |
68 |
69 | {% endblock %}
70 |
--------------------------------------------------------------------------------
/VManagePlatform/templates/noperm.html:
--------------------------------------------------------------------------------
1 | {% extends "index.html" %}
2 |
3 | {% block content %}
4 |
5 |
6 |
7 |
8 |
9 |
10 | 403
11 |
12 | 您无权操作此项
13 |
14 |
15 |
16 |
尝试操作失败...
17 |
18 |
19 |
27 |
28 |
29 |
尝试检查一下操作:
30 |
31 |
32 | -
33 |
34 | 您是否有权限操作此项
35 |
36 | -
37 |
38 | 您的权限是否过期
39 |
40 | -
41 |
42 | 您的账户是否过期
43 |
44 |
45 | -
46 |
47 | 联系管理员
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
66 |
67 |
68 |
69 | {% endblock %}
70 |
--------------------------------------------------------------------------------
/VManagePlatform/utils/LoggerUtils.py:
--------------------------------------------------------------------------------
1 | # -*- coding=utf-8 -*-
2 | import chardet,logging
3 | from logging.handlers import RotatingFileHandler
4 | import os,sys,time,json,imp
5 | from datetime import datetime,date,timedelta
6 | from email.mime.text import MIMEText
7 | from requests.auth import HTTPDigestAuth
8 |
9 |
10 | gProDir = os.path.dirname(os.path.abspath(sys.argv[ 0])) + '/'
11 | gProDir = gProDir.replace('\\','/')
12 | gLoggerName = 'VManagePlatform'
13 | gLoggerFilePath = gProDir + '/logs/'
14 | gLoggerFileName = 'VManagePlatform.log'
15 | if not os.path.isdir(gLoggerFilePath):
16 | os.makedirs(gLoggerFilePath)
17 | gLogger = logging.getLogger(gLoggerName)
18 | gLoggerFormatter = logging.Formatter("[%(asctime)s]: %(message)s","%Y-%m-%d %H:%M:%S")
19 | fileHandler = RotatingFileHandler(gLoggerFilePath + gLoggerFileName, mode='a' , maxBytes=10 *1024 *1024 , backupCount=4)
20 | fileHandler.setFormatter(gLoggerFormatter)
21 | fileHandler.setLevel(logging.INFO)
22 | streamHandler = logging.StreamHandler()
23 | streamHandler.setFormatter(gLoggerFormatter)
24 | streamHandler.setLevel(logging.DEBUG)
25 | gLogger.addHandler(fileHandler)
26 | gLogger.addHandler(streamHandler)
27 | gLogger.setLevel(logging.DEBUG)
28 |
29 | class BaseLogging(object):
30 | @staticmethod
31 | def Logger(msg,level=None):
32 | if level == 'error':return gLogger.error(msg)
33 | elif level == 'warn':return gLogger.warn(msg)
34 | elif level == 'info':return gLogger.info(msg)
35 | elif level == 'debug':return gLogger.debug(msg)
--------------------------------------------------------------------------------
/VManagePlatform/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/utils/__init__.py
--------------------------------------------------------------------------------
/VManagePlatform/utils/vConnUtils.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 | '''共用工具类方法'''
4 | from random import choice
5 | import string,hashlib,os
6 | from django.conf import settings
7 |
8 |
9 | class TokenUntils():
10 | @staticmethod
11 | def writeVncToken(filename,token):
12 | if os.path.exists(settings.VNC_TOKEN_PATH) is False:os.makedirs(settings.VNC_TOKEN_PATH)
13 | with open(settings.VNC_TOKEN_PATH +"/" + filename,r'wb') as f:
14 | f.write(token)
15 | f.write("\n")
16 | f.close()
17 | @staticmethod
18 | def makeToken(str):
19 | m = hashlib.md5()
20 | m.update(str)
21 | return m.hexdigest()
22 |
23 | class CommTools():
24 | @staticmethod
25 | def radString(length=8,chars=string.ascii_letters+string.digits):
26 | return ''.join([choice(chars) for i in range(length)])
27 |
28 | @staticmethod
29 | def argsCkeck(args,data):
30 | if isinstance(args, list) and isinstance(data, dict):
31 | count = 0
32 | for arg in args:
33 | if data.has_key(arg):
34 | count = count + 1
35 | if count == len(args):return True
36 | else:return False
--------------------------------------------------------------------------------
/VManagePlatform/utils/vDHCPConfigUtils.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/utils/vDHCPConfigUtils.py
--------------------------------------------------------------------------------
/VManagePlatform/utils/vMUtil.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 |
4 | import re
5 | import random
6 | import libxml2
7 | import libvirt
8 |
9 |
10 | def is_kvm_available(xml):
11 | capabilites = re.search('kvm', xml)
12 | if capabilites:
13 | return True
14 | else:
15 | return False
16 |
17 |
18 | def randomMAC():
19 | """Generate a random MAC address."""
20 | # qemu MAC
21 | oui = [0x52, 0x54, 0x00]
22 |
23 | mac = oui + [random.randint(0x00, 0xff),
24 | random.randint(0x00, 0xff),
25 | random.randint(0x00, 0xff)]
26 | return ':'.join(map(lambda x: "%02x" % x, mac))
27 |
28 |
29 | def randomUUID():
30 | """Generate a random UUID."""
31 |
32 | u = [random.randint(0, 255) for dummy in range(0, 16)]
33 | return "-".join(["%02x" * 4, "%02x" * 2, "%02x" * 2, "%02x" * 2, "%02x" * 6]) % tuple(u)
34 |
35 |
36 | def get_max_vcpus(conn, type=None):
37 | """@param conn: libvirt connection to poll for max possible vcpus
38 | @type type: optional guest type (kvm, etc.)"""
39 | if type is None:
40 | type = conn.getType()
41 | try:
42 | m = conn.getMaxVcpus(type.lower())
43 | except libvirt.libvirtError:
44 | m = 32
45 | return m
46 |
47 |
48 | def xml_escape(str):
49 | """Replaces chars ' " < > & with xml safe counterparts"""
50 | if str is None:
51 | return None
52 |
53 | str = str.replace("&", "&")
54 | str = str.replace("'", "'")
55 | str = str.replace("\"", """)
56 | str = str.replace("<", "<")
57 | str = str.replace(">", ">")
58 | return str
59 |
60 |
61 | def compareMAC(p, q):
62 | """Compare two MAC addresses"""
63 | pa = p.split(":")
64 | qa = q.split(":")
65 |
66 | if len(pa) != len(qa):
67 | if p > q:
68 | return 1
69 | else:
70 | return -1
71 |
72 | for i in xrange(len(pa)):
73 | n = int(pa[i], 0x10) - int(qa[i], 0x10)
74 | if n > 0:
75 | return 1
76 | elif n < 0:
77 | return -1
78 | return 0
79 |
80 |
81 | def get_xml_path(xml, path=None, func=None):
82 | """
83 | Return the content from the passed xml xpath, or return the result
84 | of a passed function (receives xpathContext as its only arg)
85 | """
86 | doc = None
87 | ctx = None
88 | result = None
89 |
90 | try:
91 | doc = libxml2.parseDoc(xml)
92 | ctx = doc.xpathNewContext()
93 |
94 | if path:
95 | ret = ctx.xpathEval(path)
96 | if ret is not None:
97 | if type(ret) == list:
98 | if len(ret) >= 1:
99 | result = ret[0].content
100 | else:
101 | result = ret
102 |
103 | elif func:
104 | result = func(ctx)
105 |
106 | else:
107 | raise ValueError("'path' or 'func' is required.")
108 | finally:
109 | if doc:
110 | doc.freeDoc()
111 | if ctx:
112 | ctx.xpathFreeContext()
113 | return result
114 |
115 |
116 | def pretty_mem(val):
117 | val = int(val)
118 | if val > (10 * 1024 * 1024):
119 | return "%2.2f GB" % (val / (1024.0 * 1024.0))
120 | else:
121 | return "%2.0f MB" % (val / 1024.0)
122 |
123 |
124 | def pretty_bytes(val):
125 | val = int(val)
126 | if val > (1024 * 1024 * 1024):
127 | return "%2.2f GB" % (val / (1024.0 * 1024.0 * 1024.0))
128 | else:
129 | return "%2.2f MB" % (val / (1024.0 * 1024.0))
--------------------------------------------------------------------------------
/VManagePlatform/views/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/VManagePlatform/views/__init__.py
--------------------------------------------------------------------------------
/VManagePlatform/views/vComs.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 |
4 | from django.conf import settings
5 | from django.http import HttpResponseRedirect
6 | from django.shortcuts import render_to_response,render
7 | from django.contrib import auth
8 | from django.template import RequestContext
9 | from django.contrib.auth.decorators import login_required
10 | from VManagePlatform.models import VmServer,VmServerInstance
11 | from VManagePlatform.utils.vConnUtils import TokenUntils
12 | from VManagePlatform.models import VmLogs
13 |
14 |
15 | @login_required(login_url='/login')
16 | def index(request):
17 | vmRun = 0
18 | vmStop = 0
19 | serRun = 0
20 | serStop = 0
21 | try:
22 | logList = VmLogs.objects.all().order_by("-id")[0:20]
23 | vmList = VmServer.objects.all().order_by("-id")
24 | serList = VmServerInstance.objects.all().order_by("-id")
25 | for vm in vmList:
26 | if vm.status == 1:vmRun = vmRun + 1
27 | else:vmStop = vmStop + 1
28 | for ser in serList:
29 | if ser.status == 0:serRun = serRun + 1
30 | else:serStop = serStop + 1
31 | except:
32 | logList = None
33 | vmList = []
34 | serList = []
35 | totalInfo = {"vmRun":vmRun,"vmStop":vmStop,"serTotal":len(serList),
36 | "serStop":serStop,"vmTotal":len(vmList),"serRun":serRun}
37 | return render_to_response('index.html',{"user":request.user,"localtion":[{"name":"首页","url":'/'}],
38 | "logList":logList,"totalInfo":totalInfo,"msgTotal":serStop+vmStop},
39 | context_instance=RequestContext(request))
40 |
41 | def login(request):
42 | if request.session.get('username') is not None:
43 | return HttpResponseRedirect('/profile',{"user":request.user})
44 | else:
45 | username = request.POST.get('username')
46 | password = request.POST.get('password')
47 | user = auth.authenticate(username=username,password=password)
48 | if user and user.is_active:
49 | auth.login(request,user)
50 | request.session['username'] = username
51 | return HttpResponseRedirect('/profile',{"user":request.user})
52 | else:
53 | if request.method == "POST":
54 | return render_to_response('login.html',{"login_error_info":"用户名不错存在,或者密码错误!"},
55 | context_instance=RequestContext(request))
56 | else:
57 | return render_to_response('login.html',context_instance=RequestContext(request))
58 |
59 |
60 |
61 | @login_required
62 | def permission(request,args=None):
63 | return render_to_response('noperm.html',{"user":request.user},
64 | context_instance=RequestContext(request))
65 |
66 |
67 | @login_required
68 | def run_vnc(request,id,vnc,uuid):
69 | '''
70 | Call the VNC proxy for remote control
71 | '''
72 | vServer = VmServer.objects.get(id=id)
73 | tokenStr = uuid + ': ' + vServer.server_ip + ':' + str(vnc)
74 | TokenUntils.writeVncToken(filename=uuid,token=tokenStr)
75 | return render(request, 'vnc/vnc_auto.html',{"vnc_port":settings.VNC_PROXY_PORT,
76 | "vnc_token":uuid,
77 | })
78 |
79 |
80 | def logout(request):
81 | auth.logout(request)
82 | return HttpResponseRedirect('/login')
--------------------------------------------------------------------------------
/VManagePlatform/views/vProfile.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 | from django.http import JsonResponse
4 | from django.shortcuts import render_to_response
5 | from django.template import RequestContext
6 | from django.contrib.auth.decorators import login_required
7 | from VManagePlatform.models import VmLogs,VmServerInstance,VmServer
8 | from django.contrib.auth.models import User
9 |
10 | @login_required
11 | def profile(request):
12 | if request.method == "GET":
13 | try:
14 | if request.user.is_superuser:
15 | vmList = VmServerInstance.objects.select_related().all().order_by("-id")
16 | else:
17 | vmList = VmServerInstance.objects.select_related().filter(owner=request.user).all().order_by("-id")[0:200]
18 | logList = VmLogs.objects.filter(user=request.user).all().order_by("-id")[0:10]
19 | except:
20 | logList = None
21 | vmList = None
22 | return render_to_response('profile.html',
23 | {"user":request.user,"localtion":[{"name":"首页","url":'/'},{"name":"用户配置","url":'/profile'}],
24 | "logList":logList,"vmList":vmList
25 | },context_instance=RequestContext(request))
26 | elif request.method == "POST":
27 | op = request.POST.get('op')
28 | if op in ['assign','password','viewlog']:
29 | if op == 'assign':
30 | try:
31 | server = VmServer.objects.get(id=int(request.POST.get('server')))
32 | instance = VmServerInstance.objects.get(server_id=server,name=request.POST.get('name'))
33 | instance.owner = request.POST.get('username')
34 | instance.save()
35 | return JsonResponse({"code":200,"data":None,"msg":"虚拟机分配成功。"})
36 | except Exception,e:
37 | return JsonResponse({"code":500,"data":e,"msg":"虚拟机分配失败。"})
38 | elif op == 'password':
39 | if request.POST.get('n_pwd') == request.POST.get('c_pwd'):
40 | try:
41 | user = User.objects.get(username=request.POST.get('username'))
42 | user.set_password(request.POST.get('c_pwd'))
43 | user.save()
44 | return JsonResponse({'msg':"密码修改成功。","code":200,'data':None})
45 | except Exception,e:
46 | return JsonResponse({'msg':'failed',"code":500,'data':"系统忙请稍后在尝试。"})
47 | else:
48 | return JsonResponse({'msg':'新密码不一致,修改密码失败。',"code":500,'data':None})
49 | elif op == 'viewlog':
50 | try:
51 | count = int(request.POST.get('count')) - 10
52 | logList = VmLogs.objects.filter(user=request.user).all().order_by("-id")[count:int(request.POST.get('count'))]
53 | dataList = []
54 | for ds in logList:
55 | data = dict()
56 | data['id'] = ds.id
57 | data['content'] = ds.content
58 | data['user'] = ds.user
59 | data['vm_name'] = ds.vm_name
60 | data['status'] = ds.status
61 | data['create_time'] = ds.create_time
62 | data['result'] = ds.result
63 | dataList.append(data)
64 | if len(dataList) > 0:return JsonResponse({'msg':"数据加载成功。","code":200,'data':dataList})
65 | else:return JsonResponse({'msg':'没有更多的消息',"code":500,'data':None})
66 | except Exception,e:
67 | return JsonResponse({'msg':str(e),"code":500,'data':None})
68 | else:return JsonResponse({"code":500,"data":None,"msg":"不支持的操作。"})
--------------------------------------------------------------------------------
/VManagePlatform/views/vSnapshot.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # _#_ coding:utf-8 _*_
3 | from django.http import JsonResponse
4 | from django.contrib.auth.decorators import login_required
5 | from VManagePlatform.utils.vMConUtils import LibvirtManage
6 | from VManagePlatform.models import VmServer
7 | from VManagePlatform.tasks import revertSnapShot
8 | from VManagePlatform.tasks import snapInstace
9 | from VManagePlatform.tasks import recordLogs
10 |
11 | @login_required
12 | def handleSnapshot(request,id):
13 | try:
14 | vServer = VmServer.objects.get(id=id)
15 | except Exception,e:
16 | return JsonResponse({"code":500,"msg":"找不到主机资源","data":e})
17 | if request.method == "POST":
18 | op = request.POST.get('op')
19 | insName = request.POST.get('vm_name')
20 | snapName = request.POST.get('snap_name')
21 | if op in ['view','resume','delete','add'] and request.user.has_perm('VManagePlatform.change_vmserverinstance'):
22 | try:
23 | VMS = LibvirtManage(vServer.server_ip,vServer.username, vServer.passwd, vServer.vm_type)
24 | except Exception,e:
25 | return JsonResponse({"code":500,"msg":"服务器连接失败。。","data":e})
26 | try:
27 | INSTANCE = VMS.genre(model='instance')
28 | instance = INSTANCE.queryInstance(name=str(insName))
29 | if op == 'view':
30 | snap = INSTANCE.snapShotView(instance, snapName)
31 | VMS.close()
32 | if snap:return JsonResponse({"code":200,"data":snap.replace('<','<').replace('>','>'),"msg":"查询成功."})
33 | else:return JsonResponse({"code":500,"data":"查无结果","msg":"查无结果"})
34 | elif op == 'resume':
35 | revertSnapShot.delay(request.POST,str(request.user))
36 | VMS.close()
37 | return JsonResponse({"code":200,"data":None,"msg":"快照恢复任务提交成功。"})
38 | elif op == 'add':
39 | snapInstace.delay(request.POST,str(request.user))
40 | VMS.close()
41 | return JsonResponse({"code":200,"data":None,"msg":"快照任务提交成功."})
42 | elif op == 'delete':
43 | snap = INSTANCE.snapShotDelete(instance, snapName)
44 | VMS.close()
45 | if isinstance(snap, int):
46 | recordLogs.delay(server_id=vServer.id,vm_name=request.POST.get('vm_name'),
47 | content="删除虚拟机{name}快照{snapName}".format(name=request.POST.get('vm_name'),
48 | snapName=snapName),
49 | user=str(request.user),status=0)
50 | return JsonResponse({"code":200,"data":None,"msg":"快照删除成功"})
51 | else:
52 | recordLogs.delay(server_id=vServer.id,vm_name=request.POST.get('vm_name'),
53 | content="删除虚拟机{name}快照{snapName}".format(name=request.POST.get('vm_name'),
54 | snapName=snapName),
55 | user=str(request.user),status=0,result=snap)
56 | return JsonResponse({"code":500,"data":None,"msg":"快照删除失败"})
57 | except Exception,e:
58 | return JsonResponse({"code":500,"msg":"虚拟机快照操作失败。。","data":e})
59 | else:
60 | return JsonResponse({"code":500,"msg":"不受支持的操作。","data":e})
--------------------------------------------------------------------------------
/VManagePlatform/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for VManagePlatform project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 | from django.conf import settings
12 | from multiprocessing import Process
13 |
14 | from django.core.wsgi import get_wsgi_application
15 |
16 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "VManagePlatform.settings")
17 |
18 | application = get_wsgi_application()
19 |
20 |
21 | def worker():
22 | '''
23 | Multi process service VNC start
24 | '''
25 | websockify_path = os.path.join(os.getcwd(), 'vnc', 'utils', 'websockify')
26 | web_path = os.path.join(os.getcwd(), 'vnc', 'utils')
27 | cmd = u'python %s --web=%s --target-config=%s %s' %(websockify_path, web_path, settings.VNC_TOKEN_PATH, settings.VNC_PROXY_PORT)
28 | os.system(cmd)
29 |
30 | def start_websockify():
31 | '''
32 | Start the VNC agent service
33 | ./vnc/utils/websockify --web=. --target-config=vnc_tokens 6080
34 | {'target_cfg': '/home/xiaofei/work/noVNC/vnc_tokens', 'listen_port': 6080}
35 | '''
36 |
37 | print u'start vnc proxy..'
38 |
39 | t = Process(target=worker, args=())
40 | t.start()
41 |
42 | print u'vnc proxy started..'
43 |
44 | start_websockify()
--------------------------------------------------------------------------------
/demo_images/consle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/consle.png
--------------------------------------------------------------------------------
/demo_images/index.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/index.png
--------------------------------------------------------------------------------
/demo_images/instance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/instance.png
--------------------------------------------------------------------------------
/demo_images/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/login.png
--------------------------------------------------------------------------------
/demo_images/profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/profile.png
--------------------------------------------------------------------------------
/demo_images/register.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/register.png
--------------------------------------------------------------------------------
/demo_images/server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/server.png
--------------------------------------------------------------------------------
/demo_images/task.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/task.png
--------------------------------------------------------------------------------
/demo_images/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/welliamcao/VManagePlatform/24c0abed03d420348f9cb048a36211380fbfdf8f/demo_images/user.png
--------------------------------------------------------------------------------
/docker/Dockerfile-app:
--------------------------------------------------------------------------------
1 | #docker build -t vmp-app -f Dockerfile-app ..
2 |
3 | FROM vmp-base
4 |
5 | COPY . .
6 |
7 | CMD [ "python", "./manage.py", "runserver", "0.0.0.0:8000" ]
8 |
--------------------------------------------------------------------------------
/docker/Dockerfile-base:
--------------------------------------------------------------------------------
1 | #docker build -t vmp-base -f Dockerfile-base ..
2 |
3 | FROM python:2.7-slim
4 |
5 | WORKDIR /usr/src/app
6 |
7 | #VOLUME ["/data/apps/opsmanage/upload"]
8 |
9 | RUN sed -i 's/http\:\/\/deb.debian.org/https\:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list \
10 | && sed -i 's/http\:\/\/security.debian.org/https\:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list \
11 | && apt update \
12 | && apt install -y default-libmysqlclient-dev gcc python-dev pkg-config libvirt0 libvirt-clients libvirt-dev \
13 | && apt install -y libxml2 python-libxml2 \
14 | && apt install -y ssh \
15 | && mv /usr/lib/python2.7/dist-packages/libxml2mod.x86_64-linux-gnu.so /usr/lib/python2.7/dist-packages/libxml2mod.so \
16 | && mv /usr/lib/python2.7/dist-packages/* /usr/local/lib/python2.7/site-packages/
17 |
18 |
19 |
20 | RUN sed -i 's/.*StrictHostKeyChecking.*/StrictHostKeyChecking no/g' /etc/ssh/ssh_config
21 |
22 |
23 |
24 | # apt install -y python-mysqldb
25 |
26 | #libmariadb-dev-compat libmariadb-dev
27 |
28 | #apt-get install python-pip python-dev
29 |
30 | #mysql-common
31 |
32 | #pip install MySQL-python
33 |
34 | #apt install python-mysqldb
35 | #apt install python-pymysql
36 |
37 | apt install -y python-pymysql
38 |
39 | # python-dev libldap2-dev libsasl2-dev git sshpass mariadb-client supervisor rsync\
40 | # && apt install -y mariadb-client libmariadb-dev libmariadbclient-dev
41 | # libmariadb3/stable
42 | && rm -rf /var/lib/apt/lists/*
43 |
44 | ADD ./requirements.txt /tmp/requirements.txt
45 | RUN pip install --no-cache-dir -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r /tmp/requirements.txt && rm -rf /tmp/requirements.txt
46 |
47 |
--------------------------------------------------------------------------------
/docker/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | 1. 构建基础镜像(修改requirements.txt后需要重新构建)
4 | 根目录下执行:
5 | docker build -t vmp-base -f docker/Dockerfile-base .
6 | 或者使用脚本:docker/build-base.sh
7 |
8 | 2. 修改Django配置文件OpsManage/setting.py
9 |
10 | - 需要使用Django来访问静态文件时需要修改DEBUG = True(Django仅在调试模式下能对外提供静态文件访问)
11 | - 修改DATABASES,数据库改成使用sqlite3
12 |
13 | 4. 构建应用镜像
14 |
15 | 根目录下执行:
16 | docker build -t vmp-app -f docker/Dockerfile-app .
17 |
18 | 或者使用脚本:docker/build-app.sh
19 |
20 | 5. 构建静态文件镜像(可选)
21 |
22 | 根目录下执行:
23 | docker build -t vmp-static -f docker/Dockerfile-static .
24 |
25 | 6. 启动容器
26 | #mkdir -p /data/docker-vol/opsmanage #数据卷文件夹
27 | #chmod a+rw /data/docker-vol/opsmanage
28 | #touch /data/docker-vol/opsmanage/id_rsa #这个文件根据需要写入用户SSH密钥
29 |
30 | docker run -d --name vmp -p 8000:8000 vmp-app
31 | #-v /data/docker-vol/opsmanage/id_rsa:/root/.ssh/id_rsa \
32 | #-v /data/docker-vol/opsmanage/upload:/data/apps/opsmanage/upload \
33 | #172.31.0.6:5000/vmp-app
34 |
35 | 7. 初始化数据库
36 | $ docker run -it --rm vmp-app bash
37 | python manage.py migrate
38 | python manage.py createsuperuser
39 | (按Ctrl+P Ctrl+Q退出)
40 |
41 | 8. 访问页面
42 | http://:8000
43 |
44 |
45 |
--------------------------------------------------------------------------------
/docker/build-app.sh:
--------------------------------------------------------------------------------
1 |
2 | SHPATH=$(cd `dirname $0`; pwd)
3 | BASEPATH=`dirname "$SHPATH"`
4 | if [ ! -f "${BASEPATH}/requirements.txt" ]; then
5 | echo "requirements.txt not found"
6 | exit 1
7 | fi
8 |
9 | docker build -t vmp-app -f ${BASEPATH}/docker/Dockerfile-app ${BASEPATH}
10 |
--------------------------------------------------------------------------------
/docker/build-base.sh:
--------------------------------------------------------------------------------
1 |
2 | SHPATH=$(cd `dirname $0`; pwd)
3 | BASEPATH=${SHPATH}/..
4 | if [ ! -f "${BASEPATH}/requirements.txt" ]; then
5 | echo "requirements.txt not found"
6 | exit 1
7 | fi
8 |
9 | docker build -t vmp-base -f ${BASEPATH}/docker/Dockerfile ${BASEPATH}
10 |
--------------------------------------------------------------------------------
/docker/start-app.sh:
--------------------------------------------------------------------------------
1 |
2 |
3 | python manage.py migrate
4 | python manage.py createsuperuser
5 |
6 |
7 | python manage.py runserver 0.0.0.0:8000
8 |
9 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | import os
3 | import sys
4 |
5 | if __name__ == "__main__":
6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "VManagePlatform.settings")
7 | reload(sys)
8 | sys.setdefaultencoding('utf-8')
9 | from django.core.management import execute_from_command_line
10 |
11 | execute_from_command_line(sys.argv)
12 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | django==1.8.17
2 | celery==3.1.23
3 | django-celery==3.1.17
4 | redis==2.10.6
5 | celery-with-redis==3.0
6 | djangorestframework==3.5.3
7 | paramiko==2.1.1
8 | libvirt-python==5.7.0
9 | #supervisor
10 | #MySQL-python
11 | mysqlclient==1.4.6
12 | DBUtils==1.3
13 |
--------------------------------------------------------------------------------
/vnc/utils/Makefile:
--------------------------------------------------------------------------------
1 | TARGETS=rebind.so
2 | CFLAGS += -fPIC
3 |
4 | all: $(TARGETS)
5 |
6 | rebind.so: rebind.o
7 | $(CC) $(LDFLAGS) $^ -shared -fPIC -ldl -o $@
8 |
9 | clean:
10 | rm -f rebind.o rebind.so
11 |
12 |
--------------------------------------------------------------------------------
/vnc/utils/README.md:
--------------------------------------------------------------------------------
1 | ## WebSockets Proxy/Bridge
2 |
3 | For more detailed description and usage information please refer to
4 | the [websockify README](https://github.com/kanaka/websockify/blob/master/README.md).
5 |
6 | The other versions of websockify (C, Node.js) and the associated test
7 | programs have been moved to
8 | [websockify](https://github.com/kanaka/websockify). Websockify was
9 | formerly named wsproxy.
10 |
11 |
--------------------------------------------------------------------------------
/vnc/utils/img2js.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | #
4 | # Convert image to Javascript compatible base64 Data URI
5 | # Copyright 2011 Joel Martin
6 | # Licensed under MPL 2.0 (see docs/LICENSE.MPL-2.0)
7 | #
8 |
9 | import sys, base64
10 |
11 | try:
12 | from PIL import Image
13 | except:
14 | print "python PIL module required (python-imaging package)"
15 | sys.exit(1)
16 |
17 |
18 | if len(sys.argv) < 3:
19 | print "Usage: %s IMAGE JS_VARIABLE" % sys.argv[0]
20 | sys.exit(1)
21 |
22 | fname = sys.argv[1]
23 | var = sys.argv[2]
24 |
25 | ext = fname.lower().split('.')[-1]
26 | if ext == "png": mime = "image/png"
27 | elif ext in ["jpg", "jpeg"]: mime = "image/jpeg"
28 | elif ext == "gif": mime = "image/gif"
29 | else:
30 | print "Only PNG, JPEG and GIF images are supported"
31 | sys.exit(1)
32 | uri = "data:%s;base64," % mime
33 |
34 | im = Image.open(fname)
35 | w, h = im.size
36 |
37 | raw = open(fname).read()
38 |
39 | print '%s = {"width": %s, "height": %s, "data": "%s%s"};' % (
40 | var, w, h, uri, base64.b64encode(raw))
41 |
--------------------------------------------------------------------------------
/vnc/utils/launch.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | usage() {
4 | if [ "$*" ]; then
5 | echo "$*"
6 | echo
7 | fi
8 | echo "Usage: ${NAME} [--listen PORT] [--vnc VNC_HOST:PORT] [--cert CERT]"
9 | echo
10 | echo "Starts the WebSockets proxy and a mini-webserver and "
11 | echo "provides a cut-and-paste URL to go to."
12 | echo
13 | echo " --listen PORT Port for proxy/webserver to listen on"
14 | echo " Default: 6080"
15 | echo " --vnc VNC_HOST:PORT VNC server host:port proxy target"
16 | echo " Default: localhost:5900"
17 | echo " --cert CERT Path to combined cert/key file"
18 | echo " Default: self.pem"
19 | echo " --web WEB Path to web files (e.g. vnc.html)"
20 | echo " Default: ./"
21 | exit 2
22 | }
23 |
24 | NAME="$(basename $0)"
25 | HERE="$(cd "$(dirname "$0")" && pwd)"
26 | PORT="6080"
27 | VNC_DEST="localhost:5900"
28 | CERT=""
29 | WEB=""
30 | proxy_pid=""
31 |
32 | die() {
33 | echo "$*"
34 | exit 1
35 | }
36 |
37 | cleanup() {
38 | trap - TERM QUIT INT EXIT
39 | trap "true" CHLD # Ignore cleanup messages
40 | echo
41 | if [ -n "${proxy_pid}" ]; then
42 | echo "Terminating WebSockets proxy (${proxy_pid})"
43 | kill ${proxy_pid}
44 | fi
45 | }
46 |
47 | # Process Arguments
48 |
49 | # Arguments that only apply to chrooter itself
50 | while [ "$*" ]; do
51 | param=$1; shift; OPTARG=$1
52 | case $param in
53 | --listen) PORT="${OPTARG}"; shift ;;
54 | --vnc) VNC_DEST="${OPTARG}"; shift ;;
55 | --cert) CERT="${OPTARG}"; shift ;;
56 | --web) WEB="${OPTARG}"; shift ;;
57 | -h|--help) usage ;;
58 | -*) usage "Unknown chrooter option: ${param}" ;;
59 | *) break ;;
60 | esac
61 | done
62 |
63 | # Sanity checks
64 | which netstat >/dev/null 2>&1 \
65 | || die "Must have netstat installed"
66 |
67 | netstat -ltn | grep -qs "${PORT} .*LISTEN" \
68 | && die "Port ${PORT} in use. Try --listen PORT"
69 |
70 | trap "cleanup" TERM QUIT INT EXIT
71 |
72 | # Find vnc.html
73 | if [ -n "${WEB}" ]; then
74 | if [ ! -e "${WEB}/vnc.html" ]; then
75 | die "Could not find ${WEB}/vnc.html"
76 | fi
77 | elif [ -e "$(pwd)/vnc.html" ]; then
78 | WEB=$(pwd)
79 | elif [ -e "${HERE}/../vnc.html" ]; then
80 | WEB=${HERE}/../
81 | elif [ -e "${HERE}/vnc.html" ]; then
82 | WEB=${HERE}
83 | elif [ -e "${HERE}/../share/novnc/vnc.html" ]; then
84 | WEB=${HERE}/../share/novnc/
85 | else
86 | die "Could not find vnc.html"
87 | fi
88 |
89 | # Find self.pem
90 | if [ -n "${CERT}" ]; then
91 | if [ ! -e "${CERT}" ]; then
92 | die "Could not find ${CERT}"
93 | fi
94 | elif [ -e "$(pwd)/self.pem" ]; then
95 | CERT="$(pwd)/self.pem"
96 | elif [ -e "${HERE}/../self.pem" ]; then
97 | CERT="${HERE}/../self.pem"
98 | elif [ -e "${HERE}/self.pem" ]; then
99 | CERT="${HERE}/self.pem"
100 | else
101 | echo "Warning: could not find self.pem"
102 | fi
103 |
104 | echo "Starting webserver and WebSockets proxy on port ${PORT}"
105 | ${HERE}/websockify --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} &
106 | proxy_pid="$!"
107 | sleep 1
108 | if ! ps -p ${proxy_pid} >/dev/null; then
109 | proxy_pid=
110 | echo "Failed to start WebSockets proxy"
111 | exit 1
112 | fi
113 |
114 | echo -e "\n\nNavigate to this URL:\n"
115 | echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n"
116 | echo -e "Press Ctrl-C to exit\n\n"
117 |
118 | wait ${proxy_pid}
119 |
--------------------------------------------------------------------------------
/vnc/utils/parse.js:
--------------------------------------------------------------------------------
1 | // Utility to parse keysymdef.h to produce mappings from Unicode codepoints to keysyms
2 | "use strict";
3 |
4 | var fs = require('fs');
5 |
6 | var show_help = process.argv.length === 2;
7 | var use_keynames = false;
8 | var filename;
9 |
10 | for (var i = 2; i < process.argv.length; ++i) {
11 | switch (process.argv[i]) {
12 | case "--help":
13 | case "-h":
14 | show_help = true;
15 | break;
16 | case "--debug-names":
17 | case "-d":
18 | use_keynames = true;
19 | break;
20 | case "--file":
21 | case "-f":
22 | default:
23 | filename = process.argv[i];
24 | }
25 | }
26 |
27 | if (!filename) {
28 | show_help = true;
29 | console.log("Error: No filename specified\n");
30 | }
31 |
32 | if (show_help) {
33 | console.log("Parses a *nix keysymdef.h to generate Unicode code point mappings");
34 | console.log("Usage: node parse.js [options] filename:");
35 | console.log(" -h [ --help ] Produce this help message");
36 | console.log(" -d [ --debug-names ] Preserve keysym names for debugging (Increases file size by ~40KB)");
37 | console.log(" filename The keysymdef.h file to parse");
38 | return;
39 | }
40 |
41 | // Set this to false to omit key names from the generated keysymdef.js
42 | // This reduces the file size by around 40kb, but may hinder debugging
43 |
44 | var buf = fs.readFileSync(filename);
45 | var str = buf.toString('utf8');
46 |
47 | var re = /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-fA-F]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/m;
48 |
49 | var arr = str.split('\n');
50 |
51 | var keysyms = {};
52 | var codepoints = {};
53 |
54 | for (var i = 0; i < arr.length; ++i) {
55 | var result = re.exec(arr[i]);
56 | if (result){
57 | var keyname = result[1];
58 | var keysym = parseInt(result[2], 16);
59 | var remainder = result[3];
60 |
61 | keysyms[keysym] = keyname;
62 |
63 | var unicodeRes = /U\+([0-9a-fA-F]+)/.exec(remainder);
64 | if (unicodeRes) {
65 | var unicode = parseInt(unicodeRes[1], 16);
66 | if (!codepoints[unicode]){
67 | codepoints[unicode] = keysym;
68 | }
69 | }
70 | else {
71 | console.log("no unicode codepoint found:", arr[i]);
72 | }
73 | }
74 | else {
75 | console.log("line is not a keysym:", arr[i]);
76 | }
77 | }
78 |
79 | var out = "// This file describes mappings from Unicode codepoints to the keysym values\n" +
80 | "// (and optionally, key names) expected by the RFB protocol\n" +
81 | "// How this file was generated:\n" +
82 | "// " + process.argv.join(" ") + "\n" +
83 | "var keysyms = (function(){\n" +
84 | " \"use strict\";\n" +
85 | " var keynames = {keysyms};\n" +
86 | " var codepoints = {codepoints};\n" +
87 | "\n" +
88 | " function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; }\n" +
89 | " return {\n" +
90 | " fromUnicode : function(u) { return lookup(codepoints[u]); },\n" +
91 | " lookup : lookup\n" +
92 | " };\n" +
93 | "})();\n";
94 | out = out.replace('{keysyms}', use_keynames ? JSON.stringify(keysyms) : "null");
95 | out = out.replace('{codepoints}', JSON.stringify(codepoints));
96 |
97 | fs.writeFileSync("keysymdef.js", out);
98 |
--------------------------------------------------------------------------------
/vnc/utils/rebind:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | usage() {
4 | echo "Usage: $(basename $0) OLD_PORT NEW_PORT COMMAND_LINE"
5 | echo
6 | echo "Launch COMMAND_LINE, but intercept system calls to bind"
7 | echo "to OLD_PORT and instead bind them to localhost:NEW_PORT"
8 | exit 2
9 | }
10 |
11 | # Parameter defaults
12 | mydir=$(readlink -f $(dirname ${0}))
13 |
14 | export REBIND_PORT_OLD="${1}"; shift
15 | export REBIND_PORT_NEW="${1}"; shift
16 |
17 | LD_PRELOAD=${mydir}/rebind.so "${@}"
18 |
19 |
--------------------------------------------------------------------------------
/vnc/utils/rebind.c:
--------------------------------------------------------------------------------
1 | /*
2 | * rebind: Intercept bind calls and bind to a different port
3 | * Copyright 2010 Joel Martin
4 | * Licensed under MPL-2.0 (see docs/LICENSE.MPL-2.0)
5 | *
6 | * Overload (LD_PRELOAD) bind system call. If REBIND_PORT_OLD and
7 | * REBIND_PORT_NEW environment variables are set then bind on the new
8 | * port (of localhost) instead of the old port.
9 | *
10 | * This allows a bridge/proxy (such as websockify) to run on the old port and
11 | * translate traffic to/from the new port.
12 | *
13 | * Usage:
14 | * LD_PRELOAD=./rebind.so \
15 | * REBIND_PORT_OLD=23 \
16 | * REBIND_PORT_NEW=2023 \
17 | * program
18 | */
19 |
20 | //#define DO_DEBUG 1
21 |
22 | #include
23 | #include
24 |
25 | #define __USE_GNU 1 // Pull in RTLD_NEXT
26 | #include
27 |
28 | #include
29 | #include
30 |
31 |
32 | #if defined(DO_DEBUG)
33 | #define DEBUG(...) \
34 | fprintf(stderr, "wswrapper: "); \
35 | fprintf(stderr, __VA_ARGS__);
36 | #else
37 | #define DEBUG(...)
38 | #endif
39 |
40 |
41 | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
42 | {
43 | static void * (*func)();
44 | int do_move = 0;
45 | struct sockaddr_in * addr_in = (struct sockaddr_in *)addr;
46 | struct sockaddr_in addr_tmp;
47 | socklen_t addrlen_tmp;
48 | char * PORT_OLD, * PORT_NEW, * end1, * end2;
49 | int ret, oldport, newport, askport = htons(addr_in->sin_port);
50 | uint32_t askaddr = htons(addr_in->sin_addr.s_addr);
51 | if (!func) func = (void *(*)()) dlsym(RTLD_NEXT, "bind");
52 |
53 | DEBUG(">> bind(%d, _, %d), askaddr %d, askport %d\n",
54 | sockfd, addrlen, askaddr, askport);
55 |
56 | /* Determine if we should move this socket */
57 | if (addr_in->sin_family == AF_INET) {
58 | // TODO: support IPv6
59 | PORT_OLD = getenv("REBIND_OLD_PORT");
60 | PORT_NEW = getenv("REBIND_NEW_PORT");
61 | if (PORT_OLD && (*PORT_OLD != '\0') &&
62 | PORT_NEW && (*PORT_NEW != '\0')) {
63 | oldport = strtol(PORT_OLD, &end1, 10);
64 | newport = strtol(PORT_NEW, &end2, 10);
65 | if (oldport && (*end1 == '\0') &&
66 | newport && (*end2 == '\0') &&
67 | (oldport == askport)) {
68 | do_move = 1;
69 | }
70 | }
71 | }
72 |
73 | if (! do_move) {
74 | /* Just pass everything right through to the real bind */
75 | ret = (int) func(sockfd, addr, addrlen);
76 | DEBUG("<< bind(%d, _, %d) ret %d\n", sockfd, addrlen, ret);
77 | return ret;
78 | }
79 |
80 | DEBUG("binding fd %d on localhost:%d instead of 0x%x:%d\n",
81 | sockfd, newport, ntohl(addr_in->sin_addr.s_addr), oldport);
82 |
83 | /* Use a temporary location for the new address information */
84 | addrlen_tmp = sizeof(addr_tmp);
85 | memcpy(&addr_tmp, addr, addrlen_tmp);
86 |
87 | /* Bind to other port on the loopback instead */
88 | addr_tmp.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
89 | addr_tmp.sin_port = htons(newport);
90 | ret = (int) func(sockfd, &addr_tmp, addrlen_tmp);
91 |
92 | DEBUG("<< bind(%d, _, %d) ret %d\n", sockfd, addrlen, ret);
93 | return ret;
94 | }
95 |
--------------------------------------------------------------------------------
/vnc/utils/u2x11:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | #
3 | # Convert "U+..." commented entries in /usr/include/X11/keysymdef.h
4 | # into JavaScript for use by noVNC. Note this is likely to produce
5 | # a few duplicate properties with clashing values, that will need
6 | # resolving manually.
7 | #
8 | # Colin Dean
9 | #
10 |
11 | regex="^#define[ \t]+XK_[A-Za-z0-9_]+[ \t]+0x([0-9a-fA-F]+)[ \t]+\/\*[ \t]+U\+([0-9a-fA-F]+)[ \t]+[^*]+.[ \t]+\*\/[ \t]*$"
12 | echo "unicodeTable = {"
13 | while read line; do
14 | if echo "${line}" | egrep -qs "${regex}"; then
15 |
16 | x11=$(echo "${line}" | sed -r "s/${regex}/\1/")
17 | vnc=$(echo "${line}" | sed -r "s/${regex}/\2/")
18 |
19 | if echo "${vnc}" | egrep -qs "^00[2-9A-F][0-9A-F]$"; then
20 | : # skip ISO Latin-1 (U+0020 to U+00FF) as 1-to-1 mapping
21 | else
22 | # note 1-to-1 is possible (e.g. for Euro symbol, U+20AC)
23 | echo " 0x${vnc} : 0x${x11},"
24 | fi
25 | fi
26 | done < /usr/include/X11/keysymdef.h | uniq
27 | echo "};"
28 |
29 |
--------------------------------------------------------------------------------
/vnc/utils/web.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | '''
3 | A super simple HTTP/HTTPS webserver for python. Automatically detect
4 |
5 | You can make a cert/key with openssl using:
6 | openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem
7 | as taken from http://docs.python.org/dev/library/ssl.html#certificates
8 |
9 | '''
10 |
11 | import traceback, sys
12 | import socket
13 | import ssl
14 | #import http.server as server # python 3.X
15 | import SimpleHTTPServer as server # python 2.X
16 |
17 | def do_request(connstream, from_addr):
18 | x = object()
19 | server.SimpleHTTPRequestHandler(connstream, from_addr, x)
20 | connstream.close()
21 |
22 | def serve():
23 | bindsocket = socket.socket()
24 | bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
25 | #bindsocket.bind(('localhost', PORT))
26 | bindsocket.bind(('', PORT))
27 | bindsocket.listen(5)
28 |
29 | print("serving on port", PORT)
30 |
31 | while True:
32 | try:
33 | newsocket, from_addr = bindsocket.accept()
34 | peek = newsocket.recv(1024, socket.MSG_PEEK)
35 | if peek.startswith("\x16"):
36 | connstream = ssl.wrap_socket(
37 | newsocket,
38 | server_side=True,
39 | certfile='self.pem',
40 | ssl_version=ssl.PROTOCOL_TLSv1)
41 | else:
42 | connstream = newsocket
43 |
44 | do_request(connstream, from_addr)
45 |
46 | except Exception:
47 | traceback.print_exc()
48 |
49 | try:
50 | PORT = int(sys.argv[1])
51 | except:
52 | print "%s port" % sys.argv[0]
53 | sys.exit(2)
54 |
55 | serve()
56 |
--------------------------------------------------------------------------------
/vnc/utils/websockify.py:
--------------------------------------------------------------------------------
1 | websockify
--------------------------------------------------------------------------------
/vnc/utils/wsproxy.py:
--------------------------------------------------------------------------------
1 | websockify
--------------------------------------------------------------------------------