first commit
This commit is contained in:
25
.env.local
Normal file
25
.env.local
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
SECRET_KEY=django-insecure-rd)c)2#!cf&a^+(-*nwh_lm5yoo!5bxnfw=k&ll_jilx+uf4#a
|
||||||
|
DEBUG=True
|
||||||
|
ALLOWED_HOSTS=rsibackend.rasadyaar.ir,127.0.0.1,rasadyaar.ir,rasadyar.net,rsibackend.rasadyar.com,rasadyar.com
|
||||||
|
DB_NAME=rsi
|
||||||
|
DB_USER=postgres
|
||||||
|
DB_PASSWORD=hbZnuB4pipCPooBp4BApeR2njtbwa3PDJlKbEdbR5D86Vo6jvoxl3MDpPm2ZfQAu
|
||||||
|
DB_HOST=31.7.78.133
|
||||||
|
DB_PORT=14339
|
||||||
|
CELERY_BROKER_URL=redis://redis://localhost:6379
|
||||||
|
CELERY_RESULT_BACKEND=redis://redis://localhost:6379
|
||||||
|
CELERY_ACCEPT_CONTENT=application/json
|
||||||
|
CELERY_TASK_SERIALIZER=json
|
||||||
|
CELERY_RESULT_SERIALIZER=json
|
||||||
|
CELERY_TIMEZONE=Asia/Tehran
|
||||||
|
CORS_ORIGIN_ALLOW_ALL=True
|
||||||
|
CORS_ORIGIN_WHITELIST=http://localhost:8080,http://127.0.0.1:8080,http://127.0.0.1:3000,http://localhost:3000,https://rsibackend.rasadyaar.ir,https://rasadyaar.ir,https://rasadyar.net,https://rsibackend.rasadyar.com,https://rasadyar.com
|
||||||
|
CORS_ALLOWED_ORIGINS=http://localhost:8080,http://127.0.0.1:8080,http://127.0.0.1:3000,http://localhost:3000,https://rsibackend.rasadyaar.ir,https://rasadyaar.ir,https://rasadyar.net,https://rsibackend.rasadyar.com,https://rasadyar.com
|
||||||
|
SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https
|
||||||
|
SECURE_SSL_REDIRECT=False
|
||||||
|
SESSION_COOKIE_SECURE=True
|
||||||
|
CSRF_COOKIE_SECURE=True
|
||||||
|
REDIS_URL=redis://:ydnW4hwzuDRYcTX3FWCHgQ1f@apo.liara.cloud:33740/0
|
||||||
|
|
||||||
|
|
||||||
|
ENV RUNNING_IN_DOCKER=0
|
||||||
22
.env.prod
Normal file
22
.env.prod
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
SECRET_KEY=django-insecure-rd)c)2#!cf&a^+(-*nwh_lm5yoo!5bxnfw=k&ll_jilx+uf4#a
|
||||||
|
DEBUG=True
|
||||||
|
ALLOWED_HOSTS=rsibackend.rasadyaar.ir,127.0.0.1,rasadyaar.ir,rasadyar.net,rsibackend.rasadyar.com,rasadyar.com
|
||||||
|
DB_NAME=rsi
|
||||||
|
DB_USER=postgres
|
||||||
|
DB_PASSWORD=hbZnuB4pipCPooBp4BApeR2njtbwa3PDJlKbEdbR5D86Vo6jvoxl3MDpPm2ZfQAu
|
||||||
|
DB_HOST=31.7.78.133
|
||||||
|
DB_PORT=14339
|
||||||
|
CELERY_BROKER_URL=redis://redis://localhost:6379
|
||||||
|
CELERY_RESULT_BACKEND=redis://redis://localhost:6379
|
||||||
|
CELERY_ACCEPT_CONTENT=application/json
|
||||||
|
CELERY_TASK_SERIALIZER=json
|
||||||
|
CELERY_RESULT_SERIALIZER=json
|
||||||
|
CELERY_TIMEZONE=Asia/Tehran
|
||||||
|
CORS_ORIGIN_ALLOW_ALL=True
|
||||||
|
CORS_ORIGIN_WHITELIST=http://localhost:8080,http://127.0.0.1:8080,http://127.0.0.1:3000,http://localhost:3000,https://rsibackend.rasadyaar.ir,https://rasadyaar.ir,https://rasadyar.net,https://rsibackend.rasadyar.com,https://rasadyar.com
|
||||||
|
CORS_ALLOWED_ORIGINS=http://localhost:8080,http://127.0.0.1:8080,http://127.0.0.1:3000,http://localhost:3000,https://rsibackend.rasadyaar.ir,https://rasadyaar.ir,https://rasadyar.net,https://rsibackend.rasadyar.com,https://rasadyar.com
|
||||||
|
SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https
|
||||||
|
SECURE_SSL_REDIRECT=False
|
||||||
|
SESSION_COOKIE_SECURE=True
|
||||||
|
CSRF_COOKIE_SECURE=True
|
||||||
|
REDIS_URL=redis://:ydnW4hwzuDRYcTX3FWCHgQ1f@apo.liara.cloud:33740/0
|
||||||
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
32
.idea/RSI.iml
generated
Normal file
32
.idea/RSI.iml
generated
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="FacetManager">
|
||||||
|
<facet type="django" name="Django">
|
||||||
|
<configuration>
|
||||||
|
<option name="rootFolder" value="$MODULE_DIR$" />
|
||||||
|
<option name="settingsModule" value="RSI/settings.py" />
|
||||||
|
<option name="manageScript" value="$MODULE_DIR$/manage.py" />
|
||||||
|
<option name="environment" value="<map/>" />
|
||||||
|
<option name="doNotUseTestRunner" value="false" />
|
||||||
|
<option name="trackFilePattern" value="migrations" />
|
||||||
|
</configuration>
|
||||||
|
</facet>
|
||||||
|
</component>
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/arma" />
|
||||||
|
</content>
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/arma" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="jdk" jdkName="Python 3.9 (rsi_env)" jdkType="Python SDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
<component name="PyDocumentationSettings">
|
||||||
|
<option name="format" value="PLAIN" />
|
||||||
|
<option name="myDocStringFormat" value="Plain" />
|
||||||
|
</component>
|
||||||
|
<component name="TemplatesService">
|
||||||
|
<option name="TEMPLATE_CONFIGURATION" value="Django" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
12
.idea/dataSources.xml
generated
Normal file
12
.idea/dataSources.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
|
<data-source source="LOCAL" name="rsi@31.7.78.133" uuid="75014d33-3a34-4b28-8f51-dd435cf6e27f">
|
||||||
|
<driver-ref>postgresql</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:postgresql://31.7.78.133:14339/rsi</jdbc-url>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
104
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
104
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="ignoredPackages">
|
||||||
|
<value>
|
||||||
|
<list size="91">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="django-oauth2-provider" />
|
||||||
|
<item index="1" class="java.lang.String" itemvalue="setuptools-rust" />
|
||||||
|
<item index="2" class="java.lang.String" itemvalue="PyYAML" />
|
||||||
|
<item index="3" class="java.lang.String" itemvalue="django-split-settings" />
|
||||||
|
<item index="4" class="java.lang.String" itemvalue="python-dateutil" />
|
||||||
|
<item index="5" class="java.lang.String" itemvalue="psycopg2" />
|
||||||
|
<item index="6" class="java.lang.String" itemvalue="psycopg2-binary" />
|
||||||
|
<item index="7" class="java.lang.String" itemvalue="kombu" />
|
||||||
|
<item index="8" class="java.lang.String" itemvalue="pycparser" />
|
||||||
|
<item index="9" class="java.lang.String" itemvalue="django-extensions" />
|
||||||
|
<item index="10" class="java.lang.String" itemvalue="redis" />
|
||||||
|
<item index="11" class="java.lang.String" itemvalue="frozenlist" />
|
||||||
|
<item index="12" class="java.lang.String" itemvalue="semantic-version" />
|
||||||
|
<item index="13" class="java.lang.String" itemvalue="docopt" />
|
||||||
|
<item index="14" class="java.lang.String" itemvalue="num2fawords" />
|
||||||
|
<item index="15" class="java.lang.String" itemvalue="pycryptodomex" />
|
||||||
|
<item index="16" class="java.lang.String" itemvalue="certifi" />
|
||||||
|
<item index="17" class="java.lang.String" itemvalue="oauthlib" />
|
||||||
|
<item index="18" class="java.lang.String" itemvalue="django-jalali" />
|
||||||
|
<item index="19" class="java.lang.String" itemvalue="shortuuid" />
|
||||||
|
<item index="20" class="java.lang.String" itemvalue="pyparsing" />
|
||||||
|
<item index="21" class="java.lang.String" itemvalue="vine" />
|
||||||
|
<item index="22" class="java.lang.String" itemvalue="xlrd" />
|
||||||
|
<item index="23" class="java.lang.String" itemvalue="beautifulsoup4" />
|
||||||
|
<item index="24" class="java.lang.String" itemvalue="django-oauth-toolkit" />
|
||||||
|
<item index="25" class="java.lang.String" itemvalue="tablib" />
|
||||||
|
<item index="26" class="java.lang.String" itemvalue="wrapt" />
|
||||||
|
<item index="27" class="java.lang.String" itemvalue="asgiref" />
|
||||||
|
<item index="28" class="java.lang.String" itemvalue="cryptography" />
|
||||||
|
<item index="29" class="java.lang.String" itemvalue="djangorestframework-recursive" />
|
||||||
|
<item index="30" class="java.lang.String" itemvalue="typing-extensions" />
|
||||||
|
<item index="31" class="java.lang.String" itemvalue="gunicorn" />
|
||||||
|
<item index="32" class="java.lang.String" itemvalue="click" />
|
||||||
|
<item index="33" class="java.lang.String" itemvalue="attrs" />
|
||||||
|
<item index="34" class="java.lang.String" itemvalue="crypto" />
|
||||||
|
<item index="35" class="java.lang.String" itemvalue="utm" />
|
||||||
|
<item index="36" class="java.lang.String" itemvalue="boto3" />
|
||||||
|
<item index="37" class="java.lang.String" itemvalue="django-filter" />
|
||||||
|
<item index="38" class="java.lang.String" itemvalue="charset-normalizer" />
|
||||||
|
<item index="39" class="java.lang.String" itemvalue="idna" />
|
||||||
|
<item index="40" class="java.lang.String" itemvalue="shellescape" />
|
||||||
|
<item index="41" class="java.lang.String" itemvalue="rsa" />
|
||||||
|
<item index="42" class="java.lang.String" itemvalue="django-environ" />
|
||||||
|
<item index="43" class="java.lang.String" itemvalue="async-timeout" />
|
||||||
|
<item index="44" class="java.lang.String" itemvalue="suds" />
|
||||||
|
<item index="45" class="java.lang.String" itemvalue="cffi" />
|
||||||
|
<item index="46" class="java.lang.String" itemvalue="wcwidth" />
|
||||||
|
<item index="47" class="java.lang.String" itemvalue="pyasn1" />
|
||||||
|
<item index="48" class="java.lang.String" itemvalue="requests" />
|
||||||
|
<item index="49" class="java.lang.String" itemvalue="click-didyoumean" />
|
||||||
|
<item index="50" class="java.lang.String" itemvalue="importlib-metadata" />
|
||||||
|
<item index="51" class="java.lang.String" itemvalue="sqlparse" />
|
||||||
|
<item index="52" class="java.lang.String" itemvalue="XlsxWriter" />
|
||||||
|
<item index="53" class="java.lang.String" itemvalue="celery" />
|
||||||
|
<item index="54" class="java.lang.String" itemvalue="Deprecated" />
|
||||||
|
<item index="55" class="java.lang.String" itemvalue="pyOpenSSL" />
|
||||||
|
<item index="56" class="java.lang.String" itemvalue="backports.weakref" />
|
||||||
|
<item index="57" class="java.lang.String" itemvalue="zipp" />
|
||||||
|
<item index="58" class="java.lang.String" itemvalue="prompt-toolkit" />
|
||||||
|
<item index="59" class="java.lang.String" itemvalue="cached-property" />
|
||||||
|
<item index="60" class="java.lang.String" itemvalue="jdatetime" />
|
||||||
|
<item index="61" class="java.lang.String" itemvalue="urllib3" />
|
||||||
|
<item index="62" class="java.lang.String" itemvalue="djangorestframework" />
|
||||||
|
<item index="63" class="java.lang.String" itemvalue="django-cors-headers" />
|
||||||
|
<item index="64" class="java.lang.String" itemvalue="billiard" />
|
||||||
|
<item index="65" class="java.lang.String" itemvalue="six" />
|
||||||
|
<item index="66" class="java.lang.String" itemvalue="botocore" />
|
||||||
|
<item index="67" class="java.lang.String" itemvalue="django-url-filter" />
|
||||||
|
<item index="68" class="java.lang.String" itemvalue="amqp" />
|
||||||
|
<item index="69" class="java.lang.String" itemvalue="enum-compat" />
|
||||||
|
<item index="70" class="java.lang.String" itemvalue="packaging" />
|
||||||
|
<item index="71" class="java.lang.String" itemvalue="cryptocode" />
|
||||||
|
<item index="72" class="java.lang.String" itemvalue="et-xmlfile" />
|
||||||
|
<item index="73" class="java.lang.String" itemvalue="django-debug-toolbar" />
|
||||||
|
<item index="74" class="java.lang.String" itemvalue="Naked" />
|
||||||
|
<item index="75" class="java.lang.String" itemvalue="jmespath" />
|
||||||
|
<item index="76" class="java.lang.String" itemvalue="schedule" />
|
||||||
|
<item index="77" class="java.lang.String" itemvalue="s3transfer" />
|
||||||
|
<item index="78" class="java.lang.String" itemvalue="Django" />
|
||||||
|
<item index="79" class="java.lang.String" itemvalue="django-redis" />
|
||||||
|
<item index="80" class="java.lang.String" itemvalue="aiohttp" />
|
||||||
|
<item index="81" class="java.lang.String" itemvalue="multidict" />
|
||||||
|
<item index="82" class="java.lang.String" itemvalue="oauth2-provider" />
|
||||||
|
<item index="83" class="java.lang.String" itemvalue="yarl" />
|
||||||
|
<item index="84" class="java.lang.String" itemvalue="click-repl" />
|
||||||
|
<item index="85" class="java.lang.String" itemvalue="pytz" />
|
||||||
|
<item index="86" class="java.lang.String" itemvalue="click-plugins" />
|
||||||
|
<item index="87" class="java.lang.String" itemvalue="aiosignal" />
|
||||||
|
<item index="88" class="java.lang.String" itemvalue="jwcrypto" />
|
||||||
|
<item index="89" class="java.lang.String" itemvalue="openpyxl" />
|
||||||
|
<item index="90" class="java.lang.String" itemvalue="Pillow" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
10
.idea/misc.xml
generated
Normal file
10
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Black">
|
||||||
|
<option name="sdkName" value="Python 3.9 (rsi-ven)" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (rsi-ven)" project-jdk-type="Python SDK" />
|
||||||
|
<option name="sdkName" value="Python 3.10 (postman-env) (2)" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (env) (4)" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
||||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/RSI.iml" filepath="$PROJECT_DIR$/.idea/RSI.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
7
.idea/vcs.xml
generated
Normal file
7
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
19
Dockerfile
Normal file
19
Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Dockerfile
|
||||||
|
FROM ghcr.io/seniorkian/python39-rsi:1.0.0
|
||||||
|
ENV TZ="Asia/Tehran"
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# فقط کپی requirements و نصب پکیجهای پایتون
|
||||||
|
COPY ./requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Copy project files
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Expose Django port
|
||||||
|
EXPOSE 8000
|
||||||
|
|
||||||
|
# Run Django development server
|
||||||
|
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
|
||||||
0
RSI/__init__.py
Normal file
0
RSI/__init__.py
Normal file
BIN
RSI/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
RSI/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
RSI/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
RSI/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
RSI/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/settings.cpython-310.pyc
Normal file
BIN
RSI/__pycache__/settings.cpython-310.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/settings.cpython-311.pyc
Normal file
BIN
RSI/__pycache__/settings.cpython-311.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/settings.cpython-312.pyc
Normal file
BIN
RSI/__pycache__/settings.cpython-312.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/settings.cpython-39.pyc
Normal file
BIN
RSI/__pycache__/settings.cpython-39.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/urls.cpython-310.pyc
Normal file
BIN
RSI/__pycache__/urls.cpython-310.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/urls.cpython-311.pyc
Normal file
BIN
RSI/__pycache__/urls.cpython-311.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/urls.cpython-312.pyc
Normal file
BIN
RSI/__pycache__/urls.cpython-312.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/urls.cpython-39.pyc
Normal file
BIN
RSI/__pycache__/urls.cpython-39.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/wsgi.cpython-310.pyc
Normal file
BIN
RSI/__pycache__/wsgi.cpython-310.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/wsgi.cpython-311.pyc
Normal file
BIN
RSI/__pycache__/wsgi.cpython-311.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/wsgi.cpython-312.pyc
Normal file
BIN
RSI/__pycache__/wsgi.cpython-312.pyc
Normal file
Binary file not shown.
BIN
RSI/__pycache__/wsgi.cpython-39.pyc
Normal file
BIN
RSI/__pycache__/wsgi.cpython-39.pyc
Normal file
Binary file not shown.
16
RSI/asgi.py
Normal file
16
RSI/asgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
ASGI config for RSI project.
|
||||||
|
|
||||||
|
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.asgi import get_asgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'RSI.settings')
|
||||||
|
|
||||||
|
application = get_asgi_application()
|
||||||
155
RSI/settings.py
Normal file
155
RSI/settings.py
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
"""
|
||||||
|
Django settings for RSI project.
|
||||||
|
|
||||||
|
Generated by 'django-admin startproject' using Django 4.2.19.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.2/topics/settings/
|
||||||
|
|
||||||
|
For the full list of settings and their values, see
|
||||||
|
https://docs.djangoproject.com/en/4.2/ref/settings/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import socket
|
||||||
|
from pathlib import Path
|
||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
|
loc_ip = socket.gethostbyname(socket.gethostname())
|
||||||
|
|
||||||
|
SECRET_KEY = os.environ.get("SECRET_KEY")
|
||||||
|
|
||||||
|
if not os.getenv("RUNNING_IN_DOCKER"):
|
||||||
|
dotenv_path = BASE_DIR / ".env.local"
|
||||||
|
load_dotenv(dotenv_path)
|
||||||
|
|
||||||
|
DEBUG = os.environ.get("DEBUG")
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS").split(',')
|
||||||
|
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = [
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
'corsheaders',
|
||||||
|
'rest_framework',
|
||||||
|
'app',
|
||||||
|
'authentication',
|
||||||
|
'django_filters',
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
MIDDLEWARE = [
|
||||||
|
"corsheaders.middleware.CorsMiddleware",
|
||||||
|
'django.middleware.security.SecurityMiddleware',
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
]
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'RSI.urls'
|
||||||
|
|
||||||
|
TEMPLATES = [
|
||||||
|
{
|
||||||
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
|
'DIRS': [],
|
||||||
|
'APP_DIRS': True,
|
||||||
|
'OPTIONS': {
|
||||||
|
'context_processors': [
|
||||||
|
'django.template.context_processors.debug',
|
||||||
|
'django.template.context_processors.request',
|
||||||
|
'django.contrib.auth.context_processors.auth',
|
||||||
|
'django.contrib.messages.context_processors.messages',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
WSGI_APPLICATION = 'RSI.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
|
'NAME': os.environ.get("DB_NAME"),
|
||||||
|
'USER': os.environ.get("DB_USER"),
|
||||||
|
'PASSWORD': os.environ.get("DB_PASSWORD"),
|
||||||
|
'HOST': os.environ.get("DB_HOST"),
|
||||||
|
'PORT': os.environ.get("DB_PORT"),
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
DATA_UPLOAD_MAX_MEMORY_SIZE = 154857600
|
||||||
|
|
||||||
|
# Password validation
|
||||||
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
|
||||||
|
|
||||||
|
AUTH_PASSWORD_VALIDATORS = [
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
REST_FRAMEWORK = {
|
||||||
|
'DEFAULT_PERMISSION_CLASSES': (
|
||||||
|
'rest_framework.permissions.IsAuthenticated',
|
||||||
|
),
|
||||||
|
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Internationalization
|
||||||
|
# https://docs.djangoproject.com/en/4.2/topics/i18n/
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
TIME_ZONE = 'UTC'
|
||||||
|
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
|
||||||
|
CORS_ORIGIN_ALLOW_CREDENTIALS = True
|
||||||
|
CORS_ORIGIN_ALLOW_ALL = os.environ.get("CORS_ORIGIN_ALLOW_ALL", "False").lower() == "true"
|
||||||
|
CORS_ORIGIN_WHITELIST = os.environ.get("CORS_ORIGIN_WHITELIST").split(',')
|
||||||
|
|
||||||
|
CORS_ALLOWED_ORIGINS = os.environ.get("CORS_ORIGIN_WHITELIST").split(',')
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/4.2/howto/static-files/
|
||||||
|
|
||||||
|
STATIC_URL = 'static/'
|
||||||
|
|
||||||
|
# Default primary key field type
|
||||||
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
|
||||||
|
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
24
RSI/urls.py
Normal file
24
RSI/urls.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
"""
|
||||||
|
URL configuration for RSI project.
|
||||||
|
|
||||||
|
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||||
|
https://docs.djangoproject.com/en/4.2/topics/http/urls/
|
||||||
|
Examples:
|
||||||
|
Function views
|
||||||
|
1. Add an import: from my_app import views
|
||||||
|
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||||
|
Class-based views
|
||||||
|
1. Add an import: from other_app.views import Home
|
||||||
|
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||||
|
Including another URLconf
|
||||||
|
1. Import the include() function: from django.urls import include, path
|
||||||
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
|
"""
|
||||||
|
from django.contrib import admin
|
||||||
|
from django.urls import path , include
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('admin/', admin.site.urls),
|
||||||
|
path('authentication/', include('authentication.urls')),
|
||||||
|
path('app/', include('app.urls'))
|
||||||
|
]
|
||||||
16
RSI/wsgi.py
Normal file
16
RSI/wsgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for RSI project.
|
||||||
|
|
||||||
|
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'RSI.settings')
|
||||||
|
|
||||||
|
application = get_wsgi_application()
|
||||||
BIN
__pycache__/helpers.cpython-310.pyc
Normal file
BIN
__pycache__/helpers.cpython-310.pyc
Normal file
Binary file not shown.
BIN
__pycache__/helpers.cpython-311.pyc
Normal file
BIN
__pycache__/helpers.cpython-311.pyc
Normal file
Binary file not shown.
BIN
__pycache__/helpers.cpython-312.pyc
Normal file
BIN
__pycache__/helpers.cpython-312.pyc
Normal file
Binary file not shown.
BIN
__pycache__/helpers.cpython-39.pyc
Normal file
BIN
__pycache__/helpers.cpython-39.pyc
Normal file
Binary file not shown.
BIN
__pycache__/manage.cpython-312.pyc
Normal file
BIN
__pycache__/manage.cpython-312.pyc
Normal file
Binary file not shown.
BIN
__pycache__/manage.cpython-39.pyc
Normal file
BIN
__pycache__/manage.cpython-39.pyc
Normal file
Binary file not shown.
0
app/__init__.py
Normal file
0
app/__init__.py
Normal file
BIN
app/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
app/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
app/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
app/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
app/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/admin.cpython-310.pyc
Normal file
BIN
app/__pycache__/admin.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/admin.cpython-311.pyc
Normal file
BIN
app/__pycache__/admin.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/admin.cpython-312.pyc
Normal file
BIN
app/__pycache__/admin.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/admin.cpython-39.pyc
Normal file
BIN
app/__pycache__/admin.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/apps.cpython-310.pyc
Normal file
BIN
app/__pycache__/apps.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/apps.cpython-311.pyc
Normal file
BIN
app/__pycache__/apps.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/apps.cpython-312.pyc
Normal file
BIN
app/__pycache__/apps.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/apps.cpython-39.pyc
Normal file
BIN
app/__pycache__/apps.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/cityandprovince.cpython-311.pyc
Normal file
BIN
app/__pycache__/cityandprovince.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/cityandprovince.cpython-312.pyc
Normal file
BIN
app/__pycache__/cityandprovince.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/cityandprovince.cpython-39.pyc
Normal file
BIN
app/__pycache__/cityandprovince.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/excel_processing.cpython-311.pyc
Normal file
BIN
app/__pycache__/excel_processing.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/excel_processing.cpython-312.pyc
Normal file
BIN
app/__pycache__/excel_processing.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/excel_processing.cpython-39.pyc
Normal file
BIN
app/__pycache__/excel_processing.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/filtersets.cpython-310.pyc
Normal file
BIN
app/__pycache__/filtersets.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/filtersets.cpython-311.pyc
Normal file
BIN
app/__pycache__/filtersets.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/filtersets.cpython-312.pyc
Normal file
BIN
app/__pycache__/filtersets.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/filtersets.cpython-39.pyc
Normal file
BIN
app/__pycache__/filtersets.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/helper.cpython-311.pyc
Normal file
BIN
app/__pycache__/helper.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/helper.cpython-312.pyc
Normal file
BIN
app/__pycache__/helper.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/helper.cpython-39.pyc
Normal file
BIN
app/__pycache__/helper.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/helper_excel.cpython-311.pyc
Normal file
BIN
app/__pycache__/helper_excel.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/helper_excel.cpython-312.pyc
Normal file
BIN
app/__pycache__/helper_excel.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/helper_excel.cpython-39.pyc
Normal file
BIN
app/__pycache__/helper_excel.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/models.cpython-310.pyc
Normal file
BIN
app/__pycache__/models.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/models.cpython-311.pyc
Normal file
BIN
app/__pycache__/models.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/models.cpython-312.pyc
Normal file
BIN
app/__pycache__/models.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/models.cpython-39.pyc
Normal file
BIN
app/__pycache__/models.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/scripts.cpython-310.pyc
Normal file
BIN
app/__pycache__/scripts.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/scripts.cpython-311.pyc
Normal file
BIN
app/__pycache__/scripts.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/scripts.cpython-312.pyc
Normal file
BIN
app/__pycache__/scripts.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/scripts.cpython-39.pyc
Normal file
BIN
app/__pycache__/scripts.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/serializers.cpython-310.pyc
Normal file
BIN
app/__pycache__/serializers.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/serializers.cpython-311.pyc
Normal file
BIN
app/__pycache__/serializers.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/serializers.cpython-312.pyc
Normal file
BIN
app/__pycache__/serializers.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/serializers.cpython-39.pyc
Normal file
BIN
app/__pycache__/serializers.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/urls.cpython-310.pyc
Normal file
BIN
app/__pycache__/urls.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/urls.cpython-311.pyc
Normal file
BIN
app/__pycache__/urls.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/urls.cpython-312.pyc
Normal file
BIN
app/__pycache__/urls.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/urls.cpython-39.pyc
Normal file
BIN
app/__pycache__/urls.cpython-39.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/views.cpython-310.pyc
Normal file
BIN
app/__pycache__/views.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/views.cpython-311.pyc
Normal file
BIN
app/__pycache__/views.cpython-311.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/views.cpython-312.pyc
Normal file
BIN
app/__pycache__/views.cpython-312.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/views.cpython-39.pyc
Normal file
BIN
app/__pycache__/views.cpython-39.pyc
Normal file
Binary file not shown.
3
app/admin.py
Normal file
3
app/admin.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
6
app/apps.py
Normal file
6
app/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class AppConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'app'
|
||||||
663
app/cityandprovince.py
Normal file
663
app/cityandprovince.py
Normal file
@@ -0,0 +1,663 @@
|
|||||||
|
search_city_list = ["آغاجری"
|
||||||
|
"سلسله", "معمولان", "کوهدشت", "آمل", "بابل", "بابلسر", "بهشهر",
|
||||||
|
"تنکابن", "جویبار", "چالوس", "رامسر", "ساری", "سواد کوه",
|
||||||
|
"سوادکوه شمالی", "سیمرغ", "عباس آباد", "فریدونکنار", "قائم شهر",
|
||||||
|
"گلوگاه", "محمود آباد", "میاندورود", "نکا", "نور", "نوشهر",
|
||||||
|
"کلاردشت", "آشتیان", "اراک", "تفرش", "خمین", "خنداب", "دلیجان",
|
||||||
|
"زرندیه", "ساوه", "شازند", "فراهان", "کمیجان", "محلات", "ابوموسی",
|
||||||
|
"بستک", "بشاگرد", "بندرعباس", "بندرلنگه", "پارسیان", "جاسک",
|
||||||
|
"حاجی آباد", "خمیر", "رودان", "سیریک", "قشم", "میناب", "اسدآباد",
|
||||||
|
"بهار", "تویسرکان", "درگزین", "رزن", "فامنین", "کبودرآهنگ", "ملایر",
|
||||||
|
"نهاوند", "همدان", "ابرکوه", "اردکان", "بافق", "بهاباد", "تفت",
|
||||||
|
"خاتم", "صدوق", "مروست", "زارچ", "مهریز", "میبد", "یزد",
|
||||||
|
"ثلاث باباجانی", "جوانرود", "دالاهو", "روانسر", "سر پل ذهاب",
|
||||||
|
"سنقر", "صحنه", "قصر شیرین", "گیلانغرب", "ماهیدشت", "هرسین",
|
||||||
|
"کرمانشاه", "کنگاور", "باشت", "بهمئی", "بویراحمد", "چرام", "دنا",
|
||||||
|
"گچساران", "لنده", "مارگون", "کهگیلویه", "آزاد شهر", "آق قلا",
|
||||||
|
"بندر گز", "ترکمن", "رامیان", "علی آباد", "گالیکش", "گرگان",
|
||||||
|
"گمیشان", "گنبد کاووس", "مراوه تپه", "مینودشت", "کردکوی",
|
||||||
|
"کلاله", "آستارا", "آستانه اشرفیه", "املش", "بندر انزلی",
|
||||||
|
"تالش", "خمام", "رشت", "رضوانشهر", "رودبار", "رودسر", "سیاهکل",
|
||||||
|
"شفت", "صومعه سرا", "طوالش", "فومن", "لاهیجان", "لنگرود", "ماسال",
|
||||||
|
"ازنا", "الیگودرز", "بروجرد", "پلدختر", "چگنی", "خرم آباد",
|
||||||
|
"دلفان", "دورود", "رومشکان", "زاهدان", "زرآباد", "زهک", "سراوان",
|
||||||
|
"سرباز", "سیب سوران", "فنوج", "قصرقند", "گلشن", "لاشار",
|
||||||
|
"مهرستان", "میرجاوه", "نیمروز", "نیک شهر", "هامون", "هیرمند",
|
||||||
|
"کنارک", "آباده", "ارسنجان", "استهبان", "اقلید", "اوز", "بختگان",
|
||||||
|
"بوانات", "بیضا", "پاسارگاد", "جهرم", "جویم", "خرامه", "خرم بید",
|
||||||
|
"خفر", "خنج", "داراب", "رستم", "زرقان", "زرین دشت", "سپیدان",
|
||||||
|
"سرچهان", "سروستان", "شیراز", "فراشبند", "فسا", "فیروز آباد",
|
||||||
|
"قیر و کارزین", "گراش", "لارستان", "لامرد", "مرودشت", "ممسنی",
|
||||||
|
"مهر", "نی ریز", "کازرون", "کوار", "کوه چنار", "آبیک", "آوج",
|
||||||
|
"البرز", "بوئین زهرا", "تاکستان", "قزوین", "جعفریه", "خلجستان",
|
||||||
|
"سلفچگان", "قم", "کهک", "بانه", "بیجار", "دهگلان", "دیواندره"
|
||||||
|
"سرو آباد", "سقز", "سنندج", "قروه", "مریوان",
|
||||||
|
"کامیاران",
|
||||||
|
"ارزوئیه", "انار", "بافت", "بردسیر", "بم", "رابر", "راور",
|
||||||
|
"رفسنجان", "ریگان", "زرند", "سیرجان", "شهربابک", "فهرج",
|
||||||
|
"گنبکی", "نرماشیر", "کرمان", "کوهبنان", "اسلام آباد غرب",
|
||||||
|
"پاوه", "رشتخوار", "زاوه", "زبرخان", "سبزوار", "سرخس",
|
||||||
|
"ششتمد", "صالح آباد", "طرقبه", "فریمان", "فیروزه", "قوچان",
|
||||||
|
"گلبهار", "گناباد", "مشهد", "مه ولات", "نیشابور", "کاشمر",
|
||||||
|
"کلات", "کوهسرخ", "اسفراین", "بام و صفی آباد", "بجنورد",
|
||||||
|
"جاجرم", "راز و جرگلان", "سملقان", "شیروان", "فاروج", "گرمه",
|
||||||
|
"مانه", "آبادان"
|
||||||
|
, "امیدیه", "اندیمشک", "اندیکا", "اهواز", "ایذه", "باغ ملک", "باوی", "بندر ماهشهر",
|
||||||
|
"بهبهان", "حمیدیه", "خرمشهر", "دزپارت", "دزفول", "دشت آزادگان", "رامشیر", "رامهرمز", "شادگان",
|
||||||
|
"شوش", "شوشتر", "صیدون", "گتوند", "لالی", "مسجد سلیمان", "هفتگل", "هندیجان", "هویزه", "کارون",
|
||||||
|
"کرخه", "ابهر", "ایجرود", "خدابنده", "خرمدره", "زنجان", "سلطانیه", "طارم", "ماهنشان", "آرادان",
|
||||||
|
"دامغان", "سرخه", "سمنان", "شاهرود", "گرمسار", "مهدی شهر", "میامی", "ایرانشهر", "بمپور", "تفتان",
|
||||||
|
"چاه بهار", "خاش", "دشتیاری", "دلگان", "راسک", "زابل", "آذرشهر", "اسکو", "اهر", "بستان آباد",
|
||||||
|
"بناب", "تبریز", "جلفا", "چاراویماق", "خدا آفرین", "سراب", "شبستر", "عجب شیر", "مراغه", "مرند",
|
||||||
|
"ملکان", "میانه", "هریس", "هشترود", "هوراند", "ورزقان", "کلیبر", "ارومیه", "اشنویه", "بوکان",
|
||||||
|
"پلدشت", "پیرانشهر", "تکاب", "چاربرج", "چالدران", "چایپاره", "خوی", "سر دشت", "سلماس", "شاهین دژ",
|
||||||
|
"شوط", "ماکو", "مهاباد", "میاندوآب", "نقده", "اردبیل", "اصلاندوز", "انگوت", "بیله سوار",
|
||||||
|
"پارس آباد", "خلخال", "سرعین", "گرمی", "مشگین شهر", "نمین", "نیر", "کوثر", "آران و بیدگل",
|
||||||
|
"اردستان", "اصفهان", "برخوار", "بوئین و میاندشت", "تیران و کرون", "جرقویه", "چادگان", "خمینی شهر",
|
||||||
|
"خوانسار", "خور و بیابانک", "دهاقان", "زرین شهر", "سمیرم", "شاهین شهر", "شهرضا", "فریدن",
|
||||||
|
"فریدونشهر", "فلاورجان", "گلپایگان", "مبارکه", "میمه", "نائین", "نجف آباد", "نطنز", "هرند", "ورزنه",
|
||||||
|
"کاشان", "کوهپایه", "اشتهارد", "چهار باغ", "ساوجبلاغ", "طالقان", "فردیس", "نظر آباد", "کرج",
|
||||||
|
"آبدانان", "ایلام", "ایوان", "بدره", "چرداول", "چوار", "درهشهر", "دهلران", "سیروان", "ملکشاهی",
|
||||||
|
"مهران", "هلیلان", "بوشهر", "تنگستان", "جم", "دشتستان", "دشتی", "دیر", "دیلم", "عسلویه", "گناوه",
|
||||||
|
"کنگان", "اسلامشهر", "بهارستان", "پاکدشت", "پردیس", "پیشوا", "تهران", "دماوند", "رباط کریم", "ری",
|
||||||
|
"شمیرانات", "شهریار", "فیروز کوه", "قدس", "قرچک", "ملارد", "ورامین", "اردل", "بروجن", "بن",
|
||||||
|
"خانمیرزا", "سامان", "شهر کرد", "فارسان", "فرخ شهر", "فلارد", "لردگان", "کوهرنگ", "کیار", "بشرویه",
|
||||||
|
"بیرجند", "خوسف", "درمیان", "زیرکوه", "سرایان", "سربیشه", "طبس", "فردوس", "قائنات", "نهبندان",
|
||||||
|
"باخرز", "بجستان", "بردسکن", "تایباد", "تربت جام", "تربت حیدریه", "جغتای", "جوین", "چناران",
|
||||||
|
"خلیل آباد", "خواف", "خوشاب", "داورزن", "درگز"]
|
||||||
|
search_province_list = [
|
||||||
|
"همدان", "مرکزی", "بوشهر", "آذربایجان شرقی", "آذربایجان غربی", "اردبیل",
|
||||||
|
"اصفهان", "البرز", "ایلام", "تهران", "چهار محال و بختیاری", "خراسان جنوبی",
|
||||||
|
"خراسان رضوی", "خراسان شمالی", "خوزستان", "زنجان", "سمنان", "سیستان و بلوچستان",
|
||||||
|
"فارس", "قزوین", "قم", "کردستان", "کرمان", "کرمانشاه", "کهکیلویه و بویراحمد",
|
||||||
|
"گلستان", "گیلان", "لرستان", "مازندران", "هرمزگان", "یزد"
|
||||||
|
]
|
||||||
|
|
||||||
|
irancity = [
|
||||||
|
{"name": "سلسله", "id": "65885", "province_id": "65546"},
|
||||||
|
{"name": "معمولان", "id": "66903", "province_id": "65546"},
|
||||||
|
{"name": "کوهدشت", "id": "65886", "province_id": "65546"},
|
||||||
|
{"name": "آمل", "id": "65887", "province_id": "65547"},
|
||||||
|
{"name": "بابل", "id": "65888", "province_id": "65547"},
|
||||||
|
{"name": "بابلسر", "id": "65889", "province_id": "65547"},
|
||||||
|
{"name": "بهشهر", "id": "65890", "province_id": "65547"},
|
||||||
|
{"name": "تنکابن", "id": "65891", "province_id": "65547"},
|
||||||
|
{"name": "جویبار", "id": "65892", "province_id": "65547"},
|
||||||
|
{"name": "چالوس", "id": "65893", "province_id": "65547"},
|
||||||
|
{"name": "رامسر", "id": "65894", "province_id": "65547"},
|
||||||
|
{"name": "ساری", "id": "65895", "province_id": "65547"},
|
||||||
|
{"name": "سواد کوه", "id": "65896", "province_id": "65547"},
|
||||||
|
{"name": "سوادکوه شمالی", "id": "66870", "province_id": "65547"},
|
||||||
|
{"name": "سیمرغ", "id": "66871", "province_id": "65547"},
|
||||||
|
{"name": "عباس آباد", "id": "65897", "province_id": "65547"},
|
||||||
|
{"name": "فریدونکنار", "id": "65898", "province_id": "65547"},
|
||||||
|
{"name": "قائم شهر", "id": "65899", "province_id": "65547"},
|
||||||
|
{"name": "گلوگاه", "id": "65900", "province_id": "65547"},
|
||||||
|
{"name": "محمود آباد", "id": "65901", "province_id": "65547"},
|
||||||
|
{"name": "میاندورود", "id": "65902", "province_id": "65547"},
|
||||||
|
{"name": "نکا", "id": "65903", "province_id": "65547"},
|
||||||
|
{"name": "نور", "id": "65904", "province_id": "65547"},
|
||||||
|
{"name": "نوشهر", "id": "65905", "province_id": "65547"},
|
||||||
|
{"name": "کلاردشت", "id": "66869", "province_id": "65547"},
|
||||||
|
{"name": "آشتیان", "id": "65906", "province_id": "65548"},
|
||||||
|
{"name": "اراک", "id": "65907", "province_id": "65548"},
|
||||||
|
{"name": "تفرش", "id": "65908", "province_id": "65548"},
|
||||||
|
{"name": "خمین", "id": "65909", "province_id": "65548"},
|
||||||
|
{"name": "خنداب", "id": "65910", "province_id": "65548"},
|
||||||
|
{"name": "دلیجان", "id": "65911", "province_id": "65548"},
|
||||||
|
{"name": "زرندیه", "id": "65912", "province_id": "65548"},
|
||||||
|
{"name": "ساوه", "id": "65913", "province_id": "65548"},
|
||||||
|
{"name": "شازند", "id": "65914", "province_id": "65548"},
|
||||||
|
{"name": "فراهان", "id": "65915", "province_id": "65548"},
|
||||||
|
{"name": "کمیجان", "id": "65916", "province_id": "65548"},
|
||||||
|
{"name": "محلات", "id": "65917", "province_id": "65548"},
|
||||||
|
{"name": "ابوموسی", "id": "65918", "province_id": "65549"},
|
||||||
|
{"name": "بستک", "id": "65919", "province_id": "65549"},
|
||||||
|
{"name": "بشاگرد", "id": "65920", "province_id": "65549"},
|
||||||
|
{"name": "بندرعباس", "id": "65921", "province_id": "65549"},
|
||||||
|
{"name": "بندرلنگه", "id": "65922", "province_id": "65549"},
|
||||||
|
{"name": "پارسیان", "id": "65923", "province_id": "65549"},
|
||||||
|
{"name": "جاسک", "id": "65924", "province_id": "65549"},
|
||||||
|
{"name": "حاجی آباد", "id": "65925", "province_id": "65549"},
|
||||||
|
{"name": "خمیر", "id": "65926", "province_id": "65549"},
|
||||||
|
{"name": "رودان", "id": "65927", "province_id": "65549"},
|
||||||
|
{"name": "سیریک", "id": "65928", "province_id": "65549"},
|
||||||
|
{"name": "قشم", "id": "65929", "province_id": "65549"},
|
||||||
|
{"name": "میناب", "id": "65930", "province_id": "65549"},
|
||||||
|
{"name": "اسدآباد", "id": "65931", "province_id": "65550"},
|
||||||
|
{"name": "بهار", "id": "65932", "province_id": "65550"},
|
||||||
|
{"name": "تویسرکان", "id": "65933", "province_id": "65550"},
|
||||||
|
{"name": "درگزین", "id": "66884", "province_id": "65550"},
|
||||||
|
{"name": "رزن", "id": "65934", "province_id": "65550"},
|
||||||
|
{"name": "فامنین", "id": "66853", "province_id": "65550"},
|
||||||
|
{"name": "کبودرآهنگ", "id": "65936", "province_id": "65550"},
|
||||||
|
{"name": "ملایر", "id": "65937", "province_id": "65550"},
|
||||||
|
{"name": "نهاوند", "id": "65938", "province_id": "65550"},
|
||||||
|
{"name": "همدان", "id": "65939", "province_id": "65550"},
|
||||||
|
{"name": "ابرکوه", "id": "65940", "province_id": "65551"},
|
||||||
|
{"name": "اردکان", "id": "65941", "province_id": "65551"},
|
||||||
|
{"name": "بافق", "id": "65942", "province_id": "65551"},
|
||||||
|
{"name": "بهاباد", "id": "65943", "province_id": "65551"},
|
||||||
|
{"name": "تفت", "id": "65944", "province_id": "65551"},
|
||||||
|
{"name": "خاتم", "id": "65945", "province_id": "65551"},
|
||||||
|
{"name": "صدوق", "id": "65946", "province_id": "65551"},
|
||||||
|
{"name": "مروست", "id": "66812", "province_id": "65551"},
|
||||||
|
{"name": "زارچ", "id": "66899", "province_id": "65551"},
|
||||||
|
{"name": "مهریز", "id": "65948", "province_id": "65551"},
|
||||||
|
{"name": "میبد", "id": "65949", "province_id": "65551"},
|
||||||
|
{"name": "یزد", "id": "65950", "province_id": "65551"},
|
||||||
|
{"name": "ثلاث باباجانی", "id": "65828", "province_id": "65542"},
|
||||||
|
{"name": "جوانرود", "id": "65829", "province_id": "65542"},
|
||||||
|
{"name": "دالاهو", "id": "65830", "province_id": "65542"},
|
||||||
|
{"name": "روانسر", "id": "65831", "province_id": "65542"},
|
||||||
|
{"name": "سر پل ذهاب", "id": "65832", "province_id": "65542"},
|
||||||
|
{"name": "سنقر", "id": "65833", "province_id": "65542"},
|
||||||
|
{"name": "صحنه", "id": "65834", "province_id": "65542"},
|
||||||
|
{"name": "قصر شیرین", "id": "65835", "province_id": "65542"},
|
||||||
|
{"name": "گیلانغرب", "id": "65838", "province_id": "65542"},
|
||||||
|
{"name": "ماهیدشت", "id": "66823", "province_id": "65542"},
|
||||||
|
{"name": "هرسین", "id": "65839", "province_id": "65542"},
|
||||||
|
{"name": "کرمانشاه", "id": "65836", "province_id": "65542"},
|
||||||
|
{"name": "کنگاور", "id": "65837", "province_id": "65542"},
|
||||||
|
{"name": "باشت", "id": "65840", "province_id": "65543"},
|
||||||
|
{"name": "بهمئی", "id": "65841", "province_id": "65543"},
|
||||||
|
{"name": "بویراحمد", "id": "65842", "province_id": "65543"},
|
||||||
|
{"name": "چرام", "id": "65843", "province_id": "65543"},
|
||||||
|
{"name": "دنا", "id": "65844", "province_id": "65543"},
|
||||||
|
{"name": "گچساران", "id": "65846", "province_id": "65543"},
|
||||||
|
{"name": "لنده", "id": "66594", "province_id": "65543"},
|
||||||
|
{"name": "مارگون", "id": "66587", "province_id": "65543"},
|
||||||
|
{"name": "کهگیلویه", "id": "65845", "province_id": "65543"},
|
||||||
|
{"name": "آزاد شهر", "id": "65847", "province_id": "65544"},
|
||||||
|
{"name": "آق قلا", "id": "65848", "province_id": "65544"},
|
||||||
|
{"name": "بندر گز", "id": "65849", "province_id": "65544"},
|
||||||
|
{"name": "ترکمن", "id": "65850", "province_id": "65544"},
|
||||||
|
{"name": "رامیان", "id": "65851", "province_id": "65544"},
|
||||||
|
{"name": "علی آباد", "id": "65852", "province_id": "65544"},
|
||||||
|
{"name": "گالیکش", "id": "65855", "province_id": "65544"},
|
||||||
|
{"name": "گرگان", "id": "65856", "province_id": "65544"},
|
||||||
|
{"name": "گمیشان", "id": "65857", "province_id": "65544"},
|
||||||
|
{"name": "گنبد کاووس", "id": "65858", "province_id": "65544"},
|
||||||
|
{"name": "مراوه تپه", "id": "65859", "province_id": "65544"},
|
||||||
|
{"name": "مینودشت", "id": "65860", "province_id": "65544"},
|
||||||
|
{"name": "کردکوی", "id": "65853", "province_id": "65544"},
|
||||||
|
{"name": "کلاله", "id": "65854", "province_id": "65544"},
|
||||||
|
{"name": "آستارا", "id": "65861", "province_id": "65545"},
|
||||||
|
{"name": "آستانه اشرفیه", "id": "65862", "province_id": "65545"},
|
||||||
|
{"name": "املش", "id": "65863", "province_id": "65545"},
|
||||||
|
{"name": "بندر انزلی", "id": "65864", "province_id": "65545"},
|
||||||
|
{"name": "تالش", "id": "66851", "province_id": "65545"},
|
||||||
|
{"name": "خمام", "id": "66627", "province_id": "65545"},
|
||||||
|
{"name": "خمام", "id": "66904", "province_id": "65545"},
|
||||||
|
{"name": "رشت", "id": "65865", "province_id": "65545"},
|
||||||
|
{"name": "رضوانشهر", "id": "65866", "province_id": "65545"},
|
||||||
|
{"name": "رودبار", "id": "65867", "province_id": "65545"},
|
||||||
|
{"name": "رودسر", "id": "65868", "province_id": "65545"},
|
||||||
|
{"name": "سیاهکل", "id": "65869", "province_id": "65545"},
|
||||||
|
{"name": "شفت", "id": "65870", "province_id": "65545"},
|
||||||
|
{"name": "صومعه سرا", "id": "65871", "province_id": "65545"},
|
||||||
|
{"name": "طوالش", "id": "65872", "province_id": "65545"},
|
||||||
|
{"name": "فومن", "id": "65873", "province_id": "65545"},
|
||||||
|
{"name": "لاهیجان", "id": "65874", "province_id": "65545"},
|
||||||
|
{"name": "لنگرود", "id": "65875", "province_id": "65545"},
|
||||||
|
{"name": "ماسال", "id": "65876", "province_id": "65545"},
|
||||||
|
{"name": "ازنا", "id": "65877", "province_id": "65546"},
|
||||||
|
{"name": "الیگودرز", "id": "65878", "province_id": "65546"},
|
||||||
|
{"name": "بروجرد", "id": "65879", "province_id": "65546"},
|
||||||
|
{"name": "پلدختر", "id": "65880", "province_id": "65546"},
|
||||||
|
{"name": "چگنی", "id": "65883", "province_id": "65546"},
|
||||||
|
{"name": "خرم آباد", "id": "65881", "province_id": "65546"},
|
||||||
|
{"name": "دلفان", "id": "65882", "province_id": "65546"},
|
||||||
|
{"name": "دورود", "id": "65884", "province_id": "65546"},
|
||||||
|
{"name": "رومشکان", "id": "66865", "province_id": "65546"},
|
||||||
|
{"name": "زاهدان", "id": "65749", "province_id": "65536"},
|
||||||
|
{"name": "زرآباد", "id": "66384", "province_id": "65536"},
|
||||||
|
{"name": "زهک", "id": "65750", "province_id": "65536"},
|
||||||
|
{"name": "سراوان", "id": "65751", "province_id": "65536"},
|
||||||
|
{"name": "سرباز", "id": "65752", "province_id": "65536"},
|
||||||
|
{"name": "سیب سوران", "id": "65753", "province_id": "65536"},
|
||||||
|
{"name": "فنوج", "id": "66860", "province_id": "65536"},
|
||||||
|
{"name": "قصرقند", "id": "66861", "province_id": "65536"},
|
||||||
|
{"name": "گلشن", "id": "66896", "province_id": "65536"},
|
||||||
|
{"name": "لاشار", "id": "66390", "province_id": "65536"},
|
||||||
|
{"name": "مهرستان", "id": "65755", "province_id": "65536"},
|
||||||
|
{"name": "میرجاوه", "id": "66862", "province_id": "65536"},
|
||||||
|
{"name": "نیمروز", "id": "66859", "province_id": "65536"},
|
||||||
|
{"name": "نیک شهر", "id": "65756", "province_id": "65536"},
|
||||||
|
{"name": "هامون", "id": "66858", "province_id": "65536"},
|
||||||
|
{"name": "هیرمند", "id": "65757", "province_id": "65536"},
|
||||||
|
{"name": "کنارک", "id": "65754", "province_id": "65536"},
|
||||||
|
{"name": "آباده", "id": "65758", "province_id": "65537"},
|
||||||
|
{"name": "ارسنجان", "id": "65759", "province_id": "65537"},
|
||||||
|
{"name": "استهبان", "id": "65760", "province_id": "65537"},
|
||||||
|
{"name": "اقلید", "id": "65761", "province_id": "65537"},
|
||||||
|
{"name": "اوز", "id": "66442", "province_id": "65537"},
|
||||||
|
{"name": "بختگان", "id": "66880", "province_id": "65537"},
|
||||||
|
{"name": "بوانات", "id": "65762", "province_id": "65537"},
|
||||||
|
{"name": "بیضا", "id": "66416", "province_id": "65537"},
|
||||||
|
{"name": "پاسارگاد", "id": "65763", "province_id": "65537"},
|
||||||
|
{"name": "جهرم", "id": "65764", "province_id": "65537"},
|
||||||
|
{"name": "جویم", "id": "66445", "province_id": "65537"},
|
||||||
|
{"name": "خرامه", "id": "65765", "province_id": "65537"},
|
||||||
|
{"name": "خرم بید", "id": "65766", "province_id": "65537"},
|
||||||
|
{"name": "خفر", "id": "66848", "province_id": "65537"},
|
||||||
|
{"name": "خنج", "id": "65767", "province_id": "65537"},
|
||||||
|
{"name": "داراب", "id": "65768", "province_id": "65537"},
|
||||||
|
{"name": "رستم", "id": "65769", "province_id": "65537"},
|
||||||
|
{"name": "زرقان", "id": "66422", "province_id": "65537"},
|
||||||
|
{"name": "زرین دشت", "id": "65770", "province_id": "65537"},
|
||||||
|
{"name": "سپیدان", "id": "65771", "province_id": "65537"},
|
||||||
|
{"name": "سرچهان", "id": "66843", "province_id": "65537"},
|
||||||
|
{"name": "سروستان", "id": "65772", "province_id": "65537"},
|
||||||
|
{"name": "شیراز", "id": "65773", "province_id": "65537"},
|
||||||
|
{"name": "فراشبند", "id": "65774", "province_id": "65537"},
|
||||||
|
{"name": "فسا", "id": "65775", "province_id": "65537"},
|
||||||
|
{"name": "فیروز آباد", "id": "65776", "province_id": "65537"},
|
||||||
|
{"name": "قیر و کارزین", "id": "66842", "province_id": "65537"},
|
||||||
|
{"name": "گراش", "id": "65780", "province_id": "65537"},
|
||||||
|
{"name": "لارستان", "id": "65781", "province_id": "65537"},
|
||||||
|
{"name": "لامرد", "id": "65782", "province_id": "65537"},
|
||||||
|
{"name": "مرودشت", "id": "65783", "province_id": "65537"},
|
||||||
|
{"name": "ممسنی", "id": "65784", "province_id": "65537"},
|
||||||
|
{"name": "مهر", "id": "65785", "province_id": "65537"},
|
||||||
|
{"name": "نی ریز", "id": "65786", "province_id": "65537"},
|
||||||
|
{"name": "کازرون", "id": "65778", "province_id": "65537"},
|
||||||
|
{"name": "کوار", "id": "65779", "province_id": "65537"},
|
||||||
|
{"name": "کوه چنار", "id": "66881", "province_id": "65537"},
|
||||||
|
{"name": "آبیک", "id": "65787", "province_id": "65538"},
|
||||||
|
{"name": "آوج", "id": "66849", "province_id": "65538"},
|
||||||
|
{"name": "البرز", "id": "65788", "province_id": "65538"},
|
||||||
|
{"name": "بوئین زهرا", "id": "65789", "province_id": "65538"},
|
||||||
|
{"name": "تاکستان", "id": "65790", "province_id": "65538"},
|
||||||
|
{"name": "قزوین", "id": "65791", "province_id": "65538"},
|
||||||
|
{"name": "جعفریه", "id": "66483", "province_id": "65539"},
|
||||||
|
{"name": "خلجستان", "id": "66484", "province_id": "65539"},
|
||||||
|
{"name": "سلفچگان", "id": "66485", "province_id": "65539"},
|
||||||
|
{"name": "قم", "id": "65792", "province_id": "65539"},
|
||||||
|
{"name": "کهک", "id": "66487", "province_id": "65539"},
|
||||||
|
{"name": "بانه", "id": "65793", "province_id": "65540"},
|
||||||
|
{"name": "بیجار", "id": "65794", "province_id": "65540"},
|
||||||
|
{"name": "دهگلان", "id": "65795", "province_id": "65540"},
|
||||||
|
{"name": "دیواندره", "id": "65796", "province_id": "65540"},
|
||||||
|
{"name": "سرو آباد", "id": "65797", "province_id": "65540"},
|
||||||
|
{"name": "سقز", "id": "65798", "province_id": "65540"},
|
||||||
|
{"name": "سنندج", "id": "65799", "province_id": "65540"},
|
||||||
|
{"name": "قروه", "id": "65800", "province_id": "65540"},
|
||||||
|
{"name": "مریوان", "id": "65802", "province_id": "65540"},
|
||||||
|
{"name": "کامیاران", "id": "65801", "province_id": "65540"},
|
||||||
|
{"name": "ارزوئیه", "id": "65803", "province_id": "65541"},
|
||||||
|
{"name": "انار", "id": "65804", "province_id": "65541"},
|
||||||
|
{"name": "بافت", "id": "65805", "province_id": "65541"},
|
||||||
|
{"name": "بردسیر", "id": "65806", "province_id": "65541"},
|
||||||
|
{"name": "بم", "id": "65807", "province_id": "65541"},
|
||||||
|
{"name": "رابر", "id": "65809", "province_id": "65541"},
|
||||||
|
{"name": "راور", "id": "65810", "province_id": "65541"},
|
||||||
|
{"name": "رفسنجان", "id": "65811", "province_id": "65541"},
|
||||||
|
{"name": "ریگان", "id": "65813", "province_id": "65541"},
|
||||||
|
{"name": "زرند", "id": "65814", "province_id": "65541"},
|
||||||
|
{"name": "سیرجان", "id": "65815", "province_id": "65541"},
|
||||||
|
{"name": "شهربابک", "id": "66825", "province_id": "65541"},
|
||||||
|
{"name": "فهرج", "id": "65819", "province_id": "65541"},
|
||||||
|
{"name": "گنبکی", "id": "66900", "province_id": "65541"},
|
||||||
|
{"name": "نرماشیر", "id": "65825", "province_id": "65541"},
|
||||||
|
{"name": "کرمان", "id": "65821", "province_id": "65541"},
|
||||||
|
{"name": "کوهبنان", "id": "65823", "province_id": "65541"},
|
||||||
|
{"name": "اسلام آباد غرب", "id": "65826", "province_id": "65542"},
|
||||||
|
{"name": "پاوه", "id": "65827", "province_id": "65542"},
|
||||||
|
{"name": "رشتخوار", "id": "65687", "province_id": "65531"},
|
||||||
|
{"name": "زاوه", "id": "65688", "province_id": "65531"},
|
||||||
|
{"name": "زبرخان", "id": "66265", "province_id": "65531"},
|
||||||
|
{"name": "سبزوار", "id": "65689", "province_id": "65531"},
|
||||||
|
{"name": "سرخس", "id": "65690", "province_id": "65531"},
|
||||||
|
{"name": "ششتمد", "id": "66246", "province_id": "65531"},
|
||||||
|
{"name": "صالح آباد", "id": "66838", "province_id": "65531"},
|
||||||
|
{"name": "طرقبه", "id": "66837", "province_id": "65531"},
|
||||||
|
{"name": "فریمان", "id": "65691", "province_id": "65531"},
|
||||||
|
{"name": "فیروزه", "id": "66836", "province_id": "65531"},
|
||||||
|
{"name": "قوچان", "id": "65692", "province_id": "65531"},
|
||||||
|
{"name": "گلبهار", "id": "66228", "province_id": "65531"},
|
||||||
|
{"name": "گناباد", "id": "65695", "province_id": "65531"},
|
||||||
|
{"name": "مشهد", "id": "65696", "province_id": "65531"},
|
||||||
|
{"name": "مه ولات", "id": "65697", "province_id": "65531"},
|
||||||
|
{"name": "نیشابور", "id": "65698", "province_id": "65531"},
|
||||||
|
{"name": "کاشمر", "id": "65693", "province_id": "65531"},
|
||||||
|
{"name": "کلات", "id": "65694", "province_id": "65531"},
|
||||||
|
{"name": "کوهسرخ", "id": "66254", "province_id": "65531"},
|
||||||
|
{"name": "اسفراین", "id": "65699", "province_id": "65532"},
|
||||||
|
{"name": "بام و صفی آباد", "id": "66897", "province_id": "65532"},
|
||||||
|
{"name": "بجنورد", "id": "65700", "province_id": "65532"},
|
||||||
|
{"name": "جاجرم", "id": "65701", "province_id": "65532"},
|
||||||
|
{"name": "راز و جرگلان", "id": "66271", "province_id": "65532"},
|
||||||
|
{"name": "سملقان", "id": "65705", "province_id": "65532"},
|
||||||
|
{"name": "شیروان", "id": "65702", "province_id": "65532"},
|
||||||
|
{"name": "فاروج", "id": "65703", "province_id": "65532"},
|
||||||
|
{"name": "گرمه", "id": "65704", "province_id": "65532"},
|
||||||
|
{"name": "مانه", "id": "66898", "province_id": "65532"},
|
||||||
|
{"name": "آبادان", "id": "65706", "province_id": "65533"},
|
||||||
|
{"name": "آغاجری", "id": "66878", "province_id": "65533"},
|
||||||
|
{"name": "امیدیه", "id": "65707", "province_id": "65533"},
|
||||||
|
{"name": "اندیمشک", "id": "65708", "province_id": "65533"},
|
||||||
|
{"name": "اندیکا", "id": "65709", "province_id": "65533"},
|
||||||
|
{"name": "اهواز", "id": "65710", "province_id": "65533"},
|
||||||
|
{"name": "ایذه", "id": "65711", "province_id": "65533"},
|
||||||
|
{"name": "باغ ملک", "id": "65712", "province_id": "65533"},
|
||||||
|
{"name": "باوی", "id": "65713", "province_id": "65533"},
|
||||||
|
{"name": "بندر ماهشهر", "id": "65714", "province_id": "65533"},
|
||||||
|
{"name": "بهبهان", "id": "65715", "province_id": "65533"},
|
||||||
|
{"name": "حمیدیه", "id": "66873", "province_id": "65533"},
|
||||||
|
{"name": "خرمشهر", "id": "65716", "province_id": "65533"},
|
||||||
|
{"name": "دزپارت", "id": "66893", "province_id": "65533"},
|
||||||
|
{"name": "دزفول", "id": "65717", "province_id": "65533"},
|
||||||
|
{"name": "دشت آزادگان", "id": "65718", "province_id": "65533"},
|
||||||
|
{"name": "رامشیر", "id": "65719", "province_id": "65533"},
|
||||||
|
{"name": "رامهرمز", "id": "65720", "province_id": "65533"},
|
||||||
|
{"name": "شادگان", "id": "65721", "province_id": "65533"},
|
||||||
|
{"name": "شوش", "id": "65722", "province_id": "65533"},
|
||||||
|
{"name": "شوشتر", "id": "65723", "province_id": "65533"},
|
||||||
|
{"name": "صیدون", "id": "66902", "province_id": "65533"},
|
||||||
|
{"name": "گتوند", "id": "65724", "province_id": "65533"},
|
||||||
|
{"name": "لالی", "id": "65725", "province_id": "65533"},
|
||||||
|
{"name": "مسجد سلیمان", "id": "65726", "province_id": "65533"},
|
||||||
|
{"name": "هفتگل", "id": "65727", "province_id": "65533"},
|
||||||
|
{"name": "هندیجان", "id": "65728", "province_id": "65533"},
|
||||||
|
{"name": "هویزه", "id": "65729", "province_id": "65533"},
|
||||||
|
{"name": "کارون", "id": "66874", "province_id": "65533"},
|
||||||
|
{"name": "کرخه", "id": "66886", "province_id": "65533"},
|
||||||
|
{"name": "ابهر", "id": "65730", "province_id": "65534"},
|
||||||
|
{"name": "ایجرود", "id": "65731", "province_id": "65534"},
|
||||||
|
{"name": "خدابنده", "id": "65732", "province_id": "65534"},
|
||||||
|
{"name": "خرمدره", "id": "65733", "province_id": "65534"},
|
||||||
|
{"name": "زنجان", "id": "65734", "province_id": "65534"},
|
||||||
|
{"name": "سلطانیه ", "id": "66868", "province_id": "65534"},
|
||||||
|
{"name": "طارم", "id": "65735", "province_id": "65534"},
|
||||||
|
{"name": "ماهنشان", "id": "65736", "province_id": "65534"},
|
||||||
|
{"name": "آرادان", "id": "65737", "province_id": "65535"},
|
||||||
|
{"name": "دامغان", "id": "65738", "province_id": "65535"},
|
||||||
|
{"name": "سرخه", "id": "66840", "province_id": "65535"},
|
||||||
|
{"name": "سمنان", "id": "65739", "province_id": "65535"},
|
||||||
|
{"name": "شاهرود", "id": "65740", "province_id": "65535"},
|
||||||
|
{"name": "گرمسار", "id": "65741", "province_id": "65535"},
|
||||||
|
{"name": "مهدی شهر", "id": "65742", "province_id": "65535"},
|
||||||
|
{"name": "میامی", "id": "65743", "province_id": "65535"},
|
||||||
|
{"name": "ایرانشهر", "id": "65744", "province_id": "65536"},
|
||||||
|
{"name": "بمپور", "id": "66362", "province_id": "65536"},
|
||||||
|
{"name": "تفتان", "id": "66882", "province_id": "65536"},
|
||||||
|
{"name": "چاه بهار", "id": "65745", "province_id": "65536"},
|
||||||
|
{"name": "خاش", "id": "65746", "province_id": "65536"},
|
||||||
|
{"name": "دشتیاری", "id": "66364", "province_id": "65536"},
|
||||||
|
{"name": "دلگان", "id": "65747", "province_id": "65536"},
|
||||||
|
{"name": "راسک", "id": "66883", "province_id": "65536"},
|
||||||
|
{"name": "زابل", "id": "65748", "province_id": "65536"},
|
||||||
|
{"name": "آذرشهر", "id": "65552", "province_id": "65521"},
|
||||||
|
{"name": "اسکو", "id": "65553", "province_id": "65521"},
|
||||||
|
{"name": "اهر", "id": "65554", "province_id": "65521"},
|
||||||
|
{"name": "بستان آباد", "id": "65555", "province_id": "65521"},
|
||||||
|
{"name": "بناب", "id": "65556", "province_id": "65521"},
|
||||||
|
{"name": "تبریز", "id": "65557", "province_id": "65521"},
|
||||||
|
{"name": "جلفا", "id": "65558", "province_id": "65521"},
|
||||||
|
{"name": "چاراویماق", "id": "65559", "province_id": "65521"},
|
||||||
|
{"name": "خدا آفرین", "id": "65560", "province_id": "65521"},
|
||||||
|
{"name": "سراب", "id": "65561", "province_id": "65521"},
|
||||||
|
{"name": "شبستر", "id": "65562", "province_id": "65521"},
|
||||||
|
{"name": "عجب شیر", "id": "65563", "province_id": "65521"},
|
||||||
|
{"name": "مراغه", "id": "65565", "province_id": "65521"},
|
||||||
|
{"name": "مرند", "id": "65566", "province_id": "65521"},
|
||||||
|
{"name": "ملکان", "id": "65567", "province_id": "65521"},
|
||||||
|
{"name": "میانه", "id": "65568", "province_id": "65521"},
|
||||||
|
{"name": "هریس", "id": "65569", "province_id": "65521"},
|
||||||
|
{"name": "هشترود", "id": "65570", "province_id": "65521"},
|
||||||
|
{"name": "هوراند", "id": "65957", "province_id": "65521"},
|
||||||
|
{"name": "ورزقان", "id": "65571", "province_id": "65521"},
|
||||||
|
{"name": "کلیبر", "id": "65564", "province_id": "65521"},
|
||||||
|
{"name": "ارومیه", "id": "65572", "province_id": "65522"},
|
||||||
|
{"name": "اشنویه", "id": "65573", "province_id": "65522"},
|
||||||
|
{"name": "بوکان", "id": "65574", "province_id": "65522"},
|
||||||
|
{"name": "پلدشت", "id": "65575", "province_id": "65522"},
|
||||||
|
{"name": "پیرانشهر", "id": "65576", "province_id": "65522"},
|
||||||
|
{"name": "تکاب", "id": "65577", "province_id": "65522"},
|
||||||
|
{"name": "چاربرج", "id": "66905", "province_id": "65522"},
|
||||||
|
{"name": "چالدران", "id": "65578", "province_id": "65522"},
|
||||||
|
{"name": "چایپاره", "id": "65579", "province_id": "65522"},
|
||||||
|
{"name": "خوی", "id": "65580", "province_id": "65522"},
|
||||||
|
{"name": "سر دشت", "id": "65581", "province_id": "65522"},
|
||||||
|
{"name": "سلماس", "id": "65582", "province_id": "65522"},
|
||||||
|
{"name": "شاهین دژ", "id": "65583", "province_id": "65522"},
|
||||||
|
{"name": "شوط", "id": "65584", "province_id": "65522"},
|
||||||
|
{"name": "ماکو", "id": "65585", "province_id": "65522"},
|
||||||
|
{"name": "مهاباد", "id": "65586", "province_id": "65522"},
|
||||||
|
{"name": "میاندوآب", "id": "65587", "province_id": "65522"},
|
||||||
|
{"name": "نقده", "id": "65588", "province_id": "65522"},
|
||||||
|
{"name": "اردبیل", "id": "65589", "province_id": "65523"},
|
||||||
|
{"name": "اصلاندوز", "id": "66032", "province_id": "65523"},
|
||||||
|
{"name": "انگوت", "id": "66040", "province_id": "65523"},
|
||||||
|
{"name": "بیله سوار", "id": "65590", "province_id": "65523"},
|
||||||
|
{"name": "پارس آباد", "id": "65591", "province_id": "65523"},
|
||||||
|
{"name": "خلخال", "id": "65592", "province_id": "65523"},
|
||||||
|
{"name": "سرعین", "id": "65593", "province_id": "65523"},
|
||||||
|
{"name": "گرمی", "id": "65595", "province_id": "65523"},
|
||||||
|
{"name": "مشگین شهر", "id": "65596", "province_id": "65523"},
|
||||||
|
{"name": "نمین", "id": "65597", "province_id": "65523"},
|
||||||
|
{"name": "نیر", "id": "65598", "province_id": "65523"},
|
||||||
|
{"name": "کوثر", "id": "65594", "province_id": "65523"},
|
||||||
|
{"name": "آران و بیدگل", "id": "65599", "province_id": "65524"},
|
||||||
|
{"name": "اردستان", "id": "65600", "province_id": "65524"},
|
||||||
|
{"name": "اصفهان", "id": "65601", "province_id": "65524"},
|
||||||
|
{"name": "برخوار", "id": "65602", "province_id": "65524"},
|
||||||
|
{"name": "بوئین و میاندشت", "id": "66075", "province_id": "65524"},
|
||||||
|
{"name": "تیران و کرون", "id": "65603", "province_id": "65524"},
|
||||||
|
{"name": "جرقویه", "id": "66887", "province_id": "65524"},
|
||||||
|
{"name": "چادگان", "id": "65604", "province_id": "65524"},
|
||||||
|
{"name": "خمینی شهر", "id": "65605", "province_id": "65524"},
|
||||||
|
{"name": "خوانسار", "id": "65606", "province_id": "65524"},
|
||||||
|
{"name": "خور و بیابانک", "id": "65607", "province_id": "65524"},
|
||||||
|
{"name": "دهاقان", "id": "65608", "province_id": "65524"},
|
||||||
|
{"name": "زرین شهر", "id": "66828", "province_id": "65524"},
|
||||||
|
{"name": "سمیرم", "id": "65609", "province_id": "65524"},
|
||||||
|
{"name": "شاهین شهر", "id": "65610", "province_id": "65524"},
|
||||||
|
{"name": "شهرضا", "id": "65611", "province_id": "65524"},
|
||||||
|
{"name": "فریدن", "id": "65612", "province_id": "65524"},
|
||||||
|
{"name": "فریدونشهر", "id": "65613", "province_id": "65524"},
|
||||||
|
{"name": "فلاورجان", "id": "65614", "province_id": "65524"},
|
||||||
|
{"name": "گلپایگان", "id": "65616", "province_id": "65524"},
|
||||||
|
{"name": "مبارکه", "id": "65618", "province_id": "65524"},
|
||||||
|
{"name": "میمه", "id": "66906", "province_id": "65524"},
|
||||||
|
{"name": "نائین", "id": "65619", "province_id": "65524"},
|
||||||
|
{"name": "نجف آباد", "id": "65620", "province_id": "65524"},
|
||||||
|
{"name": "نطنز", "id": "65621", "province_id": "65524"},
|
||||||
|
{"name": "هرند", "id": "66888", "province_id": "65524"},
|
||||||
|
{"name": "ورزنه", "id": "66889", "province_id": "65524"},
|
||||||
|
{"name": "کاشان", "id": "65615", "province_id": "65524"},
|
||||||
|
{"name": "کوهپایه", "id": "66059", "province_id": "65524"},
|
||||||
|
{"name": "اشتهارد", "id": "66855", "province_id": "65525"},
|
||||||
|
{"name": "چهار باغ", "id": "66096", "province_id": "65525"},
|
||||||
|
{"name": "ساوجبلاغ", "id": "65622", "province_id": "65525"},
|
||||||
|
{"name": "طالقان", "id": "65623", "province_id": "65525"},
|
||||||
|
{"name": "فردیس", "id": "66877", "province_id": "65525"},
|
||||||
|
{"name": "نظر آباد", "id": "65625", "province_id": "65525"},
|
||||||
|
{"name": "کرج", "id": "65624", "province_id": "65525"},
|
||||||
|
{"name": "آبدانان", "id": "65626", "province_id": "65526"},
|
||||||
|
{"name": "ایلام", "id": "65627", "province_id": "65526"},
|
||||||
|
{"name": "ایوان", "id": "65628", "province_id": "65526"},
|
||||||
|
{"name": "بدره", "id": "66830", "province_id": "65526"},
|
||||||
|
{"name": "چرداول", "id": "66829", "province_id": "65526"},
|
||||||
|
{"name": "چوار", "id": "66107", "province_id": "65526"},
|
||||||
|
{"name": "درهشهر", "id": "66831", "province_id": "65526"},
|
||||||
|
{"name": "دهلران", "id": "65630", "province_id": "65526"},
|
||||||
|
{"name": "سیروان", "id": "66832", "province_id": "65526"},
|
||||||
|
{"name": "ملکشاهی", "id": "65632", "province_id": "65526"},
|
||||||
|
{"name": "مهران", "id": "65633", "province_id": "65526"},
|
||||||
|
{"name": "هلیلان", "id": "66118", "province_id": "65526"},
|
||||||
|
{"name": "بوشهر", "id": "65634", "province_id": "65527"},
|
||||||
|
{"name": "تنگستان", "id": "65635", "province_id": "65527"},
|
||||||
|
{"name": "جم", "id": "65636", "province_id": "65527"},
|
||||||
|
{"name": "دشتستان", "id": "65637", "province_id": "65527"},
|
||||||
|
{"name": "دشتی", "id": "65638", "province_id": "65527"},
|
||||||
|
{"name": "دیر", "id": "65639", "province_id": "65527"},
|
||||||
|
{"name": "دیلم", "id": "65640", "province_id": "65527"},
|
||||||
|
{"name": "عسلویه", "id": "66142", "province_id": "65527"},
|
||||||
|
{"name": "گناوه", "id": "65642", "province_id": "65527"},
|
||||||
|
{"name": "کنگان", "id": "65641", "province_id": "65527"},
|
||||||
|
{"name": "اسلامشهر", "id": "65643", "province_id": "65528"},
|
||||||
|
{"name": "بهارستان", "id": "65644", "province_id": "65528"},
|
||||||
|
{"name": "پاکدشت", "id": "65645", "province_id": "65528"},
|
||||||
|
{"name": "پردیس", "id": "66867", "province_id": "65528"},
|
||||||
|
{"name": "پیشوا", "id": "65646", "province_id": "65528"},
|
||||||
|
{"name": "تهران", "id": "65647", "province_id": "65528"},
|
||||||
|
{"name": "دماوند", "id": "65648", "province_id": "65528"},
|
||||||
|
{"name": "رباط کریم", "id": "65649", "province_id": "65528"},
|
||||||
|
{"name": "ری", "id": "65650", "province_id": "65528"},
|
||||||
|
{"name": "شمیرانات", "id": "65651", "province_id": "65528"},
|
||||||
|
{"name": "شهریار", "id": "65652", "province_id": "65528"},
|
||||||
|
{"name": "فیروز کوه", "id": "65653", "province_id": "65528"},
|
||||||
|
{"name": "قدس", "id": "65654", "province_id": "65528"},
|
||||||
|
{"name": "قرچک", "id": "66866", "province_id": "65528"},
|
||||||
|
{"name": "ملارد", "id": "65655", "province_id": "65528"},
|
||||||
|
{"name": "ورامین", "id": "65656", "province_id": "65528"},
|
||||||
|
{"name": "اردل", "id": "65657", "province_id": "65529"},
|
||||||
|
{"name": "بروجن", "id": "65658", "province_id": "65529"},
|
||||||
|
{"name": "بن", "id": "66875", "province_id": "65529"},
|
||||||
|
{"name": "خانمیرزا", "id": "66183", "province_id": "65529"},
|
||||||
|
{"name": "سامان", "id": "66876", "province_id": "65529"},
|
||||||
|
{"name": "شهر کرد", "id": "65659", "province_id": "65529"},
|
||||||
|
{"name": "فارسان", "id": "65660", "province_id": "65529"},
|
||||||
|
{"name": "فرخ شهر", "id": "66907", "province_id": "65529"},
|
||||||
|
{"name": "فلارد", "id": "66184", "province_id": "65529"},
|
||||||
|
{"name": "لردگان", "id": "65663", "province_id": "65529"},
|
||||||
|
{"name": "کوهرنگ", "id": "65661", "province_id": "65529"},
|
||||||
|
{"name": "کیار", "id": "65662", "province_id": "65529"},
|
||||||
|
{"name": "بشرویه", "id": "65664", "province_id": "65530"},
|
||||||
|
{"name": "بیرجند", "id": "65665", "province_id": "65530"},
|
||||||
|
{"name": "خوسف", "id": "66834", "province_id": "65530"},
|
||||||
|
{"name": "درمیان", "id": "65666", "province_id": "65530"},
|
||||||
|
{"name": "زیرکوه", "id": "66863", "province_id": "65530"},
|
||||||
|
{"name": "سرایان", "id": "65667", "province_id": "65530"},
|
||||||
|
{"name": "سربیشه", "id": "65668", "province_id": "65530"},
|
||||||
|
{"name": "طبس", "id": "66864", "province_id": "65530"},
|
||||||
|
{"name": "فردوس", "id": "65669", "province_id": "65530"},
|
||||||
|
{"name": "قائنات", "id": "65670", "province_id": "65530"},
|
||||||
|
{"name": "نهبندان", "id": "65671", "province_id": "65530"},
|
||||||
|
{"name": "باخرز", "id": "65672", "province_id": "65531"},
|
||||||
|
{"name": "بجستان", "id": "65673", "province_id": "65531"},
|
||||||
|
{"name": "بردسکن", "id": "65674", "province_id": "65531"},
|
||||||
|
{"name": "تایباد", "id": "65676", "province_id": "65531"},
|
||||||
|
{"name": "تربت جام", "id": "65678", "province_id": "65531"},
|
||||||
|
{"name": "تربت حیدریه", "id": "65679", "province_id": "65531"},
|
||||||
|
{"name": "جغتای", "id": "65680", "province_id": "65531"},
|
||||||
|
{"name": "جوین", "id": "65681", "province_id": "65531"},
|
||||||
|
{"name": "چناران", "id": "65682", "province_id": "65531"},
|
||||||
|
{"name": "خلیل آباد", "id": "65683", "province_id": "65531"},
|
||||||
|
{"name": "خواف", "id": "65684", "province_id": "65531"},
|
||||||
|
{"name": "خوشاب", "id": "65685", "province_id": "65531"},
|
||||||
|
{"name": "داورزن", "id": "66835", "province_id": "65531"},
|
||||||
|
{"name": "درگز", "id": "65686", "province_id": "65531"}
|
||||||
|
]
|
||||||
|
iranprovince = [
|
||||||
|
{"name": "همدان", "id": "65550", "address": "https://habackend.rasadyaar.ir/"},
|
||||||
|
{"name": "مرکزی", "id": "65548", "address": "https://mabackend.rasadyaar.ir/"},
|
||||||
|
{"name": "بوشهر", "id": "65527", "address": "https://bubackend.rasadyaar.ir/"},
|
||||||
|
{"name": "آذربایجان شرقی", "id": "65521"},
|
||||||
|
{"name": "آذربایجان غربی", "id": "65522"},
|
||||||
|
{"name": "اردبیل", "id": "65523"},
|
||||||
|
{"name": "اصفهان", "id": "65524"},
|
||||||
|
{"name": "البرز", "id": "65525"},
|
||||||
|
{"name": "ایلام", "id": "65526"},
|
||||||
|
{"name": "تهران", "id": "65528"},
|
||||||
|
{"name": "چهار محال و بختیاری", "id": "65529"},
|
||||||
|
{"name": "خراسان جنوبی", "id": "65530"},
|
||||||
|
{"name": "خراسان رضوی", "id": "65531"},
|
||||||
|
{"name": "خراسان شمالی", "id": "65532"},
|
||||||
|
{"name": "خوزستان", "id": "65533"},
|
||||||
|
{"name": "زنجان", "id": "65534"},
|
||||||
|
{"name": "سمنان", "id": "65535"},
|
||||||
|
{"name": "سیستان و بلوچستان", "id": "65536"},
|
||||||
|
{"name": "فارس", "id": "65537"},
|
||||||
|
{"name": "قزوین", "id": "65538"},
|
||||||
|
{"name": "قم", "id": "65539"},
|
||||||
|
{"name": "کردستان", "id": "65540"},
|
||||||
|
{"name": "کرمان", "id": "65541"},
|
||||||
|
{"name": "کرمانشاه", "id": "65542"},
|
||||||
|
{"name": "کهکیلویه و بویراحمد", "id": "65543"},
|
||||||
|
{"name": "گلستان", "id": "65544"},
|
||||||
|
{"name": "گیلان", "id": "65545"},
|
||||||
|
{"name": "لرستان", "id": "65546"},
|
||||||
|
{"name": "مازندران", "id": "65547"},
|
||||||
|
{"name": "هرمزگان", "id": "65549"},
|
||||||
|
{"name": "یزد", "id": "65551"},
|
||||||
|
]
|
||||||
|
|
||||||
|
from fuzzywuzzy import fuzz
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_text(text):
|
||||||
|
if not text:
|
||||||
|
return ""
|
||||||
|
text = re.sub(r'[^\w\s]', '', text)
|
||||||
|
text = re.sub(r'\s+', ' ', text).strip()
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
def find_best_match_for_province(input_text):
|
||||||
|
input_norm = normalize_text(input_text)
|
||||||
|
best_match = None
|
||||||
|
highest_score = 0
|
||||||
|
|
||||||
|
for item in iranprovince:
|
||||||
|
score = fuzz.ratio(input_norm, normalize_text(item['name']))
|
||||||
|
if score > highest_score and score > 70:
|
||||||
|
highest_score = score
|
||||||
|
best_match = item['name']
|
||||||
|
|
||||||
|
return best_match if highest_score > 0 else None
|
||||||
|
|
||||||
|
|
||||||
|
def get_province_id(province_name):
|
||||||
|
for i in iranprovince:
|
||||||
|
if i['name'] == province_name:
|
||||||
|
return i['id']
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def find_best_match_for_city(input_text, province_name):
|
||||||
|
input_norm = normalize_text(input_text)
|
||||||
|
best_match = None
|
||||||
|
highest_score = 0
|
||||||
|
province_id = get_province_id(province_name)
|
||||||
|
|
||||||
|
city = [city for city in irancity if int(city['province_id']) == int(province_id)]
|
||||||
|
|
||||||
|
for item in city:
|
||||||
|
score = fuzz.ratio(input_norm, normalize_text(item['name']))
|
||||||
|
if score > highest_score and score > 70:
|
||||||
|
highest_score = score
|
||||||
|
best_match = item['name']
|
||||||
|
|
||||||
|
return best_match if highest_score > 0 else None
|
||||||
|
|
||||||
|
|
||||||
|
def correct_province(input_text):
|
||||||
|
province_match = find_best_match_for_province(input_text)
|
||||||
|
if province_match:
|
||||||
|
return province_match
|
||||||
|
|
||||||
|
return input_text
|
||||||
|
|
||||||
|
|
||||||
|
def correct_city(input_text, province_name):
|
||||||
|
province_match = find_best_match_for_city(input_text, province_name)
|
||||||
|
if province_match:
|
||||||
|
return province_match
|
||||||
|
|
||||||
|
return input_text
|
||||||
|
|
||||||
|
# امل درمیان خرمبید دشتستان قائنات گناوه اسلام آباد
|
||||||
|
# corrupted_text = "کهگیلویه و بویراحمد"
|
||||||
|
# corrected = correct_province(corrupted_text)
|
||||||
|
# print(f"ورودی: {corrupted_text} -> خروجی: {corrected}")
|
||||||
|
|
||||||
|
|
||||||
|
# #تست شهر
|
||||||
|
# province_name = "کهگیلویه و بویراحمد"
|
||||||
|
# corrupted_text = "دنا"
|
||||||
|
# corrected = correct_city(corrupted_text,province_name)
|
||||||
|
# print(f"ورودی: {corrupted_text} -> خروجی: {corrected}")
|
||||||
2574
app/excel_processing.py
Normal file
2574
app/excel_processing.py
Normal file
File diff suppressed because it is too large
Load Diff
332
app/filtersets.py
Normal file
332
app/filtersets.py
Normal file
@@ -0,0 +1,332 @@
|
|||||||
|
import datetime
|
||||||
|
|
||||||
|
from django_filters import rest_framework as filters
|
||||||
|
|
||||||
|
from app.models import Poultry, PoultryHatching, TransportingChickenDetail, Hatching, TransportingDetail, KillHouse, \
|
||||||
|
TransportCarcassDetail, Driver, Guilds, AllProductsTransport
|
||||||
|
|
||||||
|
|
||||||
|
class PoultryFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = Poultry
|
||||||
|
fields = [
|
||||||
|
'UserName',
|
||||||
|
'FirstName',
|
||||||
|
'LastName',
|
||||||
|
'UnitName',
|
||||||
|
'PartIdCode',
|
||||||
|
'UnitId',
|
||||||
|
'LocationIdProvince',
|
||||||
|
'LocationIdCity'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class PoultryHatchingFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = PoultryHatching
|
||||||
|
fields = [
|
||||||
|
'DesCertId',
|
||||||
|
'RequestCode',
|
||||||
|
'Mobile',
|
||||||
|
'PartIdCode',
|
||||||
|
'EpidemiologicCode',
|
||||||
|
'LocationNameProvince',
|
||||||
|
'LocationNameCity',
|
||||||
|
'poultry__UserName',
|
||||||
|
'poultry__FirstName',
|
||||||
|
'poultry__LastName',
|
||||||
|
'poultry__UnitName',
|
||||||
|
'poultry__PartIdCode',
|
||||||
|
'poultry__UnitId',
|
||||||
|
'LocationIdProvince',
|
||||||
|
'LocationIdCity',
|
||||||
|
'LocationNameCity',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class HatchingsFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = Hatching
|
||||||
|
fields = [
|
||||||
|
'UnitName',
|
||||||
|
'ProvinceName',
|
||||||
|
'CityName',
|
||||||
|
'PartIdCode',
|
||||||
|
'RequestCode',
|
||||||
|
'poultry__UserName',
|
||||||
|
'poultry__FirstName',
|
||||||
|
'poultry__LastName',
|
||||||
|
'poultry__UnitName',
|
||||||
|
'poultry__PartIdCode',
|
||||||
|
'poultry__UnitId',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class TransportingChickenDetailFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = TransportingChickenDetail
|
||||||
|
fields = [
|
||||||
|
'DesUnitName',
|
||||||
|
'DesPartIdCode',
|
||||||
|
'SourceUnitPartIdCode',
|
||||||
|
'SourceUnitName',
|
||||||
|
'SourceCertId',
|
||||||
|
'hatching__DesCertId',
|
||||||
|
'hatching__LocationNameProvince',
|
||||||
|
'hatching__LocationNameCity',
|
||||||
|
'hatching__poultry__UserName',
|
||||||
|
'hatching__poultry__FirstName',
|
||||||
|
'hatching__poultry__LastName',
|
||||||
|
'hatching__poultry__UnitName',
|
||||||
|
'hatching__poultry__PartIdCode',
|
||||||
|
'hatching__poultry__UnitId',
|
||||||
|
'hatching__poultry__LocationIdProvince',
|
||||||
|
'hatching__poultry__LocationIdCity'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class HatchingFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = PoultryHatching
|
||||||
|
fields = [
|
||||||
|
'LocationNameCity',
|
||||||
|
'LocationNameProvince',
|
||||||
|
'HatchingAge',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class PoultryInfoFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = Poultry
|
||||||
|
fields = [
|
||||||
|
'LocationNameProvince',
|
||||||
|
'Province',
|
||||||
|
'LocationNameCity',
|
||||||
|
'City',
|
||||||
|
'FirstName',
|
||||||
|
'LastName',
|
||||||
|
'Mobile',
|
||||||
|
'SystemCode',
|
||||||
|
'EpidemiologicCode',
|
||||||
|
'PartIdCode',
|
||||||
|
'UnitName',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class HatchingCalculationsFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = PoultryHatching
|
||||||
|
fields = [
|
||||||
|
|
||||||
|
'LocationNameProvince',
|
||||||
|
'LocationNameCity',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class TransportingDetailFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = TransportingDetail
|
||||||
|
fields = [
|
||||||
|
|
||||||
|
'TrackingCode',
|
||||||
|
'Province',
|
||||||
|
'City',
|
||||||
|
'DesPartIdCode',
|
||||||
|
'Age',
|
||||||
|
'hatching__poultry__FirstName',
|
||||||
|
'hatching__poultry__PartIdCode',
|
||||||
|
'hatching__RequestCode',
|
||||||
|
'hatching__CityName',
|
||||||
|
'hatching__ProvinceName',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class KillHouseFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = KillHouse
|
||||||
|
fields = [
|
||||||
|
'PartIdCode',
|
||||||
|
'UnitName',
|
||||||
|
'Province',
|
||||||
|
'City',
|
||||||
|
'ProvinceId'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class CustomHatchingsFilterSet(filters.FilterSet):
|
||||||
|
city = filters.CharFilter(field_name='CityName', lookup_expr='icontains')
|
||||||
|
province = filters.CharFilter(field_name='ProvinceName', lookup_expr='icontains')
|
||||||
|
system_code = filters.CharFilter(field_name='SystemCode', lookup_expr='exact')
|
||||||
|
|
||||||
|
age = filters.NumberFilter(field_name='Age', lookup_expr='exact')
|
||||||
|
age__gt = filters.NumberFilter(field_name='Age', lookup_expr='gt')
|
||||||
|
age__gte = filters.NumberFilter(field_name='Age', lookup_expr='gte')
|
||||||
|
age__lt = filters.NumberFilter(field_name='Age', lookup_expr='lt')
|
||||||
|
age__lte = filters.NumberFilter(field_name='Age', lookup_expr='lte')
|
||||||
|
|
||||||
|
killing_age = filters.NumberFilter(field_name='KillingAve', lookup_expr='exact')
|
||||||
|
killing_age__gt = filters.NumberFilter(field_name='KillingAve', lookup_expr='gt')
|
||||||
|
killing_age__gte = filters.NumberFilter(field_name='KillingAve', lookup_expr='gte')
|
||||||
|
killing_age__lt = filters.NumberFilter(field_name='KillingAve', lookup_expr='lt')
|
||||||
|
killing_age__lte = filters.NumberFilter(field_name='KillingAve', lookup_expr='lte')
|
||||||
|
|
||||||
|
leftover__gt = filters.NumberFilter(field_name='LeftOver', lookup_expr='gt')
|
||||||
|
leftover__gte = filters.NumberFilter(field_name='LeftOver', lookup_expr='gte')
|
||||||
|
leftover__lt = filters.NumberFilter(field_name='LeftOver', lookup_expr='lt')
|
||||||
|
leftover__lte = filters.NumberFilter(field_name='LeftOver', lookup_expr='lte')
|
||||||
|
leftover__exact = filters.NumberFilter(field_name='LeftOver', lookup_expr='exact')
|
||||||
|
|
||||||
|
date1__date__gte = filters.DateFilter(method='filter_date_range')
|
||||||
|
date2__date__lte = filters.DateFilter(method='filter_date_range')
|
||||||
|
state = filters.CharFilter(method='filter_state')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Hatching
|
||||||
|
fields = [
|
||||||
|
'city', 'province', 'system_code',
|
||||||
|
'age', 'age__gt', 'age__gte', 'age__lt', 'age__lte',
|
||||||
|
'killing_age', 'killing_age__gt', 'killing_age__gte', 'killing_age__lt', 'killing_age__lte',
|
||||||
|
'leftover__gt', 'leftover__gte', 'leftover__lt', 'leftover__lte', 'leftover__exact',
|
||||||
|
'date1__date__gte', 'date2__date__lte', 'state'
|
||||||
|
]
|
||||||
|
|
||||||
|
def filter_date_range(self, queryset, name, value):
|
||||||
|
date1 = self.data.get('date1__date__gte')
|
||||||
|
date2 = self.data.get('date2__date__lte')
|
||||||
|
if date1 and date2:
|
||||||
|
try:
|
||||||
|
date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date()
|
||||||
|
date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date()
|
||||||
|
return queryset.filter(Date__date__gte=date1, Date__date__lte=date2)
|
||||||
|
except ValueError:
|
||||||
|
return queryset
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
def filter_state(self, queryset, name, value):
|
||||||
|
state = self.data.get('state')
|
||||||
|
if state:
|
||||||
|
if state == 'pending':
|
||||||
|
queryset = queryset.filter(Age__lte=70)
|
||||||
|
else:
|
||||||
|
queryset = queryset.filter(Age__gt=70)
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
class TransportingDetailCustomFilterSet(filters.FilterSet):
|
||||||
|
unitname = filters.CharFilter(field_name='DesUnitName', lookup_expr='icontains')
|
||||||
|
province = filters.CharFilter(field_name='Province', lookup_expr='icontains')
|
||||||
|
city = filters.CharFilter(field_name='City', lookup_expr='icontains')
|
||||||
|
|
||||||
|
code = filters.CharFilter(field_name='DesPartIdCode', lookup_expr='exact')
|
||||||
|
trackingstatus = filters.CharFilter(field_name='TrackingStatusDescription', lookup_expr='exact')
|
||||||
|
|
||||||
|
quantity__gt = filters.NumberFilter(field_name='GoodAmount', lookup_expr='gt')
|
||||||
|
quantity__gte = filters.NumberFilter(field_name='GoodAmount', lookup_expr='gte')
|
||||||
|
quantity__lt = filters.NumberFilter(field_name='GoodAmount', lookup_expr='lt')
|
||||||
|
quantity__lte = filters.NumberFilter(field_name='GoodAmount', lookup_expr='lte')
|
||||||
|
|
||||||
|
age = filters.NumberFilter(field_name='Age', lookup_expr='exact')
|
||||||
|
age__gt = filters.NumberFilter(field_name='Age', lookup_expr='gt')
|
||||||
|
age__gte = filters.NumberFilter(field_name='Age', lookup_expr='gte')
|
||||||
|
age__lt = filters.NumberFilter(field_name='Age', lookup_expr='lt')
|
||||||
|
age__lte = filters.NumberFilter(field_name='Age', lookup_expr='lte')
|
||||||
|
|
||||||
|
date1__date__gte = filters.DateFilter(method='filter_date_range')
|
||||||
|
date2__date__lte = filters.DateFilter(method='filter_date_range')
|
||||||
|
poultry_unitname = filters.DateFilter(method='filter_poultry_unit_name')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = TransportingDetail
|
||||||
|
fields = [
|
||||||
|
'unitname',
|
||||||
|
'province',
|
||||||
|
'city',
|
||||||
|
'code',
|
||||||
|
'trackingstatus',
|
||||||
|
'quantity__gt',
|
||||||
|
'quantity__gte',
|
||||||
|
'quantity__lt',
|
||||||
|
'quantity__lte',
|
||||||
|
'age',
|
||||||
|
'age__gt',
|
||||||
|
'age__gte',
|
||||||
|
'age__lt',
|
||||||
|
'age__lte',
|
||||||
|
'date1__date__gte',
|
||||||
|
'date2__date__lte',
|
||||||
|
'poultry_unitname',
|
||||||
|
]
|
||||||
|
|
||||||
|
def filter_date_range(self, queryset, name, value):
|
||||||
|
date1 = self.data.get('date1__date__gte')
|
||||||
|
date2 = self.data.get('date2__date__lte')
|
||||||
|
if date1 and date2:
|
||||||
|
try:
|
||||||
|
date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date()
|
||||||
|
date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date()
|
||||||
|
return queryset.filter(Date__date__gte=date1, Date__date__lte=date2)
|
||||||
|
except ValueError:
|
||||||
|
return queryset
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
def filter_poultry_unit_name(self, queryset, name, value):
|
||||||
|
return queryset.filter(poultry__UnitName__icontains=value)
|
||||||
|
|
||||||
|
|
||||||
|
class TransportCarcassDetailFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = TransportCarcassDetail
|
||||||
|
fields = [
|
||||||
|
'tracking',
|
||||||
|
'origin_province',
|
||||||
|
'origin_city',
|
||||||
|
'destination_province',
|
||||||
|
'destination_city',
|
||||||
|
'product',
|
||||||
|
'owner']
|
||||||
|
|
||||||
|
|
||||||
|
class DriverFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = Driver
|
||||||
|
fields = [
|
||||||
|
'owner_name',
|
||||||
|
'driver_name',
|
||||||
|
'city',
|
||||||
|
'province',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class GuildsFilterSet(filters.FilterSet):
|
||||||
|
class Meta:
|
||||||
|
model = Guilds
|
||||||
|
fields = [
|
||||||
|
'name',
|
||||||
|
'province',
|
||||||
|
'city',
|
||||||
|
'jihadi_code'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class AllProductsTransportFilterSet(filters.FilterSet):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = AllProductsTransport
|
||||||
|
fields = [
|
||||||
|
'record_id',
|
||||||
|
'tracking',
|
||||||
|
'product',
|
||||||
|
'items',
|
||||||
|
'origin_province',
|
||||||
|
'origin_city',
|
||||||
|
'destination_province',
|
||||||
|
'destination_city',
|
||||||
|
'owner',
|
||||||
|
'driver_name',
|
||||||
|
'car_tracking_code',
|
||||||
|
'out',
|
||||||
|
'quantity',
|
||||||
|
'jihadi_destination',
|
||||||
|
'jihadi_origin',
|
||||||
|
|
||||||
|
]
|
||||||
157
app/helper.py
Normal file
157
app/helper.py
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
import re
|
||||||
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
from requests.adapters import HTTPAdapter
|
||||||
|
from requests.packages.urllib3.util.ssl_ import create_urllib3_context
|
||||||
|
|
||||||
|
from django.db.models import Q
|
||||||
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
from rest_framework import status
|
||||||
|
from rest_framework.decorators import api_view, permission_classes
|
||||||
|
from rest_framework.permissions import AllowAny
|
||||||
|
from rest_framework.response import Response
|
||||||
|
|
||||||
|
from app.cityandprovince import correct_province, correct_city, search_city_list, \
|
||||||
|
search_province_list
|
||||||
|
from app.models import TransportingDetail, Guilds, AllProductsTransport
|
||||||
|
from app.serializers import TransportingDetailForUpdateSerializer, AllProductsTransportSerializer
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(["POST"])
|
||||||
|
@permission_classes([AllowAny])
|
||||||
|
@csrf_exempt
|
||||||
|
def get_bar_info(request):
|
||||||
|
kill_houses = request.data
|
||||||
|
kill_houses = dict(kill_houses)['kill_house']
|
||||||
|
bars = AllProductsTransport.objects.filter(trash=False, out=True, jihadi_destination__in=kill_houses,
|
||||||
|
unloading='تخلیه شده.',product='مرغ زنده -جهت كشتار',hatching__isnull=False,
|
||||||
|
date__gte='2025-12-25').order_by('-date')
|
||||||
|
ser_data = AllProductsTransportSerializer(bars, many=True).data
|
||||||
|
return Response(ser_data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(["GET"])
|
||||||
|
@permission_classes([AllowAny])
|
||||||
|
@csrf_exempt
|
||||||
|
def test_city(request):
|
||||||
|
excluded_provinces = search_province_list
|
||||||
|
excluded_city = search_city_list
|
||||||
|
# hatchings = Hatching.objects.filter(
|
||||||
|
# ~Q(ProvinceName__in=excluded_provinces) | ~Q(CityName__in=excluded_city)
|
||||||
|
# )
|
||||||
|
transport = TransportingDetail.objects.filter(
|
||||||
|
~Q(Province__in=excluded_provinces) | ~Q(City__in=excluded_city)).only('Province', 'City')
|
||||||
|
# hatchings = Hatching.objects.filter(
|
||||||
|
# Q(ProvinceName__contains='<27>') | Q( CityName__contains='<27>')
|
||||||
|
# )
|
||||||
|
l = 1
|
||||||
|
for t in transport:
|
||||||
|
print(l)
|
||||||
|
if t.Province not in excluded_provinces:
|
||||||
|
t.Province = correct_province(t.Province)
|
||||||
|
t.save()
|
||||||
|
if t.City not in excluded_city:
|
||||||
|
t.CityName = correct_city(t.City, t.Province)
|
||||||
|
t.save()
|
||||||
|
l += 1
|
||||||
|
# if hatching:
|
||||||
|
|
||||||
|
return Response('lo')
|
||||||
|
|
||||||
|
|
||||||
|
class SSLAdapter(HTTPAdapter):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.context = create_urllib3_context()
|
||||||
|
self.context.options |= 0x4 # OP_LEGACY_SERVER_CONNECT
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def init_poolmanager(self, *args, **kwargs):
|
||||||
|
kwargs['ssl_context'] = self.context
|
||||||
|
return super().init_poolmanager(*args, **kwargs)
|
||||||
|
|
||||||
|
def build_response(self, req, resp):
|
||||||
|
resp = super().build_response(req, resp)
|
||||||
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
def check_quarantine_code(lst):
|
||||||
|
result_code = []
|
||||||
|
for code in lst:
|
||||||
|
session = requests.Session()
|
||||||
|
session.mount('https://', SSLAdapter())
|
||||||
|
data = {'gid': str(code)}
|
||||||
|
m = session.post('https://e.ivo.ir/Rahgiri/Gidprnt.aspx', data=data, verify=False,
|
||||||
|
headers={
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
||||||
|
' (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'})
|
||||||
|
context = BeautifulSoup(m.text, 'html.parser')
|
||||||
|
table = context.find_all('table')
|
||||||
|
if table[5:6]:
|
||||||
|
row = context.find('div', align="right")
|
||||||
|
if row:
|
||||||
|
content = row.get_text(separator=" ", strip=True)
|
||||||
|
date_match = re.search(r'تاريخ:(\d{4}/\d{2}/\d{2})', content)
|
||||||
|
if date_match:
|
||||||
|
for i in table[5:6]:
|
||||||
|
row = i.find_all('tr')
|
||||||
|
for r in row[1:2]:
|
||||||
|
quantity = r.find('td')
|
||||||
|
match = re.search(r'\d+', quantity.text)
|
||||||
|
if match:
|
||||||
|
result_code.append(code)
|
||||||
|
return result_code
|
||||||
|
|
||||||
|
|
||||||
|
def get_hatching_permit_code(code):
|
||||||
|
result = {}
|
||||||
|
|
||||||
|
session = requests.Session()
|
||||||
|
session.mount('https://', SSLAdapter())
|
||||||
|
data = {'gid': str(code)}
|
||||||
|
m = session.post(
|
||||||
|
'https://e.ivo.ir/Rahgiri/Gidprnt.aspx',
|
||||||
|
data=data,
|
||||||
|
verify=False,
|
||||||
|
headers={
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
||||||
|
' (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
|
||||||
|
},
|
||||||
|
timeout=20,
|
||||||
|
)
|
||||||
|
text = m.text
|
||||||
|
permit = None
|
||||||
|
match = re.search(r'کد\s*مجوز\s*جوجه\s*ریزی\s*[::]\s*([0-9۰-۹]+)', text)
|
||||||
|
if match:
|
||||||
|
raw_permit = match.group(1)
|
||||||
|
trans = str.maketrans('۰۱۲۳۴۵۶۷۸۹', '0123456789')
|
||||||
|
permit = raw_permit.translate(trans)
|
||||||
|
if permit:
|
||||||
|
result[str(code)] = permit
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(["GET"])
|
||||||
|
@permission_classes([AllowAny])
|
||||||
|
@csrf_exempt
|
||||||
|
def api_get_hatching_permit_code(request):
|
||||||
|
code = request.GET.get('code')
|
||||||
|
if not code:
|
||||||
|
return Response({'detail': 'code query param is required'}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
try:
|
||||||
|
data = get_hatching_permit_code(code)
|
||||||
|
return Response(data, status=status.HTTP_200_OK)
|
||||||
|
except Exception as e:
|
||||||
|
return Response({'detail': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||||
|
|
||||||
|
|
||||||
|
def create_guild(**info):
|
||||||
|
|
||||||
|
Guilds(
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class SSLAdapter(HTTPAdapter):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.context = create_urllib3_context()
|
||||||
|
self.context.options |= 0x4 # OP_LEGACY_SERVER_CONNECT
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
327
app/helper_excel.py
Normal file
327
app/helper_excel.py
Normal file
@@ -0,0 +1,327 @@
|
|||||||
|
from io import BytesIO
|
||||||
|
|
||||||
|
import jdatetime
|
||||||
|
import openpyxl
|
||||||
|
from django.http import HttpResponse
|
||||||
|
from openpyxl import Workbook
|
||||||
|
from openpyxl.chart import LineChart, Reference, BarChart
|
||||||
|
from openpyxl.styles import PatternFill, Alignment, Font
|
||||||
|
from openpyxl.utils import get_column_letter
|
||||||
|
|
||||||
|
correction_dict = {
|
||||||
|
'<EFBFBD><EFBFBD>ربراکرز (آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آ<EFBFBD><EFBFBD>براکرز (آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آر<EFBFBD><EFBFBD>راکرز (آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آرب<EFBFBD><EFBFBD>اکرز (آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربر<EFBFBD><EFBFBD>کرز (آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربرا<EFBFBD><EFBFBD>رز (آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراک<EFBFBD><EFBFBD>ز (آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکر<EFBFBD><EFBFBD> (آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکرز<EFBFBD><EFBFBD> آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکرز (<28><>پلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکرز (آ<><D8A2>لاس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکرز (آپ<D8A2><D9BE>اس)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکرز (آپل<D9BE><D984>س)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکرز (آپلا<D984><D8A7>)': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکرز (آپلاس<D8A7><D8B3>': 'آربراکرز (آپلاس)',
|
||||||
|
'آربراکرز<EFBFBD><EFBFBD>(آپلاس)': 'آربراکرز (آپلاس)',
|
||||||
|
|
||||||
|
'<EFBFBD><EFBFBD>اس': 'راس',
|
||||||
|
'ر<EFBFBD><EFBFBD>س': 'راس',
|
||||||
|
'را<EFBFBD><EFBFBD>': 'راس',
|
||||||
|
|
||||||
|
'<EFBFBD><EFBFBD>رین': 'آرین',
|
||||||
|
'آ<EFBFBD><EFBFBD>ین': 'آرین',
|
||||||
|
'آر<EFBFBD><EFBFBD>ن': 'آرین',
|
||||||
|
'آری<EFBFBD><EFBFBD>': 'آرین',
|
||||||
|
|
||||||
|
'<EFBFBD><EFBFBD>ندین ریور': 'ایندین ریور',
|
||||||
|
'ای<EFBFBD><EFBFBD>دین ریور': 'ایندین ریور',
|
||||||
|
'این<EFBFBD><EFBFBD>ین ریور': 'ایندین ریور',
|
||||||
|
'ایند<EFBFBD><EFBFBD>ن ریور': 'ایندین ریور',
|
||||||
|
'ایندی<EFBFBD><EFBFBD> ریور': 'ایندین ریور',
|
||||||
|
'ایندین<EFBFBD><EFBFBD>ریور': 'ایندین ریور',
|
||||||
|
'ایندین <20><>یور': 'ایندین ریور',
|
||||||
|
'ایندین ر<><D8B1>ور': 'ایندین ریور',
|
||||||
|
'ایندین ری<D8B1><DB8C>ر': 'ایندین ریور',
|
||||||
|
'ایندین ریو<DB8C><D988>': 'ایندین ریور',
|
||||||
|
|
||||||
|
'<EFBFBD><EFBFBD>اب': 'کاب',
|
||||||
|
'ک<EFBFBD><EFBFBD>ب': 'کاب',
|
||||||
|
'کا<EFBFBD><EFBFBD>': 'کاب'
|
||||||
|
}
|
||||||
|
|
||||||
|
blue_fill = PatternFill(start_color="277358", fill_type="solid")
|
||||||
|
Alignment_CELL = Alignment(horizontal='center', vertical='center', wrap_text=True)
|
||||||
|
red_font = Font(color="C00000", bold=True)
|
||||||
|
GREEN_CELL = PatternFill(start_color="00B050", fill_type="solid")
|
||||||
|
RED_CELL = PatternFill(start_color="FCDFDC", fill_type="solid")
|
||||||
|
YELLOW_CELL = PatternFill(start_color="FFFF00", fill_type="solid")
|
||||||
|
ORANGE_CELL = PatternFill(start_color="FFC000", fill_type="solid")
|
||||||
|
BLUE_CELL = PatternFill(start_color="538DD5", fill_type="solid")
|
||||||
|
LIGHT_GREEN_CELL = PatternFill(start_color="92D050", fill_type="solid")
|
||||||
|
VERY_LIGHT_GREEN_CELL = PatternFill(start_color="5AFC56", fill_type="solid")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def shamsi_date(date,in_value=None):
|
||||||
|
if in_value:
|
||||||
|
sh_date=jdatetime.date.fromgregorian(
|
||||||
|
year=date.year,
|
||||||
|
month=date.month,
|
||||||
|
day=date.day
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
gh_date = jdatetime.date.fromgregorian(
|
||||||
|
year=date.year,
|
||||||
|
month=date.month,
|
||||||
|
day=date.day
|
||||||
|
).strftime('%Y-%m-%d')
|
||||||
|
reversed_date = reversed(gh_date.split("-"))
|
||||||
|
separate = "-"
|
||||||
|
sh_date = separate.join(reversed_date)
|
||||||
|
return sh_date
|
||||||
|
|
||||||
|
|
||||||
|
def create_header(worksheet, list, num, row, height=None, width=None,color=None,text_color=None,border_style=None):
|
||||||
|
for col_num, option in enumerate(list, num):
|
||||||
|
cell = worksheet.cell(row=row, column=col_num, value=option)
|
||||||
|
col_letter = get_column_letter(col_num)
|
||||||
|
cell.alignment = Alignment_CELL
|
||||||
|
if color is not None:
|
||||||
|
if color == 'green':
|
||||||
|
cell.fill=GREEN_CELL
|
||||||
|
elif color == 'orange':
|
||||||
|
cell.fill=ORANGE_CELL
|
||||||
|
elif color == 'blue':
|
||||||
|
cell.fill=BLUE_CELL
|
||||||
|
else:
|
||||||
|
cell.fill = PatternFill(start_color=color, fill_type="solid")
|
||||||
|
else:
|
||||||
|
cell.fill = blue_fill
|
||||||
|
if text_color is not None:
|
||||||
|
cell.font = Font(size=9, bold=True, color=text_color)
|
||||||
|
else:
|
||||||
|
cell.font = Font(size=9, bold=True, color='D9FFFFFF')
|
||||||
|
if height is not None:
|
||||||
|
worksheet.row_dimensions[row].height = height
|
||||||
|
if width is not None:
|
||||||
|
worksheet.column_dimensions[col_letter].width = width
|
||||||
|
if border_style is not None:
|
||||||
|
cell.border = openpyxl.styles.Border(
|
||||||
|
left=openpyxl.styles.Side(style=border_style),
|
||||||
|
right=openpyxl.styles.Side(style=border_style),
|
||||||
|
top=openpyxl.styles.Side(style=border_style),
|
||||||
|
bottom=openpyxl.styles.Side(style=border_style)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_header_freez(worksheet, list, num, row, header_row, height=None, width=None,len_with=None,different_cell=None):
|
||||||
|
for col_num, option in enumerate(list, num):
|
||||||
|
col_letter = get_column_letter(col_num)
|
||||||
|
cell = worksheet.cell(row=row, column=col_num, value=option)
|
||||||
|
cell.alignment = Alignment_CELL
|
||||||
|
cell.fill = blue_fill
|
||||||
|
cell.font = Font(size=10, bold=True, color='D9FFFFFF')
|
||||||
|
|
||||||
|
if height is not None:
|
||||||
|
worksheet.row_dimensions[row].height = height
|
||||||
|
if len(option) > worksheet.column_dimensions[col_letter].width:
|
||||||
|
worksheet.column_dimensions[col_letter].width = len(option) + 2
|
||||||
|
if width is not None:
|
||||||
|
worksheet.column_dimensions[col_letter].width = width
|
||||||
|
if len_with is not None:
|
||||||
|
if len(option) > worksheet.column_dimensions[col_letter].width:
|
||||||
|
worksheet.column_dimensions[col_letter].width = len(option) + 3
|
||||||
|
if different_cell is not None:
|
||||||
|
if option == different_cell:
|
||||||
|
cell.fill = PatternFill(start_color="C00000", fill_type="solid")
|
||||||
|
worksheet.freeze_panes = worksheet[f'A{header_row}']
|
||||||
|
max_col = worksheet.max_column
|
||||||
|
range_str = f'A{header_row - 1}:{get_column_letter(max_col)}{worksheet.max_row}'
|
||||||
|
worksheet.auto_filter.ref = range_str
|
||||||
|
|
||||||
|
|
||||||
|
def excel_description(worksheet, row1, description, size=None, color=None,my_color=None, row2=None):
|
||||||
|
worksheet[row1] = description
|
||||||
|
worksheet[row1].alignment = Alignment_CELL
|
||||||
|
if size is not None:
|
||||||
|
worksheet[row1].font = Font(size=size)
|
||||||
|
if color is not None:
|
||||||
|
worksheet[row1].font = red_font
|
||||||
|
if my_color is not None:
|
||||||
|
worksheet[row1].font = PatternFill(start_color=my_color, fill_type="solid")
|
||||||
|
|
||||||
|
if row2 is not None:
|
||||||
|
merge_range = f'{row1}:{row2}'
|
||||||
|
worksheet.merge_cells(merge_range)
|
||||||
|
|
||||||
|
|
||||||
|
def create_value(worksheet, list, l, num, border_style=None, m=None, height=None, color=None, width=None,
|
||||||
|
different_cell=None, different_value=None, item_num=None, item_color=None):
|
||||||
|
|
||||||
|
color_dict = {
|
||||||
|
'green': GREEN_CELL,
|
||||||
|
'yellow': YELLOW_CELL,
|
||||||
|
'blue': BLUE_CELL,
|
||||||
|
'red': RED_CELL,
|
||||||
|
'light_green': LIGHT_GREEN_CELL,
|
||||||
|
'very_light_green': VERY_LIGHT_GREEN_CELL
|
||||||
|
}
|
||||||
|
|
||||||
|
for item in range(len(list)):
|
||||||
|
cell = worksheet.cell(row=l, column=item + num, value=list[item])
|
||||||
|
cell.alignment = Alignment_CELL
|
||||||
|
|
||||||
|
if border_style:
|
||||||
|
cell.border = openpyxl.styles.Border(
|
||||||
|
left=openpyxl.styles.Side(style=border_style),
|
||||||
|
right=openpyxl.styles.Side(style=border_style),
|
||||||
|
top=openpyxl.styles.Side(style=border_style),
|
||||||
|
bottom=openpyxl.styles.Side(style=border_style)
|
||||||
|
)
|
||||||
|
|
||||||
|
value = list[item]
|
||||||
|
if isinstance(value, (int, float)) and value != 0:
|
||||||
|
cell.number_format = '#,###'
|
||||||
|
else:
|
||||||
|
cell.value = value
|
||||||
|
|
||||||
|
cell.font = Font(size=10, bold=True)
|
||||||
|
|
||||||
|
if m is not None and m % 2 != 0:
|
||||||
|
cell.fill = PatternFill(start_color="D6F6FE", fill_type="solid")
|
||||||
|
|
||||||
|
if height is not None:
|
||||||
|
worksheet.row_dimensions[l + 1].height = height
|
||||||
|
|
||||||
|
if item_num is not None and item == item_num:
|
||||||
|
if item_color:
|
||||||
|
cell.fill = item_color
|
||||||
|
elif color in color_dict:
|
||||||
|
cell.fill = color_dict[color]
|
||||||
|
|
||||||
|
if different_cell is not None and list[different_cell] == different_value:
|
||||||
|
cell.fill = RED_CELL
|
||||||
|
|
||||||
|
if width is not None:
|
||||||
|
worksheet.column_dimensions[openpyxl.utils.get_column_letter(item + num)].width = width
|
||||||
|
|
||||||
|
def merge_cells(worksheet, l, s, cell1=None, cell2=None, lst=None):
|
||||||
|
if lst is not None:
|
||||||
|
for col in lst:
|
||||||
|
rng = f'{col}{l}:{col}{l + s}'
|
||||||
|
worksheet.merge_cells(rng)
|
||||||
|
worksheet[col + f'{l}'].alignment = Alignment_CELL
|
||||||
|
else:
|
||||||
|
for col in range(ord(f'{cell1}'), ord(f'{cell2}') + 1):
|
||||||
|
rng = f'{chr(col)}{l}:{chr(col)}{l + s}'
|
||||||
|
worksheet.merge_cells(rng)
|
||||||
|
worksheet[chr(col) + f'{l}'].alignment = Alignment_CELL
|
||||||
|
|
||||||
|
def add_header(worksheet):
|
||||||
|
worksheet.oddHeader.center.text = "سامانه رصدیار"
|
||||||
|
worksheet.oddHeader.center.size = 14 # تنظیم اندازه فونت
|
||||||
|
worksheet.oddHeader.center.font = "Arial,Bold" # تنظیم فونت و ضخامت
|
||||||
|
|
||||||
|
# همچنین میتوانید از هدرهای چپ و راست هم استفاده کنید
|
||||||
|
# worksheet.oddHeader.right.text = f"تاریخ: {shamsi_now_date}"
|
||||||
|
|
||||||
|
def cell_color_changer(worksheet, row, start_index, end_index, custom_color):
|
||||||
|
for item in range(start_index, end_index):
|
||||||
|
cell = worksheet.cell(row=row, column=item)
|
||||||
|
cell.fill = PatternFill(start_color=custom_color, fill_type="solid")
|
||||||
|
|
||||||
|
|
||||||
|
def start_excel():
|
||||||
|
output = BytesIO()
|
||||||
|
workbook = Workbook()
|
||||||
|
worksheet = workbook.active
|
||||||
|
worksheet.sheet_view.rightToLeft = True
|
||||||
|
worksheet.insert_rows(1)
|
||||||
|
return workbook,worksheet,output
|
||||||
|
|
||||||
|
def close_excel(name):
|
||||||
|
workbook,worksheet,output=start_excel()
|
||||||
|
workbook.save(output)
|
||||||
|
output.seek(0)
|
||||||
|
|
||||||
|
response = HttpResponse(
|
||||||
|
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
||||||
|
response[
|
||||||
|
'Content-Disposition'] = f'attachment; filename="{name}.xlsx"'.encode(
|
||||||
|
'utf-8')
|
||||||
|
response.write(output.getvalue())
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def add_chart(
|
||||||
|
worksheet,
|
||||||
|
chart_type,
|
||||||
|
data_columns,
|
||||||
|
category_column,
|
||||||
|
start_row,
|
||||||
|
end_row,
|
||||||
|
chart_position,
|
||||||
|
chart_title,
|
||||||
|
x_axis_title,
|
||||||
|
y_axis_title,
|
||||||
|
chart_width=25, # عرض نمودار پیشفرض (واحد: cm)
|
||||||
|
chart_height=15
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
افزودن نمودار به صفحه اکسل.
|
||||||
|
|
||||||
|
ورودی:
|
||||||
|
worksheet (openpyxl.Worksheet): صفحه اکسل.
|
||||||
|
chart_type (str): نوع نمودار ("line" یا "bar").
|
||||||
|
data_columns (list): لیستی از ستونهای داده.
|
||||||
|
category_column (int): ستون دستهبندیها.
|
||||||
|
start_row (int): ردیف شروع دادهها.
|
||||||
|
end_row (int): ردیف پایان دادهها.
|
||||||
|
chart_position (str): محل قرار گرفتن نمودار.
|
||||||
|
chart_title (str): عنوان نمودار.
|
||||||
|
x_axis_title (str): عنوان محور X.
|
||||||
|
y_axis_title (str): عنوان محور Y.
|
||||||
|
chart_width (float): عرض نمودار (واحد: cm).
|
||||||
|
chart_height (float): ارتفاع نمودار (واحد: cm).
|
||||||
|
"""
|
||||||
|
|
||||||
|
if chart_type == 'line':
|
||||||
|
chart = LineChart()
|
||||||
|
chart.style = 20
|
||||||
|
elif chart_type == 'bar':
|
||||||
|
chart = BarChart()
|
||||||
|
else:
|
||||||
|
raise ValueError("chart_type باید 'line' یا 'bar' باشد.")
|
||||||
|
|
||||||
|
chart.title = chart_title
|
||||||
|
chart.y_axis.title = y_axis_title
|
||||||
|
chart.x_axis.title = x_axis_title
|
||||||
|
chart.width = chart_width
|
||||||
|
chart.height = chart_height
|
||||||
|
|
||||||
|
categories = Reference(worksheet, min_col=category_column, min_row=start_row, max_row=end_row)
|
||||||
|
data = Reference(worksheet, min_col=data_columns, min_row=start_row - 1, max_row=end_row)
|
||||||
|
chart.add_data(data, titles_from_data=True)
|
||||||
|
chart.set_categories(categories)
|
||||||
|
for series in chart.series:
|
||||||
|
series.graphicalProperties.line.solidFill = "277358"
|
||||||
|
series.graphicalProperties.line.width = 30000
|
||||||
|
|
||||||
|
worksheet.add_chart(chart, chart_position)
|
||||||
|
#example
|
||||||
|
# add_chart(
|
||||||
|
# worksheet=worksheet,
|
||||||
|
# chart_type='line',
|
||||||
|
# data_columns=7, # ستون وزن وارد شده
|
||||||
|
# category_column=2, # ستون نام سردخانهها
|
||||||
|
# start_row=7,
|
||||||
|
# end_row=l + 1,
|
||||||
|
# chart_position="A12",
|
||||||
|
# chart_title="نمودار تغییرات وزن در سردخانهها",
|
||||||
|
# x_axis_title="سردخانهها",
|
||||||
|
# y_axis_title="وزن (کیلوگرم)"
|
||||||
|
# )
|
||||||
138
app/migrations/0001_initial.py
Normal file
138
app/migrations/0001_initial.py
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
# Generated by Django 4.2.19 on 2025-02-26 11:13
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Poultry',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('create_date', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('modify_date', models.DateTimeField(auto_now=True)),
|
||||||
|
('trash', models.BooleanField(default=False)),
|
||||||
|
('UserName', models.CharField(max_length=200, null=True)),
|
||||||
|
('Password', models.CharField(max_length=200, null=True)),
|
||||||
|
('FirstName', models.CharField(max_length=200, null=True)),
|
||||||
|
('LastName', models.CharField(max_length=200, null=True)),
|
||||||
|
('UserGroupName', models.CharField(max_length=200, null=True)),
|
||||||
|
('UserRoleName', models.CharField(max_length=200, null=True)),
|
||||||
|
('UserGroupId', models.CharField(max_length=200, null=True)),
|
||||||
|
('UserRoleId', models.CharField(max_length=200, null=True)),
|
||||||
|
('Mobile', models.CharField(max_length=200, null=True)),
|
||||||
|
('Email', models.CharField(max_length=200, null=True)),
|
||||||
|
('UserIsActive', models.BooleanField(null=True)),
|
||||||
|
('UserIsActiveDescription', models.CharField(max_length=200, null=True)),
|
||||||
|
('RegDate', models.CharField(max_length=200, null=True)),
|
||||||
|
('RegDateShamsi', models.CharField(max_length=200, null=True)),
|
||||||
|
('RegDateShamsiWithTime', models.CharField(max_length=200, null=True)),
|
||||||
|
('RegDateShamsiOnlyTime', models.CharField(max_length=200, null=True)),
|
||||||
|
('StringId', models.CharField(max_length=200, null=True)),
|
||||||
|
('IsPersisted', models.CharField(max_length=200, null=True)),
|
||||||
|
('AllowInsert', models.CharField(max_length=200, null=True)),
|
||||||
|
('AllowUpdate', models.CharField(max_length=200, null=True)),
|
||||||
|
('ModalCss', models.CharField(max_length=200, null=True)),
|
||||||
|
('GridContainerParametersModel', models.CharField(max_length=200, null=True)),
|
||||||
|
('MenuUserAccess', models.CharField(max_length=200, null=True)),
|
||||||
|
('MenuUserAccessId', models.CharField(max_length=200, null=True)),
|
||||||
|
('LogTableName', models.CharField(max_length=200, null=True)),
|
||||||
|
('LogTableAlias', models.CharField(max_length=200, null=True)),
|
||||||
|
('PageTitle', models.CharField(max_length=200, null=True)),
|
||||||
|
('UnitName', models.CharField(max_length=200, null=True)),
|
||||||
|
('SystemCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('TrackingCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('EpidemiologicCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('PartIdCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('PostalCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('UnitId', models.CharField(max_length=200, null=True)),
|
||||||
|
('UnitTypeId', models.CharField(max_length=200, null=True)),
|
||||||
|
('UnitTypeName', models.CharField(max_length=200, null=True)),
|
||||||
|
('LocationIdProvince', models.CharField(max_length=200, null=True)),
|
||||||
|
('LocationIdCity', models.CharField(max_length=200, null=True)),
|
||||||
|
('UnitIsActive', models.CharField(max_length=200, null=True)),
|
||||||
|
('UnitIsActiveDescription', models.CharField(max_length=200, null=True)),
|
||||||
|
('PId', models.CharField(max_length=200, null=True)),
|
||||||
|
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createdby', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='PoultryHatching',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('key', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('create_date', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('modify_date', models.DateTimeField(auto_now=True)),
|
||||||
|
('trash', models.BooleanField(default=False)),
|
||||||
|
('DesCertId', models.CharField(max_length=200, null=True)),
|
||||||
|
('UnitId', models.CharField(max_length=200, null=True)),
|
||||||
|
('BroilerFlockRequestId', models.CharField(max_length=200, null=True)),
|
||||||
|
('RequestCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('StartDate', models.CharField(max_length=200, null=True)),
|
||||||
|
('StartDatePersian', models.CharField(max_length=200, null=True)),
|
||||||
|
('EndDate', models.CharField(max_length=200, null=True)),
|
||||||
|
('EndDatePersian', models.CharField(max_length=200, null=True)),
|
||||||
|
('HatchingDate', models.CharField(max_length=200, null=True)),
|
||||||
|
('HatchingDatePersian', models.CharField(max_length=200, null=True)),
|
||||||
|
('MaxHatchingDate', models.CharField(max_length=200, null=True)),
|
||||||
|
('MaxHatchingDatePersian', models.CharField(max_length=200, null=True)),
|
||||||
|
('HatchingCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('HatchingCountInBargiri', models.CharField(max_length=200, null=True)),
|
||||||
|
('HatchingCountInTakhlie', models.CharField(max_length=200, null=True)),
|
||||||
|
('TrackingCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('TrackingBargiriCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentHamlToMojavez', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentTakhlieToBargiri', models.CharField(max_length=200, null=True)),
|
||||||
|
('FlockAgeDay', models.CharField(max_length=200, null=True)),
|
||||||
|
('PartIdCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('UnitName', models.CharField(max_length=200, null=True)),
|
||||||
|
('PostalCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('EpidemiologicCode', models.CharField(max_length=200, null=True)),
|
||||||
|
('CapacityFemale', models.CharField(max_length=200, null=True)),
|
||||||
|
('PersonFullName', models.CharField(max_length=200, null=True)),
|
||||||
|
('LocationIdProvince', models.CharField(max_length=200, null=True)),
|
||||||
|
('LocationNameProvince', models.CharField(max_length=200, null=True)),
|
||||||
|
('LocationIdCity', models.CharField(max_length=200, null=True)),
|
||||||
|
('LocationNameCity', models.CharField(max_length=200, null=True)),
|
||||||
|
('Mobile', models.CharField(max_length=200, null=True)),
|
||||||
|
('HamlMorghMinDate', models.CharField(max_length=200, null=True)),
|
||||||
|
('HamlMorghTotalCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('HamlMorghTakhlieCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('EvacuationCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('EvacuationCount_1', models.CharField(max_length=200, null=True)),
|
||||||
|
('EvacuationCount_2', models.CharField(max_length=200, null=True)),
|
||||||
|
('EvacuationCount_3', models.CharField(max_length=200, null=True)),
|
||||||
|
('BaseHatchingCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentMorghToJoojeTotal', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentMorghToJoojeTakhlie', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentMorghToJoojeTakhlieWithEvacutaion', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentNotDeliverd', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentDeliveredForSP', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentDeliveredForSPNoExclude', models.CharField(max_length=200, null=True)),
|
||||||
|
('PercentDeliveredWithoutEvac', models.CharField(max_length=200, null=True)),
|
||||||
|
('DiffHamlThanTakhlieCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('DiffTakhlieThanHamlCount', models.CharField(max_length=200, null=True)),
|
||||||
|
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createdby', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('poultry', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hatching_poultry', to='app.poultry')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
29
app/migrations/0002_remove_poultry_allowinsert_and_more.py
Normal file
29
app/migrations/0002_remove_poultry_allowinsert_and_more.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Generated by Django 4.2.19 on 2025-02-26 11:46
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('app', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultry',
|
||||||
|
name='AllowInsert',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultry',
|
||||||
|
name='AllowUpdate',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultry',
|
||||||
|
name='IsPersisted',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultry',
|
||||||
|
name='UnitIsActive',
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Generated by Django 4.2.19 on 2025-02-26 11:47
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('app', '0002_remove_poultry_allowinsert_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultry',
|
||||||
|
name='AllowInsert',
|
||||||
|
field=models.BooleanField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultry',
|
||||||
|
name='AllowUpdate',
|
||||||
|
field=models.BooleanField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultry',
|
||||||
|
name='IsPersisted',
|
||||||
|
field=models.BooleanField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultry',
|
||||||
|
name='UnitIsActive',
|
||||||
|
field=models.BooleanField(null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 4.2.19 on 2025-02-27 08:30
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('app', '0003_poultry_allowinsert_poultry_allowupdate_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='Date',
|
||||||
|
field=models.DateTimeField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HatchingAge',
|
||||||
|
field=models.IntegerField(default=1),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
# Generated by Django 4.2.19 on 2025-02-27 09:04
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('app', '0004_poultryhatching_date_poultryhatching_hatchingage'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='BaseHatchingCount',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='BroilerFlockRequestId',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='CapacityFemale',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='DiffHamlThanTakhlieCount',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='DiffTakhlieThanHamlCount',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='EvacuationCount',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='EvacuationCount_1',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='EvacuationCount_2',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='EvacuationCount_3',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='FlockAgeDay',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HamlMorghTakhlieCount',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HamlMorghTotalCount',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HatchingCount',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HatchingCountInBargiri',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HatchingCountInTakhlie',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentDeliveredForSP',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentDeliveredForSPNoExclude',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentDeliveredWithoutEvac',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentHamlToMojavez',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentMorghToJoojeTakhlie',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentMorghToJoojeTakhlieWithEvacutaion',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentMorghToJoojeTotal',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentNotDeliverd',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentTakhlieToBargiri',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='TrackingBargiriCount',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='TrackingCount',
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
# Generated by Django 4.2.19 on 2025-02-27 09:07
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('app', '0005_remove_poultryhatching_basehatchingcount_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='BaseHatchingCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='BroilerFlockRequestId',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='CapacityFemale',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='DiffHamlThanTakhlieCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='DiffTakhlieThanHamlCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='EvacuationCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='EvacuationCount_1',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='EvacuationCount_2',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='EvacuationCount_3',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='FlockAgeDay',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HamlMorghTakhlieCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HamlMorghTotalCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HatchingCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HatchingCountInBargiri',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='HatchingCountInTakhlie',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentDeliveredForSP',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentDeliveredForSPNoExclude',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentDeliveredWithoutEvac',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentHamlToMojavez',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentMorghToJoojeTakhlie',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentMorghToJoojeTakhlieWithEvacutaion',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentMorghToJoojeTotal',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentNotDeliverd',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='PercentTakhlieToBargiri',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='TrackingBargiriCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='poultryhatching',
|
||||||
|
name='TrackingCount',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user