diff --git a/.gitignore b/.gitignore index f719955..38eb404 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,142 @@ -# Byte-compiled / optimized / DLL files +.idea + +# Created by https://www.toptal.com/developers/gitignore/api/django,python,virtualenv +# Edit at https://www.toptal.com/developers/gitignore?templates=django,python,virtualenv + +### Django ### +*.log +*.pot +*.pyc __pycache__/ +local_settings.py +#*.sqlite3 +#db.sqlite3 +db.sqlite3-journal +media +#static +staticfiles +profile_images + +# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ +# in your Git repository. Update and uncomment the following line accordingly. +# /staticfiles/ + +# db.sqlite3 +### Django.Python Stack ### +# Byte-compiled / optimized / DLL files *.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +#dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo # Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py # Environments .env @@ -17,29 +147,141 @@ ENV/ env.bak/ venv.bak/ -# Media & Static Files -/media/* -/staticfiles/* +# Spyder project settings +.spyderproject +.spyproject +# Rope project settings +.ropeproject -# Cache & Temporary Files -*.swp -*.swo -*.swn -*.bak -*.tmp +# mkdocs documentation +/site -# Editor-specific files -*.kate-swp -*.backup -.vscode/ -.idea/ -.DS_Store -._* +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json -# migrations -# */migrations/0*.py -!*/migrations/__init__.py +# Pyre type checker +.pyre/ -# cursor -.cursor/* +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python ### +# Byte-compiled / optimized / DLL files + +# C extensions + +# Distribution / packaging + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. + +# Installer logs + +# Unit test / coverage reports + +# Translations + +# Django stuff: + +# Flask stuff: + +# Scrapy stuff: + +# Sphinx documentation + +# PyBuilder + +# Jupyter Notebook + +# IPython + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm + +# Celery stuff + +# SageMath parsed files + +# Environments + +# Spyder project settings + +# Rope project settings + +# mkdocs documentation + +# mypy + +# Pyre type checker + +# pytype static type analyzer + +# Cython debug symbols + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +### VirtualEnv ### +# Virtualenv +# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Ss]cripts +pyvenv.cfg +pip-selfcheck.json + +# End of https://www.toptal.com/developers/gitignore/api/django,python,virtualenv + +.cursor diff --git a/_base/settings.py b/_base/settings.py index 3710f84..6283ccf 100644 --- a/_base/settings.py +++ b/_base/settings.py @@ -11,8 +11,6 @@ https://docs.djangoproject.com/en/5.2/ref/settings/ """ import os from pathlib import Path -from decouple import config -import dj_database_url # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -22,28 +20,16 @@ BASE_DIR = Path(__file__).resolve().parent.parent # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = config('DJANGO_SECRET_KEY', default="unsecure-secretkey-kjhsgfjsfgjsfgjsg") +SECRET_KEY = 'django-insecure-h!2hx$h=f6ktgdks!g2_*pg_s1nnuyk+j2yd*_x8r+3+3iyfy*' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = config('DEBUG', cast=bool, default=True) +DEBUG = True -# Allowed hosts -ALLOWED_HOSTS = [host for host in config("DJANGO_ALLOWED_HOSTS", default="").split() if host] +ALLOWED_HOSTS = [] -# URL scheme (http or https) -URL_SCHEME = config("URL_SCHEME", default="http") - - -# CSRF trusted origins (add both with and without port if you use a non-standard port) -CSRF_TRUSTED_ORIGINS = [] -for host in ALLOWED_HOSTS: - if host not in ("localhost", "127.0.0.1"): - CSRF_TRUSTED_ORIGINS.append(f"{URL_SCHEME}://{host}") - -# Generate base URL for absolute URLs (use first allowed host) -BASE_URL = f"{URL_SCHEME}://{ALLOWED_HOSTS[0]}" if ALLOWED_HOSTS else "http://localhost" # Application definition + INSTALLED_APPS = [ # ------ theme ------ # 'jazzmin', @@ -59,7 +45,6 @@ INSTALLED_APPS = [ # ------- third party apps ------- # 'simple_history', - 'django_extensions', # -------------------------------- # # ------- my apps ------- # @@ -111,20 +96,13 @@ WSGI_APPLICATION = '_base.wsgi.application' # Database # https://docs.djangoproject.com/en/5.2/ref/settings/#databases -DB_TYPE = config('DB_TYPE', default='sqlite').lower() - -if DB_TYPE == 'postgres': - DATABASES = { - 'default': dj_database_url.config(default=config('DATABASE_URL')) +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', } +} -else: - DATABASES = { - "default": { - "ENGINE": "django.db.backends.sqlite3", - "NAME": BASE_DIR/"db.sqlite3", - } - } # Password validation # https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators @@ -161,15 +139,15 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) -STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') +# https://docs.djangoproject.com/en/5.2/howto/static-files/ +STATIC_ROOT = 'ss' +STATIC_URL = 'static/' STATICFILES_DIRS = [ - os.path.join(BASE_DIR, 'static'), + os.path.join(BASE_DIR, 'static') ] -# Media files MEDIA_URL = '/media/' -MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_ROOT = BASE_DIR / 'media' # Default primary key field type # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field diff --git a/certificates/templates/certificates/print.html b/certificates/templates/certificates/print.html index 3e75dc5..39b028a 100644 --- a/certificates/templates/certificates/print.html +++ b/certificates/templates/certificates/print.html @@ -5,7 +5,6 @@ تاییدیه - {{ instance.code }} {% load static %} - {% load common_tags %} @@ -53,31 +52,21 @@
مشخصات چاه و کنتور هوشمند
-
موقعیت مکانی (UTM): X: {{ latest_report.utm_x|default:'-' }} , Y: {{ latest_report.utm_y|default:'-' }}
+
موقعیت مکانی (UTM): {{ latest_report.utm_x|default:'-' }} , {{ latest_report.utm_y|default:'-' }}
نیرو محرکه چاه: {{ latest_report.driving_force|default:'-' }}
نوع کنتور: {{ latest_report.get_meter_type_display|default:'-' }}
- {% if latest_report.meter_type == 'smart' %} -
مدل کنتور: {{ latest_report.get_meter_model_display|default:'-' }}
- {% else %} -
سایز کنتور: {{ latest_report.meter_size|default:'-' }}
- {% endif %} +
قطر لوله آبده (اینچ): {{ latest_report.discharge_pipe_diameter|default:'-' }}
نوع مصرف: {{ latest_report.get_usage_type_display|default:'-' }}
شماره سیم‌کارت: {{ latest_report.sim_number|default:'-' }}
-
شارژ کنتور (متر مکعب): {{ latest_report.meter_charge|default:'-' }}
-
پایان اعتبار شارژ: {{ latest_report.meter_charge_expiration_date|to_jalali|default:'-' }}
-
شماره سریال کنتور: {{ instance.well.water_meter_serial_number|default:'-' }}
-
-
قطر لوله آبده (اینچ): {{ latest_report.discharge_pipe_diameter|default:'-' }}
+
سایز کنتور: {{ latest_report.meter_size|default:'-' }}
شماره پروانه بهره‌برداری چاه: {{ latest_report.exploitation_license_number|default:'-' }}
-
قدرت موتور (کیلووات ساعت): {{ latest_report.motor_power|default:'-' }}
-
دبی (لیتر بر ثانیه): {{ latest_report.flow_rate|default:'-' }}
-
عدد کنتور (متر مکعب): {{ latest_report.meter_reading|default:'-' }}
-
پلمپ تابلو: {{ latest_report.is_panel_sealed|yesno:'دارد,ندارد' }}
-
تابلو قطع: {{ latest_report.is_panel_cut|yesno:'دارد,ندارد' }}
-
انجام عملیات قطع: {{ latest_report.is_disconnection_done|yesno:'دارد,ندارد' }}
+
قدرت موتور: {{ latest_report.motor_power|default:'-' }}
+
دبی قبل از کالیبراسیون: {{ latest_report.pre_calibration_flow_rate|default:'-' }}
+
دبی بعد از کالیبراسیون: {{ latest_report.post_calibration_flow_rate|default:'-' }}
نام شرکت کنتورساز: {{ latest_report.water_meter_manufacturer.name|default:'-' }}
+
شماره سریال کنتور: {{ instance.well.water_meter_serial_number|default:'-' }}
diff --git a/certificates/templates/certificates/step.html b/certificates/templates/certificates/step.html index 8696e6c..f8249cb 100644 --- a/certificates/templates/certificates/step.html +++ b/certificates/templates/certificates/step.html @@ -2,7 +2,6 @@ {% load static %} {% load processes_tags %} {% load humanize %} - {% load common_tags %} {% load accounts_tags %} {% block sidebar %} @@ -74,30 +73,21 @@
مشخصات چاه و کنتور هوشمند
-
موقعیت مکانی (UTM):X: {{ latest_report.utm_x|default:'-' }} , Y: {{ latest_report.utm_y|default:'-' }}
+
موقعیت مکانی (UTM):{{ latest_report.utm_x|default:'-' }} , {{ latest_report.utm_y|default:'-' }}
نیرو محرکه چاه:{{ latest_report.driving_force|default:'-' }}
نوع کنتور:{{ latest_report.get_meter_type_display|default:'-' }}
- {% if latest_report.meter_type == 'smart' %} -
مدل کنتور:{{ latest_report.get_meter_model_display|default:'-' }}
- {% else %} -
سایز کنتور:{{ latest_report.meter_size|default:'-' }}
- {% endif %} +
قطر لوله آبده (اینچ):{{ latest_report.discharge_pipe_diameter|default:'-' }}
نوع مصرف:{{ latest_report.get_usage_type_display|default:'-' }}
شماره سیم‌کارت:{{ latest_report.sim_number|default:'-' }}
-
شارژ کنتور (متر مکعب):{{ latest_report.meter_charge|default:'-' }}
-
پایان اعتبار شارژ:{{ latest_report.meter_charge_expiration_date|to_jalali|default:'-' }}
-
شماره سریال کنتور:{{ instance.well.water_meter_serial_number|default:'-' }}
-
قطر لوله آبده (اینچ):{{ latest_report.discharge_pipe_diameter|default:'-' }}
+
سایز کنتور:{{ latest_report.meter_size|default:'-' }}
شماره پروانه بهره‌برداری چاه:{{ latest_report.exploitation_license_number|default:'-' }}
-
قدرت موتور (کیلووات ساعت):{{ latest_report.motor_power|default:'-' }}
-
دبی (لیتر بر ثانیه):{{ latest_report.flow_rate|default:'-' }}
-
عدد کنتور (متر مکعب):{{ latest_report.meter_reading|default:'-' }}
-
پلمپ تابلو:{{ latest_report.is_panel_sealed|yesno:'دارد,ندارد' }}
-
تابلو قطع:{{ latest_report.is_panel_cut|yesno:'دارد,ندارد' }}
-
انجام عملیات قطع:{{ latest_report.is_disconnection_done|yesno:'دارد,ندارد' }}
+
قدرت موتور:{{ latest_report.motor_power|default:'-' }}
+
دبی قبل از کالیبراسیون:{{ latest_report.pre_calibration_flow_rate|default:'-' }}
+
دبی بعد از کالیبراسیون:{{ latest_report.post_calibration_flow_rate|default:'-' }}
نام شرکت کنتورساز:{{ latest_report.water_meter_manufacturer.name|default:'-' }}
+
شماره سریال کنتور:{{ instance.well.water_meter_serial_number|default:'-' }}
diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000..b4e650c Binary files /dev/null and b/db.sqlite3 differ diff --git a/installations/admin.py b/installations/admin.py index 2a2f779..fc78615 100644 --- a/installations/admin.py +++ b/installations/admin.py @@ -24,12 +24,11 @@ class InstallationReportAdmin(admin.ModelAdmin): list_display = ( 'assignment', 'visited_date', 'meter_type', 'meter_size', 'water_meter_manufacturer', 'discharge_pipe_diameter', 'usage_type', 'exploitation_license_number', - 'motor_power', 'flow_rate', 'meter_reading', 'meter_charge', 'meter_charge_expiration_date', + 'motor_power', 'pre_calibration_flow_rate', 'post_calibration_flow_rate', 'new_water_meter_serial', 'seal_number', 'sim_number', - 'is_panel_sealed', 'is_panel_cut', 'is_disconnection_done', 'is_meter_suspicious', 'approved', 'created' ) - list_filter = ('is_meter_suspicious', 'is_panel_sealed', 'is_panel_cut', 'is_disconnection_done', 'approved', 'visited_date', 'meter_type', 'usage_type', 'water_meter_manufacturer') + list_filter = ('is_meter_suspicious', 'approved', 'visited_date', 'meter_type', 'usage_type', 'water_meter_manufacturer') search_fields = ( 'assignment__process_instance__code', 'new_water_meter_serial', 'seal_number', 'exploitation_license_number', 'sim_number' ) @@ -44,7 +43,7 @@ class InstallationReportAdmin(admin.ModelAdmin): ) }), ('مشخصات هیدرولیکی', { - 'fields': ('discharge_pipe_diameter', 'flow_rate', 'meter_reading', 'meter_charge', 'meter_charge_expiration_date') + 'fields': ('discharge_pipe_diameter', 'pre_calibration_flow_rate', 'post_calibration_flow_rate') }), ('کاربری و مجوز', { 'fields': ('usage_type', 'exploitation_license_number') @@ -52,9 +51,6 @@ class InstallationReportAdmin(admin.ModelAdmin): ('توان و محرکه', { 'fields': ('driving_force', 'motor_power') }), - ('وضعیت تابلو/قطع', { - 'fields': ('is_panel_sealed', 'is_panel_cut', 'is_disconnection_done') - }), ('توضیحات', { 'fields': ('description',) }), diff --git a/installations/forms.py b/installations/forms.py index 4c30a5f..b8be2b0 100644 --- a/installations/forms.py +++ b/installations/forms.py @@ -22,8 +22,7 @@ class InstallationReportForm(forms.ModelForm): 'visited_date', 'new_water_meter_serial', 'seal_number', 'utm_x', 'utm_y', 'meter_type', 'meter_size', 'meter_model', 'discharge_pipe_diameter', 'usage_type', 'exploitation_license_number', - 'motor_power', 'flow_rate', 'meter_reading', 'meter_charge', 'meter_charge_expiration_date', - 'is_panel_sealed', 'is_panel_cut', 'is_disconnection_done', + 'motor_power', 'pre_calibration_flow_rate', 'post_calibration_flow_rate', 'water_meter_manufacturer', 'sim_number', 'driving_force', 'is_meter_suspicious', 'description' ] @@ -91,24 +90,17 @@ class InstallationReportForm(forms.ModelForm): 'class': 'form-control', 'required': True }), - 'flow_rate': forms.NumberInput(attrs={ + 'pre_calibration_flow_rate': forms.NumberInput(attrs={ 'class': 'form-control', 'min': '0', 'step': '0.0001', + 'required': True }), - 'meter_reading': forms.NumberInput(attrs={ + 'post_calibration_flow_rate': forms.NumberInput(attrs={ 'class': 'form-control', 'min': '0', 'step': '0.0001', - }), - 'meter_charge': forms.NumberInput(attrs={ - 'class': 'form-control', - 'min': '0', - 'step': '0.0001', - }), - 'meter_charge_expiration_date': forms.DateInput(attrs={ - 'type': 'date', - 'class': 'form-control', + 'required': True }), 'water_meter_manufacturer': forms.Select(attrs={ 'class': 'form-select', @@ -127,15 +119,6 @@ class InstallationReportForm(forms.ModelForm): 'class': 'form-check-input', 'id': 'id_is_meter_suspicious', }), - 'is_panel_sealed': forms.CheckboxInput(attrs={ - 'class': 'form-check-input', - }), - 'is_panel_cut': forms.CheckboxInput(attrs={ - 'class': 'form-check-input', - }), - 'is_disconnection_done': forms.CheckboxInput(attrs={ - 'class': 'form-check-input', - }), 'description': forms.Textarea(attrs={ 'class': 'form-control', 'rows': 3 @@ -154,17 +137,12 @@ class InstallationReportForm(forms.ModelForm): 'usage_type': 'نوع مصرف', 'exploitation_license_number': 'شماره پروانه بهره‌برداری', 'motor_power': 'قدرت موتور (کیلووات ساعت)', - 'flow_rate': 'دبی (لیتر بر ثانیه)', - 'meter_reading': 'عدد کنتور (متر مکعب)', - 'meter_charge': 'شارژ کنتور (متر مکعب)', - 'meter_charge_expiration_date': 'تاریخ پایان اعتبار شارژ', + 'pre_calibration_flow_rate': 'دبی قبل از کالیبراسیون (لیتر بر ثانیه)', + 'post_calibration_flow_rate': 'دبی بعد از کالیبراسیون (لیتر بر ثانیه)', 'water_meter_manufacturer': 'شرکت سازنده کنتور', 'sim_number': 'شماره سیمکارت', 'driving_force': 'نیرو محرکه چاه', 'is_meter_suspicious': 'کنتور مشکوک است', - 'is_panel_sealed': 'پلمپ تابلو', - 'is_panel_cut': 'تابلو قطع', - 'is_disconnection_done': 'انجام عملیات قطع', 'description': 'توضیحات' } diff --git a/installations/migrations/0012_installationreport_flow_rate_and_more.py b/installations/migrations/0012_installationreport_flow_rate_and_more.py deleted file mode 100644 index 1f3f29b..0000000 --- a/installations/migrations/0012_installationreport_flow_rate_and_more.py +++ /dev/null @@ -1,50 +0,0 @@ -# Generated by Django 5.2.4 on 2025-10-27 03:42 - -import django.core.validators -from decimal import Decimal -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('installations', '0011_alter_installationreport_discharge_pipe_diameter'), - ] - - operations = [ - migrations.AddField( - model_name='installationreport', - name='flow_rate', - field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='(لیتر بر ثانیه)دبی'), - ), - migrations.AddField( - model_name='installationreport', - name='is_disconnection_done', - field=models.BooleanField(default=False, verbose_name='انجام عملیات قطع'), - ), - migrations.AddField( - model_name='installationreport', - name='is_panel_cut', - field=models.BooleanField(default=False, verbose_name='تابلو قطع'), - ), - migrations.AddField( - model_name='installationreport', - name='is_panel_sealed', - field=models.BooleanField(default=False, verbose_name='پلمپ تابلو'), - ), - migrations.AddField( - model_name='installationreport', - name='meter_charge', - field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, validators=[django.core.validators.MinValueValidator(Decimal('0'))], verbose_name='شارژ کنتور (متر مکعب)'), - ), - migrations.AddField( - model_name='installationreport', - name='meter_charge_expiration_date', - field=models.DateField(blank=True, null=True, verbose_name='تاریخ پایان اعتبار شارژ'), - ), - migrations.AddField( - model_name='installationreport', - name='meter_reading', - field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, validators=[django.core.validators.MinValueValidator(Decimal('0'))], verbose_name='عدد کنتور (متر مکعب)'), - ), - ] diff --git a/installations/migrations/0013_remove_installationreport_post_calibration_flow_rate_and_more.py b/installations/migrations/0013_remove_installationreport_post_calibration_flow_rate_and_more.py deleted file mode 100644 index 31f653d..0000000 --- a/installations/migrations/0013_remove_installationreport_post_calibration_flow_rate_and_more.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 5.2.4 on 2025-10-27 03:47 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('installations', '0012_installationreport_flow_rate_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='installationreport', - name='post_calibration_flow_rate', - ), - migrations.RemoveField( - model_name='installationreport', - name='pre_calibration_flow_rate', - ), - ] diff --git a/installations/models.py b/installations/models.py index ae86340..c7d7e31 100644 --- a/installations/models.py +++ b/installations/models.py @@ -55,12 +55,6 @@ class InstallationReport(BaseModel): ] meter_model = models.CharField(max_length=20, choices=METER_MODEL_CHOICES, null=True, blank=True, verbose_name='مدل کنتور') meter_size = models.CharField(max_length=50, null=True, blank=True, verbose_name='سایز کنتور') - meter_reading = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, validators=[MinValueValidator(Decimal('0'))], verbose_name='عدد کنتور (متر مکعب)') - meter_charge = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, validators=[MinValueValidator(Decimal('0'))], verbose_name='شارژ کنتور (متر مکعب)') - meter_charge_expiration_date = models.DateField(null=True, blank=True, verbose_name='تاریخ پایان اعتبار شارژ') - is_panel_sealed = models.BooleanField(default=False, verbose_name='پلمپ تابلو') - is_panel_cut = models.BooleanField(default=False, verbose_name='تابلو قطع') - is_disconnection_done = models.BooleanField(default=False, verbose_name='انجام عملیات قطع') discharge_pipe_diameter = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='قطر لوله آبده (اینچ)') USAGE_TYPE_CHOICES = [ ('domestic', 'شرب و خدمات'), @@ -70,7 +64,8 @@ class InstallationReport(BaseModel): usage_type = models.CharField(max_length=20, choices=USAGE_TYPE_CHOICES, null=True, verbose_name='نوع مصرف') exploitation_license_number = models.CharField(max_length=50, verbose_name='شماره پروانه بهره‌برداری چاه') motor_power = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(کیلووات ساعت) قدرت موتور') - flow_rate = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(لیتر بر ثانیه)دبی') + pre_calibration_flow_rate = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(لیتر بر ثانیه)دبی قبل از کالیبراسیون') + post_calibration_flow_rate = models.DecimalField(max_digits=10, decimal_places=4, null=True, blank=True, verbose_name='(لیتر بر ثانیه)دبی بعد از کالیبراسیون') water_meter_manufacturer = models.ForeignKey('wells.WaterMeterManufacturer', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='شرکت سازنده کنتور آب') sim_number = models.CharField(max_length=20, null=True, blank=True, verbose_name='شماره سیمکارت') driving_force = models.CharField(max_length=50, null=True, blank=True, verbose_name='نیرو محرکه چاه') diff --git a/installations/templates/installations/installation_report_step.html b/installations/templates/installations/installation_report_step.html index fbd0405..3246dea 100644 --- a/installations/templates/installations/installation_report_step.html +++ b/installations/templates/installations/installation_report_step.html @@ -156,10 +156,8 @@ {% endif %}

قطر لوله آبده (اینچ): {{ report.discharge_pipe_diameter|default:'-' }}

سازنده کنتور: {{ report.water_meter_manufacturer|default:'-' }}

-

شماره سیمکارت: {{ report.sim_number|default:'-' }}

+

شماره سیمکارت: {{ report.sim_number|default:'-' }}

نیرو محرکه چاه: {{ report.driving_force|default:'-' }}

-

شارژ کنتور (متر مکعب): {{ report.meter_charge|default:'-' }}

-

پایان اعتبار شارژ: {{ report.meter_charge_expiration_date|to_jalali|default:'-' }}

کنتور مشکوک: {{ report.is_meter_suspicious|yesno:'بله,خیر' }}

@@ -167,12 +165,9 @@

UTM Y: {{ report.utm_y|default:'-' }}

نوع مصرف: {{ report.get_usage_type_display|default:'-' }}

شماره پروانه بهره‌برداری: {{ report.exploitation_license_number|default:'-' }}

-

قدرت موتور (کیلووات ساعت): {{ report.motor_power|default:'-' }}

-

دبی (لیتر/ثانیه): {{ report.flow_rate|default:'-' }}

-

عدد کنتور (متر مکعب): {{ report.meter_reading|default:'-' }}

-

پلمپ تابلو: {{ report.is_panel_sealed|yesno:'بله,خیر' }}

-

تابلو قطع: {{ report.is_panel_cut|yesno:'بله,خیر' }}

-

انجام عملیات قطع: {{ report.is_disconnection_done|yesno:'بله,خیر' }}

+

قدرت موتور(کیلووات ساعت): {{ report.motor_power|default:'-' }}

+

دبی قبل کالیبراسیون(لیتر/ثانیه): {{ report.pre_calibration_flow_rate|default:'-' }}

+

دبی بعد کالیبراسیون(لیتر/ثانیه): {{ report.post_calibration_flow_rate|default:'-' }}

@@ -394,32 +389,17 @@ {% endif %}
- {{ form.flow_rate.label_tag }} - {{ form.flow_rate }} - {% if form.flow_rate.errors %} -
{{ form.flow_rate.errors.0 }}
+ {{ form.pre_calibration_flow_rate.label_tag }} + {{ form.pre_calibration_flow_rate }} + {% if form.pre_calibration_flow_rate.errors %} +
{{ form.pre_calibration_flow_rate.errors.0 }}
{% endif %}
- {{ form.meter_reading.label_tag }} - {{ form.meter_reading }} - {% if form.meter_reading.errors %} -
{{ form.meter_reading.errors.0 }}
- {% endif %} -
-
- {{ form.meter_charge.label_tag }} - {{ form.meter_charge }} - {% if form.meter_charge.errors %} -
{{ form.meter_charge.errors.0 }}
- {% endif %} -
-
- {{ form.meter_charge_expiration_date.label_tag }} - - - {% if form.meter_charge_expiration_date.errors %} -
{{ form.meter_charge_expiration_date.errors.0 }}
+ {{ form.post_calibration_flow_rate.label_tag }} + {{ form.post_calibration_flow_rate }} + {% if form.post_calibration_flow_rate.errors %} +
{{ form.post_calibration_flow_rate.errors.0 }}
{% endif %}
@@ -452,43 +432,14 @@
{{ form.driving_force.errors.0 }}
{% endif %}
-
-
-
- {{ form.is_meter_suspicious }} - {{ form.is_meter_suspicious.label_tag }} -
- {% if form.is_meter_suspicious.errors %} -
{{ form.is_meter_suspicious.errors.0 }}
- {% endif %} -
-
-
- {{ form.is_panel_sealed }} - {{ form.is_panel_sealed.label_tag }} -
- {% if form.is_panel_sealed.errors %} -
{{ form.is_panel_sealed.errors.0 }}
- {% endif %} -
-
-
- {{ form.is_panel_cut }} - {{ form.is_panel_cut.label_tag }} -
- {% if form.is_panel_cut.errors %} -
{{ form.is_panel_cut.errors.0 }}
- {% endif %} -
-
-
- {{ form.is_disconnection_done }} - {{ form.is_disconnection_done.label_tag }} -
- {% if form.is_disconnection_done.errors %} -
{{ form.is_disconnection_done.errors.0 }}
- {% endif %} +
+
+ {{ form.is_meter_suspicious }} + {{ form.is_meter_suspicious.label_tag }}
+ {% if form.is_meter_suspicious.errors %} +
{{ form.is_meter_suspicious.errors.0 }}
+ {% endif %}
@@ -702,7 +653,7 @@