165 lines
		
	
	
		
			No EOL
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			No EOL
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.db import models
 | 
						|
from common.models import SluggedModel, BaseModel
 | 
						|
from django.contrib.auth import get_user_model
 | 
						|
from simple_history.models import HistoricalRecords
 | 
						|
from locations.models import Affairs, Broker, County
 | 
						|
import utm
 | 
						|
from uuid import uuid4
 | 
						|
import os
 | 
						|
 | 
						|
class WaterMeterManufacturer(BaseModel):
 | 
						|
    name = models.CharField(
 | 
						|
        max_length=20,
 | 
						|
        verbose_name="نام شرکت سازنده کنتور آب",
 | 
						|
        null=True,
 | 
						|
        blank=True)
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        return self.name
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        verbose_name = "شرکت سازنده کنتور آب"
 | 
						|
        verbose_name_plural = "شرکتهای سازنده کنتور آب"
 | 
						|
 | 
						|
 | 
						|
class Well(SluggedModel):
 | 
						|
    def path_and_rename(self, filename):
 | 
						|
        upload_to = "representative_letters"
 | 
						|
        ext = filename.split(".")[-1]
 | 
						|
        # create unique filename
 | 
						|
        filename = f"{uuid4().hex}.{ext}"
 | 
						|
        # return the whole path to the file
 | 
						|
        return os.path.join(upload_to, filename)
 | 
						|
    
 | 
						|
    Hemisphere_Choices = [
 | 
						|
        ('N', 'شمال'),
 | 
						|
        ('S', 'جنوب'),
 | 
						|
    ]
 | 
						|
 | 
						|
    representative = models.ForeignKey(
 | 
						|
        get_user_model(),
 | 
						|
        on_delete=models.SET_NULL,
 | 
						|
        verbose_name="نماینده",
 | 
						|
        related_name="wells",
 | 
						|
        null=True,
 | 
						|
    )
 | 
						|
    
 | 
						|
    water_subscription_number = models.CharField(
 | 
						|
        max_length=20,
 | 
						|
        verbose_name="شماره اشتراک آب",
 | 
						|
        unique=True
 | 
						|
        )
 | 
						|
    electricity_subscription_number = models.CharField(
 | 
						|
        max_length=20,
 | 
						|
        verbose_name="شماره اشتراک برق",
 | 
						|
        null=True,
 | 
						|
        unique=True
 | 
						|
        )
 | 
						|
 | 
						|
    water_meter_serial_number = models.CharField(
 | 
						|
        max_length=20,
 | 
						|
        verbose_name="سریال کنتور آب",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
    water_meter_old_serial_number = models.CharField(
 | 
						|
        max_length=20,
 | 
						|
        verbose_name="سریال کنتور قدیمی آب",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
    water_meter_manufacturer = models.ForeignKey(
 | 
						|
        WaterMeterManufacturer,
 | 
						|
        on_delete=models.SET_NULL,
 | 
						|
        verbose_name="شرکت سازنده کنتور آب",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
 | 
						|
    utm_x = models.DecimalField(
 | 
						|
        max_digits=10,
 | 
						|
        decimal_places=0,
 | 
						|
        verbose_name="X UTM",
 | 
						|
        )
 | 
						|
    utm_y = models.DecimalField(
 | 
						|
        max_digits=10,
 | 
						|
        decimal_places=0,
 | 
						|
        verbose_name="Y UTM",
 | 
						|
        )
 | 
						|
    utm_zone = models.PositiveIntegerField(
 | 
						|
        verbose_name="زون UTM",
 | 
						|
        null=True,
 | 
						|
        blank=True,
 | 
						|
        default=40
 | 
						|
        )
 | 
						|
    utm_hemisphere = models.CharField(
 | 
						|
        max_length=1,
 | 
						|
        verbose_name="نیمکره UTM",
 | 
						|
        null=True,
 | 
						|
        blank=True,
 | 
						|
        choices=Hemisphere_Choices,
 | 
						|
        default='N'
 | 
						|
        )
 | 
						|
 | 
						|
    well_power = models.PositiveIntegerField(
 | 
						|
        verbose_name="قدرت چاه",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
 | 
						|
    reference_letter_number = models.CharField(
 | 
						|
        max_length=20,
 | 
						|
        verbose_name="شماره معرفی نامه",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
    reference_letter_date = models.DateField(
 | 
						|
        verbose_name="تاریخ معرفی نامه",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
    representative_letter_file = models.FileField(
 | 
						|
        upload_to=path_and_rename,
 | 
						|
        verbose_name="نامه نمایندگی",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
    affairs = models.ForeignKey(
 | 
						|
        Affairs,
 | 
						|
        on_delete=models.SET_NULL,
 | 
						|
        verbose_name="امور",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
    county = models.ForeignKey(
 | 
						|
        County,
 | 
						|
        on_delete=models.SET_NULL,
 | 
						|
        verbose_name="شهرستان",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )  
 | 
						|
    broker = models.ForeignKey(
 | 
						|
        Broker,
 | 
						|
        on_delete=models.SET_NULL,
 | 
						|
        verbose_name="کارگزار",
 | 
						|
        null=True,
 | 
						|
        blank=True
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
    history = HistoricalRecords()
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        verbose_name = "چاه"
 | 
						|
        verbose_name_plural = "چاهها"
 | 
						|
    
 | 
						|
    def __str__(self):
 | 
						|
        return self.water_subscription_number
 | 
						|
    
 | 
						|
    def lat_long(self):
 | 
						|
        if self.utm_x and self.utm_y and self.utm_zone and self.utm_hemisphere:
 | 
						|
            northern = False if self.utm_hemisphere == 'S' else True
 | 
						|
            return utm.to_latlon(self.utm_x, self.utm_y, self.utm_zone, northern=northern)
 | 
						|
        return None |