├── .idea ├── inspectionProfiles │ ├── Project_Default.xml │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── skyoms.iml ├── vcs.xml └── workspace.xml ├── README.md ├── cmdb ├── __init__.py ├── __init__.pyc ├── admin.py ├── admin.pyc ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0001_initial.pyc │ ├── __init__.py │ └── __init__.pyc ├── models.py ├── models.pyc ├── tests.py ├── urls.py ├── urls.pyc ├── views.py └── views.pyc ├── code_release ├── __init__.py ├── __init__.pyc ├── admin.py ├── admin.pyc ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0001_initial.pyc │ ├── __init__.py │ └── __init__.pyc ├── models.py ├── models.pyc ├── tests.py ├── urls.py ├── urls.pyc ├── views.py └── views.pyc ├── controller ├── __init__.py ├── __init__.pyc ├── core │ ├── API.py │ ├── __init__.py │ ├── __init__.pyc │ ├── ansiblehelp.py │ ├── ansiblehelp.pyc │ └── rsync_api.py └── public │ ├── __init__.py │ ├── __init__.pyc │ ├── pagination.py │ └── pagination.pyc ├── manage.py ├── skyoms ├── __init__.py ├── __init__.pyc ├── settings.py ├── settings.pyc ├── urls.py ├── urls.pyc ├── wsgi.py └── wsgi.pyc ├── static ├── css │ └── login.css ├── img │ ├── Down.gif │ ├── Up.gif │ ├── icons.png │ └── login_bg.jpg ├── js │ └── csrf.js ├── plugins │ ├── datatables │ │ ├── css │ │ │ ├── jquery.dataTables.css │ │ │ └── jquery.dataTables_themeroller.css │ │ └── js │ │ │ ├── jquery.dataTables.js │ │ │ └── jquery.dataTables.min.js │ └── layer │ │ ├── layer.js │ │ └── skin │ │ ├── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ └── loading-2.gif │ │ └── layer.css └── template │ ├── bootstrap │ ├── css │ │ └── bootstrap.min.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ └── js │ │ ├── bootstrap.js │ │ └── bootstrap.min.js │ ├── css │ ├── bootstrap-timepicker.css │ ├── bootstrap-wysihtml5.css │ ├── chosen │ │ ├── chosen-sprite.png │ │ ├── chosen-sprite@2x.png │ │ └── chosen.min.css │ ├── colorbox │ │ ├── colorbox.css │ │ └── images │ │ │ ├── border.png │ │ │ ├── controls.png │ │ │ ├── loading.gif │ │ │ ├── loading_background.png │ │ │ └── overlay.png │ ├── datepicker.css │ ├── dropzone │ │ ├── dropzone.css │ │ └── images │ │ │ ├── spritemap.png │ │ │ └── spritemap@2x.png │ ├── endless-landing.min.css │ ├── endless-skin.css │ ├── endless.css │ ├── endless.min.css │ ├── font-awesome.min.css │ ├── fullcalendar.css │ ├── gritter │ │ ├── images │ │ │ ├── gritter-light.png │ │ │ ├── gritter.png │ │ │ └── ie-spacer.gif │ │ └── jquery.gritter.css │ ├── jcarousel.responsive.css │ ├── jquery.dataTables_themeroller.css │ ├── jquery.tagsinput.css │ ├── morris.css │ ├── pace.css │ ├── prettify.css │ └── slider.css │ ├── fonts │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ └── fontawesome-webfont.woff │ ├── img │ ├── email_template │ │ ├── color1.png │ │ ├── color2.png │ │ ├── color3.png │ │ ├── color4.png │ │ ├── color5.png │ │ └── color6.png │ ├── gallery1.jpg │ ├── gallery10.jpg │ ├── gallery11.jpg │ ├── gallery12.jpg │ ├── gallery13.jpg │ ├── gallery14.jpg │ ├── gallery15.jpg │ ├── gallery2.jpg │ ├── gallery3.jpg │ ├── gallery4.jpg │ ├── gallery5.jpg │ ├── gallery6.jpg │ ├── gallery7.jpg │ ├── gallery8.jpg │ ├── gallery9.jpg │ ├── movie │ │ ├── preview1.jpg │ │ ├── preview10.jpg │ │ ├── preview11.jpg │ │ ├── preview12.jpg │ │ ├── preview13.jpg │ │ ├── preview14.jpg │ │ ├── preview15.jpg │ │ ├── preview2.jpg │ │ ├── preview3.jpg │ │ ├── preview4.jpg │ │ ├── preview5.jpg │ │ ├── preview6.jpg │ │ ├── preview7.jpg │ │ ├── preview8.jpg │ │ └── preview9.jpg │ ├── responsive.png │ ├── screenshot.jpg │ ├── user.jpg │ ├── user2.jpg │ ├── user3.jpg │ ├── user4.jpg │ └── user5.jpg │ └── js │ ├── bootstrap-datepicker.min.js │ ├── bootstrap-slider.min.js │ ├── bootstrap-timepicker.min.js │ ├── chosen.jquery.min.js │ ├── dropzone.min.js │ ├── endless │ ├── endless.js │ ├── endless_dashboard.js │ ├── endless_form.js │ └── endless_wizard.js │ ├── fullcalendar.min.js │ ├── jquery-1.10.2.min.js │ ├── jquery-ui-map │ └── ui │ │ └── min │ │ ├── jquery.ui.map.full.min.js │ │ └── jquery.ui.map.microformat.min.js │ ├── jquery-ui.js │ ├── jquery.colorbox.min.js │ ├── jquery.cookie.min.js │ ├── jquery.dataTables.min.js │ ├── jquery.flot.min.js │ ├── jquery.gritter.min.js │ ├── jquery.jcarousel.min.js │ ├── jquery.localscroll.min.js │ ├── jquery.maskedinput.min.js │ ├── jquery.nestable.min.js │ ├── jquery.popupoverlay.min.js │ ├── jquery.resize.min.js │ ├── jquery.scrollTo.min.js │ ├── jquery.slimscroll.min.js │ ├── jquery.sparkline.min.js │ ├── jquery.tagsinput.min.js │ ├── modernizr.min.js │ ├── morris.min.js │ ├── pace.min.js │ ├── parsley.min.js │ ├── rapheal.min.js │ ├── uncompressed │ ├── bootstrap-wysihtml5.js │ ├── holder.js │ ├── pace.js │ └── run_prettify.js │ ├── waypoints.min.js │ └── wysihtml5-0.3.0.min.js ├── templates ├── base.html ├── cmdb │ ├── index.html │ ├── server_add.html │ └── server_edit.html ├── code_release │ ├── index.html │ ├── new_template.html │ └── server_edit.html └── login.html └── 更新步骤.txt /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/skyoms.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 26 | 27 | 28 | 30 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # learngit 2 | # rsync 3 | # rsync 4 | -------------------------------------------------------------------------------- /cmdb/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/__init__.py -------------------------------------------------------------------------------- /cmdb/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/__init__.pyc -------------------------------------------------------------------------------- /cmdb/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /cmdb/admin.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/admin.pyc -------------------------------------------------------------------------------- /cmdb/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class CmdbConfig(AppConfig): 7 | name = 'cmdb' 8 | -------------------------------------------------------------------------------- /cmdb/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2016-10-04 04:44 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | import django.db.models.deletion 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Server', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('in_ip', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='\u5185\u7f51IP')), 22 | ('ex_ip', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5916\u7f51IP')), 23 | ('project_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u9879\u76ee\u540d\u79f0')), 24 | ('host_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u4e3b\u673a\u540d')), 25 | ('position', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u4f4d\u7f6e')), 26 | ('cpu_model', models.CharField(blank=True, max_length=255, null=True, verbose_name='CPU\u578b\u53f7')), 27 | ('cpu_cores', models.IntegerField(blank=True, null=True, verbose_name='CPU\u6838\u6570')), 28 | ('cpu_count', models.IntegerField(blank=True, null=True, verbose_name='CPU\u4e2a\u6570')), 29 | ('mem', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5185\u5b58')), 30 | ('disk', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u78c1\u76d8')), 31 | ('os_version', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7cfb\u7edf\u7248\u672c')), 32 | ('os_kernel', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7cfb\u7edf\u5185\u6838')), 33 | ('status', models.NullBooleanField(default=False, verbose_name='\u8fd0\u884c\u72b6\u6001')), 34 | ('max_open_files', models.IntegerField(blank=True, null=True, verbose_name='\u6700\u5927\u6253\u5f00\u6587\u4ef6\u6570')), 35 | ('uptime', models.IntegerField(blank=True, null=True, verbose_name='\u5728\u7ebf\u65f6\u95f4\uff08\u5929\uff09')), 36 | ], 37 | ), 38 | migrations.CreateModel( 39 | name='Service', 40 | fields=[ 41 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 42 | ('port', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7aef\u53e3')), 43 | ('service_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u670d\u52a1\u540d')), 44 | ('server', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cmdb.Server', verbose_name='\u670d\u52a1\u5668')), 45 | ], 46 | ), 47 | ] 48 | -------------------------------------------------------------------------------- /cmdb/migrations/0001_initial.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/migrations/0001_initial.pyc -------------------------------------------------------------------------------- /cmdb/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/migrations/__init__.py -------------------------------------------------------------------------------- /cmdb/migrations/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/migrations/__init__.pyc -------------------------------------------------------------------------------- /cmdb/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models 5 | 6 | # Create your models here. 7 | 8 | 9 | class Server(models.Model): 10 | # 服务器信息 11 | in_ip = models.CharField(max_length=255, null=True, blank=True, unique=True, verbose_name=u'内网IP') # 内网ip 12 | ex_ip = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'外网IP') # 弹性ip 13 | project_name = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'项目名称') 14 | host_name = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'主机名') 15 | position = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'位置') 16 | 17 | cpu_model = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'CPU型号') 18 | cpu_cores = models.IntegerField(null=True, blank=True, verbose_name=u'CPU核数') 19 | cpu_count = models.IntegerField(null=True, blank=True, verbose_name=u'CPU个数') 20 | 21 | mem = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'内存') 22 | disk = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'磁盘') 23 | os_version = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'系统版本') 24 | os_kernel = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'系统内核') 25 | status = models.NullBooleanField(default=False, null=True, blank=True, verbose_name=u'运行状态') 26 | max_open_files = models.IntegerField(null=True, blank=True, verbose_name=u'最大打开文件数') 27 | uptime = models.IntegerField(null=True, blank=True, verbose_name=u'在线时间(天)') 28 | 29 | def __unicode__(self): 30 | return '%s - %s' % (self.in_ip, self.host_name) 31 | 32 | 33 | class Service(models.Model): 34 | ''' 35 | 服务 36 | ''' 37 | server = models.ForeignKey(Server, verbose_name=u'服务器') 38 | port = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'端口') 39 | service_name = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'服务名') 40 | 41 | def __unicode__(self): 42 | return '%s - %s - %s' % (self.server.in_ip, self.port, self.service_name) -------------------------------------------------------------------------------- /cmdb/models.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/models.pyc -------------------------------------------------------------------------------- /cmdb/tests.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | import ansible.runner 4 | 5 | 6 | def get_info(ip): 7 | data = {} 8 | runner = ansible.runner.Runner(module_name='setup', module_args='', pattern='all', forks=2) 9 | datastructure = runner.run() 10 | sn = datastructure['contacted'][ip]['ansible_facts']['ansible_product_serial'] 11 | host_name = datastructure['contacted'][ip]['ansible_facts']['ansible_hostname'] 12 | 13 | description = datastructure['contacted'][ip]['ansible_facts']['ansible_lsb']['description'] 14 | ansible_machine = datastructure['contacted'][ip]['ansible_facts']['ansible_machine'] 15 | sysinfo = '%s %s' % (description, ansible_machine) 16 | 17 | os_kernel = datastructure['contacted'][ip]['ansible_facts']['ansible_kernel'] 18 | 19 | cpu = datastructure['contacted'][ip]['ansible_facts']['ansible_processor'][1] 20 | cpu_count = datastructure['contacted'][ip]['ansible_facts']['ansible_processor_count'] 21 | cpu_cores = datastructure['contacted'][ip]['ansible_facts']['ansible_processor_cores'] 22 | mem = datastructure['contacted'][ip]['ansible_facts']['ansible_memtotal_mb'] 23 | 24 | ipadd_in = datastructure['contacted'][ip]['ansible_facts']['ansible_all_ipv4_addresses'][0] 25 | disk = datastructure['contacted'][ip]['ansible_facts']['ansible_devices']['sda']['size'] 26 | # print sysinfo 27 | data['sn'] = sn 28 | data['sysinfo'] = sysinfo 29 | data['cpu'] = cpu 30 | data['cpu_count'] = cpu_count 31 | data['cpu_cores'] = cpu_cores 32 | data['mem'] = mem 33 | data['disk'] = disk 34 | data['ipadd_in'] = ipadd_in 35 | data['os_kernel'] = os_kernel 36 | data['host_name'] = host_name 37 | 38 | return data 39 | 40 | 41 | if __name__ == '__main__': 42 | data = get_info('192.168.93.128') 43 | 44 | import pprint 45 | pp = pprint.PrettyPrinter(indent=4) 46 | pp.pprint(data) 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /cmdb/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | """skyoms URL Configuration 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/1.9/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.conf.urls import url, include 15 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 16 | """ 17 | from django.conf.urls import url 18 | import views 19 | 20 | urlpatterns = [ 21 | 22 | url(r'^server_list/$', views.index, name='index'), 23 | url(r'^server_add_page/$', views.server_add_page, name='server_add_page'), 24 | url(r'^server_add/$', views.server_add, name='server_add'), 25 | 26 | url(r'^server_edit_page/(?P\d+)/$', views.server_edit_page, name='server_edit_page'), 27 | url(r'^server_edit/$', views.server_edit, name='server_edit'), 28 | 29 | # url(r'^server_detail/(?P\d+)/$', views.server_detail, name='server_detail'), 30 | url(r'^server_delete/$', views.server_delete, name='server_delete'), 31 | 32 | url(r'^postmachineinfo/$', views.postmachineinfo , name='postmachineinfo'), 33 | ] 34 | -------------------------------------------------------------------------------- /cmdb/urls.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/urls.pyc -------------------------------------------------------------------------------- /cmdb/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | from django.contrib.auth.decorators import login_required 3 | from django.shortcuts import render_to_response 4 | from django.template import RequestContext 5 | from controller.public.pagination import * 6 | from controller.core.ansiblehelp import * 7 | from django.http import HttpResponse 8 | from django.shortcuts import render 9 | from django.db.models import Q 10 | from models import * 11 | import json 12 | # Create your views here. 13 | 14 | PAGE_SIZE = 10 # 每页显示条数 15 | current_page_total = 10 # 分页下标 16 | 17 | 18 | @login_required 19 | def index(request): 20 | # 服务器列表 21 | project_name = request.GET.get('project_name', '') 22 | in_ip = request.GET.get('in_ip', '') 23 | position = request.GET.get('position', '') 24 | service = request.GET.get('service', '') 25 | host_name = request.GET.get('host_name', '') 26 | status = request.GET.get('status', '') 27 | 28 | # 设置查询条件 29 | filters = {} 30 | if project_name: 31 | filters['project_name__icontains'] = project_name 32 | if in_ip: 33 | filters['in_ip__icontains'] = in_ip 34 | if position: 35 | filters['position__icontains'] = position 36 | if host_name: 37 | filters['host_name__icontains'] = host_name 38 | if status: 39 | filters['status'] = True if status == "UP" else False 40 | 41 | page_num = int(request.GET.get('p', 1)) # 页码 42 | servers = Server.objects.filter(**filters) 43 | 44 | if service: # 服务名或端口查询 45 | Q_like = Q(service_name=service) | Q(port=service) 46 | services = Service.objects.filter(Q_like) 47 | svcs = [svc.server for svc in services] 48 | new_servers = [] 49 | # 比较服务器列表里的服务器实例和服务表里服务器外键(也就是服务器实例) 50 | for svr in servers: 51 | if svr in svcs: 52 | new_servers.append(svr) 53 | servers = new_servers 54 | 55 | paginator = Paginator_help(page_num, servers, PAGE_SIZE, current_page_total, request) 56 | 57 | # 重置当前页面列表对象 58 | app = [] 59 | for obj in paginator.current_page.object_list: 60 | services = Service.objects.filter(server=obj) 61 | setattr(obj, 'services', services) 62 | app.append(obj) 63 | 64 | paginator.current_page.object_list = app 65 | return render_to_response('cmdb/index.html', locals(), context_instance=RequestContext(request)) 66 | 67 | 68 | def server_add_page(request): 69 | # 新增机器页面 70 | return render_to_response('cmdb/server_add.html', locals(), context_instance=RequestContext(request)) 71 | 72 | 73 | def server_add(request): 74 | # 新增机器 75 | response = HttpResponse() 76 | data = json.loads(request.GET.get('data', '')) 77 | 78 | server = Server() 79 | server.project_name = data['project_name'] 80 | server.in_ip = data['in_ip'] 81 | server.ex_ip = data['ex_ip'] 82 | server.position = data['position'] 83 | server.save() 84 | 85 | response.write(json.dumps(u'成功')) 86 | return response 87 | 88 | 89 | def server_edit_page(request, id): 90 | # 编辑机器页面 91 | server = Server.objects.get(pk=id) 92 | return render_to_response('cmdb/server_edit.html', locals(), context_instance=RequestContext(request)) 93 | 94 | 95 | def server_edit(request): 96 | # 编辑机器 97 | response = HttpResponse() 98 | data = json.loads(request.GET.get('data', '')) 99 | 100 | print data 101 | for i in data: 102 | print i, data[i] 103 | id = data['id'] 104 | project_name = data['project_name'] 105 | position = data['position'] 106 | in_ip = data['in_ip'] 107 | ex_ip = data['ex_ip'] 108 | 109 | server = Server.objects.get(pk=id) 110 | server.project_name = project_name 111 | server.position = position 112 | server.in_ip = in_ip 113 | server.ex_ip = ex_ip 114 | server.save() 115 | 116 | response.write(json.dumps(u'成功')) 117 | return response 118 | 119 | 120 | def server_delete(request): 121 | # 删除机器信息 122 | response = HttpResponse() 123 | data = json.loads(request.POST.get('data', '')) 124 | id = int(data['id']) 125 | Server.objects.get(pk=id).delete() 126 | 127 | response.write(json.dumps(u'成功')) 128 | return response 129 | 130 | 131 | @login_required 132 | def postmachineinfo(request): 133 | # 提交服务器信息 134 | response = HttpResponse() 135 | data = json.loads(request.GET.get('data', '')) 136 | id = int(data['id']) 137 | print 'update--->' 138 | server = Server.objects.get(pk=id) 139 | data = get_info(server.in_ip) 140 | server.os_version = data['sysinfo'] 141 | server.host_name = data['host_name'] 142 | server.os_kernel = data['os_kernel'] 143 | server.cpu_model = data['cpu'] 144 | server.cpu_count = data['cpu_count'] 145 | server.cpu_cores = data['cpu_cores'] 146 | server.mem = data['mem'] 147 | server.disk = data['disk'] 148 | server.status = True 149 | server.max_open_files = get_ulimit(server.in_ip) 150 | server.uptime = get_uptime(server.in_ip) 151 | server.save() 152 | 153 | # set_service_port(server) # 设置服务端口信息 154 | response.write(json.dumps(u'成功')) 155 | return response 156 | 157 | 158 | def set_service_port(server): 159 | # 设置服务端口信息 160 | services = Service.objects.filter(server=server) 161 | result = get_service_port(server.in_ip) 162 | 163 | new_srv_name = result.keys() # 客户端抓取的数据 164 | old_srv_name = [obj.service_name for obj in services] # 数据库查询的数据 165 | 166 | add_services = list(set(new_srv_name) - set(old_srv_name)) # 新增的服务 167 | delete_services = list(set(old_srv_name) - set(new_srv_name)) # 删除的服务 168 | update_services = list(set(new_srv_name) & set(old_srv_name)) # 更新的服务 169 | 170 | add_data = {} # 新增服务和端口号 171 | update_data = {} # 更新的服务和端口号 172 | for value in result: 173 | if value in add_services: 174 | add_data[value] = result[value] 175 | if value in update_services: 176 | update_data[value] = result[value] 177 | 178 | # 新增服务 179 | for ad in add_data: 180 | values = add_data[ad] 181 | for val in values: 182 | Service.objects.create(server=server, service_name=ad, port=val) 183 | 184 | # 删除服务 185 | for delt in delete_services: 186 | Service.objects.filter(server=server, service_name=delt).delete() 187 | 188 | # 更新服务 189 | for update in update_data: 190 | new = update_data[update] # 需要更新的服务的端口 191 | services = Service.objects.filter(server=server, service_name=update) 192 | old = [srv.port for srv in services] # 旧的服务的端口 193 | 194 | adds = list(set(new) - set(old)) # 增加的端口 195 | deletes = list(set(old) - set(new)) # 删除的端口 196 | 197 | for add in adds: 198 | Service.objects.create(server=server, service_name=update, port=add) 199 | for delete in deletes: 200 | Service.objects.filter(server=server, service_name=update, port=delete).delete() 201 | -------------------------------------------------------------------------------- /cmdb/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/cmdb/views.pyc -------------------------------------------------------------------------------- /code_release/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/__init__.py -------------------------------------------------------------------------------- /code_release/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/__init__.pyc -------------------------------------------------------------------------------- /code_release/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /code_release/admin.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/admin.pyc -------------------------------------------------------------------------------- /code_release/apps.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | from django.apps import AppConfig 4 | 5 | 6 | class CodeReleaseConfig(AppConfig): 7 | name = 'code_release' 8 | -------------------------------------------------------------------------------- /code_release/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.5 on 2016-10-16 09:50 3 | from __future__ import unicode_literals 4 | 5 | from django.conf import settings 6 | from django.db import migrations, models 7 | import django.db.models.deletion 8 | 9 | 10 | class Migration(migrations.Migration): 11 | 12 | initial = True 13 | 14 | dependencies = [ 15 | ('cmdb', '0001_initial'), 16 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 17 | ] 18 | 19 | operations = [ 20 | migrations.CreateModel( 21 | name='Release_template', 22 | fields=[ 23 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 24 | ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6a21\u677f\u540d')), 25 | ('path', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7a0b\u5e8f\u8def\u5f84')), 26 | ('servers', models.ManyToManyField(to='cmdb.Server')), 27 | ], 28 | ), 29 | migrations.CreateModel( 30 | name='Work_order', 31 | fields=[ 32 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 33 | ('apply_time', models.DateTimeField(auto_now_add=True, verbose_name='\u7533\u8bf7\u65f6\u95f4')), 34 | ('verify_time', models.DateTimeField(verbose_name='\u5ba1\u6838\u65f6\u95f4')), 35 | ('release_time', models.DateTimeField(verbose_name='\u53d1\u5e03\u65f6\u95f4')), 36 | ('version_number', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7248\u672c\u53f7')), 37 | ('status', models.IntegerField(default=1, verbose_name='\u5de5\u5355\u72b6\u6001')), 38 | ('apply_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u7533\u8bf7\u4eba')), 39 | ('name', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='release_template', to='code_release.Release_template', verbose_name='\u5de5\u5355\u540d\u79f0')), 40 | ], 41 | ), 42 | ] 43 | -------------------------------------------------------------------------------- /code_release/migrations/0001_initial.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/migrations/0001_initial.pyc -------------------------------------------------------------------------------- /code_release/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/migrations/__init__.py -------------------------------------------------------------------------------- /code_release/migrations/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/migrations/__init__.pyc -------------------------------------------------------------------------------- /code_release/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models 5 | from cmdb.models import Server 6 | from django.contrib.auth.models import User 7 | # Create your models here. 8 | 9 | 10 | class Release_template(models.Model): 11 | # 代码发布模板 12 | name = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'模板名') 13 | path = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'程序路径') 14 | servers = models.ManyToManyField(Server) 15 | 16 | def __unicode__(self): 17 | return '%s - %s' % (self.name, self.path) 18 | 19 | 20 | class Work_order(models.Model): 21 | # 更新工单 22 | name = models.ForeignKey(Release_template, related_name='release_template', verbose_name=u'工单名称') 23 | apply_user = models.ForeignKey(User, verbose_name=u'申请人') 24 | apply_time = models.DateTimeField(auto_now_add=True, verbose_name=u'申请时间') 25 | verify_time = models.DateTimeField(verbose_name=u'审核时间') 26 | release_time = models.DateTimeField(verbose_name=u'发布时间') 27 | version_number = models.CharField(max_length=255, null=True, blank=True, verbose_name=u'版本号') 28 | status = models.IntegerField(default=1, verbose_name=u'工单状态') 29 | 30 | def __unicode__(self): 31 | return '%s - %s' % (self.name, self.status) 32 | -------------------------------------------------------------------------------- /code_release/models.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/models.pyc -------------------------------------------------------------------------------- /code_release/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /code_release/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | """skyoms URL Configuration 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/1.9/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.conf.urls import url, include 15 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 16 | """ 17 | from django.conf.urls import url 18 | import views 19 | 20 | urlpatterns = [ 21 | 22 | url(r'^new_template/$', views.new_template, name='new_template'), # 新建模板 23 | url(r'^get_servers/$', views.get_servers, name='get_servers'), # 获取服务器数据 24 | 25 | ] 26 | -------------------------------------------------------------------------------- /code_release/urls.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/urls.pyc -------------------------------------------------------------------------------- /code_release/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | from django.contrib.auth.decorators import login_required 3 | from django.shortcuts import render_to_response 4 | from django.template import RequestContext 5 | from controller.public.pagination import * 6 | from controller.core.ansiblehelp import * 7 | from django.http import HttpResponse 8 | from django.shortcuts import render 9 | from django.db.models import Q 10 | from models import * 11 | from cmdb.models import * 12 | import json 13 | 14 | # Create your views here. 15 | 16 | 17 | def new_template(request): 18 | # 新增机器页面 19 | return render_to_response('code_release/new_template.html', locals(), context_instance=RequestContext(request)) 20 | 21 | 22 | def get_servers(request): 23 | # 获取服务器信息 24 | response = HttpResponse() 25 | servers = Server.objects.values('id', 'in_ip') 26 | response.write(json.dumps(list(servers))) 27 | return response 28 | -------------------------------------------------------------------------------- /code_release/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/code_release/views.pyc -------------------------------------------------------------------------------- /controller/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/controller/__init__.py -------------------------------------------------------------------------------- /controller/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/controller/__init__.pyc -------------------------------------------------------------------------------- /controller/core/API.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | # !/usr/bin/env python 3 | # 4 | # Author: Shawn.T 5 | # Email: shawntai.ds@gmail.com 6 | # 7 | # this is the Interface package of Ansible2 API 8 | # 9 | 10 | import json 11 | from ansible.plugins.callback import CallbackBase 12 | from ansible.parsing.dataloader import DataLoader 13 | from ansible.vars import VariableManager 14 | from ansible.inventory import Inventory 15 | from ansible.playbook.play import Play 16 | from ansible.executor.task_queue_manager import TaskQueueManager 17 | from ansible.executor.playbook_executor import PlaybookExecutor 18 | 19 | loader = DataLoader() # 用来加载解析yaml文件或JSON内容,并且支持vault的解密 20 | variable_manager = VariableManager() # 管理变量的类,包括主机,组,扩展等变量,之前版本是在 inventory 中的 21 | inventory = Inventory(loader=loader, variable_manager=variable_manager) 22 | variable_manager.set_inventory(inventory) # 根据 inventory 加载对应变量 23 | 24 | 25 | class Options(object): 26 | ''' 27 | 这是一个公共的类,因为ad-hoc和playbook都需要一个options参数 28 | 并且所需要拥有不同的属性,但是大部分属性都可以返回None或False 29 | 因此用这样的一个类来省去初始化大一堆的空值的属性 30 | ''' 31 | 32 | def __init__(self): 33 | self.connection = "local" 34 | self.forks = 1 35 | self.check = False 36 | 37 | def __getattr__(self, name): 38 | return None 39 | 40 | 41 | options = Options() 42 | 43 | 44 | class ResultCallback(CallbackBase): 45 | """A sample callback plugin used for performing an action as results come in 46 | 47 | If you want to collect all results into a single object for processing at 48 | the end of the execution, look into utilizing the ``json`` callback plugin 49 | or writing your own custom callback plugin 50 | """ 51 | def __init__(self): 52 | self.res = None 53 | 54 | def v2_runner_on_ok(self, result, **kwargs): 55 | """Print a json representation of the result 56 | 57 | This method could store the result in an instance attribute for retrieval later 58 | """ 59 | host = result._host 60 | res = json.dumps({host.name: result._result}, indent=4) 61 | self.res = result._result 62 | # return result._result 63 | 64 | 65 | 66 | def run_adhoc(): 67 | variable_manager.extra_vars = {"ansible_ssh_user": "root", "ansible_ssh_pass": "xxx"} # 增加外部变量 68 | # 构建pb, 这里很有意思, 新版本运行ad-hoc或playbook都需要构建这样的pb, 只是最后调用play的类不一样 69 | # :param name: 任务名,类似playbook中tasks中的name 70 | # :param hosts: playbook中的hosts 71 | # :param tasks: playbook中的tasks, 其实这就是playbook的语法, 因为tasks的值是个列表,因此可以写入多个task 72 | play_source = {"name": "Ansible Ad-Hoc", "hosts": "192.168.93.128", "gather_facts": "no", 73 | "tasks": [{"action": {"module": "shell", "args": "ifconfig"}}]} 74 | play = Play().load(play_source, variable_manager=variable_manager, loader=loader) 75 | tqm = None 76 | callback = ResultCallback() 77 | try: 78 | tqm = TaskQueueManager( 79 | inventory=inventory, 80 | variable_manager=variable_manager, 81 | loader=loader, 82 | options=options, 83 | passwords=None, 84 | stdout_callback=callback, 85 | run_tree=False, 86 | ) 87 | result = tqm.run(play) 88 | # print result 89 | res = callback.res 90 | # print res,type(res) 91 | for k,v in res.items(): 92 | print k,v 93 | 94 | finally: 95 | if tqm is not None: 96 | tqm.cleanup() 97 | 98 | 99 | if __name__ == '__main__': 100 | run_adhoc() 101 | -------------------------------------------------------------------------------- /controller/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/controller/core/__init__.py -------------------------------------------------------------------------------- /controller/core/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/controller/core/__init__.pyc -------------------------------------------------------------------------------- /controller/core/ansiblehelp.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | import ansible.runner 4 | 5 | 6 | def get_info(ip): 7 | data = {} 8 | runner = ansible.runner.Runner(module_name='setup', module_args='', pattern='all', forks=2) 9 | datastructure = runner.run() 10 | sn = datastructure['contacted'][ip]['ansible_facts']['ansible_product_serial'] 11 | host_name = datastructure['contacted'][ip]['ansible_facts']['ansible_hostname'] 12 | 13 | description = datastructure['contacted'][ip]['ansible_facts']['ansible_lsb']['description'] 14 | ansible_machine = datastructure['contacted'][ip]['ansible_facts']['ansible_machine'] 15 | sysinfo = '%s %s' % (description, ansible_machine) 16 | 17 | os_kernel = datastructure['contacted'][ip]['ansible_facts']['ansible_kernel'] 18 | 19 | cpu = datastructure['contacted'][ip]['ansible_facts']['ansible_processor'][1] 20 | cpu_count = datastructure['contacted'][ip]['ansible_facts']['ansible_processor_count'] 21 | cpu_cores = datastructure['contacted'][ip]['ansible_facts']['ansible_processor_cores'] 22 | mem = datastructure['contacted'][ip]['ansible_facts']['ansible_memtotal_mb'] 23 | 24 | ipadd_in = datastructure['contacted'][ip]['ansible_facts']['ansible_all_ipv4_addresses'][0] 25 | disk = datastructure['contacted'][ip]['ansible_facts']['ansible_devices']['sda']['size'] 26 | # print sysinfo 27 | data['sn'] = sn 28 | data['sysinfo'] = sysinfo 29 | data['cpu'] = cpu 30 | data['cpu_count'] = cpu_count 31 | data['cpu_cores'] = cpu_cores 32 | data['mem'] = mem 33 | data['disk'] = disk 34 | data['ipadd_in'] = ipadd_in 35 | data['os_kernel'] = os_kernel 36 | data['host_name'] = host_name 37 | 38 | return data 39 | 40 | 41 | def get_ulimit(ip): 42 | # 最大文件打开数 43 | runner = ansible.runner.Runner(module_name='shell', module_args='ulimit -n', pattern='all', forks=2) 44 | datastructure = runner.run() 45 | result = datastructure['contacted'][ip]['stdout'] 46 | 47 | return result 48 | 49 | 50 | def get_uptime(ip): 51 | # 运行时间 52 | runner = ansible.runner.Runner(module_name='shell', module_args='uptime', pattern='all', forks=2) 53 | datastructure = runner.run() 54 | result = datastructure['contacted'][ip]['stdout'] 55 | try: 56 | result = result.split('up')[1].split('days')[0] 57 | result = int(result) 58 | except: 59 | result = 0 60 | return result 61 | 62 | 63 | def get_service_port(ip): 64 | # 获取服务端口信息 65 | # 数据结构 {服务名:[端口], ...} 66 | runner = ansible.runner.Runner(module_name='shell', module_args='netstat -nptl', pattern='all', forks=2) 67 | datastructure = runner.run() 68 | data = datastructure['contacted'][ip]['stdout'] 69 | data = data.split('\n') 70 | 71 | result = {} 72 | for dt in data[2:]: 73 | dt = dt.split() 74 | if dt[3].count(':') == 1: 75 | port = dt[3].split(':')[1] 76 | service = dt[6].split('/')[1] 77 | if service not in result: 78 | result[service] = [port] 79 | else: 80 | result[service].append(port) 81 | return result 82 | 83 | if __name__ == '__main__': 84 | data = get_info('192.168.93.137') 85 | print data 86 | -------------------------------------------------------------------------------- /controller/core/ansiblehelp.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/controller/core/ansiblehelp.pyc -------------------------------------------------------------------------------- /controller/core/rsync_api.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | import ansible.runner 4 | 5 | 6 | def get_info(ip): 7 | data = {} 8 | runner = ansible.runner.Runner(module_name='setup', module_args='', pattern='%s' % ip, forks=2) 9 | datastructure = runner.run() 10 | sn = datastructure['contacted'][ip]['ansible_facts']['ansible_product_serial'] 11 | host_name = datastructure['contacted'][ip]['ansible_facts']['ansible_hostname'] 12 | 13 | description = datastructure['contacted'][ip]['ansible_facts']['ansible_lsb']['description'] 14 | ansible_machine = datastructure['contacted'][ip]['ansible_facts']['ansible_machine'] 15 | sysinfo = '%s %s' % (description, ansible_machine) 16 | 17 | os_kernel = datastructure['contacted'][ip]['ansible_facts']['ansible_kernel'] 18 | 19 | cpu = datastructure['contacted'][ip]['ansible_facts']['ansible_processor'][1] 20 | cpu_count = datastructure['contacted'][ip]['ansible_facts']['ansible_processor_count'] 21 | cpu_cores = datastructure['contacted'][ip]['ansible_facts']['ansible_processor_cores'] 22 | mem = datastructure['contacted'][ip]['ansible_facts']['ansible_memtotal_mb'] 23 | 24 | ipadd_in = datastructure['contacted'][ip]['ansible_facts']['ansible_all_ipv4_addresses'][0] 25 | disk = datastructure['contacted'][ip]['ansible_facts']['ansible_devices']['sda']['size'] 26 | # print sysinfo 27 | data['sn'] = sn 28 | data['sysinfo'] = sysinfo 29 | data['cpu'] = cpu 30 | data['cpu_count'] = cpu_count 31 | data['cpu_cores'] = cpu_cores 32 | data['mem'] = mem 33 | data['disk'] = disk 34 | data['ipadd_in'] = ipadd_in 35 | data['os_kernel'] = os_kernel 36 | data['host_name'] = host_name 37 | 38 | return data 39 | 40 | 41 | def get_ulimit(ip): 42 | # 最大文件打开数 43 | runner = ansible.runner.Runner(module_name='shell', module_args='ulimit -n', pattern='%s' % ip, forks=2) 44 | datastructure = runner.run() 45 | result = datastructure['contacted'][ip]['stdout'] 46 | 47 | return result 48 | 49 | 50 | def get_uptime(ip): 51 | # 运行时间 52 | runner = ansible.runner.Runner(module_name='shell', module_args='uptime', pattern='%s' % ip, forks=2) 53 | datastructure = runner.run() 54 | result = datastructure['contacted'][ip]['stdout'] 55 | try: 56 | result = result.split('up')[1].split('days')[0] 57 | result = int(result) 58 | except: 59 | result = 0 60 | return result 61 | 62 | 63 | def get_service_port(ip): 64 | # 获取服务端口信息 65 | # 数据结构 {服务名:[端口], ...} 66 | runner = ansible.runner.Runner(module_name='shell', module_args='netstat -nptl', pattern='%s' % ip, forks=2) 67 | datastructure = runner.run() 68 | data = datastructure['contacted'][ip]['stdout'] 69 | data = data.split('\n') 70 | 71 | result = {} 72 | for dt in data[2:]: 73 | dt = dt.split() 74 | if dt[3].count(':') == 1: 75 | port = dt[3].split(':')[1] 76 | service = dt[6].split('/')[1] 77 | if service not in result: 78 | result[service] = [port] 79 | else: 80 | result[service].append(port) 81 | return result 82 | 83 | 84 | def rsync_file(ip): 85 | # 最大文件打开数 86 | args = "src=/opt/django/skyoms/ dest=/opt/django/skyoms/ delete=yes" 87 | runner = ansible.runner.Runner(module_name='synchronize', module_args="%s" % args, pattern='%s' % ip, forks=2) 88 | datastructure = runner.run() 89 | # print datastructure 90 | result = datastructure['contacted'][ip] 91 | 92 | return result 93 | 94 | if __name__ == '__main__': 95 | data = rsync_file('192.168.93.128') 96 | print data 97 | -------------------------------------------------------------------------------- /controller/public/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/controller/public/__init__.py -------------------------------------------------------------------------------- /controller/public/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/controller/public/__init__.pyc -------------------------------------------------------------------------------- /controller/public/pagination.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | from django.core.paginator import Paginator 5 | 6 | 7 | class Paginator_help: 8 | # 分页 9 | 10 | def __init__(self, page_num, queryset, PAGE_SIZE, current_page_total, request): 11 | self.page_num = self.check_page_num(page_num) # 当前页码 12 | self.current_page_total = current_page_total # 当前页下标 13 | self.queryset = queryset # 需要分页的对象集合 14 | self.PAGE_SIZE = PAGE_SIZE # 每页显示多少条 15 | self.pages = self.get_Paginator_obj() # 获取分页对象 16 | self.page_range = self.get_page_range() # 获取当前页的页面下标 17 | self.qstr = self.get_qstr(request) 18 | self.current_page = self.get_current_page() # 获取当前页对象 19 | 20 | def get_Paginator_obj(self): 21 | # 获取分页对象 22 | pages = Paginator(self.queryset, self.PAGE_SIZE) 23 | return pages 24 | 25 | def check_page_num(self, page_num): 26 | # 检查页码 27 | if page_num <= 0: 28 | page_num = 1 29 | return page_num 30 | 31 | def get_current_page(self): 32 | # 获取当前页对象 33 | current_page = self.pages.page(self.page_num) 34 | return current_page 35 | 36 | def get_qstr(self, request): 37 | qstr = '&'.join(['%s=%s' % (k, v) for k, v in request.GET.items() if k != 'p']) 38 | return qstr 39 | 40 | def calculate_begin_end(self): 41 | # 计算当前页下标的取值范围 42 | page_total = self.pages.num_pages 43 | begin = 0 44 | end = 0 45 | if page_total <= self.current_page_total: 46 | begin = 0 47 | end = page_total 48 | else: 49 | if self.page_num <= self.current_page_total / 2: 50 | begin = 0 51 | end = self.current_page_total 52 | else: 53 | begin = self.page_num - self.current_page_total / 2 54 | end = self.page_num + self.current_page_total / 2 55 | if (self.current_page_total % 2) != 0: # 如果分页下标为奇数 56 | end += 1 57 | if end > page_total: 58 | end = page_total 59 | begin = page_total - self.current_page_total 60 | return begin, end 61 | 62 | def get_page_range(self): 63 | # 获取当前页的页面下标 64 | begin, end = self.calculate_begin_end() 65 | 66 | # 草了,1.9的Paginator分页类的page_range方法得到的尽然是xrange,用[begin:end]切片报错 67 | page_range = [i for i in self.pages.page_range] 68 | page_range = page_range[begin:end] 69 | 70 | return page_range 71 | -------------------------------------------------------------------------------- /controller/public/pagination.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/controller/public/pagination.pyc -------------------------------------------------------------------------------- /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", "skyoms.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /skyoms/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/skyoms/__init__.py -------------------------------------------------------------------------------- /skyoms/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/skyoms/__init__.pyc -------------------------------------------------------------------------------- /skyoms/settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | """ 3 | Django settings for skyoms project. 4 | 5 | Generated by 'django-admin startproject' using Django 1.9.5. 6 | 7 | For more information on this file, see 8 | https://docs.djangoproject.com/en/1.9/topics/settings/ 9 | 10 | For the full list of settings and their values, see 11 | https://docs.djangoproject.com/en/1.9/ref/settings/ 12 | """ 13 | 14 | import os 15 | 16 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 17 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'ey-(-te=x=3tv*2z7870lc$80$$4cmp^qd$$h56&3#zrh)vhe@' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | # Application definition 31 | 32 | INSTALLED_APPS = [ 33 | 'cmdb', 34 | 'code_release', 35 | 'django.contrib.admin', 36 | 'django.contrib.auth', 37 | 'django.contrib.contenttypes', 38 | 'django.contrib.sessions', 39 | 'django.contrib.messages', 40 | 'django.contrib.staticfiles', 41 | ] 42 | 43 | MIDDLEWARE_CLASSES = [ 44 | 'django.middleware.security.SecurityMiddleware', 45 | 'django.contrib.sessions.middleware.SessionMiddleware', 46 | 'django.middleware.common.CommonMiddleware', 47 | 'django.middleware.csrf.CsrfViewMiddleware', 48 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 49 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 50 | 'django.contrib.messages.middleware.MessageMiddleware', 51 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 52 | ] 53 | 54 | ROOT_URLCONF = 'skyoms.urls' 55 | 56 | TEMPLATES = [ 57 | { 58 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 | 'DIRS': [os.path.join(BASE_DIR, "templates")], 60 | 'APP_DIRS': True, 61 | 'OPTIONS': { 62 | 'context_processors': [ 63 | 'django.template.context_processors.debug', 64 | 'django.template.context_processors.request', 65 | 'django.contrib.auth.context_processors.auth', 66 | 'django.contrib.messages.context_processors.messages', 67 | ], 68 | }, 69 | }, 70 | ] 71 | 72 | WSGI_APPLICATION = 'skyoms.wsgi.application' 73 | 74 | # Database 75 | # https://docs.djangoproject.com/en/1.9/ref/settings/#databases 76 | DATABASES = { 77 | 'default': { 78 | 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 79 | 'NAME': 'skyoms', # Or path to database file if using sqlite3. 80 | 'USER': 'root', # Not used with sqlite3. 81 | 'PASSWORD': '123.com', # Not used with sqlite3. 82 | 'HOST': '127.0.0.1', # Set to empty string for localhost. Not used with sqlite3. 83 | 'PORT': '3306', # Set to empty string for default. Not used with sqlite3. 84 | #'OPTIONS': {"init_command": "SET foreign_key_checks = 0;",}, 85 | } 86 | } 87 | # DATABASES = { 88 | # 'default': { 89 | # 'ENGINE': 'django.db.backends.sqlite3', 90 | # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 91 | # } 92 | # } 93 | 94 | # Password validation 95 | # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators 96 | 97 | AUTH_PASSWORD_VALIDATORS = [ 98 | { 99 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 100 | }, 101 | { 102 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 103 | }, 104 | { 105 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 106 | }, 107 | { 108 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 109 | }, 110 | ] 111 | 112 | # Internationalization 113 | # https://docs.djangoproject.com/en/1.9/topics/i18n/ 114 | 115 | LANGUAGE_CODE = 'en-us' 116 | 117 | TIME_ZONE = 'Asia/Shanghai' 118 | 119 | USE_I18N = True 120 | 121 | USE_L10N = True 122 | 123 | USE_TZ = True 124 | 125 | # Static files (CSS, JavaScript, Images) 126 | # https://docs.djangoproject.com/en/1.9/howto/static-files/ 127 | 128 | STATIC_URL = '/static/' 129 | 130 | STATICFILES_DIRS = [ 131 | os.path.join(BASE_DIR, "static"), 132 | ] 133 | -------------------------------------------------------------------------------- /skyoms/settings.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/skyoms/settings.pyc -------------------------------------------------------------------------------- /skyoms/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | """skyoms URL Configuration 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/1.9/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.conf.urls import url, include 15 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 16 | """ 17 | from django.conf.urls import url 18 | from django.contrib import admin 19 | from django.contrib.auth.views import logout 20 | from django.contrib.auth.views import login 21 | # from django.contrib.auth.urls import 22 | from django.conf.urls import include 23 | from cmdb import views 24 | 25 | urlpatterns = [ 26 | url(r'^admin/', admin.site.urls), 27 | 28 | url(r'^$', views.index, name='index'), 29 | url(r'^accounts/profile/$', views.index, name='index'), 30 | 31 | url(r'^accounts/login/$', login, {'template_name': 'login.html'}), 32 | url(r'^accounts/logout/$', logout), 33 | 34 | # 设备管理 35 | url(r'^cmdb/', include('cmdb.urls')), 36 | 37 | # 代码发布 38 | url(r'^code_release/', include('code_release.urls')), 39 | ] 40 | -------------------------------------------------------------------------------- /skyoms/urls.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/skyoms/urls.pyc -------------------------------------------------------------------------------- /skyoms/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for skyoms 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.9/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "skyoms.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /skyoms/wsgi.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/skyoms/wsgi.pyc -------------------------------------------------------------------------------- /static/css/login.css: -------------------------------------------------------------------------------- 1 | 2 | body{background: url(/static/img/login_bg.jpg) 0 -200px no-repeat #000; 3 | background-size: cover;margin:0; color:#FFF} 4 | *{-webkit-box-sizing:border-box;box-sizing:border-box;} 5 | a{-webkit-transition: All 1s ease;text-decoration: none; 6 | color: #dfc684;} 7 | input , button{border:0;background:none;color: #dfc684;} 8 | #login-box{position:absolute; width:500px; left:30%; top:29%;} 9 | .login-box-wh{height:53px;width:800px;margin-bottom:16px;} 10 | .to-index{padding-left:16px;overflow:hidden; position:absolute;left:69px;} 11 | .to-index-m{width:360px; height:53px; margin-top:-53px;margin-left:-16px;position:absolute;z-index:-1;background:yellow;transition:margin 0.8s;-moz-transition:margin 0.8s; -webkit-transition:margin 0.8s 0.3s; } 12 | .login-box-wh:hover .to-index-m{margin-top:0;} 13 | .login-box-wh:hover a{color:#f00} 14 | .box-mov{width: 53px;height: 53px;float: left; display: inline-block;opacity: .72;filter: alpha(opacity=72);background: url(/static/img/icons.png) -212px 0 #000; margin-right: 16px;position: relative;overflow:hidden;z-index:0;} 15 | .box-mov-s{width: 53px;height: 53px;z-index:1;position:absolute;background:#ff0;margin-left:-53px; 16 | background:yellow; 17 | transition:margin 0.8s;-moz-transition:margin 0.8s; -webkit-transition:margin 0.8s; } 18 | .login-box-wh:hover .box-mov-s{margin:0;} 19 | .box-mov-d{width: 53px;height: 53px;z-index:2;position:absolute;background:url(/static/img/icons.png) -212px -53px;);opacity:0; } 20 | .login-box-wh:hover .box-mov-d {opacity:1;} 21 | .text-box{width:360px; height:53px;background:#000;opacity: .72; float:left;line-height:53px;} 22 | #vdcode{width:270px;} 23 | .text-box-login{} 24 | .text-box-login-btn{width:360px; height:53px;background:#000;opacity: .72; float:left;line-height:53px;-webkit-box-sizing:border-box; position:absolute;left:69px;overflow:hidden; } 25 | .login-btn-m{width:360px; height:53px;margin-top:-53px; position:absolute;z-index:1;background:yellow;transition:margin 0.8s;-moz-transition:margin 0.8s; -webkit-transition:margin 0.8s 0.3s;} 26 | .text-box-login:hover .login-btn-m{margin-top:0} 27 | .login-btn{width:100%;height:100%; cursor:pointer;font-size:16px;position:absolute;z-index:5;transition: 0.8s;-moz-transition: 0.8s; -webkit-transition: 0.8s 0.3s;} 28 | .login-btn:hover{color:#f00;} 29 | input{height:100%;width:100%;padding:8px 0 8px 8px;background:none;color:#fff;} 30 | input:focus { 31 | outline:none; 32 | } -------------------------------------------------------------------------------- /static/img/Down.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/img/Down.gif -------------------------------------------------------------------------------- /static/img/Up.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/img/Up.gif -------------------------------------------------------------------------------- /static/img/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/img/icons.png -------------------------------------------------------------------------------- /static/img/login_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/img/login_bg.jpg -------------------------------------------------------------------------------- /static/js/csrf.js: -------------------------------------------------------------------------------- 1 | function getCookie(name) { 2 | var cookieValue = null; 3 | if (document.cookie && document.cookie != '') { 4 | var cookies = document.cookie.split(';'); 5 | for (var i = 0; i < cookies.length; i++) { 6 | var cookie = jQuery.trim(cookies[i]); 7 | // Does this cookie string begin with the name we want? 8 | if (cookie.substring(0, name.length + 1) == (name + '=')) { 9 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 10 | break; 11 | } 12 | } 13 | } 14 | return cookieValue; 15 | } 16 | var csrftoken = getCookie('csrftoken'); 17 | function csrfSafeMethod(method) { 18 | // these HTTP methods do not require CSRF protection 19 | return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 20 | } 21 | $.ajaxSetup({ 22 | beforeSend: function(xhr, settings) { 23 | if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 24 | xhr.setRequestHeader("X-CSRFToken", csrftoken); 25 | } 26 | } 27 | }); -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/plugins/layer/skin/default/icon-ext.png -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/plugins/layer/skin/default/icon.png -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/plugins/layer/skin/default/loading-0.gif -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/plugins/layer/skin/default/loading-1.gif -------------------------------------------------------------------------------- /static/plugins/layer/skin/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/plugins/layer/skin/default/loading-2.gif -------------------------------------------------------------------------------- /static/template/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- 1 | 2 | 3 | VHCS ERROR 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 42 | 43 |
12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
    
