├── .gitattributes ├── .gitignore ├── AutoArchiver └── NGA_AutoSave_V3_AutoArchiver │ ├── NGA_AutoSave_V3_AutoArchiver.sln │ └── NGA_AutoSave_V3_AutoArchiver │ ├── AAA_NGA_AutoSave_V3_AutoArchiver.py │ ├── NGA_AutoSave_V3_AutoArchiver.pyproj │ ├── db_managers │ ├── __init__.py │ ├── monitoring_posts_db_manager.py │ └── post_stats_db_manager.py │ ├── download_post.py │ ├── download_posts_thread_controller.py │ ├── expire_post_operate.py │ ├── get_posts_in_boards.py │ ├── requirements.txt │ ├── test.py │ └── utils │ ├── __init__.py │ ├── cookie_format.py │ ├── m_paths.py │ ├── m_requests.py │ ├── nga_html_to_md.py │ ├── post_stats_operator.py │ ├── print_if.py │ └── setting_manager.py ├── DistributeServer └── NGA_AutoSave_V3_DistributeServer │ ├── NGA_AutoSave_V3_DistributeServer.sln │ └── NGA_AutoSave_V3_DistributeServer │ ├── NGA_AutoSave_V3_DistributeServer.pyproj │ ├── NGA_AutoSave_V3_DistributeServer.pyproj.user │ ├── NGA_AutoSave_V3_DistributeServer │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── app │ ├── __init__.py │ ├── forms.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── static │ │ └── app │ │ │ ├── content │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.min.css │ │ │ └── site.css │ │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ │ └── scripts │ │ │ ├── _references.js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ ├── jquery-1.10.2.intellisense.js │ │ │ ├── jquery-1.10.2.js │ │ │ ├── jquery-1.10.2.min.js │ │ │ ├── jquery-1.10.2.min.map │ │ │ ├── jquery.validate-vsdoc.js │ │ │ ├── jquery.validate.js │ │ │ ├── jquery.validate.min.js │ │ │ ├── jquery.validate.unobtrusive.js │ │ │ ├── jquery.validate.unobtrusive.min.js │ │ │ ├── modernizr-2.6.2.js │ │ │ ├── respond.js │ │ │ └── respond.min.js │ ├── templates │ │ └── app │ │ │ ├── about.html │ │ │ ├── contact.html │ │ │ ├── index.html │ │ │ ├── layout.html │ │ │ ├── login.html │ │ │ └── loginpartial.html │ ├── tests.py │ └── views.py │ ├── env1 │ ├── Scripts │ │ ├── Activate.ps1 │ │ ├── activate │ │ ├── activate.bat │ │ ├── deactivate.bat │ │ ├── django-admin.exe │ │ ├── pip.exe │ │ ├── pip3.10.exe │ │ ├── pip3.11.exe │ │ ├── pip3.exe │ │ ├── python.exe │ │ ├── pythonw.exe │ │ └── sqlformat.exe │ └── pyvenv.cfg │ ├── mainApp │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── templates │ │ ├── allPosts.html │ │ ├── getPostRecord.html │ │ ├── mainApp │ │ │ └── index.html │ │ └── postStats.html │ ├── tests.py │ ├── urls.py │ └── views.py │ ├── manage.py │ ├── misc │ ├── __init__.py │ └── utils │ │ ├── __init__.py │ │ ├── cookie_format.py │ │ ├── m_paths.py │ │ ├── m_requests.py │ │ ├── nga_html_to_md.py │ │ ├── print_if.py │ │ └── setting_manager.py │ ├── obj │ └── Any CPU │ │ └── Debug │ │ ├── NGA_AutoSave_V3_DistributeServer.pyproj.CoreCompileInputs.cache │ │ ├── NGA_AutoSave_V3_DistributeServer.pyproj.FileListAbsolute.txt │ │ └── NGA_AutoSave_V3_DistributeServer.pyproj.SuggestedBindingRedirects.cache │ ├── readme.html │ ├── requirements.txt │ ├── savedFileServe │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── templates │ │ └── savedFileServe │ │ │ └── index.html │ ├── tests.py │ ├── urls.py │ └── views.py │ └── static │ ├── admin │ ├── css │ │ ├── autocomplete.css │ │ ├── base.css │ │ ├── changelists.css │ │ ├── dark_mode.css │ │ ├── dashboard.css │ │ ├── forms.css │ │ ├── login.css │ │ ├── nav_sidebar.css │ │ ├── responsive.css │ │ ├── responsive_rtl.css │ │ ├── rtl.css │ │ ├── vendor │ │ │ └── select2 │ │ │ │ ├── LICENSE-SELECT2.md │ │ │ │ ├── select2.css │ │ │ │ └── select2.min.css │ │ └── widgets.css │ ├── img │ │ ├── LICENSE │ │ ├── README.txt │ │ ├── calendar-icons.svg │ │ ├── gis │ │ │ ├── move_vertex_off.svg │ │ │ └── move_vertex_on.svg │ │ ├── icon-addlink.svg │ │ ├── icon-alert.svg │ │ ├── icon-calendar.svg │ │ ├── icon-changelink.svg │ │ ├── icon-clock.svg │ │ ├── icon-deletelink.svg │ │ ├── icon-hidelink.svg │ │ ├── icon-no.svg │ │ ├── icon-unknown-alt.svg │ │ ├── icon-unknown.svg │ │ ├── icon-viewlink.svg │ │ ├── icon-yes.svg │ │ ├── inline-delete.svg │ │ ├── search.svg │ │ ├── selector-icons.svg │ │ ├── sorting-icons.svg │ │ ├── tooltag-add.svg │ │ └── tooltag-arrowright.svg │ └── js │ │ ├── SelectBox.js │ │ ├── SelectFilter2.js │ │ ├── actions.js │ │ ├── admin │ │ ├── DateTimeShortcuts.js │ │ └── RelatedObjectLookups.js │ │ ├── autocomplete.js │ │ ├── calendar.js │ │ ├── cancel.js │ │ ├── change_form.js │ │ ├── collapse.js │ │ ├── core.js │ │ ├── filters.js │ │ ├── inlines.js │ │ ├── jquery.init.js │ │ ├── nav_sidebar.js │ │ ├── popup_response.js │ │ ├── prepopulate.js │ │ ├── prepopulate_init.js │ │ ├── theme.js │ │ ├── urlify.js │ │ └── vendor │ │ ├── jquery │ │ ├── LICENSE.txt │ │ ├── jquery.js │ │ └── jquery.min.js │ │ ├── select2 │ │ ├── LICENSE.md │ │ ├── i18n │ │ │ ├── af.js │ │ │ ├── ar.js │ │ │ ├── az.js │ │ │ ├── bg.js │ │ │ ├── bn.js │ │ │ ├── bs.js │ │ │ ├── ca.js │ │ │ ├── cs.js │ │ │ ├── da.js │ │ │ ├── de.js │ │ │ ├── dsb.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 │ │ │ ├── hsb.js │ │ │ ├── hu.js │ │ │ ├── hy.js │ │ │ ├── id.js │ │ │ ├── is.js │ │ │ ├── it.js │ │ │ ├── ja.js │ │ │ ├── ka.js │ │ │ ├── km.js │ │ │ ├── ko.js │ │ │ ├── lt.js │ │ │ ├── lv.js │ │ │ ├── mk.js │ │ │ ├── ms.js │ │ │ ├── nb.js │ │ │ ├── ne.js │ │ │ ├── nl.js │ │ │ ├── pl.js │ │ │ ├── ps.js │ │ │ ├── pt-BR.js │ │ │ ├── pt.js │ │ │ ├── ro.js │ │ │ ├── ru.js │ │ │ ├── sk.js │ │ │ ├── sl.js │ │ │ ├── sq.js │ │ │ ├── sr-Cyrl.js │ │ │ ├── sr.js │ │ │ ├── sv.js │ │ │ ├── th.js │ │ │ ├── tk.js │ │ │ ├── tr.js │ │ │ ├── uk.js │ │ │ ├── vi.js │ │ │ ├── zh-CN.js │ │ │ └── zh-TW.js │ │ ├── select2.full.js │ │ └── select2.full.min.js │ │ └── xregexp │ │ ├── LICENSE.txt │ │ ├── xregexp.js │ │ └── xregexp.min.js │ └── app │ ├── content │ ├── bootstrap.css │ ├── bootstrap.min.css │ └── site.css │ ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff │ └── scripts │ ├── _references.js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── jquery-1.10.2.intellisense.js │ ├── jquery-1.10.2.js │ ├── jquery-1.10.2.min.js │ ├── jquery-1.10.2.min.map │ ├── jquery.validate-vsdoc.js │ ├── jquery.validate.js │ ├── jquery.validate.min.js │ ├── jquery.validate.unobtrusive.js │ ├── jquery.validate.unobtrusive.min.js │ ├── modernizr-2.6.2.js │ ├── respond.js │ └── respond.min.js ├── LICENSE ├── README.md ├── Settings └── settingsTemplate.json ├── UpdateLog.md ├── nga_autosave_db.sql ├── pageSavedAdd ├── AAA_readme.md └── del_space.py ├── 启动查询服务器.cmd └── 启动自动下载器.cmd /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 105 | __pypackages__/ 106 | 107 | # Celery stuff 108 | celerybeat-schedule 109 | celerybeat.pid 110 | 111 | # SageMath parsed files 112 | *.sage.py 113 | 114 | # Environments 115 | .env 116 | .venv 117 | env/ 118 | venv/ 119 | ENV/ 120 | env.bak/ 121 | venv.bak/ 122 | 123 | # Spyder project settings 124 | .spyderproject 125 | .spyproject 126 | 127 | # Rope project settings 128 | .ropeproject 129 | 130 | # mkdocs documentation 131 | /site 132 | 133 | # mypy 134 | .mypy_cache/ 135 | .dmypy.json 136 | dmypy.json 137 | 138 | # Pyre type checker 139 | .pyre/ 140 | 141 | # pytype static type analyzer 142 | .pytype/ 143 | 144 | # Cython debug symbols 145 | cython_debug/ 146 | 147 | # PyCharm 148 | # JetBrains specific template is maintainted in a separate JetBrains.gitignore that can 149 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 150 | # and can be added to the global gitignore or merged into this file. For a more nuclear 151 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 152 | #.idea/ 153 | 154 | # custom ignore 155 | .vs 156 | cookie.json 157 | pageSaved/ 158 | settings.json 159 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.8.34330.188 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "NGA_AutoSave_V3_AutoArchiver", "NGA_AutoSave_V3_AutoArchiver\NGA_AutoSave_V3_AutoArchiver.pyproj", "{87D481B0-8675-4DAC-BC49-5CD971BDDB75}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {87D481B0-8675-4DAC-BC49-5CD971BDDB75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {87D481B0-8675-4DAC-BC49-5CD971BDDB75}.Release|Any CPU.ActiveCfg = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | GlobalSection(ExtensibilityGlobals) = postSolution 21 | SolutionGuid = {0BE4D0D7-FF52-4C97-BE70-11D44EBAA6F1} 22 | EndGlobalSection 23 | EndGlobal 24 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/AAA_NGA_AutoSave_V3_AutoArchiver.py: -------------------------------------------------------------------------------- 1 | """ 2 | 主程序 3 | """ 4 | from download_posts_thread_controller import download_posts_thread_controller 5 | from utils import setting_manager 6 | import threading 7 | import time 8 | from datetime import datetime 9 | from utils.print_if import print_if,print_passed_time 10 | from utils.post_stats_operator import static,cycle_static 11 | 12 | download_should_stop = threading.Event() 13 | is_downloading=False 14 | deadlock_timeout=setting_manager.get("downloadThreadDeadlockTimeout",30) 15 | 16 | def run_download_posts_thread(): 17 | '''循环执行download_posts_thread_controller,并在每次执行后等待指定的时间间隔''' 18 | global is_downloading 19 | while not download_should_stop.is_set(): 20 | is_downloading=True 21 | download_posts_thread_controller() 22 | interval_arr=setting_manager.get("downloadLoopinterval",60) 23 | interval=interval_arr[datetime.now().hour] 24 | print_if(f"下次抓取间隔:{interval}s\n\n\n\n\n",5) 25 | is_downloading=False 26 | time.sleep(interval) 27 | 28 | def run_monitor_thread(): 29 | '''监控线程,检查并可能重启 download_posts_''' 30 | global is_downloading 31 | while True: 32 | time.sleep(5) # 每5秒检查一次 33 | # 不在下载中时不检测卡死 34 | if not is_downloading: 35 | continue 36 | 37 | current_pass_time = print_passed_time() 38 | print_if(f"====================current_pass_time: {current_pass_time}",0,False) 39 | if current_pass_time > deadlock_timeout: 40 | print_if("下载线程卡死,准备重启",2,False) 41 | download_should_stop.set() 42 | time.sleep(1) # 假设线程在1秒内会响应停止信号 43 | 44 | # 清除停止标志并启动新线程(或重用旧线程对象) 45 | download_should_stop.clear() 46 | download_thread = threading.Thread(target=run_download_posts_thread) 47 | download_thread.daemon = True # 根据需要设置 48 | download_thread.start() 49 | 50 | 51 | # 工程入口 52 | def main(): 53 | '''创建下载帖子的线程''' 54 | # 启动下载线程 55 | download_thread = threading.Thread(target=run_download_posts_thread) # 假设间隔是5秒 56 | download_thread.daemon = True # 设置为守护线程,主线程退出时它也会退出 57 | download_thread.start() 58 | #download_thread.join() 59 | 60 | # 启动监控线程 61 | monitor_thread = threading.Thread(target=run_monitor_thread) 62 | monitor_thread.start() 63 | #monitor_thread.join() 64 | 65 | # 启动统计线程 66 | cycle_static_thread = threading.Thread(target=cycle_static) 67 | cycle_static_thread.start() 68 | cycle_static_thread.join() 69 | 70 | # 运行主函数 71 | if __name__ == "__main__": 72 | main() 73 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver.pyproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Debug 4 | 2.0 5 | 87d481b0-8675-4dac-bc49-5cd971bddb75 6 | . 7 | AAA_NGA_AutoSave_V3_AutoArchiver.py 8 | 9 | 10 | . 11 | . 12 | NGA_AutoSave_V3_AutoArchiver 13 | NGA_AutoSave_V3_AutoArchiver 14 | Pytest 15 | MSBuild|env|$(MSBuildProjectFullPath) 16 | 17 | 18 | true 19 | false 20 | 21 | 22 | true 23 | false 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | env 54 | 3.10 55 | env (Python 3.10 (64-bit)) 56 | Scripts\python.exe 57 | Scripts\pythonw.exe 58 | PYTHONPATH 59 | X64 60 | 61 | 62 | 63 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/db_managers/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/download_posts_thread_controller.py: -------------------------------------------------------------------------------- 1 | """ 2 | 多线程下载控制器 3 | """ 4 | 5 | import concurrent.futures 6 | from get_posts_in_boards import get_posts_in_boards 7 | import download_post 8 | from utils import setting_manager 9 | from db_managers.monitoring_posts_db_manager import MonitoringPost 10 | from db_managers import monitoring_posts_db_manager 11 | from utils.print_if import print_if 12 | from datetime import datetime 13 | import time 14 | from expire_post_operate import expire_post_operate 15 | 16 | ngaBaseUrl=setting_manager.get("ngaBaseUrl") 17 | tidBaseUrl=setting_manager.get("tidBaseUrl") 18 | def download_task(post:MonitoringPost): 19 | url = f"{ngaBaseUrl}/{tidBaseUrl}{post.tid}" 20 | try: 21 | print_if(f"==========开始下载: {url}==========\n") 22 | download_post_operator=download_post.DownloadPostOperator(post) 23 | operated=download_post_operator.download() 24 | print_if(f"==========下载完成: {url}==========\n") 25 | return operated 26 | except Exception as e: 27 | print_if(f"下载失败: {url}, 原因: {e}\n",2) 28 | post.validState=2 29 | monitoring_posts_db_manager.update_or_add_post(post) 30 | 31 | 32 | def download_posts_thread_controller(): 33 | """ 34 | 多线程下载控制器 35 | """ 36 | print_if("开始多线程下载帖子",5) 37 | start_timestamp=time.time() 38 | # 获取目标帖子 39 | target_posts = get_posts_in_boards() 40 | 41 | # 设置线程池的最大线程数 42 | with concurrent.futures.ThreadPoolExecutor(max_workers=setting_manager.get("downloadThreadCnt")) as executor: 43 | # 提交所有任务到线程池 44 | future_to_post = {executor.submit(download_task, post): post for post in target_posts} 45 | 46 | # 遍历futures,获取结果或异常 47 | for future in concurrent.futures.as_completed(future_to_post): 48 | post = future_to_post[future] 49 | try: 50 | # 获取任务结果 51 | result = future.result() # 这里添加了获取结果的代码 52 | # 假设result是MonitoringPost类型的实例,调用toString方法并打印 53 | if isinstance(result, MonitoringPost): 54 | pass 55 | # print_if(result.toString()) # 这里貌似没法用,因为MonitoringPost.toString()在之前已经被从线程池里删了 56 | # print_if(f"下载成功{result.tid}") 57 | print_if(f"下载成功") 58 | else: 59 | pass 60 | print_if(f"下载帖子返回了非预期的结果\n",2) 61 | except Exception as exc: 62 | print_if(f'生成帖子时出错: {exc}\n',2) 63 | ##### 这里要添加处理validState 64 | 65 | 66 | end_timestamp=time.time() 67 | print_if(f"帖子遍历完成,时间{datetime.now()},用时{end_timestamp-start_timestamp}s\n",3) 68 | 69 | # 超时帖子处理 70 | expire_post_operate() 71 | 72 | # 运行主控制器函数 73 | 74 | #download_posts_thread_controller() -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/expire_post_operate.py: -------------------------------------------------------------------------------- 1 | """ 2 | 超时帖子处理,包括记为"确认超时"前的最后一次访问,和确认超时后的记录文件的删除 3 | """ 4 | 5 | from db_managers import monitoring_posts_db_manager 6 | from utils.print_if import print_if 7 | from utils import setting_manager 8 | from datetime import datetime 9 | from shutil import rmtree 10 | 11 | saveFileExpire:dict[str:int] = setting_manager.get("saveFileExpire") 12 | current_time = datetime.now() 13 | fid_file_expire_default:int=saveFileExpire["default"] 14 | saveFileBaseFolder:str=setting_manager.get("saveFileBaseFolderAtArchiver")# 基础存档文件夹 15 | needDelPostExpireInDb:bool=setting_manager.get("needDelPostExpireInDb")# 基础存档文件夹 16 | 17 | def expire_post_operate(): 18 | '''遍历删除已过期帖子''' 19 | print_if("开始遍历删除已过期帖子",5) 20 | posts = monitoring_posts_db_manager.query_all_posts() 21 | for post in posts: 22 | 23 | # 帖子保存文件的超时时间 24 | fid_file_expire:int=saveFileExpire[post.fidOrStid] if post.fidOrStid in saveFileExpire else fid_file_expire_default 25 | 26 | # 设计版面为为不删除时,不进行后续处理 27 | if fid_file_expire==-1: 28 | continue 29 | # 超过保存期限 30 | if (current_time - post.finalReplayTime).total_seconds()>fid_file_expire : 31 | # 如果帖子仍然正常监控中或已过期不再监控但是仍然暂存文件时,设置为即将删除(validState=4) 32 | # 设为validState=4的帖子在download_post里会再次尝试一次下载,如果仍然超过时,会设为validState=5以确认删除 33 | if post.validState==1 or post.validState==3: 34 | post.validState=4 35 | monitoring_posts_db_manager.update_or_add_post(post) 36 | print_if(f"过期帖子删除前最后重访tid={post.tid}",1) 37 | # validState=5以确认删除 38 | if post.validState==5: 39 | 40 | savedFilePath=post.savedFilePath 41 | folder_name=f"{saveFileBaseFolder}/{savedFilePath}" 42 | try: 43 | rmtree(folder_name) 44 | except Exception as e: 45 | print_if(f"无法删除{folder_name},{e}") 46 | if needDelPostExpireInDb: 47 | try: 48 | monitoring_posts_db_manager.delete_post(post.tid) 49 | except Exception as e: 50 | print_if(f"无法删除数据库记录:tid={post.tid},{e}") 51 | print_if(f"已经删除tid={post.tid}的保存文件和数据库记录",1) 52 | else: 53 | print_if(f"已经删除tid={post.tid}的保存文件",1) 54 | post.validState=6 55 | monitoring_posts_db_manager.update_or_add_post(post) 56 | 57 | 58 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/requirements.txt: -------------------------------------------------------------------------------- 1 | asttokens==2.4.1 2 | beautifulsoup4==4.12.3 3 | bs4==0.0.2 4 | certifi==2024.2.2 5 | charset-normalizer==3.3.2 6 | colorama==0.4.6 7 | comm==0.2.2 8 | DateTime==5.5 9 | debugpy==1.8.1 10 | decorator==5.1.1 11 | exceptiongroup==1.2.0 12 | executing==2.0.1 13 | greenlet==3.0.3 14 | idna==3.7 15 | ipykernel==6.29.4 16 | ipython==8.23.0 17 | jedi==0.19.1 18 | jupyter_client==8.6.1 19 | jupyter_core==5.7.2 20 | matplotlib-inline==0.1.7 21 | nest-asyncio==1.6.0 22 | packaging==24.0 23 | parso==0.8.4 24 | pip==23.3 25 | platformdirs==4.2.0 26 | prompt-toolkit==3.0.43 27 | psutil==5.9.8 28 | pure-eval==0.2.2 29 | Pygments==2.17.2 30 | PyMySQL==1.1.1 31 | python-dateutil==2.9.0.post0 32 | pytz==2024.1 33 | pywin32==306 34 | pyzmq==26.0.0 35 | requests==2.32.2 36 | setuptools==65.5.1 37 | six==1.16.0 38 | soupsieve==2.5 39 | SQLAlchemy==2.0.29 40 | stack-data==0.6.3 41 | termcolor==2.4.0 42 | tk==0.1.0 43 | tornado==6.4.1 44 | traitlets==5.14.2 45 | typing_extensions==4.11.0 46 | typing==3.7.4.3 47 | urllib3==2.2.1 48 | wcwidth==0.2.13 49 | zope.interface==6.2 50 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/test.py: -------------------------------------------------------------------------------- 1 | from db_managers import monitoring_posts_db_manager 2 | 3 | aaa=monitoring_posts_db_manager.query_all_posts() 4 | 5 | print(aaa) 6 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/utils/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/utils/cookie_format.py: -------------------------------------------------------------------------------- 1 | ''' 2 | cookie管理器 3 | 主要调用get_cookies() 4 | ''' 5 | 6 | import json 7 | import os 8 | import tkinter as tk 9 | from tkinter import simpledialog 10 | from utils import m_paths 11 | from utils.print_if import print_if 12 | 13 | 14 | cookie_json_path=m_paths.cookie_json_path 15 | saved_cookies={} 16 | 17 | def split_cookie_and_save(cookieStr): 18 | global saved_cookies 19 | cookie_dict = {} 20 | for line in cookieStr.splitlines(): 21 | if line.strip(): # 检查这一行是否为空 22 | lineSplit=line.split('\t') 23 | key, value = lineSplit[0].strip(), lineSplit[1].strip() # 使用制表符(tab)作为分隔符,并取出第一、二个元素作为key和value,同时去除空格 24 | if('nga' in lineSplit[2] or '178' in lineSplit[2]): 25 | cookie_dict[key] = value 26 | 27 | #settings = cookieDict 28 | saved_cookies=cookie_dict 29 | 30 | with open(cookie_json_path, 'w', encoding='utf-8') as f: 31 | json.dump(cookie_dict, f) 32 | print_if(f'Cookie已成功保存!\n{cookie_dict}',3) 33 | return cookie_dict # 成功保存后返回cookie_dict 34 | 35 | def user_input_cookie(): 36 | 37 | cookie_str = simpledialog.askstring("Cookie Input", "请输入你的cookie:") 38 | print_if(cookie_str) 39 | if len(cookie_str) > 100: 40 | cookie_dict= split_cookie_and_save(cookie_str) # 如果cookieStr长度大于10,则调用SplitCookieAndSave方法并返回其结果 41 | print_if(f'cookie_dict\n{cookie_dict}') 42 | return cookie_dict 43 | else: 44 | print_if("Cookie字符串太短,请重新输入!",2) # 如果cookieStr长度小于等于10,则输出提示信息并返回None表示调用失败 45 | return user_input_cookie() # 递归再次调用 46 | 47 | 48 | def get_cookies(): 49 | '''获取Cookie''' 50 | 51 | #如果存在savedCookies,则直接返回 52 | global saved_cookies 53 | if len(saved_cookies)>100: 54 | return saved_cookies 55 | 56 | #否则, 读取文件 57 | 58 | need_reinput=False 59 | # 检查文件是否存在 60 | if os.path.exists(cookie_json_path) and os.path.getsize(cookie_json_path) > 100: 61 | with open(cookie_json_path, 'r', encoding='utf-8') as f: 62 | cookies_dict = json.load(f) 63 | if len(cookies_dict)<3: 64 | need_reinput=True 65 | else: 66 | saved_cookies=cookies_dict 67 | #print(f"GetCookies Success") 68 | 69 | #f.seek(0) 70 | #print(f'f.read()\n{f.read()}') 71 | else: 72 | need_reinput=True 73 | 74 | if need_reinput: 75 | print_if(f"File {cookie_json_path} does not exist or is empty.",1) 76 | saved_cookies = user_input_cookie() 77 | 78 | return saved_cookies 79 | 80 | 81 | 82 | # 在开始运行时自动调用GetCookie方法,这里使用的是懒加载的方式,也可以在程序初始化时调用GetCookie方法。 83 | print_if(get_cookies()) 84 | 85 | #UserInputCookie() -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/utils/m_paths.py: -------------------------------------------------------------------------------- 1 | ''' 2 | paths.py 3 | 记录各种文件路径 4 | ''' 5 | 6 | setting_folder_path='..\..\..\settings' 7 | cookie_txt_path=setting_folder_path+'\cookie.txt' 8 | cookie_json_path=setting_folder_path+'\cookie.json' 9 | setting_json_path=setting_folder_path+'\settings.json' 10 | setting_template_json_path=setting_folder_path+'\settingsTemplate.json' 11 | 12 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/utils/m_requests.py: -------------------------------------------------------------------------------- 1 | ''' 2 | m_requests.py 3 | 主要是对request的改写,现在可以对一个网页进行多次重试访问 4 | ''' 5 | 6 | 7 | import requests 8 | from requests import Response 9 | from utils import cookie_format 10 | from utils.print_if import print_if 11 | 12 | class MRequests: 13 | """ 14 | 使用requests库发送GET请求。 15 | 为了确保线程安全,请每次使用时均进行实例化 16 | 使用样例1: 17 | response=m_requests.MRequests(url).easy_get() 18 | 使用样例2: 19 | mRequest=m_requests.MRequests(url) 20 | response=mRequest.get(retryMax=10) 21 | """ 22 | def __init__(self,url): 23 | self.url=url 24 | 25 | 26 | def get(self, params=None, retryMax=4, **kwargs)->Response: 27 | """ 28 | 使用requests库发送GET请求。若访问失败,最多尝试进行retryMax次重试,默认为4 29 | 30 | 参数: 31 | url (str): 请求的URL地址 32 | params (dict, optional): 请求的参数,默认为None 33 | retryCnt (int, optional): 重试次数,默认为0 34 | 35 | 返回: 36 | requests.Response: 返回requests库的响应对象,无论请求是否成功 37 | 38 | 注意: 39 | 如果请求失败,且重试次数小于retryMax,会递归调用该函数并增加重试次数。 40 | 当重试次数达到retryMax时,将打印"访问失败,已达到最大重试次数",并返回None。 41 | """ 42 | retryCnt = kwargs.pop('retryCnt', 0) # 从kwargs中弹出retryCnt,默认为0 43 | response=Response() 44 | try: 45 | response:Response = requests.get(self.url, params=params, **kwargs) 46 | response.raise_for_status() # 如果状态不是200, 引发HTTPError异常 47 | return response 48 | except requests.exceptions.RequestException: 49 | if retryCnt < retryMax: 50 | retryCnt += 1 51 | print_if(f"{self.url}访问失败,进行第{retryCnt}次重试",1) 52 | return self.get(params=params, **kwargs, retryMax=retryMax, retryCnt=retryCnt) # 递归调用,增加retryCnt 53 | else: 54 | print_if(f"{self.url}访问失败,已达到最大重试次数",2) 55 | return response 56 | 57 | def easy_get(self)->Response: 58 | """ 59 | 使用requests库发送GET请求,添加了默认配置 60 | """ 61 | return self.get(params=None, retryMax=4, cookies=cookie_format.get_cookies()) -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/utils/nga_html_to_md.py: -------------------------------------------------------------------------------- 1 | """ 2 | html转md 3 | """ 4 | 5 | from bs4 import BeautifulSoup 6 | import os,re 7 | from requests import Response 8 | 9 | from utils import setting_manager 10 | from utils.m_requests import MRequests 11 | from utils.print_if import print_if 12 | 13 | 14 | ngaBaseUrl=setting_manager.get("ngaBaseUrl") 15 | imgBaseUrl=setting_manager.get("imgBaseUrl") 16 | 17 | class PostExtractor: 18 | 19 | 20 | 21 | def __init__(self, html_content:str|bytes|Response): 22 | if isinstance(html_content,Response): 23 | html_content=html_content.text 24 | self.soup = BeautifulSoup(html_content, 'html.parser') 25 | self.final_floor:int=0 26 | 27 | def extract_posts(self, last_latest_floor=0)->list[dict]: 28 | replays: list[dict] = [] 29 | for tr in self.soup.find_all('tr', class_=lambda c: c and 'postrow' in c): 30 | floor_id = tr.get('id').split('row')[1] 31 | floor_num = int(floor_id) 32 | self.final_floor=floor_num 33 | # 跳过所有已经保存过的回复,以确保不会重复保存到md中 34 | # 新帖子时的last_latest_floor应当为-1,所以也不会跳过 35 | if floor_num <= last_latest_floor : 36 | continue 37 | 38 | author_link = tr.find('a', class_='author b')['href'] 39 | author_link=f"{ngaBaseUrl}/{author_link}" 40 | post_time = tr.find('span', id=lambda id: id and 'postdate' in id).get_text(strip=True) 41 | post_content="" 42 | try: 43 | post_content = tr.find('span', class_='postcontent ubbcode').get_text(strip=True, separator='\n') 44 | except Exception as e: 45 | try: 46 | post_content = tr.find('p', class_='postcontent ubbcode').get_text(strip=True, separator='\n') 47 | except Exception as e: 48 | print_if(f"无法获取楼层内容:{e}") 49 | 50 | # 处理正文的图片链接 51 | img_regex = r'\[img\]./(.*?)\[/img\]' 52 | matches = re.finditer(img_regex, post_content) 53 | for match in matches: 54 | # 移除'./'并拼接完整的URL 55 | part_img_url=match.group(1) 56 | full_img_url = f"{imgBaseUrl}/{part_img_url}" 57 | # 替换原始链接为 Markdown 图片语法 58 | replacement = f'![标题]({full_img_url})' 59 | post_content = post_content.replace(match.group(0), replacement) 60 | 61 | 62 | replays.append({ 63 | 'floor_num': floor_num, 64 | 'author_link': author_link, 65 | 'post_time': post_time, 66 | 'post_content': post_content 67 | }) 68 | 69 | return replays 70 | 71 | def save_to_md(self, replays, post_title:str,post_tid:int, md_path:str,last_latest_floor=0): 72 | if not os.path.exists(md_path) and last_latest_floor == -1: 73 | with open(md_path, 'w', encoding='utf-8') as f: 74 | f.write(f'# {post_title}\n') 75 | f.write(f'# {ngaBaseUrl}/read.php?tid={post_tid}\n\n') 76 | 77 | 78 | with open(md_path, 'a', encoding='utf-8') as f: 79 | for replay in replays: 80 | f.write(f'## \# {replay["floor_num"]}\n') 81 | f.write(f'### 发帖人链接\n') 82 | f.write(f'[{replay["author_link"]}]({replay["author_link"]})\n') 83 | f.write(f'### 发帖时间\n') 84 | f.write(f'{replay["post_time"]}\n') 85 | f.write(f'### 帖子内容\n') 86 | f.write(f'{replay["post_content"]}\n') 87 | 88 | def extract_and_save_md(self,post_title:str,post_tid:int, md_path:str,last_latest_floor=-1): 89 | """将帖子内容保存为md文件""" 90 | replays = self.extract_posts(last_latest_floor) 91 | self.save_to_md(replays,post_title,post_tid, md_path,last_latest_floor) 92 | return self.final_floor 93 | 94 | ''' 95 | html_content=MRequests("https://bbs.nga.cn/read.php?tid=40068540").easy_get() 96 | # 实例化类并调用方法 97 | extractor = PostExtractor(html_content) 98 | posts = extractor.extract_posts(last_latest_floor=0) # 假设我们只想获取楼层7及以上的帖子 99 | title = "示例帖子标题" # 这里需要传入帖子的标题 100 | md_path = "output.md" # 指定md文件路径 101 | extractor.save_to_md(posts, title, md_path,last_latest_floor=0) 102 | ''' -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/utils/post_stats_operator.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 每日统计器 3 | ''' 4 | from datetime import date, datetime, timedelta 5 | from db_managers import monitoring_posts_db_manager,post_stats_db_manager 6 | from db_managers.monitoring_posts_db_manager import MonitoringPost 7 | from utils import setting_manager 8 | from utils.print_if import print_if 9 | import time 10 | 11 | stat_trace_back_days:int=setting_manager.get("stat_trace_back_days") 12 | monitoring_boards:dict=setting_manager.get("monitoringBoards") 13 | monitoring_boards_keys:list[str]=list(monitoring_boards.keys())[:10] 14 | RUN_CYCLE_STAT=True 15 | 16 | def static(): 17 | '''帖子统计器''' 18 | print_if("帖子统计器开始运行",5) 19 | for i in range(stat_trace_back_days,-1,-1): 20 | date=datetime.now().date() - timedelta(days=i) 21 | list_of_new_posts:list[MonitoringPost]=monitoring_posts_db_manager.get_posts_by_first_post_time(target_date=date) 22 | list_of_invalid_posts:list[MonitoringPost]=monitoring_posts_db_manager.get_posts_by_valid_state_and_final_replay_time(target_date=date) 23 | 24 | # 判断为空,则直接break 25 | if (not list_of_new_posts) or (not list_of_invalid_posts): 26 | continue 27 | 28 | # 整体记录 29 | cnt_of_new_posts=len(list_of_new_posts) 30 | cnt_of_invalid_posts=len(list_of_invalid_posts) 31 | 32 | # 分版面记录 33 | cnt_of_new_posts_in_board=[0]*11 34 | cnt_of_invalid_posts_in_board=[0]*11 35 | 36 | for new_post in list_of_new_posts: 37 | # 帖子的版面在监控中的版面的数组中的下标 38 | index:int=0 39 | try: 40 | # 如果查询到了,就将index+1,因为记录版面帖子数量是从1开始的,并且将index=0作为未查询到的帖子的计数 41 | index=monitoring_boards_keys.index(str(new_post.fidOrStid))+1 42 | except: 43 | index=0 44 | cnt_of_new_posts_in_board[index]=cnt_of_new_posts_in_board[index]+1 45 | 46 | for invalid_post in list_of_invalid_posts: 47 | # 帖子的版面在监控中的版面的数组中的下标 48 | index:int=0 49 | try: 50 | # 如果查询到了,就将index+1,因为记录版面帖子数量是从1开始的,并且将index=0作为未查询到的帖子的计数 51 | index=monitoring_boards_keys.index(str(invalid_post.fidOrStid))+1 52 | except: 53 | index=0 54 | cnt_of_invalid_posts_in_board[index]=cnt_of_invalid_posts_in_board[index]+1 55 | 56 | post_stats=post_stats_db_manager.PostStats( 57 | date=date,total_new_posts=cnt_of_new_posts,total_deleted_posts=cnt_of_invalid_posts, 58 | board1_new_posts=cnt_of_new_posts_in_board[1],board1_deleted_posts=cnt_of_invalid_posts_in_board[1], 59 | board2_new_posts=cnt_of_new_posts_in_board[2],board2_deleted_posts=cnt_of_invalid_posts_in_board[2], 60 | board3_new_posts=cnt_of_new_posts_in_board[3],board3_deleted_posts=cnt_of_invalid_posts_in_board[3], 61 | board4_new_posts=cnt_of_new_posts_in_board[4],board4_deleted_posts=cnt_of_invalid_posts_in_board[4], 62 | board5_new_posts=cnt_of_new_posts_in_board[5],board5_deleted_posts=cnt_of_invalid_posts_in_board[5], 63 | board6_new_posts=cnt_of_new_posts_in_board[6],board6_deleted_posts=cnt_of_invalid_posts_in_board[6], 64 | board7_new_posts=cnt_of_new_posts_in_board[7],board7_deleted_posts=cnt_of_invalid_posts_in_board[7], 65 | board8_new_posts=cnt_of_new_posts_in_board[8],board8_deleted_posts=cnt_of_invalid_posts_in_board[8], 66 | board9_new_posts=cnt_of_new_posts_in_board[9],board9_deleted_posts=cnt_of_invalid_posts_in_board[9], 67 | board10_new_posts=cnt_of_new_posts_in_board[10],board10_deleted_posts=cnt_of_invalid_posts_in_board[10], 68 | ) 69 | update_or_add_post_result=post_stats_db_manager.update_or_add_post(post_stats) 70 | print_if(f"帖子统计存档:{date},新贴数量:{cnt_of_new_posts},被删帖数量:{cnt_of_invalid_posts}。state: {update_or_add_post_result}",3 if update_or_add_post_result else 2 ) 71 | 72 | 73 | def cycle_static(): 74 | '''循环帖子统计器''' 75 | while RUN_CYCLE_STAT: 76 | static() 77 | time.sleep(60) 78 | -------------------------------------------------------------------------------- /AutoArchiver/NGA_AutoSave_V3_AutoArchiver/NGA_AutoSave_V3_AutoArchiver/utils/print_if.py: -------------------------------------------------------------------------------- 1 | """ 2 | 带分类别(等级)显示的print 3 | """ 4 | from datetime import datetime 5 | from utils import setting_manager 6 | group_show=setting_manager.get("logGroupShow") 7 | group_name=setting_manager.get("logGroupName") 8 | group_name_show=setting_manager.get("logGroupNameShow") 9 | add_time=setting_manager.get("printIfAddTime") 10 | 11 | latest_print_time=datetime.now() 12 | 13 | def print_if(message,group=0,need_stage_time=True): 14 | """ 15 | 带分类别(等级)显示的print,默认分类为0 16 | 可以在setting.json的logGroup中修改显示分类 17 | 分类: 0:通用, 1:警告, 2:错误, 3:成功, 4:零碎(通常不显示); 5:阶段标题; 6:临时 18 | need_stage_time:bool,代表是否需要记录时间,以判断下载循环卡死 19 | 20 | """ 21 | global latest_print_time 22 | if need_stage_time: 23 | latest_print_time=datetime.now() 24 | formatted_now=datetime.now().strftime("%Y/%m/%d %H:%M:%S:%f")[:-3] if(add_time) else "" 25 | 26 | add_text=group_name[group] if group_name_show and group>=0 and group 2 | 3 | 4 | Debug|Any CPU 5 | 6 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Package for NGA_AutoSave_V3_DistributeServer. 3 | """ 4 | 5 | import pymysql 6 | pymysql.install_as_MySQLdb() 7 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | Definition of urls for NGA_AutoSave_V3_DistributeServer. 3 | """ 4 | 5 | from datetime import datetime 6 | from django.urls import include, path 7 | from django.contrib import admin 8 | from django.contrib.auth.views import LoginView, LogoutView 9 | from app import forms, views 10 | 11 | 12 | urlpatterns = [ 13 | path('', views.home, name='home'), 14 | path('contact/', views.contact, name='contact'), 15 | path('about/', views.about, name='about'), 16 | path('login/', 17 | LoginView.as_view 18 | ( 19 | template_name='app/login.html', 20 | authentication_form=forms.BootstrapAuthenticationForm, 21 | extra_context= 22 | { 23 | 'title': 'Log in', 24 | 'year' : datetime.now().year, 25 | } 26 | ), 27 | name='login'), 28 | path('logout/', LogoutView.as_view(next_page='/'), name='logout'), 29 | path('admin/', admin.site.urls), 30 | path('mainApp/',include('mainApp.urls')), 31 | path('savedFile/', include('savedFileServe.urls', namespace='savedFile')), 32 | ] 33 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for NGA_AutoSave_V3_DistributeServer project. 3 | 4 | This module contains the WSGI application used by Django's development server 5 | and any production WSGI deployments. It should expose a module-level variable 6 | named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover 7 | this application via the ``WSGI_APPLICATION`` setting. 8 | 9 | Usually you will have the standard Django WSGI application here, but it also 10 | might make sense to replace the whole Django WSGI application with a custom one 11 | that later delegates to the Django one. For example, you could introduce WSGI 12 | middleware here, or combine a Django application with an application of another 13 | framework. 14 | 15 | For more information, visit 16 | https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ 17 | """ 18 | 19 | import os 20 | from django.core.wsgi import get_wsgi_application 21 | 22 | os.environ.setdefault( 23 | 'DJANGO_SETTINGS_MODULE', 24 | 'NGA_AutoSave_V3_DistributeServer.settings') 25 | 26 | # This application object is used by any WSGI server configured to use this 27 | # file. This includes Django's development server, if the WSGI_APPLICATION 28 | # setting points here. 29 | application = get_wsgi_application() 30 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Package for the application. 3 | """ 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/forms.py: -------------------------------------------------------------------------------- 1 | """ 2 | Definition of forms. 3 | """ 4 | 5 | from django import forms 6 | from django.contrib.auth.forms import AuthenticationForm 7 | from django.utils.translation import gettext_lazy as _ 8 | 9 | class BootstrapAuthenticationForm(AuthenticationForm): 10 | """Authentication form which uses boostrap CSS.""" 11 | username = forms.CharField(max_length=254, 12 | widget=forms.TextInput({ 13 | 'class': 'form-control', 14 | 'placeholder': 'User name'})) 15 | password = forms.CharField(label=_("Password"), 16 | widget=forms.PasswordInput({ 17 | 'class': 'form-control', 18 | 'placeholder':'Password'})) 19 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/migrations/__init__.py -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/models.py: -------------------------------------------------------------------------------- 1 | """ 2 | Definition of models. 3 | """ 4 | 5 | from django.db import models 6 | 7 | # Create your models here. 8 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/content/site.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 50px; 3 | padding-bottom: 20px; 4 | } 5 | 6 | /* Set padding to keep content from hitting the edges */ 7 | .body-content { 8 | padding-left: 15px; 9 | padding-right: 15px; 10 | } 11 | 12 | /* Set width on the form input elements since they're 100% wide by default */ 13 | input, 14 | select, 15 | textarea { 16 | max-width: 280px; 17 | } 18 | 19 | /* styles for validation helpers */ 20 | .field-validation-error { 21 | color: #b94a48; 22 | } 23 | 24 | .field-validation-valid { 25 | display: none; 26 | } 27 | 28 | input.input-validation-error { 29 | border: 1px solid #b94a48; 30 | } 31 | 32 | input[type="checkbox"].input-validation-error { 33 | border: 0 none; 34 | } 35 | 36 | .validation-summary-errors { 37 | color: #b94a48; 38 | } 39 | 40 | .validation-summary-valid { 41 | display: none; 42 | } -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/scripts/_references.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/static/app/scripts/_references.js -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/templates/app/about.html: -------------------------------------------------------------------------------- 1 | {% extends "app/layout.html" %} 2 | 3 | {% block content %} 4 | 5 |

