├── .gitignore ├── Config ├── 123.xlsx ├── LibraryInstall.sh ├── VenvInit.sh ├── __init__.py ├── case_config.py ├── city.json ├── ui_config.py └── virtual_device.ini ├── Dockerfile ├── README.md ├── RootDirectory.py ├── UserInfo ├── Util │ ├── CheckPermissions.py │ └── __init__.py ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_userprofile_id.py │ ├── 0003_auto_20230427_1510.py │ └── __init__.py ├── models.py ├── serializers.py ├── tests.py ├── urls.py ├── views.py └── views │ ├── AuthorityManage.py │ ├── DingDingLogin.py │ ├── JobAuthorityManage.py │ ├── UserJobManage.py │ ├── __init__.py │ └── user.py ├── UwsgiScript └── uwsgi.ini ├── allure-2.7.0 ├── bin │ ├── allure │ └── allure.bat ├── config │ ├── allure-cucumber.yml │ ├── allure-junit.yml │ └── allure.yml ├── lib │ ├── allure-commandline-2.7.0.jar │ ├── allure-generator-2.7.0.jar │ ├── allure-plugin-api-2.7.0.jar │ ├── allure1-model-1.0.jar │ ├── allure2-model-api-1.0.0.jar │ ├── allure2-model-jackson-1.0.0.jar │ ├── allure2-model-pojo-1.0.0.jar │ ├── commons-beanutils-1.9.3.jar │ ├── commons-codec-1.10.jar │ ├── commons-collections-3.2.2.jar │ ├── commons-collections4-4.1.jar │ ├── commons-io-2.6.jar │ ├── commons-lang3-3.7.jar │ ├── commons-logging-1.2.jar │ ├── commons-text-1.4.jar │ ├── config │ │ ├── jetty-logging.properties │ │ └── log4j.properties │ ├── flexmark-0.34.8.jar │ ├── flexmark-util-0.34.8.jar │ ├── freemarker-2.3.28.jar │ ├── httpclient-4.5.6.jar │ ├── httpcore-4.4.10.jar │ ├── jackson-annotations-2.9.0.jar │ ├── jackson-core-2.9.6.jar │ ├── jackson-databind-2.9.6.jar │ ├── jackson-dataformat-xml-2.9.6.jar │ ├── jackson-dataformat-yaml-2.9.6.jar │ ├── jackson-module-jaxb-annotations-2.9.6.jar │ ├── javax.servlet-api-3.1.0.jar │ ├── jaxb-api-2.3.0.jar │ ├── jaxb-utils-1.0.jar │ ├── jcommander-1.72.jar │ ├── jetty-http-9.4.11.v20180605.jar │ ├── jetty-io-9.4.11.v20180605.jar │ ├── jetty-server-9.4.11.v20180605.jar │ ├── jetty-util-9.4.11.v20180605.jar │ ├── log4j-1.2.17.jar │ ├── opencsv-4.2.jar │ ├── properties-2.0.RC5.jar │ ├── slf4j-api-1.7.25.jar │ ├── slf4j-log4j12-1.7.25.jar │ ├── snakeyaml-1.18.jar │ ├── stax2-api-3.1.4.jar │ ├── tika-core-1.18.jar │ └── woodstox-core-5.0.3.jar └── plugins │ ├── README.txt │ ├── behaviors-plugin │ ├── allure-plugin.yml │ ├── plugin.jar │ └── static │ │ └── index.js │ ├── custom-logo-plugin │ ├── allure-plugin.yml │ └── static │ │ ├── custom-logo.svg │ │ └── styles.css │ ├── junit-xml-plugin │ ├── allure-plugin.yml │ └── junit-xml-plugin-2.7.0.jar │ ├── packages-plugin │ ├── allure-plugin.yml │ ├── plugin.jar │ └── static │ │ └── index.js │ ├── screen-diff-plugin │ ├── allure-plugin.yml │ └── static │ │ ├── index.js │ │ └── styles.css │ ├── trx-plugin │ ├── allure-plugin.yml │ └── trx-plugin-2.7.0.jar │ ├── xctest-plugin │ ├── allure-plugin.yml │ ├── lib │ │ └── xmlwise-1.2.11.jar │ └── xctest-plugin-2.7.0.jar │ └── xunit-xml-plugin │ ├── allure-plugin.yml │ └── xunit-xml-plugin-2.7.0.jar ├── api_automation_test ├── __init__.py ├── asgi.py ├── celery.py ├── routing.py ├── settings.py ├── urls.py └── wsgi.py ├── api_test ├── SettingShell.py ├── __init__.py ├── admin.py ├── apps.py ├── config │ ├── DingdingConfig.py │ └── __init__.py ├── consumers.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_debugtalk_id.py │ └── __init__.py ├── models.py ├── routing.py ├── serializers.py ├── tasks.py ├── test_api │ ├── __init__.py │ ├── conftest.py │ └── pytest.ini ├── tests.py ├── urls.py ├── utils │ ├── AesCrypt.py │ ├── CompenSation.py │ ├── Config.py │ ├── CustomException.py │ ├── DelHistory.py │ ├── ExecuteTest.py │ ├── FormatJson.py │ ├── FormatRequest.py │ ├── GetInt.py │ ├── GetLocalIP.py │ ├── JenkinsIni.py │ ├── MkCasePy.py │ ├── MkReportHtml.py │ ├── MkYaml.py │ ├── Mkdir.py │ ├── ProjectStatus.py │ ├── RecordDynamic.py │ ├── SendReportDing.py │ ├── Signature.py │ ├── WriteEnvXml.py │ ├── __init__.py │ ├── api_response.py │ ├── auth.py │ ├── common.py │ ├── permissions.py │ ├── response.py │ ├── runner.py │ └── task.py └── views │ ├── Api.py │ ├── Case.py │ ├── CaseStepManager.py │ ├── DBManager.py │ ├── DebugTalk.py │ ├── DynamicManager.py │ ├── GetFile.py │ ├── GetResult.py │ ├── Group.py │ ├── HostIPManager.py │ ├── JenkinsJobManager.py │ ├── JenkinsManager.py │ ├── MemberManager.py │ ├── ObtainAesSecretKey.py │ ├── Project.py │ ├── ProjectDetail.py │ ├── RealTimeLog.py │ ├── Report.py │ ├── SQLManager.py │ ├── Upload.py │ ├── VariablesManager.py │ ├── __init__.py │ ├── run_api.py │ └── schedule.py ├── backend ├── Config │ ├── CaseType.py │ └── __init__.py ├── Views │ ├── Cases.py │ ├── Modules.py │ ├── Projects.py │ ├── UploadCase.py │ └── __init__.py ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── serializers.py ├── tests.py ├── urls.py └── views.py ├── case_logs └── .gitignore ├── docker-compose.yml ├── license ├── manage.py ├── mysql ├── init.sql └── my.cnf ├── replace_celery.py ├── requirements.txt ├── static ├── TestResult │ └── .gitignore ├── admin │ ├── fonts │ │ ├── LICENSE.txt │ │ ├── README.txt │ │ ├── Roboto-Bold-webfont.woff │ │ ├── Roboto-Light-webfont.woff │ │ └── Roboto-Regular-webfont.woff │ ├── 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 │ └── simpleui │ │ ├── echarts │ │ └── echarts.min.js │ │ └── layui │ │ ├── images │ │ └── face │ │ │ ├── 0.gif │ │ │ ├── 1.gif │ │ │ ├── 11.gif │ │ │ ├── 12.gif │ │ │ ├── 13.gif │ │ │ ├── 14.gif │ │ │ ├── 15.gif │ │ │ ├── 17.gif │ │ │ ├── 18.gif │ │ │ ├── 19.gif │ │ │ ├── 2.gif │ │ │ ├── 20.gif │ │ │ ├── 22.gif │ │ │ ├── 23.gif │ │ │ ├── 24.gif │ │ │ ├── 25.gif │ │ │ ├── 26.gif │ │ │ ├── 28.gif │ │ │ ├── 29.gif │ │ │ ├── 3.gif │ │ │ ├── 31.gif │ │ │ ├── 32.gif │ │ │ ├── 35.gif │ │ │ ├── 36.gif │ │ │ ├── 37.gif │ │ │ ├── 38.gif │ │ │ ├── 39.gif │ │ │ ├── 4.gif │ │ │ ├── 41.gif │ │ │ ├── 42.gif │ │ │ ├── 43.gif │ │ │ ├── 46.gif │ │ │ ├── 47.gif │ │ │ ├── 48.gif │ │ │ ├── 5.gif │ │ │ ├── 50.gif │ │ │ ├── 51.gif │ │ │ ├── 53.gif │ │ │ ├── 55.gif │ │ │ ├── 56.gif │ │ │ ├── 57.gif │ │ │ ├── 6.gif │ │ │ ├── 60.gif │ │ │ ├── 61.gif │ │ │ ├── 62.gif │ │ │ ├── 63.gif │ │ │ ├── 64.gif │ │ │ ├── 65.gif │ │ │ ├── 67.gif │ │ │ ├── 68.gif │ │ │ ├── 69.gif │ │ │ ├── 71.gif │ │ │ ├── 8.gif │ │ │ └── 9.gif │ │ ├── layui.all.js │ │ └── layui.js ├── favicon.ico ├── images │ └── favicon.ico └── rest_framework_swagger │ ├── css │ ├── print.css │ ├── reset.css │ ├── screen.css │ └── typography.css │ ├── fonts │ ├── DroidSans-Bold.ttf │ └── DroidSans.ttf │ ├── images │ ├── collapse.gif │ ├── expand.gif │ ├── explorer_icons.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── logo_small.png │ ├── pet_store_api.png │ ├── throbber.gif │ └── wordnik_api.png │ ├── init.js │ ├── lang │ ├── en.js │ ├── es.js │ ├── fr.js │ ├── geo.js │ ├── it.js │ ├── ja.js │ ├── ko-kr.js │ ├── pl.js │ ├── pt.js │ ├── ru.js │ ├── tr.js │ ├── translator.js │ └── zh-cn.js │ ├── lib │ ├── backbone-min.js │ ├── handlebars-2.0.0.js │ ├── highlight.9.1.0.pack.js │ ├── highlight.9.1.0.pack_extended.js │ ├── jquery-1.8.0.min.js │ ├── jquery.ba-bbq.min.js │ ├── jquery.slideto.min.js │ ├── jquery.wiggle.min.js │ ├── js-yaml.min.js │ ├── jsoneditor.min.js │ ├── lodash.min.js │ ├── marked.js │ ├── object-assign-pollyfill.js │ └── swagger-oauth.js │ ├── o2c.html │ ├── swagger-ui.js │ └── swagger-ui.min.js ├── supervisord.conf ├── templates ├── TestResult │ └── .gitignore ├── admin │ ├── 404.html │ ├── 500.html │ ├── actions.html │ ├── app_index.html │ ├── auth │ │ └── user │ │ │ ├── add_form.html │ │ │ └── change_password.html │ ├── base.html │ ├── base_site.html │ ├── change_form.html │ ├── change_form_object_tools.html │ ├── change_list.html │ ├── change_list_object_tools.html │ ├── change_list_results.html │ ├── date_hierarchy.html │ ├── delete_confirmation.html │ ├── delete_selected_confirmation.html │ ├── edit_inline │ │ ├── stacked.html │ │ └── tabular.html │ ├── filter.html │ ├── home.html │ ├── includes │ │ ├── fieldset.html │ │ └── object_delete_summary.html │ ├── index.html │ ├── invalid_setup.html │ ├── login.html │ ├── object_history.html │ ├── pagination.html │ ├── popup_response.html │ ├── prepopulated_fields_js.html │ ├── related_widget_wrapper.html │ ├── search_form.html │ ├── submit_line.html │ └── widgets │ │ ├── clearable_file_input.html │ │ ├── foreign_key_raw_id.html │ │ ├── many_to_many_raw_id.html │ │ ├── radio.html │ │ ├── related_widget_wrapper.html │ │ ├── split_datetime.html │ │ └── url.html ├── index.html └── registration │ ├── logged_out.html │ ├── password_change_done.html │ ├── password_change_form.html │ ├── password_reset_complete.html │ ├── password_reset_confirm.html │ ├── password_reset_done.html │ ├── password_reset_email.html │ └── password_reset_form.html ├── templatetags ├── __init__.py └── simpletags.py └── tools ├── SettingShell.py ├── __init__.py ├── admin.py ├── apps.py ├── migrations ├── 0001_initial.py └── __init__.py ├── models.py ├── serializers.py ├── tasks.py ├── tests.py ├── urls.py ├── util ├── ClientTestLink.py ├── CreateRequirements.py ├── DecompressionScript.py ├── IDCardCreate.py ├── Runner.py ├── XlsManage.py └── __init__.py ├── views.py └── views ├── AllUser.py ├── DBManager.py ├── IDCard.py ├── SQLManager.py ├── Script.py ├── ScriptRunHistory.py ├── TestLinkLoading.py ├── VenvLibraryManager.py └── __init__.py /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/* 2 | *.log 3 | test.py 4 | .vscode 5 | *.py[cod] 6 | *.so 7 | *.egg 8 | *.egg-info 9 | .DS_Store 10 | __pycache__ 11 | *.idea 12 | *__pycycache_ 13 | *__pycache__* 14 | **.pyc 15 | .pytest_cache 16 | .push 17 | .idea -------------------------------------------------------------------------------- /Config/123.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/Config/123.xlsx -------------------------------------------------------------------------------- /Config/LibraryInstall.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env 2 | # shellcheck disable=SC1090 3 | source $1/bin/activate 4 | pip3 install $2 5 | -------------------------------------------------------------------------------- /Config/VenvInit.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env 2 | # shellcheck disable=SC1090 3 | source $1/bin/activate 4 | pip3 freeze > $2 5 | -------------------------------------------------------------------------------- /Config/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: __init__.py.py 8 | 9 | # @Software: PyCharm 10 | -------------------------------------------------------------------------------- /Config/case_config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: case_config.py 8 | 9 | # @Software: PyCharm 10 | import os 11 | 12 | from RootDirectory import PROJECT_PATH 13 | 14 | father_path = os.path.dirname(PROJECT_PATH) 15 | # 用户头像路径 16 | photo_url = 'static/photo' 17 | # 用户头像绝对路径 18 | photo_url_absolute = father_path + "/" + photo_url 19 | # 测试脚本路径 20 | script_url = "static/ShareScript/Script" 21 | # 测试脚本绝对路径 22 | script_absolute = father_path + "/" + script_url 23 | # 接口用例文件夹 24 | api_case = 'test_api_case' 25 | # 接口用例服务器绝对路径 26 | api_config = PROJECT_PATH + "/{}/".format(api_case) 27 | # 报告静态文件 28 | api_static_TestResult = "/static/TestResult/" 29 | # 报告静态文件绝对路径 30 | api_static = father_path + api_static_TestResult 31 | # 报告html 32 | api_index_testResult = "templates/TestResult/" 33 | # 报告html绝对路径 34 | api_index = father_path + "/" + api_index_testResult 35 | -------------------------------------------------------------------------------- /Config/ui_config.py: -------------------------------------------------------------------------------- 1 | from RootDirectory import Ui_PROJECT_PATH 2 | import os 3 | root_path = Ui_PROJECT_PATH 4 | air_path = os.path.join(Ui_PROJECT_PATH, 'test_case') 5 | log_path = os.path.join(Ui_PROJECT_PATH,'log') 6 | report_path = os.path.join(Ui_PROJECT_PATH,'report') 7 | template_path = os.path.join(Ui_PROJECT_PATH,'template') 8 | data_path = os.path.join(Ui_PROJECT_PATH,'data') 9 | template_name = "template_summary.html" 10 | 11 | 12 | #设置设备号,以及选择跑全部用例,还是选择files 13 | #devices = [''] 14 | 15 | devices = [''] 16 | 17 | 18 | -------------------------------------------------------------------------------- /Config/virtual_device.ini: -------------------------------------------------------------------------------- 1 | [A011KB3CDE] 2 | device_sn = 3 | device_id = 4 | battery_sn = 5 | slot_num = 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos/python-36-centos7:latest 2 | COPY ./requirements.txt /api_automation_test/ 3 | USER root 4 | WORKDIR /api_automation_test 5 | RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir --upgrade pip\ 6 | && pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r /api_automation_test/requirements.txt --default-timeout=200 --ignore-installed\ 7 | && yum -y install java-1.8.0-openjdk \ 8 | && java -version 9 | COPY ./replace_celery.py /opt/app-root/lib/python3.6/site-packages/djcelery/management/commands/celery.py 10 | CMD [ "sh", "-c", "while true; do sleep 1; done"] -------------------------------------------------------------------------------- /RootDirectory.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: RootDirectory.py 9 | 10 | # @Software: PyCharm 11 | import os 12 | import sys 13 | 14 | PROJECT_PATH = os.path.dirname(os.path.abspath(__file__)) 15 | 16 | JOB_TIME = 50 17 | -------------------------------------------------------------------------------- /UserInfo/Util/CheckPermissions.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: CheckPermissions.py 9 | 10 | # @Software: PyCharm 11 | import os 12 | 13 | import django 14 | 15 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api_automation_test.settings") 16 | django.setup() 17 | from django.core.exceptions import ObjectDoesNotExist 18 | 19 | from UserInfo.models import UserProfile, JobAuthority 20 | from api_test.utils import response 21 | from api_test.utils.api_response import JsonResponse 22 | 23 | 24 | def check_permissions(user, code): 25 | """ 26 | 校验权限 27 | :param user: 用户 28 | :param code: 权限code 29 | :return: 30 | """ 31 | if user.is_superuser: 32 | return True 33 | try: 34 | obu = UserProfile.objects.get(user=user.id) 35 | except ObjectDoesNotExist: 36 | return JsonResponse(code_msg=response.USER_PROFILE_NOT_EXISTS) 37 | obi_auth = JobAuthority.objects.filter(job=obu.job.id) 38 | control_code = list() 39 | for i in obi_auth: 40 | control_code.append(i.authority.control_code) 41 | if code in control_code: 42 | return True 43 | else: 44 | return JsonResponse(code_msg=response.NO_PERMISSIONS) 45 | 46 | 47 | # if __name__ == '__main__': 48 | # print(check_permissions(1, "abc")) 49 | -------------------------------------------------------------------------------- /UserInfo/Util/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: __init__.py.py 9 | 10 | # @Software: PyCharm -------------------------------------------------------------------------------- /UserInfo/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/UserInfo/__init__.py -------------------------------------------------------------------------------- /UserInfo/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UserinfoConfig(AppConfig): 5 | name = 'UserInfo' 6 | verbose_name = '用户基础' 7 | -------------------------------------------------------------------------------- /UserInfo/migrations/0002_alter_userprofile_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-04-27 15:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('UserInfo', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='userprofile', 15 | name='id', 16 | field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /UserInfo/migrations/0003_auto_20230427_1510.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-04-27 15:10 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('UserInfo', '0002_alter_userprofile_id'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='userprofile', 15 | name='testlink_key', 16 | field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='testlink_Key'), 17 | ), 18 | migrations.AlterField( 19 | model_name='userprofile', 20 | name='testlink_name', 21 | field=models.CharField(blank=True, max_length=1024, null=True, verbose_name='testlink用户名'), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /UserInfo/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/UserInfo/migrations/__init__.py -------------------------------------------------------------------------------- /UserInfo/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /UserInfo/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: urls.py 9 | 10 | # @Software: PyCharm 11 | from django.conf.urls import url 12 | 13 | from UserInfo.views import user, DingDingLogin, UserJobManage, AuthorityManage, JobAuthorityManage 14 | 15 | urlpatterns = [ 16 | url(r'AuthorityReJobManager', JobAuthorityManage.AuthorityReJobManager.as_view()), 17 | url(r'JobAuthority', JobAuthorityManage.JobAuthorityManager.as_view()), 18 | url(r'Authority', AuthorityManage.AuthorityManager.as_view()), 19 | url(r'JobList', UserJobManage.JobListManager.as_view()), 20 | url(r'userJob', UserJobManage.JobManager.as_view()), 21 | url(r'config', DingDingLogin.DingdingManager.as_view()), 22 | url(r'loginOut', user.LoginOut.as_view()), 23 | url(r'login', user.ObtainAuthToken.as_view()), 24 | url(r'changePassword', user.ChangePassword.as_view()), 25 | url(r'changePhoto', user.UploadPhoto.as_view()), 26 | url(r'userList', user.UserList.as_view()) 27 | ] 28 | -------------------------------------------------------------------------------- /UserInfo/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /UserInfo/views/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: __init__.py.py 9 | 10 | # @Software: PyCharm 11 | -------------------------------------------------------------------------------- /UwsgiScript/uwsgi.ini: -------------------------------------------------------------------------------- 1 | # uwsig使用配置文件启动 2 | [uwsgi] 3 | chdir=/api_automation_test 4 | # 指定项目的application 5 | module=api_automation_test.wsgi:application 6 | # 指定sock的文件路径 7 | socket=/api_automation_test/UwsgiScript/uwsgi.sock 8 | # 进程个数 9 | workers=5 10 | pidfile=/api_automation_test/UwsgiScript/uwsgi.pid 11 | # 指定IP端口 12 | http=0.0.0.0:8000 13 | # 指定静态文件 14 | static-map=/static=/api_automation_test/static 15 | # 启动uwsgi的用户名和用户组 16 | uid=root 17 | gid=root 18 | # 启用主进程 19 | master=true 20 | # 自动移除unix Socket和pid文件当服务停止的时候 21 | vacuum=true 22 | # 序列化接受的内容,如果可能的话 23 | thunder-lock=true 24 | # 启用线程 25 | enable-threads=true 26 | # 设置自中断时间 27 | harakiri=30 28 | # 设置缓冲 29 | post-buffering=4096 30 | # 设置日志目录 31 | daemonize=/api_automation_test/logs/uwsgi.log 32 | http-time=10 33 | -------------------------------------------------------------------------------- /allure-2.7.0/config/allure-cucumber.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/config/allure-cucumber.yml -------------------------------------------------------------------------------- /allure-2.7.0/config/allure-junit.yml: -------------------------------------------------------------------------------- 1 | plugins: 2 | - junit-plugin 3 | - packages-plugin 4 | -------------------------------------------------------------------------------- /allure-2.7.0/config/allure.yml: -------------------------------------------------------------------------------- 1 | plugins: 2 | - junit-xml-plugin 3 | - xunit-xml-plugin 4 | - trx-plugin 5 | - behaviors-plugin 6 | - packages-plugin 7 | - screen-diff-plugin 8 | - xctest-plugin 9 | -------------------------------------------------------------------------------- /allure-2.7.0/lib/allure-commandline-2.7.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/allure-commandline-2.7.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/allure-generator-2.7.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/allure-generator-2.7.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/allure-plugin-api-2.7.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/allure-plugin-api-2.7.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/allure1-model-1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/allure1-model-1.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/allure2-model-api-1.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/allure2-model-api-1.0.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/allure2-model-jackson-1.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/allure2-model-jackson-1.0.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/allure2-model-pojo-1.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/allure2-model-pojo-1.0.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/commons-beanutils-1.9.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/commons-beanutils-1.9.3.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/commons-codec-1.10.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/commons-codec-1.10.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/commons-collections-3.2.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/commons-collections-3.2.2.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/commons-collections4-4.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/commons-collections4-4.1.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/commons-io-2.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/commons-io-2.6.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/commons-lang3-3.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/commons-lang3-3.7.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/commons-logging-1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/commons-logging-1.2.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/commons-text-1.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/commons-text-1.4.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/config/jetty-logging.properties: -------------------------------------------------------------------------------- 1 | org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.LoggerLog 2 | org.eclipse.jetty.LEVEL=WARN -------------------------------------------------------------------------------- /allure-2.7.0/lib/config/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=INFO, stdout 2 | 3 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender 4 | log4j.appender.stdout.Target=System.out 5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 6 | log4j.appender.stdout.layout.ConversionPattern=%m%n 7 | 8 | log4j.logger.org.mortbay.log = INFO -------------------------------------------------------------------------------- /allure-2.7.0/lib/flexmark-0.34.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/flexmark-0.34.8.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/flexmark-util-0.34.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/flexmark-util-0.34.8.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/freemarker-2.3.28.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/freemarker-2.3.28.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/httpclient-4.5.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/httpclient-4.5.6.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/httpcore-4.4.10.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/httpcore-4.4.10.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jackson-annotations-2.9.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jackson-annotations-2.9.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jackson-core-2.9.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jackson-core-2.9.6.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jackson-databind-2.9.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jackson-databind-2.9.6.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jackson-dataformat-xml-2.9.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jackson-dataformat-xml-2.9.6.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jackson-dataformat-yaml-2.9.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jackson-dataformat-yaml-2.9.6.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jackson-module-jaxb-annotations-2.9.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jackson-module-jaxb-annotations-2.9.6.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/javax.servlet-api-3.1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/javax.servlet-api-3.1.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jaxb-api-2.3.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jaxb-api-2.3.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jaxb-utils-1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jaxb-utils-1.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jcommander-1.72.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jcommander-1.72.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jetty-http-9.4.11.v20180605.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jetty-http-9.4.11.v20180605.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jetty-io-9.4.11.v20180605.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jetty-io-9.4.11.v20180605.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jetty-server-9.4.11.v20180605.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jetty-server-9.4.11.v20180605.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/jetty-util-9.4.11.v20180605.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/jetty-util-9.4.11.v20180605.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/log4j-1.2.17.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/log4j-1.2.17.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/opencsv-4.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/opencsv-4.2.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/properties-2.0.RC5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/properties-2.0.RC5.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/slf4j-api-1.7.25.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/slf4j-api-1.7.25.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/slf4j-log4j12-1.7.25.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/slf4j-log4j12-1.7.25.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/snakeyaml-1.18.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/snakeyaml-1.18.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/stax2-api-3.1.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/stax2-api-3.1.4.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/tika-core-1.18.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/tika-core-1.18.jar -------------------------------------------------------------------------------- /allure-2.7.0/lib/woodstox-core-5.0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/lib/woodstox-core-5.0.3.jar -------------------------------------------------------------------------------- /allure-2.7.0/plugins/README.txt: -------------------------------------------------------------------------------- 1 | The directory with Allure plugins. To add the plugin simply unpack it to this folder. -------------------------------------------------------------------------------- /allure-2.7.0/plugins/behaviors-plugin/allure-plugin.yml: -------------------------------------------------------------------------------- 1 | id: behaviors 2 | name: Behaviors aggregator 3 | description: The aggregator adds behaviors tab to the report 4 | extensions: 5 | - io.qameta.allure.behaviors.BehaviorsPlugin 6 | jsFiles: 7 | - index.js -------------------------------------------------------------------------------- /allure-2.7.0/plugins/behaviors-plugin/plugin.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/plugins/behaviors-plugin/plugin.jar -------------------------------------------------------------------------------- /allure-2.7.0/plugins/custom-logo-plugin/allure-plugin.yml: -------------------------------------------------------------------------------- 1 | id: custom-logo 2 | name: Custom logo aggregator 3 | description: The aggregator replaces default Allure logo with a custom one 4 | cssFiles: 5 | - styles.css -------------------------------------------------------------------------------- /allure-2.7.0/plugins/custom-logo-plugin/static/styles.css: -------------------------------------------------------------------------------- 1 | .side-nav__brand { 2 | background: url('custom-logo.svg') no-repeat left center; 3 | margin-left: 10px; 4 | } -------------------------------------------------------------------------------- /allure-2.7.0/plugins/junit-xml-plugin/allure-plugin.yml: -------------------------------------------------------------------------------- 1 | id: junit 2 | name: JUnit Plugin 3 | description: The plugin that adds support for results in JUnit.xml data format. 4 | extensions: 5 | - io.qameta.allure.junitxml.JunitXmlPlugin -------------------------------------------------------------------------------- /allure-2.7.0/plugins/junit-xml-plugin/junit-xml-plugin-2.7.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/plugins/junit-xml-plugin/junit-xml-plugin-2.7.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/plugins/packages-plugin/allure-plugin.yml: -------------------------------------------------------------------------------- 1 | id: packages 2 | name: Packages aggregator 3 | description: The aggregator adds packages tab to the report 4 | extensions: 5 | - io.qameta.allure.packages.PackagesPlugin 6 | jsFiles: 7 | - index.js -------------------------------------------------------------------------------- /allure-2.7.0/plugins/packages-plugin/plugin.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/plugins/packages-plugin/plugin.jar -------------------------------------------------------------------------------- /allure-2.7.0/plugins/packages-plugin/static/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | packages: { 6 | name: 'Packages' 7 | } 8 | } 9 | }); 10 | 11 | allure.api.addTranslation('ru', { 12 | tab: { 13 | packages: { 14 | name: 'Пакеты' 15 | } 16 | } 17 | }); 18 | 19 | allure.api.addTranslation('zh', { 20 | tab: { 21 | packages: { 22 | name: '包' 23 | } 24 | } 25 | }); 26 | 27 | allure.api.addTranslation('de', { 28 | tab: { 29 | packages: { 30 | name: 'Pakete' 31 | } 32 | } 33 | }); 34 | 35 | allure.api.addTranslation('he', { 36 | tab: { 37 | packages: { 38 | name: 'חבילות' 39 | } 40 | } 41 | }); 42 | 43 | allure.api.addTranslation('br', { 44 | tab: { 45 | packages: { 46 | name: 'Pacotes' 47 | } 48 | } 49 | }); 50 | 51 | allure.api.addTab('packages', { 52 | title: 'tab.packages.name', icon: 'fa fa-align-left', 53 | route: 'packages(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 54 | onEnter: (function (testGroup, testResult, testResultTab) { 55 | return new allure.components.TreeLayout({ 56 | testGroup: testGroup, 57 | testResult: testResult, 58 | testResultTab: testResultTab, 59 | tabName: 'tab.packages.name', 60 | baseUrl: 'packages', 61 | url: 'data/packages.json' 62 | }); 63 | }) 64 | }); 65 | -------------------------------------------------------------------------------- /allure-2.7.0/plugins/screen-diff-plugin/allure-plugin.yml: -------------------------------------------------------------------------------- 1 | id: screen-diff 2 | name: Screen diff 3 | description: Who cares about description by just-boris 4 | jsFiles: 5 | - index.js 6 | cssFiles: 7 | - styles.css -------------------------------------------------------------------------------- /allure-2.7.0/plugins/screen-diff-plugin/static/styles.css: -------------------------------------------------------------------------------- 1 | .screen-diff__switchers { 2 | margin-bottom: 1em; 3 | } 4 | 5 | .screen-diff__switchers label + label { 6 | margin-left: 1em; 7 | } 8 | 9 | .screen-diff__overlay { 10 | position: relative; 11 | cursor: col-resize; 12 | } 13 | 14 | .screen-diff__container { 15 | overflow-x: auto; 16 | } 17 | 18 | .screen-diff__image-over { 19 | top: 0; 20 | left: 0; 21 | bottom: 0; 22 | background: #fff; 23 | position: absolute; 24 | overflow: hidden; 25 | box-shadow: 2px 0 1px -1px #aaa; 26 | } 27 | -------------------------------------------------------------------------------- /allure-2.7.0/plugins/trx-plugin/allure-plugin.yml: -------------------------------------------------------------------------------- 1 | id: trx 2 | name: XUnit TRX Plugin 3 | description: The plugin that adds support for results TRX data format. 4 | extensions: 5 | - io.qameta.allure.trx.TrxPlugin -------------------------------------------------------------------------------- /allure-2.7.0/plugins/trx-plugin/trx-plugin-2.7.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/plugins/trx-plugin/trx-plugin-2.7.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/plugins/xctest-plugin/allure-plugin.yml: -------------------------------------------------------------------------------- 1 | id: xctest 2 | name: XCTest Plugin 3 | description: The plugin that adds support for results XCTest data format. 4 | extensions: 5 | - io.qameta.allure.xctest.XcTestPlugin -------------------------------------------------------------------------------- /allure-2.7.0/plugins/xctest-plugin/lib/xmlwise-1.2.11.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/plugins/xctest-plugin/lib/xmlwise-1.2.11.jar -------------------------------------------------------------------------------- /allure-2.7.0/plugins/xctest-plugin/xctest-plugin-2.7.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/plugins/xctest-plugin/xctest-plugin-2.7.0.jar -------------------------------------------------------------------------------- /allure-2.7.0/plugins/xunit-xml-plugin/allure-plugin.yml: -------------------------------------------------------------------------------- 1 | id: xunit-xml 2 | name: XUnit XML v2 Plugin 3 | description: The plugin that adds support for results in Xunit.net xml data format. 4 | extensions: 5 | - io.qameta.allure.xunitxml.XunitXmlPlugin -------------------------------------------------------------------------------- /allure-2.7.0/plugins/xunit-xml-plugin/xunit-xml-plugin-2.7.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/allure-2.7.0/plugins/xunit-xml-plugin/xunit-xml-plugin-2.7.0.jar -------------------------------------------------------------------------------- /api_automation_test/__init__.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | pymysql.install_as_MySQLdb() 3 | -------------------------------------------------------------------------------- /api_automation_test/asgi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: asgi.py 8 | 9 | # @Software: PyCharm 10 | """ 11 | ASGI entrypoint. Configures Django and then runs the application 12 | defined in the ASGI_APPLICATION setting. 13 | """ 14 | 15 | import os 16 | import django 17 | from channels.routing import get_default_application 18 | 19 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api_automation_test.settings") 20 | django.setup() 21 | application = get_default_application() 22 | -------------------------------------------------------------------------------- /api_automation_test/celery.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: celery.py 8 | 9 | # @Software: PyCharm 10 | 11 | import os 12 | import django 13 | from celery import Celery 14 | from django.conf import settings 15 | 16 | # set the default Django settings module for the 'celery' program. 17 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api_automation_test.settings') 18 | django.setup() 19 | app = Celery('api_automation_test') 20 | app.config_from_object('django.conf:settings') 21 | app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 22 | -------------------------------------------------------------------------------- /api_automation_test/routing.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: routing.py 8 | 9 | # @Software: PyCharm 10 | 11 | from channels.auth import AuthMiddlewareStack 12 | from channels.routing import ProtocolTypeRouter, URLRouter 13 | from channels.sessions import SessionMiddlewareStack 14 | 15 | import api_test.routing 16 | 17 | application = ProtocolTypeRouter({ 18 | # (http->django views is added by default) 19 | 'websocket': AuthMiddlewareStack( 20 | URLRouter( 21 | api_test.routing.websocket_urlpatterns 22 | ) 23 | ), 24 | }) 25 | -------------------------------------------------------------------------------- /api_automation_test/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for api_automation_test 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/2.0/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", "api_automation_test.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /api_test/SettingShell.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: SettingShell.py 8 | 9 | # @Software: PyCharm 10 | from api_test.utils.CompenSation import compensation 11 | 12 | compensation() 13 | -------------------------------------------------------------------------------- /api_test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/api_test/__init__.py -------------------------------------------------------------------------------- /api_test/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from django.utils.module_loading import autodiscover_modules 3 | 4 | 5 | class ApiTestConfig(AppConfig): 6 | name = 'api_test' 7 | verbose_name = '接口自动化管理' 8 | 9 | def ready(self): 10 | autodiscover_modules('SettingShell') 11 | -------------------------------------------------------------------------------- /api_test/config/DingdingConfig.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: DingdingConfig.py 8 | 9 | # @Software: PyCharm 10 | # 钉钉开发平台 open-dev.dingtalk.com 11 | APPID = '' 12 | 13 | APPSECRET = '' 14 | -------------------------------------------------------------------------------- /api_test/config/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Time    : 2019/12/12 8:26 下午 4 | 5 | # @Author  : litao 6 | 7 | # @Project : api_automation_test 8 | 9 | # @FileName: __init__.py.py 10 | 11 | # @Software: PyCharm 12 | -------------------------------------------------------------------------------- /api_test/migrations/0002_alter_debugtalk_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-04-27 15:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('api_test', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='debugtalk', 15 | name='id', 16 | field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /api_test/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/api_test/migrations/__init__.py -------------------------------------------------------------------------------- /api_test/routing.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: routing.py 8 | 9 | # @Software: PyCharm 10 | 11 | from django.urls import re_path 12 | 13 | from . import consumers 14 | 15 | websocket_urlpatterns = [ 16 | re_path(r'ws/log/(?P\w+)/$', consumers.ChatConsumer), 17 | ] 18 | -------------------------------------------------------------------------------- /api_test/test_api/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: __init__.py.py 8 | 9 | # @Software: PyCharm 10 | 11 | # 用作在线测试 12 | -------------------------------------------------------------------------------- /api_test/test_api/conftest.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: conftest.py 8 | 9 | # @Software: PyCharm 10 | import pytest 11 | 12 | 13 | def pytest_addoption(parser): 14 | parser.addoption( 15 | "--project", action="store", default=1, 16 | help="project_id" 17 | ) 18 | 19 | parser.addoption( 20 | "--path", action="store", default=1, 21 | help="case path" 22 | ) 23 | 24 | 25 | @pytest.fixture(scope="session", autouse=True) 26 | def project(request): 27 | return request.config.getoption("--project") 28 | 29 | 30 | @pytest.fixture(scope="session", autouse=True) 31 | def path(request): 32 | return request.config.getoption("--path") 33 | -------------------------------------------------------------------------------- /api_test/test_api/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | addopts=-sp no:warnings -rw -W ignore 3 | -------------------------------------------------------------------------------- /api_test/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /api_test/utils/AesCrypt.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: AesSypto.py 8 | 9 | # @Software: PyCharm 10 | from Crypto.Cipher import AES 11 | import base64 12 | 13 | from Crypto.Util.Padding import pad 14 | 15 | 16 | class AesCrypt: 17 | """ 18 | aes加密封装 19 | """ 20 | def __init__(self, model, iv, encode_, key='abcdefghijklmnop'): 21 | self.encrypt_text = '' 22 | self.decrypt_text = '' 23 | self.encode_ = encode_ 24 | self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model] 25 | self.key = self.add_16(key) 26 | if model == 'ECB': 27 | self.aes = AES.new(self.key, self.model) # 创建一个aes对象 28 | elif model == 'CBC': 29 | self.aes = AES.new(self.key, self.model, iv) # 创建一个aes对象 30 | 31 | # 这里的密钥长度必须是16、24或32,目前16位的就够用了 32 | 33 | def add_16(self, par): 34 | par = par.encode(self.encode_) 35 | while len(par) % 16 != 0: 36 | par += b'\x00' 37 | return par 38 | 39 | # 加密 40 | def aesencrypt(self, text): 41 | text = pad(text.encode('utf-8'), AES.block_size, style='pkcs7') 42 | self.encrypt_text = self.aes.encrypt(text) 43 | return base64.encodebytes(self.encrypt_text).decode().strip() 44 | 45 | # 解密 46 | def aesdecrypt(self, text): 47 | text = base64.decodebytes(text.encode(self.encode_)) 48 | self.decrypt_text = self.aes.decrypt(text) 49 | return self.decrypt_text.decode(self.encode_).strip('\0').strip("\n").strip().replace("\x06", "").replace("\x05", "").replace("\x07", "") 50 | 51 | 52 | if __name__ == '__main__': 53 | pr = AesCrypt('ECB', '', 'utf-8', 'abcdefghijklmnop') 54 | pr1 = AesCrypt("ECB", "", "utf-8") 55 | en_text = pr.aesencrypt('jmdevcd') 56 | print('密文:', en_text) 57 | print('明文:', pr1.aesdecrypt("r1ThEqAQfffooVzZFGoG2gIjg==")) 58 | -------------------------------------------------------------------------------- /api_test/utils/Config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: Config.py 8 | 9 | # @Software: PyCharm 10 | 11 | # 校验方式配置 12 | VALIDATE_TYPE = [ 13 | "equals", # 相等 14 | "less_than", # 小于 15 | "less_than_or_equals", # 小于或等于 16 | "greater_than", # 大于 17 | "greater_than_or_equals", # 大于或等于 18 | "not_equals", # 不等于 19 | "length_equals", # 长度等于 20 | "length_greater_than", # 长度大于 21 | "length_greater_than_or_equals", # 长度大于等于 22 | "length_less_than", # 长度小于 23 | "length_less_than_or_equals", # 长度小于等于 24 | "contains", # 实际包含期望 25 | "contained_by", # 被包含 26 | "regex_match", # 正则匹配 27 | "startswith", # 以XX开头 28 | "endswith" # 以xx结尾 29 | ] 30 | 31 | # 数据类型校验配置 32 | EXPECT_TYPE = [ 33 | "String", 34 | "Integer", 35 | "Float", 36 | "Boolean", 37 | "List", 38 | "Dict" 39 | ] 40 | -------------------------------------------------------------------------------- /api_test/utils/CustomException.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : project 6 | 7 | # @FileName: ConfRelevance.py 8 | 9 | # @Software: PyCharm 10 | # 自定义异常类,可自行添加 11 | 12 | 13 | class ProjectDirExist(Exception): 14 | def __init__(self, path): 15 | err = '项目路径已存在,请联系管理员!{}'.format(path) 16 | Exception.__init__(self, err) 17 | 18 | 19 | class ProjectDirNotExist(Exception): 20 | def __init__(self, path): 21 | err = '项目路径不存在,请联系管理员!{}'.format(path) 22 | Exception.__init__(self, err) 23 | 24 | 25 | class PathError(Exception): 26 | def __init__(self, path): 27 | err = '路径错误!{}'.format(path) 28 | Exception.__init__(self, err) 29 | 30 | 31 | class DBConfigNoFound(Exception): 32 | def __init__(self, _id): 33 | err = '未找到数据库配置!对应表id={}'.format(_id) 34 | Exception.__init__(self, err) 35 | 36 | 37 | class DBSelect(Exception): 38 | def __init__(self, sql, e): 39 | err = '查询语句执行失败!\n Sql: {}\n错误: {}'.format(sql, e) 40 | Exception.__init__(self, err) 41 | 42 | 43 | class DBOther(Exception): 44 | def __init__(self, sql, e): 45 | err = '语句执行失败!\nSql: {}\n错误: {}'.format(sql, e) 46 | Exception.__init__(self, err) 47 | 48 | 49 | class NoSupportType(Exception): 50 | def __init__(self, e): 51 | err = '不支持的sql操作{}'.format(e) 52 | Exception.__init__(self, err) 53 | -------------------------------------------------------------------------------- /api_test/utils/FormatJson.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: FormatJson.py 9 | 10 | # @Software: PyCharm 11 | import json 12 | 13 | 14 | def format_json(value): 15 | """ 16 | 字符串类型的json转json格式 17 | :param value: {} 18 | :return: 格式化后的value 19 | """ 20 | try: 21 | return json.dumps(value, indent=4, separators=(',', ': '), ensure_ascii=False) 22 | except: 23 | return value 24 | 25 | 26 | if __name__ == "__main__": 27 | print(format_json({})) 28 | -------------------------------------------------------------------------------- /api_test/utils/GetInt.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: GetInt.py 8 | 9 | # @Software: PyCharm 10 | 11 | 12 | def get_int(x): 13 | """ 14 | 目录下文件名,返回int-list 15 | :param x: 16 | :return: 17 | """ 18 | _list = list() 19 | for i in x: 20 | if i.isdigit(): 21 | _list.append(int(i)) 22 | elif i.endswith(".html"): 23 | if i.split(".")[0].isdigit(): 24 | _list.append(int(i.split(".")[0])) 25 | return _list 26 | 27 | 28 | if __name__ == "__main__": 29 | x1 = ["3", "1", "4", "6"] 30 | x2 = ["3.html", "1.html", "4.html", "6.html"] 31 | print(get_int(x1)) 32 | print(get_int(x2)) 33 | -------------------------------------------------------------------------------- /api_test/utils/GetLocalIP.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: GetLocalIP.py 8 | 9 | # @Software: PyCharm 10 | 11 | import socket 12 | 13 | 14 | def get_local_ip(): 15 | """ 16 | 获取当前服务器IP 17 | :return: 18 | """ 19 | local_ip = "" 20 | try: 21 | socket_objs = [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)] 22 | ip_from_ip_port = [(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in socket_objs][0][1] 23 | ip_from_host_name = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if 24 | not ip.startswith("127.")][:1] 25 | local_ip = [l for l in (ip_from_ip_port, ip_from_host_name) if l][0] 26 | except (Exception) as e: 27 | print("get_local_ip found exception : %s" % e) 28 | return local_ip if ("" != local_ip and None != local_ip) else socket.gethostbyname(socket.gethostname()) 29 | 30 | 31 | if __name__ == "__main__": 32 | print(socket.gethostname()) 33 | print(socket.gethostbyname(socket.gethostname())) 34 | print(get_local_ip()) 35 | 36 | -------------------------------------------------------------------------------- /api_test/utils/JenkinsIni.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: JenkinsConfig.py 8 | 9 | # @Software: PyCharm 10 | import jenkins 11 | 12 | from api_test.utils.AesCrypt import AesCrypt 13 | 14 | 15 | class JenkinsConfig: 16 | # MySQL数据库初始化 17 | def __init__(self, url, user, password, key='abcdefghijklmnop'): 18 | pr = AesCrypt("ECB", "", "utf-8", key) 19 | self.url = url 20 | self.user = user 21 | self.password = pr.aesdecrypt(password) # 密码解密 22 | 23 | def __enter__(self): 24 | if not self.url.startswith("http"): 25 | self.url = 'http://' + self.url 26 | self.server = jenkins.Jenkins(self.url, username=self.user, password=self.password) 27 | self.server.jobs_count() 28 | return self.server 29 | 30 | def __exit__(self, exc_type, exc_val, exc_tb): 31 | pass 32 | 33 | 34 | if __name__ == "__main__": 35 | with JenkinsConfig('', 'admin', 'p7avnvmUkXGlo7uWxNIBGg==') as f: 36 | # print(f.get_field("data_cube", "stat_device")) 37 | pass 38 | -------------------------------------------------------------------------------- /api_test/utils/MkReportHtml.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: MkReportHtml.py 9 | 10 | # @Software: PyCharm 11 | from Config.case_config import api_index, api_static_TestResult 12 | from RootDirectory import PROJECT_PATH 13 | 14 | report_html = """ 15 | 16 | 17 | 18 | 19 | Allure Report 20 | 21 | 22 | 23 | 24 | 25 |
26 |
27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | """ 40 | 41 | 42 | def mk_report_html(path): 43 | """ 44 | 创建访问用例的html文件 45 | :param path: 当前构建次数 46 | :return: 47 | """ 48 | with open("{}{}.html".format(api_index, path), "w") as f: 49 | f.write(report_html.format(path='{}'.format(api_static_TestResult+path))) 50 | -------------------------------------------------------------------------------- /api_test/utils/Mkdir.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: Mkdir.py 9 | 10 | # @Software: PyCharm 11 | import logging 12 | import os 13 | import shutil 14 | 15 | from api_test.utils.CustomException import ProjectDirExist, ProjectDirNotExist, PathError 16 | 17 | logger = logging.getLogger("api_automation_test") 18 | 19 | 20 | def mk_py_dir(path): 21 | # 去除首位空格 22 | path = path.strip() 23 | # 去除尾部 \ 符号 24 | path = path.rstrip("\\") 25 | 26 | # 判断路径是否存在 27 | # 存在 True 28 | # 不存在 False 29 | is_exists = os.path.exists(path) 30 | 31 | # 判断结果 32 | if not is_exists: 33 | # 如果不存在则创建目录 34 | # 创建目录操作函数 35 | os.makedirs(path) 36 | with open(path+"/__init__.py", "w") as f: 37 | pass 38 | else: 39 | raise ProjectDirExist(path) 40 | 41 | 42 | def update_py_dir(path, new_name): 43 | """ 44 | 修改项目文件夹名称 45 | :param path: 46 | :param new_name: 47 | :return: 48 | """ 49 | if os.path.exists(path): 50 | if os.path.isdir(path): 51 | os.rename(path, os.path.split(path)[0]+"/"+new_name) 52 | else: 53 | raise PathError(path) 54 | else: 55 | raise ProjectDirNotExist(path) 56 | 57 | 58 | def update_py_file(file, new_name): 59 | """ 60 | 修改项目文件名称 61 | :param file: 62 | :param new_name: 63 | :return: 64 | """ 65 | if os.path.exists(file): 66 | if os.path.isfile(file): 67 | os.rename(file, os.path.split(file)[0]+"/"+new_name) 68 | else: 69 | raise PathError(file) 70 | else: 71 | raise ProjectDirNotExist(file) 72 | 73 | 74 | def delete_dir(path): 75 | """ 76 | 删除文件夹 77 | :param path: 78 | :return: 79 | """ 80 | if os.path.exists(path): 81 | if os.path.isdir(path): 82 | shutil.rmtree(path) 83 | else: 84 | raise PathError(path) 85 | else: 86 | raise ProjectDirNotExist(path) 87 | 88 | 89 | if __name__ == "__main__": 90 | mk_py_dir("/PycharmProjects/api_automation_test/1/1/1/1") 91 | -------------------------------------------------------------------------------- /api_test/utils/ProjectStatus.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: ProjectStatus.py 8 | 9 | # @Software: PyCharm 10 | from django.core.exceptions import ObjectDoesNotExist 11 | 12 | from api_test.models import Project 13 | from api_test.serializers import ProjectSerializer 14 | from api_test.utils import response 15 | 16 | 17 | def project_status_verify(project_id): 18 | """ 19 | 项目状态判断 20 | :param project_id: 用例id 21 | :return: 22 | """ 23 | # 判断项目是否存在 24 | try: 25 | pro_data = Project.objects.get(id=project_id) 26 | except ObjectDoesNotExist: 27 | return response.PROJECT_NOT_EXIST 28 | pro_data_serializer = ProjectSerializer(pro_data) 29 | # 校验项目状态 30 | if pro_data_serializer.data["status"] in [2, 3]: 31 | return response.PROJECT_IS_FORBIDDEN 32 | return pro_data 33 | -------------------------------------------------------------------------------- /api_test/utils/RecordDynamic.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: RecordDynamic.py 8 | 9 | # @Software: PyCharm 10 | import datetime 11 | import logging 12 | 13 | from api_test.serializers import ProjectDynamicSerializer 14 | 15 | logger = logging.getLogger("api_automation_test") 16 | 17 | 18 | def record_dynamic(project, _type, operationObject, user, data): 19 | """ 20 | 记录项目动态 21 | :param project: 项目ID 22 | :param _type: 类型 23 | :param operationObject: 操作对象 24 | :param user: 用户ID 25 | :param data: 操作内容 26 | :return: 27 | """ 28 | dynamic_serializer = ProjectDynamicSerializer( 29 | data={ 30 | "project": project, "type": _type, 31 | "operationObject": operationObject, "user": user, 32 | "description": data 33 | } 34 | ) 35 | if dynamic_serializer.is_valid(): 36 | dynamic_serializer.save() 37 | else: 38 | logger.info("写入项目动态失败") 39 | logger.debug(dynamic_serializer) 40 | -------------------------------------------------------------------------------- /api_test/utils/Signature.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: Signature.py 8 | 9 | # @Software: PyCharm 10 | import hashlib 11 | import hmac 12 | from base64 import b64encode 13 | 14 | from api_test.config.DingdingConfig import APPSECRET 15 | 16 | 17 | def signature(code): 18 | """ 19 | hmacsha256算法 20 | :param code: 21 | :return: 22 | """ 23 | appkey = APPSECRET # miyao 24 | 25 | # hmac_sha256加密 26 | signature = hmac.new(bytes(appkey, encoding='utf-8'), bytes(code, encoding='utf-8'), 27 | digestmod=hashlib.sha256).digest() 28 | 29 | # 二进制转为HEX 30 | HEX = str(b64encode(signature), encoding='utf-8') 31 | return HEX 32 | 33 | 34 | if __name__ == '__main__': 35 | print(signature('1234567890123')) 36 | -------------------------------------------------------------------------------- /api_test/utils/WriteEnvXml.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: WriteEnvXml.py.py 8 | 9 | # @Software: PyCharm 10 | import os 11 | from xml.dom.minidom import Document 12 | 13 | import django 14 | 15 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api_automation_test.settings") 16 | django.setup() 17 | from api_test.models import HostIP 18 | 19 | 20 | class EnvXml: 21 | # host文件读取配置 22 | def __init__(self, project_id): 23 | self.host = HostIP.objects.filter(project_id=project_id) 24 | 25 | def write_xml(self, file_name): 26 | # 创建dom文档 27 | doc = Document() 28 | # 创建根节点 29 | environment = doc.createElement('environment') 30 | 31 | # 根节点插入dom树 32 | doc.appendChild(environment) 33 | for i in self.host: 34 | parameter = doc.createElement('parameter') 35 | environment.appendChild(parameter) 36 | key = doc.createElement('key') 37 | parameter.appendChild(key) 38 | key_text = doc.createTextNode(i.key) 39 | key.appendChild(key_text) 40 | value = doc.createElement('value') 41 | parameter.appendChild(value) 42 | value_text = doc.createTextNode(i.value) 43 | value.appendChild(value_text) 44 | with open(file_name+'/environment.xml', 'w') as f: 45 | f.write(doc.toprettyxml()) 46 | 47 | 48 | if __name__ == "__main__": 49 | host = EnvXml(2) 50 | host.write_xml('PycharmProjects/api_automation_test/123') 51 | -------------------------------------------------------------------------------- /api_test/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: __init__.py.py 8 | 9 | # @Software: PyCharm -------------------------------------------------------------------------------- /api_test/utils/api_response.py: -------------------------------------------------------------------------------- 1 | import six 2 | from rest_framework.response import Response 3 | from rest_framework.serializers import Serializer 4 | 5 | 6 | class JsonResponse(Response): 7 | """ 8 | An HttpResponse that allows its data to be rendered into 9 | arbitrary media types. 10 | """ 11 | 12 | def __init__(self, data=None, code_msg=None, status=None, 13 | template_name=None, headers=None, 14 | exception=False, content_type=None): 15 | """ 16 | Alters the init arguments slightly. 17 | For example, drop 'template_name', and instead use 'data'. 18 | Setting 'renderer' and 'media_type' will typically be deferred, 19 | For example being set automatically by the `APIView`. 20 | """ 21 | code, msg = code_msg["code"], code_msg["msg"] 22 | super(Response, self).__init__(None, status=status) 23 | if isinstance(data, Serializer): 24 | msg = ( 25 | 'You passed a Serializer instance as data, but ' 26 | 'probably meant to pass serialized `.data` or ' 27 | '`.error`. representation.' 28 | ) 29 | raise AssertionError(msg) 30 | self.data = {"code": code, "msg": msg, "data": data} 31 | self.template_name = template_name 32 | self.exception = exception 33 | self.content_type = content_type 34 | 35 | if headers: 36 | for name, value in six.iteritems(headers): 37 | self[name] = value 38 | -------------------------------------------------------------------------------- /api_test/utils/common.py: -------------------------------------------------------------------------------- 1 | import django 2 | import sys 3 | import os 4 | 5 | from api_test.utils import response 6 | 7 | curPath = os.path.abspath(os.path.dirname(__file__)) 8 | rootPath = os.path.split(curPath)[0] 9 | PathProject = os.path.split(rootPath)[0] 10 | sys.path.append(rootPath) 11 | sys.path.append(PathProject) 12 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api_automation_test.settings") 13 | django.setup() 14 | 15 | from rest_framework.views import exception_handler 16 | 17 | 18 | # 定义返回格式中间件 19 | def custom_exception_handler(exc, context): 20 | # Call REST framework's default exception handler first, 21 | # to get the standard error response. 22 | response_data = exception_handler(exc, context) 23 | # Now add the HTTP status code to the response. 24 | if response_data is not None: 25 | try: 26 | response_data.data['code'] = response_data.status_code 27 | response_data.data['msg'] = response_data.data['detail'] 28 | # response.data['data'] = None #可以存在 29 | # 删除detail字段 30 | del response_data.data['detail'] 31 | except KeyError: 32 | for k, v in dict(response_data.data).items(): 33 | if v == ['无法使用提供的认证信息登录。']: 34 | if response_data.status_code == 400: 35 | response_data.status_code = 200 36 | response_data.data = {} 37 | response_data.data['code'] = response.USER_OR_PASSWORD_ERROR["code"] 38 | response_data.data['msg'] = response.USER_OR_PASSWORD_ERROR["msg"] 39 | elif v == ['该字段是必填项。']: 40 | if response_data.status_code == 400: 41 | response_data.status_code = 200 42 | response_data.data = {} 43 | response_data.data['code'] = response.KEY_ERROR["code"] 44 | response_data.data['msg'] = response.KEY_ERROR["msg"] 45 | 46 | return response_data 47 | -------------------------------------------------------------------------------- /api_test/utils/permissions.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: permissions.py 8 | 9 | # @Software: PyCharm 10 | from django.core.exceptions import ObjectDoesNotExist 11 | 12 | from api_test.models import ProjectMember 13 | from api_test.utils import response 14 | from api_test.utils.api_response import JsonResponse 15 | 16 | 17 | def permission_judge(project, request): 18 | """ 19 | 非项目成员或超级管理员,没有权限 20 | :param project: 项目ID 21 | :param request: 请求主体 22 | :return: 非项目成员或超级管理员,没有权限 23 | """ 24 | try: 25 | # 判断用户是否为超级管理员 26 | if request.user.is_superuser: 27 | return True 28 | # 判断是否项目成员 29 | ProjectMember.objects.get(project=project, user=request.user.id) 30 | return True 31 | except ObjectDoesNotExist: 32 | return JsonResponse(code_msg=response.NO_PERMISSIONS) 33 | -------------------------------------------------------------------------------- /api_test/utils/runner.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: runner.py 9 | 10 | # @Software: PyCharm 11 | import io 12 | import sys 13 | import os 14 | import subprocess 15 | 16 | from Config.case_config import api_config 17 | 18 | EXEC = sys.executable 19 | 20 | if 'uwsgi' in EXEC: 21 | EXEC = "/usr/bin/python3" 22 | 23 | 24 | class DebugCode(object): 25 | 26 | def __init__(self, code, project): 27 | self.__code = code # 代码 28 | self.resp = None 29 | self.temp = api_config+project # debugtalk文件存放路径 30 | 31 | def run(self): 32 | """ dumps debugtalk.py and run 33 | """ 34 | file_path = os.path.join(self.temp, "debug.py") 35 | with io.open(file_path, 'w', encoding='utf-8') as stream: 36 | stream.write(self.__code) 37 | try: 38 | self.resp = decode(subprocess.check_output([EXEC, file_path], stderr=subprocess.STDOUT, timeout=60)) 39 | 40 | except subprocess.CalledProcessError as e: 41 | self.resp = decode(e.output) 42 | 43 | except subprocess.TimeoutExpired: 44 | self.resp = 'RunnerTimeOut' 45 | 46 | os.remove(file_path) 47 | 48 | 49 | def decode(s): 50 | try: 51 | return s.decode('utf-8') 52 | 53 | except UnicodeDecodeError: 54 | return s.decode('gbk') 55 | -------------------------------------------------------------------------------- /api_test/views/GetResult.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: GetResult.py 8 | 9 | # @Software: PyCharm 10 | from django.shortcuts import render 11 | from django.template.exceptions import TemplateDoesNotExist 12 | 13 | from Config.case_config import api_index_testResult 14 | from api_test.views.GetFile import read_json, read_css, read_attach, read_txt 15 | 16 | 17 | def get_result(request, result): 18 | if result.endswith(".json"): 19 | json_file = read_json(result) 20 | return json_file 21 | elif result.endswith(".css"): 22 | css_file = read_css(result) 23 | return css_file 24 | elif result.endswith(".attach") or result.endswith(".uri"): 25 | attach_file = read_attach(result) 26 | return attach_file 27 | elif result.endswith(".txt") or result.endswith("csv"): 28 | attach_file = read_txt(result) 29 | return attach_file 30 | else: 31 | try: 32 | return render(request, "{}{}.html".format(api_index_testResult, result)) 33 | except TemplateDoesNotExist: 34 | return render(request, "TestResult/{}.html".format(result)) 35 | -------------------------------------------------------------------------------- /api_test/views/ObtainAesSecretKey.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: ObtainAesSecretKey.py 8 | 9 | # @Software: PyCharm 10 | import logging 11 | 12 | import coreapi 13 | import coreschema 14 | from django.core.cache import cache 15 | from rest_framework import permissions 16 | from rest_framework.schemas import AutoSchema 17 | from rest_framework.views import APIView 18 | 19 | from TestScript.RandomData.RandomString import random_string 20 | from api_test.utils import response 21 | from api_test.utils.api_response import JsonResponse 22 | from api_test.utils.auth import ExpiringTokenAuthentication 23 | 24 | logger = logging.getLogger("api_automation_test") 25 | 26 | 27 | class GetAesSecretKye(APIView): 28 | authentication_classes = (ExpiringTokenAuthentication,) 29 | permission_classes = (permissions.IsAuthenticated, ) 30 | schema = AutoSchema( 31 | manual_fields=[ 32 | coreapi.Field(name='Authorization', required=True, location='header', description='token', 33 | schema=coreschema.String(), type="string", example="Token string"), 34 | ] 35 | ) 36 | 37 | @staticmethod 38 | def post(request): 39 | """ 40 | 获取Aes 秘钥 41 | :param request: 42 | :return: 43 | """ 44 | key = 'aes_key' 45 | aes_key = cache.get(key) 46 | if aes_key: 47 | return JsonResponse(code_msg=response.SUCCESS, data=aes_key) # 首先查看aes_key是否在缓存中,若存在,直接返回用户 48 | 49 | value = random_string(16) 50 | cache.set(key, value, 24 * 60 * 60) # 添加 aes_key 到缓存 51 | 52 | return JsonResponse(code_msg=response.SUCCESS, data=value) 53 | 54 | 55 | -------------------------------------------------------------------------------- /api_test/views/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # @Author  : litao 4 | 5 | # @Project : api_automation_test 6 | 7 | # @FileName: __init__.py.py 8 | 9 | # @Software: PyCharm -------------------------------------------------------------------------------- /backend/Config/CaseType.py: -------------------------------------------------------------------------------- 1 | def case_type(_type): 2 | data = { 3 | "Single": 1, 4 | "Integration": 2 5 | } 6 | return data[_type] -------------------------------------------------------------------------------- /backend/Config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/backend/Config/__init__.py -------------------------------------------------------------------------------- /backend/Views/Modules.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | import coreapi 4 | import coreschema 5 | from rest_framework import permissions 6 | from rest_framework.schemas import AutoSchema 7 | from rest_framework.views import APIView 8 | 9 | from api_test.utils import response 10 | from api_test.utils.api_response import JsonResponse 11 | from api_test.utils.auth import ExpiringTokenAuthentication 12 | from backend.models import Modules 13 | from backend.serializers import ModulesSerializer 14 | 15 | logger = logging.getLogger("api_automation_test") 16 | 17 | 18 | class CustomSchema(AutoSchema): 19 | def get_manual_fields(self, path, method): 20 | """Example adding per-method fields.""" 21 | 22 | extra_fields = list() 23 | 24 | if method == 'GET': 25 | extra_fields = [ 26 | coreapi.Field(name='Authorization', required=True, location='header', description='token', 27 | schema=coreschema.String(), type="string", example="Token string"), 28 | coreapi.Field(name='project', required=True, location='query', description='项目ID', 29 | schema=coreschema.Integer(), type="integer", example=""), 30 | ] 31 | manual_fields = super().get_manual_fields(path, method) 32 | 33 | return manual_fields + extra_fields 34 | 35 | 36 | class ModulesManager(APIView): 37 | authentication_classes = (ExpiringTokenAuthentication,) 38 | permission_classes = (permissions.IsAuthenticated,) 39 | schema = CustomSchema() 40 | 41 | def get(self, request): 42 | """ 43 | 获取项目模块 44 | """ 45 | project = request.GET.get("project") 46 | if not project: 47 | return JsonResponse(code_msg=response.KEY_ERROR) 48 | obi = Modules.objects.filter(project=project).order_by("id") 49 | serialize = ModulesSerializer(obi, many=True) 50 | return JsonResponse(data=serialize.data, code_msg=response.SUCCESS) 51 | -------------------------------------------------------------------------------- /backend/Views/Projects.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | import coreapi 4 | import coreschema 5 | from rest_framework import permissions 6 | from rest_framework.schemas import AutoSchema 7 | from rest_framework.views import APIView 8 | 9 | from api_test.utils import response 10 | from api_test.utils.api_response import JsonResponse 11 | from api_test.utils.auth import ExpiringTokenAuthentication 12 | from backend.models import Projects 13 | from backend.serializers import ProjectsSerializer 14 | 15 | logger = logging.getLogger("api_automation_test") 16 | 17 | 18 | class CustomSchema(AutoSchema): 19 | def get_manual_fields(self, path, method): 20 | """Example adding per-method fields.""" 21 | 22 | extra_fields = list() 23 | 24 | if method == 'GET': 25 | extra_fields = [ 26 | coreapi.Field(name='Authorization', required=True, location='header', description='token', 27 | schema=coreschema.String(), type="string", example="Token string"), 28 | ] 29 | manual_fields = super().get_manual_fields(path, method) 30 | 31 | return manual_fields + extra_fields 32 | 33 | 34 | class ProjectManager(APIView): 35 | authentication_classes = (ExpiringTokenAuthentication,) 36 | permission_classes = (permissions.IsAuthenticated,) 37 | schema = CustomSchema() 38 | 39 | def get(self, request): 40 | """ 41 | 获取项目列表 42 | """ 43 | obi = Projects.objects.all().order_by("id") 44 | serialize = ProjectsSerializer(obi, many=True) 45 | return JsonResponse(data=serialize.data, code_msg=response.SUCCESS) -------------------------------------------------------------------------------- /backend/Views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/backend/Views/__init__.py -------------------------------------------------------------------------------- /backend/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/backend/__init__.py -------------------------------------------------------------------------------- /backend/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BackendConfig(AppConfig): 5 | name = 'backend' 6 | -------------------------------------------------------------------------------- /backend/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/backend/migrations/__init__.py -------------------------------------------------------------------------------- /backend/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from backend.models import Projects, Modules, Cases 4 | 5 | 6 | class ProjectsSerializer(serializers.ModelSerializer): 7 | """ 8 | 项目表 9 | """ 10 | 11 | class Meta: 12 | model = Projects 13 | fields = "__all__" 14 | 15 | 16 | class ModulesSerializer(serializers.ModelSerializer): 17 | """ 18 | 模块表 19 | """ 20 | 21 | class Meta: 22 | model = Modules 23 | fields = "__all__" 24 | 25 | 26 | class CasesSerializer(serializers.ModelSerializer): 27 | """ 28 | 接口表 29 | """ 30 | 31 | class Meta: 32 | model = Cases 33 | fields = "__all__" 34 | 35 | 36 | class ProjectCaseSerializer(serializers.ModelSerializer): 37 | """ 38 | 项目下所有用例 39 | """ 40 | project = serializers.CharField(source='project.zh_name') 41 | project_name = serializers.CharField(source='project.name') 42 | modules = serializers.CharField(source='modules.zh_name') 43 | modules_name = serializers.CharField(source='modules.name') 44 | update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) 45 | create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) 46 | write_time = serializers.DateTimeField(format="%Y-%m-%d", required=False, read_only=True) 47 | 48 | class Meta: 49 | model = Cases 50 | fields = "__all__" 51 | -------------------------------------------------------------------------------- /backend/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /backend/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import url 2 | 3 | from backend.Views import UploadCase, Cases, Projects, Modules 4 | 5 | urlpatterns = [ 6 | url(r'upload', UploadCase.UploadCaseManager.as_view()), 7 | url(r'lists', Cases.CaseInfoManager.as_view()), 8 | url(r'projects', Projects.ProjectManager.as_view()), 9 | url(r'modules', Modules.ModulesManager.as_view()) 10 | ] -------------------------------------------------------------------------------- /backend/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /case_logs/.gitignore: -------------------------------------------------------------------------------- 1 | # ignore all except .gitignore file 2 | * 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 githublitao 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 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, 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /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", "api_automation_test.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError as exc: 10 | raise ImportError( 11 | "Couldn't import Django. Are you sure it's installed and " 12 | "available on your PYTHONPATH environment variable? Did you " 13 | "forget to activate a virtual environment?" 14 | ) from exc 15 | execute_from_command_line(sys.argv) 16 | -------------------------------------------------------------------------------- /mysql/init.sql: -------------------------------------------------------------------------------- 1 | CREATE USER 'root'@'%' IDENTIFIED BY '123456'; 2 | GRANT All privileges ON *.* TO 'root'@'%'; 3 | update mysql.user set authentication_string=password('123456') where user='root'; -------------------------------------------------------------------------------- /mysql/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | user=mysql 3 | default-storage-engine=INNODB 4 | character-set-server=utf8 5 | [client] 6 | default-character-set=utf8 7 | [mysql] 8 | default-character-set=utf8 -------------------------------------------------------------------------------- /replace_celery.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, unicode_literals 2 | 3 | from celery.bin import celery 4 | 5 | from djcelery.app import app 6 | from djcelery.management.base import CeleryCommand 7 | 8 | base = celery.CeleryCommand(app=app) 9 | 10 | 11 | class Command(CeleryCommand): 12 | """The celery command.""" 13 | help = 'celery commands, see celery help' 14 | cc_options = CeleryCommand.options if CeleryCommand.options else [] 15 | base_options = base.get_options() if base.get_options() else [] 16 | if hasattr(base, "preload_options"): 17 | preload_options = basffffe.preload_options if base.preload_options else [] 18 | else: 19 | preload_options = [] 20 | preload_options = base.preload_options if base.preload_options else [] 21 | # options = (cc_options + 22 | # base_options + 23 | # preload_options) 24 | 25 | def run_from_argv(self, argv): 26 | argv = self.handle_default_options(argv) 27 | base.execute_from_commandline( 28 | ['{0[0]} {0[1]}'.format(argv)] + argv[2:], 29 | ) 30 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | xlrd==1.2.0 2 | TestLink-API-Python-client 3 | cryptography 4 | incremental 5 | rarfile 6 | numpy 7 | coreschema 8 | PyMySQL 9 | django-rest-swagger 10 | coreapi 11 | Django 12 | djangorestframework 13 | django-celery 14 | django-cors-headers 15 | djangorestframework-stubs 16 | django-import-export 17 | django-formtools 18 | PyYAML 19 | pytest 20 | requests 21 | simplejson 22 | jsonpath 23 | django-redis 24 | celery 25 | celery-with-redis 26 | django-simpleui 27 | redis 28 | Pillow 29 | uWSGI 30 | supervisor 31 | pycryptodome 32 | allure-pytest 33 | pytest-rerunfailures 34 | pytest-repeat 35 | python-jenkins 36 | channels 37 | channels_redis 38 | asgi_redis 39 | asgiref 40 | six -------------------------------------------------------------------------------- /static/TestResult/.gitignore: -------------------------------------------------------------------------------- 1 | # ignore all except .gitignore file 2 | * 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /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/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /static/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /static/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /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/admin/simpleui/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/0.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/1.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/11.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/12.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/13.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/14.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/15.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/17.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/18.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/19.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/2.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/20.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/22.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/23.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/24.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/25.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/26.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/28.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/29.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/3.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/31.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/32.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/35.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/36.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/37.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/38.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/39.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/4.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/41.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/42.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/43.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/46.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/47.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/48.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/5.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/50.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/51.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/53.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/55.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/56.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/57.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/6.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/60.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/61.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/62.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/63.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/64.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/65.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/67.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/68.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/69.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/71.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/8.gif -------------------------------------------------------------------------------- /static/admin/simpleui/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/admin/simpleui/layui/images/face/9.gif -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/favicon.ico -------------------------------------------------------------------------------- /static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/images/favicon.ico -------------------------------------------------------------------------------- /static/rest_framework_swagger/css/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */ 2 | html, 3 | body, 4 | div, 5 | span, 6 | applet, 7 | object, 8 | iframe, 9 | h1, 10 | h2, 11 | h3, 12 | h4, 13 | h5, 14 | h6, 15 | p, 16 | blockquote, 17 | pre, 18 | a, 19 | abbr, 20 | acronym, 21 | address, 22 | big, 23 | cite, 24 | code, 25 | del, 26 | dfn, 27 | em, 28 | img, 29 | ins, 30 | kbd, 31 | q, 32 | s, 33 | samp, 34 | small, 35 | strike, 36 | strong, 37 | sub, 38 | sup, 39 | tt, 40 | var, 41 | b, 42 | u, 43 | i, 44 | center, 45 | dl, 46 | dt, 47 | dd, 48 | ol, 49 | ul, 50 | li, 51 | fieldset, 52 | form, 53 | label, 54 | legend, 55 | table, 56 | caption, 57 | tbody, 58 | tfoot, 59 | thead, 60 | tr, 61 | th, 62 | td, 63 | article, 64 | aside, 65 | canvas, 66 | details, 67 | embed, 68 | figure, 69 | figcaption, 70 | footer, 71 | header, 72 | hgroup, 73 | menu, 74 | nav, 75 | output, 76 | ruby, 77 | section, 78 | summary, 79 | time, 80 | mark, 81 | audio, 82 | video { 83 | margin: 0; 84 | padding: 0; 85 | border: 0; 86 | font-size: 100%; 87 | font: inherit; 88 | vertical-align: baseline; 89 | } 90 | /* HTML5 display-role reset for older browsers */ 91 | article, 92 | aside, 93 | details, 94 | figcaption, 95 | figure, 96 | footer, 97 | header, 98 | hgroup, 99 | menu, 100 | nav, 101 | section { 102 | display: block; 103 | } 104 | body { 105 | line-height: 1; 106 | } 107 | ol, 108 | ul { 109 | list-style: none; 110 | } 111 | blockquote, 112 | q { 113 | quotes: none; 114 | } 115 | blockquote:before, 116 | blockquote:after, 117 | q:before, 118 | q:after { 119 | content: ''; 120 | content: none; 121 | } 122 | table { 123 | border-collapse: collapse; 124 | border-spacing: 0; 125 | } 126 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/css/typography.css: -------------------------------------------------------------------------------- 1 | /* Google Font's Droid Sans */ 2 | @font-face { 3 | font-family: 'Droid Sans'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: local('Droid Sans'), local('DroidSans'), url('../fonts/DroidSans.ttf'), format('truetype'); 7 | } 8 | /* Google Font's Droid Sans Bold */ 9 | @font-face { 10 | font-family: 'Droid Sans'; 11 | font-style: normal; 12 | font-weight: 700; 13 | src: local('Droid Sans Bold'), local('DroidSans-Bold'), url('../fonts/DroidSans-Bold.ttf'), format('truetype'); 14 | } 15 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/fonts/DroidSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/fonts/DroidSans-Bold.ttf -------------------------------------------------------------------------------- /static/rest_framework_swagger/fonts/DroidSans.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/fonts/DroidSans.ttf -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/collapse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/collapse.gif -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/expand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/expand.gif -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/explorer_icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/explorer_icons.png -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/favicon-16x16.png -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/favicon-32x32.png -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/favicon.ico -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/logo_small.png -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/pet_store_api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/pet_store_api.png -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/throbber.gif -------------------------------------------------------------------------------- /static/rest_framework_swagger/images/wordnik_api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/static/rest_framework_swagger/images/wordnik_api.png -------------------------------------------------------------------------------- /static/rest_framework_swagger/init.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | hljs.configure({ 3 | highlightSizeThreshold: 5000 4 | }); 5 | 6 | // Pre load translate... 7 | if(window.SwaggerTranslator) { 8 | window.SwaggerTranslator.translate(); 9 | } 10 | var settings = { 11 | url: window.location.pathname + '?format=openapi', 12 | dom_id: "swagger-ui-container", 13 | onComplete: function(swaggerApi, swaggerUi){ 14 | if(typeof initOAuth == "function") { 15 | initOAuth({ 16 | clientId: "your-client-id", 17 | clientSecret: "your-client-secret-if-required", 18 | realm: "your-realms", 19 | appName: "your-app-name", 20 | scopeSeparator: ",", 21 | additionalQueryStringParams: {} 22 | }); 23 | } 24 | 25 | if(window.SwaggerTranslator) { 26 | window.SwaggerTranslator.translate(); 27 | } 28 | addCsrfTokenHeaders(); 29 | }, 30 | onFailure: function(data) { 31 | log("Unable to Load SwaggerUI"); 32 | }, 33 | }; 34 | $.extend(settings, JSON.parse($('#drs-settings').html())); 35 | 36 | window.swaggerUi = new SwaggerUi(settings); 37 | 38 | window.swaggerUi.load(); 39 | 40 | function addCsrfTokenHeaders() { 41 | var token = $('[name="csrfmiddlewaretoken"]')[0]; 42 | if (!token) { 43 | return; 44 | } 45 | swaggerUi.api.clientAuthorizations.add( 46 | 'csrf_token', 47 | new SwaggerClient.ApiKeyAuthorization( 48 | 'X-CSRFToken', 49 | token.value, 50 | 'header' 51 | ) 52 | ); 53 | } 54 | 55 | function log() { 56 | if ('console' in window) { 57 | console.log.apply(console, arguments); 58 | } 59 | } 60 | }); 61 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/lang/ja.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* jshint quotmark: double */ 4 | window.SwaggerTranslator.learn({ 5 | "Warning: Deprecated":"警告: 廃止予定", 6 | "Implementation Notes":"実装メモ", 7 | "Response Class":"レスポンスクラス", 8 | "Status":"ステータス", 9 | "Parameters":"パラメータ群", 10 | "Parameter":"パラメータ", 11 | "Value":"値", 12 | "Description":"説明", 13 | "Parameter Type":"パラメータタイプ", 14 | "Data Type":"データタイプ", 15 | "Response Messages":"レスポンスメッセージ", 16 | "HTTP Status Code":"HTTPステータスコード", 17 | "Reason":"理由", 18 | "Response Model":"レスポンスモデル", 19 | "Request URL":"リクエストURL", 20 | "Response Body":"レスポンスボディ", 21 | "Response Code":"レスポンスコード", 22 | "Response Headers":"レスポンスヘッダ", 23 | "Hide Response":"レスポンスを隠す", 24 | "Headers":"ヘッダ", 25 | "Try it out!":"実際に実行!", 26 | "Show/Hide":"表示/非表示", 27 | "List Operations":"操作一覧", 28 | "Expand Operations":"操作の展開", 29 | "Raw":"Raw", 30 | "can't parse JSON. Raw result":"JSONへ解釈できません. 未加工の結果", 31 | "Model Schema":"モデルスキーマ", 32 | "Model":"モデル", 33 | "apply":"実行", 34 | "Username":"ユーザ名", 35 | "Password":"パスワード", 36 | "Terms of service":"サービス利用規約", 37 | "Created by":"Created by", 38 | "See more at":"See more at", 39 | "Contact the developer":"開発者に連絡", 40 | "api version":"APIバージョン", 41 | "Response Content Type":"レスポンス コンテンツタイプ", 42 | "fetching resource":"リソースの取得", 43 | "fetching resource list":"リソース一覧の取得", 44 | "Explore":"Explore", 45 | "Show Swagger Petstore Example Apis":"SwaggerペットストアAPIの表示", 46 | "Can't read from server. It may not have the appropriate access-control-origin settings.":"サーバから読み込めません. 適切なaccess-control-origin設定を持っていない可能性があります.", 47 | "Please specify the protocol for":"プロトコルを指定してください", 48 | "Can't read swagger JSON from":"次からswagger JSONを読み込めません", 49 | "Finished Loading Resource Information. Rendering Swagger UI":"リソース情報の読み込みが完了しました. Swagger UIを描画しています", 50 | "Unable to read api":"APIを読み込めません", 51 | "from path":"次のパスから", 52 | "server returned":"サーバからの返答" 53 | }); 54 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/lang/ko-kr.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* jshint quotmark: double */ 4 | window.SwaggerTranslator.learn({ 5 | "Warning: Deprecated":"경고:폐기예정됨", 6 | "Implementation Notes":"구현 노트", 7 | "Response Class":"응답 클래스", 8 | "Status":"상태", 9 | "Parameters":"매개변수들", 10 | "Parameter":"매개변수", 11 | "Value":"값", 12 | "Description":"설명", 13 | "Parameter Type":"매개변수 타입", 14 | "Data Type":"데이터 타입", 15 | "Response Messages":"응답 메세지", 16 | "HTTP Status Code":"HTTP 상태 코드", 17 | "Reason":"원인", 18 | "Response Model":"응답 모델", 19 | "Request URL":"요청 URL", 20 | "Response Body":"응답 본문", 21 | "Response Code":"응답 코드", 22 | "Response Headers":"응답 헤더", 23 | "Hide Response":"응답 숨기기", 24 | "Headers":"헤더", 25 | "Try it out!":"써보기!", 26 | "Show/Hide":"보이기/숨기기", 27 | "List Operations":"목록 작업", 28 | "Expand Operations":"전개 작업", 29 | "Raw":"원본", 30 | "can't parse JSON. Raw result":"JSON을 파싱할수 없음. 원본결과:", 31 | "Model Schema":"모델 스키마", 32 | "Model":"모델", 33 | "apply":"적용", 34 | "Username":"사용자 이름", 35 | "Password":"암호", 36 | "Terms of service":"이용약관", 37 | "Created by":"작성자", 38 | "See more at":"추가정보:", 39 | "Contact the developer":"개발자에게 문의", 40 | "api version":"api버전", 41 | "Response Content Type":"응답Content Type", 42 | "fetching resource":"리소스 가져오기", 43 | "fetching resource list":"리소스 목록 가져오기", 44 | "Explore":"탐색", 45 | "Show Swagger Petstore Example Apis":"Swagger Petstore 예제 보기", 46 | "Can't read from server. It may not have the appropriate access-control-origin settings.":"서버로부터 읽어들일수 없습니다. access-control-origin 설정이 올바르지 않을수 있습니다.", 47 | "Please specify the protocol for":"다음을 위한 프로토콜을 정하세요", 48 | "Can't read swagger JSON from":"swagger JSON 을 다음으로 부터 읽을수 없습니다", 49 | "Finished Loading Resource Information. Rendering Swagger UI":"리소스 정보 불러오기 완료. Swagger UI 랜더링", 50 | "Unable to read api":"api를 읽을 수 없습니다.", 51 | "from path":"다음 경로로 부터", 52 | "server returned":"서버 응답함." 53 | }); 54 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/lang/translator.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Translator for documentation pages. 5 | * 6 | * To enable translation you should include one of language-files in your index.html 7 | * after . 8 | * For example - 9 | * 10 | * If you wish to translate some new texts you should do two things: 11 | * 1. Add a new phrase pair ("New Phrase": "New Translation") into your language file (for example lang/ru.js). It will be great if you add it in other language files too. 12 | * 2. Mark that text it templates this way New Phrase or . 13 | * The main thing here is attribute data-sw-translate. Only inner html, title-attribute and value-attribute are going to translate. 14 | * 15 | */ 16 | window.SwaggerTranslator = { 17 | 18 | _words:[], 19 | 20 | translate: function(sel) { 21 | var $this = this; 22 | sel = sel || '[data-sw-translate]'; 23 | 24 | $(sel).each(function() { 25 | $(this).html($this._tryTranslate($(this).html())); 26 | 27 | $(this).val($this._tryTranslate($(this).val())); 28 | $(this).attr('title', $this._tryTranslate($(this).attr('title'))); 29 | }); 30 | }, 31 | 32 | _tryTranslate: function(word) { 33 | return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word; 34 | }, 35 | 36 | learn: function(wordsMap) { 37 | this._words = wordsMap; 38 | } 39 | }; 40 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/lang/zh-cn.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* jshint quotmark: double */ 4 | window.SwaggerTranslator.learn({ 5 | "Warning: Deprecated":"警告:已过时", 6 | "Implementation Notes":"实现备注", 7 | "Response Class":"响应类", 8 | "Status":"状态", 9 | "Parameters":"参数", 10 | "Parameter":"参数", 11 | "Value":"值", 12 | "Description":"描述", 13 | "Parameter Type":"参数类型", 14 | "Data Type":"数据类型", 15 | "Response Messages":"响应消息", 16 | "HTTP Status Code":"HTTP状态码", 17 | "Reason":"原因", 18 | "Response Model":"响应模型", 19 | "Request URL":"请求URL", 20 | "Response Body":"响应体", 21 | "Response Code":"响应码", 22 | "Response Headers":"响应头", 23 | "Hide Response":"隐藏响应", 24 | "Headers":"头", 25 | "Try it out!":"试一下!", 26 | "Show/Hide":"显示/隐藏", 27 | "List Operations":"显示操作", 28 | "Expand Operations":"展开操作", 29 | "Raw":"原始", 30 | "can't parse JSON. Raw result":"无法解析JSON. 原始结果", 31 | "Model Schema":"模型架构", 32 | "Model":"模型", 33 | "apply":"应用", 34 | "Username":"用户名", 35 | "Password":"密码", 36 | "Terms of service":"服务条款", 37 | "Created by":"创建者", 38 | "See more at":"查看更多:", 39 | "Contact the developer":"联系开发者", 40 | "api version":"api版本", 41 | "Response Content Type":"响应Content Type", 42 | "fetching resource":"正在获取资源", 43 | "fetching resource list":"正在获取资源列表", 44 | "Explore":"浏览", 45 | "Show Swagger Petstore Example Apis":"显示 Swagger Petstore 示例 Apis", 46 | "Can't read from server. It may not have the appropriate access-control-origin settings.":"无法从服务器读取。可能没有正确设置access-control-origin。", 47 | "Please specify the protocol for":"请指定协议:", 48 | "Can't read swagger JSON from":"无法读取swagger JSON于", 49 | "Finished Loading Resource Information. Rendering Swagger UI":"已加载资源信息。正在渲染Swagger UI", 50 | "Unable to read api":"无法读取api", 51 | "from path":"从路径", 52 | "server returned":"服务器返回" 53 | }); 54 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/lib/highlight.9.1.0.pack_extended.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | (function () { 4 | var configure, highlightBlock; 5 | 6 | configure = hljs.configure; 7 | // "extending" hljs.configure method 8 | hljs.configure = function _configure (options) { 9 | var size = options.highlightSizeThreshold; 10 | 11 | // added highlightSizeThreshold option to set maximum size 12 | // of processed string. Set to null if not a number 13 | hljs.highlightSizeThreshold = size === +size ? size : null; 14 | 15 | configure.call(this, options); 16 | }; 17 | 18 | highlightBlock = hljs.highlightBlock; 19 | 20 | // "extending" hljs.highlightBlock method 21 | hljs.highlightBlock = function _highlightBlock (el) { 22 | var innerHTML = el.innerHTML; 23 | var size = hljs.highlightSizeThreshold; 24 | 25 | // check if highlightSizeThreshold is not set or element innerHTML 26 | // is less than set option highlightSizeThreshold 27 | if (size == null || size > innerHTML.length) { 28 | // proceed with hljs.highlightBlock 29 | highlightBlock.call(hljs, el); 30 | } 31 | }; 32 | 33 | })(); 34 | 35 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/lib/jquery.slideto.min.js: -------------------------------------------------------------------------------- 1 | (function(b){b.fn.slideto=function(a){a=b.extend({slide_duration:"slow",highlight_duration:3E3,highlight:true,highlight_color:"#FFFF99"},a);return this.each(function(){obj=b(this);b("body").animate({scrollTop:obj.offset().top},a.slide_duration,function(){a.highlight&&b.ui.version&&obj.effect("highlight",{color:a.highlight_color},a.highlight_duration)})})}})(jQuery); 2 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/lib/jquery.wiggle.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | jQuery Wiggle 3 | Author: WonderGroup, Jordan Thomas 4 | URL: http://labs.wondergroup.com/demos/mini-ui/index.html 5 | License: MIT (http://en.wikipedia.org/wiki/MIT_License) 6 | */ 7 | jQuery.fn.wiggle=function(o){var d={speed:50,wiggles:3,travel:5,callback:null};var o=jQuery.extend(d,o);return this.each(function(){var cache=this;var wrap=jQuery(this).wrap('
').css("position","relative");var calls=0;for(i=1;i<=o.wiggles;i++){jQuery(this).animate({left:"-="+o.travel},o.speed).animate({left:"+="+o.travel*2},o.speed*2).animate({left:"-="+o.travel},o.speed,function(){calls++;if(jQuery(cache).parent().hasClass('wiggle-wrap')){jQuery(cache).parent().replaceWith(cache);} 8 | if(calls==o.wiggles&&jQuery.isFunction(o.callback)){o.callback();}});}});}; -------------------------------------------------------------------------------- /static/rest_framework_swagger/lib/object-assign-pollyfill.js: -------------------------------------------------------------------------------- 1 | if (typeof Object.assign != 'function') { 2 | (function () { 3 | Object.assign = function (target) { 4 | 'use strict'; 5 | if (target === undefined || target === null) { 6 | throw new TypeError('Cannot convert undefined or null to object'); 7 | } 8 | 9 | var output = Object(target); 10 | for (var index = 1; index < arguments.length; index++) { 11 | var source = arguments[index]; 12 | if (source !== undefined && source !== null) { 13 | for (var nextKey in source) { 14 | if (Object.prototype.hasOwnProperty.call(source, nextKey)) { 15 | output[nextKey] = source[nextKey]; 16 | } 17 | } 18 | } 19 | } 20 | return output; 21 | }; 22 | })(); 23 | } 24 | -------------------------------------------------------------------------------- /static/rest_framework_swagger/o2c.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/TestResult/.gitignore: -------------------------------------------------------------------------------- 1 | # ignore all except .gitignore file 2 | * 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /templates/admin/404.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | {% block title %}{% trans 'Page not found' %}{% endblock %} 5 | 6 | {% block content %} 7 | 8 |