16 |    
21 | 22 | 23 | 28 | 29 |
24 |

Error 404!

25 |
26 | /Endless1.5.1/bootstrap/fonts/glyphicons-halflings-regular.eot
27 | File Not Found!
30 |
 VHCS - Virtual Hosting Control System - Control Panel
41 |
44 | 45 | -------------------------------------------------------------------------------- /static/template/bootstrap/fonts/glyphicons-halflings-regular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | VHCS ERROR 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 42 | 43 |
12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
    
16 |    
21 | 22 | 23 | 28 | 29 |
24 |

Error 404!

25 |
26 | /Endless1.5.1/bootstrap/fonts/glyphicons-halflings-regular.svg
27 | File Not Found!
30 |
 VHCS - Virtual Hosting Control System - Control Panel
41 |
44 | 45 | -------------------------------------------------------------------------------- /static/template/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- 1 | 2 | 3 | VHCS ERROR 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 42 | 43 |
12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
    
16 |    
21 | 22 | 23 | 28 | 29 |
24 |

Error 404!

25 |
26 | /Endless1.5.1/bootstrap/fonts/glyphicons-halflings-regular.ttf
27 | File Not Found!
30 |
 VHCS - Virtual Hosting Control System - Control Panel
41 |
44 | 45 | -------------------------------------------------------------------------------- /static/template/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- 1 | 2 | 3 | VHCS ERROR 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 42 | 43 |
12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
    
