Files
HaitiWater/code/haitiwater/apps/utils/get_data.py
T

182 lines
5.2 KiB
Python

import datetime
from ..consumers.models import Consumer
from ..report.models import Report
from ..water_network.models import Element, VirtualElementTotal, VirtualZoneTotal
def is_int(i):
try:
int(i)
return True
except ValueError:
return False
def is_float(i):
try:
float(i)
return True
except ValueError:
return False
def is_user_fountain(request):
groups = request.user.groups.values_list('name', flat=True)
return "Gestionnaire de fontaine" in groups
def is_user_zone(request):
groups = request.user.groups.values_list('name', flat=True)
return "Gestionnaire de zone" in groups
def get_current_month():
today = datetime.date.today()
months = ['zero', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October',
'November', 'December']
return months[today.month].upper()
def get_current_month_fr():
today = datetime.date.today()
months = ['zero', 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre',
'novembre', 'décembre']
return months[today.month]
def get_amount(type, zone):
zone_view = VirtualZoneTotal.objects.get(relevant_model=zone.id)
if type == "FOUNTAIN":
return zone_view.fountains
elif type == 'KIOSK':
return zone_view.kiosks
elif type == "INDIVIDUAL":
return zone_view.indiv_outputs
elif type == "PIPE":
return zone_view.pipes
elif type == "TANK":
return zone_view.tanks
else:
return 0
def get_amount_fountain(zone):
return get_amount("FOUNTAIN", zone)
def get_amount_kiosk(zone):
return get_amount("KIOSK", zone)
def get_amount_individual(zone):
return get_amount("INDIVIDUAL", zone)
def get_amount_pipe(zone):
return get_amount("PIPE", zone)
def get_amount_household(request):
if is_user_zone(request):
zone = request.user.profile.zone
zone_view = VirtualZoneTotal.objects.get(relevant_model=zone.id)
return zone_view.indiv_consumers
elif is_user_fountain(request):
total = 0
for outlet in request.user.profile.outlets:
consumers_outlet = Consumer.objects.filter(water_outlet_id=outlet)
total += len(consumers_outlet)
return total
def get_total_consumers(request):
result = 0
if is_user_zone(request):
zone = request.user.profile.zone
zone_view = VirtualZoneTotal.objects.get(relevant_model=zone.id)
return zone_view.total_consumers
elif is_user_fountain(request):
for outlet in request.user.profile.outlets:
view = VirtualElementTotal.objects.get(relevant_model=outlet)
result += view.total_consumers
return result
def get_amount_indiv_consummer(zone):
result = 0
for consumer in Consumer.objects.all():
if consumer.water_outlet.zone.name in zone.subzones:
result += consumer.household_size+1
return result
def get_outlets(request):
zone = request.user.profile.zone
outlets = request.user.profile.outlets
if zone:
all_outlets = Element.objects.filter(zone__name__in=zone.subzones, type__in=["KIOSK", "FOUNTAIN", "INDIVIDUAL"])
result = []
for elem in all_outlets:
result.append((elem.id, elem.name))
return result
else:
result = []
for elem_id in outlets:
elem = Element.objects.get(id=elem_id)
result.append((elem.id, elem.name))
return result
def get_outlets_report(request):
all_outlets = get_outlets(request)
result = []
for elem in all_outlets:
reports = Report.objects.filter(water_outlet=elem[0],
timestamp__month=datetime.date.today().month)
if len(reports) == 0:
result.append(elem)
return result
def get_quantity_distributed(request):
outlets = get_outlets(request)
total = 0
for outlet in outlets:
report = Report.objects.filter(water_outlet=outlet[0],
timestamp__month=datetime.date.today().month,
has_data=True,
was_active=True)
if len(report) == 1:
report = report[0]
total += report.quantity_distributed
return [total, round(total*264.17, 3)] #m3, gals
def get_zone(request):
if is_user_zone(request):
return request.user.profile.zone.name
else:
zone = get_higher_zone(request.user.profile.outlets)
return zone.name
def get_higher_zone(outlets):
zone = ""
for elem in outlets:
out = Element.objects.filter(id=elem)
if len(out) == 1:
out = out[0]
if zone == "": #First zone found
zone = out.zone
elif out.zone.name not in zone.subzones and zone.name in out.zone.subzones: #New zone is higher
zone = out.zone
return zone
def has_access(outlet, request):
if is_user_fountain(request):
return str(outlet.id) in request.user.profile.outlets
elif is_user_zone(request):
return outlet.zone.name in request.user.profile.zone.subzones