{{ title }}.

6 |

{{ message }}

7 | 8 |

Use this area to provide additional information.

9 | 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/templates/app/contact.html: -------------------------------------------------------------------------------- 1 | {% extends "app/layout.html" %} 2 | 3 | {% block content %} 4 | 5 |

{{ title }}.

6 |

{{ message }}

7 | 8 |
9 | One Microsoft Way
10 | Redmond, WA 98052-6399
11 | P: 12 | 425.555.0100 13 |
14 | 15 |
16 | Support: Support@example.com
17 | Marketing: Marketing@example.com 18 |
19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/templates/app/index.html: -------------------------------------------------------------------------------- 1 | {% extends "app/layout.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

Django

7 |

Django is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.

8 |

Learn more »

9 |
10 | 11 |
12 |
13 |

Getting started

14 |

15 | Django gives you a powerful, patterns-based way to build dynamic websites that 16 | enables a clean separation of concerns and gives you full control over markup 17 | for enjoyable, agile development. 18 |

19 |

Learn more »

20 |
21 |
22 |

Get more libraries

23 |

The Python Package Index is a repository of software for the Python programming language.

24 |

Learn more »

25 |
26 |
27 |

Microsoft Azure

28 |

You can easily publish to Microsoft Azure using Visual Studio. Find out how you can host your application using a free trial today.

29 |

Learn more »

30 |
31 |
32 | 33 | {% endblock %} 34 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/templates/app/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ title }} - My Django Application 7 | {% load static %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 34 | 35 |
36 | {% block content %}{% endblock %} 37 |
38 |
39 |

© {{ year }} - My Django Application

40 |
41 |
42 | 43 | 44 | 45 | 46 | {% block scripts %}{% endblock %} 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/templates/app/login.html: -------------------------------------------------------------------------------- 1 | {% extends "app/layout.html" %} 2 | 3 | {% block content %} 4 | 5 |

{{ title }}

6 |
7 |
8 |
9 |
10 | {% csrf_token %} 11 |

Use a local account to log in.

12 |
13 |
14 | 15 |
16 | {{ form.username }} 17 |
18 |
19 |
20 | 21 |
22 | {{ form.password }} 23 |
24 |
25 |
26 |
27 | 28 | 29 |
30 |
31 | {% if form.errors %} 32 |

Please enter a correct user name and password.

33 | {% endif %} 34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | 42 | {% endblock %} 43 | 44 | 45 | {% block scripts %} 46 | 47 | {% load static %} 48 | 49 | 50 | {% endblock %} 51 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/templates/app/loginpartial.html: -------------------------------------------------------------------------------- 1 | {% if user.is_authenticated %} 2 | 9 | 10 | {% else %} 11 | 12 | 15 | 16 | {% endif %} 17 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/tests.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file demonstrates writing tests using the unittest module. These will pass 3 | when you run "manage.py test". 4 | """ 5 | 6 | import django 7 | from django.test import TestCase 8 | 9 | # TODO: Configure your database in settings.py and sync before running tests. 10 | 11 | class ViewTest(TestCase): 12 | """Tests for the application views.""" 13 | 14 | if django.VERSION[:2] >= (1, 7): 15 | # Django 1.7 requires an explicit setup() when running tests in PTVS 16 | @classmethod 17 | def setUpClass(cls): 18 | super(ViewTest, cls).setUpClass() 19 | django.setup() 20 | 21 | def test_home(self): 22 | """Tests the home page.""" 23 | response = self.client.get('/') 24 | self.assertContains(response, 'Home Page', 1, 200) 25 | 26 | def test_contact(self): 27 | """Tests the contact page.""" 28 | response = self.client.get('/contact') 29 | self.assertContains(response, 'Contact', 3, 200) 30 | 31 | def test_about(self): 32 | """Tests the about page.""" 33 | response = self.client.get('/about') 34 | self.assertContains(response, 'About', 3, 200) 35 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/app/views.py: -------------------------------------------------------------------------------- 1 | """ 2 | Definition of views. 3 | """ 4 | 5 | from datetime import datetime 6 | from django.shortcuts import render 7 | from django.http import HttpRequest 8 | 9 | def home(request): 10 | """Renders the home page.""" 11 | assert isinstance(request, HttpRequest) 12 | return render( 13 | request, 14 | 'app/index.html', 15 | { 16 | 'title':'Home Page', 17 | 'year':datetime.now().year, 18 | } 19 | ) 20 | 21 | def contact(request): 22 | """Renders the contact page.""" 23 | assert isinstance(request, HttpRequest) 24 | return render( 25 | request, 26 | 'app/contact.html', 27 | { 28 | 'title':'Contact', 29 | 'message':'Your contact page.', 30 | 'year':datetime.now().year, 31 | } 32 | ) 33 | 34 | def about(request): 35 | """Renders the about page.""" 36 | assert isinstance(request, HttpRequest) 37 | return render( 38 | request, 39 | 'app/about.html', 40 | { 41 | 'title':'About', 42 | 'message':'Your application description page.', 43 | 'year':datetime.now().year, 44 | } 45 | ) 46 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/activate: -------------------------------------------------------------------------------- 1 | # This file must be used with "source bin/activate" *from bash* 2 | # you cannot run it directly 3 | 4 | deactivate () { 5 | # reset old environment variables 6 | if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then 7 | PATH="${_OLD_VIRTUAL_PATH:-}" 8 | export PATH 9 | unset _OLD_VIRTUAL_PATH 10 | fi 11 | if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then 12 | PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" 13 | export PYTHONHOME 14 | unset _OLD_VIRTUAL_PYTHONHOME 15 | fi 16 | 17 | # This should detect bash and zsh, which have a hash command that must 18 | # be called to get it to forget past commands. Without forgetting 19 | # past commands the $PATH changes we made may not be respected 20 | if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then 21 | hash -r 2> /dev/null 22 | fi 23 | 24 | if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then 25 | PS1="${_OLD_VIRTUAL_PS1:-}" 26 | export PS1 27 | unset _OLD_VIRTUAL_PS1 28 | fi 29 | 30 | unset VIRTUAL_ENV 31 | unset VIRTUAL_ENV_PROMPT 32 | if [ ! "${1:-}" = "nondestructive" ] ; then 33 | # Self destruct! 34 | unset -f deactivate 35 | fi 36 | } 37 | 38 | # unset irrelevant variables 39 | deactivate nondestructive 40 | 41 | VIRTUAL_ENV="C:\Users\36349\source\repos\NGA_AutoSave_V3\DistributeServer\NGA_AutoSave_V3_DistributeServer\NGA_AutoSave_V3_DistributeServer\env1" 42 | export VIRTUAL_ENV 43 | 44 | _OLD_VIRTUAL_PATH="$PATH" 45 | PATH="$VIRTUAL_ENV/Scripts:$PATH" 46 | export PATH 47 | 48 | # unset PYTHONHOME if set 49 | # this will fail if PYTHONHOME is set to the empty string (which is bad anyway) 50 | # could use `if (set -u; : $PYTHONHOME) ;` in bash 51 | if [ -n "${PYTHONHOME:-}" ] ; then 52 | _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" 53 | unset PYTHONHOME 54 | fi 55 | 56 | if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then 57 | _OLD_VIRTUAL_PS1="${PS1:-}" 58 | PS1="(env1) ${PS1:-}" 59 | export PS1 60 | VIRTUAL_ENV_PROMPT="(env1) " 61 | export VIRTUAL_ENV_PROMPT 62 | fi 63 | 64 | # This should detect bash and zsh, which have a hash command that must 65 | # be called to get it to forget past commands. Without forgetting 66 | # past commands the $PATH changes we made may not be respected 67 | if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then 68 | hash -r 2> /dev/null 69 | fi 70 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/activate.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem This file is UTF-8 encoded, so we need to update the current code page while executing it 4 | for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( 5 | set _OLD_CODEPAGE=%%a 6 | ) 7 | if defined _OLD_CODEPAGE ( 8 | "%SystemRoot%\System32\chcp.com" 65001 > nul 9 | ) 10 | 11 | set VIRTUAL_ENV=C:\Users\36349\source\repos\NGA_AutoSave_V3\DistributeServer\NGA_AutoSave_V3_DistributeServer\NGA_AutoSave_V3_DistributeServer\env1 12 | 13 | if not defined PROMPT set PROMPT=$P$G 14 | 15 | if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT% 16 | if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME% 17 | 18 | set _OLD_VIRTUAL_PROMPT=%PROMPT% 19 | set PROMPT=(env1) %PROMPT% 20 | 21 | if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME% 22 | set PYTHONHOME= 23 | 24 | if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% 25 | if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% 26 | 27 | set PATH=%VIRTUAL_ENV%\Scripts;%PATH% 28 | set VIRTUAL_ENV_PROMPT=(env1) 29 | 30 | :END 31 | if defined _OLD_CODEPAGE ( 32 | "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul 33 | set _OLD_CODEPAGE= 34 | ) 35 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/deactivate.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | if defined _OLD_VIRTUAL_PROMPT ( 4 | set "PROMPT=%_OLD_VIRTUAL_PROMPT%" 5 | ) 6 | set _OLD_VIRTUAL_PROMPT= 7 | 8 | if defined _OLD_VIRTUAL_PYTHONHOME ( 9 | set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" 10 | set _OLD_VIRTUAL_PYTHONHOME= 11 | ) 12 | 13 | if defined _OLD_VIRTUAL_PATH ( 14 | set "PATH=%_OLD_VIRTUAL_PATH%" 15 | ) 16 | 17 | set _OLD_VIRTUAL_PATH= 18 | 19 | set VIRTUAL_ENV= 20 | set VIRTUAL_ENV_PROMPT= 21 | 22 | :END 23 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/django-admin.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/django-admin.exe -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pip.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pip.exe -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pip3.10.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pip3.10.exe -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pip3.11.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pip3.11.exe -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pip3.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pip3.exe -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/python.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/python.exe -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pythonw.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/pythonw.exe -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/sqlformat.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/Scripts/sqlformat.exe -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/env1/pyvenv.cfg: -------------------------------------------------------------------------------- 1 | home = C:\Users\36349\AppData\Local\Programs\Python\Python310 2 | include-system-site-packages = false 3 | version = 3.10.7 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class mainAppConfig(AppConfig): 5 | name = 'mainApp' 6 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class MonitoringPosts(models.Model): 4 | tid = models.IntegerField(primary_key=True) 5 | tidTitle = models.CharField(max_length=50) 6 | savedFilePath = models.CharField(max_length=255) 7 | poster = models.CharField(max_length=255) 8 | posterUrl=models.CharField(max_length=255) 9 | posterLocation=models.CharField(max_length=255) 10 | validState = models.IntegerField() # 1:正常;2:被锁;3:超时进坟;4:主动过滤 11 | lastPage = models.IntegerField() 12 | repliesCnt = models.IntegerField() 13 | firstPostTime = models.DateTimeField() 14 | finalReplayTime = models.DateTimeField() 15 | fidOrStid = models.CharField(max_length=255) 16 | retryCnt = models.IntegerField() 17 | anonymousPoster = models.BooleanField() 18 | 19 | def toStr(self) -> str: 20 | return f""" 21 | tid : {self.tid}\n 22 | title : {self.tidTitle}\n 23 | poster : {self.poster}\n 24 | repliesCnt : {self.repliesCnt}\n 25 | validState : {self.validState}\n 26 | =====================\n 27 | """ 28 | def __str__(self) -> str: 29 | return self.toStr 30 | 31 | class Meta: 32 | db_table = 'monitoring_posts' 33 | 34 | 35 | class PostStats(models.Model): 36 | id = models.AutoField(primary_key=True) # Django默认的主键 37 | date = models.DateField(null=False, db_index=True) # 添加db_index提高查询效率 38 | total_new_posts = models.IntegerField(null=False, default=0) 39 | total_deleted_posts = models.IntegerField(null=False, default=0) 40 | board1_new_posts = models.IntegerField(null=True, blank=True, default=0) 41 | board1_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 42 | board2_new_posts = models.IntegerField(null=True, blank=True, default=0) 43 | board2_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 44 | board3_new_posts = models.IntegerField(null=True, blank=True, default=0) 45 | board3_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 46 | board4_new_posts = models.IntegerField(null=True, blank=True, default=0) 47 | board4_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 48 | board5_new_posts = models.IntegerField(null=True, blank=True, default=0) 49 | board5_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 50 | board6_new_posts = models.IntegerField(null=True, blank=True, default=0) 51 | board6_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 52 | board7_new_posts = models.IntegerField(null=True, blank=True, default=0) 53 | board7_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 54 | board8_new_posts = models.IntegerField(null=True, blank=True, default=0) 55 | board8_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 56 | board9_new_posts = models.IntegerField(null=True, blank=True, default=0) 57 | board9_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 58 | board10_new_posts = models.IntegerField(null=True, blank=True, default=0) 59 | board10_deleted_posts = models.IntegerField(null=True, blank=True, default=0) 60 | 61 | # 如果你需要确保date字段的唯一性,可以添加unique_together 62 | class Meta: 63 | db_table = 'post_stats' 64 | unique_together = [['date']] # 这实际上不是一个复合主键,只是确保date字段的唯一性 65 | 66 | # 其他可能的模型方法,如save(), delete()的覆盖等 67 | 68 | def __str__(self): 69 | return f"帖子统计存档:{self.date},新贴数量:{self.total_new_posts},被删帖数量:{self.total_deleted_posts}。" -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/templates/allPosts.html: -------------------------------------------------------------------------------- 1 | {% load l10n %} 2 | 3 | 4 | 5 | 6 | 7 | 所有记录 8 | 9 | 10 | 47 |
48 | 查看统计 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | {% for post in monitoring_posts %} 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | {% endfor %} 80 | 81 |
#TID标题可用状态查询留档文件发帖人发帖时间回帖数量最后回帖时间所在版面
{{ post.num }}{{ post.tid }}{{ post.tidTitle }}{{ post.validStateDisplay }}查询{{ post.poster }}{{ post.firstPostTime|date:"Y-m-d H:i" }}{{ post.repliesCnt }}{{ post.finalReplayTime|date:"Y-m-d H:i" }}{{ post.board }}
82 | 83 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/templates/getPostRecord.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 获取留档文件 7 | 8 | 9 |

留档文件 {{folder_name}}

10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | {% for link in file_links %} 19 | 20 | 21 | 22 | 23 | {% endfor %} 24 | 25 |
File NameLink
{{ link.name }}"{% url 'savedFile:savedFileRoot' %}?link={{link.url}}"
26 | 27 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/templates/mainApp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ content }} 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/templates/postStats.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 帖子统计 7 | 36 | 52 | 53 | 54 |
55 | 查看所有帖子 56 |
57 |
58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 |

等刷新出日期后需要点几下“查询”按钮以刷新↑

66 |
67 | 68 |
69 | {{ chart_html|safe }} 70 |
71 | 72 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/tests.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file demonstrates writing tests using the unittest module. These will pass 3 | when you run "manage.py test". 4 | 5 | Replace this with more appropriate tests for your application. 6 | """ 7 | 8 | import django 9 | from django.test import TestCase 10 | 11 | # TODO: Configure your database in settings.py and sync before running tests. 12 | 13 | class SimpleTest(TestCase): 14 | """Tests for the application views.""" 15 | 16 | # Django requires an explicit setup() when running tests in PTVS 17 | @classmethod 18 | def setUpClass(cls): 19 | super(SimpleTest, cls).setUpClass() 20 | django.setup() 21 | 22 | def test_basic_addition(self): 23 | """ 24 | Tests that 1 + 1 always equals 2. 25 | """ 26 | self.assertEqual(1 + 1, 2) -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/mainApp/urls.py: -------------------------------------------------------------------------------- 1 | 2 | from django.urls import path 3 | from django.urls import include, path 4 | from . import views 5 | 6 | urlpatterns = [ 7 | path("test", views.test), 8 | path("dbGetAll",views.dbGetAll,name="dbGetAll"), 9 | path("postStat",views.postStat,name="postStat"), 10 | path("getPostRecord",views.getPostRecord,name="getPostRecord"), 11 | #path('savedFile',include('savedFileServe.urls'),name="savedFile") 12 | ] -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """ 3 | Command-line utility for administrative tasks. 4 | 5 | # For more information about this file, visit 6 | # https://docs.djangoproject.com/en/2.1/ref/django-admin/ 7 | """ 8 | 9 | import os 10 | import sys 11 | 12 | if __name__ == '__main__': 13 | os.environ.setdefault( 14 | 'DJANGO_SETTINGS_MODULE', 15 | 'NGA_AutoSave_V3_DistributeServer.settings') 16 | try: 17 | from django.core.management import execute_from_command_line 18 | except ImportError as exc: 19 | raise ImportError( 20 | "Couldn't import Django. Are you sure it's installed and " 21 | "available on your PYTHONPATH environment variable? Did you " 22 | "forget to activate a virtual environment?" 23 | ) from exc 24 | execute_from_command_line(sys.argv) 25 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/misc/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/misc/utils/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/misc/utils/cookie_format.py: -------------------------------------------------------------------------------- 1 | ''' 2 | cookie管理器 3 | 主要调用get_cookies() 4 | ''' 5 | 6 | import json 7 | import os 8 | import tkinter as tk 9 | from tkinter import simpledialog 10 | from utils import m_paths 11 | from utils.print_if import print_if 12 | 13 | 14 | cookie_json_path=m_paths.cookie_json_path 15 | cookie_txt_path=m_paths.cookie_txt_path 16 | saved_cookies={} 17 | 18 | def split_cookie_and_save(cookieStr): 19 | global saved_cookies 20 | cookie_dict = {} 21 | for line in cookieStr.splitlines(): 22 | if line.strip(): # 检查这一行是否为空 23 | lineSplit=line.split('\t') 24 | key, value = lineSplit[0].strip(), lineSplit[1].strip() # 使用制表符(tab)作为分隔符,并取出第一、二个元素作为key和value,同时去除空格 25 | if('nga' in lineSplit[2] or '178' in lineSplit[2]): 26 | cookie_dict[key] = value 27 | 28 | #settings = cookieDict 29 | saved_cookies=cookie_dict 30 | 31 | with open(cookie_json_path, 'w', encoding='utf-8') as f: 32 | json.dump(cookie_dict, f) 33 | print_if(f'Cookie已成功保存!\n{cookie_dict}',3) 34 | return cookie_dict # 成功保存后返回cookie_dict 35 | 36 | def user_input_cookie(): 37 | 38 | cookie_str = simpledialog.askstring("Cookie Input", "请输入你的cookie:") 39 | print_if(cookie_str) 40 | if len(cookie_str) > 100: 41 | cookie_dict= split_cookie_and_save(cookie_str) # 如果cookieStr长度大于10,则调用SplitCookieAndSave方法并返回其结果 42 | print_if(f'cookie_dict\n{cookie_dict}') 43 | return cookie_dict 44 | else: 45 | print_if("Cookie字符串太短,请重新输入!",2) # 如果cookieStr长度小于等于10,则输出提示信息并返回None表示调用失败 46 | return user_input_cookie() # 递归再次调用 47 | 48 | 49 | def get_cookies(): 50 | '''获取Cookie''' 51 | 52 | #如果存在savedCookies,则直接返回 53 | global saved_cookies 54 | if len(saved_cookies)>100: 55 | return saved_cookies 56 | 57 | #否则, 读取文件 58 | 59 | need_reinput=False 60 | # 检查文件是否存在 61 | if os.path.exists(cookie_json_path) and os.path.getsize(cookie_json_path) > 100: 62 | with open(cookie_json_path, 'r', encoding='utf-8') as f: 63 | cookies_dict = json.load(f) 64 | if len(cookies_dict)<3: 65 | need_reinput=True 66 | else: 67 | saved_cookies=cookies_dict 68 | #print(f"GetCookies Success") 69 | 70 | #f.seek(0) 71 | #print(f'f.read()\n{f.read()}') 72 | else: 73 | need_reinput=True 74 | 75 | if need_reinput: 76 | print_if(f"File {cookie_json_path} does not exist or is empty.",1) 77 | saved_cookies = user_input_cookie() 78 | 79 | return saved_cookies 80 | 81 | 82 | 83 | # 在开始运行时自动调用GetCookie方法,这里使用的是懒加载的方式,也可以在程序初始化时调用GetCookie方法。 84 | print_if(get_cookies()) 85 | 86 | #UserInputCookie() -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/misc/utils/m_paths.py: -------------------------------------------------------------------------------- 1 | ''' 2 | paths.py 3 | 记录各种文件路径 4 | ''' 5 | 6 | setting_folder_path='..\..\..\settings' 7 | cookie_json_path=setting_folder_path+'\cookie.json' 8 | setting_json_path=setting_folder_path+'\settings.json' 9 | setting_template_json_path=setting_folder_path+'\settingsTemplate.json' 10 | 11 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/misc/utils/m_requests.py: -------------------------------------------------------------------------------- 1 | ''' 2 | m_requests.py 3 | 主要是对request的改写,现在可以对一个网页进行多次重试访问 4 | ''' 5 | 6 | 7 | import requests 8 | from requests import Response 9 | from utils import cookie_format 10 | from utils.print_if import print_if 11 | 12 | class MRequests: 13 | """ 14 | 使用requests库发送GET请求。 15 | 为了确保线程安全,请每次使用时均进行实例化 16 | 使用样例1: 17 | response=m_requests.MRequests(url).easy_get() 18 | 使用样例2: 19 | mRequest=m_requests.MRequests(url) 20 | response=mRequest.get(retryMax=10) 21 | """ 22 | def __init__(self,url): 23 | self.url=url 24 | 25 | 26 | def get(self, params=None, retryMax=4, **kwargs)->Response: 27 | """ 28 | 使用requests库发送GET请求。若访问失败,最多尝试进行retryMax次重试,默认为4 29 | 30 | 参数: 31 | url (str): 请求的URL地址 32 | params (dict, optional): 请求的参数,默认为None 33 | retryCnt (int, optional): 重试次数,默认为0 34 | 35 | 返回: 36 | requests.Response: 返回requests库的响应对象,无论请求是否成功 37 | 38 | 注意: 39 | 如果请求失败,且重试次数小于retryMax,会递归调用该函数并增加重试次数。 40 | 当重试次数达到retryMax时,将打印"访问失败,已达到最大重试次数",并返回None。 41 | """ 42 | retryCnt = kwargs.pop('retryCnt', 0) # 从kwargs中弹出retryCnt,默认为0 43 | response=Response() 44 | try: 45 | response:Response = requests.get(self.url, params=params, **kwargs) 46 | response.raise_for_status() # 如果状态不是200, 引发HTTPError异常 47 | return response 48 | except requests.exceptions.RequestException: 49 | if retryCnt < retryMax: 50 | retryCnt += 1 51 | print_if(f"{self.url}访问失败,进行第{retryCnt}次重试",1) 52 | return self.get(params=params, **kwargs, retryMax=retryMax, retryCnt=retryCnt) # 递归调用,增加retryCnt 53 | else: 54 | print_if(f"{self.url}访问失败,已达到最大重试次数",2) 55 | return response 56 | 57 | def easy_get(self)->Response: 58 | """ 59 | 使用requests库发送GET请求,添加了默认配置 60 | """ 61 | return self.get(params=None, retryMax=4, cookies=cookie_format.get_cookies()) -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/misc/utils/print_if.py: -------------------------------------------------------------------------------- 1 | """ 2 | 带分类别(等级)显示的print 3 | """ 4 | from utils import setting_manager 5 | group_show=setting_manager.get("logGroupShow") 6 | group_name=setting_manager.get("logGroupName") 7 | group_name_show=setting_manager.get("logGroupNameShow") 8 | 9 | 10 | def print_if(message,group=0): 11 | """ 12 | 带分类别(等级)显示的print,默认分类为0 13 | 可以在setting.json的logGroup中修改显示分类 14 | 分类: 0:通用, 1:警告, 2:错误, 3:成功, 4:零碎(通常不显示); 5:阶段标题; 6:临时 15 | """ 16 | add_text=group_name[group] if group_name_show and group>=0 and group 2 | 3 | 4 | 5 | 6 | {{ content }} 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/savedFileServe/tests.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file demonstrates writing tests using the unittest module. These will pass 3 | when you run "manage.py test". 4 | 5 | Replace this with more appropriate tests for your application. 6 | """ 7 | 8 | import django 9 | from django.test import TestCase 10 | 11 | # TODO: Configure your database in settings.py and sync before running tests. 12 | 13 | class SimpleTest(TestCase): 14 | """Tests for the application views.""" 15 | 16 | # Django requires an explicit setup() when running tests in PTVS 17 | @classmethod 18 | def setUpClass(cls): 19 | super(SimpleTest, cls).setUpClass() 20 | django.setup() 21 | 22 | def test_basic_addition(self): 23 | """ 24 | Tests that 1 + 1 always equals 2. 25 | """ 26 | self.assertEqual(1 + 1, 2) -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/savedFileServe/urls.py: -------------------------------------------------------------------------------- 1 | 2 | from django.urls import path 3 | 4 | from . import views 5 | 6 | app_name = 'savedFile' 7 | 8 | urlpatterns = [ 9 | path("test", views.test), 10 | path("",views.saved_files_serve,name="savedFileRoot") 11 | ] -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/savedFileServe/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.http import HttpResponse, Http404 3 | from misc.utils import setting_manager 4 | import os 5 | import markdown 6 | # Create your views here. 7 | 8 | base_path =setting_manager.get("saveFileBaseFolderAtServer") 9 | 10 | def saved_files_serve(request): 11 | '''获得留档文件,支持md渲染''' 12 | link=request.GET.get("link") 13 | full_path=os.path.join(base_path,link) 14 | 15 | if not os.path.exists(full_path): 16 | raise Http404("File not found") 17 | 18 | # 根据文件扩展名判断是否需要转换为 HTML 19 | _, ext = os.path.splitext(full_path) 20 | if ext.lower() == '.md': 21 | with open(full_path, 'r', encoding='utf-8') as fh: 22 | markdown_content = fh.read() 23 | html_content = markdown.markdown(markdown_content, safe_mode='escape') 24 | print(f"html_content:{html_content}") 25 | response = HttpResponse(html_content, content_type='text/html; charset=utf-8') 26 | return response 27 | else: 28 | with open(full_path, 'rb') as fh: 29 | response = HttpResponse(fh.read()) 30 | response['Content-Disposition'] = 'inline; filename="%s"' % os.path.basename(full_path) 31 | return response 32 | 33 | 34 | def test(request): 35 | return HttpResponse(f"Hello,World!{request}") -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/css/dark_mode.css: -------------------------------------------------------------------------------- 1 | @media (prefers-color-scheme: dark) { 2 | :root { 3 | --primary: #264b5d; 4 | --primary-fg: #f7f7f7; 5 | 6 | --body-fg: #eeeeee; 7 | --body-bg: #121212; 8 | --body-quiet-color: #e0e0e0; 9 | --body-loud-color: #ffffff; 10 | 11 | --breadcrumbs-link-fg: #e0e0e0; 12 | --breadcrumbs-bg: var(--primary); 13 | 14 | --link-fg: #81d4fa; 15 | --link-hover-color: #4ac1f7; 16 | --link-selected-fg: #6f94c6; 17 | 18 | --hairline-color: #272727; 19 | --border-color: #353535; 20 | 21 | --error-fg: #e35f5f; 22 | --message-success-bg: #006b1b; 23 | --message-warning-bg: #583305; 24 | --message-error-bg: #570808; 25 | 26 | --darkened-bg: #212121; 27 | --selected-bg: #1b1b1b; 28 | --selected-row: #00363a; 29 | 30 | --close-button-bg: #333333; 31 | --close-button-hover-bg: #666666; 32 | } 33 | } 34 | 35 | 36 | html[data-theme="dark"] { 37 | --primary: #264b5d; 38 | --primary-fg: #f7f7f7; 39 | 40 | --body-fg: #eeeeee; 41 | --body-bg: #121212; 42 | --body-quiet-color: #e0e0e0; 43 | --body-loud-color: #ffffff; 44 | 45 | --breadcrumbs-link-fg: #e0e0e0; 46 | --breadcrumbs-bg: var(--primary); 47 | 48 | --link-fg: #81d4fa; 49 | --link-hover-color: #4ac1f7; 50 | --link-selected-fg: #6f94c6; 51 | 52 | --hairline-color: #272727; 53 | --border-color: #353535; 54 | 55 | --error-fg: #e35f5f; 56 | --message-success-bg: #006b1b; 57 | --message-warning-bg: #583305; 58 | --message-error-bg: #570808; 59 | 60 | --darkened-bg: #212121; 61 | --selected-bg: #1b1b1b; 62 | --selected-row: #00363a; 63 | 64 | --close-button-bg: #333333; 65 | --close-button-hover-bg: #666666; 66 | } 67 | 68 | /* THEME SWITCH */ 69 | .theme-toggle { 70 | cursor: pointer; 71 | border: none; 72 | padding: 0; 73 | background: transparent; 74 | vertical-align: middle; 75 | margin-inline-start: 5px; 76 | margin-top: -1px; 77 | } 78 | 79 | .theme-toggle svg { 80 | vertical-align: middle; 81 | height: 1rem; 82 | width: 1rem; 83 | display: none; 84 | } 85 | 86 | /* 87 | Fully hide screen reader text so we only show the one matching the current 88 | theme. 89 | */ 90 | .theme-toggle .visually-hidden { 91 | display: none; 92 | } 93 | 94 | html[data-theme="auto"] .theme-toggle .theme-label-when-auto { 95 | display: block; 96 | } 97 | 98 | html[data-theme="dark"] .theme-toggle .theme-label-when-dark { 99 | display: block; 100 | } 101 | 102 | html[data-theme="light"] .theme-toggle .theme-label-when-light { 103 | display: block; 104 | } 105 | 106 | /* ICONS */ 107 | .theme-toggle svg.theme-icon-when-auto, 108 | .theme-toggle svg.theme-icon-when-dark, 109 | .theme-toggle svg.theme-icon-when-light { 110 | fill: var(--header-link-color); 111 | color: var(--header-bg); 112 | } 113 | 114 | html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto { 115 | display: block; 116 | } 117 | 118 | html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark { 119 | display: block; 120 | } 121 | 122 | html[data-theme="light"] .theme-toggle svg.theme-icon-when-light { 123 | display: block; 124 | } 125 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | .dashboard td, .dashboard th { 3 | word-break: break-word; 4 | } 5 | 6 | .dashboard .module table th { 7 | width: 100%; 8 | } 9 | 10 | .dashboard .module table td { 11 | white-space: nowrap; 12 | } 13 | 14 | .dashboard .module table td a { 15 | display: block; 16 | padding-right: .6em; 17 | } 18 | 19 | /* RECENT ACTIONS MODULE */ 20 | 21 | .module ul.actionlist { 22 | margin-left: 0; 23 | } 24 | 25 | ul.actionlist li { 26 | list-style-type: none; 27 | overflow: hidden; 28 | text-overflow: ellipsis; 29 | } 30 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | .login { 4 | background: var(--darkened-bg); 5 | height: auto; 6 | } 7 | 8 | .login #header { 9 | height: auto; 10 | padding: 15px 16px; 11 | justify-content: center; 12 | } 13 | 14 | .login #header h1 { 15 | font-size: 1.125rem; 16 | margin: 0; 17 | } 18 | 19 | .login #header h1 a { 20 | color: var(--header-link-color); 21 | } 22 | 23 | .login #content { 24 | padding: 20px 20px 0; 25 | } 26 | 27 | .login #container { 28 | background: var(--body-bg); 29 | border: 1px solid var(--hairline-color); 30 | border-radius: 4px; 31 | overflow: hidden; 32 | width: 28em; 33 | min-width: 300px; 34 | margin: 100px auto; 35 | height: auto; 36 | } 37 | 38 | .login .form-row { 39 | padding: 4px 0; 40 | } 41 | 42 | .login .form-row label { 43 | display: block; 44 | line-height: 2em; 45 | } 46 | 47 | .login .form-row #id_username, .login .form-row #id_password { 48 | padding: 8px; 49 | width: 100%; 50 | box-sizing: border-box; 51 | } 52 | 53 | .login .submit-row { 54 | padding: 1em 0 0 0; 55 | margin: 0; 56 | text-align: center; 57 | } 58 | 59 | .login .password-reset-link { 60 | text-align: center; 61 | } 62 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/css/nav_sidebar.css: -------------------------------------------------------------------------------- 1 | .sticky { 2 | position: sticky; 3 | top: 0; 4 | max-height: 100vh; 5 | } 6 | 7 | .toggle-nav-sidebar { 8 | z-index: 20; 9 | left: 0; 10 | display: flex; 11 | align-items: center; 12 | justify-content: center; 13 | flex: 0 0 23px; 14 | width: 23px; 15 | border: 0; 16 | border-right: 1px solid var(--hairline-color); 17 | background-color: var(--body-bg); 18 | cursor: pointer; 19 | font-size: 1.25rem; 20 | color: var(--link-fg); 21 | padding: 0; 22 | } 23 | 24 | [dir="rtl"] .toggle-nav-sidebar { 25 | border-left: 1px solid var(--hairline-color); 26 | border-right: 0; 27 | } 28 | 29 | .toggle-nav-sidebar:hover, 30 | .toggle-nav-sidebar:focus { 31 | background-color: var(--darkened-bg); 32 | } 33 | 34 | #nav-sidebar { 35 | z-index: 15; 36 | flex: 0 0 275px; 37 | left: -276px; 38 | margin-left: -276px; 39 | border-top: 1px solid transparent; 40 | border-right: 1px solid var(--hairline-color); 41 | background-color: var(--body-bg); 42 | overflow: auto; 43 | } 44 | 45 | [dir="rtl"] #nav-sidebar { 46 | border-left: 1px solid var(--hairline-color); 47 | border-right: 0; 48 | left: 0; 49 | margin-left: 0; 50 | right: -276px; 51 | margin-right: -276px; 52 | } 53 | 54 | .toggle-nav-sidebar::before { 55 | content: '\00BB'; 56 | } 57 | 58 | .main.shifted .toggle-nav-sidebar::before { 59 | content: '\00AB'; 60 | } 61 | 62 | .main > #nav-sidebar { 63 | visibility: hidden; 64 | } 65 | 66 | .main.shifted > #nav-sidebar { 67 | margin-left: 0; 68 | visibility: visible; 69 | } 70 | 71 | [dir="rtl"] .main.shifted > #nav-sidebar { 72 | margin-right: 0; 73 | } 74 | 75 | #nav-sidebar .module th { 76 | width: 100%; 77 | overflow-wrap: anywhere; 78 | } 79 | 80 | #nav-sidebar .module th, 81 | #nav-sidebar .module caption { 82 | padding-left: 16px; 83 | } 84 | 85 | #nav-sidebar .module td { 86 | white-space: nowrap; 87 | } 88 | 89 | [dir="rtl"] #nav-sidebar .module th, 90 | [dir="rtl"] #nav-sidebar .module caption { 91 | padding-left: 8px; 92 | padding-right: 16px; 93 | } 94 | 95 | #nav-sidebar .current-app .section:link, 96 | #nav-sidebar .current-app .section:visited { 97 | color: var(--header-color); 98 | font-weight: bold; 99 | } 100 | 101 | #nav-sidebar .current-model { 102 | background: var(--selected-row); 103 | } 104 | 105 | @media (forced-colors: active) { 106 | #nav-sidebar .current-model { 107 | background-color: SelectedItem; 108 | } 109 | } 110 | 111 | .main > #nav-sidebar + .content { 112 | max-width: calc(100% - 23px); 113 | } 114 | 115 | .main.shifted > #nav-sidebar + .content { 116 | max-width: calc(100% - 299px); 117 | } 118 | 119 | @media (max-width: 767px) { 120 | #nav-sidebar, #toggle-nav-sidebar { 121 | display: none; 122 | } 123 | 124 | .main > #nav-sidebar + .content, 125 | .main.shifted > #nav-sidebar + .content { 126 | max-width: 100%; 127 | } 128 | } 129 | 130 | #nav-filter { 131 | width: 100%; 132 | box-sizing: border-box; 133 | padding: 2px 5px; 134 | margin: 5px 0; 135 | border: 1px solid var(--border-color); 136 | background-color: var(--darkened-bg); 137 | color: var(--body-fg); 138 | } 139 | 140 | #nav-filter:focus { 141 | border-color: var(--body-quiet-color); 142 | } 143 | 144 | #nav-filter.no-results { 145 | background: var(--message-error-bg); 146 | } 147 | 148 | #nav-sidebar table { 149 | width: 100%; 150 | } 151 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/css/responsive_rtl.css: -------------------------------------------------------------------------------- 1 | /* TABLETS */ 2 | 3 | @media (max-width: 1024px) { 4 | [dir="rtl"] .colMS { 5 | margin-right: 0; 6 | } 7 | 8 | [dir="rtl"] #user-tools { 9 | text-align: right; 10 | } 11 | 12 | [dir="rtl"] #changelist .actions label { 13 | padding-left: 10px; 14 | padding-right: 0; 15 | } 16 | 17 | [dir="rtl"] #changelist .actions select { 18 | margin-left: 0; 19 | margin-right: 15px; 20 | } 21 | 22 | [dir="rtl"] .change-list .filtered .results, 23 | [dir="rtl"] .change-list .filtered .paginator, 24 | [dir="rtl"] .filtered #toolbar, 25 | [dir="rtl"] .filtered div.xfull, 26 | [dir="rtl"] .filtered .actions, 27 | [dir="rtl"] #changelist-filter { 28 | margin-left: 0; 29 | } 30 | 31 | [dir="rtl"] .inline-group ul.tools a.add, 32 | [dir="rtl"] .inline-group div.add-row a, 33 | [dir="rtl"] .inline-group .tabular tr.add-row td a { 34 | padding: 8px 26px 8px 10px; 35 | background-position: calc(100% - 8px) 9px; 36 | } 37 | 38 | [dir="rtl"] .related-widget-wrapper-link + .selector { 39 | margin-right: 0; 40 | margin-left: 15px; 41 | } 42 | 43 | [dir="rtl"] .selector .selector-filter label { 44 | margin-right: 0; 45 | margin-left: 8px; 46 | } 47 | 48 | [dir="rtl"] .object-tools li { 49 | float: right; 50 | } 51 | 52 | [dir="rtl"] .object-tools li + li { 53 | margin-left: 0; 54 | margin-right: 15px; 55 | } 56 | 57 | [dir="rtl"] .dashboard .module table td a { 58 | padding-left: 0; 59 | padding-right: 16px; 60 | } 61 | } 62 | 63 | /* MOBILE */ 64 | 65 | @media (max-width: 767px) { 66 | [dir="rtl"] .aligned .related-lookup, 67 | [dir="rtl"] .aligned .datetimeshortcuts { 68 | margin-left: 0; 69 | margin-right: 15px; 70 | } 71 | 72 | [dir="rtl"] .aligned ul, 73 | [dir="rtl"] form .aligned ul.errorlist { 74 | margin-right: 0; 75 | } 76 | 77 | [dir="rtl"] #changelist-filter { 78 | margin-left: 0; 79 | margin-right: 0; 80 | } 81 | [dir="rtl"] .aligned .vCheckboxLabel { 82 | padding: 1px 5px 0 0; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/css/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Code Charm Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/README.txt: -------------------------------------------------------------------------------- 1 | All icons are taken from Font Awesome (http://fontawesome.io/) project. 2 | The Font Awesome font is licensed under the SIL OFL 1.1: 3 | - https://scripts.sil.org/OFL 4 | 5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG 6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license 7 | in current folder). 8 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-hidelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-viewlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/selector-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/autocomplete.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const $ = django.jQuery; 4 | 5 | $.fn.djangoAdminSelect2 = function() { 6 | $.each(this, function(i, element) { 7 | $(element).select2({ 8 | ajax: { 9 | data: (params) => { 10 | return { 11 | term: params.term, 12 | page: params.page, 13 | app_label: element.dataset.appLabel, 14 | model_name: element.dataset.modelName, 15 | field_name: element.dataset.fieldName 16 | }; 17 | } 18 | } 19 | }); 20 | }); 21 | return this; 22 | }; 23 | 24 | $(function() { 25 | // Initialize all autocomplete widgets except the one in the template 26 | // form used when a new formset is added. 27 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); 28 | }); 29 | 30 | document.addEventListener('formset:added', (event) => { 31 | $(event.target).find('.admin-autocomplete').djangoAdminSelect2(); 32 | }); 33 | } 34 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/cancel.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | // Call function fn when the DOM is loaded and ready. If it is already 4 | // loaded, call the function now. 5 | // http://youmightnotneedjquery.com/#ready 6 | function ready(fn) { 7 | if (document.readyState !== 'loading') { 8 | fn(); 9 | } else { 10 | document.addEventListener('DOMContentLoaded', fn); 11 | } 12 | } 13 | 14 | ready(function() { 15 | function handleClick(event) { 16 | event.preventDefault(); 17 | const params = new URLSearchParams(window.location.search); 18 | if (params.has('_popup')) { 19 | window.close(); // Close the popup. 20 | } else { 21 | window.history.back(); // Otherwise, go back. 22 | } 23 | } 24 | 25 | document.querySelectorAll('.cancel-link').forEach(function(el) { 26 | el.addEventListener('click', handleClick); 27 | }); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/change_form.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; 4 | const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; 5 | if (modelName) { 6 | const form = document.getElementById(modelName + '_form'); 7 | for (const element of form.elements) { 8 | // HTMLElement.offsetParent returns null when the element is not 9 | // rendered. 10 | if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { 11 | element.focus(); 12 | break; 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/collapse.js: -------------------------------------------------------------------------------- 1 | /*global gettext*/ 2 | 'use strict'; 3 | { 4 | window.addEventListener('load', function() { 5 | // Add anchor tag for Show/Hide link 6 | const fieldsets = document.querySelectorAll('fieldset.collapse'); 7 | for (const [i, elem] of fieldsets.entries()) { 8 | // Don't hide if fields in this fieldset have errors 9 | if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) { 10 | elem.classList.add('collapsed'); 11 | const h2 = elem.querySelector('h2'); 12 | const link = document.createElement('a'); 13 | link.id = 'fieldsetcollapser' + i; 14 | link.className = 'collapse-toggle'; 15 | link.href = '#'; 16 | link.textContent = gettext('Show'); 17 | h2.appendChild(document.createTextNode(' (')); 18 | h2.appendChild(link); 19 | h2.appendChild(document.createTextNode(')')); 20 | } 21 | } 22 | // Add toggle to hide/show anchor tag 23 | const toggleFunc = function(ev) { 24 | if (ev.target.matches('.collapse-toggle')) { 25 | ev.preventDefault(); 26 | ev.stopPropagation(); 27 | const fieldset = ev.target.closest('fieldset'); 28 | if (fieldset.classList.contains('collapsed')) { 29 | // Show 30 | ev.target.textContent = gettext('Hide'); 31 | fieldset.classList.remove('collapsed'); 32 | } else { 33 | // Hide 34 | ev.target.textContent = gettext('Show'); 35 | fieldset.classList.add('collapsed'); 36 | } 37 | } 38 | }; 39 | document.querySelectorAll('fieldset.module').forEach(function(el) { 40 | el.addEventListener('click', toggleFunc); 41 | }); 42 | }); 43 | } 44 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/filters.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Persist changelist filters state (collapsed/expanded). 3 | */ 4 | 'use strict'; 5 | { 6 | // Init filters. 7 | let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); 8 | 9 | if (!filters) { 10 | filters = {}; 11 | } 12 | 13 | Object.entries(filters).forEach(([key, value]) => { 14 | const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); 15 | 16 | // Check if the filter is present, it could be from other view. 17 | if (detailElement) { 18 | value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); 19 | } 20 | }); 21 | 22 | // Save filter state when clicks. 23 | const details = document.querySelectorAll('details'); 24 | details.forEach(detail => { 25 | detail.addEventListener('toggle', event => { 26 | filters[`${event.target.dataset.filterTitle}`] = detail.open; 27 | sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); 28 | }); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/jquery.init.js: -------------------------------------------------------------------------------- 1 | /*global jQuery:false*/ 2 | 'use strict'; 3 | /* Puts the included jQuery into our own namespace using noConflict and passing 4 | * it 'true'. This ensures that the included jQuery doesn't pollute the global 5 | * namespace (i.e. this preserves pre-existing values for both window.$ and 6 | * window.jQuery). 7 | */ 8 | window.django = {jQuery: jQuery.noConflict(true)}; 9 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/nav_sidebar.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); 4 | if (toggleNavSidebar !== null) { 5 | const navSidebar = document.getElementById('nav-sidebar'); 6 | const main = document.getElementById('main'); 7 | let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); 8 | if (navSidebarIsOpen === null) { 9 | navSidebarIsOpen = 'true'; 10 | } 11 | main.classList.toggle('shifted', navSidebarIsOpen === 'true'); 12 | navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); 13 | 14 | toggleNavSidebar.addEventListener('click', function() { 15 | if (navSidebarIsOpen === 'true') { 16 | navSidebarIsOpen = 'false'; 17 | } else { 18 | navSidebarIsOpen = 'true'; 19 | } 20 | localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); 21 | main.classList.toggle('shifted'); 22 | navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); 23 | }); 24 | } 25 | 26 | function initSidebarQuickFilter() { 27 | const options = []; 28 | const navSidebar = document.getElementById('nav-sidebar'); 29 | if (!navSidebar) { 30 | return; 31 | } 32 | navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { 33 | options.push({title: container.innerHTML, node: container}); 34 | }); 35 | 36 | function checkValue(event) { 37 | let filterValue = event.target.value; 38 | if (filterValue) { 39 | filterValue = filterValue.toLowerCase(); 40 | } 41 | if (event.key === 'Escape') { 42 | filterValue = ''; 43 | event.target.value = ''; // clear input 44 | } 45 | let matches = false; 46 | for (const o of options) { 47 | let displayValue = ''; 48 | if (filterValue) { 49 | if (o.title.toLowerCase().indexOf(filterValue) === -1) { 50 | displayValue = 'none'; 51 | } else { 52 | matches = true; 53 | } 54 | } 55 | // show/hide parent 56 | o.node.parentNode.parentNode.style.display = displayValue; 57 | } 58 | if (!filterValue || matches) { 59 | event.target.classList.remove('no-results'); 60 | } else { 61 | event.target.classList.add('no-results'); 62 | } 63 | sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); 64 | } 65 | 66 | const nav = document.getElementById('nav-filter'); 67 | nav.addEventListener('change', checkValue, false); 68 | nav.addEventListener('input', checkValue, false); 69 | nav.addEventListener('keyup', checkValue, false); 70 | 71 | const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); 72 | if (storedValue) { 73 | nav.value = storedValue; 74 | checkValue({target: nav, key: ''}); 75 | } 76 | } 77 | window.initSidebarQuickFilter = initSidebarQuickFilter; 78 | initSidebarQuickFilter(); 79 | } 80 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/popup_response.js: -------------------------------------------------------------------------------- 1 | /*global opener */ 2 | 'use strict'; 3 | { 4 | const 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 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/prepopulate.js: -------------------------------------------------------------------------------- 1 | /*global URLify*/ 2 | 'use strict'; 3 | { 4 | const $ = django.jQuery; 5 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { 6 | /* 7 | Depends on urlify.js 8 | Populates a selected field with the values of the dependent fields, 9 | URLifies and shortens the string. 10 | dependencies - array of dependent fields ids 11 | maxLength - maximum length of the URLify'd string 12 | allowUnicode - Unicode support of the URLify'd string 13 | */ 14 | return this.each(function() { 15 | const prepopulatedField = $(this); 16 | 17 | const populate = function() { 18 | // Bail if the field's value has been changed by the user 19 | if (prepopulatedField.data('_changed')) { 20 | return; 21 | } 22 | 23 | const values = []; 24 | $.each(dependencies, function(i, field) { 25 | field = $(field); 26 | if (field.val().length > 0) { 27 | values.push(field.val()); 28 | } 29 | }); 30 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); 31 | }; 32 | 33 | prepopulatedField.data('_changed', false); 34 | prepopulatedField.on('change', function() { 35 | prepopulatedField.data('_changed', true); 36 | }); 37 | 38 | if (!prepopulatedField.val()) { 39 | $(dependencies.join(',')).on('keyup change focus', populate); 40 | } 41 | }); 42 | }; 43 | } 44 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/prepopulate_init.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const $ = django.jQuery; 4 | const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); 5 | $.each(fields, function(index, field) { 6 | $( 7 | '.empty-form .form-row .field-' + field.name + 8 | ', .empty-form.form-row .field-' + field.name + 9 | ', .empty-form .form-row.field-' + field.name 10 | ).addClass('prepopulated_field'); 11 | $(field.id).data('dependency_list', field.dependency_list).prepopulate( 12 | field.dependency_ids, field.maxLength, field.allowUnicode 13 | ); 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/theme.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | window.addEventListener('load', function(e) { 4 | 5 | function setTheme(mode) { 6 | if (mode !== "light" && mode !== "dark" && mode !== "auto") { 7 | console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); 8 | mode = "auto"; 9 | } 10 | document.documentElement.dataset.theme = mode; 11 | localStorage.setItem("theme", mode); 12 | } 13 | 14 | function cycleTheme() { 15 | const currentTheme = localStorage.getItem("theme") || "auto"; 16 | const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; 17 | 18 | if (prefersDark) { 19 | // Auto (dark) -> Light -> Dark 20 | if (currentTheme === "auto") { 21 | setTheme("light"); 22 | } else if (currentTheme === "light") { 23 | setTheme("dark"); 24 | } else { 25 | setTheme("auto"); 26 | } 27 | } else { 28 | // Auto (light) -> Dark -> Light 29 | if (currentTheme === "auto") { 30 | setTheme("dark"); 31 | } else if (currentTheme === "dark") { 32 | setTheme("light"); 33 | } else { 34 | setTheme("auto"); 35 | } 36 | } 37 | } 38 | 39 | function initTheme() { 40 | // set theme defined in localStorage if there is one, or fallback to auto mode 41 | const currentTheme = localStorage.getItem("theme"); 42 | currentTheme ? setTheme(currentTheme) : setTheme("auto"); 43 | } 44 | 45 | function setupTheme() { 46 | // Attach event handlers for toggling themes 47 | const buttons = document.getElementsByClassName("theme-toggle"); 48 | Array.from(buttons).forEach((btn) => { 49 | btn.addEventListener("click", cycleTheme); 50 | }); 51 | initTheme(); 52 | } 53 | 54 | setupTheme(); 55 | }); 56 | } 57 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/jquery/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright OpenJS Foundation and other contributors, https://openjsf.org/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/af.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ar.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/az.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/bg.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/bn.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/bs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ca.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/cs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"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(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/da.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/de.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/dsb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/el.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/en.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/es.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/et.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/eu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/fa.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/fi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/fr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/gl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/he.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/hi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/hr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/hsb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/hu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" 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…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/hy.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/id.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/is.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/it.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ja.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ka.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/km.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ko.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/lt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/lv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/mk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ms.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/nb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},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…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ne.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/nl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/pl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ps.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/pt-BR.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/pt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ro.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;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 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},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",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/ru.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/sk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/sl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/sq.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/sr-Cyrl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/sr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/sv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/th.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/tk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | 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;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/tr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/uk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/vi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/zh-CN.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/select2/i18n/zh-TW.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/admin/js/vendor/xregexp/LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2007-present 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 | -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/content/site.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 50px; 3 | padding-bottom: 20px; 4 | } 5 | 6 | /* Set padding to keep content from hitting the edges */ 7 | .body-content { 8 | padding-left: 15px; 9 | padding-right: 15px; 10 | } 11 | 12 | /* Set width on the form input elements since they're 100% wide by default */ 13 | input, 14 | select, 15 | textarea { 16 | max-width: 280px; 17 | } 18 | 19 | /* styles for validation helpers */ 20 | .field-validation-error { 21 | color: #b94a48; 22 | } 23 | 24 | .field-validation-valid { 25 | display: none; 26 | } 27 | 28 | input.input-validation-error { 29 | border: 1px solid #b94a48; 30 | } 31 | 32 | input[type="checkbox"].input-validation-error { 33 | border: 0 none; 34 | } 35 | 36 | .validation-summary-errors { 37 | color: #b94a48; 38 | } 39 | 40 | .validation-summary-valid { 41 | display: none; 42 | } -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/scripts/_references.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soyussleet/NGA_AutoSave_V3_public/26db5e45b37ed061fa73d0e7f94de813635ddb4b/DistributeServer/NGA_AutoSave_V3_DistributeServer/NGA_AutoSave_V3_DistributeServer/static/app/scripts/_references.js -------------------------------------------------------------------------------- /Settings/settingsTemplate.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotation_tidFilterTitle": "帖子标题过滤,帖子标题有在数组中的子串则不下载", 3 | "tidFilterTitle": [ 4 | "[活动]", 5 | "[安利]", 6 | "[测评]", 7 | "[评测]", 8 | "[版面版规]", 9 | "[版务公告]", 10 | "[杂谈][茶摊]实验型瓜田自动灌溉装置" 11 | ], 12 | 13 | "annotation_tidFilterValidState": "帖子状态过滤,帖子状态在其中时则**不**下载", 14 | "tidFilterValidState": [ 15 | "2", 16 | "3", 17 | "5" 18 | ], 19 | 20 | "annotation_downloadThreadCnt": "同时下载进程数", 21 | "downloadThreadCnt": 100, 22 | 23 | "annotation_DB_USER": "数据库用户名", 24 | "DB_USER": "DbUserName", 25 | 26 | "annotation_DB_PASSWORD": "数据库用户密码", 27 | "DB_PASSWORD": "DbPassword", 28 | 29 | "annotation_DB_HOST": "数据库host", 30 | "DB_HOST": "DbHost", 31 | 32 | "annotation_DB_PORT": "数据库port", 33 | "DB_PORT": "DbPort", 34 | 35 | "annotation_DB_NAME": "数据库名", 36 | "DB_NAME": "DbName", 37 | 38 | "annotation_TABLE_NAME_monitoring_posts": "数据库保存的帖子表名", 39 | "TABLE_NAME_monitoring_posts": "monitoring_posts", 40 | 41 | "annotation_TABLE_NAME_post_stats": "数据库保存数据统计的表名", 42 | "TABLE_NAME_post_stats": "post_stats", 43 | 44 | "annotation_monitoringBoardsUseDb": "监控中的版面是否使用数据库。true:使用数据库; false:使用setting", 45 | "monitoringBoardsUseDb": false, 46 | 47 | "annotation_monitoringBoards": "监控中的版面", 48 | "monitoringBoards": { 49 | "fid=428": "手机 网页游戏综合讨论", 50 | "fid=758": "和裕茶馆(里)", 51 | "fid=-61285727": "手游瓜事件" 52 | }, 53 | 54 | "annotation_saveFileBaseFolderAtArchiver": "留档机中保存的帖子所在文件夹", 55 | "saveFileBaseFolderAtArchiver": "../../../pageSaved", 56 | 57 | "annotation_saveFileBaseFolderAtServer": "查询服务器中保存的帖子所在文件夹", 58 | "saveFileBaseFolderAtServer": "../../../pageSaved", 59 | 60 | "annotation_logGroupShow": "print_if输出的类别,0:普通; 1:警告; 2:错误; 3:成功; 4:非重要; 5:阶段标题; 6:临时", 61 | "logGroupShow": [ 1, 2, 3, 5, 6 ], 62 | 63 | "annotation_logGroupName": "print_if输出的类别名,0:普通; 1:警告; 2:错误; 3:成功; 4:非重要; 5:阶段标题; 6:临时", 64 | "logGroupName": [ 65 | "normal :", 66 | "Warning :", 67 | "ERROR :", 68 | "SUCCESS :", 69 | "scrappy :", 70 | "STAGE :", 71 | "temp :" 72 | ], 73 | 74 | "annotation_logGroupNameShow": "print_if输出是否输出类别名", 75 | "logGroupNameShow": true, 76 | 77 | "annotation_printIfAddTime": "print_if输出是否加入时间", 78 | "printIfAddTime": true, 79 | 80 | "annotation_downloadThreadDeadlockTimeout": "下载线程无输出的超时时间", 81 | "downloadThreadDeadlockTimeout": 60, 82 | 83 | "annotation_downloadLoopinterval": "帖子下载周期,是一个24个元素的数组,代表0~23点往后一个小时内的下载间隔,以秒为单位", 84 | "downloadLoopinterval": [ 60, 180, 300, 600, 600, 600, 450, 300, 240, 120, 120, 120, 90, 90, 90, 60, 60, 60, 60, 30, 30, 30, 30, 30 ], 85 | 86 | "annotation_postExpire": "帖子距离最新回复超时时间,超时则进坟,单位:s。如果出现在首页,则会自动记为不超时", 87 | "postExpire": 172800, 88 | 89 | "annotation_saveFileExpire": "帖子安全保存时间,若超过该时间并且仍然可用,则判定为安全帖,不再保存。单位:s。可以对不同版面的帖子分别计时,以\"fid=758\":\"172800\"的形式。若不特别记录,则以default的值为准;若记为-1,则不删除版面帖子的下载记录", 90 | "saveFileExpire": { 91 | "default": 604800 92 | }, 93 | 94 | "annotation_needDelPostExpireInDb": "帖子过期并删除文件后,是否删除数据库记录", 95 | "needDelPostExpireInDb": false, 96 | 97 | "annotation_useableValidArr": "哪些类validState的帖子会被下载。1:正常;2:被锁;3:超时但仍暂存;4:超时删除前最后访问;5:确认超时", 98 | "useableValidArr": [ 1, 4 ], 99 | 100 | "annotation_queryDbRetryCntLimit": "查询数据库时的重试次数", 101 | "queryDbRetryCntLimit": 5, 102 | 103 | "annotation_postDbValidStateRetryCntLimit": "帖子访问失败时重试次数,超过时validState设为2(帖子被ban)", 104 | "postDbValidStateRetryCntLimit": 5, 105 | 106 | "annotation_ngaBaseUrl": "NGA基础url", 107 | "ngaBaseUrl": "https://bbs.nga.cn", 108 | 109 | "annotation_tidBaseUrl": "帖子的基础url", 110 | "tidBaseUrl": "read.php?tid=", 111 | 112 | "annotation_imgBaseUrl": "图片的基础url", 113 | "imgBaseUrl": "https://img.nga.178.com/attachments", 114 | 115 | "annotation_show_posts_per_page":"输出帖子列表时每页帖子数量", 116 | "show_posts_per_page":100, 117 | 118 | "annotation_stat_trace_back_days":"帖子统计回溯时间", 119 | "stat_trace_back_days":30 120 | 121 | 122 | } -------------------------------------------------------------------------------- /UpdateLog.md: -------------------------------------------------------------------------------- 1 | # UpdateLog.md 2 | # 更新日志 3 | 4 | ## V3.1 5 | 6 | * 1.新增下载卡死重置,现在在卡死后会自动重启下载线程了 7 | * 2.新增初步的服务端,distribute_server,使用django编写。目前能获取记录中的帖子了,并且能对TID、标题、发帖人进行搜索,并且能筛选被ban的帖子。访问链接为[http://127.0.0.1:8080/mainApp/dbGetAll](http://127.0.0.1:8080/mainApp/dbGetAll),可以自行修改启动文件以修改ip:port 8 | * 3.在根目录新增启动文件 9 | 10 | ## V3.2 11 | 12 | * 1.新增查询服务器,现在可以查询帖子列表,获取发帖删帖数量统计,获取存档文件。 13 | ![image](https://github.com/soyussleet/NGA_AutoSave_V3_public/assets/164469268/38a86bdc-c996-495a-9f02-a99900661331) 14 | ![image](https://github.com/soyussleet/NGA_AutoSave_V3_public/assets/164469268/a0abefce-0ed3-4e86-83ba-9d47d7113a58) 15 | ![image](https://github.com/soyussleet/NGA_AutoSave_V3_public/assets/164469268/9dd028ba-089f-4927-b6b5-c260c68f7e7b) 16 | 17 | * 2.**更改了存档文件的位置**和设置文件的位置,现在在根目录里了。 18 | ![image](https://github.com/soyussleet/NGA_AutoSave_V3_public/assets/164469268/5e7dd2e4-76ad-491f-8b7c-e87c3d916e70) 19 | -------------------------------------------------------------------------------- /pageSavedAdd/AAA_readme.md: -------------------------------------------------------------------------------- 1 | # 存档处理,去除空格与'&' 2 | 3 | 为了网页查询的方便,去掉了&号和tid数字后的空格 4 | 如果之前留档了文件,那么需要把```/pageSavedAdd/del_space.py```复制到```/pageSaved```后运行一次,以对文件名进行处理 5 | -------------------------------------------------------------------------------- /pageSavedAdd/del_space.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | 4 | def remove_spaces_in_filenames(directory): 5 | for root, dirs, files in os.walk(directory): 6 | for file in files: 7 | # 构造文件的完整路径 8 | file_path = os.path.join(root, file) 9 | print(f"file_path:{file_path}") 10 | # 替换" ."和" &"前紧跟的空格 11 | new_name = file.replace(' .', '.').replace(' &', '').replace('&', '') 12 | 13 | # 如果文件名发生了改变,则重命名文件 14 | if new_name != file: 15 | new_file_path = os.path.join(root, new_name) 16 | 17 | # 检查新的文件名是否已经存在 18 | if os.path.exists(new_file_path): 19 | # 如果存在,则覆盖它(请确保这是你想要的行为) 20 | print(f"Overwriting file: {new_file_path}") 21 | shutil.move(file_path, new_file_path) 22 | else: 23 | # 如果不存在,则重命名 24 | os.rename(file_path, new_file_path) 25 | print(f"Renamed file: {file_path} to {new_file_path}") 26 | 27 | # 调用函数,传入当前目录('.'表示当前脚本所在目录) 28 | remove_spaces_in_filenames('.') -------------------------------------------------------------------------------- /启动查询服务器.cmd: -------------------------------------------------------------------------------- 1 | ::@echo off 2 | ::在此修改服务器IP:Port以自动启动页面 3 | set base_url=127.0.0.1 4 | set base_port=8080 5 | set full_url=http://%base_url%:%base_port%/mainApp/dbGetAll 6 | start %full_url% 7 | :: 启动服务器 8 | set VENV_PATH=.\DistributeServer\NGA_AutoSave_V3_DistributeServer\NGA_AutoSave_V3_DistributeServer\env\Scripts 9 | call %VENV_PATH%\activate.bat 10 | cd .\DistributeServer\NGA_AutoSave_V3_DistributeServer\NGA_AutoSave_V3_DistributeServer 11 | python manage.py runserver %base_port% 12 | pause -------------------------------------------------------------------------------- /启动自动下载器.cmd: -------------------------------------------------------------------------------- 1 | cd /d .\AutoArchiver\NGA_AutoSave_V3_AutoArchiver\NGA_AutoSave_V3_AutoArchiver 2 | python AAA_NGA_AutoSave_V3_AutoArchiver.py 3 | pause --------------------------------------------------------------------------------