{% trans 'Page not found' %}

9 | 10 |

{% trans "We're sorry, but the requested page could not be found." %}

11 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /templates/admin/500.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | {% block breadcrumbs %} 5 | 9 | {% endblock %} 10 | 11 | {% block title %}{% trans 'Server error (500)' %}{% endblock %} 12 | 13 | {% block content %} 14 |

{% trans 'Server Error (500)' %}

15 |

{% trans "There's been an error. It's been reported to the site administrators via email and should be fixed shortly. Thanks for your patience." %}

16 | 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /templates/admin/app_index.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/index.html" %} 2 | {% load i18n %} 3 | 4 | {% block bodyclass %}{{ block.super }} app-{{ app_label }}{% endblock %} 5 | 6 | {% if not is_popup %} 7 | {% block breadcrumbs %} 8 | 15 | {% endblock %} 16 | {% endif %} 17 | 18 | {% block sidebar %}{% endblock %} 19 | -------------------------------------------------------------------------------- /templates/admin/auth/user/add_form.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/change_form.html" %} 2 | {% load i18n %} 3 | 4 | {% block form_top %} 5 | {% if not is_popup %} 6 |

{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}

7 | {% else %} 8 |

{% trans "Enter a username and password." %}

9 | {% endif %} 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /templates/admin/base_site.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base.html" %} 2 | 3 | {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} 4 | 5 | {% block branding %} 6 |

