Archive Page 2

RapidSuivi Testé dans les regions

Tostan , une ONG  américaine  déploie son système RapidSuivi sur le terrain .Après quelques semaines de codes voici les testes qui seront réalisés sur le terrain par les employés dans les différentes régions du senegal et dans la sous région .

http://www.jokkoinitiative.org/

RapidSuivi est un  système de monitoring en temps réel qui trace l’ensemble des activités  aux seins des villages dans les quels l’ONG tostan est présente .Les activités aux seins des communautés sont diverses (Sensibilisation , Vaccination , Mobilisation , transaction financière ).Tout ce qui se passe dans les village ne doit pas échapper au système RapidSuivi .

Le Système fonctionne comme un entrepôt d’information  , stockant toutes les informations reçues dans des bases de données centralisées  et disponibles pour le Département de suivi et évaluation de Tostan .

Le système interprète les données qu’il reçoit sous forme codée et le traduit dans un langage compréhensible par les différents acteurs .

Un Système de Monitoring et de statistiques est embarqué dans le système permettant de recouper toutes les informations .

http://github.com/tostan/rapidsms-tostan/blob/master/apps/rapidsuivi/

 

Publicités

qtip Gadget & Django auto scape

Salut
Aujourd’hui je parlais de gadgets ,_qtip_ une bibliothèque jquery permettant
d’afficher des informations sur votre page web suivant les évènements _survole de la souris_
,_click_.Vous pouvez l’utiliser pour avoir des rendus plus ou moins jolis sur vos pages html.

Aussi django fait du auto scape automatiquement ,ce qui veut dire que si vous utilisez du HTML

dans un views.py django  le HTML rendu a votre JQUERY sera auto scapé , pour eviter cela

vous devez utilisez  {{my_var | safe}}  , et my_var contient votre code html retouné par votre

vue django.

Un exemple d’utilisation est disponible    ici

Vous pouvez télécharger qtip       ici  qtip

a + 😉

Django & Jquery data communication

Salut 😉

Salut a tous les lecteurs de ce blog , salut aux développeurs.La question que l’on se pose très souvent c’est
comment je peux interagir avec django et jquery , de manière a pouvoir parser les données retournées par django
sous jquery.La première chose a savoir c’est que jQuery comme django (python je veux dire est typé) , ce qui
veut dire que les type comme __dict__ ,__list__, __string__ existe aussi bien sous python et sous jquery.
Ainsi lorsque vous exécutez le code suivant

context = [
{« un » : 1 },
{« deux »:2}
]

return  render_to_response (request , context , template)

Le code ci dessus se trouve généralement dans une __view__ django , ce qui veut en terme claire que django est entrain de passer a votre  template un __dictionnaire__.

Maintenant la grande question est comment sous jquery je peux parser ce code et l’utiliser sans problème .la réponse a cette question est extrêmement simple  , trop même.

Je vous avez dit tout a l’heure que jquery comme django est type et de plus le django template système peut être manipulé sans probleme sous jquery .

{% for village in villages %}
var point = new GLatLng(« {{ village.gmap_latitude }} », »{{ village.gmap_longitude }} »);
var marker = new LabeledMarker(point,
{ « labelText »: « {{ village.name }} »,
« labelClass »: « caption »,
« icon »: sprite2()
});
marker.bindInfoWindow(« <div><ul><li>Village :{{ village.name}}</li><li>Relay :{{     village.name}}</li><i>Message: {{ village.name}}</li></ul></div> »);
map.addOverlay(marker);
{% endfor %}

Le bout de code ci dessus par exemple parcours un __dictionnaire__  de villages dans un script Jquery.vous voyez par exemple que on peut créer un dictionnaire jQuery a partir des valeurs retournées par  la vue.L »exemple concret ci dessous me permet de positionner sur google map des villages , et des données comme les  sms  envoyés  depuis ces  villages .
Sachez donc que jquery lorsqu’il est combiné avec django peut faire plein de choses;)

Programmer avec les Decorators

