├── .gitignore ├── README.md ├── machine_vision ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── manage.py ├── rbac ├── __init__.py ├── admin.py ├── apps.py ├── forms │ ├── base.py │ ├── menu.py │ ├── role.py │ └── user.py ├── middlewares │ └── rbac.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── service │ ├── init_permission.py │ ├── routes.py │ └── urls.py ├── templates │ ├── layout.html │ └── rbac │ │ ├── breadcrumb.html │ │ ├── change.html │ │ ├── delete.html │ │ ├── distribute_permissions.html │ │ ├── menu_list.html │ │ ├── multi_menu.html │ │ ├── multi_permissions.html │ │ ├── role_list.html │ │ ├── static_menu.html │ │ └── user_list.html ├── templatetags │ └── rbac.py ├── tests.py ├── urls.py ├── views │ ├── menu.py │ ├── role.py │ └── user.py └── 使用文档.py ├── requirements.txt ├── stark ├── __init__.py ├── admin.py ├── apps.py ├── forms │ └── widgets.py ├── migrations │ └── __init__.py ├── models.py ├── service │ └── v1.py ├── templates │ └── stark │ │ ├── change.html │ │ ├── changelist.html │ │ ├── data_display.html │ │ ├── delete.html │ │ ├── forms │ │ └── widgets │ │ │ └── datetime_picker.html │ │ ├── one_user_change.html │ │ └── phone_request.html ├── tests.py ├── utils │ └── pagination.py └── views.py ├── static ├── admin │ ├── css │ │ ├── autocomplete.css │ │ ├── base.css │ │ ├── changelists.css │ │ ├── dashboard.css │ │ ├── fonts.css │ │ ├── forms.css │ │ ├── login.css │ │ ├── responsive.css │ │ ├── responsive_rtl.css │ │ ├── rtl.css │ │ ├── vendor │ │ │ └── select2 │ │ │ │ ├── LICENSE-SELECT2.md │ │ │ │ ├── select2.css │ │ │ │ └── select2.min.css │ │ └── widgets.css │ ├── fonts │ │ ├── LICENSE.txt │ │ ├── README.txt │ │ ├── Roboto-Bold-webfont.woff │ │ ├── Roboto-Light-webfont.woff │ │ └── Roboto-Regular-webfont.woff │ ├── img │ │ ├── LICENSE │ │ ├── README.txt │ │ ├── calendar-icons.svg │ │ ├── gis │ │ │ ├── move_vertex_off.svg │ │ │ └── move_vertex_on.svg │ │ ├── icon-addlink.svg │ │ ├── icon-alert.svg │ │ ├── icon-calendar.svg │ │ ├── icon-changelink.svg │ │ ├── icon-clock.svg │ │ ├── icon-deletelink.svg │ │ ├── icon-no.svg │ │ ├── icon-unknown-alt.svg │ │ ├── icon-unknown.svg │ │ ├── icon-yes.svg │ │ ├── inline-delete.svg │ │ ├── search.svg │ │ ├── selector-icons.svg │ │ ├── sorting-icons.svg │ │ ├── tooltag-add.svg │ │ └── tooltag-arrowright.svg │ └── js │ │ ├── SelectBox.js │ │ ├── SelectFilter2.js │ │ ├── actions.js │ │ ├── actions.min.js │ │ ├── admin │ │ ├── DateTimeShortcuts.js │ │ └── RelatedObjectLookups.js │ │ ├── autocomplete.js │ │ ├── calendar.js │ │ ├── cancel.js │ │ ├── change_form.js │ │ ├── collapse.js │ │ ├── collapse.min.js │ │ ├── core.js │ │ ├── inlines.js │ │ ├── inlines.min.js │ │ ├── jquery.init.js │ │ ├── popup_response.js │ │ ├── prepopulate.js │ │ ├── prepopulate.min.js │ │ ├── prepopulate_init.js │ │ ├── timeparse.js │ │ ├── urlify.js │ │ └── vendor │ │ ├── jquery │ │ ├── LICENSE-JQUERY.txt │ │ ├── jquery.js │ │ └── jquery.min.js │ │ ├── select2 │ │ ├── LICENSE-SELECT2.md │ │ ├── i18n │ │ │ ├── ar.js │ │ │ ├── az.js │ │ │ ├── bg.js │ │ │ ├── ca.js │ │ │ ├── cs.js │ │ │ ├── da.js │ │ │ ├── de.js │ │ │ ├── el.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── et.js │ │ │ ├── eu.js │ │ │ ├── fa.js │ │ │ ├── fi.js │ │ │ ├── fr.js │ │ │ ├── gl.js │ │ │ ├── he.js │ │ │ ├── hi.js │ │ │ ├── hr.js │ │ │ ├── hu.js │ │ │ ├── id.js │ │ │ ├── is.js │ │ │ ├── it.js │ │ │ ├── ja.js │ │ │ ├── km.js │ │ │ ├── ko.js │ │ │ ├── lt.js │ │ │ ├── lv.js │ │ │ ├── mk.js │ │ │ ├── ms.js │ │ │ ├── nb.js │ │ │ ├── nl.js │ │ │ ├── pl.js │ │ │ ├── pt-BR.js │ │ │ ├── pt.js │ │ │ ├── ro.js │ │ │ ├── ru.js │ │ │ ├── sk.js │ │ │ ├── sr-Cyrl.js │ │ │ ├── sr.js │ │ │ ├── sv.js │ │ │ ├── th.js │ │ │ ├── tr.js │ │ │ ├── uk.js │ │ │ ├── vi.js │ │ │ ├── zh-CN.js │ │ │ └── zh-TW.js │ │ ├── select2.full.js │ │ └── select2.full.min.js │ │ └── xregexp │ │ ├── LICENSE-XREGEXP.txt │ │ ├── xregexp.js │ │ └── xregexp.min.js ├── assets │ ├── css │ │ ├── animate.css │ │ ├── bootsnav.css │ │ ├── font-awesome.min.css │ │ ├── login.css │ │ ├── responsive.css │ │ └── style.css │ ├── js │ │ ├── bootsnav.js │ │ ├── bootstrap.min.js │ │ ├── custom.js │ │ ├── jquery.easing.min.js │ │ ├── jquery.js │ │ ├── jquery.sticky.js │ │ └── modernizr.min.js │ └── logo │ │ ├── favicon.png │ │ └── gy.jpeg ├── channel │ └── css │ │ └── m_search_style.css ├── css │ ├── commons.css │ ├── nav.css │ ├── normalize.min.css │ ├── phone_response.css │ ├── search-group.css │ └── style.css ├── imgs │ ├── bg.jpg │ ├── count_img.jpg.back │ ├── default.png │ ├── import.gif │ ├── logo.svg │ ├── luffy-study-logo.png │ ├── luffy.png │ ├── nav.swf │ ├── phone_account.png │ ├── python.ico │ └── title.png ├── js │ ├── jquery-3.3.1.min.js │ ├── jquery.easing.min.js │ ├── modernizr.js │ ├── modernizr.min.js │ └── silder.js ├── plugins │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap-theme.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ └── js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ ├── echarts.min.js │ │ │ ├── echarts.simple.min.js │ │ │ └── npm.js │ ├── flv.js │ │ ├── .eslintignore │ │ ├── .eslintrc.json │ │ ├── LICENSE │ │ ├── README.md │ │ ├── d.ts │ │ │ └── flv.d.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── config.js │ │ │ ├── core │ │ │ │ ├── features.js │ │ │ │ ├── media-info.js │ │ │ │ ├── media-segment-info.js │ │ │ │ ├── mse-controller.js │ │ │ │ ├── mse-events.js │ │ │ │ ├── transmuxer.js │ │ │ │ ├── transmuxing-controller.js │ │ │ │ ├── transmuxing-events.js │ │ │ │ └── transmuxing-worker.js │ │ │ ├── demux │ │ │ │ ├── amf-parser.js │ │ │ │ ├── demux-errors.js │ │ │ │ ├── exp-golomb.js │ │ │ │ ├── flv-demuxer.js │ │ │ │ └── sps-parser.js │ │ │ ├── flv.js │ │ │ ├── index.js │ │ │ ├── io │ │ │ │ ├── fetch-stream-loader.js │ │ │ │ ├── io-controller.js │ │ │ │ ├── loader.js │ │ │ │ ├── param-seek-handler.js │ │ │ │ ├── range-seek-handler.js │ │ │ │ ├── speed-sampler.js │ │ │ │ ├── websocket-loader.js │ │ │ │ ├── xhr-moz-chunked-loader.js │ │ │ │ ├── xhr-msstream-loader.js │ │ │ │ └── xhr-range-loader.js │ │ │ ├── player │ │ │ │ ├── flv-player.js │ │ │ │ ├── native-player.js │ │ │ │ ├── player-errors.js │ │ │ │ └── player-events.js │ │ │ ├── remux │ │ │ │ ├── aac-silent.js │ │ │ │ ├── mp4-generator.js │ │ │ │ └── mp4-remuxer.js │ │ │ └── utils │ │ │ │ ├── browser.js │ │ │ │ ├── exception.js │ │ │ │ ├── logger.js │ │ │ │ ├── logging-control.js │ │ │ │ ├── polyfill.js │ │ │ │ └── utf8-conv.js │ │ ├── tsconfig.json │ │ ├── tslint.json │ │ ├── types │ │ │ ├── index.d.ts │ │ │ ├── test-flv.ts │ │ │ └── tsconfig.json │ │ └── webpack.config.js │ ├── font-awesome │ │ ├── HELP-US-OUT.txt │ │ ├── css │ │ │ ├── font-awesome.css │ │ │ └── font-awesome.min.css │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── less │ │ │ ├── animated.less │ │ │ ├── bordered-pulled.less │ │ │ ├── core.less │ │ │ ├── fixed-width.less │ │ │ ├── font-awesome.less │ │ │ ├── icons.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── mixins.less │ │ │ ├── path.less │ │ │ ├── rotated-flipped.less │ │ │ ├── screen-reader.less │ │ │ ├── stacked.less │ │ │ └── variables.less │ │ └── scss │ │ │ ├── _animated.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ └── westeros.js ├── rbac │ ├── css │ │ └── rbac.css │ ├── js │ │ └── rbac.js │ └── layout.html └── stark │ ├── css │ ├── commons.css │ ├── nav.css │ └── search-group.css │ ├── imgs │ ├── default.png │ ├── logo.svg │ ├── luffy-study-logo.png │ ├── luffy.png │ ├── timg.jpg │ └── title.png │ ├── js │ └── jquery-3.3.1.min.js │ └── plugins │ ├── bootstrap │ ├── css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── npm.js │ ├── datetimepicker │ ├── css │ │ ├── bootstrap-datetimepicker.css │ │ └── bootstrap-datetimepicker.min.css │ └── js │ │ ├── bootstrap-datetimepicker.js │ │ ├── bootstrap-datetimepicker.min.js │ │ └── locales │ │ └── bootstrap-datetimepicker.zh-CN.js │ └── font-awesome │ ├── HELP-US-OUT.txt │ ├── css │ ├── font-awesome.css │ └── font-awesome.min.css │ ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 │ ├── less │ ├── animated.less │ ├── bordered-pulled.less │ ├── core.less │ ├── fixed-width.less │ ├── font-awesome.less │ ├── icons.less │ ├── larger.less │ ├── list.less │ ├── mixins.less │ ├── path.less │ ├── rotated-flipped.less │ ├── screen-reader.less │ ├── stacked.less │ └── variables.less │ └── scss │ ├── _animated.scss │ ├── _bordered-pulled.scss │ ├── _core.scss │ ├── _fixed-width.scss │ ├── _icons.scss │ ├── _larger.scss │ ├── _list.scss │ ├── _mixins.scss │ ├── _path.scss │ ├── _rotated-flipped.scss │ ├── _screen-reader.scss │ ├── _stacked.scss │ ├── _variables.scss │ └── font-awesome.scss └── vision ├── __init__.py ├── admin.py ├── apps.py ├── migrations ├── 0001_initial.py └── __init__.py ├── models.py ├── stark.py ├── templates ├── index.html ├── layout.html └── login.html ├── tests.py ├── utils ├── batch_add_user.py └── md5.py └── views ├── __init__.py ├── account.py ├── data_api.py ├── download.py ├── edge_driver.py ├── edge_driver_control.py ├── person_count.py ├── point_info.py └── userinfo.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # deepstream-django-check_web 2 | # 本项目结合多方源码实现基于web的实时目标检测系统,系统采用python3.6+deepstream5.1+django2.0实现目标检测人流、车流计数任务,实现内容如下: 3 | 1. 分时段计数统计 4 | 2. 数据可视化展示 5 | 3. 监控画面实时显示、截图抓拍、平台显示 6 | 4. 数据下载 7 | 5. 设备状态查看 8 | 6. 用户权限管理 9 | 10 | ## 设计思路 11 | 采用jetson设备边缘部署方式,以每一个边缘设备为节点进行数据采集和监控处理,如图所示: 12 | ![image](https://user-images.githubusercontent.com/40747806/135811095-ab259816-7da2-49ea-b38f-843762691041.png) 13 | 14 | ## 如何使用 15 | ### 1. 安装 16 | 1、后台需要按照requirements.txt文件下载对应安装包,执行pip install -r ./requirements.txt,如果网速太慢可添加国内源下载,如:pip install -r ./requriements.txt -i https://mirrors.aliyun.com/pypi/simple 17 | 18 | 2、边缘端需下载deepstream>=5.0(因本项目全部采用python3.6开发,因此需deepstream升级至5.0或更高版本,下载deepstream需注意与其对应的jetpack版本!) 19 | 20 | 3、作者在jetson设备桌面配置了一键启动脚本,拿到jetson端源码后可直接双击运行 21 | 22 | ### 2. 启动 23 | 1、先启动后台django程序,注释掉django rbac中间件,然后查看rbac文件夹下的文档说明.py文件进行配置,保证能够创建用户并进入系统,然后配置属于自己的初始化数据例如:用户、权限等内容,能够正常使用后再开启rbac中间件,配置jetson设备信息以及需要接入的前端摄像头的、rtsp地址或者其他流媒体地址(!一定是先创建jetson设备,然后再创建前端拉流信息等后续内容!)。 24 | 25 | 2、在settings文件同级目录下创建local_settings文件,配置路由、校验秘钥等信息用于jetson设备和django通信,配置设备监控信息,用于平台侧检测边缘端设备工作情况。 26 | 27 | 3、后台能够正常运行后,双击前端jetson设备的桌面一键启动按钮,先启动server服务,然后启动project服务,能够看见弹出框并且正常运行即可。 28 | 29 | 4、观察后台检测到的前端平台运行情况及视频监控流媒体调用情况,若均正常,启动完毕 30 | 31 | ### 功能截图 32 | ![screenshot-127 0 0 1_8000-2021 10 04-15_07_03](https://user-images.githubusercontent.com/40747806/135811154-7f8d59e9-669d-4311-ac43-7db687a3efb3.png) 33 | 34 | ![screenshot-127 0 0 1_8000-2021 10 04-15_07_21](https://user-images.githubusercontent.com/40747806/135811268-f0e5a311-eadb-431f-8414-878c9e7313d7.png) 35 | 36 | ![screenshot-127 0 0 1_8000-2021 10 04-15_07_47](https://user-images.githubusercontent.com/40747806/135811126-f041fb71-dca3-413e-9fe9-1b4f55f3c33b.png) 37 | 38 | ### 如需帮助 39 | 可联系作者获取sqlite3.db,直接进入系统使用 40 | 如需使用mysql等数据库或不会操作,可联系作者邮箱:18981275647@189.cn 41 | 42 | ### 感谢 43 | https://github.com/WuPeiqi 44 | -------------------------------------------------------------------------------- /machine_vision/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/machine_vision/__init__.py -------------------------------------------------------------------------------- /machine_vision/urls.py: -------------------------------------------------------------------------------- 1 | """machine_vision URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.11/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.conf.urls import url, include 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 | """ 16 | 17 | from django.views import static 18 | from django.conf import settings 19 | from django.contrib import admin 20 | from django.conf.urls import url, include 21 | from stark.service.v1 import site 22 | from vision.views import account,data_api 23 | from vision.views import download 24 | 25 | urlpatterns = [ 26 | url(r'^admin/', admin.site.urls), 27 | url(r'^stark/', site.urls), 28 | url(r'^rbac/', include(('rbac.urls', 'rbac'), namespace='rbac')), 29 | url(r'^login/', account.login, name='login'), 30 | url(r'^index/', account.index, name='index'), 31 | url(r'^logout/', account.logout, name='logout'), 32 | url(r'^download/$', download.download_file, name='download_file'), 33 | url(r'^customer/data/display/$', account.data_display, name='data_display'), 34 | url(r'^customer/data/display/api', data_api.data_display_api, name='data_display_api'), 35 | url(r'^customer/point_url/api/v1/get/', data_api.request_url_api, name='data_url_api'), 36 | 37 | url(r'^stark/vision/userinfoextent/reset/password/(?P\d+)/(?P\w+)/', account.reset_password, 38 | name='reset_password_one'), 39 | url(r'^stark/vision/userinfoextent/change/(?P\d+)/(?P\w+)/', account.user_edit_one, 40 | name='user_edit_one'), 41 | # url(r'^stark/registers/person_count_info/(?P\w+)/(?P\w+)/(?P\w+)/(?P\w+)', account.person_count_info, name='person_count_adds'), 42 | url(r'^stark/registers/person_count_info/.*', data_api.person_count_info, name='person_count_adds'), 43 | url(r'^static/(?P.*)$', static.serve, {'document_root': settings.STATIC_ROOT}, name='static'), 44 | url(r'^media/(?P.*)', static.serve, {'document_root': settings.MEDIA_ROOT}), 45 | ] 46 | -------------------------------------------------------------------------------- /machine_vision/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for machine_vision 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.11/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", "machine_vision.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /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", "machine_vision.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError: 10 | # The above import may fail for some other reason. Ensure that the 11 | # issue is really that Django is missing to avoid masking other 12 | # exceptions on Python 2. 13 | try: 14 | import django 15 | except ImportError: 16 | raise ImportError( 17 | "Couldn't import Django. Are you sure it's installed and " 18 | "available on your PYTHONPATH environment variable? Did you " 19 | "forget to activate a virtual environment?" 20 | ) 21 | raise 22 | execute_from_command_line(sys.argv) 23 | -------------------------------------------------------------------------------- /rbac/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/rbac/__init__.py -------------------------------------------------------------------------------- /rbac/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /rbac/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class RbacConfig(AppConfig): 5 | name = 'rbac' 6 | -------------------------------------------------------------------------------- /rbac/forms/base.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | from django import forms 5 | 6 | 7 | class BootStrapModelForm(forms.ModelForm): 8 | 9 | def __init__(self, *args, **kwargs): 10 | super(BootStrapModelForm, self).__init__(*args, **kwargs) 11 | # 统一给ModelForm生成字段添加样式 12 | for name, field in self.fields.items(): 13 | field.widget.attrs['class'] = 'form-control' 14 | -------------------------------------------------------------------------------- /rbac/forms/role.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | from django import forms 5 | from rbac import models 6 | 7 | 8 | class RoleModelForm(forms.ModelForm): 9 | class Meta: 10 | model = models.Role 11 | fields = ['title', ] 12 | widgets = { 13 | 'title': forms.TextInput(attrs={'class': 'form-control'}) 14 | } 15 | 16 | -------------------------------------------------------------------------------- /rbac/forms/user.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | from django import forms 5 | from django.core.exceptions import ValidationError 6 | from rbac import models 7 | 8 | 9 | class UserModelForm(forms.ModelForm): 10 | confirm_password = forms.CharField(label='确认密码') 11 | 12 | class Meta: 13 | model = models.UserInfo 14 | fields = ['name', 'email', 'password', 'confirm_password'] 15 | 16 | def __init__(self, *args, **kwargs): 17 | super(UserModelForm, self).__init__(*args, **kwargs) 18 | # 统一给ModelForm生成字段添加样式 19 | for name, field in self.fields.items(): 20 | field.widget.attrs['class'] = 'form-control' 21 | 22 | def clean_confirm_password(self): 23 | """ 24 | 检测密码是否一致 25 | :return: 26 | """ 27 | password = self.cleaned_data['password'] 28 | confirm_password = self.cleaned_data['confirm_password'] 29 | if password != confirm_password: 30 | raise ValidationError('两次密码输入不一致') 31 | return confirm_password 32 | 33 | 34 | class UpdateUserModelForm(forms.ModelForm): 35 | class Meta: 36 | model = models.UserInfo 37 | fields = ['name', 'email', ] 38 | 39 | def __init__(self, *args, **kwargs): 40 | super(UpdateUserModelForm, self).__init__(*args, **kwargs) 41 | # 统一给ModelForm生成字段添加样式 42 | for name, field in self.fields.items(): 43 | field.widget.attrs['class'] = 'form-control' 44 | 45 | 46 | class ResetPasswordUserModelForm(forms.ModelForm): 47 | confirm_password = forms.CharField(label='确认密码') 48 | 49 | class Meta: 50 | model = models.UserInfo 51 | fields = ['password', 'confirm_password'] 52 | 53 | def __init__(self, *args, **kwargs): 54 | super(ResetPasswordUserModelForm, self).__init__(*args, **kwargs) 55 | # 统一给ModelForm生成字段添加样式 56 | for name, field in self.fields.items(): 57 | field.widget.attrs['class'] = 'form-control' 58 | 59 | def clean_confirm_password(self): 60 | """ 61 | 检测密码是否一致 62 | :return: 63 | """ 64 | password = self.cleaned_data['password'] 65 | confirm_password = self.cleaned_data['confirm_password'] 66 | if password != confirm_password: 67 | raise ValidationError('两次密码输入不一致') 68 | return confirm_password 69 | -------------------------------------------------------------------------------- /rbac/middlewares/rbac.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | import re 4 | from django.utils.deprecation import MiddlewareMixin 5 | from django.shortcuts import HttpResponse 6 | from django.shortcuts import redirect 7 | from django.conf import settings 8 | 9 | 10 | class RbacMiddleware(MiddlewareMixin): 11 | """ 12 | 用户权限信息校验 13 | """ 14 | 15 | def process_request(self, request): 16 | """ 17 | 当用户请求刚进入时候出发执行 18 | :param request: 19 | :return: 20 | """ 21 | 22 | """ 23 | 1. 获取当前用户请求的URL 24 | 2. 获取当前用户在session中保存的权限列表 ['/customer/list/','/customer/list/(?P\\d+)/'] 25 | 3. 权限信息匹配 26 | """ 27 | current_url = request.path_info 28 | for valid_url in settings.VALID_URL_LIST: 29 | if re.match(valid_url, current_url): 30 | # 白名单中的URL无需权限验证即可访问 31 | return None 32 | 33 | permission_dict = request.session.get(settings.PERMISSION_SESSION_KEY) 34 | if not permission_dict: 35 | return redirect("/login") 36 | # return HttpResponse('未获取到用户权限信息,请登录!') 37 | 38 | url_record = [ 39 | {'title': '首页', 'url': '/index/'} 40 | ] 41 | 42 | # 此处代码进行判断 43 | for url in settings.NO_PERMISSION_LIST: 44 | if re.match(url, request.path_info): 45 | # 需要登录,但无需权限校验 46 | request.current_selected_permission = 0 47 | request.breadcrumb = url_record 48 | 49 | return None 50 | 51 | flag = False 52 | 53 | for item in permission_dict.values(): 54 | reg = "^%s$" % item['url'] 55 | if re.match(reg, current_url): 56 | flag = True 57 | request.current_selected_permission = item['pid'] or item['id'] 58 | if not item['pid']: 59 | url_record.extend([{'title': item['title'], 'url': item['url'], 'class': 'active'}]) 60 | else: 61 | url_record.extend([ 62 | {'title': item['p_title'], 'url': item['p_url']}, 63 | {'title': item['title'], 'url': item['url'], 'class': 'active'}, 64 | ]) 65 | request.breadcrumb = url_record 66 | break 67 | 68 | if not flag: 69 | return HttpResponse('无权访问') 70 | -------------------------------------------------------------------------------- /rbac/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0 on 2021-10-09 00:50 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Menu', 17 | fields=[ 18 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('title', models.CharField(max_length=32, verbose_name='菜单名称')), 20 | ('icon', models.CharField(max_length=32, verbose_name='图标')), 21 | ], 22 | ), 23 | migrations.CreateModel( 24 | name='Permission', 25 | fields=[ 26 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 27 | ('title', models.CharField(max_length=32, verbose_name='标题')), 28 | ('url', models.CharField(max_length=128, verbose_name='含正则的URL')), 29 | ('name', models.CharField(max_length=32, unique=True, verbose_name='URL别名')), 30 | ('menu', models.ForeignKey(blank=True, help_text='null表示不是菜单;非null表示是二级菜单', null=True, on_delete=django.db.models.deletion.CASCADE, to='rbac.Menu', verbose_name='所属菜单')), 31 | ('pid', models.ForeignKey(blank=True, help_text='对于非菜单权限需要选择一个可以成为菜单的权限,用户做默认展开和选中菜单', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parents', to='rbac.Permission', verbose_name='关联的权限')), 32 | ], 33 | ), 34 | migrations.CreateModel( 35 | name='Role', 36 | fields=[ 37 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 38 | ('title', models.CharField(max_length=32, verbose_name='角色名称')), 39 | ('permissions', models.ManyToManyField(blank=True, to='rbac.Permission', verbose_name='拥有的所有权限')), 40 | ], 41 | ), 42 | ] 43 | -------------------------------------------------------------------------------- /rbac/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/rbac/migrations/__init__.py -------------------------------------------------------------------------------- /rbac/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Menu(models.Model): 5 | """ 6 | 菜单表 7 | """ 8 | title = models.CharField(verbose_name='菜单名称', max_length=32) 9 | icon = models.CharField(verbose_name='图标', max_length=32) 10 | 11 | def __str__(self): 12 | return self.title 13 | 14 | 15 | class Permission(models.Model): 16 | """ 17 | 权限表 18 | """ 19 | title = models.CharField(verbose_name='标题', max_length=32) 20 | url = models.CharField(verbose_name='含正则的URL', max_length=128) 21 | 22 | name = models.CharField(verbose_name='URL别名', max_length=32, unique=True) 23 | 24 | menu = models.ForeignKey(verbose_name='所属菜单', to='Menu', null=True, blank=True, help_text='null表示不是菜单;非null表示是二级菜单', on_delete=models.CASCADE) 25 | 26 | pid = models.ForeignKey(verbose_name='关联的权限', to='Permission', null=True, blank=True, related_name='parents', 27 | help_text='对于非菜单权限需要选择一个可以成为菜单的权限,用户做默认展开和选中菜单', on_delete=models.CASCADE) 28 | 29 | def __str__(self): 30 | return self.title 31 | 32 | 33 | class Role(models.Model): 34 | """ 35 | 角色 36 | """ 37 | title = models.CharField(verbose_name='角色名称', max_length=32) 38 | permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True) 39 | 40 | def __str__(self): 41 | return self.title 42 | 43 | 44 | class UserInfo(models.Model): 45 | """ 46 | 用户表 47 | """ 48 | name = models.CharField(verbose_name='用户名', max_length=32, unique=True) 49 | password = models.CharField(verbose_name='密码', max_length=64) 50 | email = models.CharField(verbose_name='邮箱', max_length=32, blank=True, null=True, default="xx@189.cn") 51 | roles = models.ManyToManyField(verbose_name='拥有的所有角色', to=Role, blank=True, default=2) 52 | 53 | def __str__(self): 54 | return self.name 55 | 56 | class Meta: 57 | # django以后再做数据库迁移时,不再为UserInfo类创建相关的表以及表结构了。 58 | # 此类可以当做"父类",被其他Model类继承。 59 | abstract = True 60 | -------------------------------------------------------------------------------- /rbac/service/urls.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | from django.urls import reverse 4 | from django.http import QueryDict 5 | 6 | 7 | def memory_url(request, name, *args, **kwargs): 8 | """ 9 | 生成带有原搜索条件的URL(替代了模板中的url) 10 | :param request: 11 | :param name: 12 | :return: 13 | """ 14 | basic_url = reverse(name, args=args, kwargs=kwargs) 15 | 16 | # 当前URL中无参数 17 | if not request.GET: 18 | return basic_url 19 | 20 | query_dict = QueryDict(mutable=True) 21 | query_dict['_filter'] = request.GET.urlencode() # mid=2&age=99 22 | 23 | return "%s?%s" % (basic_url, query_dict.urlencode()) 24 | 25 | 26 | def memory_reverse(request, name, *args, **kwargs): 27 | """ 28 | 反向生成URL 29 | http://127.0.0.1:8001/rbac/menu/add/?_filter=mid%3D2 30 | 1. 在url中讲原来搜索条件,如filter后的值 31 | 2. reverse生成原来的URL,如:/menu/list/ 32 | 3. /menu/list/?mid%3D2 33 | 34 | 示例: 35 | :param request: 36 | :param name: 37 | :param args: 38 | :param kwargs: 39 | :return: 40 | """ 41 | url = reverse(name, args=args, kwargs=kwargs) 42 | origin_params = request.GET.get('_filter') 43 | if origin_params: 44 | url = "%s?%s" % (url, origin_params,) 45 | 46 | return url 47 | -------------------------------------------------------------------------------- /rbac/templates/rbac/breadcrumb.html: -------------------------------------------------------------------------------- 1 |
2 | 11 |
-------------------------------------------------------------------------------- /rbac/templates/rbac/change.html: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html' %} 2 | {% block css %} 3 | 4 | 24 | {% endblock %} 25 | 26 | {% block content %} 27 |
28 | 29 |
30 | {% csrf_token %} 31 | 32 | {% for field in form %} 33 |
34 | 35 |
36 | {{ field }} 37 | {{ field.errors.0 }} 38 |
39 |
40 | {% endfor %} 41 |
42 |
43 | 44 |
45 |
46 | 47 | 48 |
49 | 50 | 51 |
52 | 53 | {% endblock %} -------------------------------------------------------------------------------- /rbac/templates/rbac/delete.html: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html' %} 2 | 3 | {% block content %} 4 |
5 | 18 |
19 | 20 | {% endblock %} -------------------------------------------------------------------------------- /rbac/templates/rbac/multi_menu.html: -------------------------------------------------------------------------------- 1 |
2 | {% for item in menu_dict.values %} 3 |
4 |
{{ item.title }}
5 |
6 | {% for per in item.children %} 7 | {{ per.title }} 8 | {% endfor %} 9 |
10 | 11 |
12 | {% endfor %} 13 |
-------------------------------------------------------------------------------- /rbac/templates/rbac/role_list.html: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html' %} 2 | 3 | 4 | {% block content %} 5 |
6 |
7 | 8 | 9 | 添加角色 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | {% for row in roles %} 24 | 25 | 26 | 27 | 37 | 38 | {% endfor %} 39 | 40 |
ID名称选项
{{ row.id }}{{ row.title }} 28 | 29 | 30 | 31 | 32 | 33 | 35 | 36 |
41 | 46 |
47 | 48 | {% endblock %} -------------------------------------------------------------------------------- /rbac/templates/rbac/static_menu.html: -------------------------------------------------------------------------------- 1 |
2 | {% for item in menu_list %} 3 | 4 | {{ item.title }} 5 | {% endfor %} 6 |
-------------------------------------------------------------------------------- /rbac/templates/rbac/user_list.html: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html' %} 2 | 3 | 4 | {% block content %} 5 |
6 |
7 | 8 | 9 | 添加用户 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | {% for row in users %} 26 | 27 | 28 | 29 | 30 | 33 | 43 | 44 | {% endfor %} 45 | 46 |
序号用户名邮箱重置密码操作
{{ forloop.counter }}{{ row.name }}{{ row.email }} 31 | 重置密码 32 | 34 | 35 | 36 | 37 | 38 | 39 | 41 | 42 |
47 |
48 | 49 | {% endblock %} -------------------------------------------------------------------------------- /rbac/templatetags/rbac.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | import re 4 | from django.template import Library 5 | from django.conf import settings 6 | from collections import OrderedDict 7 | from django.http import QueryDict 8 | from django.urls import reverse 9 | 10 | from rbac.service import urls 11 | 12 | register = Library() 13 | 14 | 15 | @register.inclusion_tag('rbac/static_menu.html') 16 | def static_menu(request): 17 | """ 18 | 创建一级菜单 19 | :return: 20 | """ 21 | menu_list = request.session[settings.MENU_SESSION_KEY] 22 | return {'menu_list': menu_list} 23 | 24 | 25 | @register.inclusion_tag('rbac/multi_menu.html') 26 | def multi_menu(request): 27 | """ 28 | 创建二级菜单 29 | :return: 30 | """ 31 | if re.search("/stark/channel/customerinfo/add/", request.path_info): 32 | return {'menu_dict': None} 33 | menu_dict = request.session.get(settings.MENU_SESSION_KEY) 34 | 35 | # 对字典的key进行排序 36 | key_list = sorted(menu_dict) 37 | 38 | # 空的有序字典 39 | ordered_dict = OrderedDict() 40 | 41 | for key in key_list: 42 | val = menu_dict[key] 43 | val['class'] = 'hide' 44 | for per in val['children']: 45 | 46 | if per['id'] == request.current_selected_permission: 47 | per['class'] = 'active' 48 | val['class'] = '' 49 | else: 50 | per['class'] = '' 51 | ordered_dict[key] = val 52 | 53 | return {'menu_dict': ordered_dict} 54 | 55 | 56 | @register.inclusion_tag('rbac/breadcrumb.html') 57 | def breadcrumb(request): 58 | if re.search("/stark/channel/customerinfo/add/", request.path_info): 59 | return {'menu_dict': None} 60 | return {'record_list': request.breadcrumb} 61 | 62 | 63 | @register.filter 64 | def has_permission(request, name): 65 | """ 66 | 判断是否有权限 67 | :param request: 68 | :param name: 69 | :return: 70 | """ 71 | if name in request.session[settings.PERMISSION_SESSION_KEY]: 72 | return True 73 | 74 | 75 | @register.simple_tag 76 | def memory_url(request, name, *args, **kwargs): 77 | """ 78 | 生成带有原搜索条件的URL(替代了模板中的url) 79 | :param request: 80 | :param name: 81 | :return: 82 | """ 83 | return urls.memory_url(request, name, *args, **kwargs) 84 | -------------------------------------------------------------------------------- /rbac/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /rbac/urls.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | from django.conf.urls import url, include 4 | from django.contrib import admin 5 | from rbac.views import role 6 | from rbac.views import user 7 | from rbac.views import menu 8 | 9 | urlpatterns = [ 10 | 11 | url(r'^role/list/$', role.role_list, name='role_list'), # rbac:role_list 12 | url(r'^role/add/$', role.role_add, name='role_add'), # rbac:role_add 13 | url(r'^role/edit/(?P\d+)/$', role.role_edit, name='role_edit'), # rbac:role_edit 14 | url(r'^role/del/(?P\d+)/$', role.role_del, name='role_del'), # rbac:role_del 15 | 16 | # url(r'^user/list/$', user.user_list, name='user_list'), 17 | # url(r'^user/add/$', user.user_add, name='user_add'), 18 | # url(r'^user/edit/(?P\d+)/$', user.user_edit, name='user_edit'), # rbac:user_edit 19 | # url(r'^user/del/(?P\d+)/$', user.user_del, name='user_del'), 20 | # url(r'^user/reset/password/(?P\d+)/$', user.user_reset_pwd, name='user_reset_pwd'), 21 | 22 | url(r'^menu/list/$', menu.menu_list, name='menu_list'), 23 | url(r'^menu/add/$', menu.menu_add, name='menu_add'), 24 | url(r'^menu/edit/(?P\d+)/$', menu.menu_edit, name='menu_edit'), 25 | url(r'^menu/del/(?P\d+)/$', menu.menu_del, name='menu_del'), 26 | 27 | url(r'^second/menu/add/(?P\d+)$', menu.second_menu_add, name='second_menu_add'), 28 | url(r'^second/menu/edit/(?P\d+)/$', menu.second_menu_edit, name='second_menu_edit'), 29 | url(r'^second/menu/del/(?P\d+)/$', menu.second_menu_del, name='second_menu_del'), 30 | 31 | url(r'^permission/add/(?P\d+)/$', menu.permission_add, name='permission_add'), 32 | url(r'^permission/edit/(?P\d+)/$', menu.permission_edit, name='permission_edit'), 33 | url(r'^permission/del/(?P\d+)/$', menu.permission_del, name='permission_del'), 34 | 35 | url(r'^multi/permissions/$', menu.multi_permissions, name='multi_permissions'), 36 | url(r'^multi/permissions/del/(?P\d+)/$', menu.multi_permissions_del, name='multi_permissions_del'), 37 | 38 | url(r'^distribute/permissions/$', menu.distribute_permissions, name='distribute_permissions'), 39 | 40 | ] 41 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | paramiko==2.7.2 2 | Django==2.0 3 | APScheduler==2.1.2 4 | pandas==1.0.1 5 | PyMySQL==0.9.3 6 | pycryptodome==3.10.4 7 | -------------------------------------------------------------------------------- /stark/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/stark/__init__.py -------------------------------------------------------------------------------- /stark/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /stark/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from django.utils.module_loading import autodiscover_modules 3 | 4 | 5 | class StarkConfig(AppConfig): 6 | name = 'stark' 7 | 8 | def ready(self): 9 | autodiscover_modules('stark') 10 | -------------------------------------------------------------------------------- /stark/forms/widgets.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | from django import forms 4 | 5 | 6 | class DateTimePickerInput(forms.TextInput): 7 | template_name = 'stark/forms/widgets/datetime_picker.html' 8 | -------------------------------------------------------------------------------- /stark/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/stark/migrations/__init__.py -------------------------------------------------------------------------------- /stark/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /stark/templates/stark/change.html: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html' %} 2 | {% block css %} 3 | 4 | 25 | {% endblock %} 26 | 27 | {% block content %} 28 |
29 | 30 |
31 | {% csrf_token %} 32 | 33 | {% for field in form %} 34 |
35 | 36 |
37 | {{ field }} 38 | {{ field.errors.0 }} 39 |
40 |
41 | {% endfor %} 42 | 43 |
44 |
45 | 46 |
47 |
48 | 49 |
50 |
51 | 52 | 53 | {% endblock %} 54 | 55 | {% block js %} 56 | {% endblock %} 57 | 58 | -------------------------------------------------------------------------------- /stark/templates/stark/delete.html: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html' %} 2 | 3 | {% block content %} 4 |
5 | 18 |
19 | 20 | {% endblock %} -------------------------------------------------------------------------------- /stark/templates/stark/forms/widgets/datetime_picker.html: -------------------------------------------------------------------------------- 1 |
2 | 4 | 5 |
6 | -------------------------------------------------------------------------------- /stark/templates/stark/one_user_change.html: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html' %} 2 | {% block css %} 3 | 4 | 24 | {% endblock %} 25 | 26 | {% block content %} 27 |
28 | 29 |
30 | {% csrf_token %} 31 | 32 | {% for field in form %} 33 |
34 | 35 |
36 | {{ field }} 37 | {{ field.errors.0 }} 38 |
39 |
40 | {% endfor %} 41 |
42 |
43 | 44 |
45 |
46 | 47 | 48 |
49 | 50 | 51 |
52 | 53 | {% endblock %} 54 | 55 | {% block js %} 56 | 66 | {% endblock %} 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /stark/templates/stark/phone_request.html: -------------------------------------------------------------------------------- 1 | {% load staticfiles %} 2 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 咨询用户信息填写 11 | 24 | 25 | 26 |
27 | {% block content %} 28 |
29 |
30 | {% csrf_token %} 31 | 32 | {% for field in form %} 33 |
34 | 35 |
36 | {{ field }} 37 | {{ field.errors.0 }} 38 |
39 |
40 | {% endfor %} 41 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | 49 |
50 |
51 |

