├── .dockerignore ├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── Makefile ├── README.md ├── config ├── __init__.py ├── asgi.py ├── celery.py ├── docker │ ├── alpine │ │ ├── Dockerfile │ │ └── docker-compose-alpine.yml │ ├── jasmin │ │ ├── README.md │ │ ├── docker-compose.yml │ │ ├── jasmin │ │ │ ├── config │ │ │ │ ├── dlr.cfg │ │ │ │ ├── dlrlookupd.cfg │ │ │ │ ├── interceptor.cfg │ │ │ │ └── jasmin.cfg │ │ │ ├── logs │ │ │ │ └── .gitignore │ │ │ ├── resource │ │ │ │ ├── amqp0-8.stripped.rabbitmq.xml │ │ │ │ └── amqp0-9-1.xml │ │ │ └── store │ │ │ │ └── .gitignore │ │ └── redis │ │ │ └── .gitignore │ ├── slim │ │ ├── Dockerfile │ │ ├── docker-entrypoint-celery.sh │ │ └── docker-entrypoint.sh │ └── sms_logger │ │ ├── Dockerfile │ │ ├── docker-entrypoint.sh │ │ ├── requirements.txt │ │ └── sms_logger.py ├── routing.py ├── settings │ ├── __init__.py │ ├── com.py │ ├── dev.py │ └── pro.py ├── urls.py ├── version.py └── wsgi.py ├── docker-compose.yml ├── logs ├── .gitignore └── clean.sh ├── main ├── __init__.py ├── api │ ├── __init__.py │ ├── apps.py │ ├── urls.py │ └── views │ │ ├── __init__.py │ │ ├── filters.py │ │ ├── groups.py │ │ ├── health_check.py │ │ ├── httpccm.py │ │ ├── morouter.py │ │ ├── mtrouter.py │ │ ├── schema.py │ │ ├── smppccm.py │ │ └── users.py ├── core │ ├── __init__.py │ ├── admin │ │ ├── __init__.py │ │ ├── activity_log.py │ │ ├── adminsite.py │ │ ├── currency.py │ │ ├── emailserver.py │ │ ├── submit_log.py │ │ └── tokenizer.py │ ├── apps.py │ ├── context_processors.py │ ├── exceptions.py │ ├── mailer │ │ ├── __init__.py │ │ └── mail_modules.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ └── samples.py │ ├── middleware.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20200515_0727.py │ │ ├── 0003_submitlog.py │ │ └── __init__.py │ ├── models │ │ ├── __init__.py │ │ ├── activity_log.py │ │ ├── currency.py │ │ ├── emailserver.py │ │ ├── guid.py │ │ ├── smpp.py │ │ ├── submit_log.py │ │ └── timestamped.py │ ├── notify │ │ ├── __init__.py │ │ └── mail_sender.py │ ├── smpp │ │ ├── __init__.py │ │ ├── conn.py │ │ ├── filters.py │ │ ├── groups.py │ │ ├── httpccm.py │ │ ├── morouter.py │ │ ├── mtrouter.py │ │ ├── smppccm.py │ │ └── users.py │ ├── tasks │ │ ├── __init__.py │ │ └── mail_html.py │ ├── templates │ │ └── core │ │ │ ├── mail_base.html │ │ │ ├── mail_reset_email.html │ │ │ └── mail_reset_password.html │ ├── tools.py │ └── utils │ │ ├── __init__.py │ │ ├── boolean.py │ │ ├── common.py │ │ ├── cryptograph.py │ │ ├── json_encoder.py │ │ ├── tokens.py │ │ ├── user_agent.py │ │ └── vars.py ├── locale │ └── README.md ├── static │ └── assets │ │ ├── css │ │ ├── base.css │ │ └── sb-admin-2.min.css │ │ ├── img │ │ ├── favicon.ico │ │ ├── jasmin.jpg │ │ ├── jasmin.png │ │ ├── svg │ │ │ ├── forgot_password.svg │ │ │ └── login.svg │ │ └── user.png │ │ ├── js │ │ └── sb-admin-2.min.js │ │ └── vendor │ │ ├── bootstrap │ │ └── js │ │ │ ├── bootstrap.bundle.min.js │ │ │ ├── bootstrap.bundle.min.js.map │ │ │ ├── bootstrap.min.js │ │ │ └── bootstrap.min.js.map │ │ ├── cropper │ │ ├── cropper.min.css │ │ ├── cropper.min.js │ │ ├── cropper_main.css │ │ ├── cropper_main.js │ │ ├── jasny-bootstrap.min.css │ │ └── jasny-bootstrap.min.js │ │ ├── fa5 │ │ ├── css │ │ │ ├── all.min.css │ │ │ ├── brands.min.css │ │ │ ├── fontawesome.min.css │ │ │ ├── regular.min.css │ │ │ ├── solid.min.css │ │ │ ├── svg-with-js.min.css │ │ │ └── v4-shims.min.css │ │ └── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.svg │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.svg │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-regular-400.woff2 │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.svg │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ └── fa-solid-900.woff2 │ │ ├── jquery-easing │ │ ├── jquery.easing.compatibility.js │ │ ├── jquery.easing.js │ │ └── jquery.easing.min.js │ │ ├── jquery-validation │ │ ├── additional-methods.js │ │ ├── additional-methods.min.js │ │ ├── jquery.validate.js │ │ ├── jquery.validate.min.js │ │ └── localization │ │ │ ├── messages_ar.js │ │ │ ├── messages_ar.min.js │ │ │ ├── messages_az.js │ │ │ ├── messages_az.min.js │ │ │ ├── messages_bg.js │ │ │ ├── messages_bg.min.js │ │ │ ├── messages_bn_BD.js │ │ │ ├── messages_bn_BD.min.js │ │ │ ├── messages_ca.js │ │ │ ├── messages_ca.min.js │ │ │ ├── messages_cs.js │ │ │ ├── messages_cs.min.js │ │ │ ├── messages_da.js │ │ │ ├── messages_da.min.js │ │ │ ├── messages_de.js │ │ │ ├── messages_de.min.js │ │ │ ├── messages_el.js │ │ │ ├── messages_el.min.js │ │ │ ├── messages_es.js │ │ │ ├── messages_es.min.js │ │ │ ├── messages_es_AR.js │ │ │ ├── messages_es_AR.min.js │ │ │ ├── messages_es_PE.js │ │ │ ├── messages_es_PE.min.js │ │ │ ├── messages_et.js │ │ │ ├── messages_et.min.js │ │ │ ├── messages_eu.js │ │ │ ├── messages_eu.min.js │ │ │ ├── messages_fa.js │ │ │ ├── messages_fa.min.js │ │ │ ├── messages_fi.js │ │ │ ├── messages_fi.min.js │ │ │ ├── messages_fr.js │ │ │ ├── messages_fr.min.js │ │ │ ├── messages_ge.js │ │ │ ├── messages_ge.min.js │ │ │ ├── messages_gl.js │ │ │ ├── messages_gl.min.js │ │ │ ├── messages_he.js │ │ │ ├── messages_he.min.js │ │ │ ├── messages_hr.js │ │ │ ├── messages_hr.min.js │ │ │ ├── messages_hu.js │ │ │ ├── messages_hu.min.js │ │ │ ├── messages_hy_AM.js │ │ │ ├── messages_hy_AM.min.js │ │ │ ├── messages_id.js │ │ │ ├── messages_id.min.js │ │ │ ├── messages_is.js │ │ │ ├── messages_is.min.js │ │ │ ├── messages_it.js │ │ │ ├── messages_it.min.js │ │ │ ├── messages_ja.js │ │ │ ├── messages_ja.min.js │ │ │ ├── messages_ka.js │ │ │ ├── messages_ka.min.js │ │ │ ├── messages_kk.js │ │ │ ├── messages_kk.min.js │ │ │ ├── messages_ko.js │ │ │ ├── messages_ko.min.js │ │ │ ├── messages_lt.js │ │ │ ├── messages_lt.min.js │ │ │ ├── messages_lv.js │ │ │ ├── messages_lv.min.js │ │ │ ├── messages_mk.js │ │ │ ├── messages_mk.min.js │ │ │ ├── messages_my.js │ │ │ ├── messages_my.min.js │ │ │ ├── messages_nl.js │ │ │ ├── messages_nl.min.js │ │ │ ├── messages_no.js │ │ │ ├── messages_no.min.js │ │ │ ├── messages_pl.js │ │ │ ├── messages_pl.min.js │ │ │ ├── messages_pt_BR.js │ │ │ ├── messages_pt_BR.min.js │ │ │ ├── messages_pt_PT.js │ │ │ ├── messages_pt_PT.min.js │ │ │ ├── messages_ro.js │ │ │ ├── messages_ro.min.js │ │ │ ├── messages_ru.js │ │ │ ├── messages_ru.min.js │ │ │ ├── messages_sd.js │ │ │ ├── messages_sd.min.js │ │ │ ├── messages_si.js │ │ │ ├── messages_si.min.js │ │ │ ├── messages_sk.js │ │ │ ├── messages_sk.min.js │ │ │ ├── messages_sl.js │ │ │ ├── messages_sl.min.js │ │ │ ├── messages_sr.js │ │ │ ├── messages_sr.min.js │ │ │ ├── messages_sr_lat.js │ │ │ ├── messages_sr_lat.min.js │ │ │ ├── messages_sv.js │ │ │ ├── messages_sv.min.js │ │ │ ├── messages_th.js │ │ │ ├── messages_th.min.js │ │ │ ├── messages_tj.js │ │ │ ├── messages_tj.min.js │ │ │ ├── messages_tr.js │ │ │ ├── messages_tr.min.js │ │ │ ├── messages_uk.js │ │ │ ├── messages_uk.min.js │ │ │ ├── messages_ur.js │ │ │ ├── messages_ur.min.js │ │ │ ├── messages_vi.js │ │ │ ├── messages_vi.min.js │ │ │ ├── messages_zh.js │ │ │ ├── messages_zh.min.js │ │ │ ├── messages_zh_TW.js │ │ │ ├── messages_zh_TW.min.js │ │ │ ├── methods_de.js │ │ │ ├── methods_de.min.js │ │ │ ├── methods_es_CL.js │ │ │ ├── methods_es_CL.min.js │ │ │ ├── methods_fi.js │ │ │ ├── methods_fi.min.js │ │ │ ├── methods_it.js │ │ │ ├── methods_it.min.js │ │ │ ├── methods_nl.js │ │ │ ├── methods_nl.min.js │ │ │ ├── methods_pt.js │ │ │ └── methods_pt.min.js │ │ ├── jquery │ │ ├── jquery.min.js │ │ ├── jquery.min.map │ │ ├── jquery.slim.min.js │ │ └── jquery.slim.min.map │ │ ├── sweetalert │ │ ├── sweetalert.css │ │ ├── sweetalert.js │ │ └── sweetalert.min.js │ │ └── toastr │ │ ├── toastr.css │ │ ├── toastr.js.map │ │ ├── toastr.min.css │ │ └── toastr.min.js ├── users │ ├── __init__.py │ ├── admin │ │ ├── __init__.py │ │ └── user.py │ ├── apps.py │ ├── backends │ │ ├── __init__.py │ │ └── auth_backends.py │ ├── forms │ │ ├── __init__.py │ │ ├── profile.py │ │ ├── reset.py │ │ ├── signin.py │ │ └── signup.py │ ├── manager │ │ ├── __init__.py │ │ └── usermanager.py │ ├── middleware.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models │ │ ├── __init__.py │ │ └── user.py │ ├── urls.py │ └── views │ │ ├── __init__.py │ │ ├── profile.py │ │ ├── reset.py │ │ ├── signin.py │ │ └── signup.py └── web │ ├── __init__.py │ ├── forms.py │ ├── helpers.py │ ├── static │ ├── auth │ │ └── activity_log.js │ └── web │ │ ├── SAMPLE.js │ │ ├── content │ │ ├── filters.js │ │ ├── groups.js │ │ ├── httpccm.js │ │ ├── morouter.js │ │ ├── mtrouter.js │ │ ├── send_message.js │ │ ├── smppccm.js │ │ ├── submit_logs.js │ │ └── users.js │ │ ├── dashboard.js │ │ └── global.js │ ├── templates │ ├── auth │ │ ├── activity_log.html │ │ ├── base.html │ │ ├── profile.html │ │ ├── reset.html │ │ ├── settings.html │ │ ├── signin.html │ │ └── signup.html │ └── web │ │ ├── SAMPLE.html │ │ ├── base.html │ │ ├── content │ │ ├── filters.html │ │ ├── groups.html │ │ ├── httpccm.html │ │ ├── morouter.html │ │ ├── mtrouter.html │ │ ├── send_message.html │ │ ├── smppccm.html │ │ ├── submit_logs.html │ │ └── users.html │ │ ├── dashboard.html │ │ ├── includes │ │ ├── avatar_modal.html │ │ ├── footer.html │ │ ├── message.html │ │ ├── paginate.html │ │ ├── paginate_ajax.html │ │ ├── sidebar.html │ │ └── topbar.html │ │ └── welcome.html │ ├── urls.py │ └── views │ ├── __init__.py │ ├── content │ ├── __init__.py │ ├── filters.py │ ├── groups.py │ ├── httpccm.py │ ├── morouter.py │ ├── mtrouter.py │ ├── send_message.py │ ├── smppccm.py │ ├── submit_logs.py │ └── users.py │ └── home.py ├── manage.py ├── pyproject.toml └── sample.env /.dockerignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | .gitignore 3 | .gitattributes 4 | .vscode/ 5 | .github/ 6 | .env 7 | .travis.yml 8 | Dockerfile 9 | 10 | .cache 11 | *.md 12 | !README*.md 13 | env/ 14 | venv/ 15 | 16 | logs/ 17 | public/ 18 | docker-compose.yml 19 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: 101t 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### OSX ### 2 | .DS_Store 3 | .AppleDouble 4 | .LSOverride 5 | 6 | ### SublimeText ### 7 | # cache files for sublime text 8 | *.tmlanguage.cache 9 | *.tmPreferences.cache 10 | *.stTheme.cache 11 | 12 | # workspace files are user-specific 13 | *.sublime-workspace 14 | 15 | # project files should be checked into the repository, unless a significant 16 | # proportion of contributors will probably not be using SublimeText 17 | # *.sublime-project 18 | 19 | # sftp configuration file 20 | sftp-config.json 21 | 22 | # Basics 23 | *.py[cod] 24 | *.pyc 25 | __pycache__ 26 | 27 | # Logs 28 | *.log 29 | pip-log.txt 30 | 31 | # Unit test / coverage reports 32 | .coverage 33 | .tox 34 | nosetests.xml 35 | htmlcov 36 | 37 | # Translations 38 | *.mot 39 | *.pot 40 | 41 | # Pycharm 42 | .idea 43 | 44 | .vscode/ 45 | # Vim 46 | 47 | *~ 48 | *.swp 49 | *.swo 50 | 51 | # npm 52 | node_modules/ 53 | 54 | # Compass 55 | .sass-cache 56 | 57 | staticfiles 58 | 59 | # virtual environments 60 | .env 61 | env/ 62 | venv/ 63 | db.sqlite3 64 | 65 | # Hitch directory 66 | tests/.hitch 67 | 68 | # Docker Compose 69 | # /docker-compose.yml 70 | 71 | #sunucudaki static ve medya ve dosyalarının konumu 72 | /public/* 73 | 74 | flower 75 | celerybeat-schedule 76 | celerybeat.pid 77 | 78 | .vagrant/ 79 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | language: python 3 | python: 4 | - '3.11' 5 | before_install: 6 | - virtualenv -p python3 env 7 | - source env/bin/activate 8 | - cp -rf sample.env .env 9 | before_script: 10 | # install requirements: 11 | - pip install -U pip wheel uv && uv pip install -r pyproject.toml 12 | services: 13 | - redis-server 14 | addons: 15 | apt: 16 | packages: 17 | - python3.11-{venv,dev,distutils} 18 | - python3-pip 19 | - git 20 | - virtualenv 21 | env: 22 | - DJANGO_SETTINGS_MODULE=config.settings.dev 23 | script: 24 | - python manage.py samples -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change history 2 | 3 | ## 3.0.1 4 | Changes 5 | 1. JavaScript fixes 6 | 2. Adding Send Message to test Jasmin Gateway 7 | 8 | ## 3.0.0 9 | Changes 10 | 1. Adding live health checker for jasmin sms gateway 11 | 2. bug fixes, code improvements 12 | 13 | ## 2.0.2 14 | Changes 15 | 16 | 1. Adding FailOverRouter supports to MT / MO Router 17 | 18 | ## 2.0.1 19 | Changes 20 | 21 | 1. Adding **[Submit Log](https://github.com/101t/jasmin-submit-logs)** report (DLR report) 22 | 23 | ## 2.0.0 24 | Changes 25 | 26 | 1. UI Improved, jQuery Fixed, jQuery Validation added. 27 | 2. Backend fixing, upgrade to python3 and fresh Django version. 28 | 3. Telnet connector fixing. 29 | 4. Deployment made easier. 30 | 5. Fixing common connection issues. 31 | 6. Simple dashboard initialized. 32 | 7. User Profile, Change Password, Add Avatar. 33 | 8. Activity Log, to log your usage. 34 | 35 | ## 1.0.0 36 | Changes 37 | 38 | 1. first standard release of jasmin web panel 39 | 2. the idea of project -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/config/__init__.py -------------------------------------------------------------------------------- /config/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI entrypoint. Configures Django and then runs the application 3 | defined in the ASGI_APPLICATION setting. 4 | """ 5 | 6 | import os 7 | import django 8 | from django.core.asgi import get_asgi_application 9 | 10 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.pro") 11 | django.setup() 12 | 13 | application = get_asgi_application() -------------------------------------------------------------------------------- /config/celery.py: -------------------------------------------------------------------------------- 1 | import os 2 | from django.conf import settings 3 | from celery import Celery 4 | from celery.utils.log import get_task_logger 5 | 6 | from django.utils import timezone 7 | 8 | logger = get_task_logger(__name__) 9 | 10 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.pro") 11 | CELERY_BROKER_URL = os.environ.get("CELERY_BROKER_URL", default="redis://localhost:6379/0") 12 | CELERY_RESULT_BACKEND = os.environ.get("CELERY_RESULT_BACKEND", default="redis://localhost:6379/0") 13 | 14 | 15 | app = Celery('config') 16 | 17 | app.config_from_object("django.conf:settings", namespace="CELERY") 18 | app.conf.broker_url = CELERY_BROKER_URL 19 | app.conf.result_backend = CELERY_RESULT_BACKEND 20 | app.conf.broker_connection_max_retries = 0 21 | app.conf.broker_connection_retry_on_startup = True 22 | app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, related_name='tasks') 23 | 24 | BROKER_CONNECTION_TIMEOUT = 120 25 | 26 | CELERY_DEFAULT_UP_TIME = timezone.now() 27 | 28 | 29 | @app.task(bind=True) 30 | def debug_task(self): 31 | logger.info("Request: {0!r}".format(self.Request)) 32 | 33 | 34 | def revoke_task(task_id): 35 | app.control.revoke(task_id) 36 | 37 | 38 | def clear_tasks(): 39 | return app.control.purge() 40 | -------------------------------------------------------------------------------- /config/docker/alpine/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.11 2 | 3 | ENV PYTHONDONTWRITEBYTECODE 1 4 | ENV PYTHONUNBUFFERED 1 5 | ENV JASMIN_HOME=/jasmin 6 | ENV PATH="${PATH}:/jasmin" 7 | 8 | # RUN mkdir /jasmin 9 | RUN addgroup -S jasmin && adduser -S jasmin -G jasmin -h $JASMIN_HOME 10 | 11 | #RUN apk del busybox-extras 12 | RUN apk --update --no-cache upgrade 13 | RUN apk add python3 --repository=http://dl-cdn.alpinelinux.org/alpine/v3.11/main && ln -sf python3 /usr/bin/python 14 | # RUN apk search busybox-extras 15 | RUN apk add busybox-extras 16 | # RUN busybox --list 17 | # RUN apk add --no-cache bash curl nmap apache2-utils bind-tools tcpdump mtr iperf3 strace tree busybox-extras netcat-openbsd 18 | RUN echo alias telnet='busybox-extras telnet' >> .bashrc 19 | RUN telnet google.com 80 20 | 21 | RUN apk add --update build-base git gcc cmake py3-setuptools py3-pip python3-dev bash 22 | 23 | # RUN apk add --no-cache bash 24 | 25 | WORKDIR $JASMIN_HOME 26 | 27 | USER jasmin 28 | 29 | RUN mkdir -p $JASMIN_HOME/public/media 30 | RUN mkdir -p $JASMIN_HOME/public/static 31 | 32 | # RUN chown -R jasmin:jasmin $JASMIN_HOME/ 33 | 34 | COPY --chown=jasmin:jasmin ./requirements.txt $JASMIN_HOME/requirements.txt 35 | 36 | ENV PATH="${PATH}:/jasmin/.local/bin" 37 | 38 | RUN pip3 install --upgrade pip && pip3 install -r requirements.txt 39 | 40 | COPY --chown=jasmin:jasmin . $JASMIN_HOME 41 | 42 | COPY --chown=jasmin:jasmin ./docker-entrypoint.sh docker-entrypoint.sh 43 | 44 | # RUN chown -R jasmin:jasmin $JASMIN_HOME/ 45 | 46 | # USER root 47 | 48 | ENTRYPOINT ["docker-entrypoint.sh"] -------------------------------------------------------------------------------- /config/docker/alpine/docker-compose-alpine.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | jasmin_web: 5 | image: tarekaec/jasmin_web_panel:1.0-alpine 6 | ports: 7 | - "8000:8000" 8 | deploy: 9 | replicas: 1 10 | env_file: 11 | - .env 12 | environment: 13 | JASMIN_PORT: 8000 14 | healthcheck: 15 | disable: true 16 | volumes: 17 | - ./public:/web/public 18 | # entrypoint: /jasmin/docker-entrypoint.sh 19 | jasmin_celery: 20 | image: tarekaec/jasmin_web_panel:1.0-alpine 21 | deploy: 22 | replicas: 1 23 | env_file: 24 | - .env 25 | environment: 26 | DEBUG: 0 27 | healthcheck: 28 | disable: true 29 | depends_on: 30 | - jasmin_redis 31 | entrypoint: /jasmin/celery_run.sh 32 | jasmin_redis: 33 | image: redis:alpine 34 | tty: true 35 | -------------------------------------------------------------------------------- /config/docker/jasmin/README.md: -------------------------------------------------------------------------------- 1 | # Jasmin SMS Gateway 2 | This is the docker version of jasmin sms gateway 3 | 4 | ```shell 5 | docker stack deploy -c config/docker/jasmin/docker-compose.yml jasmin 6 | ``` -------------------------------------------------------------------------------- /config/docker/jasmin/jasmin/logs/.gitignore: -------------------------------------------------------------------------------- 1 | *.log -------------------------------------------------------------------------------- /config/docker/jasmin/jasmin/store/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/config/docker/jasmin/jasmin/store/.gitignore -------------------------------------------------------------------------------- /config/docker/jasmin/redis/.gitignore: -------------------------------------------------------------------------------- 1 | *.rdb -------------------------------------------------------------------------------- /config/docker/slim/docker-entrypoint-celery.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | APP_DIR=${APP_DIR:-'/app'} 6 | CELERY_LOG_LEVEL=${CELERY_LOG_LEVEL:-'warning'} 7 | 8 | # shellcheck disable=SC2164 9 | cd "$APP_DIR" 10 | 11 | source "$APP_DIR"/env/bin/activate 12 | 13 | "$APP_DIR"/env/bin/celery --app config worker --max-tasks-per-child 1 -l "$CELERY_LOG_LEVEL" 14 | -------------------------------------------------------------------------------- /config/docker/slim/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | APP_PORT=${APP_PORT:-8000} 6 | APP_DIR=${APP_DIR:-'/app'} 7 | APP_LOG_LEVEL=${APP_LOG_LEVEL:-'warn'} 8 | 9 | APP_WSGI=${APP_WSGI:-'wsgi'} 10 | 11 | APP_WORKER_CLASS=${APP_WORKER_CLASS:-'sync'} 12 | APP_WORKERS=${APP_WORKERS:-4} 13 | 14 | cd "$APP_DIR" 15 | 16 | # Optional (not strictly needed if PATH is set in Dockerfile) 17 | source "$APP_DIR"/env/bin/activate 18 | 19 | python manage.py migrate 20 | python manage.py samples 21 | python manage.py collectstatic --noinput --clear 22 | 23 | exec "$APP_DIR"/env/bin/gunicorn config."$APP_WSGI":application \ 24 | --workers "$APP_WORKERS" \ 25 | --bind :"$APP_PORT" \ 26 | --log-level "$APP_LOG_LEVEL" \ 27 | --worker-class="$APP_WORKER_CLASS" \ 28 | --reload -------------------------------------------------------------------------------- /config/docker/sms_logger/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.11-slim 2 | 3 | # disable debian interactive 4 | ARG DEBIAN_FRONTEND=noninteractive 5 | # suppress pip upgrade warning 6 | ARG PIP_DISABLE_PIP_VERSION_CHECK=1 7 | # disable cache directory, image size 2.1GB to 1.9GB 8 | ARG PIP_NO_CACHE_DIR=1 9 | 10 | RUN apt-get update && apt-get -y upgrade 11 | 12 | RUN apt-get install --no-install-recommends -y \ 13 | python3-dev python3-wheel python3-setuptools virtualenv \ 14 | build-essential gcc curl \ 15 | libpq-dev libpq5 telnet 16 | 17 | RUN apt-get clean autoclean && \ 18 | apt-get autoremove -y && \ 19 | rm -rf /var/lib/{apt,dpkg,cache,log}/ 20 | 21 | # -------------------------------------- 22 | ENV APP_DIR=/app 23 | ENV APP_USER=app 24 | ENV PYTHONDONTWRITEBYTECODE=1 25 | ENV PYTHONBUFFERED=1 26 | 27 | RUN useradd -m -d ${APP_DIR} -U -r -s /bin/bash ${APP_USER} 28 | 29 | USER ${APP_USER} 30 | 31 | WORKDIR ${APP_DIR} 32 | 33 | # Create the virtual environment 34 | RUN python -m venv /app/env 35 | # Activate the virtual environment 36 | ENV PATH="$APP_DIR/env/bin:$PATH" 37 | 38 | COPY config/docker/sms_logger/requirements.txt requirements.txt 39 | 40 | RUN pip install -U pip wheel 41 | 42 | RUN pip install -r requirements.txt 43 | 44 | COPY --chown=$APP_USER config/docker/sms_logger/*.py . 45 | COPY --chown=$APP_USER config/docker/sms_logger/docker-entrypoint.sh docker-entrypoint.sh 46 | 47 | RUN mkdir -p $APP_DIR/resource 48 | 49 | ENTRYPOINT ["bash", "docker-entrypoint.sh"] 50 | 51 | -------------------------------------------------------------------------------- /config/docker/sms_logger/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | APP_DIR=${APP_DIR:-'/app'} 4 | APP_LOG_LEVEL=${APP_LOG_LEVEL:-'warn'} 5 | 6 | # shellcheck disable=SC2164 7 | cd "$APP_DIR" 8 | 9 | source "$APP_DIR"/env/bin/activate 10 | 11 | "$APP_DIR"/env/bin/python sms_logger.py -------------------------------------------------------------------------------- /config/docker/sms_logger/requirements.txt: -------------------------------------------------------------------------------- 1 | Twisted~=22.1.0 2 | txAMQP3~=0.9.3 3 | smpp.pdu3~=0.6 4 | smpp.twisted3~=0.7 5 | service_identity~=18.1.0 6 | python-dotenv 7 | jasmin 8 | psycopg2 9 | mysql-connector-python 10 | -------------------------------------------------------------------------------- /config/routing.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from django.utils.translation import gettext_lazy as _ 4 | from django.conf import settings 5 | from channels.auth import AuthMiddlewareStack 6 | from channels.routing import ProtocolTypeRouter, URLRouter 7 | 8 | from main.notify import routing as notify_routing 9 | 10 | application = ProtocolTypeRouter({ 11 | # (http->django views is added by default) 12 | 'websocket': AuthMiddlewareStack( 13 | URLRouter( 14 | notify_routing.websocket_urlpatterns 15 | ) 16 | ), 17 | }) -------------------------------------------------------------------------------- /config/settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/config/settings/__init__.py -------------------------------------------------------------------------------- /config/settings/dev.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from .com import * # noqa 3 | 4 | DATABASES = { 5 | 'default': env.db('DEVDB_URL', default='sqlite:///db.sqlite3') 6 | } 7 | DATABASES['default']['ATOMIC_REQUESTS'] = True 8 | 9 | ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['*']) -------------------------------------------------------------------------------- /config/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.conf import settings 3 | from django.conf.urls.static import static 4 | from django.urls import path, include 5 | 6 | urlpatterns = [ 7 | path('jet/', include('jet.urls', namespace="jet")), 8 | path('jet/dashboard/', include('jet.dashboard.urls', namespace="jet-dashboard")), 9 | path(settings.ADMIN_URL, admin.site.urls), 10 | path('account/', include('main.users.urls', namespace="users")), 11 | path('api/', include('main.api.urls', namespace="api")), 12 | path('i18n/', include('django.conf.urls.i18n')), 13 | path('', include('main.web.urls', namespace="web")), 14 | ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -------------------------------------------------------------------------------- /config/version.py: -------------------------------------------------------------------------------- 1 | VERSION = "3.0.1" 2 | -------------------------------------------------------------------------------- /config/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for config project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.pro') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /logs/.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | *.logs 3 | -------------------------------------------------------------------------------- /logs/clean.sh: -------------------------------------------------------------------------------- 1 | truncate -s 0 *.log -------------------------------------------------------------------------------- /main/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/__init__.py -------------------------------------------------------------------------------- /main/api/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /main/api/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoreConfig(AppConfig): 5 | name = "main.api" 6 | verbose_name = "API" 7 | -------------------------------------------------------------------------------- /main/api/urls.py: -------------------------------------------------------------------------------- 1 | from rest_framework.urlpatterns import format_suffix_patterns 2 | from django.urls import path, include 3 | 4 | from . import views 5 | 6 | app_name = 'api' 7 | 8 | urlpatterns = format_suffix_patterns([ 9 | path('groups/', include(arg=[ 10 | path('/enable/', view=views.groups_enable, name='groups_enable'), 11 | path('/disable/', view=views.groups_disable, name='groups_disable'), 12 | path('/', view=views.groups_detail, name='groups_detail'), 13 | path('', view=views.groups_list, name='groups_list'), 14 | ])), 15 | path('health_check', view=views.health_check, name="health_check") 16 | ]) 17 | -------------------------------------------------------------------------------- /main/api/views/__init__.py: -------------------------------------------------------------------------------- 1 | from .groups import ( 2 | groups_list, 3 | groups_detail, 4 | groups_enable, 5 | groups_disable, 6 | ) 7 | from .health_check import health_check -------------------------------------------------------------------------------- /main/api/views/filters.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/api/views/filters.py -------------------------------------------------------------------------------- /main/api/views/health_check.py: -------------------------------------------------------------------------------- 1 | from django.http import JsonResponse 2 | 3 | from config.version import VERSION 4 | 5 | 6 | def health_check(request): 7 | return JsonResponse({"version": VERSION}) 8 | -------------------------------------------------------------------------------- /main/api/views/httpccm.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/api/views/httpccm.py -------------------------------------------------------------------------------- /main/api/views/morouter.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/api/views/morouter.py -------------------------------------------------------------------------------- /main/api/views/mtrouter.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/api/views/mtrouter.py -------------------------------------------------------------------------------- /main/api/views/schema.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/api/views/schema.py -------------------------------------------------------------------------------- /main/api/views/smppccm.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/api/views/smppccm.py -------------------------------------------------------------------------------- /main/api/views/users.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/api/views/users.py -------------------------------------------------------------------------------- /main/core/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /main/core/admin/__init__.py: -------------------------------------------------------------------------------- 1 | from .activity_log import * 2 | from .adminsite import * 3 | from .currency import * 4 | from .emailserver import * 5 | from .submit_log import * 6 | from .tokenizer import * -------------------------------------------------------------------------------- /main/core/admin/activity_log.py: -------------------------------------------------------------------------------- 1 | from django.utils.translation import gettext, gettext_lazy as _ 2 | from django.contrib import admin, messages 3 | 4 | from ..utils import USER_SEARCH_FIELDS 5 | from ..models import ActivityLog 6 | 7 | 8 | @admin.register(ActivityLog) 9 | class ActivityLogAdmin(admin.ModelAdmin): 10 | list_display = ("ip", "user", "service", "method", "path",) 11 | list_filter = ("method", "service") 12 | search_fields = ("ip", "path",) + USER_SEARCH_FIELDS 13 | -------------------------------------------------------------------------------- /main/core/admin/adminsite.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.contrib.admin import AdminSite 3 | from django.conf import settings 4 | 5 | AdminSite.site_title = settings.SITE_TITLE 6 | AdminSite.site_header = settings.SITE_HEADER 7 | AdminSite.index_title = settings.INDEX_TITLE 8 | -------------------------------------------------------------------------------- /main/core/admin/currency.py: -------------------------------------------------------------------------------- 1 | from django.utils.translation import gettext, gettext_lazy as _ # noqa 2 | from django.contrib import admin 3 | 4 | from ..models import Currency 5 | 6 | 7 | @admin.register(Currency) 8 | class CurrencyAdmin(admin.ModelAdmin): 9 | list_display = ("enabled", "name", "code", "order",) 10 | list_filter = ("enabled",) 11 | search_fields = ("name", "code",) 12 | -------------------------------------------------------------------------------- /main/core/admin/emailserver.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from django.utils.translation import gettext_lazy as _ # noqa 3 | from django.contrib import admin 4 | 5 | from ..models import EmailServer 6 | 7 | 8 | @admin.register(EmailServer) 9 | class EmailServerAdmin(admin.ModelAdmin): 10 | list_display = ("server", "port", "ssl", "active", "username", "level",) 11 | list_filter = ("level",) 12 | search_fields = ("server", "username",) 13 | -------------------------------------------------------------------------------- /main/core/admin/submit_log.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from django.utils.translation import gettext_lazy as _ # noqa 3 | from django.contrib import admin 4 | 5 | from ..models import SubmitLog 6 | 7 | 8 | @admin.register(SubmitLog) 9 | class SubmitLogAdmin(admin.ModelAdmin): 10 | 11 | list_display = ("msgid", "source_connector", "routed_cid", "source_addr", "destination_addr", "rate", "pdu_count", 12 | "status", "uid", "trials", "created_at", "status_at",) 13 | list_filter = ("status",) 14 | search_fields = ("source_connector", "source_addr", "destination_addr",) 15 | date_hierarchy = "created_at" 16 | -------------------------------------------------------------------------------- /main/core/admin/tokenizer.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from django.utils.translation import gettext_lazy as _ # noqa 3 | from django.contrib import admin 4 | 5 | from ..models import Tokenizer 6 | 7 | 8 | @admin.register(Tokenizer) 9 | class TokenizerAdmin(admin.ModelAdmin): 10 | list_display = ("guid", "uidb64", "token",) 11 | search_fields = ("guid",) 12 | -------------------------------------------------------------------------------- /main/core/apps.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals, absolute_import 3 | 4 | from django.apps import AppConfig 5 | from django.utils.translation import gettext_lazy as _ 6 | 7 | 8 | class CoreConfig(AppConfig): 9 | name = "main.core" 10 | verbose_name = _("Preferences") 11 | -------------------------------------------------------------------------------- /main/core/context_processors.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | from config.version import VERSION 4 | 5 | 6 | def site(request): 7 | return { 8 | "SETTINGS": settings, 9 | "VERSION": VERSION, 10 | } 11 | -------------------------------------------------------------------------------- /main/core/mailer/__init__.py: -------------------------------------------------------------------------------- 1 | from .mail_modules import PyMail, PyMailMultiPart -------------------------------------------------------------------------------- /main/core/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/core/management/__init__.py -------------------------------------------------------------------------------- /main/core/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/core/management/commands/__init__.py -------------------------------------------------------------------------------- /main/core/management/commands/samples.py: -------------------------------------------------------------------------------- 1 | from django.core.management.base import BaseCommand, CommandError 2 | from django.core.management import call_command 3 | from django.conf import settings 4 | 5 | from main.users.models import User 6 | from main.core.models import Currency, EmailServer 7 | 8 | 9 | class Command(BaseCommand): 10 | help = "Add default data to database" 11 | def handle(self, *args, **options): 12 | call_command("migrate") 13 | EmailServer.objects.get_or_create( 14 | server="mail.example.com", 15 | port=587, 16 | username="info@example.com", 17 | password="123456", 18 | ssl=False, 19 | active=False, 20 | ) 21 | self.stdout.write("Default Email Server Added") 22 | user1, created = User.objects.get_or_create(pk=1) 23 | if created: 24 | user1.username = "admin" 25 | user1.first_name = "Chris" 26 | user1.last_name = "Daughtry" 27 | user1.email = "admin@example.com" 28 | user1.set_password("secret") 29 | user1.is_active = True 30 | user1.is_staff = True 31 | user1.is_superuser = True 32 | user1.is_email = True 33 | user1.is_verified = True 34 | user1.save() 35 | self.stdout.write("Default User Added") 36 | currencies = [ 37 | Currency( 38 | name="Turkish Lira", 39 | code="TL", 40 | code3="TRY", 41 | symbol="₺", 42 | order=1, 43 | ), 44 | Currency( 45 | name="United State Dollar", 46 | code="US", 47 | code3="USD", 48 | symbol="$", 49 | order=2, 50 | ), 51 | Currency( 52 | name="Euro", 53 | code="EU", 54 | code3="EUR", 55 | symbol="€", 56 | order=3, 57 | ), 58 | ] 59 | Currency.objects.bulk_create(currencies) 60 | self.stdout.write("Default Currencies Added") -------------------------------------------------------------------------------- /main/core/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/core/migrations/__init__.py -------------------------------------------------------------------------------- /main/core/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .activity_log import ActivityLog 2 | from .currency import Currency, get_available_currencies 3 | from .emailserver import EmailServer, get_available_server 4 | from .guid import GuidModel, Tokenizer 5 | from .submit_log import SubmitLog 6 | from .timestamped import TimeStampedModel 7 | 8 | from .smpp import ( 9 | FiltersModel, 10 | GroupsModel, 11 | UsersModel, 12 | HTTPccmModel, 13 | SMPPccmModel, 14 | MORoutersModel, 15 | MTRoutersModel, 16 | ) -------------------------------------------------------------------------------- /main/core/models/currency.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from django.utils.translation import gettext_lazy as _ 4 | from django.core.validators import MaxValueValidator, MinValueValidator 5 | from django.core.exceptions import ValidationError 6 | from django.db import models 7 | 8 | from autoslug import AutoSlugField 9 | from .timestamped import TimeStampedModel 10 | import decimal 11 | 12 | class Currency(models.Model): 13 | class Meta: 14 | verbose_name = _("Currency") 15 | verbose_name_plural = _("Currencies") 16 | ordering = ("enabled", "order",) 17 | enabled = models.BooleanField(_("Is Enabled"), default=True) 18 | name = models.CharField(_("Currency Name"), max_length=64) 19 | slug = AutoSlugField(populate_from='name', unique=True) 20 | code = models.CharField(_("Currency Code"), max_length=8) 21 | code3 = models.CharField(_("Currency Code 3"), max_length=8, blank=True, null=True) 22 | symbol = models.CharField(_("Currency Symbol"), max_length=8, blank=True, null=True) 23 | order = models.PositiveIntegerField(_("Currency Order")) 24 | def __str__(self): 25 | return self.name 26 | def get_dict(self): 27 | return { 28 | "pk": self.pk, 29 | "enabled": self.enabled, 30 | "name": self.name, 31 | "slug": self.slug, 32 | "code": self.code, 33 | "order": self.order, 34 | } 35 | 36 | def get_available_currencies(): 37 | return Currency.objects.values_list('code', flat=True) -------------------------------------------------------------------------------- /main/core/models/emailserver.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from __future__ import unicode_literals, absolute_import 3 | from django.utils.translation import gettext_lazy as _ 4 | from django.core.exceptions import ValidationError 5 | from django.db import models 6 | 7 | from .timestamped import TimeStampedModel 8 | 9 | class EmailServer(TimeStampedModel): 10 | class Meta: 11 | verbose_name = _("Email Server") 12 | verbose_name_plural = _("Email Servers") 13 | ADMIN = "admin" 14 | SECURITY = "security" 15 | INFO = "info" 16 | ACCOUNTTYPES = ( 17 | (ADMIN, _("Administration"),), 18 | (SECURITY, _("Security"),), 19 | (INFO, _("Information"),), 20 | ) 21 | server = models.CharField(_("Server"), max_length=50) 22 | port = models.PositiveIntegerField(_("Port")) 23 | username = models.CharField(_("Username / Email"), max_length=50) 24 | password = models.CharField(_("Password"), max_length=50) 25 | ssl = models.BooleanField(_("SSL Support"), default=True) 26 | level = models.CharField(_("Account Type"), max_length=24, default=INFO, choices=ACCOUNTTYPES) 27 | active = models.BooleanField(_("Is Active"), default=True) 28 | 29 | def __str__(self): 30 | return self.server 31 | 32 | def get_available_server(): 33 | return EmailServer.objects.filter(active=True).first() -------------------------------------------------------------------------------- /main/core/models/guid.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from django.utils.translation import gettext_lazy as _ 4 | from django.db import models 5 | from uuid import uuid4 6 | 7 | class GuidModel(models.Model): 8 | guid = models.UUIDField(unique=True, default=uuid4, editable=False, verbose_name=_("Unique ID"), 9 | help_text=_("This field is automatically determined by the system, do not interfere.") 10 | ) 11 | class Meta: 12 | abstract = True 13 | def get_dict(self): 14 | return { 15 | "guid": str(self.guid), 16 | } 17 | def getuid(self): 18 | return str(self.guid) 19 | 20 | class Tokenizer(GuidModel): 21 | class Meta: 22 | verbose_name = _("Tokenizer") 23 | verbose_name_plural = verbose_name 24 | uidb64 = models.CharField(max_length=255) 25 | token = models.CharField(max_length=255) 26 | def __str__(self): 27 | return str(self.guid) -------------------------------------------------------------------------------- /main/core/models/timestamped.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from django.utils.translation import gettext_lazy as _ 4 | from django.db import models 5 | from django.utils import timezone 6 | from django.utils.timesince import timesince 7 | 8 | class TimeStampedModel(models.Model): 9 | """ 10 | Abstract base class that provides self-updating 'created' and 'modified' fields. 11 | """ 12 | created = models.DateTimeField(auto_now_add=True) 13 | modified = models.DateTimeField(auto_now=True) 14 | 15 | class Meta: 16 | abstract = True 17 | def get_dict(self): 18 | from main.core.utils import readable_date_format 19 | return { 20 | "created": timezone.localtime(self.created).isoformat() if self.created else None, 21 | "createdf": readable_date_format(timezone.localtime(self.created)) if self.created else None, 22 | "createds": timesince(self.created) if self.created else None, 23 | "modified": timezone.localtime( self.modified).isoformat() if self.modified else None, 24 | "modifiedf": readable_date_format(timezone.localtime(self.modified)) if self.modified else None, 25 | "modifieds": timesince(self.modified) if self.modified else None, 26 | "isedited": self.isedited, 27 | } 28 | @property 29 | def isedited(self): 30 | return False if self.created.strftime('%Y-%m-%d %H:%M:%S') == self.modified.strftime('%Y-%m-%d %H:%M:%S') else True 31 | -------------------------------------------------------------------------------- /main/core/notify/__init__.py: -------------------------------------------------------------------------------- 1 | from .mail_sender import send_mail_reset_password, send_mail_reset_email 2 | -------------------------------------------------------------------------------- /main/core/smpp/__init__.py: -------------------------------------------------------------------------------- 1 | from .groups import Groups 2 | from .users import Users 3 | from .morouter import MORouter 4 | from .mtrouter import MTRouter 5 | from .smppccm import SMPPCCM 6 | from .httpccm import HTTPCCM 7 | from .filters import Filters 8 | 9 | __all__ = [ 10 | 'Groups', 11 | 'Users', 12 | 'MORouter', 13 | 'MTRouter', 14 | 'SMPPCCM', 15 | 'HTTPCCM', 16 | 'Filters', 17 | ] -------------------------------------------------------------------------------- /main/core/smpp/conn.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | import pexpect 4 | 5 | from ..exceptions import TelnetUnexpectedResponse, TelnetConnectionTimeout, TelnetLoginFailed 6 | 7 | class TelnetConnection(object): 8 | def __init__(self): 9 | try: 10 | telnet = pexpect.spawn("telnet %s %s" % (settings.TELNET_HOST, settings.TELNET_PORT), timeout=settings.TELNET_TIMEOUT,) 11 | telnet.expect_exact('Username: ') 12 | telnet.sendline(settings.TELNET_USERNAME) 13 | telnet.expect_exact('Password: ') 14 | telnet.sendline(settings.TELNET_PW) 15 | except pexpect.EOF: 16 | raise TelnetUnexpectedResponse 17 | except pexpect.TIMEOUT: 18 | raise TelnetConnectionTimeout 19 | try: 20 | telnet.expect_exact(settings.STANDARD_PROMPT) 21 | except pexpect.EOF: 22 | raise TelnetLoginFailed 23 | else: 24 | self.telnet = telnet 25 | def __del__(self): 26 | "Make sure telnet connection is closed when unleashing response back to client" 27 | try: 28 | self.telnet.sendline('quit') 29 | except pexpect.ExceptionPexpect: 30 | self.telnet.kill(9) -------------------------------------------------------------------------------- /main/core/tasks/__init__.py: -------------------------------------------------------------------------------- 1 | from .mail_html import mail_html_mails, mail_html_envelopes 2 | -------------------------------------------------------------------------------- /main/core/tasks/mail_html.py: -------------------------------------------------------------------------------- 1 | from typing import List 2 | from django.utils import translation 3 | # from django.template.loader import render_to_string 4 | from django.conf import settings 5 | 6 | from main.core.mailer import PyMail, PyMailMultiPart 7 | from config.celery import app 8 | 9 | 10 | @app.task(bind=True) 11 | def mail_html_mails(self, mails: List[str], subject: str, html_template: str, kwargs=None, 12 | lang: str = settings.LANGUAGE_CODE): 13 | if kwargs is None: 14 | kwargs = {} 15 | translation.activate(lang) 16 | mail = PyMailMultiPart(subject=subject, html_template=html_template, ) 17 | mail.send(mails=mails, kwargs=kwargs) 18 | 19 | 20 | @app.task(bind=True) 21 | def mail_html_envelopes(self, envelopes, subject: str, html_template: str, lang: str = settings.LANGUAGE_CODE): 22 | """ 23 | e.g envelopes = {"name": "Joe Life", "email": "info@domain.com", "kwargs": "Dictionary of extra"} 24 | 25 | kwargs = { 26 | users : {"username": "joe_user", "email": "joe@gmail.com", "name": "Joe Life"}, 27 | site_name : "My Company", 28 | logo_url : "http://www.g.com/logo.png", 29 | site_url : "http://www.g.com", 30 | logo : '{}'.format(site_url, site_url, logo_url) 31 | } 32 | """ 33 | translation.activate(lang) 34 | mail = PyMailMultiPart(subject=subject, html_template=html_template, ) 35 | mail.send_envelopes(envelopes=envelopes) 36 | -------------------------------------------------------------------------------- /main/core/templates/core/mail_base.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | 4 | 5 | 6 | Email 7 | 37 | 38 | 39 | 40 | 41 | {% block content1 %}{% endblock content1 %} 42 | 43 |
44 | 45 | -------------------------------------------------------------------------------- /main/core/utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .boolean import is_date, is_decimal, is_float, is_int, is_json 2 | from .common import ( 3 | get_query, 4 | timestamp2datetime, 5 | readable_date_format, 6 | get_client_ip, 7 | str2date, 8 | display_form_validations, 9 | shorten_large_number, 10 | password_generator, 11 | paginate, 12 | is_online, 13 | get_current_site, 14 | ) 15 | from .cryptograph import * 16 | from .json_encoder import LazyEncoder 17 | from .tokens import email_active_token, reset_password_token 18 | from .vars import USER_SEARCH_FIELDS 19 | from .user_agent import get_user_agent, get_and_set_user_agent 20 | -------------------------------------------------------------------------------- /main/core/utils/boolean.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from django.utils.translation import gettext_lazy as _ 4 | from django.conf import settings 5 | 6 | from dateutil.parser import parse 7 | from decimal import Decimal 8 | import json 9 | 10 | def is_json(string): 11 | try: 12 | json.loads(string) 13 | except: 14 | return False 15 | return True 16 | def is_int(string): 17 | try: 18 | int(string) 19 | except: 20 | return False 21 | return True 22 | def is_float(string): 23 | try: 24 | float(string) 25 | except: 26 | return False 27 | return True 28 | def is_decimal(string): 29 | try: 30 | Decimal(string) 31 | except: 32 | return False 33 | return True 34 | 35 | def is_date(string): 36 | try: 37 | parse(string) 38 | return True 39 | except: 40 | return False -------------------------------------------------------------------------------- /main/core/utils/cryptograph.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from django.utils.translation import gettext_lazy as _ 4 | import base64 5 | from random import randint 6 | import hashlib 7 | 8 | def md5(data): 9 | data_hash = hashlib.md5() 10 | data_hash.update(str(data).encode('utf-8')) 11 | return str(data_hash.hexdigest()) 12 | 13 | def sha1(data): 14 | data_hash = hashlib.sha1() 15 | data_hash.update(str(data).encode('utf-8')) 16 | return str(data_hash.hexdigest()) 17 | 18 | def sha256(data): 19 | data_hash = hashlib.sha256() 20 | data_hash.update(str(data).encode('utf-8')) 21 | return str(data_hash.hexdigest()) 22 | 23 | def sha512(data): 24 | data_hash = hashlib.sha512() 25 | data_hash.update(str(data).encode('utf-8')) 26 | return str(data_hash.hexdigest()) 27 | -------------------------------------------------------------------------------- /main/core/utils/json_encoder.py: -------------------------------------------------------------------------------- 1 | from django.utils.functional import Promise 2 | from django.utils.encoding import force_str 3 | from django.core.serializers.json import DjangoJSONEncoder 4 | 5 | class LazyEncoder(DjangoJSONEncoder): 6 | def default(self, obj): 7 | if isinstance(obj, Promise): 8 | return force_str(obj) 9 | return super(LazyEncoder, self).default(obj) -------------------------------------------------------------------------------- /main/core/utils/tokens.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.tokens import PasswordResetTokenGenerator 2 | from django.conf import settings 3 | 4 | 5 | class EmailActiveTokenGenerator(PasswordResetTokenGenerator): 6 | def _make_hash_value(self, user, timestamp): 7 | return ( 8 | str(user.pk) + str(timestamp) + 9 | str(user.email) + str(user.pin) + 10 | str(user.last_name) + str(user.first_name) 11 | ) 12 | 13 | 14 | email_active_token = EmailActiveTokenGenerator() 15 | 16 | 17 | class RestPasswordTokenGenerator(PasswordResetTokenGenerator): 18 | def _make_hash_value(self, user, timestamp): 19 | return ( 20 | str(user.pk) + str(timestamp) + 21 | str(user.email) + str(user.pin) + 22 | str(user.last_name) + str(settings.SECRET_KEY) + str(timestamp) 23 | ) 24 | 25 | 26 | reset_password_token = RestPasswordTokenGenerator() 27 | -------------------------------------------------------------------------------- /main/core/utils/vars.py: -------------------------------------------------------------------------------- 1 | 2 | USER_SEARCH_FIELDS = ("user__first_name", "user__last_name", "user__email", "user__username",) -------------------------------------------------------------------------------- /main/locale/README.md: -------------------------------------------------------------------------------- 1 | ## Commands that used in django translations 2 | 3 | ```sh 4 | cd django-aio/main/ 5 | 6 | django-admin makemessages -l en 7 | 8 | django-admin compilemessages 9 | ``` -------------------------------------------------------------------------------- /main/static/assets/css/base.css: -------------------------------------------------------------------------------- 1 | /*import all css here in one file*/ 2 | @import url("https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"); 3 | @import url("sb-admin-2.min.css"); 4 | @import url("../vendor/fa5/css/all.min.css"); 5 | @import url("../vendor/toastr/toastr.min.css"); 6 | @import url("../vendor/sweetalert/sweetalert.css"); 7 | 8 | .iframe_error {width:100%;height:100%;border: #efefef 1px solid;} -------------------------------------------------------------------------------- /main/static/assets/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/static/assets/img/favicon.ico -------------------------------------------------------------------------------- /main/static/assets/img/jasmin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/static/assets/img/jasmin.jpg -------------------------------------------------------------------------------- /main/static/assets/img/jasmin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/static/assets/img/jasmin.png -------------------------------------------------------------------------------- /main/static/assets/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/static/assets/img/user.png -------------------------------------------------------------------------------- /main/static/assets/js/sb-admin-2.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin 2 v4.0.7 (https://startbootstrap.com/template-overviews/sb-admin-2) 3 | * Copyright 2013-2019 Start Bootstrap 4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-sb-admin-2/blob/master/LICENSE) 5 | */ 6 | 7 | !function(t){"use strict";t("#sidebarToggle, #sidebarToggleTop").on("click",function(o){t("body").toggleClass("sidebar-toggled"),t(".sidebar").toggleClass("toggled"),t(".sidebar").hasClass("toggled")&&t(".sidebar .collapse").collapse("hide")}),t(window).resize(function(){t(window).width()<768&&t(".sidebar .collapse").collapse("hide")}),t("body.fixed-nav .sidebar").on("mousewheel DOMMouseScroll wheel",function(o){if(768 13 | * Translated default messages for the jQuery validation plugin. 14 | * Locale: GE (Georgian; ქართული) 15 | */ 16 | $.extend( $.validator.messages, { 17 | required: "ეს ველი სავალდებულოა", 18 | remote: "გთხოვთ შეასწოროთ.", 19 | email: "გთხოვთ შეიყვანოთ სწორი ფორმატით.", 20 | url: "გთხოვთ შეიყვანოთ სწორი ფორმატით.", 21 | date: "გთხოვთ შეიყვანოთ სწორი თარიღი.", 22 | dateISO: "გთხოვთ შეიყვანოთ სწორი ფორმატით (ISO).", 23 | number: "გთხოვთ შეიყვანოთ რიცხვი.", 24 | digits: "დაშვებულია მხოლოდ ციფრები.", 25 | creditcard: "გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.", 26 | equalTo: "გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.", 27 | maxlength: $.validator.format( "გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი." ), 28 | minlength: $.validator.format( "შეიყვანეთ მინიმუმ {0} სიმბოლო." ), 29 | rangelength: $.validator.format( "გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები." ), 30 | range: $.validator.format( "შეიყვანეთ {0} -სა {1} -ს შორის." ), 31 | max: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს." ), 32 | min: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ge.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"ეს ველი სავალდებულოა",remote:"გთხოვთ შეასწოროთ.",email:"გთხოვთ შეიყვანოთ სწორი ფორმატით.",url:"გთხოვთ შეიყვანოთ სწორი ფორმატით.",date:"გთხოვთ შეიყვანოთ სწორი თარიღი.",dateISO:"გთხოვთ შეიყვანოთ სწორი ფორმატით (ISO).",number:"გთხოვთ შეიყვანოთ რიცხვი.",digits:"დაშვებულია მხოლოდ ციფრები.",creditcard:"გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.",equalTo:"გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.",maxlength:a.validator.format("გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი."),minlength:a.validator.format("შეიყვანეთ მინიმუმ {0} სიმბოლო."),rangelength:a.validator.format("გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები."),range:a.validator.format("შეიყვანეთ {0} -სა {1} -ს შორის."),max:a.validator.format("გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს."),min:a.validator.format("გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_gl.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return function(a){a.extend(a.validator.messages,{required:"Este campo é obrigatorio.",remote:"Por favor, cubre este campo.",email:"Por favor, escribe unha dirección de correo válida.",url:"Por favor, escribe unha URL válida.",date:"Por favor, escribe unha data válida.",dateISO:"Por favor, escribe unha data (ISO) válida.",number:"Por favor, escribe un número válido.",digits:"Por favor, escribe só díxitos.",creditcard:"Por favor, escribe un número de tarxeta válido.",equalTo:"Por favor, escribe o mesmo valor de novo.",extension:"Por favor, escribe un valor cunha extensión aceptada.",maxlength:a.validator.format("Por favor, non escribas máis de {0} caracteres."),minlength:a.validator.format("Por favor, non escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribe un valor entre {0} e {1} caracteres."),range:a.validator.format("Por favor, escribe un valor entre {0} e {1}."),max:a.validator.format("Por favor, escribe un valor menor ou igual a {0}."),min:a.validator.format("Por favor, escribe un valor maior ou igual a {0}."),nifES:"Por favor, escribe un NIF válido.",nieES:"Por favor, escribe un NIE válido.",cifES:"Por favor, escribe un CIF válido."})}(jQuery),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_he.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: HE (Hebrew; עברית) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "השדה הזה הינו שדה חובה", 17 | remote: "נא לתקן שדה זה", 18 | email: "נא למלא כתובת דוא\"ל חוקית", 19 | url: "נא למלא כתובת אינטרנט חוקית", 20 | date: "נא למלא תאריך חוקי", 21 | dateISO: "נא למלא תאריך חוקי (ISO)", 22 | number: "נא למלא מספר", 23 | digits: "נא למלא רק מספרים", 24 | creditcard: "נא למלא מספר כרטיס אשראי חוקי", 25 | equalTo: "נא למלא את אותו ערך שוב", 26 | extension: "נא למלא ערך עם סיומת חוקית", 27 | maxlength: $.validator.format( ".נא לא למלא יותר מ- {0} תווים" ), 28 | minlength: $.validator.format( "נא למלא לפחות {0} תווים" ), 29 | rangelength: $.validator.format( "נא למלא ערך בין {0} ל- {1} תווים" ), 30 | range: $.validator.format( "נא למלא ערך בין {0} ל- {1}" ), 31 | max: $.validator.format( "נא למלא ערך קטן או שווה ל- {0}" ), 32 | min: $.validator.format( "נא למלא ערך גדול או שווה ל- {0}" ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_he.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"השדה הזה הינו שדה חובה",remote:"נא לתקן שדה זה",email:'נא למלא כתובת דוא"ל חוקית',url:"נא למלא כתובת אינטרנט חוקית",date:"נא למלא תאריך חוקי",dateISO:"נא למלא תאריך חוקי (ISO)",number:"נא למלא מספר",digits:"נא למלא רק מספרים",creditcard:"נא למלא מספר כרטיס אשראי חוקי",equalTo:"נא למלא את אותו ערך שוב",extension:"נא למלא ערך עם סיומת חוקית",maxlength:a.validator.format(".נא לא למלא יותר מ- {0} תווים"),minlength:a.validator.format("נא למלא לפחות {0} תווים"),rangelength:a.validator.format("נא למלא ערך בין {0} ל- {1} תווים"),range:a.validator.format("נא למלא ערך בין {0} ל- {1}"),max:a.validator.format("נא למלא ערך קטן או שווה ל- {0}"),min:a.validator.format("נא למלא ערך גדול או שווה ל- {0}")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_hr.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: HR (Croatia; hrvatski jezik) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Ovo polje je obavezno.", 17 | remote: "Ovo polje treba popraviti.", 18 | email: "Unesite ispravnu e-mail adresu.", 19 | url: "Unesite ispravan URL.", 20 | date: "Unesite ispravan datum.", 21 | dateISO: "Unesite ispravan datum (ISO).", 22 | number: "Unesite ispravan broj.", 23 | digits: "Unesite samo brojeve.", 24 | creditcard: "Unesite ispravan broj kreditne kartice.", 25 | equalTo: "Unesite ponovo istu vrijednost.", 26 | extension: "Unesite vrijednost sa ispravnom ekstenzijom.", 27 | maxlength: $.validator.format( "Maksimalni broj znakova je {0} ." ), 28 | minlength: $.validator.format( "Minimalni broj znakova je {0} ." ), 29 | rangelength: $.validator.format( "Unesite vrijednost između {0} i {1} znakova." ), 30 | range: $.validator.format( "Unesite vrijednost između {0} i {1}." ), 31 | max: $.validator.format( "Unesite vrijednost manju ili jednaku {0}." ), 32 | min: $.validator.format( "Unesite vrijednost veću ili jednaku {0}." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_hr.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Ovo polje je obavezno.",remote:"Ovo polje treba popraviti.",email:"Unesite ispravnu e-mail adresu.",url:"Unesite ispravan URL.",date:"Unesite ispravan datum.",dateISO:"Unesite ispravan datum (ISO).",number:"Unesite ispravan broj.",digits:"Unesite samo brojeve.",creditcard:"Unesite ispravan broj kreditne kartice.",equalTo:"Unesite ponovo istu vrijednost.",extension:"Unesite vrijednost sa ispravnom ekstenzijom.",maxlength:a.validator.format("Maksimalni broj znakova je {0} ."),minlength:a.validator.format("Minimalni broj znakova je {0} ."),rangelength:a.validator.format("Unesite vrijednost između {0} i {1} znakova."),range:a.validator.format("Unesite vrijednost između {0} i {1}."),max:a.validator.format("Unesite vrijednost manju ili jednaku {0}."),min:a.validator.format("Unesite vrijednost veću ili jednaku {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_hu.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: HU (Hungarian; Magyar) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Kötelező megadni.", 17 | maxlength: $.validator.format( "Legfeljebb {0} karakter hosszú legyen." ), 18 | minlength: $.validator.format( "Legalább {0} karakter hosszú legyen." ), 19 | rangelength: $.validator.format( "Legalább {0} és legfeljebb {1} karakter hosszú legyen." ), 20 | email: "Érvényes e-mail címnek kell lennie.", 21 | url: "Érvényes URL-nek kell lennie.", 22 | date: "Dátumnak kell lennie.", 23 | number: "Számnak kell lennie.", 24 | digits: "Csak számjegyek lehetnek.", 25 | equalTo: "Meg kell egyeznie a két értéknek.", 26 | range: $.validator.format( "{0} és {1} közé kell esnie." ), 27 | max: $.validator.format( "Nem lehet nagyobb, mint {0}." ), 28 | min: $.validator.format( "Nem lehet kisebb, mint {0}." ), 29 | creditcard: "Érvényes hitelkártyaszámnak kell lennie.", 30 | remote: "Kérem javítsa ki ezt a mezőt.", 31 | dateISO: "Kérem írjon be egy érvényes dátumot (ISO).", 32 | step: $.validator.format( "A {0} egyik többszörösét adja meg." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_hu.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Kötelező megadni.",maxlength:a.validator.format("Legfeljebb {0} karakter hosszú legyen."),minlength:a.validator.format("Legalább {0} karakter hosszú legyen."),rangelength:a.validator.format("Legalább {0} és legfeljebb {1} karakter hosszú legyen."),email:"Érvényes e-mail címnek kell lennie.",url:"Érvényes URL-nek kell lennie.",date:"Dátumnak kell lennie.",number:"Számnak kell lennie.",digits:"Csak számjegyek lehetnek.",equalTo:"Meg kell egyeznie a két értéknek.",range:a.validator.format("{0} és {1} közé kell esnie."),max:a.validator.format("Nem lehet nagyobb, mint {0}."),min:a.validator.format("Nem lehet kisebb, mint {0}."),creditcard:"Érvényes hitelkártyaszámnak kell lennie.",remote:"Kérem javítsa ki ezt a mezőt.",dateISO:"Kérem írjon be egy érvényes dátumot (ISO).",step:a.validator.format("A {0} egyik többszörösét adja meg.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_hy_AM.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: HY_AM (Armenian; հայերեն լեզու) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Պարտադիր լրացման դաշտ", 17 | remote: "Ներմուծեք ճիշտ արժեքը", 18 | email: "Ներմուծեք վավեր էլեկտրոնային փոստի հասցե", 19 | url: "Ներմուծեք վավեր URL", 20 | date: "Ներմուծեք վավեր ամսաթիվ", 21 | dateISO: "Ներմուծեք ISO ֆորմատով վավեր ամսաթիվ։", 22 | number: "Ներմուծեք թիվ", 23 | digits: "Ներմուծեք միայն թվեր", 24 | creditcard: "Ներմուծեք ճիշտ բանկային քարտի համար", 25 | equalTo: "Ներմուծեք միևնուն արժեքը ևս մեկ անգամ", 26 | extension: "Ընտրեք ճիշտ ընդլանումով ֆայլ", 27 | maxlength: $.validator.format( "Ներմուծեք ոչ ավել քան {0} նիշ" ), 28 | minlength: $.validator.format( "Ներմուծեք ոչ պակաս քան {0} նիշ" ), 29 | rangelength: $.validator.format( "Ներմուծեք {0}֊ից {1} երկարությամբ արժեք" ), 30 | range: $.validator.format( "Ներմուծեք թիվ {0}֊ից {1} միջակայքում" ), 31 | max: $.validator.format( "Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին" ), 32 | min: $.validator.format( "Ներմուծեք թիվ, որը մեծ կամ հավասար է {0}֊ին" ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_hy_AM.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Պարտադիր լրացման դաշտ",remote:"Ներմուծեք ճիշտ արժեքը",email:"Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",url:"Ներմուծեք վավեր URL",date:"Ներմուծեք վավեր ամսաթիվ",dateISO:"Ներմուծեք ISO ֆորմատով վավեր ամսաթիվ։",number:"Ներմուծեք թիվ",digits:"Ներմուծեք միայն թվեր",creditcard:"Ներմուծեք ճիշտ բանկային քարտի համար",equalTo:"Ներմուծեք միևնուն արժեքը ևս մեկ անգամ",extension:"Ընտրեք ճիշտ ընդլանումով ֆայլ",maxlength:a.validator.format("Ներմուծեք ոչ ավել քան {0} նիշ"),minlength:a.validator.format("Ներմուծեք ոչ պակաս քան {0} նիշ"),rangelength:a.validator.format("Ներմուծեք {0}֊ից {1} երկարությամբ արժեք"),range:a.validator.format("Ներմուծեք թիվ {0}֊ից {1} միջակայքում"),max:a.validator.format("Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին"),min:a.validator.format("Ներմուծեք թիվ, որը մեծ կամ հավասար է {0}֊ին")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_id.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: ID (Indonesia; Indonesian) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Kolom ini diperlukan.", 17 | remote: "Harap benarkan kolom ini.", 18 | email: "Silakan masukkan format email yang benar.", 19 | url: "Silakan masukkan format URL yang benar.", 20 | date: "Silakan masukkan format tanggal yang benar.", 21 | dateISO: "Silakan masukkan format tanggal(ISO) yang benar.", 22 | number: "Silakan masukkan angka yang benar.", 23 | digits: "Harap masukan angka saja.", 24 | creditcard: "Harap masukkan format kartu kredit yang benar.", 25 | equalTo: "Harap masukkan nilai yg sama dengan sebelumnya.", 26 | maxlength: $.validator.format( "Input dibatasi hanya {0} karakter." ), 27 | minlength: $.validator.format( "Input tidak kurang dari {0} karakter." ), 28 | rangelength: $.validator.format( "Panjang karakter yg diizinkan antara {0} dan {1} karakter." ), 29 | range: $.validator.format( "Harap masukkan nilai antara {0} dan {1}." ), 30 | max: $.validator.format( "Harap masukkan nilai lebih kecil atau sama dengan {0}." ), 31 | min: $.validator.format( "Harap masukkan nilai lebih besar atau sama dengan {0}." ) 32 | } ); 33 | return $; 34 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_id.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Kolom ini diperlukan.",remote:"Harap benarkan kolom ini.",email:"Silakan masukkan format email yang benar.",url:"Silakan masukkan format URL yang benar.",date:"Silakan masukkan format tanggal yang benar.",dateISO:"Silakan masukkan format tanggal(ISO) yang benar.",number:"Silakan masukkan angka yang benar.",digits:"Harap masukan angka saja.",creditcard:"Harap masukkan format kartu kredit yang benar.",equalTo:"Harap masukkan nilai yg sama dengan sebelumnya.",maxlength:a.validator.format("Input dibatasi hanya {0} karakter."),minlength:a.validator.format("Input tidak kurang dari {0} karakter."),rangelength:a.validator.format("Panjang karakter yg diizinkan antara {0} dan {1} karakter."),range:a.validator.format("Harap masukkan nilai antara {0} dan {1}."),max:a.validator.format("Harap masukkan nilai lebih kecil atau sama dengan {0}."),min:a.validator.format("Harap masukkan nilai lebih besar atau sama dengan {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_is.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: IS (Icelandic; íslenska) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Þessi reitur er nauðsynlegur.", 17 | remote: "Lagaðu þennan reit.", 18 | maxlength: $.validator.format( "Sláðu inn mest {0} stafi." ), 19 | minlength: $.validator.format( "Sláðu inn minnst {0} stafi." ), 20 | rangelength: $.validator.format( "Sláðu inn minnst {0} og mest {1} stafi." ), 21 | email: "Sláðu inn gilt netfang.", 22 | url: "Sláðu inn gilda vefslóð.", 23 | date: "Sláðu inn gilda dagsetningu.", 24 | number: "Sláðu inn tölu.", 25 | digits: "Sláðu inn tölustafi eingöngu.", 26 | equalTo: "Sláðu sama gildi inn aftur.", 27 | range: $.validator.format( "Sláðu inn gildi milli {0} og {1}." ), 28 | max: $.validator.format( "Sláðu inn gildi sem er minna en eða jafnt og {0}." ), 29 | min: $.validator.format( "Sláðu inn gildi sem er stærra en eða jafnt og {0}." ), 30 | creditcard: "Sláðu inn gilt greiðslukortanúmer." 31 | } ); 32 | return $; 33 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_is.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Þessi reitur er nauðsynlegur.",remote:"Lagaðu þennan reit.",maxlength:a.validator.format("Sláðu inn mest {0} stafi."),minlength:a.validator.format("Sláðu inn minnst {0} stafi."),rangelength:a.validator.format("Sláðu inn minnst {0} og mest {1} stafi."),email:"Sláðu inn gilt netfang.",url:"Sláðu inn gilda vefslóð.",date:"Sláðu inn gilda dagsetningu.",number:"Sláðu inn tölu.",digits:"Sláðu inn tölustafi eingöngu.",equalTo:"Sláðu sama gildi inn aftur.",range:a.validator.format("Sláðu inn gildi milli {0} og {1}."),max:a.validator.format("Sláðu inn gildi sem er minna en eða jafnt og {0}."),min:a.validator.format("Sláðu inn gildi sem er stærra en eða jafnt og {0}."),creditcard:"Sláðu inn gilt greiðslukortanúmer."}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_it.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Campo obbligatorio",remote:"Controlla questo campo",email:"Inserisci un indirizzo email valido",url:"Inserisci un indirizzo web valido",date:"Inserisci una data valida",dateISO:"Inserisci una data valida (ISO)",number:"Inserisci un numero valido",digits:"Inserisci solo numeri",creditcard:"Inserisci un numero di carta di credito valido",equalTo:"Il valore non corrisponde",extension:"Inserisci un valore con un'estensione valida",maxlength:a.validator.format("Non inserire più di {0} caratteri"),minlength:a.validator.format("Inserisci almeno {0} caratteri"),rangelength:a.validator.format("Inserisci un valore compreso tra {0} e {1} caratteri"),range:a.validator.format("Inserisci un valore compreso tra {0} e {1}"),max:a.validator.format("Inserisci un valore minore o uguale a {0}"),min:a.validator.format("Inserisci un valore maggiore o uguale a {0}"),nifES:"Inserisci un NIF valido",nieES:"Inserisci un NIE valido",cifES:"Inserisci un CIF valido",currency:"Inserisci una valuta valida"}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ja.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: JA (Japanese; 日本語) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "このフィールドは必須です。", 17 | remote: "このフィールドを修正してください。", 18 | email: "有効なEメールアドレスを入力してください。", 19 | url: "有効なURLを入力してください。", 20 | date: "有効な日付を入力してください。", 21 | dateISO: "有効な日付(ISO)を入力してください。", 22 | number: "有効な数字を入力してください。", 23 | digits: "数字のみを入力してください。", 24 | creditcard: "有効なクレジットカード番号を入力してください。", 25 | equalTo: "同じ値をもう一度入力してください。", 26 | extension: "有効な拡張子を含む値を入力してください。", 27 | maxlength: $.validator.format( "{0} 文字以内で入力してください。" ), 28 | minlength: $.validator.format( "{0} 文字以上で入力してください。" ), 29 | rangelength: $.validator.format( "{0} 文字から {1} 文字までの値を入力してください。" ), 30 | range: $.validator.format( "{0} から {1} までの値を入力してください。" ), 31 | step: $.validator.format( "{0} の倍数を入力してください。" ), 32 | max: $.validator.format( "{0} 以下の値を入力してください。" ), 33 | min: $.validator.format( "{0} 以上の値を入力してください。" ) 34 | } ); 35 | return $; 36 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ja.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"このフィールドは必須です。",remote:"このフィールドを修正してください。",email:"有効なEメールアドレスを入力してください。",url:"有効なURLを入力してください。",date:"有効な日付を入力してください。",dateISO:"有効な日付(ISO)を入力してください。",number:"有効な数字を入力してください。",digits:"数字のみを入力してください。",creditcard:"有効なクレジットカード番号を入力してください。",equalTo:"同じ値をもう一度入力してください。",extension:"有効な拡張子を含む値を入力してください。",maxlength:a.validator.format("{0} 文字以内で入力してください。"),minlength:a.validator.format("{0} 文字以上で入力してください。"),rangelength:a.validator.format("{0} 文字から {1} 文字までの値を入力してください。"),range:a.validator.format("{0} から {1} までの値を入力してください。"),step:a.validator.format("{0} の倍数を入力してください。"),max:a.validator.format("{0} 以下の値を入力してください。"),min:a.validator.format("{0} 以上の値を入力してください。")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ka.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: KA (Georgian; ქართული) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "ამ ველის შევსება აუცილებელია.", 17 | remote: "გთხოვთ მიუთითოთ სწორი მნიშვნელობა.", 18 | email: "გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.", 19 | url: "გთხოვთ მიუთითოთ კორექტული URL.", 20 | date: "გთხოვთ მიუთითოთ კორექტული თარიღი.", 21 | dateISO: "გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.", 22 | number: "გთხოვთ მიუთითოთ ციფრი.", 23 | digits: "გთხოვთ მიუთითოთ მხოლოდ ციფრები.", 24 | creditcard: "გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.", 25 | equalTo: "გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.", 26 | extension: "გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.", 27 | maxlength: $.validator.format( "დასაშვებია არაუმეტეს {0} სიმბოლო." ), 28 | minlength: $.validator.format( "აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო." ), 29 | rangelength: $.validator.format( "ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე." ), 30 | range: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე." ), 31 | max: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს." ), 32 | min: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ka.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"ამ ველის შევსება აუცილებელია.",remote:"გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",email:"გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",url:"გთხოვთ მიუთითოთ კორექტული URL.",date:"გთხოვთ მიუთითოთ კორექტული თარიღი.",dateISO:"გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.",number:"გთხოვთ მიუთითოთ ციფრი.",digits:"გთხოვთ მიუთითოთ მხოლოდ ციფრები.",creditcard:"გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",equalTo:"გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",extension:"გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",maxlength:a.validator.format("დასაშვებია არაუმეტეს {0} სიმბოლო."),minlength:a.validator.format("აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო."),rangelength:a.validator.format("ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე."),range:a.validator.format("გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე."),max:a.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს."),min:a.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_kk.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Бұл өрісті міндетті түрде толтырыңыз.",remote:"Дұрыс мағына енгізуіңізді сұраймыз.",email:"Нақты электронды поштаңызды енгізуіңізді сұраймыз.",url:"Нақты URL-ды енгізуіңізді сұраймыз.",date:"Нақты URL-ды енгізуіңізді сұраймыз.",dateISO:"Нақты ISO форматымен сәйкес датасын енгізуіңізді сұраймыз.",number:"Күнді енгізуіңізді сұраймыз.",digits:"Тек қана сандарды енгізуіңізді сұраймыз.",creditcard:"Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",equalTo:"Осы мәнді қайта енгізуіңізді сұраймыз.",extension:"Файлдың кеңейтуін дұрыс таңдаңыз.",maxlength:a.validator.format("Ұзындығы {0} символдан көр болмасын."),minlength:a.validator.format("Ұзындығы {0} символдан аз болмасын."),rangelength:a.validator.format("Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз."),range:a.validator.format("Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз."),max:a.validator.format("{0} аз немесе тең санын енгізуіңіді сұраймыз."),min:a.validator.format("{0} көп немесе тең санын енгізуіңізді сұраймыз.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ko.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: KO (Korean; 한국어) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "필수 항목입니다.", 17 | remote: "항목을 수정하세요.", 18 | email: "유효하지 않은 E-Mail주소입니다.", 19 | url: "유효하지 않은 URL입니다.", 20 | date: "올바른 날짜를 입력하세요.", 21 | dateISO: "올바른 날짜(ISO)를 입력하세요.", 22 | number: "유효한 숫자가 아닙니다.", 23 | digits: "숫자만 입력 가능합니다.", 24 | creditcard: "신용카드 번호가 바르지 않습니다.", 25 | equalTo: "같은 값을 다시 입력하세요.", 26 | extension: "올바른 확장자가 아닙니다.", 27 | maxlength: $.validator.format( "{0}자를 넘을 수 없습니다. " ), 28 | minlength: $.validator.format( "{0}자 이상 입력하세요." ), 29 | rangelength: $.validator.format( "문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요." ), 30 | range: $.validator.format( "{0} 에서 {1} 사이의 값을 입력하세요." ), 31 | max: $.validator.format( "{0} 이하의 값을 입력하세요." ), 32 | min: $.validator.format( "{0} 이상의 값을 입력하세요." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ko.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"필수 항목입니다.",remote:"항목을 수정하세요.",email:"유효하지 않은 E-Mail주소입니다.",url:"유효하지 않은 URL입니다.",date:"올바른 날짜를 입력하세요.",dateISO:"올바른 날짜(ISO)를 입력하세요.",number:"유효한 숫자가 아닙니다.",digits:"숫자만 입력 가능합니다.",creditcard:"신용카드 번호가 바르지 않습니다.",equalTo:"같은 값을 다시 입력하세요.",extension:"올바른 확장자가 아닙니다.",maxlength:a.validator.format("{0}자를 넘을 수 없습니다. "),minlength:a.validator.format("{0}자 이상 입력하세요."),rangelength:a.validator.format("문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요."),range:a.validator.format("{0} 에서 {1} 사이의 값을 입력하세요."),max:a.validator.format("{0} 이하의 값을 입력하세요."),min:a.validator.format("{0} 이상의 값을 입력하세요.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_lt.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: LT (Lithuanian; lietuvių kalba) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Šis laukas yra privalomas.", 17 | remote: "Prašau pataisyti šį lauką.", 18 | email: "Prašau įvesti teisingą elektroninio pašto adresą.", 19 | url: "Prašau įvesti teisingą URL.", 20 | date: "Prašau įvesti teisingą datą.", 21 | dateISO: "Prašau įvesti teisingą datą (ISO).", 22 | number: "Prašau įvesti teisingą skaičių.", 23 | digits: "Prašau naudoti tik skaitmenis.", 24 | creditcard: "Prašau įvesti teisingą kreditinės kortelės numerį.", 25 | equalTo: "Prašau įvestį tą pačią reikšmę dar kartą.", 26 | extension: "Prašau įvesti reikšmę su teisingu plėtiniu.", 27 | maxlength: $.validator.format( "Prašau įvesti ne daugiau kaip {0} simbolių." ), 28 | minlength: $.validator.format( "Prašau įvesti bent {0} simbolius." ), 29 | rangelength: $.validator.format( "Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių." ), 30 | range: $.validator.format( "Prašau įvesti reikšmę intervale nuo {0} iki {1}." ), 31 | max: $.validator.format( "Prašau įvesti reikšmę mažesnę arba lygią {0}." ), 32 | min: $.validator.format( "Prašau įvesti reikšmę didesnę arba lygią {0}." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_lt.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Šis laukas yra privalomas.",remote:"Prašau pataisyti šį lauką.",email:"Prašau įvesti teisingą elektroninio pašto adresą.",url:"Prašau įvesti teisingą URL.",date:"Prašau įvesti teisingą datą.",dateISO:"Prašau įvesti teisingą datą (ISO).",number:"Prašau įvesti teisingą skaičių.",digits:"Prašau naudoti tik skaitmenis.",creditcard:"Prašau įvesti teisingą kreditinės kortelės numerį.",equalTo:"Prašau įvestį tą pačią reikšmę dar kartą.",extension:"Prašau įvesti reikšmę su teisingu plėtiniu.",maxlength:a.validator.format("Prašau įvesti ne daugiau kaip {0} simbolių."),minlength:a.validator.format("Prašau įvesti bent {0} simbolius."),rangelength:a.validator.format("Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių."),range:a.validator.format("Prašau įvesti reikšmę intervale nuo {0} iki {1}."),max:a.validator.format("Prašau įvesti reikšmę mažesnę arba lygią {0}."),min:a.validator.format("Prašau įvesti reikšmę didesnę arba lygią {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_lv.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: LV (Latvian; latviešu valoda) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Šis lauks ir obligāts.", 17 | remote: "Lūdzu, pārbaudiet šo lauku.", 18 | email: "Lūdzu, ievadiet derīgu e-pasta adresi.", 19 | url: "Lūdzu, ievadiet derīgu URL adresi.", 20 | date: "Lūdzu, ievadiet derīgu datumu.", 21 | dateISO: "Lūdzu, ievadiet derīgu datumu (ISO).", 22 | number: "Lūdzu, ievadiet derīgu numuru.", 23 | digits: "Lūdzu, ievadiet tikai ciparus.", 24 | creditcard: "Lūdzu, ievadiet derīgu kredītkartes numuru.", 25 | equalTo: "Lūdzu, ievadiet to pašu vēlreiz.", 26 | extension: "Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.", 27 | maxlength: $.validator.format( "Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes." ), 28 | minlength: $.validator.format( "Lūdzu, ievadiet vismaz {0} rakstzīmes." ), 29 | rangelength: $.validator.format( "Lūdzu ievadiet {0} līdz {1} rakstzīmes." ), 30 | range: $.validator.format( "Lūdzu, ievadiet skaitli no {0} līdz {1}." ), 31 | max: $.validator.format( "Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}." ), 32 | min: $.validator.format( "Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_lv.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Šis lauks ir obligāts.",remote:"Lūdzu, pārbaudiet šo lauku.",email:"Lūdzu, ievadiet derīgu e-pasta adresi.",url:"Lūdzu, ievadiet derīgu URL adresi.",date:"Lūdzu, ievadiet derīgu datumu.",dateISO:"Lūdzu, ievadiet derīgu datumu (ISO).",number:"Lūdzu, ievadiet derīgu numuru.",digits:"Lūdzu, ievadiet tikai ciparus.",creditcard:"Lūdzu, ievadiet derīgu kredītkartes numuru.",equalTo:"Lūdzu, ievadiet to pašu vēlreiz.",extension:"Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",maxlength:a.validator.format("Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes."),minlength:a.validator.format("Lūdzu, ievadiet vismaz {0} rakstzīmes."),rangelength:a.validator.format("Lūdzu ievadiet {0} līdz {1} rakstzīmes."),range:a.validator.format("Lūdzu, ievadiet skaitli no {0} līdz {1}."),max:a.validator.format("Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}."),min:a.validator.format("Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_mk.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: MK (Macedonian; македонски јазик) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Полето е задолжително.", 17 | remote: "Поправете го ова поле", 18 | email: "Внесете правилна e-mail адреса", 19 | url: "Внесете правилен URL.", 20 | date: "Внесете правилен датум", 21 | dateISO: "Внесете правилен датум (ISO).", 22 | number: "Внесете правилен број.", 23 | digits: "Внесете само бројки.", 24 | creditcard: "Внесете правилен број на кредитната картичка.", 25 | equalTo: "Внесете ја истата вредност повторно.", 26 | extension: "Внесете вредност со соодветна екстензија.", 27 | maxlength: $.validator.format( "Внесете максимално {0} знаци." ), 28 | minlength: $.validator.format( "Внесете барем {0} знаци." ), 29 | rangelength: $.validator.format( "Внесете вредност со должина помеѓу {0} и {1} знаци." ), 30 | range: $.validator.format( "Внесете вредност помеѓу {0} и {1}." ), 31 | max: $.validator.format( "Внесете вредност помала или еднаква на {0}." ), 32 | min: $.validator.format( "Внесете вредност поголема или еднаква на {0}" ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_mk.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Полето е задолжително.",remote:"Поправете го ова поле",email:"Внесете правилна e-mail адреса",url:"Внесете правилен URL.",date:"Внесете правилен датум",dateISO:"Внесете правилен датум (ISO).",number:"Внесете правилен број.",digits:"Внесете само бројки.",creditcard:"Внесете правилен број на кредитната картичка.",equalTo:"Внесете ја истата вредност повторно.",extension:"Внесете вредност со соодветна екстензија.",maxlength:a.validator.format("Внесете максимално {0} знаци."),minlength:a.validator.format("Внесете барем {0} знаци."),rangelength:a.validator.format("Внесете вредност со должина помеѓу {0} и {1} знаци."),range:a.validator.format("Внесете вредност помеѓу {0} и {1}."),max:a.validator.format("Внесете вредност помала или еднаква на {0}."),min:a.validator.format("Внесете вредност поголема или еднаква на {0}")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_my.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: MY (Malay; Melayu) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Medan ini diperlukan.", 17 | remote: "Sila betulkan medan ini.", 18 | email: "Sila masukkan alamat emel yang betul.", 19 | url: "Sila masukkan URL yang betul.", 20 | date: "Sila masukkan tarikh yang betul.", 21 | dateISO: "Sila masukkan tarikh(ISO) yang betul.", 22 | number: "Sila masukkan nombor yang betul.", 23 | digits: "Sila masukkan nilai digit sahaja.", 24 | creditcard: "Sila masukkan nombor kredit kad yang betul.", 25 | equalTo: "Sila masukkan nilai yang sama semula.", 26 | extension: "Sila masukkan nilai yang telah diterima.", 27 | maxlength: $.validator.format( "Sila masukkan tidak lebih dari {0} aksara." ), 28 | minlength: $.validator.format( "Sila masukkan sekurang-kurangnya {0} aksara." ), 29 | rangelength: $.validator.format( "Sila masukkan antara {0} dan {1} panjang aksara." ), 30 | range: $.validator.format( "Sila masukkan nilai antara {0} dan {1} aksara." ), 31 | max: $.validator.format( "Sila masukkan nilai yang kurang atau sama dengan {0}." ), 32 | min: $.validator.format( "Sila masukkan nilai yang lebih atau sama dengan {0}." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_my.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Medan ini diperlukan.",remote:"Sila betulkan medan ini.",email:"Sila masukkan alamat emel yang betul.",url:"Sila masukkan URL yang betul.",date:"Sila masukkan tarikh yang betul.",dateISO:"Sila masukkan tarikh(ISO) yang betul.",number:"Sila masukkan nombor yang betul.",digits:"Sila masukkan nilai digit sahaja.",creditcard:"Sila masukkan nombor kredit kad yang betul.",equalTo:"Sila masukkan nilai yang sama semula.",extension:"Sila masukkan nilai yang telah diterima.",maxlength:a.validator.format("Sila masukkan tidak lebih dari {0} aksara."),minlength:a.validator.format("Sila masukkan sekurang-kurangnya {0} aksara."),rangelength:a.validator.format("Sila masukkan antara {0} dan {1} panjang aksara."),range:a.validator.format("Sila masukkan nilai antara {0} dan {1} aksara."),max:a.validator.format("Sila masukkan nilai yang kurang atau sama dengan {0}."),min:a.validator.format("Sila masukkan nilai yang lebih atau sama dengan {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_no.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: NO (Norwegian; Norsk) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Angi en verdi.", 17 | remote: "Ugyldig verdi.", 18 | email: "Angi en gyldig epostadresse.", 19 | url: "Angi en gyldig URL.", 20 | date: "Angi en gyldig dato.", 21 | dateISO: "Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).", 22 | number: "Angi et gyldig tall.", 23 | digits: "Skriv kun tall.", 24 | equalTo: "Skriv samme verdi igjen.", 25 | maxlength: $.validator.format( "Maksimalt {0} tegn." ), 26 | minlength: $.validator.format( "Minimum {0} tegn." ), 27 | rangelength: $.validator.format( "Angi minimum {0} og maksimum {1} tegn." ), 28 | range: $.validator.format( "Angi en verdi mellom {0} og {1}." ), 29 | max: $.validator.format( "Angi en verdi som er mindre eller lik {0}." ), 30 | min: $.validator.format( "Angi en verdi som er større eller lik {0}." ), 31 | step: $.validator.format( "Angi en verdi ganger {0}." ), 32 | creditcard: "Angi et gyldig kredittkortnummer." 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_no.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Angi en verdi.",remote:"Ugyldig verdi.",email:"Angi en gyldig epostadresse.",url:"Angi en gyldig URL.",date:"Angi en gyldig dato.",dateISO:"Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",number:"Angi et gyldig tall.",digits:"Skriv kun tall.",equalTo:"Skriv samme verdi igjen.",maxlength:a.validator.format("Maksimalt {0} tegn."),minlength:a.validator.format("Minimum {0} tegn."),rangelength:a.validator.format("Angi minimum {0} og maksimum {1} tegn."),range:a.validator.format("Angi en verdi mellom {0} og {1}."),max:a.validator.format("Angi en verdi som er mindre eller lik {0}."),min:a.validator.format("Angi en verdi som er større eller lik {0}."),step:a.validator.format("Angi en verdi ganger {0}."),creditcard:"Angi et gyldig kredittkortnummer."}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_pl.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"To pole jest wymagane.",remote:"Proszę o wypełnienie tego pola.",email:"Proszę o podanie prawidłowego adresu email.",url:"Proszę o podanie prawidłowego URL.",date:"Proszę o podanie prawidłowej daty.",dateISO:"Proszę o podanie prawidłowej daty (ISO).",number:"Proszę o podanie prawidłowej liczby.",digits:"Proszę o podanie samych cyfr.",creditcard:"Proszę o podanie prawidłowej karty kredytowej.",equalTo:"Proszę o podanie tej samej wartości ponownie.",extension:"Proszę o podanie wartości z prawidłowym rozszerzeniem.",nipPL:"Proszę o podanie prawidłowego numeru NIP.",phonePL:"Proszę o podanie prawidłowego numeru telefonu",maxlength:a.validator.format("Proszę o podanie nie więcej niż {0} znaków."),minlength:a.validator.format("Proszę o podanie przynajmniej {0} znaków."),rangelength:a.validator.format("Proszę o podanie wartości o długości od {0} do {1} znaków."),range:a.validator.format("Proszę o podanie wartości z przedziału od {0} do {1}."),max:a.validator.format("Proszę o podanie wartości mniejszej bądź równej {0}."),min:a.validator.format("Proszę o podanie wartości większej bądź równej {0}."),pattern:a.validator.format("Pole zawiera niedozwolone znaki.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ro.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Acest câmp este obligatoriu.",remote:"Te rugăm să completezi acest câmp.",email:"Te rugăm să introduci o adresă de email validă",url:"Te rugăm sa introduci o adresă URL validă.",date:"Te rugăm să introduci o dată corectă.",dateISO:"Te rugăm să introduci o dată (ISO) corectă.",number:"Te rugăm să introduci un număr întreg valid.",digits:"Te rugăm să introduci doar cifre.",creditcard:"Te rugăm să introduci un numar de carte de credit valid.",equalTo:"Te rugăm să reintroduci valoarea.",extension:"Te rugăm să introduci o valoare cu o extensie validă.",maxlength:a.validator.format("Te rugăm să nu introduci mai mult de {0} caractere."),minlength:a.validator.format("Te rugăm să introduci cel puțin {0} caractere."),rangelength:a.validator.format("Te rugăm să introduci o valoare între {0} și {1} caractere."),range:a.validator.format("Te rugăm să introduci o valoare între {0} și {1}."),max:a.validator.format("Te rugăm să introduci o valoare egal sau mai mică decât {0}."),min:a.validator.format("Te rugăm să introduci o valoare egal sau mai mare decât {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ru.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Это поле необходимо заполнить.",remote:"Пожалуйста, введите правильное значение.",email:"Пожалуйста, введите корректный адрес электронной почты.",url:"Пожалуйста, введите корректный URL.",date:"Пожалуйста, введите корректную дату.",dateISO:"Пожалуйста, введите корректную дату в формате ISO.",number:"Пожалуйста, введите число.",digits:"Пожалуйста, вводите только цифры.",creditcard:"Пожалуйста, введите правильный номер кредитной карты.",equalTo:"Пожалуйста, введите такое же значение ещё раз.",extension:"Пожалуйста, выберите файл с правильным расширением.",maxlength:a.validator.format("Пожалуйста, введите не больше {0} символов."),minlength:a.validator.format("Пожалуйста, введите не меньше {0} символов."),rangelength:a.validator.format("Пожалуйста, введите значение длиной от {0} до {1} символов."),range:a.validator.format("Пожалуйста, введите число от {0} до {1}."),max:a.validator.format("Пожалуйста, введите число, меньшее или равное {0}."),min:a.validator.format("Пожалуйста, введите число, большее или равное {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sd.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: SD (Sindhi; سنڌي) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "هنن جاين جي ضرورت آهي", 17 | remote: "هنن جاين جي ضرورت آهي", 18 | email: "لکيل اي ميل غلط آهي", 19 | url: "لکيل ايڊريس غلط آهي", 20 | date: "لکيل تاريخ غلط آهي", 21 | dateISO: "جي معيار جي مطابق نه آهي (ISO) لکيل تاريخ", 22 | number: "لکيل انگ صحيح ناهي", 23 | digits: "رڳو انگ داخل ڪري سگهجي ٿو", 24 | creditcard: "لکيل ڪارڊ نمبر صحيح نه آهي", 25 | equalTo: "داخل ٿيل ڀيٽ صحيح نه آهي", 26 | extension: "لکيل غلط آهي", 27 | maxlength: $.validator.format( "وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي" ), 28 | minlength: $.validator.format( "گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي" ), 29 | rangelength: $.validator.format( "داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي" ), 30 | range: $.validator.format( "داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي" ), 31 | max: $.validator.format( "وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي" ), 32 | min: $.validator.format( "گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي" ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sd.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"هنن جاين جي ضرورت آهي",remote:"هنن جاين جي ضرورت آهي",email:"لکيل اي ميل غلط آهي",url:"لکيل ايڊريس غلط آهي",date:"لکيل تاريخ غلط آهي",dateISO:"جي معيار جي مطابق نه آهي (ISO) لکيل تاريخ",number:"لکيل انگ صحيح ناهي",digits:"رڳو انگ داخل ڪري سگهجي ٿو",creditcard:"لکيل ڪارڊ نمبر صحيح نه آهي",equalTo:"داخل ٿيل ڀيٽ صحيح نه آهي",extension:"لکيل غلط آهي",maxlength:a.validator.format("وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي"),minlength:a.validator.format("گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي"),rangelength:a.validator.format("داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي"),range:a.validator.format("داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي"),max:a.validator.format("وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي"),min:a.validator.format("گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_si.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: SI (Slovenian) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "To polje je obvezno.", 17 | remote: "Vpis v tem polju ni v pravi obliki.", 18 | email: "Prosimo, vnesite pravi email naslov.", 19 | url: "Prosimo, vnesite pravi URL.", 20 | date: "Prosimo, vnesite pravi datum.", 21 | dateISO: "Prosimo, vnesite pravi datum (ISO).", 22 | number: "Prosimo, vnesite pravo številko.", 23 | digits: "Prosimo, vnesite samo številke.", 24 | creditcard: "Prosimo, vnesite pravo številko kreditne kartice.", 25 | equalTo: "Prosimo, ponovno vnesite enako vsebino.", 26 | extension: "Prosimo, vnesite vsebino z pravo končnico.", 27 | maxlength: $.validator.format( "Prosimo, da ne vnašate več kot {0} znakov." ), 28 | minlength: $.validator.format( "Prosimo, vnesite vsaj {0} znakov." ), 29 | rangelength: $.validator.format( "Prosimo, vnesite od {0} do {1} znakov." ), 30 | range: $.validator.format( "Prosimo, vnesite vrednost med {0} in {1}." ), 31 | max: $.validator.format( "Prosimo, vnesite vrednost manjšo ali enako {0}." ), 32 | min: $.validator.format( "Prosimo, vnesite vrednost večjo ali enako {0}." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_si.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"To polje je obvezno.",remote:"Vpis v tem polju ni v pravi obliki.",email:"Prosimo, vnesite pravi email naslov.",url:"Prosimo, vnesite pravi URL.",date:"Prosimo, vnesite pravi datum.",dateISO:"Prosimo, vnesite pravi datum (ISO).",number:"Prosimo, vnesite pravo številko.",digits:"Prosimo, vnesite samo številke.",creditcard:"Prosimo, vnesite pravo številko kreditne kartice.",equalTo:"Prosimo, ponovno vnesite enako vsebino.",extension:"Prosimo, vnesite vsebino z pravo končnico.",maxlength:a.validator.format("Prosimo, da ne vnašate več kot {0} znakov."),minlength:a.validator.format("Prosimo, vnesite vsaj {0} znakov."),rangelength:a.validator.format("Prosimo, vnesite od {0} do {1} znakov."),range:a.validator.format("Prosimo, vnesite vrednost med {0} in {1}."),max:a.validator.format("Prosimo, vnesite vrednost manjšo ali enako {0}."),min:a.validator.format("Prosimo, vnesite vrednost večjo ali enako {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sk.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: SK (Slovak; slovenčina, slovenský jazyk) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Povinné zadať.", 17 | maxlength: $.validator.format( "Maximálne {0} znakov." ), 18 | minlength: $.validator.format( "Minimálne {0} znakov." ), 19 | rangelength: $.validator.format( "Minimálne {0} a maximálne {1} znakov." ), 20 | email: "E-mailová adresa musí byť platná.", 21 | url: "URL musí byť platná.", 22 | date: "Musí byť dátum.", 23 | number: "Musí byť číslo.", 24 | digits: "Môže obsahovať iba číslice.", 25 | equalTo: "Dve hodnoty sa musia rovnať.", 26 | range: $.validator.format( "Musí byť medzi {0} a {1}." ), 27 | max: $.validator.format( "Nemôže byť viac ako {0}." ), 28 | min: $.validator.format( "Nemôže byť menej ako {0}." ), 29 | creditcard: "Číslo platobnej karty musí byť platné.", 30 | step: $.validator.format( "Musí byť násobkom čísla {0}." ) 31 | } ); 32 | return $; 33 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sk.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Povinné zadať.",maxlength:a.validator.format("Maximálne {0} znakov."),minlength:a.validator.format("Minimálne {0} znakov."),rangelength:a.validator.format("Minimálne {0} a maximálne {1} znakov."),email:"E-mailová adresa musí byť platná.",url:"URL musí byť platná.",date:"Musí byť dátum.",number:"Musí byť číslo.",digits:"Môže obsahovať iba číslice.",equalTo:"Dve hodnoty sa musia rovnať.",range:a.validator.format("Musí byť medzi {0} a {1}."),max:a.validator.format("Nemôže byť viac ako {0}."),min:a.validator.format("Nemôže byť menej ako {0}."),creditcard:"Číslo platobnej karty musí byť platné.",step:a.validator.format("Musí byť násobkom čísla {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sl.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Language: SL (Slovenian; slovenski jezik) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "To polje je obvezno.", 17 | remote: "Prosimo popravite to polje.", 18 | email: "Prosimo vnesite veljaven email naslov.", 19 | url: "Prosimo vnesite veljaven URL naslov.", 20 | date: "Prosimo vnesite veljaven datum.", 21 | dateISO: "Prosimo vnesite veljaven ISO datum.", 22 | number: "Prosimo vnesite veljavno število.", 23 | digits: "Prosimo vnesite samo števila.", 24 | creditcard: "Prosimo vnesite veljavno številko kreditne kartice.", 25 | equalTo: "Prosimo ponovno vnesite vrednost.", 26 | extension: "Prosimo vnesite vrednost z veljavno končnico.", 27 | maxlength: $.validator.format( "Prosimo vnesite največ {0} znakov." ), 28 | minlength: $.validator.format( "Prosimo vnesite najmanj {0} znakov." ), 29 | rangelength: $.validator.format( "Prosimo vnesite najmanj {0} in največ {1} znakov." ), 30 | range: $.validator.format( "Prosimo vnesite vrednost med {0} in {1}." ), 31 | max: $.validator.format( "Prosimo vnesite vrednost manjše ali enako {0}." ), 32 | min: $.validator.format( "Prosimo vnesite vrednost večje ali enako {0}." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sl.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"To polje je obvezno.",remote:"Prosimo popravite to polje.",email:"Prosimo vnesite veljaven email naslov.",url:"Prosimo vnesite veljaven URL naslov.",date:"Prosimo vnesite veljaven datum.",dateISO:"Prosimo vnesite veljaven ISO datum.",number:"Prosimo vnesite veljavno število.",digits:"Prosimo vnesite samo števila.",creditcard:"Prosimo vnesite veljavno številko kreditne kartice.",equalTo:"Prosimo ponovno vnesite vrednost.",extension:"Prosimo vnesite vrednost z veljavno končnico.",maxlength:a.validator.format("Prosimo vnesite največ {0} znakov."),minlength:a.validator.format("Prosimo vnesite najmanj {0} znakov."),rangelength:a.validator.format("Prosimo vnesite najmanj {0} in največ {1} znakov."),range:a.validator.format("Prosimo vnesite vrednost med {0} in {1}."),max:a.validator.format("Prosimo vnesite vrednost manjše ali enako {0}."),min:a.validator.format("Prosimo vnesite vrednost večje ali enako {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sr.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: SR (Serbian; српски језик) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Поље је обавезно.", 17 | remote: "Средите ово поље.", 18 | email: "Унесите исправну и-мејл адресу.", 19 | url: "Унесите исправан URL.", 20 | date: "Унесите исправан датум.", 21 | dateISO: "Унесите исправан датум (ISO).", 22 | number: "Унесите исправан број.", 23 | digits: "Унесите само цифе.", 24 | creditcard: "Унесите исправан број кредитне картице.", 25 | equalTo: "Унесите исту вредност поново.", 26 | extension: "Унесите вредност са одговарајућом екстензијом.", 27 | maxlength: $.validator.format( "Унесите мање од {0} карактера." ), 28 | minlength: $.validator.format( "Унесите барем {0} карактера." ), 29 | rangelength: $.validator.format( "Унесите вредност дугачку између {0} и {1} карактера." ), 30 | range: $.validator.format( "Унесите вредност између {0} и {1}." ), 31 | max: $.validator.format( "Унесите вредност мању или једнаку {0}." ), 32 | min: $.validator.format( "Унесите вредност већу или једнаку {0}." ), 33 | step: $.validator.format( "Унесите вредност која је умножак броја {0}." ) 34 | } ); 35 | return $; 36 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sr.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Поље је обавезно.",remote:"Средите ово поље.",email:"Унесите исправну и-мејл адресу.",url:"Унесите исправан URL.",date:"Унесите исправан датум.",dateISO:"Унесите исправан датум (ISO).",number:"Унесите исправан број.",digits:"Унесите само цифе.",creditcard:"Унесите исправан број кредитне картице.",equalTo:"Унесите исту вредност поново.",extension:"Унесите вредност са одговарајућом екстензијом.",maxlength:a.validator.format("Унесите мање од {0} карактера."),minlength:a.validator.format("Унесите барем {0} карактера."),rangelength:a.validator.format("Унесите вредност дугачку између {0} и {1} карактера."),range:a.validator.format("Унесите вредност између {0} и {1}."),max:a.validator.format("Унесите вредност мању или једнаку {0}."),min:a.validator.format("Унесите вредност већу или једнаку {0}."),step:a.validator.format("Унесите вредност која је умножак броја {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sr_lat.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: SR (Serbian - Latin alphabet; srpski jezik - latinica) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Polje je obavezno.", 17 | remote: "Sredite ovo polje.", 18 | email: "Unesite ispravnu e-mail adresu", 19 | url: "Unesite ispravan URL.", 20 | date: "Unesite ispravan datum.", 21 | dateISO: "Unesite ispravan datum (ISO).", 22 | number: "Unesite ispravan broj.", 23 | digits: "Unesite samo cifre.", 24 | creditcard: "Unesite ispravan broj kreditne kartice.", 25 | equalTo: "Unesite istu vrednost ponovo.", 26 | extension: "Unesite vrednost sa odgovarajućom ekstenzijom.", 27 | maxlength: $.validator.format( "Unesite manje od {0} karaktera." ), 28 | minlength: $.validator.format( "Unesite barem {0} karaktera." ), 29 | rangelength: $.validator.format( "Unesite vrednost dugačku između {0} i {1} karaktera." ), 30 | range: $.validator.format( "Unesite vrednost između {0} i {1}." ), 31 | max: $.validator.format( "Unesite vrednost manju ili jednaku {0}." ), 32 | min: $.validator.format( "Unesite vrednost veću ili jednaku {0}." ), 33 | step: $.validator.format( "Unesite vrednost koja je umnožak broja {0}." ) 34 | } ); 35 | return $; 36 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sr_lat.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Polje je obavezno.",remote:"Sredite ovo polje.",email:"Unesite ispravnu e-mail adresu",url:"Unesite ispravan URL.",date:"Unesite ispravan datum.",dateISO:"Unesite ispravan datum (ISO).",number:"Unesite ispravan broj.",digits:"Unesite samo cifre.",creditcard:"Unesite ispravan broj kreditne kartice.",equalTo:"Unesite istu vrednost ponovo.",extension:"Unesite vrednost sa odgovarajućom ekstenzijom.",maxlength:a.validator.format("Unesite manje od {0} karaktera."),minlength:a.validator.format("Unesite barem {0} karaktera."),rangelength:a.validator.format("Unesite vrednost dugačku između {0} i {1} karaktera."),range:a.validator.format("Unesite vrednost između {0} i {1}."),max:a.validator.format("Unesite vrednost manju ili jednaku {0}."),min:a.validator.format("Unesite vrednost veću ili jednaku {0}."),step:a.validator.format("Unesite vrednost koja je umnožak broja {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sv.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: SV (Swedish; Svenska) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Detta fält är obligatoriskt.", 17 | remote: "Var snäll och åtgärda detta fält.", 18 | maxlength: $.validator.format( "Du får ange högst {0} tecken." ), 19 | minlength: $.validator.format( "Du måste ange minst {0} tecken." ), 20 | rangelength: $.validator.format( "Ange minst {0} och max {1} tecken." ), 21 | email: "Ange en korrekt e-postadress.", 22 | url: "Ange en korrekt URL.", 23 | date: "Ange ett korrekt datum.", 24 | dateISO: "Ange ett korrekt datum (ÅÅÅÅ-MM-DD).", 25 | number: "Ange ett korrekt nummer.", 26 | digits: "Ange endast siffror.", 27 | equalTo: "Ange samma värde igen.", 28 | range: $.validator.format( "Ange ett värde mellan {0} och {1}." ), 29 | max: $.validator.format( "Ange ett värde som är mindre eller lika med {0}." ), 30 | min: $.validator.format( "Ange ett värde som är större eller lika med {0}." ), 31 | creditcard: "Ange ett korrekt kreditkortsnummer.", 32 | pattern: "Ogiltigt format." 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_sv.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Detta fält är obligatoriskt.",remote:"Var snäll och åtgärda detta fält.",maxlength:a.validator.format("Du får ange högst {0} tecken."),minlength:a.validator.format("Du måste ange minst {0} tecken."),rangelength:a.validator.format("Ange minst {0} och max {1} tecken."),email:"Ange en korrekt e-postadress.",url:"Ange en korrekt URL.",date:"Ange ett korrekt datum.",dateISO:"Ange ett korrekt datum (ÅÅÅÅ-MM-DD).",number:"Ange ett korrekt nummer.",digits:"Ange endast siffror.",equalTo:"Ange samma värde igen.",range:a.validator.format("Ange ett värde mellan {0} och {1}."),max:a.validator.format("Ange ett värde som är mindre eller lika med {0}."),min:a.validator.format("Ange ett värde som är större eller lika med {0}."),creditcard:"Ange ett korrekt kreditkortsnummer.",pattern:"Ogiltigt format."}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_th.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: TH (Thai; ไทย) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "โปรดระบุ", 17 | remote: "โปรดแก้ไขให้ถูกต้อง", 18 | email: "โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง", 19 | url: "โปรดระบุ URL ที่ถูกต้อง", 20 | date: "โปรดระบุวันที่ ที่ถูกต้อง", 21 | dateISO: "โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).", 22 | number: "โปรดระบุทศนิยมที่ถูกต้อง", 23 | digits: "โปรดระบุจำนวนเต็มที่ถูกต้อง", 24 | creditcard: "โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง", 25 | equalTo: "โปรดระบุค่าเดิมอีกครั้ง", 26 | extension: "โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง", 27 | maxlength: $.validator.format( "โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ" ), 28 | minlength: $.validator.format( "โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ" ), 29 | rangelength: $.validator.format( "โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ" ), 30 | range: $.validator.format( "โปรดระบุค่าระหว่าง {0} และ {1}" ), 31 | max: $.validator.format( "โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}" ), 32 | min: $.validator.format( "โปรดระบุค่ามากกว่าหรือเท่ากับ {0}" ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_th.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"โปรดระบุ",remote:"โปรดแก้ไขให้ถูกต้อง",email:"โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",url:"โปรดระบุ URL ที่ถูกต้อง",date:"โปรดระบุวันที่ ที่ถูกต้อง",dateISO:"โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).",number:"โปรดระบุทศนิยมที่ถูกต้อง",digits:"โปรดระบุจำนวนเต็มที่ถูกต้อง",creditcard:"โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",equalTo:"โปรดระบุค่าเดิมอีกครั้ง",extension:"โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",maxlength:a.validator.format("โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ"),minlength:a.validator.format("โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ"),rangelength:a.validator.format("โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ"),range:a.validator.format("โปรดระบุค่าระหว่าง {0} และ {1}"),max:a.validator.format("โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}"),min:a.validator.format("โปรดระบุค่ามากกว่าหรือเท่ากับ {0}")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_tj.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: TJ (Tajikistan; Забони тоҷикӣ) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Ворид кардани ин филд маҷбури аст.", 17 | remote: "Илтимос, маълумоти саҳеҳ ворид кунед.", 18 | email: "Илтимос, почтаи электронии саҳеҳ ворид кунед.", 19 | url: "Илтимос, URL адреси саҳеҳ ворид кунед.", 20 | date: "Илтимос, таърихи саҳеҳ ворид кунед.", 21 | dateISO: "Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.", 22 | number: "Илтимос, рақамҳои саҳеҳ ворид кунед.", 23 | digits: "Илтимос, танҳо рақам ворид кунед.", 24 | creditcard: "Илтимос, кредит карди саҳеҳ ворид кунед.", 25 | equalTo: "Илтимос, миқдори баробар ворид кунед.", 26 | extension: "Илтимос, қофияи файлро дуруст интихоб кунед", 27 | maxlength: $.validator.format( "Илтимос, бештар аз {0} рамз ворид накунед." ), 28 | minlength: $.validator.format( "Илтимос, камтар аз {0} рамз ворид накунед." ), 29 | rangelength: $.validator.format( "Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед." ), 30 | range: $.validator.format( "Илтимос, аз {0} то {1} рақам зиёд ворид кунед." ), 31 | max: $.validator.format( "Илтимос, бештар аз {0} рақам ворид накунед." ), 32 | min: $.validator.format( "Илтимос, камтар аз {0} рақам ворид накунед." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_tj.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Ворид кардани ин филд маҷбури аст.",remote:"Илтимос, маълумоти саҳеҳ ворид кунед.",email:"Илтимос, почтаи электронии саҳеҳ ворид кунед.",url:"Илтимос, URL адреси саҳеҳ ворид кунед.",date:"Илтимос, таърихи саҳеҳ ворид кунед.",dateISO:"Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.",number:"Илтимос, рақамҳои саҳеҳ ворид кунед.",digits:"Илтимос, танҳо рақам ворид кунед.",creditcard:"Илтимос, кредит карди саҳеҳ ворид кунед.",equalTo:"Илтимос, миқдори баробар ворид кунед.",extension:"Илтимос, қофияи файлро дуруст интихоб кунед",maxlength:a.validator.format("Илтимос, бештар аз {0} рамз ворид накунед."),minlength:a.validator.format("Илтимос, камтар аз {0} рамз ворид накунед."),rangelength:a.validator.format("Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед."),range:a.validator.format("Илтимос, аз {0} то {1} рақам зиёд ворид кунед."),max:a.validator.format("Илтимос, бештар аз {0} рақам ворид накунед."),min:a.validator.format("Илтимос, камтар аз {0} рақам ворид накунед.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_tr.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Bu alanın doldurulması zorunludur.",remote:"Lütfen bu alanı düzeltin.",email:"Lütfen geçerli bir e-posta adresi giriniz.",url:"Lütfen geçerli bir web adresi (URL) giriniz.",date:"Lütfen geçerli bir tarih giriniz.",dateISO:"Lütfen geçerli bir tarih giriniz(ISO formatında)",number:"Lütfen geçerli bir sayı giriniz.",digits:"Lütfen sadece sayısal karakterler giriniz.",creditcard:"Lütfen geçerli bir kredi kartı giriniz.",equalTo:"Lütfen aynı değeri tekrar giriniz.",extension:"Lütfen geçerli uzantıya sahip bir değer giriniz.",maxlength:a.validator.format("Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz."),minlength:a.validator.format("Lütfen en az {0} karakter uzunluğunda bir değer giriniz."),rangelength:a.validator.format("Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz."),range:a.validator.format("Lütfen {0} ile {1} arasında bir değer giriniz."),max:a.validator.format("Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz."),min:a.validator.format("Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz."),require_from_group:a.validator.format("Lütfen bu alanların en az {0} tanesini doldurunuz.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_uk.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Це поле необхідно заповнити.",remote:"Будь ласка, введіть правильне значення.",email:"Будь ласка, введіть коректну адресу електронної пошти.",url:"Будь ласка, введіть коректний URL.",date:"Будь ласка, введіть коректну дату.",dateISO:"Будь ласка, введіть коректну дату у форматі ISO.",number:"Будь ласка, введіть число.",digits:"Вводите потрібно лише цифри.",creditcard:"Будь ласка, введіть правильний номер кредитної карти.",equalTo:"Будь ласка, введіть таке ж значення ще раз.",extension:"Будь ласка, виберіть файл з правильним розширенням.",maxlength:a.validator.format("Будь ласка, введіть не більше {0} символів."),minlength:a.validator.format("Будь ласка, введіть не менше {0} символів."),rangelength:a.validator.format("Будь ласка, введіть значення довжиною від {0} до {1} символів."),range:a.validator.format("Будь ласка, введіть число від {0} до {1}."),max:a.validator.format("Будь ласка, введіть число, менше або рівно {0}."),min:a.validator.format("Будь ласка, введіть число, більше або рівно {0}.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ur.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: UR (Urdu; اردو) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "ان معلومات کا اندراج ضروری ہے", 17 | remote: "ان معلومات کا اندراج ضروری ہے", 18 | email: "درج کی ہوئی ای میل درست نہیں ہے", 19 | url: "درج کیا گیا پتہ درست نہیں ہے", 20 | date: "درج کی گئی تاریخ درست نہیں ہے", 21 | dateISO: "معیار کے مطابق نہیں ہے (ISO) درج کی گئی تاریخ", 22 | number: "درج کیےگئے ہندسے درست نہیں ہیں", 23 | digits: "صرف ہندسے اندراج کئے جاسکتے ہیں", 24 | creditcard: "درج کیا گیا کارڈ نمبر درست نہیں ہے", 25 | equalTo: "اندراج کا موازنہ درست نہیں ہے", 26 | extension: "اندراج درست نہیں ہے", 27 | maxlength: $.validator.format( "زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں" ), 28 | minlength: $.validator.format( "کم سے کم {0} کا اندراج کرنا ضروری ہے" ), 29 | rangelength: $.validator.format( "اندراج کا {0} اور {1}کے درمیان ہونا ضروری ہے" ), 30 | range: $.validator.format( "اندراج کا {0} اور {1} کے درمیان ہونا ضروری ہے" ), 31 | max: $.validator.format( "زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں" ), 32 | min: $.validator.format( "کم سے کم {0} کا اندراج کرنا ضروری ہے" ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_ur.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"ان معلومات کا اندراج ضروری ہے",remote:"ان معلومات کا اندراج ضروری ہے",email:"درج کی ہوئی ای میل درست نہیں ہے",url:"درج کیا گیا پتہ درست نہیں ہے",date:"درج کی گئی تاریخ درست نہیں ہے",dateISO:"معیار کے مطابق نہیں ہے (ISO) درج کی گئی تاریخ",number:"درج کیےگئے ہندسے درست نہیں ہیں",digits:"صرف ہندسے اندراج کئے جاسکتے ہیں",creditcard:"درج کیا گیا کارڈ نمبر درست نہیں ہے",equalTo:"اندراج کا موازنہ درست نہیں ہے",extension:"اندراج درست نہیں ہے",maxlength:a.validator.format("زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں"),minlength:a.validator.format("کم سے کم {0} کا اندراج کرنا ضروری ہے"),rangelength:a.validator.format("اندراج کا {0} اور {1}کے درمیان ہونا ضروری ہے"),range:a.validator.format("اندراج کا {0} اور {1} کے درمیان ہونا ضروری ہے"),max:a.validator.format("زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں"),min:a.validator.format("کم سے کم {0} کا اندراج کرنا ضروری ہے")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_vi.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: VI (Vietnamese; Tiếng Việt) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "Hãy nhập.", 17 | remote: "Hãy sửa cho đúng.", 18 | email: "Hãy nhập email.", 19 | url: "Hãy nhập URL.", 20 | date: "Hãy nhập ngày.", 21 | dateISO: "Hãy nhập ngày (ISO).", 22 | number: "Hãy nhập số.", 23 | digits: "Hãy nhập chữ số.", 24 | creditcard: "Hãy nhập số thẻ tín dụng.", 25 | equalTo: "Hãy nhập thêm lần nữa.", 26 | extension: "Phần mở rộng không đúng.", 27 | maxlength: $.validator.format( "Hãy nhập từ {0} kí tự trở xuống." ), 28 | minlength: $.validator.format( "Hãy nhập từ {0} kí tự trở lên." ), 29 | rangelength: $.validator.format( "Hãy nhập từ {0} đến {1} kí tự." ), 30 | range: $.validator.format( "Hãy nhập từ {0} đến {1}." ), 31 | max: $.validator.format( "Hãy nhập từ {0} trở xuống." ), 32 | min: $.validator.format( "Hãy nhập từ {0} trở lên." ) 33 | } ); 34 | return $; 35 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_vi.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Hãy nhập.",remote:"Hãy sửa cho đúng.",email:"Hãy nhập email.",url:"Hãy nhập URL.",date:"Hãy nhập ngày.",dateISO:"Hãy nhập ngày (ISO).",number:"Hãy nhập số.",digits:"Hãy nhập chữ số.",creditcard:"Hãy nhập số thẻ tín dụng.",equalTo:"Hãy nhập thêm lần nữa.",extension:"Phần mở rộng không đúng.",maxlength:a.validator.format("Hãy nhập từ {0} kí tự trở xuống."),minlength:a.validator.format("Hãy nhập từ {0} kí tự trở lên."),rangelength:a.validator.format("Hãy nhập từ {0} đến {1} kí tự."),range:a.validator.format("Hãy nhập từ {0} đến {1}."),max:a.validator.format("Hãy nhập từ {0} trở xuống."),min:a.validator.format("Hãy nhập từ {0} trở lên.")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_zh.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語) 14 | */ 15 | $.extend( $.validator.messages, { 16 | required: "这是必填字段", 17 | remote: "请修正此字段", 18 | email: "请输入有效的电子邮件地址", 19 | url: "请输入有效的网址", 20 | date: "请输入有效的日期", 21 | dateISO: "请输入有效的日期 (YYYY-MM-DD)", 22 | number: "请输入有效的数字", 23 | digits: "只能输入数字", 24 | creditcard: "请输入有效的信用卡号码", 25 | equalTo: "你的输入不相同", 26 | extension: "请输入有效的后缀", 27 | maxlength: $.validator.format( "最多可以输入 {0} 个字符" ), 28 | minlength: $.validator.format( "最少要输入 {0} 个字符" ), 29 | rangelength: $.validator.format( "请输入长度在 {0} 到 {1} 之间的字符串" ), 30 | range: $.validator.format( "请输入范围在 {0} 到 {1} 之间的数值" ), 31 | step: $.validator.format( "请输入 {0} 的整数倍值" ), 32 | max: $.validator.format( "请输入不大于 {0} 的数值" ), 33 | min: $.validator.format( "请输入不小于 {0} 的数值" ) 34 | } ); 35 | return $; 36 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_zh.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"这是必填字段",remote:"请修正此字段",email:"请输入有效的电子邮件地址",url:"请输入有效的网址",date:"请输入有效的日期",dateISO:"请输入有效的日期 (YYYY-MM-DD)",number:"请输入有效的数字",digits:"只能输入数字",creditcard:"请输入有效的信用卡号码",equalTo:"你的输入不相同",extension:"请输入有效的后缀",maxlength:a.validator.format("最多可以输入 {0} 个字符"),minlength:a.validator.format("最少要输入 {0} 个字符"),rangelength:a.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"),range:a.validator.format("请输入范围在 {0} 到 {1} 之间的数值"),step:a.validator.format("请输入 {0} 的整数倍值"),max:a.validator.format("请输入不大于 {0} 的数值"),min:a.validator.format("请输入不小于 {0} 的数值")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_zh_TW.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Translated default messages for the jQuery validation plugin. 13 | * Locale: ZH (Chinese; 中文 (Zhōngwén), 汉语, 漢語) 14 | * Region: TW (Taiwan) 15 | */ 16 | $.extend( $.validator.messages, { 17 | required: "必須填寫", 18 | remote: "請修正此欄位", 19 | email: "請輸入有效的電子郵件", 20 | url: "請輸入有效的網址", 21 | date: "請輸入有效的日期", 22 | dateISO: "請輸入有效的日期 (YYYY-MM-DD)", 23 | number: "請輸入正確的數值", 24 | digits: "只可輸入數字", 25 | creditcard: "請輸入有效的信用卡號碼", 26 | equalTo: "請重複輸入一次", 27 | extension: "請輸入有效的後綴", 28 | maxlength: $.validator.format( "最多 {0} 個字" ), 29 | minlength: $.validator.format( "最少 {0} 個字" ), 30 | rangelength: $.validator.format( "請輸入長度為 {0} 至 {1} 之間的字串" ), 31 | range: $.validator.format( "請輸入 {0} 至 {1} 之間的數值" ), 32 | step: $.validator.format( "請輸入 {0} 的整數倍值" ), 33 | max: $.validator.format( "請輸入不大於 {0} 的數值" ), 34 | min: $.validator.format( "請輸入不小於 {0} 的數值" ) 35 | } ); 36 | return $; 37 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/messages_zh_TW.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"必須填寫",remote:"請修正此欄位",email:"請輸入有效的電子郵件",url:"請輸入有效的網址",date:"請輸入有效的日期",dateISO:"請輸入有效的日期 (YYYY-MM-DD)",number:"請輸入正確的數值",digits:"只可輸入數字",creditcard:"請輸入有效的信用卡號碼",equalTo:"請重複輸入一次",extension:"請輸入有效的後綴",maxlength:a.validator.format("最多 {0} 個字"),minlength:a.validator.format("最少 {0} 個字"),rangelength:a.validator.format("請輸入長度為 {0} 至 {1} 之間的字串"),range:a.validator.format("請輸入 {0} 至 {1} 之間的數值"),step:a.validator.format("請輸入 {0} 的整數倍值"),max:a.validator.format("請輸入不大於 {0} 的數值"),min:a.validator.format("請輸入不小於 {0} 的數值")}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_de.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Localized default methods for the jQuery validation plugin. 13 | * Locale: DE 14 | */ 15 | $.extend( $.validator.methods, { 16 | date: function( value, element ) { 17 | return this.optional( element ) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test( value ); 18 | }, 19 | number: function( value, element ) { 20 | return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value ); 21 | } 22 | } ); 23 | return $; 24 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_de.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_es_CL.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Localized default methods for the jQuery validation plugin. 13 | * Locale: ES_CL 14 | */ 15 | $.extend( $.validator.methods, { 16 | date: function( value, element ) { 17 | return this.optional( element ) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test( value ); 18 | }, 19 | number: function( value, element ) { 20 | return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value ); 21 | } 22 | } ); 23 | return $; 24 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_es_CL.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_fi.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Localized default methods for the jQuery validation plugin. 13 | * Locale: FI 14 | */ 15 | $.extend( $.validator.methods, { 16 | date: function( value, element ) { 17 | return this.optional( element ) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test( value ); 18 | }, 19 | number: function( value, element ) { 20 | return this.optional( element ) || /^-?(?:\d+)(?:,\d+)?$/.test( value ); 21 | } 22 | } ); 23 | return $; 24 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_fi.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d{1,2}\.\d{1,2}\.\d{4}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+)(?:,\d+)?$/.test(a)}}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_it.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Localized default methods for the jQuery validation plugin. 13 | * Locale: IT 14 | */ 15 | $.extend( $.validator.methods, { 16 | date: function( value, element ) { 17 | return this.optional( element ) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test( value ); 18 | }, 19 | number: function( value, element ) { 20 | return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value ); 21 | } 22 | } ); 23 | return $; 24 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_it.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_nl.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Localized default methods for the jQuery validation plugin. 13 | * Locale: NL 14 | */ 15 | $.extend( $.validator.methods, { 16 | date: function( value, element ) { 17 | return this.optional( element ) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test( value ); 18 | }, 19 | number: function( value, element ) { 20 | return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value ); 21 | } 22 | } ); 23 | return $; 24 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_nl.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}}),a}); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_pt.js: -------------------------------------------------------------------------------- 1 | (function( factory ) { 2 | if ( typeof define === "function" && define.amd ) { 3 | define( ["jquery", "../jquery.validate"], factory ); 4 | } else if (typeof module === "object" && module.exports) { 5 | module.exports = factory( require( "jquery" ) ); 6 | } else { 7 | factory( jQuery ); 8 | } 9 | }(function( $ ) { 10 | 11 | /* 12 | * Localized default methods for the jQuery validation plugin. 13 | * Locale: PT_BR 14 | */ 15 | $.extend( $.validator.methods, { 16 | date: function( value, element ) { 17 | return this.optional( element ) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test( value ); 18 | } 19 | } ); 20 | return $; 21 | })); -------------------------------------------------------------------------------- /main/static/assets/vendor/jquery-validation/localization/methods_pt.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 2 | * https://jqueryvalidation.org/ 3 | * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(a)}}),a}); -------------------------------------------------------------------------------- /main/users/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /main/users/admin/__init__.py: -------------------------------------------------------------------------------- 1 | from .user import User -------------------------------------------------------------------------------- /main/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from django.utils.translation import gettext_lazy as _ 3 | from django.contrib.auth.apps import AuthConfig 4 | 5 | AuthConfig.verbose_name = _("Groups") 6 | 7 | 8 | class UsersConfig(AppConfig): 9 | name = "main.users" 10 | verbose_name = _("Users") 11 | -------------------------------------------------------------------------------- /main/users/backends/__init__.py: -------------------------------------------------------------------------------- 1 | from .auth_backends import UserModelBackend -------------------------------------------------------------------------------- /main/users/backends/auth_backends.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.contrib.auth.backends import ModelBackend 3 | from django.core.exceptions import ImproperlyConfigured 4 | from django.apps import apps 5 | 6 | class UserModelBackend(ModelBackend): 7 | def authenticate(self, request, username=None, password=None, **kwargs): 8 | from ..models import User as UserModel 9 | if username is None: 10 | username = kwargs.get(UserModel.USERNAME_FIELD) 11 | try: 12 | user = UserModel._default_manager.get_by_natural_key(username) 13 | except UserModel.DoesNotExist: 14 | # Run the default password hasher once to reduce the timing 15 | # difference between an existing and a nonexistent user (#20760). 16 | UserModel().set_password(password) 17 | else: 18 | if user.check_password(password) and self.user_can_authenticate(user): 19 | return user 20 | 21 | def get_user(self, user_id): 22 | try: 23 | return self.user_class.objects.get(pk=user_id) 24 | except self.user_class.DoesNotExist: 25 | return None 26 | 27 | @property 28 | def user_class(self): 29 | if not hasattr(self, '_user_class'): 30 | self._user_class = apps.get_model(*settings.AUTH_USER_MODEL.split('.', 2)) 31 | if not self._user_class: 32 | raise ImproperlyConfigured('Could not get auth user model') 33 | return self._user_class 34 | -------------------------------------------------------------------------------- /main/users/forms/__init__.py: -------------------------------------------------------------------------------- 1 | from .profile import ChangePhotoForm, ChangePasswordForm, ProfileForm 2 | from .reset import ResetPasswordForm, ResetPasswordConfirmForm 3 | from .signin import SignInForm 4 | from .signup import SignUpSortForm, SignUpForm -------------------------------------------------------------------------------- /main/users/forms/signin.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from django.utils.translation import gettext_lazy as _ 3 | from django.core.validators import MaxLengthValidator, MinLengthValidator, EmailValidator, RegexValidator 4 | from django import forms 5 | 6 | class SignInForm(forms.Form): 7 | default_attrs = {'class': 'form-control'} 8 | username_validators = [ 9 | MaxLengthValidator(limit_value=255, message=_("Maximum length allowed is %(max_length)s") % dict(max_length=255)), 10 | MinLengthValidator(limit_value=2, message=_("Minimum length allowed is %(min_length)s") % dict(min_length=2)), 11 | ] 12 | password_validators = [ 13 | MaxLengthValidator(limit_value=255, message=_("Maximum length allowed is %(max_length)s") % dict(max_length=255)), 14 | # PATCH: limit_value = 1, min_length = 5 15 | MinLengthValidator(limit_value=1, message=_("Minimum length allowed is %(min_length)s") % dict(min_length=5)), 16 | ] 17 | username = forms.CharField(widget=forms.TextInput( 18 | attrs=default_attrs.update(dict(placeholder=_("Email or Username"))) 19 | ), validators=username_validators, required=True, label=_("Email or Username")) 20 | password = forms.CharField(widget=forms.PasswordInput( 21 | attrs=default_attrs.update(dict(placeholder=_("Password"))) 22 | ), validators=password_validators, required=True, label=_("Password")) -------------------------------------------------------------------------------- /main/users/manager/__init__.py: -------------------------------------------------------------------------------- 1 | from .usermanager import UserManager -------------------------------------------------------------------------------- /main/users/middleware.py: -------------------------------------------------------------------------------- 1 | from django.utils import timezone 2 | from django.conf import settings 3 | from django.utils.deprecation import MiddlewareMixin 4 | from django.db.models.expressions import F 5 | 6 | from main.users.models import User 7 | 8 | from datetime import timedelta 9 | from dateutil.parser import parse 10 | 11 | 12 | class LastUserActivityMiddleware(MiddlewareMixin): 13 | KEY = "last-activity" 14 | 15 | def process_request(self, request): 16 | if request.user.is_authenticated: 17 | last_activity = request.session.get(self.KEY) 18 | 19 | # If key is old enough, update database 20 | too_old_time = timezone.now() - timedelta(seconds=settings.LAST_ACTIVITY_INTERVAL_SECS) 21 | if not last_activity or parse(last_activity) < too_old_time: 22 | User.objects.filter(pk=request.user.pk).update( 23 | last_login=timezone.now(), 24 | login_count=F('login_count') + 1) 25 | request.session[self.KEY] = timezone.now().isoformat() 26 | return None 27 | -------------------------------------------------------------------------------- /main/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/users/migrations/__init__.py -------------------------------------------------------------------------------- /main/users/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .user import User -------------------------------------------------------------------------------- /main/users/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .views import * 3 | 4 | app_name = 'users' 5 | 6 | urlpatterns = [ 7 | path(route='profile/', view=profile_view, name='profile_view'), 8 | path(route='settings/', view=settings_view, name='settings_view'), 9 | path(route='activity_log/', view=activity_log_view, name='activity_log_view'), 10 | path(route='login/', view=signin_view, name="signin_view"), 11 | path(route='logout/', view=logout_view, name="logout_view"), 12 | path(route='verify-email///', view=email_verification_view, name='email_verification_view'), 13 | path(route='reset///', view=reset_password_view, name="reset_password_view"), # noqa 14 | path(route='reset/', view=reset_view, name="reset_view"), 15 | ] 16 | -------------------------------------------------------------------------------- /main/users/views/__init__.py: -------------------------------------------------------------------------------- 1 | from .profile import profile_view, settings_view, activity_log_view 2 | from .reset import reset_view, reset_password_view, email_verification_view 3 | from .signin import signin_view, logout_view 4 | -------------------------------------------------------------------------------- /main/users/views/signup.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/users/views/signup.py -------------------------------------------------------------------------------- /main/web/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/101t/jasmin-web-panel/bd3e3e7ed65995293bde4701d3f95c8e56fba295/main/web/__init__.py -------------------------------------------------------------------------------- /main/web/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | 4 | class SendMessageForm(forms.Form): 5 | send_type = forms.ChoiceField( 6 | label='Send Type', choices=(('smpp', 'SMPP'), ('http', 'HTTP')), initial='smpp', 7 | help_text='Choose the way to send SMS via gateway, smpp or http' 8 | ) 9 | src_addr = forms.CharField( 10 | label='Header', max_length=20, initial="JasminSMS", 11 | help_text="Header (from) field, it's represent the source address") 12 | dst_addr = forms.CharField( 13 | label='MSISDN', max_length=20, initial='', 14 | help_text='MSISDN (to) field, it\'s represent the numbers, example: +1234567890' 15 | ) 16 | text = forms.CharField( 17 | label='Message', max_length=500, initial='test message', widget=forms.Textarea(), 18 | help_text='Message (content) field, it\'s represent the message content' 19 | ) 20 | -------------------------------------------------------------------------------- /main/web/static/web/SAMPLE.js: -------------------------------------------------------------------------------- 1 | (function($){ 2 | var local_path = window.location.pathname, csrfmiddlewaretoken = document.getElementsByName('csrfmiddlewaretoken')[0].value; 3 | var tbody_html = function(val, i){ 4 | return ` 5 | ${1} 6 | ${1} 7 | ${1} 8 | `; 9 | } 10 | collection_check(tbody_html); 11 | $("[name*=q], #per_page").on("keyup paste change", function(){collection_check(tbody_html, 1, true);}); 12 | var collection_manage = function(cmd, index){ 13 | if (cmd == "edit") { 14 | //window.location = local_path + index + '/edit/'; 15 | } else if (cmd == "delete") { 16 | 17 | } 18 | } 19 | $("#collection_modal_form").on("submit", function(e){ 20 | e.preventDefault(); 21 | var serializeform = $(this).serialize(); 22 | var inputs = $(this).find("input, select, button, textarea"); 23 | inputs.prop("disabled", true); 24 | $.ajax({ 25 | type: "POST", 26 | url: $(this).attr("action"), 27 | data: serializeform, 28 | beforeSend: function(){}, 29 | success: function(data){ 30 | toastr.success(data["message"], {closeButton: true, progressBar: true,}); 31 | inputs.prop("disabled", false); 32 | $(".modal").modal("hide"); 33 | collection_check(tbody_html); 34 | //setTimeout(location.reload.bind(location), 2000); 35 | }, 36 | error: function(jqXHR, textStatus, errorThrown){ 37 | inputs.prop("disabled", false); 38 | toastr.error(JSON.parse(jqXHR.responseText)["message"], {closeButton: true, progressBar: true,}); 39 | } 40 | }); 41 | }) 42 | })(jQuery); -------------------------------------------------------------------------------- /main/web/static/web/content/send_message.js: -------------------------------------------------------------------------------- 1 | (function($){ 2 | $("li.nav-item.send-sms-menu").addClass("active"); 3 | })(jQuery); -------------------------------------------------------------------------------- /main/web/static/web/content/submit_logs.js: -------------------------------------------------------------------------------- 1 | (function($){ 2 | var local_path = window.location.pathname, csrfmiddlewaretoken = document.getElementsByName('csrfmiddlewaretoken')[0].value; 3 | $("li.nav-item.submit_logs-menu").addClass("active"); 4 | })(jQuery); -------------------------------------------------------------------------------- /main/web/static/web/dashboard.js: -------------------------------------------------------------------------------- 1 | (function($){ 2 | //var csrfmiddlewaretoken = document.getElementsByName('csrfmiddlewaretoken')[0].value; 3 | var gw_state = function() { 4 | $.ajax({ 5 | type: "GET", 6 | url: window.location.pathname + 'manage/', 7 | data: {s: 'gw_state'}, 8 | beforeSend: function(){}, 9 | success: function(data){ 10 | if (data.status) { 11 | toastr.success(data["message"], {closeButton: true, progressBar: true,}); 12 | } else { 13 | toastr.warning(data["message"], {closeButton: true, progressBar: true,}); 14 | } 15 | $("#binding_status").removeClass("bg-secondary").addClass(data.status? 'bg-success' : 'bg-warning'); 16 | $("#binding_status_text").text(data.message); 17 | }, 18 | error: function(jqXHR, textStatus, errorThrown){ 19 | toastr.error(JSON.parse(jqXHR.responseText)["message"], {closeButton: true, progressBar: true,}); 20 | } 21 | }); 22 | } 23 | gw_state(); 24 | })(jQuery); -------------------------------------------------------------------------------- /main/web/templates/auth/settings.html: -------------------------------------------------------------------------------- 1 | {% extends "web/base.html" %} 2 | {% load static i18n %} 3 | {% block title %}{% trans "Settings" %}{% endblock title %} 4 | {% block extracss %}{% endblock extracss %} 5 | {% block content %} 6 |