{{ site_header|default:_('Django administration') }}

7 | {% endblock %} 8 | 9 | {% block nav-global %}{% endblock %} 10 | -------------------------------------------------------------------------------- /templates/admin/change_form_object_tools.html: -------------------------------------------------------------------------------- 1 | {% load i18n admin_urls %} 2 | {% block object-tools-items %} 3 |
  • 4 | {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} 5 | {% trans "History" %} 6 |
  • 7 | {% if has_absolute_url %}
  • {% trans "View on site" %}
  • {% endif %} 8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /templates/admin/change_list_object_tools.html: -------------------------------------------------------------------------------- 1 | {% load i18n admin_urls %} 2 | 3 | {% block object-tools-items %} 4 | {% if has_add_permission %} 5 |
  • 6 | {% url cl.opts|admin_urlname:'add' as add_url %} 7 | 8 | {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} 9 | 10 |
  • 11 | {% endif %} 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /templates/admin/date_hierarchy.html: -------------------------------------------------------------------------------- 1 | {% if show %} 2 |
    3 |
    9 |
    10 | {% endif %} 11 | -------------------------------------------------------------------------------- /templates/admin/edit_inline/stacked.html: -------------------------------------------------------------------------------- 1 | {% load i18n admin_urls static %} 2 |
    6 |
    7 |

    {{ inline_admin_formset.opts.verbose_name_plural|capfirst }}

    8 | {{ inline_admin_formset.formset.management_form }} 9 | {{ inline_admin_formset.formset.non_form_errors }} 10 | 11 | {% for inline_admin_form in inline_admin_formset %}
    12 |

    {{ inline_admin_formset.opts.verbose_name|capfirst }}: {% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} {% trans "Change" %}{% endif %} 13 | {% else %}#{{ forloop.counter }}{% endif %} 14 | {% if inline_admin_form.show_url %}{% trans "View on site" %}{% endif %} 15 | {% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}{% endif %} 16 |

    17 | {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} 18 | {% for fieldset in inline_admin_form %} 19 | {% include "admin/includes/fieldset.html" %} 20 | {% endfor %} 21 | {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} 22 | {{ inline_admin_form.fk_field.field }} 23 |
    {% endfor %} 24 |
    25 |
    26 | -------------------------------------------------------------------------------- /templates/admin/filter.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 |

    {% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}

    3 | 9 | -------------------------------------------------------------------------------- /templates/admin/includes/fieldset.html: -------------------------------------------------------------------------------- 1 |
    2 | {% if fieldset.name %}

    {{ fieldset.name }}

    {% endif %} 3 | {% if fieldset.description %} 4 |
    {{ fieldset.description|safe }}
    5 | {% endif %} 6 | {% for line in fieldset %} 7 |
    8 | {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %} 9 | {% for field in line %} 10 | 13 | {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %} 14 | {% if field.is_checkbox %} 15 | {{ field.field }}{{ field.label_tag }} 16 | {% else %} 17 | {{ field.label_tag }} 18 | {% if field.is_readonly %} 19 |
    {{ field.contents }}
    20 | {% else %} 21 | {{ field.field }} 22 | {% endif %} 23 | {% endif %} 24 | {% if field.field.help_text %} 25 |
    {{ field.field.help_text|safe }}
    26 | {% endif %} 27 |
    28 | {% endfor %} 29 | 30 | {% endfor %} 31 |
    32 | -------------------------------------------------------------------------------- /templates/admin/includes/object_delete_summary.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 |

    {% trans "Summary" %}

    3 |
      4 | {% for model_name, object_count in model_count %} 5 |
    • {{ model_name|capfirst }}: {{ object_count }}
    • 6 | {% endfor %} 7 |
    8 | -------------------------------------------------------------------------------- /templates/admin/invalid_setup.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | {% block breadcrumbs %} 5 | 9 | {% endblock %} 10 | 11 | {% block content %} 12 |

    {% trans "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user." %}

    13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /templates/admin/object_history.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n admin_urls %} 3 | 4 | {% block breadcrumbs %} 5 | 13 | {% endblock %} 14 | 15 | {% block content %} 16 | 21 |
    22 |
    23 | 24 | {% if action_list %} 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | {% for action in action_list %} 35 | 36 | 37 | 39 | 40 | 41 | {% endfor %} 42 | 43 |
    {% trans 'Date/time' %}{% trans 'User' %}{% trans 'Action' %}
    {{ action.action_time|date:"DATETIME_FORMAT" }}{{ action.user.get_username }}{% if action.user.get_full_name %} ( 38 | {{ action.user.get_full_name }}){% endif %}{{ action.get_change_message }}
    44 | {% else %} 45 |

    {% trans "This object doesn't have a change history. It probably wasn't added via this admin site." %}

    46 | {% endif %} 47 |
    48 |
    49 | 50 | {% endblock %} 51 | -------------------------------------------------------------------------------- /templates/admin/pagination.html: -------------------------------------------------------------------------------- 1 | {% load admin_list %} 2 | {% load i18n %} 3 | {% load simpletags %} 4 | 16 | -------------------------------------------------------------------------------- /templates/admin/popup_response.html: -------------------------------------------------------------------------------- 1 | {% load i18n static %} 2 | 3 | {% trans 'Popup closing...' %} 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /templates/admin/prepopulated_fields_js.html: -------------------------------------------------------------------------------- 1 | {% load l10n static %} 2 | 7 | -------------------------------------------------------------------------------- /templates/admin/related_widget_wrapper.html: -------------------------------------------------------------------------------- 1 | {% load i18n static %} 2 | 30 | -------------------------------------------------------------------------------- /templates/admin/widgets/clearable_file_input.html: -------------------------------------------------------------------------------- 1 | {% if widget.is_initial %}

    {{ widget.initial_text }}: {{ widget.value }}{% if not widget.required %} 2 | 3 | 4 | {% endif %}
    5 | {{ widget.input_text }}:{% endif %} 6 | {% if widget.is_initial %}

    {% endif %} 7 | -------------------------------------------------------------------------------- /templates/admin/widgets/foreign_key_raw_id.html: -------------------------------------------------------------------------------- 1 | {% include 'django/forms/widgets/input.html' %}{% if related_url %}{% endif %}{% if link_label %} {% if link_url %}{% endif %}{{ link_label }}{% if link_url %}{% endif %}{% endif %} 2 | -------------------------------------------------------------------------------- /templates/admin/widgets/many_to_many_raw_id.html: -------------------------------------------------------------------------------- 1 | {% include 'admin/widgets/foreign_key_raw_id.html' %} 2 | -------------------------------------------------------------------------------- /templates/admin/widgets/radio.html: -------------------------------------------------------------------------------- 1 | {% include "django/forms/widgets/multiple_input.html" %} 2 | -------------------------------------------------------------------------------- /templates/admin/widgets/related_widget_wrapper.html: -------------------------------------------------------------------------------- 1 | {% load i18n static %} 2 | 30 | -------------------------------------------------------------------------------- /templates/admin/widgets/split_datetime.html: -------------------------------------------------------------------------------- 1 |

    2 | {{ date_label }} {% with widget=widget.subwidgets.0 %}{% include widget.template_name %}{% endwith %}
    3 | {{ time_label }} {% with widget=widget.subwidgets.1 %}{% include widget.template_name %}{% endwith %} 4 |

    5 | -------------------------------------------------------------------------------- /templates/admin/widgets/url.html: -------------------------------------------------------------------------------- 1 | {% if widget.value %}

    {{ current_label }} {{ widget.value }}
    {{ change_label }} {% endif %}{% include "django/forms/widgets/input.html" %}{% if widget.value %}

    {% endif %} 2 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 自动化测试平台
    -------------------------------------------------------------------------------- /templates/registration/logged_out.html: -------------------------------------------------------------------------------- 1 | {#{% extends "admin/base_site.html" %}#} 2 | {% load i18n %} 3 | {##} 4 | {#{% block breadcrumbs %}{% endblock %}#} 5 | {##} 6 | {#{% block content %}#} 7 | {##} 8 | {#

    {% trans "Thanks for spending some quality time with the Web site today." %}

    #} 9 | {##} 10 | {#

    {% trans 'Log in again' %}

    #} 11 | {##} 12 | {#{% endblock %}#} 13 | 14 | 15 | 16 | 17 | 18 | 19 |

    {% trans 'Log in again' %}

    20 | 21 | -------------------------------------------------------------------------------- /templates/registration/password_change_done.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | {% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %} 4 | {% trans 'Documentation' %} / {% endif %}{% trans 'Change password' %} / 5 | {% trans 'Log out' %}{% endblock %} 6 | {% block breadcrumbs %} 7 | 11 | {% endblock %} 12 | 13 | {% block title %}{{ title }}{% endblock %} 14 | {% block content_title %}

    {{ title }}

    {% endblock %} 15 | {% block content %} 16 |

    {% trans 'Your password was changed.' %}

    17 | 23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /templates/registration/password_reset_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | {% block breadcrumbs %} 5 | 9 | {% endblock %} 10 | 11 | {% block title %}{{ title }}{% endblock %} 12 | {% block content_title %}

    {{ title }}

    {% endblock %} 13 | 14 | {% block content %} 15 | 16 |

    {% trans "Your password has been set. You may go ahead and log in now." %}

    17 | 18 |

    {% trans 'Log in' %}

    19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /templates/registration/password_reset_confirm.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n static %} 3 | 4 | {% block extrastyle %}{{ block.super }}{% endblock %} 5 | {% block breadcrumbs %} 6 | 10 | {% endblock %} 11 | 12 | {% block title %}{{ title }}{% endblock %} 13 | {% block content_title %}

    {{ title }}

    {% endblock %} 14 | {% block content %} 15 | 16 | {% if validlink %} 17 | 18 |

    {% trans "Please enter your new password twice so we can verify you typed it in correctly." %}

    19 | 20 |
    {% csrf_token %} 21 |
    22 |
    23 | {{ form.new_password1.errors }} 24 | 25 | {{ form.new_password1 }} 26 |
    27 |
    28 | {{ form.new_password2.errors }} 29 | 30 | {{ form.new_password2 }} 31 |
    32 | 33 |
    34 |
    35 | 36 | {% else %} 37 | 38 |

    {% trans "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}

    39 | 40 | {% endif %} 41 | 42 | {% endblock %} 43 | -------------------------------------------------------------------------------- /templates/registration/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | {% block breadcrumbs %} 5 | 9 | {% endblock %} 10 | 11 | {% block title %}{{ title }}{% endblock %} 12 | {% block content_title %}

    {{ title }}

    {% endblock %} 13 | {% block content %} 14 | 15 |

    {% trans "We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly." %}

    16 | 17 |

    {% trans "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder." %}

    18 | 19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /templates/registration/password_reset_email.html: -------------------------------------------------------------------------------- 1 | {% load i18n %}{% autoescape off %} 2 | {% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %} 3 | 4 | {% trans "Please go to the following page and choose a new password:" %} 5 | {% block reset_link %} 6 | {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} 7 | {% endblock %} 8 | {% trans "Your username, in case you've forgotten:" %} {{ user.get_username }} 9 | 10 | {% trans "Thanks for using our site!" %} 11 | 12 | {% blocktrans %}The {{ site_name }} team{% endblocktrans %} 13 | 14 | {% endautoescape %} 15 | -------------------------------------------------------------------------------- /templates/registration/password_reset_form.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n static %} 3 | 4 | {% block extrastyle %}{{ block.super }}{% endblock %} 5 | {% block breadcrumbs %} 6 | 10 | {% endblock %} 11 | 12 | {% block title %}{{ title }}{% endblock %} 13 | {% block content_title %}

    {{ title }}

    {% endblock %} 14 | {% block content %} 15 | 16 |

    {% trans "Forgotten your password? Enter your email address below, and we'll email instructions for setting a new one." %}

    17 | 18 |
    {% csrf_token %} 19 |
    20 |
    21 | {{ form.email.errors }} 22 | 23 | {{ form.email }} 24 |
    25 | 26 |
    27 |
    28 | 29 | {% endblock %} 30 | -------------------------------------------------------------------------------- /templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/templatetags/__init__.py -------------------------------------------------------------------------------- /tools/SettingShell.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: SettingShell.py 9 | 10 | # @Software: PyCharm 11 | from tools.util.CreateRequirements import create_requirements 12 | 13 | # create_requirements() 14 | -------------------------------------------------------------------------------- /tools/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/tools/__init__.py -------------------------------------------------------------------------------- /tools/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | from tools.models import DBConfig, SQLHistory, ScriptInfo, ScriptRunHistory 5 | 6 | # 7 | # @admin.register(DBConfig) 8 | # class DBConfigAdmin(admin.ModelAdmin): 9 | # list_display = ('id', 'name', 'db_type', 'host', 'port') 10 | # list_per_page = 20 11 | # list_display_links = ('name', ) 12 | # # 筛选器 13 | # # list_filter = ('type', "status") # 过滤器 14 | # search_fields = ('name', ) # 搜索字段 15 | # # date_hierarchy = 'update_time' # 详细时间分层筛选  16 | # 17 | # 18 | # @admin.register(SQLHistory) 19 | # class SQLHistoryAdmin(admin.ModelAdmin): 20 | # list_display = ('id', 'server', 'db', 'table', 'SQL_type', 'history') 21 | # list_per_page = 20 22 | # list_display_links = ('server', ) 23 | # # 筛选器 24 | # # list_filter = ('type', "status") # 过滤器 25 | # search_fields = ('server', ) # 搜索字段 26 | # # date_hierarchy = 'update_time' # 详细时间分层筛选  27 | # 28 | # 29 | # @admin.register(ScriptInfo) 30 | # class ScriptInfoAdmin(admin.ModelAdmin): 31 | # list_display = ('id', 'name', 'type', 'script_path', 'desc', 'user') 32 | # list_per_page = 20 33 | # list_display_links = ('name', ) 34 | # # 筛选器 35 | # # list_filter = ('type', "status") # 过滤器 36 | # search_fields = ('name', 'type', 'user') # 搜索字段 37 | # # date_hierarchy = 'update_time' # 详细时间分层筛选  38 | # 39 | # 40 | # @admin.register(ScriptRunHistory) 41 | # class ScriptRunHistoryAdmin(admin.ModelAdmin): 42 | # list_display = ('id', 'script', 'user') 43 | # list_per_page = 20 44 | # list_display_links = ('script', ) 45 | # # 筛选器 46 | # # list_filter = ('type', "status") # 过滤器 47 | # search_fields = ('script', ) # 搜索字段 48 | # # date_hierarchy = 'update_time' # 详细时间分层筛选  49 | -------------------------------------------------------------------------------- /tools/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from django.utils.module_loading import autodiscover_modules 3 | 4 | 5 | class ToolsConfig(AppConfig): 6 | name = 'tools' 7 | verbose_name = '测试工具管理' 8 | 9 | def ready(self): 10 | autodiscover_modules('SettingShell.py') 11 | -------------------------------------------------------------------------------- /tools/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githublitao/api_automation_test/235e0e96da55c5525b2377899ad3d69d82b7c8dd/tools/migrations/__init__.py -------------------------------------------------------------------------------- /tools/tasks.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: tasks.py.py 9 | 10 | # @Software: PyCharm 11 | import datetime 12 | import os 13 | import subprocess 14 | 15 | from celery import shared_task 16 | from django.core.exceptions import ObjectDoesNotExist 17 | 18 | from Config.case_config import script_absolute, script_url 19 | from RootDirectory import PROJECT_PATH 20 | from tools.models import SQLHistory, ScriptInfo 21 | 22 | 23 | from tools.util.CreateRequirements import create_requirements 24 | 25 | 26 | @shared_task 27 | def delete_sql_history(): 28 | # 当前日期格式 29 | cur_date = datetime.datetime.now().date() 30 | # 前期 31 | week = cur_date - datetime.timedelta(weeks=1) 32 | SQLHistory.objects.exclude(create_time__gte=week).delete() 33 | 34 | 35 | @shared_task 36 | def install_library(data, log_path): 37 | subprocess.getstatusoutput(data) 38 | create_requirements() 39 | with open(log_path, "a+") as f: 40 | f.write("Finish") 41 | 42 | 43 | @shared_task 44 | def run_script(data, log_path): 45 | subprocess.getstatusoutput(data) 46 | with open(log_path, "a+") as f: 47 | f.write("Finish") 48 | 49 | 50 | @shared_task 51 | def delete_library_history(): 52 | """ 53 | 删除依赖库安装日志 54 | :return: 55 | """ 56 | path = PROJECT_PATH + '/static/ShareScript/LibraryLog/' 57 | log_path = os.listdir(path) 58 | if len(log_path) > 51: 59 | for i in log_path: 60 | if i == '.gitignore': 61 | continue 62 | os.remove(path+i) 63 | 64 | 65 | @shared_task 66 | def delete_script_other(): 67 | """ 68 | 删除不需要的脚本 69 | :return: 70 | """ 71 | path = script_absolute 72 | script_data = os.listdir(path) 73 | for script in script_data: 74 | if script == '.gitignore': 75 | continue 76 | else: 77 | value = '{}/{}'.format(script_url, script) 78 | try: 79 | ScriptInfo.objects.get(script_path=value) 80 | except ObjectDoesNotExist: 81 | os.remove(path+"/"+script) 82 | -------------------------------------------------------------------------------- /tools/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /tools/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: urls.py 9 | 10 | # @Software: PyCharm 11 | from django.conf.urls import url 12 | 13 | from tools.views import DBManager, SQLManager, VenvLibraryManager, Script, ScriptRunHistory, AllUser, TestLinkLoading, \ 14 | IDCard 15 | 16 | urlpatterns = [ 17 | url(r'db/DB', DBManager.DBConfigManager.as_view()), 18 | url(r'db/connectTest', DBManager.TestDBConnect.as_view()), 19 | url(r'db/sqlHistory', SQLManager.SqlHistoryManager.as_view()), 20 | url(r'script/Library', VenvLibraryManager.VenvLibraryManager.as_view()), 21 | url(r'script/InstallLibraryLog', VenvLibraryManager.InstallLibraryLog.as_view()), 22 | url(r'script/Script', Script.ScriptManager.as_view()), 23 | url(r'script/upload', Script.ScriptPost.as_view()), 24 | url(r'Download', Script.download_doc), 25 | url(r'script/run', Script.RunScript.as_view()), 26 | url(r'script/history', ScriptRunHistory.ScriptHistoryManager.as_view()), 27 | url(r'script/allUser', AllUser.AllUserManager.as_view()), 28 | url(r'testLink/project', TestLinkLoading.TestLinkManager.as_view()), 29 | url(r'testLink/template', TestLinkLoading.TemplateManager.as_view()), 30 | url(r'IDCard', IDCard.IDCardManager.as_view()), 31 | ] 32 | -------------------------------------------------------------------------------- /tools/util/Runner.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: Runner.py 9 | 10 | # @Software: PyCharm 11 | import subprocess 12 | import sys 13 | 14 | EXEC = sys.executable 15 | 16 | if 'uwsgi' in EXEC: 17 | EXEC = "/usr/local/python3/bin/python3" 18 | 19 | 20 | def decode(s): 21 | try: 22 | return s.decode('utf-8') 23 | 24 | except UnicodeDecodeError: 25 | return s.decode('gbk') 26 | 27 | 28 | def run_code(file_path): 29 | try: 30 | resp = decode(subprocess.check_output([EXEC, file_path], stderr=subprocess.STDOUT, timeout=60)) 31 | 32 | except subprocess.CalledProcessError as e: 33 | resp = decode(e.output) 34 | 35 | except subprocess.TimeoutExpired: 36 | resp = 'RunnerTimeOut' 37 | return resp 38 | 39 | 40 | if __name__ == "__main__": 41 | print(sys.argv[1]) 42 | print(run_code(sys.argv[1])) 43 | 44 | -------------------------------------------------------------------------------- /tools/util/XlsManage.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: XlsManage.py 9 | 10 | # @Software: PyCharm 11 | import sys 12 | 13 | import xlrd 14 | 15 | 16 | class ReadExcel: 17 | def __init__(self, file_path): 18 | self.workbook = xlrd.open_workbook(file_path) 19 | self.data = self.workbook.sheet_by_index(0) 20 | self.nrows = "" 21 | self.ncols = "" 22 | 23 | def __enter__(self): 24 | self.nrows = self.data.nrows 25 | self.ncols = self.data.ncols 26 | if self.nrows < 2 or self.ncols < 8: 27 | return False 28 | elif not self.check_format(self.data.row_values(0)): 29 | return False 30 | else: 31 | return self 32 | 33 | @staticmethod 34 | def check_format(value): 35 | expect = ['目录', '用例名称', '摘要', '关键字', '用例级别', '预置条件', '操作步骤', '预期结果'] 36 | for i in range(0, 7): 37 | if value[i] != expect[i]: 38 | return False 39 | return True 40 | 41 | def nrow_value(self): 42 | _list = list() 43 | for n in range(1, int(self.nrows)): 44 | print() 45 | _dict = { 46 | "testsuiteid": self.data.cell_value(n, 0), 47 | "testcasename": self.data.cell_value(n, 1), 48 | "summary": self.data.cell_value(n, 2), 49 | "keyword": self.data.cell_value(n, 3), 50 | "level": self.data.cell_value(n, 4) if self.data.cell_value(n, 4) in ["低", "中", "高"] else "中", 51 | "preconditions": self.data.cell_value(n, 5), 52 | "step": self.data.cell_value(n, 6), 53 | "except": self.data.cell_value(n, 7), 54 | } 55 | _list.append(_dict) 56 | return _list 57 | 58 | def __exit__(self, exc_type, exc_val, exc_tb): 59 | pass 60 | 61 | 62 | if __name__ == "__main__": 63 | with ReadExcel(r"123.xlsx") as b: 64 | if isinstance(b, bool): 65 | print(False) 66 | else: 67 | print(b.nrow_value()) 68 | 69 | -------------------------------------------------------------------------------- /tools/util/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: __init__.py.py 9 | 10 | # @Software: PyCharm 11 | -------------------------------------------------------------------------------- /tools/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /tools/views/AllUser.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: AllUser.py 9 | 10 | # @Software: PyCharm 11 | from django.contrib.auth.models import User 12 | from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage 13 | from rest_framework import permissions 14 | from rest_framework.views import APIView 15 | 16 | from api_test.utils import response 17 | from api_test.utils.api_response import JsonResponse 18 | from api_test.utils.auth import ExpiringTokenAuthentication 19 | from tools.serializers import UserSerializer 20 | 21 | 22 | class AllUserManager(APIView): 23 | authentication_classes = (ExpiringTokenAuthentication,) 24 | permission_classes = (permissions.IsAuthenticated, ) 25 | 26 | @staticmethod 27 | def get(request): 28 | """ 29 | 搜索用户 30 | """ 31 | try: 32 | page_size = int(request.GET.get("page_size", 11)) 33 | page = int(request.GET.get("page", 1)) 34 | except (TypeError, ValueError, KeyError): 35 | return JsonResponse(code_msg=response.PAGE_OR_SIZE_NOT_INT) 36 | name = request.GET.get("name") 37 | obi = User.objects.filter(first_name__contains=name).order_by("-id") 38 | paginator = Paginator(obi, page_size) # paginator对象 39 | total = paginator.num_pages # 总页数 40 | try: 41 | obm = paginator.page(page) 42 | except PageNotAnInteger: 43 | obm = paginator.page(1) 44 | except EmptyPage: 45 | obm = paginator.page(paginator.num_pages) 46 | serialize = UserSerializer(obm, many=True).data 47 | return JsonResponse(data={"data": serialize, 48 | "page": page, 49 | "total": total 50 | }, code_msg=response.SUCCESS) 51 | -------------------------------------------------------------------------------- /tools/views/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | # @Author  : litao 5 | 6 | # @Project : api_automation_test 7 | 8 | # @FileName: __init__.py.py 9 | 10 | # @Software: PyCharm --------------------------------------------------------------------------------