Salut

Les *decorators* sont un moyen puissant d’écrire  un code élégant ,facile a maintenir
et fonctionnant comme des contrôle d’accès par niveau .Vous pouvez les utiliser pour
surcharger vos méthodes a la volée , faire des contrôles d’exécutions sur des fonctions.
Ou tout simplement , écrire du code simple et élégant.

Que cela soit sous django/python,vous trouverez toujours cette façon de programmer .
Le code ci-dessus permet a chaque fois que la fonction *my_function*  est exécutée
, de lui ajouter l’argument *nom* avec la valeur *Alioune Dia*.
Vous vous demandez mais a quoi cela peut t-il servir , mais vous me remercierez  plus tard 😉

def decorator_generator(**kwargs):
   def decorator(function):
        for k , v  in kwargs.items() :
             setattr (function , k, v)
        return function
   return decorator

@decorator_generator(nom = "Alioune Dia")
def my_function():
    print  getattr(my_function, "nom")

>>>my_function()
Alioune Dia

L’autre moyen tout aussi beau de programmer les *decorators* est d’utiliser la fonction *__call__*
permettant aussi d’instancier une classe générateur de *decorators* , et pouvant ainsi passer
des arguments à une fonction avant de la consommer 😉

class Template:
	def __init__(self, **kwargs):
		self.kwargs  = kwargs
	def __call__(self , function):
	       	for k , v in self.kwargs.items():
				setattr (function , k, v)
		return function

@Template(nom="Alioune Dia")
def  my_function():
   print  getattr (my_function , "nom")

>>>my_function()
Alioune Dia

Voila c’est tout  a + 😉

def decorator_generator(**kwargs):
def decorator(function):
for k , v  in kwargs.items() :
setattr (function , k, v)
return function
return decorator 

@decorator_generator(nom = « Alioune Dia »)
def my_function():
print  getattr(my_function, « nom »)

>>>my_function()
Alioune Dia

GoogleMap/Django/JQuery

Salut ;

Je ne vais pas vous ennuyer car c’est le ramadan et tout le monde est fatigué alors passons a l’essentiel.Comment Utiliser Google Map et Django ? 😉

C’est très simple d’abords  obtenez une clef chez google , allez y je vous attends

http://code.google.com/intl/fr/apis/maps/signup.html

Ok ,vous avez votre clef , créer un fichier html et mettez y code code .Je ne vais pas renter dans les

détails mais sachez que c’est du JQUERY  http://docs.jquery.com

—-

