109 lines
4.4 KiB
Python
109 lines
4.4 KiB
Python
from django.db import models
|
|
|
|
class Region(models.Model):
|
|
name = models.CharField(max_length=100, unique=True)
|
|
code = models.CharField(max_length=10, unique=True, blank=True, null=True)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class Meta:
|
|
ordering = ['name']
|
|
|
|
class Constituency(models.Model):
|
|
region = models.ForeignKey(Region, on_delete=models.CASCADE, related_name='constituencies')
|
|
name = models.CharField(max_length=100)
|
|
|
|
def __str__(self):
|
|
return f"{self.name} ({self.region.name})"
|
|
|
|
class Meta:
|
|
ordering = ['region', 'name']
|
|
verbose_name_plural = "Constituencies"
|
|
|
|
class Farmer(models.Model):
|
|
name = models.CharField(max_length=200)
|
|
id_number = models.CharField(max_length=50, unique=True, verbose_name="National ID/Passport")
|
|
phone_number = models.CharField(max_length=20, blank=True)
|
|
constituency = models.ForeignKey(Constituency, on_delete=models.PROTECT)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class AgriculturalHolding(models.Model):
|
|
HOLDING_TYPES = [
|
|
('CROP', 'Crop Production'),
|
|
('LIVESTOCK', 'Livestock Production'),
|
|
('MIXED', 'Mixed Farming'),
|
|
('FISHERIES', 'Fisheries/Aquaculture'),
|
|
('FORESTRY', 'Forestry'),
|
|
]
|
|
farmer = models.ForeignKey(Farmer, on_delete=models.CASCADE, related_name='holdings')
|
|
size_hectares = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="Size (Hectares)")
|
|
primary_activity = models.CharField(max_length=20, choices=HOLDING_TYPES)
|
|
location_description = models.TextField(blank=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.get_primary_activity_display()} - {self.farmer.name}"
|
|
|
|
class CropProduction(models.Model):
|
|
holding = models.ForeignKey(AgriculturalHolding, on_delete=models.CASCADE, related_name='crops')
|
|
crop_type = models.CharField(max_length=100)
|
|
area_hectares = models.DecimalField(max_digits=10, decimal_places=2)
|
|
expected_yield = models.DecimalField(max_digits=10, decimal_places=2, help_text="In metric tons", null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.crop_type} - {self.holding.farmer.name}"
|
|
|
|
class Meta:
|
|
verbose_name_plural = "Crop Production"
|
|
|
|
class LivestockProduction(models.Model):
|
|
holding = models.ForeignKey(AgriculturalHolding, on_delete=models.CASCADE, related_name='livestock')
|
|
animal_type = models.CharField(max_length=100)
|
|
count = models.PositiveIntegerField()
|
|
|
|
def __str__(self):
|
|
return f"{self.animal_type} ({self.count}) - {self.holding.farmer.name}"
|
|
|
|
class Meta:
|
|
verbose_name_plural = "Livestock Production"
|
|
|
|
class Forestry(models.Model):
|
|
holding = models.ForeignKey(AgriculturalHolding, on_delete=models.CASCADE, related_name='forestry_items')
|
|
tree_species = models.CharField(max_length=100)
|
|
area_hectares = models.DecimalField(max_digits=10, decimal_places=2)
|
|
purpose = models.CharField(max_length=100, blank=True, help_text="e.g. Timber, Conservation, Charcoal")
|
|
|
|
def __str__(self):
|
|
return f"{self.tree_species} - {self.holding.farmer.name}"
|
|
|
|
class Meta:
|
|
verbose_name_plural = "Forestry"
|
|
|
|
class Fishery(models.Model):
|
|
holding = models.ForeignKey(AgriculturalHolding, on_delete=models.CASCADE, related_name='fisheries')
|
|
type = models.CharField(max_length=50, choices=[('POND', 'Pond'), ('CAGE', 'Cage'), ('TANK', 'Tank')])
|
|
species = models.CharField(max_length=100)
|
|
capacity = models.PositiveIntegerField(help_text="Volume in cubic meters or number of units")
|
|
|
|
def __str__(self):
|
|
return f"{self.species} ({self.get_type_display()}) - {self.holding.farmer.name}"
|
|
|
|
class Meta:
|
|
verbose_name_plural = "Fisheries/Aquaculture"
|
|
|
|
class LandRegistry(models.Model):
|
|
farmer = models.ForeignKey(Farmer, on_delete=models.CASCADE, related_name='land_records')
|
|
parcel_number = models.CharField(max_length=100, unique=True)
|
|
ownership_type = models.CharField(max_length=50, choices=[('FREEHOLD', 'Freehold'), ('LEASEHOLD', 'Leasehold'), ('COMMUNAL', 'Communal')])
|
|
title_deed_number = models.CharField(max_length=100, blank=True)
|
|
area_hectares = models.DecimalField(max_digits=10, decimal_places=2)
|
|
|
|
def __str__(self):
|
|
return f"Parcel {self.parcel_number} - {self.farmer.name}"
|
|
|
|
class Meta:
|
|
verbose_name_plural = "Land Registry"
|