16 |    
21 | 22 | 23 | 28 | 29 |
24 |

Error 404!

25 |
26 | /Endless1.5.1/bootstrap/fonts/glyphicons-halflings-regular.woff
27 | File Not Found!
30 |
 VHCS - Virtual Hosting Control System - Control Panel
41 |
44 | 45 | -------------------------------------------------------------------------------- /static/template/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 | -------------------------------------------------------------------------------- /static/template/css/bootstrap-wysihtml5.css: -------------------------------------------------------------------------------- 1 | ul.wysihtml5-toolbar { 2 | margin: 0; 3 | padding: 0; 4 | display: block; 5 | } 6 | 7 | ul.wysihtml5-toolbar::after { 8 | clear: both; 9 | display: table; 10 | content: ""; 11 | } 12 | 13 | ul.wysihtml5-toolbar > li { 14 | float: left; 15 | display: list-item; 16 | list-style: none; 17 | margin: 0 5px 10px 0; 18 | } 19 | 20 | ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] { 21 | font-weight: bold; 22 | } 23 | 24 | ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] { 25 | font-style: italic; 26 | } 27 | 28 | ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] { 29 | text-decoration: underline; 30 | } 31 | 32 | ul.wysihtml5-toolbar a.btn.wysihtml5-command-active { 33 | background-image: none; 34 | -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); 35 | -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); 36 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); 37 | background-color: #E6E6E6; 38 | background-color: #D9D9D9; 39 | outline: 0; 40 | } 41 | 42 | ul.wysihtml5-commands-disabled .dropdown-menu { 43 | display: none !important; 44 | } 45 | 46 | ul.wysihtml5-toolbar div.wysihtml5-colors { 47 | display:block; 48 | width: 50px; 49 | height: 20px; 50 | margin-top: 2px; 51 | margin-left: 5px; 52 | position: absolute; 53 | pointer-events: none; 54 | } 55 | 56 | ul.wysihtml5-toolbar a.wysihtml5-colors-title { 57 | padding-left: 70px; 58 | } 59 | 60 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="black"] { 61 | background: black !important; 62 | } 63 | 64 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="silver"] { 65 | background: silver !important; 66 | } 67 | 68 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="gray"] { 69 | background: gray !important; 70 | } 71 | 72 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="maroon"] { 73 | background: maroon !important; 74 | } 75 | 76 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="red"] { 77 | background: red !important; 78 | } 79 | 80 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="purple"] { 81 | background: purple !important; 82 | } 83 | 84 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="green"] { 85 | background: green !important; 86 | } 87 | 88 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="olive"] { 89 | background: olive !important; 90 | } 91 | 92 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="navy"] { 93 | background: navy !important; 94 | } 95 | 96 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="blue"] { 97 | background: blue !important; 98 | } 99 | 100 | ul.wysihtml5-toolbar div[data-wysihtml5-command-value="orange"] { 101 | background: orange !important; 102 | } 103 | -------------------------------------------------------------------------------- /static/template/css/chosen/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/chosen/chosen-sprite.png -------------------------------------------------------------------------------- /static/template/css/chosen/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/chosen/chosen-sprite@2x.png -------------------------------------------------------------------------------- /static/template/css/colorbox/colorbox.css: -------------------------------------------------------------------------------- 1 | /* 2 | Colorbox Core Style: 3 | The following CSS is consistent between example themes and should not be altered. 4 | */ 5 | #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} 6 | #cboxOverlay{position:fixed; width:100%; height:100%;} 7 | #cboxMiddleLeft, #cboxBottomLeft{clear:left;} 8 | #cboxContent{position:relative;} 9 | #cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;} 10 | #cboxTitle{margin:0;} 11 | #cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} 12 | #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} 13 | .cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;} 14 | .cboxIframe{width:100%; height:100%; display:block; border:0;} 15 | #colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;} 16 | 17 | /* 18 | User Style: 19 | Change the following styles to modify the appearance of Colorbox. They are 20 | ordered & tabbed in a way that represents the nesting of the generated HTML. 21 | */ 22 | #cboxOverlay{background:url(images/overlay.png) repeat 0 0;} 23 | #colorbox{outline:0;} 24 | #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;} 25 | #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;} 26 | #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;} 27 | #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;} 28 | #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;} 29 | #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;} 30 | #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;} 31 | #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;} 32 | #cboxContent{background:#fff; overflow:hidden;} 33 | .cboxIframe{background:#fff;} 34 | #cboxError{padding:50px; border:1px solid #ccc;} 35 | #cboxLoadedContent{margin-bottom:28px;} 36 | #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;} 37 | #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;} 38 | #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;} 39 | #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;} 40 | 41 | /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */ 42 | #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; } 43 | 44 | /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */ 45 | #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;} 46 | 47 | #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;} 48 | #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;} 49 | #cboxPrevious:hover{background-position:-75px -25px;} 50 | #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;} 51 | #cboxNext:hover{background-position:-50px -25px;} 52 | #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;} 53 | #cboxClose:hover{background-position:-25px -25px;} 54 | 55 | /* 56 | The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill 57 | when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9. 58 | See: http://jacklmoore.com/notes/ie-transparency-problems/ 59 | */ 60 | .cboxIE #cboxTopLeft, 61 | .cboxIE #cboxTopCenter, 62 | .cboxIE #cboxTopRight, 63 | .cboxIE #cboxBottomLeft, 64 | .cboxIE #cboxBottomCenter, 65 | .cboxIE #cboxBottomRight, 66 | .cboxIE #cboxMiddleLeft, 67 | .cboxIE #cboxMiddleRight { 68 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF); 69 | } -------------------------------------------------------------------------------- /static/template/css/colorbox/images/border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/colorbox/images/border.png -------------------------------------------------------------------------------- /static/template/css/colorbox/images/controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/colorbox/images/controls.png -------------------------------------------------------------------------------- /static/template/css/colorbox/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/colorbox/images/loading.gif -------------------------------------------------------------------------------- /static/template/css/colorbox/images/loading_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/colorbox/images/loading_background.png -------------------------------------------------------------------------------- /static/template/css/colorbox/images/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/colorbox/images/overlay.png -------------------------------------------------------------------------------- /static/template/css/datepicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Datepicker 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 | .datepicker { 10 | top: 0; 11 | left: 0; 12 | padding: 4px; 13 | margin-top: 1px; 14 | -webkit-border-radius: 4px; 15 | -moz-border-radius: 4px; 16 | border-radius: 4px; 17 | /*.dow { 18 | border-top: 1px solid #ddd !important; 19 | }*/ 20 | 21 | } 22 | .datepicker:before { 23 | content: ''; 24 | display: inline-block; 25 | border-left: 7px solid transparent; 26 | border-right: 7px solid transparent; 27 | border-bottom: 7px solid #ccc; 28 | border-bottom-color: rgba(0, 0, 0, 0.2); 29 | position: absolute; 30 | top: -7px; 31 | left: 6px; 32 | } 33 | .datepicker:after { 34 | content: ''; 35 | display: inline-block; 36 | border-left: 6px solid transparent; 37 | border-right: 6px solid transparent; 38 | border-bottom: 6px solid #ffffff; 39 | position: absolute; 40 | top: -6px; 41 | left: 7px; 42 | } 43 | .datepicker > div { 44 | display: none; 45 | } 46 | .datepicker table { 47 | width: 100%; 48 | margin: 0; 49 | } 50 | .datepicker td, 51 | .datepicker th { 52 | text-align: center; 53 | width: 20px; 54 | height: 20px; 55 | -webkit-border-radius: 4px; 56 | -moz-border-radius: 4px; 57 | border-radius: 4px; 58 | } 59 | .datepicker td.day:hover { 60 | background: #eeeeee; 61 | cursor: pointer; 62 | } 63 | .datepicker td.day.disabled { 64 | color: #eeeeee; 65 | } 66 | .datepicker td.old, 67 | .datepicker td.new { 68 | color: #999999; 69 | } 70 | .datepicker td.active, 71 | .datepicker td.active:hover { 72 | color: #ffffff; 73 | background-color: #006dcc; 74 | background-image: -moz-linear-gradient(top, #0088cc, #0044cc); 75 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); 76 | background-image: -webkit-linear-gradient(top, #A9E2F3, #A9E2F3); 77 | background-image: -o-linear-gradient(top, #0088cc, #0044cc); 78 | background-image: linear-gradient(to bottom, #0088ff, #0088ff); 79 | background-repeat: repeat-x; 80 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); 81 | border-color: #0044cc #0044cc #002a80; 82 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 83 | *background-color: #0044cc; 84 | /* Darken IE7 buttons by default so they stand out more given they won't have borders */ 85 | 86 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 87 | color: #fff; 88 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 89 | } 90 | .datepicker td.active:hover, 91 | .datepicker td.active:hover:hover, 92 | .datepicker td.active:focus, 93 | .datepicker td.active:hover:focus, 94 | .datepicker td.active:active, 95 | .datepicker td.active:hover:active, 96 | .datepicker td.active.active, 97 | .datepicker td.active:hover.active, 98 | .datepicker td.active.disabled, 99 | .datepicker td.active:hover.disabled, 100 | .datepicker td.active[disabled], 101 | .datepicker td.active:hover[disabled] { 102 | color: #ffffff; 103 | background-color: #0044cc; 104 | *background-color: #003bb3; 105 | } 106 | .datepicker td.active:active, 107 | .datepicker td.active:hover:active, 108 | .datepicker td.active.active, 109 | .datepicker td.active:hover.active { 110 | background-color: #003399 \9; 111 | } 112 | .datepicker td span { 113 | display: block; 114 | width: 47px; 115 | height: 54px; 116 | line-height: 54px; 117 | float: left; 118 | margin: 2px; 119 | cursor: pointer; 120 | -webkit-border-radius: 4px; 121 | -moz-border-radius: 4px; 122 | border-radius: 4px; 123 | } 124 | .datepicker td span:hover { 125 | background: #eeeeee; 126 | } 127 | .datepicker td span.active { 128 | color: #ffffff; 129 | background-color: #006dcc; 130 | background-image: -moz-linear-gradient(top, #0088cc, #0044cc); 131 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); 132 | background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); 133 | background-image: -o-linear-gradient(top, #0088cc, #0044cc); 134 | background-image: linear-gradient(to bottom, #0088cc, #0044cc); 135 | background-repeat: repeat-x; 136 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); 137 | border-color: #0044cc #0044cc #002a80; 138 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 139 | *background-color: #0044cc; 140 | /* Darken IE7 buttons by default so they stand out more given they won't have borders */ 141 | 142 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 143 | color: #fff; 144 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 145 | } 146 | .datepicker td span.active:hover, 147 | .datepicker td span.active:focus, 148 | .datepicker td span.active:active, 149 | .datepicker td span.active.active, 150 | .datepicker td span.active.disabled, 151 | .datepicker td span.active[disabled] { 152 | color: #ffffff; 153 | background-color: #0044cc; 154 | *background-color: #003bb3; 155 | } 156 | .datepicker td span.active:active, 157 | .datepicker td span.active.active { 158 | background-color: #003399 \9; 159 | } 160 | .datepicker td span.old { 161 | color: #999999; 162 | } 163 | .datepicker th.switch { 164 | width: 145px; 165 | } 166 | .datepicker th.next, 167 | .datepicker th.prev { 168 | font-size: 21px; 169 | } 170 | .datepicker thead tr:first-child th { 171 | cursor: pointer; 172 | } 173 | .datepicker thead tr:first-child th:hover { 174 | background: #eeeeee; 175 | } 176 | .input-append.date .add-on i, 177 | .input-prepend.date .add-on i { 178 | display: block; 179 | cursor: pointer; 180 | width: 16px; 181 | height: 16px; 182 | } -------------------------------------------------------------------------------- /static/template/css/dropzone/images/spritemap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/dropzone/images/spritemap.png -------------------------------------------------------------------------------- /static/template/css/dropzone/images/spritemap@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/dropzone/images/spritemap@2x.png -------------------------------------------------------------------------------- /static/template/css/endless-landing.min.css: -------------------------------------------------------------------------------- 1 | body{font-size:14px}#landing-content{padding-top:51px;min-height:800px}.navbar-toggle .icon-bar{background:#777}#main-slider .carousel-inner .item{overflow:hidden;opacity:0;height:500px;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}@media (max-width:480px){#main-slider .carousel-inner .item{height:200px}#main-slider .carousel-inner .item h2{font-size:17px}}@media (min-width:481px) and (max-width:767px){#main-slider .carousel-inner .item{height:300px}}@media (min-width:768px) and (max-width:979px){#main-slider .carousel-inner .item{height:400px}}#main-slider .carousel-inner .item .slide-caption{animation:none;-webkit-animation:none;-moz-animation:none;-ms-animation:none;-o-animation:none}#main-slider .carousel-inner .item.active{opacity:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item.left.active{left:0;opacity:0;z-index:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item.left.next{opacity:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item.right.active{left:0;opacity:0;z-index:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item.right.prev{opacity:1;transition:opacity .8s ease;-webkit-transition:opacity .8s ease;-moz-transition:opacity .8s ease;-ms-transition:opacity .8s ease;-o-transition:opacity .8s ease}#main-slider .carousel-inner .item .img-background{position:absolute;left:0;width:100%}#main-slider .carousel-control{background-image:none;z-index:2}#main-slider .carousel-control span{position:absolute;top:50%;left:50%;z-index:5;display:inline-block}.feature-icon{width:80px;height:80px;border-radius:50em;-moz-border-radius:50em;-webkit-border-radius:50em;background:rgba(0,0,0,.1);margin:0 auto 10px;cursor:pointer;transition:all .5s ease;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-ms-transition:all .5s ease;-o-transition:all .5s ease}.feature-icon [class*=fa-]{line-height:80px}.feature-icon:hover{background:#FC8675;color:#fff;text-shadow:none;transition:all .5s ease;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-ms-transition:all .5s ease;-o-transition:all .5s ease}.input-lg::-webkit-input-placeholder{font-size:17px;line-height:17px}.input-lg:-moz-placeholder{font-size:17px;line-height:17px}.input-lg::-moz-placeholder{font-size:17px;line-height:17px}.input-lg:-ms-input-placeholder{font-size:17px;line-height:17px}#newsletter{width:300px}@media (max-width:767px){#newsletter{width:100%}}.recent-work a{position:relative;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;color:#626262}.recent-work a img{width:100%}.recent-work a:hover{text-decoration:none}.recent-work a:hover img{opacity:.5;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.recent-work .detail{margin-bottom:30px}.hoverBorder:hover .hoverBorderWrapper .hoverBorderInner{box-shadow:0 0 0 3px #FC8675 inset;-moz-box-shadow:0 0 0 3px #FC8675 inset;-webkit-box-shadow:0 0 0 3px #FC8675 inset;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.hoverBorder:hover .hoverBorderWrapper .readMore{left:10px;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.hoverBorder .hoverBorderWrapper{position:relative;display:inline-block}.hoverBorder .hoverBorderWrapper .hoverBorderInner{display:block;position:absolute;top:0;left:0;right:0;bottom:0;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.hoverBorder .hoverBorderWrapper .readMore{position:absolute;bottom:10px;left:-20px;border:1px solid rgba(0,0,0,.2);background-color:#FC8675;color:#fff;padding:3px 12px;font-size:11px;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}footer{margin-left:0;background:#504f63;color:#d5d4dd}footer p{display:block}footer .useful-link li a{color:#d5d4dd;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}footer .useful-link li a:hover{color:#fff;transition:all .2s ease;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease}.social-connect{background:#d5d4dd;border-color:#d5d4dd;color:#777}.social-connect:hover{border-color:transparent}.animated-element{opacity:1}.animated-element.no-animation{visibility:hidden;animation:none!important;-webkit-animation:none!important;-moz-animation:none!important;-ms-animation:none!important;-o-animation:none!important}.font-lg{font-size:17px!important}.content-padding{padding:40px}@media (max-width:480px){.content-padding{padding:10px}}.m-top-lg{margin-top:100px}@media (max-width:480px){.m-top-lg{margin-top:20px}}@media (min-width:481px) and (max-width:767px){.m-top-lg{margin-top:50px}}.m-bottom-lg{margin-bottom:100px}@media (max-width:480px){.m-bottom-lg{margin-bottom:20px}}@media (min-width:481px) and (max-width:767px){.m-bottom-lg{margin-bottom:50px}}.m-top-md{margin-top:50px}.m-left-md{margin-left:50px}.m-right-md{margin-right:50px} -------------------------------------------------------------------------------- /static/template/css/gritter/images/gritter-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/gritter/images/gritter-light.png -------------------------------------------------------------------------------- /static/template/css/gritter/images/gritter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/gritter/images/gritter.png -------------------------------------------------------------------------------- /static/template/css/gritter/images/ie-spacer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/css/gritter/images/ie-spacer.gif -------------------------------------------------------------------------------- /static/template/css/gritter/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 | -------------------------------------------------------------------------------- /static/template/css/jcarousel.responsive.css: -------------------------------------------------------------------------------- 1 | .jcarousel-wrapper { 2 | margin: 20px auto; 3 | position: relative; 4 | border: 10px solid #fff; 5 | -webkit-border-radius: 5px; 6 | -moz-border-radius: 5px; 7 | border-radius: 5px; 8 | -webkit-box-shadow: 0 0 2px #999; 9 | -moz-box-shadow: 0 0 2px #999; 10 | box-shadow: 0 0 2px #999; 11 | } 12 | 13 | /** Carousel **/ 14 | 15 | .jcarousel { 16 | position: relative; 17 | overflow: hidden; 18 | width: 100%; 19 | } 20 | 21 | .jcarousel ul { 22 | width: 20000em; 23 | position: relative; 24 | list-style: none; 25 | margin: 0; 26 | padding: 0; 27 | } 28 | 29 | .jcarousel li { 30 | width: 200px; 31 | float: left; 32 | border: 1px solid #fff; 33 | -moz-box-sizing: border-box; 34 | -webkit-box-sizing: border-box; 35 | box-sizing: border-box; 36 | } 37 | 38 | .jcarousel img { 39 | display: block; 40 | max-width: 100%; 41 | height: auto !important; 42 | } 43 | 44 | /** Carousel Controls **/ 45 | 46 | .jcarousel-control-prev, 47 | .jcarousel-control-next { 48 | position: absolute; 49 | top: 50%; 50 | margin-top: -15px; 51 | width: 30px; 52 | height: 30px; 53 | text-align: center; 54 | background: #4E443C; 55 | color: #fff; 56 | text-decoration: none; 57 | text-shadow: 0 0 1px #000; 58 | font: 24px/27px Arial, sans-serif; 59 | -webkit-border-radius: 30px; 60 | -moz-border-radius: 30px; 61 | border-radius: 30px; 62 | -webkit-box-shadow: 0 0 4px #F0EFE7; 63 | -moz-box-shadow: 0 0 4px #F0EFE7; 64 | box-shadow: 0 0 4px #F0EFE7; 65 | } 66 | 67 | .jcarousel-control-prev { 68 | left: 15px; 69 | } 70 | 71 | .jcarousel-control-next { 72 | right: 15px; 73 | } 74 | 75 | /** Carousel Pagination **/ 76 | 77 | .jcarousel-pagination { 78 | position: absolute; 79 | bottom: -40px; 80 | left: 50%; 81 | -webkit-transform: translate(-50%, 0); 82 | -ms-transform: translate(-50%, 0); 83 | transform: translate(-50%, 0); 84 | margin: 0; 85 | } 86 | 87 | .jcarousel-pagination a { 88 | text-decoration: none; 89 | display: inline-block; 90 | 91 | font-size: 11px; 92 | height: 10px; 93 | width: 10px; 94 | line-height: 10px; 95 | 96 | background: #fff; 97 | color: #4E443C; 98 | border-radius: 10px; 99 | text-indent: -9999px; 100 | 101 | margin-right: 7px; 102 | 103 | 104 | -webkit-box-shadow: 0 0 2px #4E443C; 105 | -moz-box-shadow: 0 0 2px #4E443C; 106 | box-shadow: 0 0 2px #4E443C; 107 | } 108 | 109 | .jcarousel-pagination a.active { 110 | background: #4E443C; 111 | color: #fff; 112 | opacity: 1; 113 | 114 | -webkit-box-shadow: 0 0 2px #F0EFE7; 115 | -moz-box-shadow: 0 0 2px #F0EFE7; 116 | box-shadow: 0 0 2px #F0EFE7; 117 | } 118 | -------------------------------------------------------------------------------- /static/template/css/jquery.dataTables_themeroller.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | * Table 5 | */ 6 | table.dataTable { 7 | margin: 0 auto; 8 | clear: both; 9 | width: 100%; 10 | border-collapse: collapse; 11 | } 12 | 13 | table.dataTable thead th { 14 | padding: 3px 0px 3px 10px; 15 | cursor: pointer; 16 | *cursor: hand; 17 | } 18 | 19 | table.dataTable tfoot th { 20 | padding: 3px 10px; 21 | } 22 | 23 | table.dataTable td { 24 | padding: 3px 10px; 25 | } 26 | 27 | table.dataTable td.center, 28 | table.dataTable td.dataTables_empty { 29 | text-align: center; 30 | } 31 | 32 | table.dataTable tr.odd { background-color: #E2E4FF; } 33 | table.dataTable tr.even { background-color: white; } 34 | 35 | table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; } 36 | table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; } 37 | table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; } 38 | table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; } 39 | table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; } 40 | table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; } 41 | 42 | 43 | /* 44 | * Table wrapper 45 | */ 46 | .dataTables_wrapper { 47 | position: relative; 48 | clear: both; 49 | *zoom: 1; 50 | } 51 | .dataTables_wrapper .ui-widget-header { 52 | font-weight: normal; 53 | } 54 | .dataTables_wrapper .ui-toolbar { 55 | padding: 5px; 56 | } 57 | 58 | 59 | /* 60 | * Page length menu 61 | */ 62 | .dataTables_length { 63 | float: left; 64 | } 65 | 66 | 67 | /* 68 | * Filter 69 | */ 70 | .dataTables_filter { 71 | float: right; 72 | text-align: right; 73 | } 74 | 75 | 76 | /* 77 | * Table information 78 | */ 79 | .dataTables_info { 80 | padding-top: 3px; 81 | clear: both; 82 | float: left; 83 | } 84 | 85 | 86 | /* 87 | * Pagination 88 | */ 89 | .dataTables_paginate { 90 | float: right; 91 | text-align: right; 92 | } 93 | 94 | .dataTables_paginate .ui-button { 95 | margin-right: -0.1em !important; 96 | } 97 | 98 | .paging_two_button .ui-button { 99 | float: left; 100 | cursor: pointer; 101 | * cursor: hand; 102 | } 103 | 104 | .paging_full_numbers .ui-button { 105 | padding: 2px 6px; 106 | margin: 0; 107 | cursor: pointer; 108 | * cursor: hand; 109 | color: #333 !important; 110 | } 111 | 112 | /* Two button pagination - previous / next */ 113 | .paginate_disabled_previous, 114 | .paginate_enabled_previous, 115 | .paginate_disabled_next, 116 | .paginate_enabled_next { 117 | height: 19px; 118 | float: left; 119 | cursor: pointer; 120 | *cursor: hand; 121 | color: #111 !important; 122 | } 123 | .paginate_disabled_previous:hover, 124 | .paginate_enabled_previous:hover, 125 | .paginate_disabled_next:hover, 126 | .paginate_enabled_next:hover { 127 | text-decoration: none !important; 128 | } 129 | .paginate_disabled_previous:active, 130 | .paginate_enabled_previous:active, 131 | .paginate_disabled_next:active, 132 | .paginate_enabled_next:active { 133 | outline: none; 134 | } 135 | 136 | .paginate_disabled_previous, 137 | .paginate_disabled_next { 138 | color: #666 !important; 139 | } 140 | .paginate_disabled_previous, 141 | .paginate_enabled_previous { 142 | padding-left: 23px; 143 | } 144 | .paginate_disabled_next, 145 | .paginate_enabled_next { 146 | padding-right: 23px; 147 | margin-left: 10px; 148 | } 149 | 150 | .paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; } 151 | .paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; } 152 | .paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; } 153 | 154 | .paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; } 155 | .paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; } 156 | .paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; } 157 | 158 | /* Full number pagination */ 159 | .paging_full_numbers a:active { 160 | outline: none 161 | } 162 | .paging_full_numbers a:hover { 163 | text-decoration: none; 164 | } 165 | 166 | .paging_full_numbers a.paginate_button, 167 | .paging_full_numbers a.paginate_active { 168 | border: 1px solid #aaa; 169 | -webkit-border-radius: 5px; 170 | -moz-border-radius: 5px; 171 | border-radius: 5px; 172 | padding: 2px 5px; 173 | margin: 0 3px; 174 | cursor: pointer; 175 | *cursor: hand; 176 | color: #333 !important; 177 | } 178 | 179 | .paging_full_numbers a.paginate_button { 180 | background-color: #ddd; 181 | } 182 | 183 | .paging_full_numbers a.paginate_button:hover { 184 | background-color: #ccc; 185 | text-decoration: none !important; 186 | } 187 | 188 | .paging_full_numbers a.paginate_active { 189 | background-color: #99B3FF; 190 | } 191 | 192 | 193 | /* 194 | * Processing indicator 195 | */ 196 | .dataTables_processing { 197 | position: absolute; 198 | top: 50%; 199 | left: 50%; 200 | width: 250px; 201 | height: 30px; 202 | margin-left: -125px; 203 | margin-top: -15px; 204 | padding: 14px 0 2px 0; 205 | border: 1px solid #ddd; 206 | text-align: center; 207 | color: #999; 208 | font-size: 14px; 209 | background-color: white; 210 | } 211 | 212 | 213 | /* 214 | * Sorting 215 | */ 216 | table.dataTable thead th div.DataTables_sort_wrapper { 217 | position: relative; 218 | padding-right: 20px; 219 | } 220 | 221 | table.dataTable thead th div.DataTables_sort_wrapper span { 222 | position: absolute; 223 | top: 50%; 224 | margin-top: -8px; 225 | right: 0; 226 | } 227 | 228 | table.dataTable th:active { 229 | outline: none; 230 | } 231 | 232 | 233 | /* 234 | * Scrolling 235 | */ 236 | .dataTables_scroll { 237 | clear: both; 238 | } 239 | 240 | .dataTables_scrollBody { 241 | *margin-top: -1px; 242 | -webkit-overflow-scrolling: touch; 243 | } 244 | 245 | -------------------------------------------------------------------------------- /static/template/css/jquery.tagsinput.css: -------------------------------------------------------------------------------- 1 | div.tagsinput { border:1px solid #CCC; background: #FFF; padding:5px; width:300px; height:100px; overflow-y: auto;} 2 | div.tagsinput span.tag { border: 1px solid #a5d24a; -moz-border-radius:2px; -webkit-border-radius:2px; display: block; float: left; padding: 5px; text-decoration:none; background: #cde69c; color: #638421; margin-right: 5px; margin-bottom:5px;font-family: helvetica; font-size:13px;} 3 | div.tagsinput span.tag a { font-weight: bold; color: #82ad2b; text-decoration:none; font-size: 11px; } 4 | div.tagsinput input { width:80px; margin:0px; font-family: helvetica; font-size: 13px; border:1px solid transparent; padding:5px; background: transparent; color: #000; outline:0px; margin-right:5px; margin-bottom:5px; } 5 | div.tagsinput div { display:block; float: left; } 6 | .tags_clear { clear: both; width: 100%; height: 0px; } 7 | .not_valid {background: #FBD8DB !important; color: #90111A !important;} 8 | -------------------------------------------------------------------------------- /static/template/css/morris.css: -------------------------------------------------------------------------------- 1 | .morris-hover{position:absolute;z-index:1000;}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255, 255, 255, 0.8);border:solid 2px rgba(230, 230, 230, 0.8);font-family:sans-serif;font-size:12px;text-align:center;}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0;} 2 | .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0;} 3 | -------------------------------------------------------------------------------- /static/template/css/pace.css: -------------------------------------------------------------------------------- 1 | /* This is a compiled file, you should be editing the file in the templates directory */ 2 | .pace { 3 | -webkit-pointer-events: none; 4 | pointer-events: none; 5 | -webkit-user-select: none; 6 | -moz-user-select: none; 7 | user-select: none; 8 | } 9 | 10 | .pace-inactive { 11 | display: none; 12 | } 13 | 14 | .pace .pace-progress { 15 | background: #29d; 16 | position: fixed; 17 | z-index: 2000; 18 | top: 0; 19 | left: 0; 20 | height: 2px; 21 | 22 | -webkit-transition: width 1s; 23 | -moz-transition: width 1s; 24 | -o-transition: width 1s; 25 | transition: width 1s; 26 | } 27 | 28 | .pace .pace-progress-inner { 29 | display: block; 30 | position: absolute; 31 | right: 0px; 32 | width: 100px; 33 | height: 100%; 34 | box-shadow: 0 0 10px #29d, 0 0 5px #29d; 35 | opacity: 1.0; 36 | -webkit-transform: rotate(3deg) translate(0px, -4px); 37 | -moz-transform: rotate(3deg) translate(0px, -4px); 38 | -ms-transform: rotate(3deg) translate(0px, -4px); 39 | -o-transform: rotate(3deg) translate(0px, -4px); 40 | transform: rotate(3deg) translate(0px, -4px); 41 | } 42 | 43 | .pace .pace-activity { 44 | display: block; 45 | position: fixed; 46 | z-index: 2000; 47 | top: 15px; 48 | right: 15px; 49 | width: 14px; 50 | height: 14px; 51 | border: solid 2px transparent; 52 | border-top-color: #29d; 53 | border-left-color: #29d; 54 | border-radius: 10px; 55 | -webkit-animation: pace-spinner 400ms linear infinite; 56 | -moz-animation: pace-spinner 400ms linear infinite; 57 | -ms-animation: pace-spinner 400ms linear infinite; 58 | -o-animation: pace-spinner 400ms linear infinite; 59 | animation: pace-spinner 400ms linear infinite; 60 | } 61 | 62 | @-webkit-keyframes pace-spinner { 63 | 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 64 | 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } 65 | } 66 | @-moz-keyframes pace-spinner { 67 | 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 68 | 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } 69 | } 70 | @-o-keyframes pace-spinner { 71 | 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 72 | 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } 73 | } 74 | @-ms-keyframes pace-spinner { 75 | 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 76 | 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } 77 | } 78 | @keyframes pace-spinner { 79 | 0% { transform: rotate(0deg); transform: rotate(0deg); } 80 | 100% { transform: rotate(360deg); transform: rotate(360deg); } 81 | } 82 | -------------------------------------------------------------------------------- /static/template/css/prettify.css: -------------------------------------------------------------------------------- 1 | /* Pretty printing styles. Used with prettify.js. */ 2 | 3 | /* SPAN elements with the classes below are added by prettyprint. */ 4 | .pln { color: #000 } /* plain text */ 5 | 6 | @media screen { 7 | .str { color: #080 } /* string content */ 8 | .kwd { color: #008 } /* a keyword */ 9 | .com { color: #800 } /* a comment */ 10 | .typ { color: #606 } /* a type name */ 11 | .lit { color: #066 } /* a literal value */ 12 | /* punctuation, lisp open bracket, lisp close bracket */ 13 | .pun, .opn, .clo { color: #660 } 14 | .tag { color: #008 } /* a markup tag name */ 15 | .atn { color: #606 } /* a markup attribute name */ 16 | .atv { color: #080 } /* a markup attribute value */ 17 | .dec, .var { color: #606 } /* a declaration; a variable name */ 18 | .fun { color: red } /* a function name */ 19 | } 20 | 21 | /* Use higher contrast and text-weight for printable form. */ 22 | @media print, projection { 23 | .str { color: #060 } 24 | .kwd { color: #006; font-weight: bold } 25 | .com { color: #600; font-style: italic } 26 | .typ { color: #404; font-weight: bold } 27 | .lit { color: #044 } 28 | .pun, .opn, .clo { color: #440 } 29 | .tag { color: #006; font-weight: bold } 30 | .atn { color: #404 } 31 | .atv { color: #060 } 32 | } 33 | 34 | /* Put a border around prettyprinted code snippets. */ 35 | pre.prettyprint { padding: 2px; border: 1px solid #888 } 36 | 37 | /* Specify class=linenums on a pre to get line numbering */ 38 | ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ 39 | li.L0, 40 | li.L1, 41 | li.L2, 42 | li.L3, 43 | li.L5, 44 | li.L6, 45 | li.L7, 46 | li.L8 { list-style-type: none } 47 | /* Alternate shading for lines */ 48 | li.L1, 49 | li.L3, 50 | li.L5, 51 | li.L7, 52 | li.L9 { background: #eee } 53 | -------------------------------------------------------------------------------- /static/template/css/slider.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Slider 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 | .slider { 10 | display: inline-block; 11 | vertical-align: middle; 12 | position: relative; 13 | } 14 | .slider.slider-horizontal { 15 | width: 210px; 16 | height: 20px; 17 | } 18 | .slider.slider-horizontal .slider-track { 19 | height: 10px; 20 | width: 100%; 21 | margin-top: -5px; 22 | top: 50%; 23 | left: 0; 24 | } 25 | .slider.slider-horizontal .slider-selection { 26 | height: 100%; 27 | top: 0; 28 | bottom: 0; 29 | } 30 | .slider.slider-horizontal .slider-handle { 31 | margin-left: -10px; 32 | margin-top: -5px; 33 | } 34 | .slider.slider-horizontal .slider-handle.triangle { 35 | border-width: 0 10px 10px 10px; 36 | width: 0; 37 | height: 0; 38 | border-bottom-color: #0480be; 39 | margin-top: 0; 40 | } 41 | .slider.slider-vertical { 42 | height: 210px; 43 | width: 20px; 44 | } 45 | .slider.slider-vertical .slider-track { 46 | width: 10px; 47 | height: 100%; 48 | margin-left: -5px; 49 | left: 50%; 50 | top: 0; 51 | } 52 | .slider.slider-vertical .slider-selection { 53 | width: 100%; 54 | left: 0; 55 | top: 0; 56 | bottom: 0; 57 | } 58 | .slider.slider-vertical .slider-handle { 59 | margin-left: -5px; 60 | margin-top: -10px; 61 | } 62 | .slider.slider-vertical .slider-handle.triangle { 63 | border-width: 10px 0 10px 10px; 64 | width: 1px; 65 | height: 1px; 66 | border-left-color: #0480be; 67 | margin-left: 0; 68 | } 69 | .slider input { 70 | display: none; 71 | } 72 | .slider .tooltip-inner { 73 | white-space: nowrap; 74 | } 75 | .slider-track { 76 | position: absolute; 77 | cursor: pointer; 78 | background-color: #f7f7f7; 79 | background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); 80 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); 81 | background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); 82 | background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); 83 | background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); 84 | background-repeat: repeat-x; 85 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); 86 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 87 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 88 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 89 | -webkit-border-radius: 4px; 90 | -moz-border-radius: 4px; 91 | border-radius: 4px; 92 | } 93 | .slider-selection { 94 | position: absolute; 95 | background-color: #f7f7f7; 96 | background-image: -moz-linear-gradient(top, #f9f9f9, #f5f5f5); 97 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#f5f5f5)); 98 | background-image: -webkit-linear-gradient(top, #f9f9f9, #f5f5f5); 99 | background-image: -o-linear-gradient(top, #f9f9f9, #f5f5f5); 100 | background-image: linear-gradient(to bottom, #f9f9f9, #f5f5f5); 101 | background-repeat: repeat-x; 102 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0); 103 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 104 | -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 105 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 106 | -webkit-box-sizing: border-box; 107 | -moz-box-sizing: border-box; 108 | box-sizing: border-box; 109 | -webkit-border-radius: 4px; 110 | -moz-border-radius: 4px; 111 | border-radius: 4px; 112 | } 113 | .slider-handle { 114 | position: absolute; 115 | width: 20px; 116 | height: 20px; 117 | background-color: #0e90d2; 118 | background-image: -moz-linear-gradient(top, #149bdf, #0480be); 119 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); 120 | background-image: -webkit-linear-gradient(top, #149bdf, #0480be); 121 | background-image: -o-linear-gradient(top, #149bdf, #0480be); 122 | background-image: linear-gradient(to bottom, #149bdf, #0480be); 123 | background-repeat: repeat-x; 124 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); 125 | -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 126 | -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 127 | box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); 128 | opacity: 0.8; 129 | border: 0px solid transparent; 130 | } 131 | .slider-handle.round { 132 | -webkit-border-radius: 20px; 133 | -moz-border-radius: 20px; 134 | border-radius: 20px; 135 | } 136 | .slider-handle.triangle { 137 | background: transparent none; 138 | } -------------------------------------------------------------------------------- /static/template/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/template/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/template/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/template/img/email_template/color1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/email_template/color1.png -------------------------------------------------------------------------------- /static/template/img/email_template/color2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/email_template/color2.png -------------------------------------------------------------------------------- /static/template/img/email_template/color3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/email_template/color3.png -------------------------------------------------------------------------------- /static/template/img/email_template/color4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/email_template/color4.png -------------------------------------------------------------------------------- /static/template/img/email_template/color5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/email_template/color5.png -------------------------------------------------------------------------------- /static/template/img/email_template/color6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/email_template/color6.png -------------------------------------------------------------------------------- /static/template/img/gallery1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery1.jpg -------------------------------------------------------------------------------- /static/template/img/gallery10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery10.jpg -------------------------------------------------------------------------------- /static/template/img/gallery11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery11.jpg -------------------------------------------------------------------------------- /static/template/img/gallery12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery12.jpg -------------------------------------------------------------------------------- /static/template/img/gallery13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery13.jpg -------------------------------------------------------------------------------- /static/template/img/gallery14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery14.jpg -------------------------------------------------------------------------------- /static/template/img/gallery15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery15.jpg -------------------------------------------------------------------------------- /static/template/img/gallery2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery2.jpg -------------------------------------------------------------------------------- /static/template/img/gallery3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery3.jpg -------------------------------------------------------------------------------- /static/template/img/gallery4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery4.jpg -------------------------------------------------------------------------------- /static/template/img/gallery5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery5.jpg -------------------------------------------------------------------------------- /static/template/img/gallery6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery6.jpg -------------------------------------------------------------------------------- /static/template/img/gallery7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery7.jpg -------------------------------------------------------------------------------- /static/template/img/gallery8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery8.jpg -------------------------------------------------------------------------------- /static/template/img/gallery9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/gallery9.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview1.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview10.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview11.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview12.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview13.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview14.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview15.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview2.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview3.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview4.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview5.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview6.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview7.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview8.jpg -------------------------------------------------------------------------------- /static/template/img/movie/preview9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/movie/preview9.jpg -------------------------------------------------------------------------------- /static/template/img/responsive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/responsive.png -------------------------------------------------------------------------------- /static/template/img/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/screenshot.jpg -------------------------------------------------------------------------------- /static/template/img/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/user.jpg -------------------------------------------------------------------------------- /static/template/img/user2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/user2.jpg -------------------------------------------------------------------------------- /static/template/img/user3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/user3.jpg -------------------------------------------------------------------------------- /static/template/img/user4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/user4.jpg -------------------------------------------------------------------------------- /static/template/img/user5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/img/user5.jpg -------------------------------------------------------------------------------- /static/template/js/bootstrap-slider.min.js: -------------------------------------------------------------------------------- 1 | /* ========================================================= 2 | * bootstrap-slider.js v2.0.0 3 | * http://www.eyecon.ro/bootstrap-slider 4 | * ========================================================= 5 | * Copyright 2012 Stefan Petre 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================= */ 19 | 20 | !function(e){var t=function(t,n){this.element=e(t);this.picker=e('
'+'
'+'
'+'
'+'
'+"
"+'
'+"
").insertBefore(this.element).append(this.element);this.id=this.element.data("slider-id")||n.id;if(this.id){this.picker[0].id=this.id}if(typeof Modernizr!=="undefined"&&Modernizr.touch){this.touchCapable=true}var r=this.element.data("slider-tooltip")||n.tooltip;this.tooltip=this.picker.find(".tooltip");this.tooltipInner=this.tooltip.find("div.tooltip-inner");this.orientation=this.element.data("slider-orientation")||n.orientation;switch(this.orientation){case"vertical":this.picker.addClass("slider-vertical");this.stylePos="top";this.mousePos="pageY";this.sizePos="offsetHeight";this.tooltip.addClass("right")[0].style.left="100%";break;default:this.picker.addClass("slider-horizontal").css("width",this.element.outerWidth());this.orientation="horizontal";this.stylePos="left";this.mousePos="pageX";this.sizePos="offsetWidth";this.tooltip.addClass("top")[0].style.top=-this.tooltip.outerHeight()-14+"px";break}this.min=this.element.data("slider-min")||n.min;this.max=this.element.data("slider-max")||n.max;this.step=this.element.data("slider-step")||n.step;this.value=this.element.data("slider-value")||n.value;if(this.value[1]){this.range=true}this.selection=this.element.data("slider-selection")||n.selection;this.selectionEl=this.picker.find(".slider-selection");if(this.selection==="none"){this.selectionEl.addClass("hide")}this.selectionElStyle=this.selectionEl[0].style;this.handle1=this.picker.find(".slider-handle:first");this.handle1Stype=this.handle1[0].style;this.handle2=this.picker.find(".slider-handle:last");this.handle2Stype=this.handle2[0].style;var i=this.element.data("slider-handle")||n.handle;switch(i){case"round":this.handle1.addClass("round");this.handle2.addClass("round");break;case"triangle":this.handle1.addClass("triangle");this.handle2.addClass("triangle");break}if(this.range){this.value[0]=Math.max(this.min,Math.min(this.max,this.value[0]));this.value[1]=Math.max(this.min,Math.min(this.max,this.value[1]))}else{this.value=[Math.max(this.min,Math.min(this.max,this.value))];this.handle2.addClass("hide");if(this.selection=="after"){this.value[1]=this.max}else{this.value[1]=this.min}}this.diff=this.max-this.min;this.percentage=[(this.value[0]-this.min)*100/this.diff,(this.value[1]-this.min)*100/this.diff,this.step*100/this.diff];this.offset=this.picker.offset();this.size=this.picker[0][this.sizePos];this.formater=n.formater;this.layout();if(this.touchCapable){this.picker.on({touchstart:e.proxy(this.mousedown,this)})}else{this.picker.on({mousedown:e.proxy(this.mousedown,this)})}if(r==="show"){this.picker.on({mouseenter:e.proxy(this.showTooltip,this),mouseleave:e.proxy(this.hideTooltip,this)})}else{this.tooltip.addClass("hide")}};t.prototype={constructor:t,over:false,inDrag:false,showTooltip:function(){this.tooltip.addClass("in");this.over=true},hideTooltip:function(){if(this.inDrag===false){this.tooltip.removeClass("in")}this.over=false},layout:function(){this.handle1Stype[this.stylePos]=this.percentage[0]+"%";this.handle2Stype[this.stylePos]=this.percentage[1]+"%";if(this.orientation=="vertical"){this.selectionElStyle.top=Math.min(this.percentage[0],this.percentage[1])+"%";this.selectionElStyle.height=Math.abs(this.percentage[0]-this.percentage[1])+"%"}else{this.selectionElStyle.left=Math.min(this.percentage[0],this.percentage[1])+"%";this.selectionElStyle.width=Math.abs(this.percentage[0]-this.percentage[1])+"%"}if(this.range){this.tooltipInner.text(this.formater(this.value[0])+" : "+this.formater(this.value[1]));this.tooltip[0].style[this.stylePos]=this.size*(this.percentage[0]+(this.percentage[1]-this.percentage[0])/2)/100-(this.orientation==="vertical"?this.tooltip.outerHeight()/2:this.tooltip.outerWidth()/2)+"px"}else{this.tooltipInner.text(this.formater(this.value[0]));this.tooltip[0].style[this.stylePos]=this.size*this.percentage[0]/100-(this.orientation==="vertical"?this.tooltip.outerHeight()/2:this.tooltip.outerWidth()/2)+"px"}},mousedown:function(t){if(this.touchCapable&&t.type==="touchstart"){t=t.originalEvent}this.offset=this.picker.offset();this.size=this.picker[0][this.sizePos];var n=this.getPercentage(t);if(this.range){var r=Math.abs(this.percentage[0]-n);var i=Math.abs(this.percentage[1]-n);this.dragged=rt){this.percentage[1]=this.percentage[0];this.dragged=0}}this.percentage[this.dragged]=t;this.layout();var n=this.calculateValue();this.element.trigger({type:"slide",value:n}).data("value",n).prop("value",n);return false},mouseup:function(t){if(this.touchCapable){e(document).off({touchmove:this.mousemove,touchend:this.mouseup})}else{e(document).off({mousemove:this.mousemove,mouseup:this.mouseup})}this.inDrag=false;if(this.over==false){this.hideTooltip()}this.element;var n=this.calculateValue();this.element.trigger({type:"slideStop",value:n}).data("value",n).prop("value",n);return false},calculateValue:function(){var e;if(this.range){e=[this.min+Math.round(this.diff*this.percentage[0]/100/this.step)*this.step,this.min+Math.round(this.diff*this.percentage[1]/100/this.step)*this.step];this.value=e}else{e=this.min+Math.round(this.diff*this.percentage[0]/100/this.step)*this.step;this.value=[e,this.value[1]]}return e},getPercentage:function(e){if(this.touchCapable){e=e.touches[0]}var t=(e[this.mousePos]-this.offset[this.stylePos])*100/this.size;t=Math.round(t/this.percentage[2])*this.percentage[2];return Math.max(0,Math.min(100,t))},getValue:function(){if(this.range){return this.value}return this.value[0]},setValue:function(e){this.value=e;if(this.range){this.value[0]=Math.max(this.min,Math.min(this.max,this.value[0]));this.value[1]=Math.max(this.min,Math.min(this.max,this.value[1]))}else{this.value=[Math.max(this.min,Math.min(this.max,this.value))];this.handle2.addClass("hide");if(this.selection=="after"){this.value[1]=this.max}else{this.value[1]=this.min}}this.diff=this.max-this.min;this.percentage=[(this.value[0]-this.min)*100/this.diff,(this.value[1]-this.min)*100/this.diff,this.step*100/this.diff];this.layout()}};e.fn.slider=function(n,r){return this.each(function(){var i=e(this),s=i.data("slider"),o=typeof n==="object"&&n;if(!s){i.data("slider",s=new t(this,e.extend({},e.fn.slider.defaults,o)))}if(typeof n=="string"){s[n](r)}})};e.fn.slider.defaults={min:0,max:10,step:1,orientation:"horizontal",value:5,selection:"before",tooltip:"show",handle:"round",formater:function(e){return e}};e.fn.slider.Constructor=t}(window.jQuery) -------------------------------------------------------------------------------- /static/template/js/endless/endless_dashboard.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | //Flot Chart 4 | //Website traffic chart 5 | var init = { data: [[0, 5], [1, 8], [2, 5], [3, 8], [4, 7], [5,9], [6, 8], [7, 8], [8, 10], [9, 12], [10, 10]], 6 | label: "Visitor" 7 | }, 8 | options = { 9 | series: { 10 | lines: { 11 | show: true, 12 | fill: true, 13 | fillColor: 'rgba(121,206,167,0.2)' 14 | }, 15 | points: { 16 | show: true, 17 | radius: '4.5' 18 | } 19 | }, 20 | grid: { 21 | hoverable: true, 22 | clickable: true 23 | }, 24 | colors: ["#37b494"] 25 | }, 26 | plot; 27 | 28 | plot = $.plot($('#placeholder'), [init], options); 29 | 30 | $("
").css({ 31 | position: "absolute", 32 | display: "none", 33 | border: "1px solid #222", 34 | padding: "4px", 35 | color: "#fff", 36 | "border-radius": "4px", 37 | "background-color": "rgb(0,0,0)", 38 | opacity: 0.90 39 | }).appendTo("body"); 40 | 41 | $("#placeholder").bind("plothover", function (event, pos, item) { 42 | 43 | var str = "(" + pos.x.toFixed(2) + ", " + pos.y.toFixed(2) + ")"; 44 | $("#hoverdata").text(str); 45 | 46 | if (item) { 47 | var x = item.datapoint[0], 48 | y = item.datapoint[1]; 49 | 50 | $("#tooltip").html("Visitor : " + y) 51 | .css({top: item.pageY+5, left: item.pageX+5}) 52 | .fadeIn(200); 53 | } else { 54 | $("#tooltip").hide(); 55 | } 56 | }); 57 | 58 | $("#placeholder").bind("plotclick", function (event, pos, item) { 59 | if (item) { 60 | $("#clickdata").text(" - click point " + item.dataIndex + " in " + item.series.label); 61 | plot.highlight(item.series, item.datapoint); 62 | } 63 | }); 64 | 65 | var animate = function () { 66 | $('#placeholder').animate( {tabIndex: 0}, { 67 | duration: 3000, 68 | step: function ( now, fx ) { 69 | 70 | var r = $.map( init.data, function ( o ) { 71 | return [[ o[0], o[1] * fx.pos ]]; 72 | }); 73 | 74 | plot.setData( [{ data: r }] ); 75 | plot.draw(); 76 | } 77 | }); 78 | } 79 | 80 | animate(); 81 | 82 | //Morris Chart 83 | var donutChart = Morris.Donut({ 84 | element: 'donutChart', 85 | data: [ 86 | {label: "Download Sales", value: 1236}, 87 | {label: "In-Store Sales", value: 3091}, 88 | {label: "Mail-Order Sales", value: 2781} 89 | ], 90 | colors: ['#f3ce85','#65CEA7' ,'#FC8675'] 91 | }); 92 | 93 | var lineChart = Morris.Line({ 94 | element: 'lineChart', 95 | data: [ 96 | { y: '2006', a: 30, b: 20 }, 97 | { y: '2007', a: 45, b: 35 }, 98 | { y: '2008', a: 60, b: 60 }, 99 | { y: '2009', a: 75, b: 65 }, 100 | { y: '2010', a: 50, b: 70 }, 101 | { y: '2011', a: 80, b: 85 }, 102 | { y: '2012', a: 100, b: 90 } 103 | ], 104 | xkey: 'y', 105 | grid: false, 106 | ykeys: ['a', 'b'], 107 | labels: ['Item A', 'Item B'], 108 | lineColors: ['#8CB4BC', '#538792'], 109 | gridTextColor : '#fff' 110 | }); 111 | 112 | var barChart = Morris.Bar({ 113 | element: 'barChart', 114 | data: [ 115 | { y: '2006', a: 100, b: 90 }, 116 | { y: '2007', a: 75, b: 65 }, 117 | { y: '2008', a: 50, b: 40 }, 118 | { y: '2009', a: 75, b: 65 }, 119 | { y: '2010', a: 50, b: 40 }, 120 | { y: '2011', a: 75, b: 65 }, 121 | { y: '2012', a: 100, b: 90 } 122 | ], 123 | xkey: 'y', 124 | ykeys: ['a', 'b'], 125 | grid: false, 126 | labels: ['Item C', 'Item D'], 127 | barColors: ['#5EE1B1', '#3BC894'], 128 | gridTextColor : '#fff' 129 | }); 130 | 131 | //Sparkline 132 | $('#visits').sparkline([15,19,20,22,33,27,31,27,19,30,21,10,15,18,25,9], { 133 | type: 'bar', 134 | barColor: '#FC8675', 135 | height:'35px', 136 | weight:'96px' 137 | }); 138 | $('#balances').sparkline([220,160,189,156,201,220,104,242,221,111,164,242,183,165], { 139 | type: 'bar', 140 | barColor: '#65CEA7', 141 | height:'35px', 142 | weight:'96px' 143 | }); 144 | 145 | //Timeline color box 146 | $('.timeline-img').colorbox({ 147 | rel:'group1', 148 | width:"90%", 149 | maxWidth:'800px' 150 | }); 151 | 152 | //Resize graph when toggle side menu 153 | $('.navbar-toggle').click(function() { 154 | setTimeout(function() { 155 | donutChart.redraw(); 156 | lineChart.redraw(); 157 | barChart.redraw(); 158 | 159 | $.plot($('#placeholder'), [init], options); 160 | },500); 161 | }); 162 | 163 | $('.size-toggle').click(function() { 164 | //resize morris chart 165 | setTimeout(function() { 166 | donutChart.redraw(); 167 | lineChart.redraw(); 168 | barChart.redraw(); 169 | 170 | $.plot($('#placeholder'), [init], options); 171 | },500); 172 | }); 173 | 174 | //Refresh statistic widget 175 | $('.refresh-button').click(function() { 176 | var _overlayDiv = $(this).parent().children('.loading-overlay'); 177 | _overlayDiv.addClass('active'); 178 | 179 | setTimeout(function() { 180 | _overlayDiv.removeClass('active'); 181 | }, 2000); 182 | 183 | return false; 184 | }); 185 | 186 | $(window).resize(function(e) { 187 | 188 | //Sparkline 189 | $('#visits').sparkline([15,19,20,22,33,27,31,27,19,30,21,10,15,18,25,9], { 190 | type: 'bar', 191 | barColor: '#fa4c38', 192 | height:'35px', 193 | weight:'96px' 194 | }); 195 | $('#balances').sparkline([220,160,189,156,201,220,104,242,221,111,164,242,183,165], { 196 | type: 'bar', 197 | barColor: '#92cf5c', 198 | height:'35px', 199 | weight:'96px' 200 | }); 201 | 202 | //resize morris chart 203 | setTimeout(function() { 204 | donutChart.redraw(); 205 | lineChart.redraw(); 206 | barChart.redraw(); 207 | 208 | $.plot($('#placeholder'), [init], options); 209 | },500); 210 | }); 211 | 212 | $(window).load(function(e) { 213 | 214 | //Number Animation 215 | var currentUser = $('#userCount').text(); 216 | $({numberValue: 0}).animate({numberValue: currentUser}, { 217 | duration: 2500, 218 | easing: 'linear', 219 | step: function() { 220 | $('#userCount').text(Math.ceil(this.numberValue)); 221 | } 222 | }); 223 | 224 | var currentServerload = $('#serverloadCount').text(); 225 | $({numberValue: 0}).animate({numberValue: currentServerload}, { 226 | duration: 2500, 227 | easing: 'linear', 228 | step: function() { 229 | $('#serverloadCount').text(Math.ceil(this.numberValue)); 230 | } 231 | }); 232 | 233 | var currentOrder = $('#orderCount').text(); 234 | $({numberValue: 0}).animate({numberValue: currentOrder}, { 235 | duration: 2500, 236 | easing: 'linear', 237 | step: function() { 238 | $('#orderCount').text(Math.ceil(this.numberValue)); 239 | } 240 | }); 241 | 242 | var currentVisitor = $('#visitorCount').text(); 243 | $({numberValue: 0}).animate({numberValue: currentVisitor}, { 244 | duration: 2500, 245 | easing: 'linear', 246 | step: function() { 247 | $('#visitorCount').text(Math.ceil(this.numberValue)); 248 | } 249 | }); 250 | 251 | setInterval(function() { 252 | var currentNumber = $('#userCount').text(); 253 | var randomNumber = Math.floor(Math.random()*20) + 1; 254 | var newNumber = parseInt(currentNumber, 10) + parseInt(randomNumber, 10); 255 | 256 | $({numberValue: currentNumber}).animate({numberValue: newNumber}, { 257 | duration: 500, 258 | easing: 'linear', 259 | step: function() { 260 | $('#userCount').text(Math.ceil(this.numberValue)); 261 | } 262 | }); 263 | }, 3000); 264 | 265 | setInterval(function() { 266 | var currentNumber = $('#visitorCount').text(); 267 | var randomNumber = Math.floor(Math.random()*50) + 1; 268 | var newNumber = parseInt(currentNumber, 10) + parseInt(randomNumber, 10); 269 | 270 | $({numberValue: currentNumber}).animate({numberValue: newNumber}, { 271 | duration: 500, 272 | easing: 'linear', 273 | step: function() { 274 | $('#visitorCount').text(Math.ceil(this.numberValue)); 275 | } 276 | }); 277 | }, 5000); 278 | }); 279 | }); 280 | -------------------------------------------------------------------------------- /static/template/js/endless/endless_form.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | // Chosen 3 | $(".chzn-select").chosen(); 4 | 5 | // Datepicker 6 | $('.datepicker').datepicker(); 7 | 8 | // Timepicker 9 | $('.timepicker').timepicker(); 10 | 11 | // Slider 12 | $('#sl1').slider(); 13 | $('#sl2').slider(); 14 | $('#sl3').slider(); 15 | $('#sl4').slider(); 16 | $('#sl5').slider(); 17 | 18 | // Tags input 19 | $('.tag-demo1').tagsInput({ 20 | 'height':'auto', 21 | 'width':'90%' 22 | }); 23 | 24 | // Masked input 25 | $(".date").mask("99/99/9999"); 26 | $(".phone").mask("(999) 999-9999"); 27 | $(".ssn").mask("999-99-9999"); 28 | $(".eyescript").mask("~9.99 ~9.99 999"); 29 | $(".product-key").mask("a*-999-a999"); 30 | 31 | // Wysihtml5 32 | $('#wysihtml5-textarea').wysihtml5(); 33 | 34 | // Toggle border of control group 35 | $('#toggleLine').click(function() { 36 | if($(this).is(':checked')) { 37 | $('#formToggleLine').addClass('form-border'); 38 | } 39 | else { 40 | $('#formToggleLine').removeClass('form-border'); 41 | } 42 | }); 43 | 44 | // Draggable Multiselect 45 | $('#btnSelect').click(function() { 46 | 47 | $('#selectedBox1 option:selected').appendTo('#selectedBox2'); 48 | return false; 49 | }); 50 | 51 | $('#btnRemove').click(function() { 52 | $('#selectedBox2 option:selected').appendTo('#selectedBox1'); 53 | return false; 54 | }); 55 | 56 | $('#btnSelectAll').click(function() { 57 | 58 | $('#selectedBox1 option').each(function() { 59 | $(this).appendTo('#selectedBox2'); 60 | }); 61 | 62 | return false; 63 | }); 64 | 65 | $('#btnRemoveAll').click(function() { 66 | 67 | $('#selectedBox2 option').each(function() { 68 | $(this).appendTo('#selectedBox1'); 69 | }); 70 | 71 | return false; 72 | }); 73 | }); -------------------------------------------------------------------------------- /static/template/js/endless/endless_wizard.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | //Form Wizard 1 4 | var currentStep_1 = 1; 5 | 6 | //Form Wizard 2 7 | var currentStep_2 = 1; 8 | 9 | $('.wizard-demo li a').click(function() { 10 | alert('You must enter your information') 11 | return false; 12 | }); 13 | 14 | //Form Validation 15 | $('#basic-constraint').parsley( { listeners: { 16 | onFormSubmit: function ( isFormValid, event ) { 17 | if(isFormValid) { 18 | return false; 19 | } 20 | } 21 | }}); 22 | 23 | $('#type-constraint').parsley( { listeners: { 24 | onFormSubmit: function ( isFormValid, event ) { 25 | if(isFormValid) { 26 | return false; 27 | } 28 | } 29 | }}); 30 | 31 | $('#formValidate1').parsley( { listeners: { 32 | onFormSubmit: function ( isFormValid, event ) { 33 | if(isFormValid) { 34 | alert('Registration Complete'); 35 | return false; 36 | } 37 | } 38 | }}); 39 | 40 | $('#formValidate2').parsley( { listeners: { 41 | onFormSubmit: function ( isFormValid, event ) { 42 | if(isFormValid) { 43 | alert('Your message has been sent'); 44 | return false; 45 | } 46 | } 47 | }}); 48 | 49 | $('#formWizard1').parsley( { listeners: { 50 | onFieldValidate: function ( elem ) { 51 | // if field is not visible, do not apply Parsley validation! 52 | if ( !$( elem ).is( ':visible' ) ) { 53 | return true; 54 | } 55 | 56 | return false; 57 | }, 58 | onFormSubmit: function ( isFormValid, event ) { 59 | if(isFormValid) { 60 | 61 | currentStep_1++; 62 | 63 | if(currentStep_1 == 2) { 64 | $('#wizardDemo1 li:eq(1) a').tab('show'); 65 | $('#wizardProgress').css("width","66%"); 66 | 67 | $('#prevStep1').attr('disabled',false); 68 | $('#prevStep1').removeClass('disabled'); 69 | } 70 | else if(currentStep_1 == 3) { 71 | $('#wizardDemo1 li:eq(2) a').tab('show'); 72 | $('#wizardProgress').css("width","100%"); 73 | 74 | $('#nextStep1').attr('disabled',true); 75 | $('#nextStep1').addClass('disabled'); 76 | } 77 | 78 | return false; 79 | } 80 | } 81 | }}); 82 | 83 | $('#formWizard2').parsley( { listeners: { 84 | onFieldValidate: function ( elem ) { 85 | // if field is not visible, do not apply Parsley validation! 86 | if ( !$( elem ).is( ':visible' ) ) { 87 | return true; 88 | } 89 | 90 | return false; 91 | }, 92 | onFormSubmit: function ( isFormValid, event ) { 93 | if(isFormValid) { 94 | 95 | currentStep_2++; 96 | 97 | if(currentStep_2 == 2) { 98 | $('#wizardDemo2 li:eq(1) a').tab('show'); 99 | 100 | $('#prevStep2').attr('disabled',false); 101 | $('#prevStep2').removeClass('disabled'); 102 | } 103 | else if(currentStep_2 == 3) { 104 | $('#wizardDemo2 li:eq(2) a').tab('show'); 105 | } 106 | else if(currentStep_2 == 4) { 107 | $('#wizardDemo2 li:eq(3) a').tab('show'); 108 | 109 | $('#nextStep2').attr('disabled',true); 110 | $('#nextStep2').addClass('disabled'); 111 | } 112 | 113 | return false; 114 | } 115 | } 116 | }}); 117 | 118 | $('#prevStep1').click(function() { 119 | 120 | currentStep_1--; 121 | 122 | if(currentStep_1 == 1) { 123 | 124 | $('#wizardDemo1 li:eq(0) a').tab('show'); 125 | $('#wizardProgress').css("width","66%"); 126 | 127 | $('#prevStep1').attr('disabled',true); 128 | $('#prevStep1').addClass('disabled'); 129 | 130 | $('#wizardProgress').css("width","33%"); 131 | } 132 | else if(currentStep_1 == 2) { 133 | 134 | $('#wizardDemo1 li:eq(1) a').tab('show'); 135 | $('#wizardProgress').css("width","66%"); 136 | 137 | $('#nextStep1').attr('disabled',false); 138 | $('#nextStep1').removeClass('disabled'); 139 | 140 | $('#wizardProgress').css("width","66%"); 141 | } 142 | 143 | return false; 144 | }); 145 | 146 | $('#prevStep2').click(function() { 147 | 148 | currentStep_2--; 149 | 150 | if(currentStep_2 == 1) { 151 | 152 | $('#wizardDemo2 li:eq(0) a').tab('show'); 153 | 154 | $('#prevStep2').attr('disabled',true); 155 | $('#prevStep2').addClass('disabled'); 156 | 157 | } 158 | else if(currentStep_2 == 2) { 159 | $('#wizardDemo2 li:eq(1) a').tab('show'); 160 | } 161 | 162 | else if(currentStep_2 == 3) { 163 | 164 | $('#wizardDemo2 li:eq(2) a').tab('show'); 165 | 166 | $('#nextStep2').attr('disabled',false); 167 | $('#nextStep2').removeClass('disabled'); 168 | 169 | } 170 | 171 | return false; 172 | }); 173 | }); -------------------------------------------------------------------------------- /static/template/js/jquery-ui-map/ui/min/jquery.ui.map.full.min.js: -------------------------------------------------------------------------------- 1 | /*! jquery-ui-map rc1 | Johan Säll Larsson */ 2 | eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('(3(d){d.a=3(a,b){j c=a.v(".")[0],a=a.v(".")[1];d[c]=d[c]||{};d[c][a]=3(a,b){I.O&&2.1i(a,b)};d[c][a].K=d.n({1s:c,1u:a},b);d.N[a]=3(b){j g="1p"===1k b,f=L.K.X.W(I,1),i=2;l(g&&"1j"===b.1l(0,1))6 i;2.18(3(){j h=d.1b(2,a);h||(h=d.1b(2,a,k d[c][a](b,2)));g&&(i=h[b].14(h,f))});6 i}};d.a("1J.1G",{u:{1A:"1x",1y:5},1B:3(a,b){6 b?(2.u[a]=b,2.4("9").x(a,b),2):2.u[a]},1i:3(a,b){2.E=b;a=a||{};m.n(2.u,a,{1h:2.w(a.1h)});2.1g();2.1f&&2.1f()},1g:3(){j a=2;2.o={9:k 8.7.1D(a.E,a.u),M:[],p:[],q:[]};8.7.G.1C(a.o.9,"1F",3(){d(a.E).19("1E",a.o.9)});a.C(a.u.1t,a.o.9)},Z:3(a){j b=2.4("12",k 8.7.1z);b.n(2.w(a));2.4("9").1M(b);6 2},1L:3(a){j b=2.4("9").1O();6 b?b.1N(a.Y()):!1},1K:3(a,b){2.4("9").1H[b].J(2.F(a));6 2},1I:3(a,b){a.9=2.4("9");a.13=2.w(a.13);j c=k(a.1n||8.7.1o)(a),e=2.4("M");c.16?e[c.16]=c:e.J(c);c.12&&2.Z(c.Y());2.C(b,a.9,c);6 d(c)},z:3(a){2.B(2.4(a));2.x(a,[]);6 2},B:3(a){y(j b Q a)a.11(b)&&(a[b]r 8.7.17?(8.7.G.1v(a[b]),a[b].A&&a[b].A(t)):a[b]r L&&2.B(a[b]),a[b]=t)},1w:3(a,b,c){a=2.4(a);b.s=d.1m(b.s)?b.s:[b.s];y(j e Q a)l(a.11(e)){j g=!1,f;y(f Q b.s)l(-1")){y(j e=a.T(/ /g,"").v(">"),d=0;d U",k 8.7.U),f=2.4("q > S",k 8.7.S);b&&f.R(b);g.1U(a,3(a,b){"1T"===b?(f.26(a),f.A(d.4("9"))):f.A(t);c(a,b)})},27:3(a,b){2.4("9").29(2.4("q > 1d",k 8.7.1d(2.F(a),b)))},28:3(a,b){2.4("q > 1a",k 8.7.1a).21(a,b)},20:3(a,b){j c=k 8.7[a](m.n({9:2.4("9")},b));2.4("p > "+a,[]).J(c);6 d(c)},22:3(a,b){(!b?2.4("p > D",k 8.7.D):2.4("p > D",k 8.7.D(b,a))).R(m.n({9:2.4("9")},a))},23:3(a,b,c){2.4("p > "+a,k 8.7.1Y(b,m.n({9:2.4("9")},c)))}});m.N.n({1e:3(a){8.7.G.19(2[0],a);6 2},15:3(a,b,c){8.7&&2[0]r 8.7.17?8.7.G.24(2[0],a,b):c?2.1c(a,b,c):2.1c(a,b);6 2}});m.18("25 1R 1Z 1V 2m 2l 2j".v(" "),3(a,b){m.N[b]=3(a,d){6 2.15(b,a,d)}})})(m);',62,151,'||this|function|get||return|maps|google|map||||||||||var|new|if|jQuery|extend|instance|overlays|services|instanceof|value|null|options|split|_latLng|set|for|clear|setMap|_c|_call|FusionTablesLayer|el|_unwrap|event|iw|arguments|push|prototype|Array|markers|fn|length|LatLng|in|setOptions|DirectionsRenderer|replace|DirectionsService|operator|call|slice|getPosition|addBounds|else|hasOwnProperty|bounds|position|apply|addEventListener|id|MVCObject|each|trigger|Geocoder|data|bind|StreetViewPanorama|triggerEvent|_init|_create|center|_setup|_|typeof|substring|isArray|marker|Marker|string|property|inArray|namespace|callback|pluginName|clearInstanceListeners|find|roadmap|zoom|LatLngBounds|mapTypeId|option|addListenerOnce|Map|init|bounds_changed|gmap|controls|addMarker|ui|addControl|inViewport|fitBounds|contains|getBounds|AND|Object|rightclick|displayDirections|OK|route|mouseover|name|isFunction|KmlLayer|dblclick|addShape|geocode|loadFusion|loadKML|addListener|click|setDirections|displayStreetView|search|setStreetView|close|closeInfoWindow|break|refresh|indexOf|infoWindow|openInfoWindow|open|InfoWindow|dragend|destroy|drag|mouseout|removeData|getCenter|setCenter|resize'.split('|'),0,{})) -------------------------------------------------------------------------------- /static/template/js/jquery-ui-map/ui/min/jquery.ui.map.microformat.min.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanson007/skyoms/9491c7cc9ad223dde5d4bd0c8b6bbb4007db8725/static/template/js/jquery-ui-map/ui/min/jquery.ui.map.microformat.min.js -------------------------------------------------------------------------------- /static/template/js/jquery.cookie.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.3.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | 9 | (function(e){if(typeof define==="function"&&define.amd){define(["jquery"],e)}else{e(jQuery)}})(function(e){function n(e){if(i.raw){return e}return decodeURIComponent(e.replace(t," "))}function r(e){if(e.indexOf('"')===0){e=e.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")}e=n(e);try{return i.json?JSON.parse(e):e}catch(t){}}var t=/\+/g;var i=e.cookie=function(t,s,o){if(s!==undefined){o=e.extend({},i.defaults,o);if(typeof o.expires==="number"){var u=o.expires,a=o.expires=new Date;a.setDate(a.getDate()+u)}s=i.json?JSON.stringify(s):String(s);return document.cookie=[i.raw?t:encodeURIComponent(t),"=",i.raw?s:encodeURIComponent(s),o.expires?"; expires="+o.expires.toUTCString():"",o.path?"; path="+o.path:"",o.domain?"; domain="+o.domain:"",o.secure?"; secure":""].join("")}var f=document.cookie.split("; ");var l=t?undefined:{};for(var c=0,h=f.length;c',_tpl_title:'[[title]]',_tpl_item:'',_tpl_wrap:'
',add:function(g){if(typeof(g)=="string"){g={text:g}}if(g.text===null){throw'You must supply "text" parameter.'}if(!this._is_setup){this._runSetup()}var k=g.title,n=g.text,e=g.image||"",l=g.sticky||false,m=g.class_name||b.gritter.options.class_name,j=b.gritter.options.position,d=g.time||"";this._verifyWrapper();this._item_count++;var f=this._item_count,i=this._tpl_item;b(["before_open","after_open","before_close","after_close"]).each(function(p,q){a["_"+q+"_"+f]=(b.isFunction(g[q]))?g[q]:function(){}});this._custom_timer=0;if(d){this._custom_timer=d}var c=(e!="")?'':"",h=(e!="")?"gritter-with-image":"gritter-without-image";if(k){k=this._str_replace("[[title]]",k,this._tpl_title)}else{k=""}i=this._str_replace(["[[title]]","[[text]]","[[close]]","[[image]]","[[number]]","[[class_name]]","[[item_class]]"],[k,n,this._tpl_close,c,this._item_count,h,m],i);if(this["_before_open_"+f]()===false){return false}b("#gritter-notice-wrapper").addClass(j).append(i);var o=b("#gritter-item-"+this._item_count);o.fadeIn(this.fade_in_speed,function(){a["_after_open_"+f](b(this))});if(!l){this._setFadeTimer(o,f)}b(o).bind("mouseenter mouseleave",function(p){if(p.type=="mouseenter"){if(!l){a._restoreItemIfFading(b(this),f)}}else{if(!l){a._setFadeTimer(b(this),f)}}a._hoverState(b(this),p.type)});b(o).find(".gritter-close").click(function(){a.removeSpecific(f,{},null,true)});return f},_countRemoveWrapper:function(c,d,f){d.remove();this["_after_close_"+c](d,f);if(b(".gritter-item-wrapper").length==0){b("#gritter-notice-wrapper").remove()}},_fade:function(g,d,j,f){var j=j||{},i=(typeof(j.fade)!="undefined")?j.fade:true,c=j.speed||this.fade_out_speed,h=f;this["_before_close_"+d](g,h);if(f){g.unbind("mouseenter mouseleave")}if(i){g.animate({opacity:0},c,function(){g.animate({height:0},300,function(){a._countRemoveWrapper(d,g,h)})})}else{this._countRemoveWrapper(d,g)}},_hoverState:function(d,c){if(c=="mouseenter"){d.addClass("hover");d.find(".gritter-close").show()}else{d.removeClass("hover");d.find(".gritter-close").hide()}},removeSpecific:function(c,g,f,d){if(!f){var f=b("#gritter-item-"+c)}this._fade(f,c,g||{},d)},_restoreItemIfFading:function(d,c){clearTimeout(this["_int_id_"+c]);d.stop().css({opacity:"",height:""})},_runSetup:function(){for(opt in b.gritter.options){this[opt]=b.gritter.options[opt]}this._is_setup=1},_setFadeTimer:function(f,d){var c=(this._custom_timer)?this._custom_timer:this.time;this["_int_id_"+d]=setTimeout(function(){a._fade(f,d)},c)},stop:function(e){var c=(b.isFunction(e.before_close))?e.before_close:function(){};var f=(b.isFunction(e.after_close))?e.after_close:function(){};var d=b("#gritter-notice-wrapper");c(d);d.fadeOut(function(){b(this).remove();f()})},_str_replace:function(v,e,o,n){var k=0,h=0,t="",m="",g=0,q=0,l=[].concat(v),c=[].concat(e),u=o,d=c instanceof Array,p=u instanceof Array;u=[].concat(u);if(n){this.window[n]=0}for(k=0,g=u.length;k ').attr(j,d).css({position:'absolute',top:$(window).scrollTop(),left:$(window).scrollLeft()});f[j]='';$('body').prepend(k);location=e.hash;k.remove();f[j]=d}h.scrollTo(f,b).trigger('notify.serialScroll',[f])}})(jQuery); -------------------------------------------------------------------------------- /static/template/js/jquery.maskedinput.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | Masked Input plugin for jQuery 3 | Copyright (c) 2007-2013 Josh Bush (digitalbush.com) 4 | Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 5 | Version: 1.3.1 6 | */ 7 | 8 | (function(e){function t(){var e=document.createElement("input"),t="onpaste";e.setAttribute(t,"");return typeof e[t]==="function"?"paste":"input"}var n=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),s=/android/i.test(r),o;e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"};e.fn.extend({caret:function(e,t){var n;if(this.length===0||this.is(":hidden")){return}if(typeof e=="number"){t=typeof t==="number"?t:e;return this.each(function(){if(this.setSelectionRange){this.setSelectionRange(e,t)}else if(this.createTextRange){n=this.createTextRange();n.collapse(true);n.moveEnd("character",t);n.moveStart("character",e);n.select()}})}else{if(this[0].setSelectionRange){e=this[0].selectionStart;t=this[0].selectionEnd}else if(document.selection&&document.selection.createRange){n=document.selection.createRange();e=0-n.duplicate().moveStart("character",-1e5);t=e+n.text.length}return{begin:e,end:t}}},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var u,a,f,l,c,h;if(!t&&this.length>0){u=e(this[0]);return u.data(e.mask.dataName)()}r=e.extend({placeholder:e.mask.placeholder,completed:null},r);a=e.mask.definitions;f=[];l=h=t.length;c=null;e.each(t.split(""),function(e,t){if(t=="?"){h--;l=e}else if(a[t]){f.push(new RegExp(a[t]));if(c===null){c=f.length-1}}else{f.push(null)}});return this.trigger("unmask").each(function(){function v(e){while(++e=0&&!f[e]);return e}function g(e,t){var n,i;if(e<0){return}for(n=e,i=v(t);n=h){r.completed.call(u)}}}t.preventDefault()}}function E(e,t){var n;for(n=e;nt.length){break}}else if(p[i]===t.charAt(pos)&&i!==l){pos++;n=i}}if(e){S()}else if(n+1Expand',collapseBtnHTML:'',group:0,maxDepth:5,threshold:20};l.prototype={init:function(){var n=this;n.reset();n.el.data("nestable-group",this.options.group);n.placeEl=e('
');e.each(this.el.find(n.options.itemNodeName),function(t,r){n.setParent(e(r))});n.el.on("click","button",function(t){if(n.dragEl||!i&&t.button!==0){return}var r=e(t.currentTarget),s=r.data("action"),o=r.parent(n.options.itemNodeName);if(s==="collapse"){n.collapseItem(o)}if(s==="expand"){n.expandItem(o)}});var r=function(t){var r=e(t.target);if(!r.hasClass(n.options.handleClass)){if(r.closest("."+n.options.noDragClass).length){return}r=r.closest("."+n.options.handleClass)}if(!r.length||n.dragEl||!i&&t.button!==0||i&&t.touches.length!==1){return}t.preventDefault();n.dragStart(i?t.touches[0]:t)};var s=function(e){if(n.dragEl){e.preventDefault();n.dragMove(i?e.touches[0]:e)}};var f=function(e){if(n.dragEl){e.preventDefault();n.dragStop(i?e.touches[0]:e)}};if(i){n.el[0].addEventListener(o,r,false);t.addEventListener(u,s,false);t.addEventListener(a,f,false);t.addEventListener(eCancel,f,false)}else{n.el.on(o,r);n.w.on(u,s);n.w.on(a,f)}},serialize:function(){var t,n=0,r=this;step=function(t,n){var i=[],s=t.children(r.options.itemNodeName);s.each(function(){var t=e(this),s=e.extend({},t.data()),o=t.children(r.options.listNodeName);if(o.length){s.children=step(o,n+1)}i.push(s)});return i};t=step(r.el.find(r.options.listNodeName).first(),n);return t},serialise:function(){return this.serialize()},reset:function(){this.mouse={offsetX:0,offsetY:0,startX:0,startY:0,lastX:0,lastY:0,nowX:0,nowY:0,distX:0,distY:0,dirAx:0,dirX:0,dirY:0,lastDirX:0,lastDirY:0,distAxX:0,distAxY:0};this.moving=false;this.dragEl=null;this.dragRootEl=null;this.dragDepth=0;this.hasNewRoot=false;this.pointEl=null},expandItem:function(e){e.removeClass(this.options.collapsedClass);e.children('[data-action="expand"]').hide();e.children('[data-action="collapse"]').show();e.children(this.options.listNodeName).show()},collapseItem:function(e){var t=e.children(this.options.listNodeName);if(t.length){e.addClass(this.options.collapsedClass);e.children('[data-action="collapse"]').hide();e.children('[data-action="expand"]').show();e.children(this.options.listNodeName).hide()}},expandAll:function(){var t=this;t.el.find(t.options.itemNodeName).each(function(){t.expandItem(e(this))})},collapseAll:function(){var t=this;t.el.find(t.options.itemNodeName).each(function(){t.collapseItem(e(this))})},setParent:function(t){if(t.children(this.options.listNodeName).length){t.prepend(e(this.options.expandBtnHTML));t.prepend(e(this.options.collapseBtnHTML))}t.children('[data-action="expand"]').hide()},unsetParent:function(e){e.removeClass(this.options.collapsedClass);e.children("[data-action]").remove();e.children(this.options.listNodeName).remove()},dragStart:function(t){var i=this.mouse,s=e(t.target),o=s.closest(this.options.itemNodeName);this.placeEl.css("height",o.height());i.offsetX=t.offsetX!==r?t.offsetX:t.pageX-s.offset().left;i.offsetY=t.offsetY!==r?t.offsetY:t.pageY-s.offset().top;i.startX=i.lastX=t.pageX;i.startY=i.lastY=t.pageY;this.dragRootEl=this.el;this.dragEl=e(n.createElement(this.options.listNodeName)).addClass(this.options.listClass+" "+this.options.dragClass);this.dragEl.css("width",o.width());o.after(this.placeEl);o[0].parentNode.removeChild(o[0]);o.appendTo(this.dragEl);e(n.body).append(this.dragEl);this.dragEl.css({left:t.pageX-i.offsetX,top:t.pageY-i.offsetY});var u,a,f=this.dragEl.find(this.options.itemNodeName);for(u=0;uthis.dragDepth){this.dragDepth=a}}},dragStop:function(e){var t=this.dragEl.children(this.options.itemNodeName).first();t[0].parentNode.removeChild(t[0]);this.placeEl.replaceWith(t);this.dragEl.remove();this.el.trigger("change");if(this.hasNewRoot){this.dragRootEl.trigger("change")}this.reset()},dragMove:function(r){var i,o,u,a,f,l=this.options,c=this.mouse;this.dragEl.css({left:r.pageX-c.offsetX,top:r.pageY-c.offsetY});c.lastX=c.nowX;c.lastY=c.nowY;c.nowX=r.pageX;c.nowY=r.pageY;c.distX=c.nowX-c.lastX;c.distY=c.nowY-c.lastY;c.lastDirX=c.dirX;c.lastDirY=c.dirY;c.dirX=c.distX===0?0:c.distX>0?1:-1;c.dirY=c.distY===0?0:c.distY>0?1:-1;var h=Math.abs(c.distX)>Math.abs(c.distY)?1:0;if(!c.moving){c.dirAx=h;c.moving=true;return}if(c.dirAx!==h){c.distAxX=0;c.distAxY=0}else{c.distAxX+=Math.abs(c.distX);if(c.dirX!==0&&c.dirX!==c.lastDirX){c.distAxX=0}c.distAxY+=Math.abs(c.distY);if(c.dirY!==0&&c.dirY!==c.lastDirY){c.distAxY=0}}c.dirAx=h;if(c.dirAx&&c.distAxX>=l.threshold){c.distAxX=0;u=this.placeEl.prev(l.itemNodeName);if(c.distX>0&&u.length&&!u.hasClass(l.collapsedClass)){i=u.find(l.listNodeName).last();f=this.placeEl.parents(l.listNodeName).length;if(f+this.dragDepth<=l.maxDepth){if(!i.length){i=e("<"+l.listNodeName+"/>").addClass(l.listClass);i.append(this.placeEl);u.append(i);this.setParent(u)}else{i=u.children(l.listNodeName).last();i.append(this.placeEl)}}}if(c.distX<0){a=this.placeEl.next(l.itemNodeName);if(!a.length){o=this.placeEl.parent();this.placeEl.closest(l.itemNodeName).after(this.placeEl);if(!o.children().length){this.unsetParent(o.parent())}}}}var p=false;if(!s){this.dragEl[0].style.visibility="hidden"}this.pointEl=e(n.elementFromPoint(r.pageX-n.body.scrollLeft,r.pageY-(t.pageYOffset||n.documentElement.scrollTop)));if(!s){this.dragEl[0].style.visibility="visible"}if(this.pointEl.hasClass(l.handleClass)){this.pointEl=this.pointEl.parent(l.itemNodeName)}if(this.pointEl.hasClass(l.emptyClass)){p=true}else if(!this.pointEl.length||!this.pointEl.hasClass(l.itemClass)){return}var d=this.pointEl.closest("."+l.rootClass),v=this.dragRootEl.data("nestable-id")!==d.data("nestable-id");if(!c.dirAx||v||p){if(v&&l.group!==d.data("nestable-group")){return}f=this.dragDepth-1+this.pointEl.parents(l.listNodeName).length;if(f>l.maxDepth){return}var m=r.pageY')}if(v){this.dragRootEl=d;this.hasNewRoot=this.el[0]!==this.dragRootEl[0]}}}};e.fn.nestable=function(t){var n=this,r=this;n.each(function(){var n=e(this).data("nestable");if(!n){e(this).data("nestable",new l(this,t));e(this).data("nestable-id",(new Date).getTime())}else{if(typeof t==="string"&&typeof n[t]==="function"){r=n[t]()}}});return r||n}})(window.jQuery||window.Zepto,window,document) -------------------------------------------------------------------------------- /static/template/js/jquery.popupoverlay.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Popup Overlay 3 | * 4 | * @version 1.6.0 5 | * @requires jQuery v1.7.1+ 6 | * @link http://vast-engineering.github.com/jquery-popup-overlay/ 7 | */ 8 | 9 | !function(t){var e,i=t(window),o={},n=[],a=[],s=!1,p=!1,l=null,d=null,c=null,r=null,u="_open",f="_close",h=null,v={_init:function(e){var i=t(e),o=i.data("popupoptions");a[e.id]=!1,n[e.id]=0,i.data("popup-initialized")||(i.attr("data-popup-initialized","true"),v._initonce(e)),o.autoopen&&setTimeout(function(){v.show(e,0)},0)},_initonce:function(i){var o,n=t("body"),a=$el.data("popupoptions");if(r=parseInt(n.css("margin-right"),10),"tooltip"==a.type&&(a.background=!1,a.scrolllock=!1),a.scrolllock){var s,p;"undefined"==typeof e&&(s=t('
').appendTo("body"),p=s.children(),e=p.innerWidth()-p.height(99).innerWidth(),s.remove())}if($el.attr("id")||$el.attr("id","j-popup-"+parseInt(1e8*Math.random())),$el.addClass("popup_content"),n.prepend(i),$el.wrap('