<html>
<body>
<head>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=VOTRE_CLEF"></script>
<script type="text/javascript" src="/static/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/static/jquery.gmap-1.1.0-min.js"></script>
<style type ='text/css'>
   body {font-family:"Times New Roman",Georgia,Serif;; font-size:8px;}
   table { width: 900px; margin: 0 auto; border-style:solid ; border-width:1px; border-color:#C0C0C0;}
   div#map { width: 900px;height: 800px; margin: 0 auto; border-style :solid ; border-width: 1px; border-color:#C0C0C0;}
   th{ border-style:solid ; border-width:1px; border-color:#C0C0C0;}
   td{border-style:solid ; border-width:1px; border-color:#C0C0C0;}
</style>
</head>

<body >
<!--script src="http://maps.google.com/maps?file=api&key=" type="text/javascript"></script-->
<script src="/static/labeledmarker.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
        var gm = google.maps;
        if(gm.BrowserIsCompatible()) {
                var INITIAL_ZOOM = 7;

                /* initialize the map with the full
                * map-type, zoom, and pan controls */
                var map = new gm.Map2($("#map").get(0));
                map.addControl(new gm.LargeMapControl());
                map.addControl(new gm.MapTypeControl());
                map.disableDoubleClickZoom();
                /* when the document is unloaded, allow the gmap
                * to release it's resoures (especially for IE6) */
                $(document.body).unload(function() {
                        google.maps.Unload();
                });

                /* we're adding a new location, so center
                * the map over... guatemala! (what?) */
                var lat = 14.497401;
                var lon = -14.452362;
                var latlon = new gm.LatLng(lat, lon);
                map.setCenter(latlon, INITIAL_ZOOM);

                var sprite = function(offset) {
                        var icon = new GIcon(G_DEFAULT_ICON);
                        icon.sprite = {
                        //"image": "/static/locations/images/markers.png",
                        "top": offset * 34
                };
                return icon;
                };

                /* iterate each of the markers (ALL locations),
                * and add a sprite to the map for each one */
                $("td[marker]").each(function() {
                    var loc = $(this);
                    var point = new GLatLng(loc.attr("lat"), loc.attr("lng"));
                    var marker = new LabeledMarker(point, { "labelText": loc.attr("code"), "labelClass": "caption", "icon": sprite(loc.attr("marker")) });
                    marker.bindInfoWindow(this);
                    map.addOverlay(marker);
                });
        }
});
</script>

<table>
     <tr>
         <td>
            <div id="map">
                &nbsp;
            </div>
        </td>
    </tr>
</table>
<table id="markers">
    <tr>
	<th>Nom Village</th><th>Latitude</th><th>Longitude</th><th>Dernier SMS</th>
    </tr>

{% for village in villages %}
    <tr>
        <td>{{village.village_name}}</td>
        <td>{{village.latitude}}</td>
        <td>{{village.longitude}}</td>
	<td  code="" marker="test" lat="{{village.latitude}}" lng="{{village.longitude}}">
            {{village.last_message}}
	</td>
    </tr>
{% endfor %}
</table>
</body>
</html>

—–

Dans le code ci -dessus vous devez remplacer votre clef dans l’ entête ou j’ai mis [VOTRE_CLEF] .

Vous remarquez qu’il y’ a aussi la syntaxe de template de django ,cela montre juste que cette page

est servie par une vue django c-dessous.

—-

def handle (req):
    list = []
    for  village in Village.objects.all() :
        try:
              last_message =village.message_set.latest('received')
              list.append(
                  # Decimal is not Serializable
                  {'longitude':str(village.longitude),
                   'latitude':str(village.latitude),
                   'village_name':str(village.name) ,
                   'last_message':str(last_message)
                 })
        except Exception,  e:
              print  'Hum!Village n a pas de message?'
              print e
    print  list
    return render_to_response ('map.html' , { "villages": list})

—-

Bien entendu si je ne vous donne pas le fichier models.py  et le fichier url.py cette vue ne servira a rein .donc voici le model de donnée qui est associé a cette vue

from django.db import models
from datetime import datetime
# Create your models here.
class Village(models.Model):
    name = models.CharField (max_length = 20 , default = 'koalack')
    longitude =models.DecimalField (max_digits =10, decimal_places =5)
    latitude  =models.DecimalField (max_digits =10, decimal_places =5)

    def __unicode__(self):
        return self.name

class Message(models.Model):
    text = models.TextField  ()
    village =models.ForeignKey (Village)
    received = models.DateTimeField (default = datetime.utcnow())
    def __unicode__(self):
        return self.text

Et enfin voci le fichier urls.py  qui est associé a ce model.

from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
from mapg.googlemap import views
urlpatterns = patterns('',
    # Example:
    # (r'^mapg/', include('mapg.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^$' , views.handle , name="handle"),
    url(r'^cal/?$' , views.calendar_handler , name="calendar"),
    (r'^admin/', include(admin.site.urls)),
    (r'^static/(?P<path>.*)' , 'django.views.static.serve' ,
     {'document_root':'/home/dia/mapg/googlemap/static'})
)

--

S’il vous plait n’oubliez pas de prendre les biblitheques Jquery  manquantes et de mettre dans votre base des données latitude , longitude et le village associé par exemple

Moi dans ma base j’ai par exemple  [‘Keur Samba Loabé’ ,  ‘14.222’, ‘14.00005 »].

Et voici ce que vous obtenez si vous faites tout ce qui est necessaire  .Aplus 😉

def handle (req):
 »’Cette vue est uniquement appellee par JQUERY
et retourne la deniere message pour tous les villages »’
list = []
for  village in Village.objects.all() :
try:
last_message =village.message_set.latest(‘received’)
list.append(
# Decimal is not Serializable
{‘longitude’:str(village.longitude),
‘latitude’:str(village.latitude),
‘village_name’:str(village.name) ,
‘last_message’:str(last_message)
})
except Exception,  e:
print  ‘Hum!Village n a pas de message?’
print e
print  list
return render_to_response (‘map.html’ , { « villages »: list})

RapidSuivi ,Tostan

Salut  😉

Le NGO Tostan travaille sur un nouveau système basé sur RAPIDSMS afin de suivre en temps réel les programmes au sein des villages .L’objectif visé est de mettre en place un système permettant aux facilitateurs de donner des détails en temps réels de leurs programmes  (Nombre de participants , nombre de femmes  , d’enfants) .

Jusqu’à ‘ a  présent ces données ne sont accessibles que par intervalle de jours , voir semaines  . ces données sont récupérées par des 4×4  tout terrain parcourant les villages .Ce système devra donc a terme  permettre un meilleur suivi des programmes mais surtout un gain d’argent et de temps .

Notre souhait est que a terme tous les sites puissent accéder au Web UI afin de voir en temps réels  les  messages  et de réagir  en conséquence .

Voici un petit résumé de ce que nous essayons de faire ! 😉

django-pyodbc

Salut  😉

Il arrive parfois lorsqu’on travaille dans un environnement , ou on n’a pas la possibilité de travailler dans les systèmes que nous aimons (LINUX) , et dans les outils que nous aimons (DJANGO , PYTHON ) , nous sommes obligés de nous adapter .

Je n’ai jamais eu besoin de faire du django en utilisant SQL Server , mais  comme je l’ai dis tant tôt on n’a pas toujours ce que l’on veut  😉

Alors aujourd’hui dans mon travaille , j’essaie  d’initier  et de faire adopter les systèmes comme django ,  c’est un travaille difficile mais j’ai confiance 😉

Alors si vous voulez faire du django avec une base de Données SQL Server vous pouvez utiliser django-pyodbc

1 – Install pyodbc.

Si c’est bien installer vous pouvez essayer de l’importer et de vous connecter a une base de données SQL Server .J’ai enlever mes paramètres de connections et le no du

serveur par sécurité sur l’écran 😉

2 -Télécharger et installer django-pyodbc

3- Mettez le chemin complet de votre dossier (django-pyodbc) dans  votre PYTHONPATH .Si vous êtes sous window , vous savez  ce fameux logiciel de merde  😉 , vous pouvez le faire via les paramètres d’environnement

4 – Tester si le module django- pyodbc est bien disponible

Vous voyez bien que quand j’ importe   [sql_server.pyodbc ] , il y ‘a pas d’erreurs .c’est important  car  [settings.py]  de django utilise ce module pour se connecter a un base de donner SQL Serveur .

5- Enfin si votre base de données existe déjà vous pouvez faire  [python manage.py   inspectdb > models.py ] , pour créer le fichier modele.py de django

Bien sur l’idéal c’est d’avoir une base vierge .On ne crée plus de base de données avec sa main 😉 .Django est entrain de créer votre model .

6 – Voici la partie de mon fichier django settings.py
DATABASE_ENGINE= ‘sql_server.pyodbc’
DATABASE_NAME  = ‘XX’
DATABASE_USER  = ‘XX’
DATABASE_PASSWORD  = ‘XX’
DATABASE_HOST   = ‘10.2.0.XXX’
DATABASE_OPTIONS = {
#’driver’ : ‘SQL Native Client’,
‘driver’: ‘SQL Server’,
‘MARS_Connection’:True

}

Vous pouvez également voir les sources sur mon compte github  , github

A+ 😉

htt  estp://code.google.com/p/django-pyodbc/