{% trans "Settings" %}

7 | {% endblock content %} 8 | {% block extrajs %}{% endblock extrajs %} -------------------------------------------------------------------------------- /main/web/templates/auth/signin.html: -------------------------------------------------------------------------------- 1 | {% extends "auth/base.html" %} 2 | {% load static i18n %} 3 | {% block title %}{% trans "Sign In" %} - Jasmin Web Panel{% endblock title %} 4 | {% block extracss %}{% endblock extracss %} 5 | {% block content %} 6 |
7 |
8 |

{% trans 'Welcome Back!' %}

9 |
10 | {% include "web/includes/message.html" %} 11 |
12 | {% csrf_token %} 13 | 14 |
15 | 16 |
17 |
18 | 19 |
20 | 21 |
22 |
23 | 24 |
25 | {% endblock content %} 26 | {% block extrajs %}{% endblock extrajs %} 27 | -------------------------------------------------------------------------------- /main/web/templates/auth/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "auth/base.html" %} 2 | {% load static i18n %} 3 | {% block title %}{% trans "Sign Up" %}{% endblock title %} 4 | {% block extracss %}{% endblock extracss %} 5 | {% block content %} 6 | {% endblock content %} 7 | {% block extrajs %}{% endblock extrajs %} -------------------------------------------------------------------------------- /main/web/templates/web/SAMPLE.html: -------------------------------------------------------------------------------- 1 | {% extends "web/base.html" %} 2 | {% load static i18n %} 3 | {% block title %}{% trans "SAMPLE" %}{% endblock title %} 4 | {% block extracss %}{% endblock extracss %} 5 | {% block content %} 6 | 7 | {% endblock content %} 8 | {% block extrajs %}{% endblock extrajs %} -------------------------------------------------------------------------------- /main/web/templates/web/dashboard.html: -------------------------------------------------------------------------------- 1 | {% extends "web/base.html" %} 2 | {% load static i18n humanize %} 3 | {% block title %}{% trans "Dashboard" %}{% endblock title %} 4 | {% block extracss %}{% endblock extracss %} 5 | {% block content %} 6 |
7 |
8 |
9 |
10 | {% trans "Your IP Address" %} 11 |
{{ ip_address }}
12 |
13 |
14 |
15 |
16 |
17 |
18 | {% trans "Last Login" %} 19 |
{{ user.last_login|naturaltime }}
20 |
21 |
22 |
23 |
24 |
25 |
26 | {% trans "Jasmin SMS Gateway" %} 27 |
28 | {{ SETTINGS.TELNET_HOST }} - {{ SETTINGS.TELNET_PORT }} - 29 |
30 |
31 |
32 |
33 |
34 | {% endblock content %} 35 | {% block extrajs %} 36 | 37 | {% endblock extrajs %} -------------------------------------------------------------------------------- /main/web/templates/web/includes/footer.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 6 |
7 |
-------------------------------------------------------------------------------- /main/web/templates/web/includes/message.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% for message in messages %} 3 |
4 | 7 |
8 | {% endfor %} -------------------------------------------------------------------------------- /main/web/templates/web/includes/paginate.html: -------------------------------------------------------------------------------- 1 | {% if page_obj.has_other_pages %} 2 | 23 | {% endif %} -------------------------------------------------------------------------------- /main/web/templates/web/includes/paginate_ajax.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | -------------------------------------------------------------------------------- /main/web/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from main.web import views 4 | 5 | app_name = 'web' 6 | 7 | urlpatterns = [ 8 | path('filters/manage/', views.filters_view_manage, name='filters_view_manage'), 9 | path('filters/', views.filters_view, name='filters_view'), 10 | path('groups/manage/', views.groups_view_manage, name='groups_view_manage'), 11 | path('groups/', views.groups_view, name='groups_view'), 12 | path('httpccm/manage/', views.httpccm_view_manage, name='httpccm_view_manage'), 13 | path('httpccm/', views.httpccm_view, name='httpccm_view'), 14 | path('morouter/manage/', views.morouter_view_manage, name='morouter_view_manage'), 15 | path('morouter/', views.morouter_view, name='morouter_view'), 16 | path('mtrouter/manage/', views.mtrouter_view_manage, name='mtrouter_view_manage'), 17 | path('mtrouter/', views.mtrouter_view, name='mtrouter_view'), 18 | path('smppccm/manage/', views.smppccm_view_manage, name='smppccm_view_manage'), 19 | path('smppccm/', views.smppccm_view, name='smppccm_view'), 20 | path('send_message/manage/', views.send_message_view_manage, name='send_message_view_manage'), 21 | path('send_message/', views.send_message_view, name='send_message_view'), 22 | path('submit_logs/manage/', views.submit_logs_view_manage, name='submit_logs_view_manage'), 23 | path('submit_logs/', views.submit_logs_view, name='submit_logs_view'), 24 | path('users/manage/', views.users_view_manage, name='users_view_manage'), 25 | path('users/', views.users_view, name='users_view'), 26 | path('manage/', views.global_manage, name='global_manage'), 27 | path('', views.dashboard_view, name='dashboard_view'), 28 | ] 29 | -------------------------------------------------------------------------------- /main/web/views/__init__.py: -------------------------------------------------------------------------------- 1 | from .content import * 2 | from .home import dashboard_view, global_manage 3 | -------------------------------------------------------------------------------- /main/web/views/content/__init__.py: -------------------------------------------------------------------------------- 1 | from .filters import filters_view, filters_view_manage 2 | from .groups import groups_view, groups_view_manage 3 | from .httpccm import httpccm_view, httpccm_view_manage 4 | from .morouter import morouter_view, morouter_view_manage 5 | from .mtrouter import mtrouter_view, mtrouter_view_manage 6 | from .send_message import send_message_view, send_message_view_manage 7 | from .smppccm import smppccm_view, smppccm_view_manage 8 | from .submit_logs import submit_logs_view, submit_logs_view_manage 9 | from .users import users_view, users_view_manage 10 | -------------------------------------------------------------------------------- /main/web/views/content/filters.py: -------------------------------------------------------------------------------- 1 | from django.utils.translation import gettext as _ 2 | from django.shortcuts import render 3 | from django.http import JsonResponse 4 | from django.contrib.auth.decorators import login_required 5 | 6 | from main.core.tools import require_post_ajax 7 | from main.core.smpp import Filters 8 | 9 | 10 | @login_required 11 | def filters_view(request): 12 | context = { 13 | "filter_types": Filters.FILTER_TYPES, 14 | } 15 | return render(request, "web/content/filters.html", context) 16 | 17 | 18 | @require_post_ajax 19 | def filters_view_manage(request): 20 | filters = Filters() 21 | s = request.POST.get("s") 22 | if s == "list": 23 | response = filters.list() 24 | elif s == "add": 25 | filter_type = request.POST.get("type") 26 | data_filter = { 27 | "fid": request.POST.get("fid"), 28 | "type": filter_type, 29 | } 30 | 31 | if filter_type != "transparentfilter": 32 | data_filter['parameter'] = request.POST.get("parameter") 33 | 34 | response = filters.create(data=data_filter) 35 | response["message"] = str(_("Filter added successfully!")) 36 | elif s == "delete": 37 | response = filters.destroy(fid=request.POST.get("fid")) 38 | response["message"] = str(_("Filter deleted successfully!")) 39 | else: 40 | return JsonResponse({"message": str(_("Sorry, Command does not matched.")), "status": 400}, status=400) 41 | 42 | response["status"] = 200 43 | return JsonResponse(response, status=200) 44 | -------------------------------------------------------------------------------- /main/web/views/content/groups.py: -------------------------------------------------------------------------------- 1 | from django.utils.translation import gettext as _ 2 | from django.http import JsonResponse 3 | from django.shortcuts import render 4 | from django.contrib.auth.decorators import login_required 5 | 6 | from main.core.smpp import Groups 7 | from main.core.tools import require_post_ajax 8 | 9 | 10 | @login_required 11 | def groups_view(request): 12 | return render(request, "web/content/groups.html") 13 | 14 | 15 | @require_post_ajax 16 | def groups_view_manage(request): 17 | response = {} 18 | groups = Groups() 19 | s = request.POST.get("s") 20 | gid = request.POST.get("gid") 21 | if s == "list": 22 | response = groups.list() 23 | elif s == "add": 24 | groups.create(data=dict(gid=gid)) 25 | response["message"] = str(_("Group added successfully!")) 26 | elif s == "delete": 27 | response = groups.destroy(gid=gid) 28 | response["message"] = str(_("Group deleted successfully!")) 29 | elif s == "enable": 30 | response = groups.enable(gid=gid) 31 | response["message"] = str(_("Group enabled successfully!")) 32 | elif s == "disable": 33 | response = groups.disable(gid=gid) 34 | response["message"] = str(_("Group disabled successfully!")) 35 | else: 36 | return JsonResponse({"message": str(_("Sorry, Command does not matched.")), "status": 400}, status=400) 37 | response["status"] = 200 38 | return JsonResponse(response, status=200) 39 | -------------------------------------------------------------------------------- /main/web/views/content/httpccm.py: -------------------------------------------------------------------------------- 1 | from django.utils.translation import gettext as _ 2 | from django.shortcuts import render 3 | from django.http import JsonResponse 4 | from django.contrib.auth.decorators import login_required 5 | 6 | from main.core.smpp import HTTPCCM 7 | from main.core.tools import require_post_ajax 8 | 9 | 10 | @login_required 11 | def httpccm_view(request): 12 | return render(request, "web/content/httpccm.html") 13 | 14 | 15 | @require_post_ajax 16 | def httpccm_view_manage(request): 17 | response = {} 18 | httpccm = HTTPCCM() 19 | s = request.POST.get("s") 20 | if s == "list": 21 | response = httpccm.list() 22 | elif s == "add": 23 | httpccm.create(data=dict( 24 | cid=request.POST.get("cid"), 25 | url=request.POST.get("url"), 26 | method=request.POST.get("method"), 27 | )) 28 | response["message"] = str(_("HTTPCCM added successfully!")) 29 | elif s == "delete": 30 | response = httpccm.destroy(cid=request.POST.get("cid")) 31 | response["message"] = str(_("HTTPCCM deleted successfully!")) 32 | else: 33 | return JsonResponse({"message": str(_("Sorry, Command does not matched.")), "status": 400}, status=400) 34 | 35 | response["status"] = 200 36 | return JsonResponse(response, status=200) 37 | -------------------------------------------------------------------------------- /main/web/views/content/mtrouter.py: -------------------------------------------------------------------------------- 1 | from django.utils.translation import gettext as _ 2 | from django.shortcuts import render 3 | from django.http import JsonResponse 4 | from django.contrib.auth.decorators import login_required 5 | 6 | from main.core.smpp import MTRouter 7 | from main.core.tools import require_post_ajax 8 | 9 | 10 | @login_required 11 | def mtrouter_view(request): 12 | context = { 13 | "mt_router_types": MTRouter.MT_ROUTER_TYPES, 14 | } 15 | return render(request, "web/content/mtrouter.html", context) 16 | 17 | 18 | @require_post_ajax 19 | def mtrouter_view_manage(request): 20 | response = {} 21 | s = request.POST.get("s") 22 | mtrouter = MTRouter() 23 | if s == "list": 24 | response = mtrouter.list() 25 | elif s == "add": 26 | try: 27 | mtrouter.create(data=dict( 28 | type=request.POST.get("type"), 29 | order=request.POST.get("order"), 30 | rate=request.POST.get("rate"), 31 | smppconnectors=request.POST.get("smppconnectors"), 32 | filters=request.POST.get("filters"), 33 | )) 34 | response["message"] = str(_("MT Router added successfully!")) 35 | except Exception as e: 36 | return JsonResponse({"message": str(e), "status": 400}, status=400) 37 | elif s == "delete": 38 | response = mtrouter.destroy(order=request.POST.get("order")) 39 | response["message"] = str(_("MT Router deleted successfully!")) 40 | else: 41 | return JsonResponse({"message": str(_("Sorry, Command does not matched.")), "status": 400}, status=400) 42 | response["status"] = 200 43 | return JsonResponse(response) 44 | -------------------------------------------------------------------------------- /main/web/views/content/submit_logs.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.decorators import login_required 2 | from django.shortcuts import render 3 | from django.http import JsonResponse 4 | from django.db.models import Count, Case, When, IntegerField 5 | 6 | from main.core.models import SubmitLog 7 | from main.core.utils import paginate 8 | from main.core.tools import require_post_ajax 9 | 10 | 11 | @login_required 12 | def submit_logs_view(request): 13 | stats = SubmitLog.objects.aggregate( 14 | total_count=Count('id'), 15 | success_count=Count(Case(When(status="success", then=1), output_field=IntegerField())), 16 | fail_count=Count(Case(When(status="fail", then=1), output_field=IntegerField())), 17 | unknown_count=Count(Case(When(status="unknown", then=1), output_field=IntegerField())), 18 | ) 19 | submit_logs = SubmitLog.objects.order_by("-created_at") 20 | 21 | submit_logs = paginate(submit_logs, per_page=25, page=request.GET.get("page")) 22 | return render(request, "web/content/submit_logs.html", context={ 23 | "submit_logs": submit_logs, 24 | "stats": stats, 25 | }) 26 | 27 | 28 | @require_post_ajax 29 | def submit_logs_view_manage(request): 30 | response = {} 31 | return JsonResponse(response) 32 | -------------------------------------------------------------------------------- /main/web/views/home.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.http import JsonResponse 3 | from django.contrib.auth.decorators import login_required 4 | from django.conf import settings 5 | 6 | from main.core.utils import get_client_ip, is_online 7 | from main.core.tools import require_get_ajax 8 | 9 | 10 | @login_required 11 | def dashboard_view(request): 12 | ip_address = get_client_ip(request) 13 | return render(request, "web/dashboard.html", dict(ip_address=ip_address)) 14 | 15 | 16 | @require_get_ajax 17 | def global_manage(request): 18 | response = {} 19 | s = request.GET.get("s") 20 | if s == "gw_state": 21 | # CHECK GATEWAY BINDING OK 22 | response["status"], response["message"] = is_online( 23 | host=settings.TELNET_HOST, port=settings.TELNET_PORT) 24 | return JsonResponse(response, status=200) 25 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | import environ # noqa 6 | 7 | environ.Env.read_env() 8 | 9 | 10 | def main(): 11 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', os.environ.get("DJANGO_SETTINGS_MODULE", "config.settings.pro")) 12 | try: 13 | from django.core.management import execute_from_command_line 14 | except ImportError as exc: 15 | raise ImportError( 16 | "Couldn't import Django. Are you sure it's installed and " 17 | "available on your PYTHONPATH environment variable? Did you " 18 | "forget to activate a virtual environment?" 19 | ) from exc 20 | execute_from_command_line(sys.argv) 21 | 22 | 23 | if __name__ == '__main__': 24 | main() 25 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools", "wheel", "uv"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "jasmin-web-panel" 7 | version = "3.0.1" 8 | description = "A web panel for Jasmin SMS Gateway" 9 | readme = "README.md" 10 | requires-python = ">=3.11" 11 | dependencies = [ 12 | "celery[redis]>=5.3,<6.0", 13 | "django>=5.2,<6.0", 14 | "django-jet-reboot>=1.3.10,<2.0", 15 | "django-autoslug>=1.9.8,<2.0", 16 | "django-environ>=0.12.0,<0.13.0", 17 | "djangorestframework>=3.13.1,<4.0", 18 | "pexpect>=4.8.0,<5.0", 19 | "pillow>=11.2.1,<12.0", 20 | "python-dateutil>=2.9.0.post0,<3.0", 21 | "requests>=2.32.3,<3.0", 22 | "ua-parser>=1.0.1,<2.0", 23 | "user-agents>=2.2.0,<3.0", 24 | "tablib>=3.0.0,<4.0", 25 | "xlrd>=2.0.1,<3.0", 26 | "xlwt>=1.3.0,<2.0", 27 | "zipp>=3.8.0,<4.0", 28 | "smpplib>=2.2.4,<3.0", 29 | "psycopg[binary]>=3.1.8,<4.0", 30 | ] 31 | 32 | [project.optional-dependencies] 33 | "dev" = [ 34 | "django-upgrade>=1.24.0,<2.0" 35 | ] 36 | "prod" = [ 37 | "gunicorn>=23.0.0,<24.0", 38 | "uvicorn>=0.34.1,<0.35.0" 39 | ] 40 | 41 | -------------------------------------------------------------------------------- /sample.env: -------------------------------------------------------------------------------- 1 | DEBUG=True 2 | 3 | SECRET_KEY=8na#(#x@0i*3ah%&$-q)b&wqu5ct_a3))d8-sqk-ux*5*lolwb 4 | 5 | DJANGO_SETTINGS_MODULE=config.settings.pro 6 | ADMIN_URL=admin/ 7 | TIME_ZONE=Etc/GMT-3 8 | LANGUAGE_CODE=en 9 | SITE_ID=1 10 | 11 | # mysql://root:123456@127.0.0.1/jasmin_web_db 12 | # sqlite:///db.sqlite3 13 | # postgres://jasmin:jasmin@127.0.0.1:5432/jasmin 14 | 15 | DEVDB_URL=sqlite:///db.sqlite3 16 | PRODB_URL=postgres://jasmin:top_secret@db:5432/jasmin 17 | 18 | REDIS_HOST=redis 19 | REDIS_PORT=6379 20 | REDIS_DB=0 21 | 22 | ALLOWED_HOSTS=* 23 | CSRF_TRUSTED_ORIGINS= 24 | 25 | TELNET_HOST=127.0.0.1 26 | TELNET_PORT=8990 27 | TELNET_USERNAME=jcliadmin 28 | TELNET_PW=jclipwd 29 | TELNET_TIMEOUT=10 30 | 31 | HTTP_HOST=http://127.0.0.1 32 | HTTP_PORT=1401 33 | HTTP_USERNAME=foo 34 | HTTP_PASSWORD=bar 35 | 36 | SMPP_HOST=127.0.0.1 37 | SMPP_PORT=2775 38 | SMPP_SYSTEM_ID=foo 39 | SMPP_PASSWORD=bar 40 | 41 | SUBMIT_LOG=False 42 | --------------------------------------------------------------------------------