广元电信提供技术支持

52 |
53 |
54 | 55 | {% endblock %} 56 |
57 | 58 | 61 | 62 | -------------------------------------------------------------------------------- /stark/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /stark/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /static/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | 3 | .dashboard .module table th { 4 | width: 100%; 5 | } 6 | 7 | .dashboard .module table td { 8 | white-space: nowrap; 9 | } 10 | 11 | .dashboard .module table td a { 12 | display: block; 13 | padding-right: .6em; 14 | } 15 | 16 | /* RECENT ACTIONS MODULE */ 17 | 18 | .module ul.actionlist { 19 | margin-left: 0; 20 | } 21 | 22 | ul.actionlist li { 23 | list-style-type: none; 24 | overflow: hidden; 25 | text-overflow: ellipsis; 26 | -o-text-overflow: ellipsis; 27 | } 28 | -------------------------------------------------------------------------------- /static/admin/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Roboto'; 3 | src: url('../fonts/Roboto-Bold-webfont.woff'); 4 | font-weight: 700; 5 | font-style: normal; 6 | } 7 | 8 | @font-face { 9 | font-family: 'Roboto'; 10 | src: url('../fonts/Roboto-Regular-webfont.woff'); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Roboto'; 17 | src: url('../fonts/Roboto-Light-webfont.woff'); 18 | font-weight: 300; 19 | font-style: normal; 20 | } 21 | -------------------------------------------------------------------------------- /static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | body.login { 4 | background: #f8f8f8; 5 | } 6 | 7 | .login #header { 8 | height: auto; 9 | padding: 5px 16px; 10 | } 11 | 12 | .login #header h1 { 13 | font-size: 18px; 14 | } 15 | 16 | .login #header h1 a { 17 | color: #fff; 18 | } 19 | 20 | .login #content { 21 | padding: 20px 20px 0; 22 | } 23 | 24 | .login #container { 25 | background: #fff; 26 | border: 1px solid #eaeaea; 27 | border-radius: 4px; 28 | overflow: hidden; 29 | width: 28em; 30 | min-width: 300px; 31 | margin: 100px auto; 32 | } 33 | 34 | .login #content-main { 35 | width: 100%; 36 | } 37 | 38 | .login .form-row { 39 | padding: 4px 0; 40 | float: left; 41 | width: 100%; 42 | border-bottom: none; 43 | } 44 | 45 | .login .form-row label { 46 | padding-right: 0.5em; 47 | line-height: 2em; 48 | font-size: 1em; 49 | clear: both; 50 | color: #333; 51 | } 52 | 53 | .login .form-row #id_username, .login .form-row #id_password { 54 | clear: both; 55 | padding: 8px; 56 | width: 100%; 57 | -webkit-box-sizing: border-box; 58 | -moz-box-sizing: border-box; 59 | box-sizing: border-box; 60 | } 61 | 62 | .login span.help { 63 | font-size: 10px; 64 | display: block; 65 | } 66 | 67 | .login .submit-row { 68 | clear: both; 69 | padding: 1em 0 0 9.4em; 70 | margin: 0; 71 | border: none; 72 | background: none; 73 | text-align: left; 74 | } 75 | 76 | .login .password-reset-link { 77 | text-align: center; 78 | } 79 | -------------------------------------------------------------------------------- /static/admin/css/responsive_rtl.css: -------------------------------------------------------------------------------- 1 | /* TABLETS */ 2 | 3 | @media (max-width: 1024px) { 4 | [dir="rtl"] .colMS { 5 | margin-right: 0; 6 | } 7 | 8 | [dir="rtl"] #user-tools { 9 | text-align: right; 10 | } 11 | 12 | [dir="rtl"] #changelist .actions label { 13 | padding-left: 10px; 14 | padding-right: 0; 15 | } 16 | 17 | [dir="rtl"] #changelist .actions select { 18 | margin-left: 0; 19 | margin-right: 15px; 20 | } 21 | 22 | [dir="rtl"] .change-list .filtered .results, 23 | [dir="rtl"] .change-list .filtered .paginator, 24 | [dir="rtl"] .filtered #toolbar, 25 | [dir="rtl"] .filtered div.xfull, 26 | [dir="rtl"] .filtered .actions { 27 | margin-right: 0; 28 | margin-left: 230px; 29 | } 30 | 31 | [dir="rtl"] .inline-group ul.tools a.add, 32 | [dir="rtl"] .inline-group div.add-row a, 33 | [dir="rtl"] .inline-group .tabular tr.add-row td a { 34 | padding: 8px 26px 8px 10px; 35 | background-position: calc(100% - 8px) 9px; 36 | } 37 | 38 | [dir="rtl"] .related-widget-wrapper-link + .selector { 39 | margin-right: 0; 40 | margin-left: 15px; 41 | } 42 | 43 | [dir="rtl"] .selector .selector-filter label { 44 | margin-right: 0; 45 | margin-left: 8px; 46 | } 47 | 48 | [dir="rtl"] .object-tools li { 49 | float: right; 50 | } 51 | 52 | [dir="rtl"] .object-tools li + li { 53 | margin-left: 0; 54 | margin-right: 15px; 55 | } 56 | 57 | [dir="rtl"] .dashboard .module table td a { 58 | padding-left: 0; 59 | padding-right: 16px; 60 | } 61 | } 62 | 63 | /* MOBILE */ 64 | 65 | @media (max-width: 767px) { 66 | [dir="rtl"] .change-list .filtered .results, 67 | [dir="rtl"] .change-list .filtered .paginator, 68 | [dir="rtl"] .filtered #toolbar, 69 | [dir="rtl"] .filtered div.xfull, 70 | [dir="rtl"] .filtered .actions { 71 | margin-left: 0; 72 | } 73 | 74 | [dir="rtl"] .aligned .add-another, 75 | [dir="rtl"] .aligned .related-lookup, 76 | [dir="rtl"] .aligned .datetimeshortcuts { 77 | margin-left: 0; 78 | margin-right: 15px; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /static/admin/css/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /static/admin/fonts/README.txt: -------------------------------------------------------------------------------- 1 | Roboto webfont source: https://www.google.com/fonts/specimen/Roboto 2 | Weights used in this project: Light (300), Regular (400), Bold (700) 3 | -------------------------------------------------------------------------------- /static/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /static/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /static/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /static/admin/img/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Code Charm Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /static/admin/img/README.txt: -------------------------------------------------------------------------------- 1 | All icons are taken from Font Awesome (http://fontawesome.io/) project. 2 | The Font Awesome font is licensed under the SIL OFL 1.1: 3 | - http://scripts.sil.org/OFL 4 | 5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG 6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license 7 | in current folder). 8 | -------------------------------------------------------------------------------- /static/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /static/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/js/autocomplete.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | var init = function($element, options) { 4 | var settings = $.extend({ 5 | ajax: { 6 | data: function(params) { 7 | return { 8 | term: params.term, 9 | page: params.page 10 | }; 11 | } 12 | } 13 | }, options); 14 | $element.select2(settings); 15 | }; 16 | 17 | $.fn.djangoAdminSelect2 = function(options) { 18 | var settings = $.extend({}, options); 19 | $.each(this, function(i, element) { 20 | var $element = $(element); 21 | init($element, settings); 22 | }); 23 | return this; 24 | }; 25 | 26 | $(function() { 27 | // Initialize all autocomplete widgets except the one in the template 28 | // form used when a new formset is added. 29 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); 30 | }); 31 | 32 | $(document).on('formset:added', (function() { 33 | return function(event, $newFormset) { 34 | return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); 35 | }; 36 | })(this)); 37 | }(django.jQuery)); 38 | -------------------------------------------------------------------------------- /static/admin/js/cancel.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | $(function() { 4 | $('.cancel-link').click(function(e) { 5 | e.preventDefault(); 6 | window.history.back(); 7 | }); 8 | }); 9 | })(django.jQuery); 10 | -------------------------------------------------------------------------------- /static/admin/js/change_form.js: -------------------------------------------------------------------------------- 1 | /*global showAddAnotherPopup, showRelatedObjectLookupPopup showRelatedObjectPopup updateRelatedObjectLinks*/ 2 | 3 | (function($) { 4 | 'use strict'; 5 | $(document).ready(function() { 6 | var modelName = $('#django-admin-form-add-constants').data('modelName'); 7 | $('body').on('click', '.add-another', function(e) { 8 | e.preventDefault(); 9 | var event = $.Event('django:add-another-related'); 10 | $(this).trigger(event); 11 | if (!event.isDefaultPrevented()) { 12 | showAddAnotherPopup(this); 13 | } 14 | }); 15 | 16 | if (modelName) { 17 | $('form#' + modelName + '_form :input:visible:enabled:first').focus(); 18 | } 19 | }); 20 | })(django.jQuery); 21 | -------------------------------------------------------------------------------- /static/admin/js/collapse.js: -------------------------------------------------------------------------------- 1 | /*global gettext*/ 2 | (function($) { 3 | 'use strict'; 4 | $(document).ready(function() { 5 | // Add anchor tag for Show/Hide link 6 | $("fieldset.collapse").each(function(i, elem) { 7 | // Don't hide if fields in this fieldset have errors 8 | if ($(elem).find("div.errors").length === 0) { 9 | $(elem).addClass("collapsed").find("h2").first().append(' (' + gettext("Show") + 11 | ')'); 12 | } 13 | }); 14 | // Add toggle to anchor tag 15 | $("fieldset.collapse a.collapse-toggle").click(function(ev) { 16 | if ($(this).closest("fieldset").hasClass("collapsed")) { 17 | // Show 18 | $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]); 19 | } else { 20 | // Hide 21 | $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]); 22 | } 23 | return false; 24 | }); 25 | }); 26 | })(django.jQuery); 27 | -------------------------------------------------------------------------------- /static/admin/js/collapse.min.js: -------------------------------------------------------------------------------- 1 | var $jscomp={scope:{},findInternal:function(a,c,b){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e'+gettext("Show")+")")});a("fieldset.collapse a.collapse-toggle").click(function(c){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", 5 | [a(this).attr("id")]);return!1})})})(django.jQuery); 6 | -------------------------------------------------------------------------------- /static/admin/js/jquery.init.js: -------------------------------------------------------------------------------- 1 | /*global django:true, jQuery:false*/ 2 | /* Puts the included jQuery into our own namespace using noConflict and passing 3 | * it 'true'. This ensures that the included jQuery doesn't pollute the global 4 | * namespace (i.e. this preserves pre-existing values for both window.$ and 5 | * window.jQuery). 6 | */ 7 | var django = django || {}; 8 | django.jQuery = jQuery.noConflict(true); 9 | -------------------------------------------------------------------------------- /static/admin/js/popup_response.js: -------------------------------------------------------------------------------- 1 | /*global opener */ 2 | (function() { 3 | 'use strict'; 4 | var initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); 5 | switch(initData.action) { 6 | case 'change': 7 | opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); 8 | break; 9 | case 'delete': 10 | opener.dismissDeleteRelatedObjectPopup(window, initData.value); 11 | break; 12 | default: 13 | opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); 14 | break; 15 | } 16 | })(); 17 | -------------------------------------------------------------------------------- /static/admin/js/prepopulate.js: -------------------------------------------------------------------------------- 1 | /*global URLify*/ 2 | (function($) { 3 | 'use strict'; 4 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { 5 | /* 6 | Depends on urlify.js 7 | Populates a selected field with the values of the dependent fields, 8 | URLifies and shortens the string. 9 | dependencies - array of dependent fields ids 10 | maxLength - maximum length of the URLify'd string 11 | allowUnicode - Unicode support of the URLify'd string 12 | */ 13 | return this.each(function() { 14 | var prepopulatedField = $(this); 15 | 16 | var populate = function() { 17 | // Bail if the field's value has been changed by the user 18 | if (prepopulatedField.data('_changed')) { 19 | return; 20 | } 21 | 22 | var values = []; 23 | $.each(dependencies, function(i, field) { 24 | field = $(field); 25 | if (field.val().length > 0) { 26 | values.push(field.val()); 27 | } 28 | }); 29 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); 30 | }; 31 | 32 | prepopulatedField.data('_changed', false); 33 | prepopulatedField.change(function() { 34 | prepopulatedField.data('_changed', true); 35 | }); 36 | 37 | if (!prepopulatedField.val()) { 38 | $(dependencies.join(',')).keyup(populate).change(populate).focus(populate); 39 | } 40 | }); 41 | }; 42 | })(django.jQuery); 43 | -------------------------------------------------------------------------------- /static/admin/js/prepopulate.min.js: -------------------------------------------------------------------------------- 1 | (function(c){c.fn.prepopulate=function(e,f,g){return this.each(function(){var a=c(this),b=function(){if(!a.data("_changed")){var b=[];c.each(e,function(a,d){d=c(d);01&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/ca.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/cs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/da.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/de.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/el.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/en.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/es.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/et.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/eu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/fa.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/fi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/fr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/gl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/he.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/hi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/hr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/hu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/id.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/is.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/it.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/ja.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/km.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/ko.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/lt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/lv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/mk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/ms.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/nb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/nl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/pl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/pt-BR.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/pt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/ro.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/ru.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/sk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/sr-Cyrl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/sr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/sv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/th.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/tr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/uk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/vi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/zh-CN.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/select2/i18n/zh-TW.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2007-2012 Steven Levithan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /static/assets/js/custom.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | "use strict"; 3 | 4 | /*================================== 5 | * Author : "ThemeSine" 6 | * Template Name : HTML Template 7 | * Version : 1.0 8 | ==================================== */ 9 | 10 | 11 | 12 | 13 | /*=========== TABLE OF CONTENTS =========== 14 | 1. Scroll To Top 15 | ======================================*/ 16 | 17 | // 1. Scroll To Top 18 | $(window).on('scroll',function () { 19 | if ($(this).scrollTop() > 600) { 20 | $('.return-to-top').fadeIn(); 21 | } else { 22 | $('.return-to-top').fadeOut(); 23 | } 24 | }); 25 | $('.return-to-top').on('click',function(){ 26 | $('html, body').animate({ 27 | scrollTop: 0 28 | }, 1500); 29 | return false; 30 | }); 31 | 32 | 33 | }); 34 | -------------------------------------------------------------------------------- /static/assets/js/jquery.easing.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],function($){return factory($)})}else if(typeof module==="object"&&typeof module.exports==="object"){exports=factory(require("jquery"))}else{factory(jQuery)}})(function($){$.easing.jswing=$.easing.swing;var pow=Math.pow,sqrt=Math.sqrt,sin=Math.sin,cos=Math.cos,PI=Math.PI,c1=1.70158,c2=c1*1.525,c3=c1+1,c4=2*PI/3,c5=2*PI/4.5;function bounceOut(x){var n1=7.5625,d1=2.75;if(x<1/d1){return n1*x*x}else if(x<2/d1){return n1*(x-=1.5/d1)*x+.75}else if(x<2.5/d1){return n1*(x-=2.25/d1)*x+.9375}else{return n1*(x-=2.625/d1)*x+.984375}}$.extend($.easing,{def:"easeOutQuad",swing:function(x){return $.easing[$.easing.def](x)},easeInQuad:function(x){return x*x},easeOutQuad:function(x){return 1-(1-x)*(1-x)},easeInOutQuad:function(x){return x<.5?2*x*x:1-pow(-2*x+2,2)/2},easeInCubic:function(x){return x*x*x},easeOutCubic:function(x){return 1-pow(1-x,3)},easeInOutCubic:function(x){return x<.5?4*x*x*x:1-pow(-2*x+2,3)/2},easeInQuart:function(x){return x*x*x*x},easeOutQuart:function(x){return 1-pow(1-x,4)},easeInOutQuart:function(x){return x<.5?8*x*x*x*x:1-pow(-2*x+2,4)/2},easeInQuint:function(x){return x*x*x*x*x},easeOutQuint:function(x){return 1-pow(1-x,5)},easeInOutQuint:function(x){return x<.5?16*x*x*x*x*x:1-pow(-2*x+2,5)/2},easeInSine:function(x){return 1-cos(x*PI/2)},easeOutSine:function(x){return sin(x*PI/2)},easeInOutSine:function(x){return-(cos(PI*x)-1)/2},easeInExpo:function(x){return x===0?0:pow(2,10*x-10)},easeOutExpo:function(x){return x===1?1:1-pow(2,-10*x)},easeInOutExpo:function(x){return x===0?0:x===1?1:x<.5?pow(2,20*x-10)/2:(2-pow(2,-20*x+10))/2},easeInCirc:function(x){return 1-sqrt(1-pow(x,2))},easeOutCirc:function(x){return sqrt(1-pow(x-1,2))},easeInOutCirc:function(x){return x<.5?(1-sqrt(1-pow(2*x,2)))/2:(sqrt(1-pow(-2*x+2,2))+1)/2},easeInElastic:function(x){return x===0?0:x===1?1:-pow(2,10*x-10)*sin((x*10-10.75)*c4)},easeOutElastic:function(x){return x===0?0:x===1?1:pow(2,-10*x)*sin((x*10-.75)*c4)+1},easeInOutElastic:function(x){return x===0?0:x===1?1:x<.5?-(pow(2,20*x-10)*sin((20*x-11.125)*c5))/2:pow(2,-20*x+10)*sin((20*x-11.125)*c5)/2+1},easeInBack:function(x){return c3*x*x*x-c1*x*x},easeOutBack:function(x){return 1+c3*pow(x-1,3)+c1*pow(x-1,2)},easeInOutBack:function(x){return x<.5?pow(2*x,2)*((c2+1)*2*x-c2)/2:(pow(2*x-2,2)*((c2+1)*(x*2-2)+c2)+2)/2},easeInBounce:function(x){return 1-bounceOut(1-x)},easeOutBounce:bounceOut,easeInOutBounce:function(x){return x<.5?(1-bounceOut(1-2*x))/2:(1+bounceOut(2*x-1))/2}})}); -------------------------------------------------------------------------------- /static/assets/logo/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/assets/logo/favicon.png -------------------------------------------------------------------------------- /static/assets/logo/gy.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/assets/logo/gy.jpeg -------------------------------------------------------------------------------- /static/css/commons.css: -------------------------------------------------------------------------------- 1 | body{ 2 | margin: 0; 3 | } 4 | img { 5 | border: 0; 6 | } 7 | 8 | .left { 9 | float: left; 10 | } 11 | 12 | .right { 13 | float: right; 14 | } 15 | 16 | .font-16{ 17 | font-size: 16px !important; 18 | } 19 | .clearfix:after { 20 | clear: both; 21 | display: block; 22 | visibility: hidden; 23 | height: 0; 24 | } 25 | .bg-danger { 26 | background-color: #d9534f !important; 27 | color: #ffffff; 28 | } 29 | .bg-success { 30 | background-color: #5cb85c !important; 31 | color: #ffffff; 32 | } 33 | 34 | .badge { 35 | display: inline-block; 36 | min-width: 10px; 37 | padding: 3px 7px; 38 | font-size: 12px; 39 | font-weight: bold; 40 | line-height: 1; 41 | color: #fff; 42 | text-align: center; 43 | white-space: nowrap; 44 | vertical-align: baseline; 45 | background-color: #777; 46 | border-radius: 10px; 47 | } 48 | .img-circle { 49 | border-radius: 50%; 50 | } -------------------------------------------------------------------------------- /static/css/phone_response.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/css/phone_response.css -------------------------------------------------------------------------------- /static/css/search-group.css: -------------------------------------------------------------------------------- 1 | .search-group { 2 | padding: 5px 10px; 3 | } 4 | 5 | .search-group .row .whole { 6 | min-width: 40px; 7 | float: left; 8 | display: inline-block; 9 | padding: 5px 0 5px 8px; 10 | margin: 3px; 11 | font-weight: bold; 12 | 13 | } 14 | 15 | .search-group .row .others { 16 | padding-left: 60px; 17 | } 18 | 19 | .search-group .row a { 20 | display: inline-block; 21 | padding: 5px 8px; 22 | margin: 3px; 23 | border: 1px solid #d4d4d4; 24 | 25 | } 26 | 27 | .search-group .row a { 28 | display: inline-block; 29 | padding: 5px 8px; 30 | margin: 3px; 31 | border: 1px solid #d4d4d4; 32 | } 33 | 34 | .search-group a.active { 35 | color: #fff; 36 | background-color: #337ab7; 37 | border-color: #2e6da4; 38 | } -------------------------------------------------------------------------------- /static/imgs/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/bg.jpg -------------------------------------------------------------------------------- /static/imgs/count_img.jpg.back: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/count_img.jpg.back -------------------------------------------------------------------------------- /static/imgs/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/default.png -------------------------------------------------------------------------------- /static/imgs/import.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/import.gif -------------------------------------------------------------------------------- /static/imgs/luffy-study-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/luffy-study-logo.png -------------------------------------------------------------------------------- /static/imgs/luffy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/luffy.png -------------------------------------------------------------------------------- /static/imgs/nav.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/nav.swf -------------------------------------------------------------------------------- /static/imgs/phone_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/phone_account.png -------------------------------------------------------------------------------- /static/imgs/python.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/python.ico -------------------------------------------------------------------------------- /static/imgs/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/imgs/title.png -------------------------------------------------------------------------------- /static/js/jquery.easing.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],function($){return factory($)})}else if(typeof module==="object"&&typeof module.exports==="object"){exports=factory(require("jquery"))}else{factory(jQuery)}})(function($){$.easing.jswing=$.easing.swing;var pow=Math.pow,sqrt=Math.sqrt,sin=Math.sin,cos=Math.cos,PI=Math.PI,c1=1.70158,c2=c1*1.525,c3=c1+1,c4=2*PI/3,c5=2*PI/4.5;function bounceOut(x){var n1=7.5625,d1=2.75;if(x<1/d1){return n1*x*x}else if(x<2/d1){return n1*(x-=1.5/d1)*x+.75}else if(x<2.5/d1){return n1*(x-=2.25/d1)*x+.9375}else{return n1*(x-=2.625/d1)*x+.984375}}$.extend($.easing,{def:"easeOutQuad",swing:function(x){return $.easing[$.easing.def](x)},easeInQuad:function(x){return x*x},easeOutQuad:function(x){return 1-(1-x)*(1-x)},easeInOutQuad:function(x){return x<.5?2*x*x:1-pow(-2*x+2,2)/2},easeInCubic:function(x){return x*x*x},easeOutCubic:function(x){return 1-pow(1-x,3)},easeInOutCubic:function(x){return x<.5?4*x*x*x:1-pow(-2*x+2,3)/2},easeInQuart:function(x){return x*x*x*x},easeOutQuart:function(x){return 1-pow(1-x,4)},easeInOutQuart:function(x){return x<.5?8*x*x*x*x:1-pow(-2*x+2,4)/2},easeInQuint:function(x){return x*x*x*x*x},easeOutQuint:function(x){return 1-pow(1-x,5)},easeInOutQuint:function(x){return x<.5?16*x*x*x*x*x:1-pow(-2*x+2,5)/2},easeInSine:function(x){return 1-cos(x*PI/2)},easeOutSine:function(x){return sin(x*PI/2)},easeInOutSine:function(x){return-(cos(PI*x)-1)/2},easeInExpo:function(x){return x===0?0:pow(2,10*x-10)},easeOutExpo:function(x){return x===1?1:1-pow(2,-10*x)},easeInOutExpo:function(x){return x===0?0:x===1?1:x<.5?pow(2,20*x-10)/2:(2-pow(2,-20*x+10))/2},easeInCirc:function(x){return 1-sqrt(1-pow(x,2))},easeOutCirc:function(x){return sqrt(1-pow(x-1,2))},easeInOutCirc:function(x){return x<.5?(1-sqrt(1-pow(2*x,2)))/2:(sqrt(1-pow(-2*x+2,2))+1)/2},easeInElastic:function(x){return x===0?0:x===1?1:-pow(2,10*x-10)*sin((x*10-10.75)*c4)},easeOutElastic:function(x){return x===0?0:x===1?1:pow(2,-10*x)*sin((x*10-.75)*c4)+1},easeInOutElastic:function(x){return x===0?0:x===1?1:x<.5?-(pow(2,20*x-10)*sin((20*x-11.125)*c5))/2:pow(2,-20*x+10)*sin((20*x-11.125)*c5)/2+1},easeInBack:function(x){return c3*x*x*x-c1*x*x},easeOutBack:function(x){return 1+c3*pow(x-1,3)+c1*pow(x-1,2)},easeInOutBack:function(x){return x<.5?pow(2*x,2)*((c2+1)*2*x-c2)/2:(pow(2*x-2,2)*((c2+1)*(x*2-2)+c2)+2)/2},easeInBounce:function(x){return 1-bounceOut(1-x)},easeOutBounce:bounceOut,easeInOutBounce:function(x){return x<.5?(1-bounceOut(1-2*x))/2:(1+bounceOut(2*x-1))/2}})}); -------------------------------------------------------------------------------- /static/js/silder.js: -------------------------------------------------------------------------------- 1 | var obj=null; 2 | var As=document.getElementById('nav').getElementsByTagName('a'); 3 | obj = As[0]; 4 | for(i=1;i=0) 5 | obj=As[i];} 6 | obj.id='nav_current' 7 | -------------------------------------------------------------------------------- /static/plugins/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/plugins/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /static/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /static/plugins/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /static/plugins/flv.js/.eslintignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ -------------------------------------------------------------------------------- /static/plugins/flv.js/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "eslint:recommended", 3 | "parserOptions": { 4 | "ecmaVersion": 6, 5 | "sourceType": "module", 6 | "ecmaFeatures": { 7 | "impliedStrict": true 8 | } 9 | }, 10 | "env": { 11 | "es6": true, 12 | "worker": true, 13 | "node": true, 14 | "browser": true 15 | }, 16 | "rules": { 17 | "keyword-spacing": [2, { 18 | "overrides": { 19 | "if": {"after": true}, 20 | "for": {"after": true}, 21 | "while": {"after": true}, 22 | "switch": {"after": true}, 23 | "catch": {"after": true} 24 | } 25 | }], 26 | "key-spacing": [2, {"beforeColon": false, "afterColon": true, "mode": "strict"}], 27 | "arrow-spacing": 2, 28 | "comma-spacing": 2, 29 | "comma-style": 2, 30 | "indent": [2, 4, {"SwitchCase": 1}], 31 | "no-var": 2, 32 | "no-bitwise": 0, 33 | "no-alert": 2, 34 | "no-console": 0, 35 | "no-debugger": 1, 36 | "no-unused-vars": 0, 37 | "no-mixed-spaces-and-tabs": 2, 38 | "quotes": [2, "single", "avoid-escape"], 39 | "semi": 2, 40 | "semi-spacing": 2, 41 | "space-before-blocks": 2, 42 | "space-before-function-paren": [2, {"anonymous": "always", "named": "never"}], 43 | "space-in-parens": [2, "never"], 44 | "space-infix-ops": 2 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /static/plugins/flv.js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "flv.js", 3 | "_id": "flv.js@1.6.2", 4 | "_inBundle": false, 5 | "_integrity": "sha512-xre4gUbX1MPtgQRKj2pxJENp/RnaHaxYvy3YToVVCrSmAWUu85b9mug6pTXF6zakUjNP2lFWZ1rkSX7gxhB/2A==", 6 | "_location": "/flv.js", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "tag", 10 | "registry": true, 11 | "raw": "flv.js", 12 | "name": "flv.js", 13 | "escapedName": "flv.js", 14 | "rawSpec": "", 15 | "saveSpec": null, 16 | "fetchSpec": "latest" 17 | }, 18 | "_requiredBy": [ 19 | "#USER", 20 | "/" 21 | ], 22 | "_resolved": "https://registry.npmjs.org/flv.js/-/flv.js-1.6.2.tgz", 23 | "_shasum": "fa3340fe3f7ee01d3977f7876aee66b8436e5922", 24 | "_spec": "flv.js", 25 | "_where": "C:\\Users\\Administrator\\Desktop\\网格", 26 | "author": { 27 | "name": "zheng qian", 28 | "email": "xqq@xqq.im" 29 | }, 30 | "bugs": { 31 | "url": "https://github.com/Bilibili/flv.js/issues" 32 | }, 33 | "bundleDependencies": false, 34 | "dependencies": { 35 | "es6-promise": "^4.2.8", 36 | "webworkify-webpack": "^2.1.5" 37 | }, 38 | "deprecated": false, 39 | "description": "HTML5 FLV Player", 40 | "devDependencies": { 41 | "@types/node": "^16.3.3", 42 | "@typescript-eslint/eslint-plugin": "^4.28.3", 43 | "@typescript-eslint/parser": "^4.28.3", 44 | "browser-sync": "^2.27.4", 45 | "eslint": "^7.30.0", 46 | "exports-loader": "^3.0.0", 47 | "source-map-loader": "^3.0.0", 48 | "terser-webpack-plugin": "^5.1.4", 49 | "ts-loader": "^9.2.3", 50 | "typescript": "^4.3.5", 51 | "webpack": "^5.45.1", 52 | "webpack-cli": "^4.7.2" 53 | }, 54 | "homepage": "https://github.com/Bilibili/flv.js#readme", 55 | "keywords": [ 56 | "html5", 57 | "flv", 58 | "mse", 59 | "javascript" 60 | ], 61 | "license": "Apache-2.0", 62 | "main": "./dist/flv.js", 63 | "name": "flv.js", 64 | "repository": { 65 | "type": "git", 66 | "url": "git+https://github.com/Bilibili/flv.js.git" 67 | }, 68 | "scripts": { 69 | "build": "webpack --mode=production --progress", 70 | "build:debug": "webpack --mode=development --progress", 71 | "dev": "webpack --mode=development --progress --watch", 72 | "dtslint": "dtslint types" 73 | }, 74 | "types": "./d.ts/flv.d.ts", 75 | "version": "1.6.2" 76 | } 77 | -------------------------------------------------------------------------------- /static/plugins/flv.js/src/config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | export const defaultConfig = { 20 | enableWorker: false, 21 | enableStashBuffer: true, 22 | stashInitialSize: undefined, 23 | 24 | isLive: false, 25 | 26 | lazyLoad: true, 27 | lazyLoadMaxDuration: 3 * 60, 28 | lazyLoadRecoverDuration: 30, 29 | deferLoadAfterSourceOpen: true, 30 | 31 | // autoCleanupSourceBuffer: default as false, leave unspecified 32 | autoCleanupMaxBackwardDuration: 3 * 60, 33 | autoCleanupMinBackwardDuration: 2 * 60, 34 | 35 | statisticsInfoReportInterval: 600, 36 | 37 | fixAudioTimestampGap: true, 38 | 39 | accurateSeek: false, 40 | seekType: 'range', // [range, param, custom] 41 | seekParamStart: 'bstart', 42 | seekParamEnd: 'bend', 43 | rangeLoadZeroStart: false, 44 | customSeekHandler: undefined, 45 | reuseRedirectedURL: false, 46 | // referrerPolicy: leave as unspecified 47 | 48 | headers: undefined, 49 | customLoader: undefined 50 | }; 51 | 52 | export function createDefaultConfig() { 53 | return Object.assign({}, defaultConfig); 54 | } -------------------------------------------------------------------------------- /static/plugins/flv.js/src/core/mse-events.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | const MSEEvents = { 20 | ERROR: 'error', 21 | SOURCE_OPEN: 'source_open', 22 | UPDATE_END: 'update_end', 23 | BUFFER_FULL: 'buffer_full' 24 | }; 25 | 26 | export default MSEEvents; -------------------------------------------------------------------------------- /static/plugins/flv.js/src/core/transmuxing-events.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | const TransmuxingEvents = { 20 | IO_ERROR: 'io_error', 21 | DEMUX_ERROR: 'demux_error', 22 | INIT_SEGMENT: 'init_segment', 23 | MEDIA_SEGMENT: 'media_segment', 24 | LOADING_COMPLETE: 'loading_complete', 25 | RECOVERED_EARLY_EOF: 'recovered_early_eof', 26 | MEDIA_INFO: 'media_info', 27 | METADATA_ARRIVED: 'metadata_arrived', 28 | SCRIPTDATA_ARRIVED: 'scriptdata_arrived', 29 | STATISTICS_INFO: 'statistics_info', 30 | RECOMMEND_SEEKPOINT: 'recommend_seekpoint' 31 | }; 32 | 33 | export default TransmuxingEvents; -------------------------------------------------------------------------------- /static/plugins/flv.js/src/demux/demux-errors.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | const DemuxErrors = { 20 | OK: 'OK', 21 | FORMAT_ERROR: 'FormatError', 22 | FORMAT_UNSUPPORTED: 'FormatUnsupported', 23 | CODEC_UNSUPPORTED: 'CodecUnsupported' 24 | }; 25 | 26 | export default DemuxErrors; -------------------------------------------------------------------------------- /static/plugins/flv.js/src/index.js: -------------------------------------------------------------------------------- 1 | // entry/index file 2 | 3 | // make it compatible with browserify's umd wrapper 4 | module.exports = require('./flv.js').default; 5 | -------------------------------------------------------------------------------- /static/plugins/flv.js/src/io/range-seek-handler.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | class RangeSeekHandler { 20 | 21 | constructor(zeroStart) { 22 | this._zeroStart = zeroStart || false; 23 | } 24 | 25 | getConfig(url, range) { 26 | let headers = {}; 27 | 28 | if (range.from !== 0 || range.to !== -1) { 29 | let param; 30 | if (range.to !== -1) { 31 | param = `bytes=${range.from.toString()}-${range.to.toString()}`; 32 | } else { 33 | param = `bytes=${range.from.toString()}-`; 34 | } 35 | headers['Range'] = param; 36 | } else if (this._zeroStart) { 37 | headers['Range'] = 'bytes=0-'; 38 | } 39 | 40 | return { 41 | url: url, 42 | headers: headers 43 | }; 44 | } 45 | 46 | removeURLParameters(seekedURL) { 47 | return seekedURL; 48 | } 49 | 50 | } 51 | 52 | export default RangeSeekHandler; -------------------------------------------------------------------------------- /static/plugins/flv.js/src/player/player-errors.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | import {LoaderErrors} from '../io/loader.js'; 20 | import DemuxErrors from '../demux/demux-errors.js'; 21 | 22 | export const ErrorTypes = { 23 | NETWORK_ERROR: 'NetworkError', 24 | MEDIA_ERROR: 'MediaError', 25 | OTHER_ERROR: 'OtherError' 26 | }; 27 | 28 | export const ErrorDetails = { 29 | NETWORK_EXCEPTION: LoaderErrors.EXCEPTION, 30 | NETWORK_STATUS_CODE_INVALID: LoaderErrors.HTTP_STATUS_CODE_INVALID, 31 | NETWORK_TIMEOUT: LoaderErrors.CONNECTING_TIMEOUT, 32 | NETWORK_UNRECOVERABLE_EARLY_EOF: LoaderErrors.UNRECOVERABLE_EARLY_EOF, 33 | 34 | MEDIA_MSE_ERROR: 'MediaMSEError', 35 | 36 | MEDIA_FORMAT_ERROR: DemuxErrors.FORMAT_ERROR, 37 | MEDIA_FORMAT_UNSUPPORTED: DemuxErrors.FORMAT_UNSUPPORTED, 38 | MEDIA_CODEC_UNSUPPORTED: DemuxErrors.CODEC_UNSUPPORTED 39 | }; -------------------------------------------------------------------------------- /static/plugins/flv.js/src/player/player-events.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | const PlayerEvents = { 20 | ERROR: 'error', 21 | LOADING_COMPLETE: 'loading_complete', 22 | RECOVERED_EARLY_EOF: 'recovered_early_eof', 23 | MEDIA_INFO: 'media_info', 24 | METADATA_ARRIVED: 'metadata_arrived', 25 | SCRIPTDATA_ARRIVED: 'scriptdata_arrived', 26 | STATISTICS_INFO: 'statistics_info' 27 | }; 28 | 29 | export default PlayerEvents; -------------------------------------------------------------------------------- /static/plugins/flv.js/src/utils/exception.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | export class RuntimeException { 20 | 21 | constructor(message) { 22 | this._message = message; 23 | } 24 | 25 | get name() { 26 | return 'RuntimeException'; 27 | } 28 | 29 | get message() { 30 | return this._message; 31 | } 32 | 33 | toString() { 34 | return this.name + ': ' + this.message; 35 | } 36 | 37 | } 38 | 39 | export class IllegalStateException extends RuntimeException { 40 | 41 | constructor(message) { 42 | super(message); 43 | } 44 | 45 | get name() { 46 | return 'IllegalStateException'; 47 | } 48 | 49 | } 50 | 51 | export class InvalidArgumentException extends RuntimeException { 52 | 53 | constructor(message) { 54 | super(message); 55 | } 56 | 57 | get name() { 58 | return 'InvalidArgumentException'; 59 | } 60 | 61 | } 62 | 63 | export class NotImplementedException extends RuntimeException { 64 | 65 | constructor(message) { 66 | super(message); 67 | } 68 | 69 | get name() { 70 | return 'NotImplementedException'; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /static/plugins/flv.js/src/utils/polyfill.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili. All Rights Reserved. 3 | * 4 | * @author zheng qian 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | class Polyfill { 20 | 21 | static install() { 22 | // ES6 Object.setPrototypeOf 23 | Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) { 24 | obj.__proto__ = proto; 25 | return obj; 26 | }; 27 | 28 | // ES6 Object.assign 29 | Object.assign = Object.assign || function (target) { 30 | if (target === undefined || target === null) { 31 | throw new TypeError('Cannot convert undefined or null to object'); 32 | } 33 | 34 | let output = Object(target); 35 | for (let i = 1; i < arguments.length; i++) { 36 | let source = arguments[i]; 37 | if (source !== undefined && source !== null) { 38 | for (let key in source) { 39 | if (source.hasOwnProperty(key)) { 40 | output[key] = source[key]; 41 | } 42 | } 43 | } 44 | } 45 | return output; 46 | }; 47 | 48 | // ES6 Promise (missing support in IE11) 49 | if (typeof self.Promise !== 'function') { 50 | require('es6-promise').polyfill(); 51 | } 52 | } 53 | 54 | } 55 | 56 | Polyfill.install(); 57 | 58 | export default Polyfill; -------------------------------------------------------------------------------- /static/plugins/flv.js/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "allowJs": true, 5 | "sourceMap": true, 6 | "module": "es6", 7 | "target": "es5", 8 | "experimentalDecorators": true, 9 | "declaration": true, 10 | "declarationDir": "./d.ts/", 11 | "lib": ["dom", "es5", "es2015.promise", "es2015.collection"] 12 | }, 13 | "include": [ 14 | "./src/**/*", 15 | ] 16 | } -------------------------------------------------------------------------------- /static/plugins/flv.js/tslint.json: -------------------------------------------------------------------------------- 1 | { "extends": "dtslint/dt.json" } 2 | -------------------------------------------------------------------------------- /static/plugins/flv.js/types/index.d.ts: -------------------------------------------------------------------------------- 1 | // TypeScript Version: 2.3 2 | 3 | import '../d.ts/flv.d.ts'; 4 | -------------------------------------------------------------------------------- /static/plugins/flv.js/types/test-flv.ts: -------------------------------------------------------------------------------- 1 | import flvjs from '../'; 2 | 3 | type LoaderStatusAlias = flvjs.LoaderStatus; 4 | type LoaderErrorsAlias = flvjs.LoaderErrors; 5 | 6 | interface MediaDataSourceExt extends flvjs.MediaDataSource { 7 | example: string; 8 | } 9 | -------------------------------------------------------------------------------- /static/plugins/flv.js/types/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "lib": [ 5 | "es6", 6 | "dom" 7 | ], 8 | "noImplicitAny": true, 9 | "noImplicitThis": true, 10 | "strictNullChecks": true, 11 | "strictFunctionTypes": true, 12 | "baseUrl": "./", 13 | "typeRoots": [ 14 | "./" 15 | ], 16 | "types": [], 17 | "noEmit": true, 18 | "forceConsistentCasingInFileNames": true 19 | }, 20 | "files": [ 21 | "index.d.ts", 22 | "../d.ts/flv.d.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /static/plugins/flv.js/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const pkg = require('./package.json'); 3 | const path = require('path'); 4 | const TerserPlugin = require('terser-webpack-plugin'); 5 | 6 | let config = { 7 | entry: './src/index.js', 8 | output: { 9 | filename: 'flv.js', 10 | path: path.resolve(__dirname, 'dist'), 11 | library: 'flvjs', 12 | libraryTarget: 'umd', 13 | environment: { 14 | arrowFunction: false, 15 | bigIntLiteral: false, 16 | const: false, 17 | destructuring: false, 18 | dynamicImport: false, 19 | forOf: false, 20 | module: false 21 | } 22 | }, 23 | 24 | devtool: 'source-map', 25 | 26 | resolve: { 27 | extensions: ['.ts', '.tsx', '.js', '.json'], 28 | fallback: { 29 | fs: false, 30 | path: false 31 | } 32 | }, 33 | 34 | plugins: [ 35 | new webpack.DefinePlugin({ 36 | __VERSION__: JSON.stringify(pkg.version) 37 | }) 38 | ], 39 | 40 | optimization: { 41 | minimizer: [ 42 | new TerserPlugin({ 43 | extractComments: false, 44 | }) 45 | ] 46 | }, 47 | 48 | module: { 49 | rules: [ 50 | { 51 | test: /\.(ts|js)$/, 52 | use: 'ts-loader', 53 | exclude: /node-modules/ 54 | }, 55 | { 56 | enforce: 'pre', 57 | test: /\.js$/, 58 | use: 'source-map-loader' 59 | } 60 | ] 61 | } 62 | }; 63 | 64 | module.exports = (env, argv) => { 65 | if (argv.mode === 'production') { 66 | config.output.filename = 'flv.min.js'; 67 | } 68 | 69 | return config; 70 | }; 71 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /static/plugins/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/plugins/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/plugins/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/plugins/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/plugins/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/plugins/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /static/rbac/js/rbac.js: -------------------------------------------------------------------------------- 1 | (function (jq) { 2 | jq('.multi-menu .title').click(function () { 3 | $(this).next().toggleClass('hide'); 4 | }); 5 | })(jQuery); 6 | -------------------------------------------------------------------------------- /static/stark/css/commons.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | 5 | img { 6 | border: 0; 7 | } 8 | 9 | .left { 10 | float: left; 11 | } 12 | 13 | .right { 14 | float: right; 15 | } 16 | 17 | .font-16 { 18 | font-size: 16px !important; 19 | } 20 | 21 | .clearfix:after { 22 | clear: both; 23 | display: block; 24 | visibility: hidden; 25 | height: 0; 26 | } 27 | 28 | .bg-danger { 29 | background-color: #d9534f !important; 30 | color: #ffffff; 31 | } 32 | 33 | .bg-success { 34 | background-color: #5cb85c !important; 35 | color: #ffffff; 36 | } 37 | 38 | .badge { 39 | display: inline-block; 40 | min-width: 10px; 41 | padding: 3px 7px; 42 | font-size: 12px; 43 | font-weight: bold; 44 | line-height: 1; 45 | color: #fff; 46 | text-align: center; 47 | white-space: nowrap; 48 | vertical-align: baseline; 49 | background-color: #777; 50 | border-radius: 10px; 51 | } 52 | 53 | .img-circle { 54 | border-radius: 50%; 55 | } 56 | 57 | body { 58 | margin: 0; 59 | } 60 | 61 | .no-radius { 62 | border-radius: 0; 63 | } 64 | 65 | .no-margin { 66 | margin: 0; 67 | } 68 | 69 | .pg-body > .left-menu { 70 | background-color: #EAEDF1; 71 | position: absolute; 72 | left: 1px; 73 | top: 48px; 74 | bottom: 0; 75 | width: 220px; 76 | border: 1px solid #EAEDF1; 77 | overflow: auto; 78 | } 79 | 80 | .pg-body > .right-body { 81 | position: absolute; 82 | left: 225px; 83 | right: 0; 84 | top: 48px; 85 | bottom: 0; 86 | overflow: scroll; 87 | border: 1px solid #ddd; 88 | border-top: 0; 89 | font-size: 13px; 90 | min-width: 755px; 91 | } 92 | 93 | .navbar-right { 94 | float: right !important; 95 | margin-right: -15px; 96 | } 97 | 98 | .luffy-container { 99 | padding: 15px; 100 | } -------------------------------------------------------------------------------- /static/stark/css/search-group.css: -------------------------------------------------------------------------------- 1 | .search-group { 2 | padding: 5px 10px; 3 | } 4 | 5 | .search-group .row .whole { 6 | min-width: 40px; 7 | float: left; 8 | display: inline-block; 9 | padding: 5px 0 5px 8px; 10 | margin: 3px; 11 | font-weight: bold; 12 | 13 | } 14 | 15 | .search-group .row .others { 16 | padding-left: 60px; 17 | } 18 | 19 | .search-group .row a { 20 | display: inline-block; 21 | padding: 5px 8px; 22 | margin: 3px; 23 | border: 1px solid #d4d4d4; 24 | 25 | } 26 | 27 | .search-group .row a { 28 | display: inline-block; 29 | padding: 5px 8px; 30 | margin: 3px; 31 | border: 1px solid #d4d4d4; 32 | } 33 | 34 | .search-group a.active { 35 | color: #fff; 36 | background-color: #337ab7; 37 | border-color: #2e6da4; 38 | } -------------------------------------------------------------------------------- /static/stark/imgs/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/imgs/default.png -------------------------------------------------------------------------------- /static/stark/imgs/luffy-study-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/imgs/luffy-study-logo.png -------------------------------------------------------------------------------- /static/stark/imgs/luffy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/imgs/luffy.png -------------------------------------------------------------------------------- /static/stark/imgs/timg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/imgs/timg.jpg -------------------------------------------------------------------------------- /static/stark/imgs/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/imgs/title.png -------------------------------------------------------------------------------- /static/stark/plugins/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/stark/plugins/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/stark/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /static/stark/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /static/stark/plugins/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /static/stark/plugins/datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Simplified Chinese translation for bootstrap-datetimepicker 3 | * Yuan Cheung 4 | */ 5 | ;(function($){ 6 | $.fn.datetimepicker.dates['zh-CN'] = { 7 | days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], 8 | daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], 9 | daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], 10 | months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], 11 | monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], 12 | today: "今天", 13 | suffix: [], 14 | meridiem: ["上午", "下午"] 15 | }; 16 | }(jQuery)); 17 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/static/stark/plugins/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/stark/plugins/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /vision/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/vision/__init__.py -------------------------------------------------------------------------------- /vision/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /vision/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class VisionConfig(AppConfig): 5 | name = 'vision' 6 | -------------------------------------------------------------------------------- /vision/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bodyncp/deepstream-django/31a4fcd05275db8dcb521c2500354b613fe73436/vision/migrations/__init__.py -------------------------------------------------------------------------------- /vision/stark.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 2020/3/10 10:16 4 | # @Author : NCP 5 | # @File : stark.py 6 | # @Software: PyCharm 7 | 8 | from stark.service.v1 import site 9 | from vision import models 10 | from vision.views.userinfo import UserInfoHandler 11 | from vision.views.point_info import PointInfoHandler 12 | from vision.views.edge_driver import EdgeDriverHandler 13 | from vision.views.person_count import PersonPostInfoHandler 14 | from vision.views.edge_driver_control import EdgeDriverSshHandler 15 | 16 | 17 | site.register(models.UserInfoExtent, UserInfoHandler) 18 | site.register(models.PointInfo, PointInfoHandler) 19 | site.register(models.EdgeDriver, EdgeDriverHandler) 20 | site.register(models.PersonPostInfo, PersonPostInfoHandler) 21 | site.register(models.EdgeDriverSsh, EdgeDriverSshHandler) 22 | 23 | -------------------------------------------------------------------------------- /vision/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | 5 | import paramiko 6 | import sys 7 | 8 | ssh = paramiko.SSHClient() 9 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 10 | try: 11 | ssh.connect('192.168.2.53', username='ncp', password='123123', timeout=5) 12 | except Exception as e: 13 | print(e) 14 | sys.exit() 15 | 16 | # cmd = 'ps -ef | grep python3' 17 | # cmd = 'cd /opt/nvidia/deepstream/deepstream-5.1/sources/deepstream_python_apps/apps/jetson_pro;ls -l' 18 | # cmd = """sh -c 'cd home;ls -l'""" 19 | # cmd_run = 'cd /opt/nvidia/deepstream/deepstream-5.1/sources/deepstream_python_apps/apps/jetson_pro;nohup /bin/sh start.sh 2>&1 &' 20 | cmd_run = 'ps -ef | grep node' 21 | # cmd_ping = 'ping -c 2 192.168.2.29' 22 | # 23 | # print("------------------------") 24 | # _, stdout, stderr = ssh.exec_command(cmd_ping) 25 | # 26 | # data = stdout.read().decode("utf-8") 27 | # data = data.split('\n') 28 | # for i in data: 29 | # if " 0 received" in i: 30 | # print("driver is not found") 31 | # sys.exit() 32 | _, stdout, stderr = ssh.exec_command(cmd_run, 4096) 33 | # while True: 34 | # line = stdout.readline() 35 | # if not line: 36 | # break 37 | # print(line) 38 | # stdin, stdout, stderr = ssh.exec_command(cmd) 39 | data = stdout.readlines() 40 | if stderr.read(): 41 | print(stderr.read()) 42 | if data: 43 | print(data) 44 | for i in data: 45 | if "node app.js" in i: 46 | print(i) 47 | if "python3 enrty.py" in i: 48 | print(i) 49 | continue 50 | 51 | ssh.close() 52 | sys.exit() 53 | -------------------------------------------------------------------------------- /vision/utils/batch_add_user.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 2020/10/13 19:37 4 | # @Author : NCP 5 | # @File : batch_add_user.py 6 | # @Software: PyCharm 7 | 8 | from django.db import connection 9 | from vision.utils.md5 import gen_md5 10 | from django.db import transaction 11 | 12 | 13 | def func(): 14 | cursor = connection.cursor() 15 | return cursor 16 | 17 | 18 | def batch_user(data_list): 19 | try: 20 | with transaction.atomic(): 21 | pwd = gen_md5(data_list[1]) 22 | cursor = func() 23 | 24 | # 添加用户 25 | cursor.execute("insert into vision_userinfoextent(name,password) values(%s,'%s')" % (data_list[0], pwd)) 26 | # 查询新增用户ID,添加用户角色 27 | cursor.execute("select id from vision_userinfoextent where name='%s'" % data_list[0]) 28 | user_id = cursor.fetchone() 29 | cursor.execute("select id from rbac_role where title='报表用户'") 30 | role_id = cursor.fetchone() 31 | print(user_id, role_id) 32 | cursor.execute( 33 | "insert into vision_userinfoextent_roles(userinfoextent_id, role_id) values(%s, %s)" % (user_id[0], role_id[0])) 34 | cursor.close() 35 | return True 36 | except Exception as e: 37 | print(e) 38 | return str(e) 39 | -------------------------------------------------------------------------------- /vision/utils/md5.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | import hashlib 4 | 5 | 6 | def gen_md5(origin): 7 | """ 8 | md5加密 9 | :param origin: 10 | :return: 11 | """ 12 | ha = hashlib.md5(b'jk3usodfjwkrsdf') 13 | ha.update(origin.encode('utf-8')) 14 | return ha.hexdigest() 15 | 16 | 17 | def rtmp_md5(origin): 18 | """ 19 | rtmp流地址加密访问 20 | :param origin: 21 | :return: 22 | """ 23 | ha = hashlib.md5() 24 | ha.update(origin.encode(encoding='utf-8')) 25 | return ha.hexdigest() -------------------------------------------------------------------------------- /vision/views/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 2021/9/12 9:21 4 | # @Author : NCP 5 | # @File : __init__.py.py 6 | # @Software: PyCharm -------------------------------------------------------------------------------- /vision/views/download.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 2020/2/17 21:07 4 | # @Author : NCP 5 | # @File : download.py 6 | # @Software: PyCharm 7 | 8 | from stark.service.v1 import queryset_dict 9 | from django.http import StreamingHttpResponse 10 | import pandas as pd 11 | from collections import OrderedDict 12 | 13 | 14 | def download_file(request, *args, **kwargs): 15 | new_data_queryset = queryset_dict["download_data"] 16 | 17 | # 打开excel 18 | writer = pd.ExcelWriter(str("download_data")+".xls") 19 | data_dict = OrderedDict() 20 | # print(new_data_queryset._meta.fields) 21 | for data_obj in new_data_queryset: 22 | if not data_dict.get("统计点位名称"): 23 | data_dict["统计点位名称"] = [data_obj.point_name] 24 | else: 25 | data_dict["统计点位名称"].append(data_obj.point_name) 26 | 27 | if not data_dict.get("进入流量"): 28 | data_dict["进入流量"] = [data_obj.point_in] 29 | else: 30 | data_dict["进入流量"].append(data_obj.point_in) 31 | 32 | if not data_dict.get("出去流量"): 33 | data_dict["出去流量"] = [data_obj.point_out] 34 | else: 35 | data_dict["出去流量"].append(data_obj.point_out) 36 | 37 | if not data_dict.get("统计时间"): 38 | data_dict["统计时间"] = [data_obj.date_time] 39 | else: 40 | data_dict["统计时间"].append(data_obj.date_time) 41 | 42 | df1 = pd.DataFrame(data=data_dict) 43 | df1.to_excel(writer, sheet_name='sheet1') 44 | writer.save() 45 | 46 | 47 | file = open(str("download_data")+".xls", 'rb') 48 | response = StreamingHttpResponse(file) 49 | response['Content-Type'] = 'application/octet-stream' 50 | response['Content-Disposition'] = 'attachment;filename="%s.xls"' % str("download_data") 51 | return response 52 | -------------------------------------------------------------------------------- /vision/views/edge_driver.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 2021/9/20 10:54 4 | # @Author : NCP 5 | # @File : edge_driver.py 6 | # @Software: PyCharm 7 | 8 | from django.conf import settings 9 | from stark.service.v1 import StarkHandler, StarkModelForm, Option 10 | from vision import models 11 | 12 | 13 | class EdgeDriverAddModelForm(StarkModelForm): 14 | class Meta: 15 | model = models.EdgeDriver 16 | fields = ['dname', 'driver_pull', 'bearing_point'] 17 | 18 | 19 | class EdgeDriverChangeModelForm(StarkModelForm): 20 | class Meta: 21 | model = models.EdgeDriver 22 | fields = ['dname', 'driver_pull', 'bearing_point'] 23 | 24 | 25 | class EdgeDriverHandler(StarkHandler): 26 | list_display = ['dname', 'driver_pull', 'bearing_point'] 27 | 28 | search_list = ['dname__contains'] 29 | 30 | # 这个方法适用于有关联字段的表 31 | # search_group = [ 32 | # Option(field="nick_name"), 33 | # ] 34 | 35 | def get_model_form_class(self, is_add=False, *args, **kwargs): 36 | if is_add: 37 | return EdgeDriverAddModelForm 38 | return EdgeDriverChangeModelForm 39 | 40 | # 权限粒度控制 41 | def get_add_btn(self, request, *args, **kwargs): 42 | permission_dict = request.session.get(settings.PERMISSION_SESSION_KEY) 43 | if self.get_add_url_name not in permission_dict: 44 | return None 45 | return super().get_add_btn(request, *args, **kwargs) 46 | 47 | # 编辑删除控制显示设置 48 | def get_list_display(self, request, *args, **kwargs): 49 | permission_dict = request.session.get(settings.PERMISSION_SESSION_KEY) 50 | 51 | value = [] 52 | if self.list_display: 53 | value.extend(self.list_display) 54 | if self.get_change_url_name in permission_dict and self.get_delete_url_name in permission_dict: 55 | value.append(type(self).display_edit_del) 56 | return value 57 | 58 | elif self.get_change_url_name in permission_dict: 59 | value.append(type(self).display_edit) 60 | elif self.get_change_url_name in permission_dict: 61 | value.append(type(self).display_del) 62 | return value 63 | -------------------------------------------------------------------------------- /vision/views/person_count.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 2021/9/20 10:43 4 | # @Author : NCP 5 | # @File : person_count.py 6 | # @Software: PyCharm 7 | 8 | from django.conf import settings 9 | from stark.service.v1 import StarkHandler, get_m2m_text, StarkModelForm, StarkForm, Option 10 | from vision import models 11 | 12 | 13 | class PersonPostInfoModelForm(StarkModelForm): 14 | 15 | class Meta: 16 | model = models.PersonPostInfo 17 | fields = ['point_name', 'point_in', 'point_out', 'date_time'] 18 | 19 | 20 | class PersonPostInfoChangeModelForm(StarkModelForm): 21 | class Meta: 22 | model = models.PersonPostInfo 23 | fields = ['point_name', 'point_in', 'point_out'] 24 | 25 | 26 | class PersonPostInfoHandler(StarkHandler): 27 | 28 | list_display = [StarkHandler.display_checkbox, 'point_name', 'point_in', 'point_out', 'date_time'] 29 | 30 | search_list = ['point_name__contains'] 31 | 32 | def get_model_form_class(self, is_add=False, *args, **kwargs): 33 | if is_add: 34 | return PersonPostInfoModelForm 35 | return PersonPostInfoChangeModelForm 36 | 37 | # 编辑删除控制显示设置 38 | def get_list_display(self, request, *args, **kwargs): 39 | permission_dict = request.session.get(settings.PERMISSION_SESSION_KEY) 40 | 41 | value = [] 42 | if self.list_display: 43 | value.extend(self.list_display) 44 | if self.get_change_url_name in permission_dict and self.get_delete_url_name in permission_dict: 45 | value.append(type(self).display_edit_del) 46 | return value 47 | 48 | elif self.get_change_url_name in permission_dict: 49 | value.append(type(self).display_edit) 50 | elif self.get_change_url_name in permission_dict: 51 | value.append(type(self).display_del) 52 | return value 53 | 54 | def action_multi_remove(self, request, *args, **kwargs): 55 | """ 56 | 批量移除 57 | :return: 58 | """ 59 | current_user_id = request.session['user_info']['id'] 60 | pk_list = request.POST.getlist('pk') 61 | self.model_class.objects.filter(id__in=pk_list).delete() 62 | 63 | action_multi_remove.text = "批量删除" 64 | 65 | action_list = [action_multi_remove] 66 | 67 | --------------------------------------------------------------------------------