You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.4 KiB
135 lines
4.4 KiB
6 months ago
|
from django.db import models
|
||
|
from django.contrib.auth import get_user_model
|
||
|
from django.core.validators import MinLengthValidator
|
||
|
from django.utils.translation import gettext_lazy as _
|
||
|
|
||
|
User = get_user_model()
|
||
|
|
||
|
class Survey(models.Model):
|
||
|
class WaterUsage(models.TextChoices):
|
||
|
LESS_50 = 'less_50', _('Less than 50 liters')
|
||
|
BETWEEN_50_100 = '50_100', _('50–100 liters')
|
||
|
BETWEEN_100_200 = '100_200', _('100–200 liters')
|
||
|
MORE_200 = 'more_200', _('More than 200 liters')
|
||
|
|
||
|
class Awareness(models.TextChoices):
|
||
|
YES = 'yes', _('Yes')
|
||
|
NO = 'no', _('No')
|
||
|
NOT_SURE = 'not_sure', _('Not sure')
|
||
|
|
||
|
class DrippingTap(models.TextChoices):
|
||
|
LESS_5 = 'less_5', _('Less than 5 liters')
|
||
|
BETWEEN_5_10 = '5_10', _('5–10 liters')
|
||
|
BETWEEN_10_20 = '10_20', _('10–20 liters')
|
||
|
MORE_20 = 'more_20', _('More than 20 liters')
|
||
|
|
||
|
class Frequency(models.TextChoices):
|
||
|
ALWAYS = 'always', _('Always')
|
||
|
SOMETIMES = 'sometimes', _('Sometimes')
|
||
|
NEVER = 'never', _('Never')
|
||
|
|
||
|
class WaterSavingAppliances(models.TextChoices):
|
||
|
LOW_FLOW = 'low_flow', _('Low-flow faucets')
|
||
|
DUAL_FLUSH = 'dual_flush', _('Dual-flush toilets')
|
||
|
EFFICIENT_MACHINES = 'efficient_machines', _('Water-efficient washing machines')
|
||
|
NONE = 'none', _('None')
|
||
|
|
||
|
# User Information
|
||
|
user = models.ForeignKey(
|
||
|
User,
|
||
|
on_delete=models.CASCADE,
|
||
|
related_name='surveys'
|
||
|
)
|
||
|
|
||
|
# General Awareness
|
||
|
water_usage = models.CharField(
|
||
|
max_length=20,
|
||
|
choices=WaterUsage.choices,
|
||
|
verbose_name=_('Daily water usage')
|
||
|
)
|
||
|
daily_consumption_awareness = models.CharField(
|
||
|
max_length=20,
|
||
|
choices=Awareness.choices,
|
||
|
verbose_name=_('Aware of daily water consumption')
|
||
|
)
|
||
|
dripping_tap_wastage = models.CharField(
|
||
|
max_length=20,
|
||
|
choices=DrippingTap.choices,
|
||
|
verbose_name=_('Estimated dripping tap wastage')
|
||
|
)
|
||
|
|
||
|
# Personal Habits
|
||
|
brushing_habits = models.CharField(
|
||
|
max_length=20,
|
||
|
choices=Frequency.choices,
|
||
|
verbose_name=_('Frequency of turning off tap while brushing')
|
||
|
)
|
||
|
fix_leaks = models.CharField(
|
||
|
max_length=20,
|
||
|
choices=Awareness.choices,
|
||
|
verbose_name=_('Promptly fix water leaks')
|
||
|
)
|
||
|
reuse_water = models.CharField(
|
||
|
max_length=20,
|
||
|
choices=Frequency.choices,
|
||
|
verbose_name=_('Frequency of water reuse')
|
||
|
)
|
||
|
water_saving_appliances = models.CharField(
|
||
|
max_length=50,
|
||
|
choices=WaterSavingAppliances.choices,
|
||
|
verbose_name=_('Water saving appliances used')
|
||
|
)
|
||
|
|
||
|
# Feedback and Suggestions
|
||
|
biggest_cause_of_wastage = models.TextField(
|
||
|
verbose_name=_('Biggest cause of water wastage'),
|
||
|
help_text=_('Describe what you think is the biggest cause of water wastage')
|
||
|
)
|
||
|
resources_needed = models.TextField(
|
||
|
verbose_name=_('Resources needed'),
|
||
|
help_text=_('What resources would help you conserve water better?')
|
||
|
)
|
||
|
additional_suggestions = models.TextField(
|
||
|
blank=True,
|
||
|
verbose_name=_('Additional suggestions'),
|
||
|
help_text=_('Any additional suggestions for water conservation')
|
||
|
)
|
||
|
|
||
|
# Metadata
|
||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||
|
updated_at = models.DateTimeField(auto_now=True)
|
||
|
|
||
|
class Meta:
|
||
|
verbose_name = _('Water Conservation Survey')
|
||
|
verbose_name_plural = _('Water Conservation Surveys')
|
||
|
ordering = ['-created_at']
|
||
|
|
||
|
def __str__(self):
|
||
|
return f"Survey by {self.user.username} on {self.created_at.date()}"
|
||
|
|
||
|
def get_water_consciousness_score(self):
|
||
|
"""
|
||
|
Calculate a basic water consciousness score based on user responses
|
||
|
Returns a score between 0-100
|
||
|
"""
|
||
|
score = 0
|
||
|
|
||
|
# Add points for water-saving habits
|
||
|
if self.fix_leaks == self.Awareness.YES:
|
||
|
score += 25
|
||
|
|
||
|
if self.reuse_water == self.Frequency.ALWAYS:
|
||
|
score += 25
|
||
|
elif self.reuse_water == self.Frequency.SOMETIMES:
|
||
|
score += 15
|
||
|
|
||
|
if self.brushing_habits == self.Frequency.ALWAYS:
|
||
|
score += 25
|
||
|
elif self.brushing_habits == self.Frequency.SOMETIMES:
|
||
|
score += 15
|
||
|
|
||
|
if self.water_saving_appliances != self.WaterSavingAppliances.NONE:
|
||
|
score += 25
|
||
|
|
||
|
return min(score, 100)
|