Bonsoir je suis un peu insomniaque aujourd’hui alors je vais parler de RAPIDSMS 😉
RAPIDSMS est un framework applicatif de UNICEF permettant de développer des applications SMS essentiellement .
Cependant RAPIDSMS peut aussi faire EMAIL , IRC , KANNEL , Bref vous pouvez programmer n’ importe quel Backend .
L’application que je vais programmer est inspirée par le Séminaire WARA (West African Research Association)
Par ce cas pratique , l’application RAPIDSMS que j’appellerai (waraseminaire) permettra de créer un système d’ enregistrement des
présentations du séminaire .Également La possibilité de consulter les présentations sera traitée .
Vous pouvez télécharger le code source de cette application sur mon compte github
http://github.com/aliounedia/rapidsms-senegal/tree/master/apps/wara
ou faire un clone
http://github.com/aliounedia/rapidsms-senegal.git
1 . Installation de RAPIDSMS
~$ git clone git://github.com/rapidsms/rapidsms.git
~$ cd rapidsms
~rapidsms$
2 .Firing UP RAPIDSMS
~rapidsms$ python rapidsms syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
Creating table httptester_message
Creating table locations_locationtype
Creating table locations_location
Creating table patterns_pattern
Creating table reporters_role
Creating table reporters_reportergroup
Creating table reporters_reporter
Creating table reporters_persistantbackend
Creating table reporters_persistantconnection
Creating table logger_incomingmessage
Creating table logger_outgoingmessage
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no):
3 .Creating new Application
~rapidsms$ python rapidsms startapp mileage
Don't forget to add 'mileage' to your rapidsms.ini apps.
~rapidsms$
C’est fini on peut maintenant commencer a écrire la logique de notre application:)
4 .Editer le fichier app.py avec le code suivant :
C’est ce fichier qui contient la logique métier de votre application .Lorsque le Backend GSM lit un SMS du modem ,
il parse ce fichier et exécute les méthodes handle , parse ,…
import rapidsms
from rapidsms.parsers.keyworder import *
import models as m
import time
from datetime import datetime
from time import localtime
class App (rapidsms.app.App):
kw = Keyworder ()
def start (self):
"""Configure your app in the start phase."""
pass
def parse (self, message):
"""Parse and annotate messages in the parse phase."""
pass
def handle (self, message):
"""Add your main application logic in the handle phase."""
# pass
try:
function , captures = self.kw.match (self, message.text)
function (self,message ,*captures)
except Exception , e:
message.respond ("Invalid commande : wara theme [theme] date [date] ")
@kw("help")
def help (message):
message.respond ("wara theme <theme> date <jour mois>")
@kw("wara theme (.+) date (\d\d? \d\d?)")
def add_presentation (self , message , theme , date):
"""
Ajouter un nouveau presentateur au seminaire
"""
try:
jr , hr =tuple(date.split())
an ,mois = localtime ()[0], localtime()[1]
m.Seminaire.objects.create\
(theme=theme , phone =message.connection.identity,
date=datetime (int (an),int (mois),int (jr),int (hr)))
message.respond ("Merci d'avoir proposer un theme au seminaire ,\
tapez [wara themes] pour la liste")
return True
except Exception , e:
print "Exception"
print e
@kw ("wara themes|warathemes")
def _get_wara_themes (self , message , *args):
"""
Lister tous les themes proposes lors du seminaire WARA
(WEST AFRICAN RESEARCH )
"""
def to_str(el):
return "[Presentation: %s ,Date : le %s a %s Heures]"%\
(el.theme ,el.date.day , el.date.hour)
def _get_presentation (old_list , given_el):
try:
item =old_list [-1]
new_given = to_str (item) + given_el
if len (new_given)>= 140:
return given_el
else :
old_list.pop ()
return new_given
except Exception , e:
print "Into _get_presentation"
print e
return given_el
seminaires = m.Seminaire.objects.all ()
if not seminaires or len (seminaires)==0:
message.respond ("Aucun seminaire pour le moment")
return
# We got some presentations into data base
seminaires = list (seminaires)
given_el = seminaires.pop ()
given_el = to_str (given_el)
while True :
try:
output_el =_get_presentation (seminaires , given_el)
# Good message size
if output_el == given_el:
message.respond(output_el)
given_el =to_str (seminaires.pop ())
time.sleep (10)
else :
given_el =output_el
except Exception , e :
print e
break
def cleanup (self, message):
"""Perform any clean up after all handlers have run in the
cleanup phase."""
pass
def outgoing (self, message):
"""Handle outgoing message notifications."""
pass
def stop (self):
"""Perform global app cleanup when the application is stopped."""
pass
5.Editer le fichier models.py
C’est votre model de données ,exactement comme sous DJANGO , en fait RAPIDMS enveloppe DJANGO
from django.db import models
from time import localtime
from datetime import datetime
# Create your Django models here, if you need them.
class Seminaire(models.Model):
"""
Model to Store all communication
"""
phone = models.CharField (max_length =160)
theme = models.CharField (max_length =160)
date = models.DateTimeField ()
def __unicode__(self):
return (" %s:%s:%s "%(self.phone , self.theme , self.date))
5.Screenshot:
Ce diaporama nécessite JavaScript.
Voici le resultat obtenu avec le WEB UI Interface
Vous pouvez brancher votre modem (Mutlitech s’il vous plait ; ) ) et laisser votre systeme tourner 😉
app.py
import rapidsms
from rapidsms.parsers.keyworder import *
import models as m
import time
from datetime import datetime
from time import localtime
class App (rapidsms.app.App):
kw = Keyworder ()
def start (self):
« » »Configure your app in the start phase. » » »
pass
def parse (self, message):
« » »Parse and annotate messages in the parse phase. » » »
pass
def handle (self, message):
« » »Add your main application logic in the handle phase. » » »
# pass
try:
function , captures = self.kw.match (self, message.text)
function (self,message ,*captures)
except Exception , e:
print « Exception when handling message »
print e
@kw(« help »)
def help (message):
message.respond (« wara theme <theme> date <jour mois> »)
@kw(« wara theme (.+) date (\d\d? \d\d?) »)
def add_presentation (self , message , theme , date):
« » »
Ajouter un nouveau presentateur au seminaire
1,1 Haut