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.
 
 
 
 
BinaryBrains/survey/models.py

134 lines
4.4 KiB

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)