mirror of
https://github.com/GFDRR/sms-lapli.git
synced 2026-11-08 07:16:05 +00:00
123 lines
5.3 KiB
Python
123 lines
5.3 KiB
Python
from rapidsms.apps.base import AppBase
|
|
from base.models import * # importing all models from Donnees_de_Base where data about Contacts are stored
|
|
from hydromet.models import *
|
|
from django.db.models import Avg, Min, Max
|
|
from datetime import timedelta
|
|
from django.utils import timezone, formats
|
|
from datetime import datetime, date
|
|
|
|
import re
|
|
|
|
|
|
def isFloat(val):
|
|
try:
|
|
float(val)
|
|
return True
|
|
except:
|
|
return False
|
|
|
|
|
|
def subtract_one_month(dt0):
|
|
dt1 = dt0.replace(days=1)
|
|
dt2 = dt1 - timedelta(days=1)
|
|
dt3 = dt2.replace(days=1)
|
|
return dt3
|
|
|
|
|
|
class SmsGateway(AppBase):
|
|
def handle(self, msg):
|
|
|
|
tel = msg.peer.strip("+")
|
|
today = datetime.now()
|
|
|
|
observer = Observateur.objects.filter(actif=True, personne__telephone_bureau=tel, personne__actif=True).first()
|
|
|
|
if not observer:
|
|
return True # Return false because we don't want to answer an unknow number
|
|
|
|
else: # If this number is in the list, will work with the text message
|
|
obs_id = observer.pk
|
|
if msg.text == "data":
|
|
data_of_the_day = ""
|
|
observations = Observation.objects.filter(time_result__day=today.day, observateur=observer).first()
|
|
|
|
if observations:
|
|
data_of_the_day += str(formats.date_format(observations.time_result, "SHORT_DATETIME_FORMAT")) + " : " + str(observations.value) + " "
|
|
else:
|
|
data_of_the_day = "Vous n'avez pas encore envoyé de données aujourd'hui."
|
|
|
|
msg.respond(data_of_the_day)
|
|
return True
|
|
elif msg.text == "data month":
|
|
month_before = today - timedelta(days=30) #subtract_one_month(today)
|
|
observations = Observation.objects.filter(time_result__gte=month_before, time_result__lte=today).aggregate(Avg('value'), Max('value'), Min('value'))
|
|
if observations:
|
|
#msg.respond("MAX : " + str(observations.value__max) + " / " + "MIN : " + str(observations.value__min))
|
|
msg.respond("Rapport pour les 30 derniers jours\nMAX : "+ str(observations['value__max']) + " | MIN : " + str(observations['value__min']) + " | MAX : "+ str(observations['value__avg']))
|
|
else:
|
|
msg.respond("Vous n'avez pas encore envoyé de données aujourd'hui.")
|
|
return True
|
|
elif msg.text == "data week":
|
|
sevenDayBeforeToday = today.date() - timedelta(days=7)
|
|
dataOfTheSevenLastDays = Observation.objects.filter(time_result__gt=sevenDayBeforeToday,
|
|
time_result__lt=today, observer=observer)
|
|
data = ""
|
|
for i in dataOfTheSevenLastDays:
|
|
data += str(i.time_result) + " : " + str(i.value) + " "
|
|
msg.respond(data)
|
|
return True
|
|
else:
|
|
pat_zero = '0'
|
|
matched = re.match(pat_zero, msg.text)
|
|
if isFloat(msg.text):
|
|
if matched:
|
|
msg.respond("Vous avez un nombre commencant par 0. Il n'y avait pas de pluie ?")
|
|
return True
|
|
|
|
# person = Personne.objects.get(telephonePersonnel=tel)
|
|
station = observer.station
|
|
# id_station = station.id
|
|
# formule = station.uniteMesure.formule
|
|
# formule = UniteDeMesure.objects.get(id = id_station).formule
|
|
|
|
val_float = float(msg.text) # * float(formule)
|
|
|
|
log = Log()
|
|
|
|
last_value = Observation.objects.filter(observateur=observer, time_result__day=today.day).order_by(
|
|
'-id').first()
|
|
|
|
if last_value:
|
|
last_value.quantitePluie = val_float
|
|
last_value.save()
|
|
info = 'Vous avez envoyé : ' + str(val_float) + '. Donnée mise à jour'
|
|
# logSave(log, recup_last_value, person, val_float)
|
|
else:
|
|
o = Observation()
|
|
o.station = station
|
|
o.observateur = observer
|
|
o.time_start = timezone.now().date() - timedelta(days=1)
|
|
o.time_end = today
|
|
o.time_result = today
|
|
o.value = val_float
|
|
o.valider = False
|
|
o.save()
|
|
info = 'Vous avez envoyé : ' + str(val_float) + '. Donnée sauvegardée. Merci!'
|
|
# logSave(log, recup_last_value, person, val_float)
|
|
|
|
log.observation = last_value
|
|
log.observateur = observer
|
|
log.value = val_float
|
|
log.time_start = timezone.now().date() - timedelta(days=1)
|
|
log.time_end = today
|
|
log.time_result = today
|
|
log.save()
|
|
msg.respond(info)
|
|
return True
|
|
else:
|
|
msg.respond("Verifier la valeur envoyé SVP! On attend un nombre Ex: 12.9 ou 12")
|
|
return True
|
|
|
|
return False
|
|
|