From 7842288a6320efb63da84e431eeb8d9bdc2c64a0 Mon Sep 17 00:00:00 2001
From: Sanj
Date: Tue, 8 May 2012 21:41:50 +0530
Subject: [PATCH 01/21] mumbaitrains + apiviews minor optimization
---
chaloBEST/mumbai/apiviews.py | 4 +--
chaloBEST/mumbaitrains/__init__.py | 0
chaloBEST/mumbaitrains/models.py | 32 ++++++++++++++++++
chaloBEST/mumbaitrains/parse.py | 52 ++++++++++++++++++++++++++++++
chaloBEST/mumbaitrains/tests.py | 16 +++++++++
chaloBEST/mumbaitrains/views.py | 1 +
chaloBEST/settings.py | 3 ++
7 files changed, 106 insertions(+), 2 deletions(-)
create mode 100644 chaloBEST/mumbaitrains/__init__.py
create mode 100644 chaloBEST/mumbaitrains/models.py
create mode 100644 chaloBEST/mumbaitrains/parse.py
create mode 100644 chaloBEST/mumbaitrains/tests.py
create mode 100644 chaloBEST/mumbaitrains/views.py
diff --git a/chaloBEST/mumbai/apiviews.py b/chaloBEST/mumbai/apiviews.py
index c7935d4..0016866 100644
--- a/chaloBEST/mumbai/apiviews.py
+++ b/chaloBEST/mumbai/apiviews.py
@@ -67,9 +67,9 @@ def areas(request):
def stops(request):
q = request.GET.get("q", "")
if q != '':
- qset = Stop.objects.find_approximate(q, TRIGRAM_THRESHOLD).select_related()
+ qset = Stop.objects.find_approximate(q, TRIGRAM_THRESHOLD).select_related('road', 'area')
else:
- qset = Stop.objects.all().select_related()
+ qset = Stop.objects.all().select_related('road', 'area')
srid = int(request.GET.get("srid", 4326))
return render_to_json_response({
'type': 'FeatureCollection',
diff --git a/chaloBEST/mumbaitrains/__init__.py b/chaloBEST/mumbaitrains/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/chaloBEST/mumbaitrains/models.py b/chaloBEST/mumbaitrains/models.py
new file mode 100644
index 0000000..395972e
--- /dev/null
+++ b/chaloBEST/mumbaitrains/models.py
@@ -0,0 +1,32 @@
+from django.contrib.gis.db import models
+
+
+LINE_CHOICES = (
+ ('Western', 'Western'),
+ ('Central', 'Central'),
+ ('Harbour', 'Harbour'),
+)
+
+class Train(models.Model):
+ number = models.CharField(max_length=128)
+ line = models.CharField(max_length=128, choices=LINE_CHOICES, db_index=True)
+ stations = models.ManyToManyField("Station", through='TrainStation')
+
+ def __unicode__(self):
+ return self.number
+
+class Station(models.Model):
+ name = models.CharField(max_length=128)
+ point = models.PointField(null=True, blank=True)
+# line = models.CharField(choices=LINE_CHOICES, db_index=True)
+
+ def __unicode__(self):
+ return self.name
+
+class TrainStation(models.Model):
+ train = models.ForeignKey(Train)
+ station = models.ForeignKey(Station)
+ serial = models.IntegerField()
+ time = models.TimeField()
+
+# Create your models here.
diff --git a/chaloBEST/mumbaitrains/parse.py b/chaloBEST/mumbaitrains/parse.py
new file mode 100644
index 0000000..dca41b7
--- /dev/null
+++ b/chaloBEST/mumbaitrains/parse.py
@@ -0,0 +1,52 @@
+from pyquery import PyQuery as pq
+from models import *
+import datetime
+
+BASE_URL = 'http://mumbailifeline.com/'
+
+'''
+eg.:
+>>>parseURL('http://mumbailifeline.com/timetable.php?sel_route=central&sfrom=Mumbai_CST&sto=Masjid&time1=4:00%20am&time2=11:59%20PM', Central')
+'''
+def parseURL(url, line):
+ d = pq(url=url)
+ table = d('#gradient-style')
+ trs = table.find('tr')
+ for i in range(1,len(trs)):
+ thisTr = trs[i]
+ td = thisTr.getchildren()[0]
+ a = td.find('a')
+ trainNo = a.text.strip()
+ print "Saving %s ... " % trainNo
+ trainURL = BASE_URL + a.get('href').strip()
+ saveTrain(trainURL, trainNo, line)
+
+
+def saveTrain(url, no, line):
+ train, created = Train.objects.get_or_create(number=no, line=line)
+ if not created:
+ print "Train no %s already exists in db, skipping" % no
+ return
+ train.save()
+ d = pq(url=url)
+ table = d.find('table')[3]
+ for tr in table.iterfind('tr'):
+ children = tr.getchildren()
+ serial = 0
+ if len(tr.findall('td')) > 0:
+ td0 = children[0]
+ a = td0.find('a')
+ stationName = a.text.strip()
+ station, created = Station.objects.get_or_create(name=stationName)
+ timeString = children[1].find('strong').text
+ hour = int(timeString.split(":")[0].strip()) - 1
+ mins = int(timeString.split(":")[1][0:2])
+ ampm = timeString[-2:]
+ if ampm == 'pm':
+ hour = hour + 12
+ stationTime = datetime.time(hour,mins)
+ st = TrainStation(train=train, station=station, time=stationTime, serial=serial)
+ st.save()
+ serial += 1
+ print "Saved %s" % no
+
diff --git a/chaloBEST/mumbaitrains/tests.py b/chaloBEST/mumbaitrains/tests.py
new file mode 100644
index 0000000..501deb7
--- /dev/null
+++ b/chaloBEST/mumbaitrains/tests.py
@@ -0,0 +1,16 @@
+"""
+This file demonstrates writing tests using the unittest module. These will pass
+when you run "manage.py test".
+
+Replace this with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+
+class SimpleTest(TestCase):
+ def test_basic_addition(self):
+ """
+ Tests that 1 + 1 always equals 2.
+ """
+ self.assertEqual(1 + 1, 2)
diff --git a/chaloBEST/mumbaitrains/views.py b/chaloBEST/mumbaitrains/views.py
new file mode 100644
index 0000000..60f00ef
--- /dev/null
+++ b/chaloBEST/mumbaitrains/views.py
@@ -0,0 +1 @@
+# Create your views here.
diff --git a/chaloBEST/settings.py b/chaloBEST/settings.py
index 53a0719..a9692b7 100644
--- a/chaloBEST/settings.py
+++ b/chaloBEST/settings.py
@@ -98,6 +98,7 @@ MIDDLEWARE_CLASSES = (
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
+ 'debug_toolbar.middleware.DebugToolbarMiddleware'
)
ROOT_URLCONF = 'chaloBEST.urls'
@@ -120,7 +121,9 @@ INSTALLED_APPS = (
# Uncomment the next line to enable admin documentation:
'django.contrib.gis',
'django_extensions',
+ 'debug_toolbar',
'mumbai',
+ 'mumbaitrains',
# 'django.contrib.admindocs',
)
From bb0f93d4c20d82bdd28565fee0a34da96c209071 Mon Sep 17 00:00:00 2001
From: Sanj
Date: Tue, 8 May 2012 21:55:47 +0530
Subject: [PATCH 02/21] silly, initialize serial outside of loop
---
chaloBEST/mumbaitrains/parse.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/chaloBEST/mumbaitrains/parse.py b/chaloBEST/mumbaitrains/parse.py
index dca41b7..96729f7 100644
--- a/chaloBEST/mumbaitrains/parse.py
+++ b/chaloBEST/mumbaitrains/parse.py
@@ -30,9 +30,9 @@ def saveTrain(url, no, line):
train.save()
d = pq(url=url)
table = d.find('table')[3]
+ serial = 0
for tr in table.iterfind('tr'):
children = tr.getchildren()
- serial = 0
if len(tr.findall('td')) > 0:
td0 = children[0]
a = td0.find('a')
From 32592cbfa44548eea2d7ad8d7f1e9b055cc1b504 Mon Sep 17 00:00:00 2001
From: Subhodip Biswas
Date: Thu, 10 May 2012 16:16:27 +0530
Subject: [PATCH 03/21] Stop editor form field visible on click
---
chaloBEST/static/js/buseditor.js | 229 +++++++++++++++++--------------
1 file changed, 126 insertions(+), 103 deletions(-)
diff --git a/chaloBEST/static/js/buseditor.js b/chaloBEST/static/js/buseditor.js
index b6166db..70bef40 100644
--- a/chaloBEST/static/js/buseditor.js
+++ b/chaloBEST/static/js/buseditor.js
@@ -1,11 +1,14 @@
(function($) {
- var API_BASE = 'http://chalobest.in/1.0/';
+ var API_BASE = 'http://localhost:8000/1.0/';
console.log(API_BASE);
var clickedName = 'stops';
var searchQuery = 'None';
var url1 = API_BASE + clickedName + '/' + '?q=';
var url2 = API_BASE + clickedName + '/';
- var Features = Backbone.Model.extend({});
+ var Features = Backbone.Model.extend({
+
+
+ });
var apiCollection = Backbone.Collection.extend({
model: Features,
@@ -15,126 +18,146 @@
}
});
+
var apiView = Backbone.View.extend({
- //el: '#sideBar',
- events: {
- "click a": "stopDetails"
- },
+ //el: '#content',
+ events: {
+ "click a": "clicked"
+ },
initialize: function() {
- //this.render();
- _.bindAll(this, "render");
- this.collection.bind("all", this.render);
+ //this.render();
+ _.bindAll(this, "render", "clicked");
+ this.collection.bind("all", this.render, this.clicked);
//apiView.prototype.initialize.call(this);
},
render: function() {
//$(this.el).html(this.counter = this.collection.length);
- console.log(this.collection.length);
- //console.log(this.el);
- this.collection.each( function(model){
- $('#sideBar').append(' ' + model.get('properties').official_name + "");
- //console.log(model.cid);
+ //console.log(this.collection.length);
+ //console.log(this.el);
+ this.collection.each(function(model) {
+ $('#sideBar').append(' ' + model.get('properties').official_name + "");
+ //console.log(model.cid);
+ });
- });
-
- return this;
-
- },
- clicked: function(e) {
- //e.preventDefaults();
- //var name1 = this.model.get('properties').official_name;
- console.log(e);
- //alert("you clicked me"+ e.target.innerHTML);
-
-
- },
+ return this;
+
+ },
+ clicked: function(e) {
+ //e.preventDefaults();
+ //var name1 = this.model.get('properties').official_name;
+
+ //console.log(e);
+ //alert("you clicked me"+ e.target.innerHTML);
+ events.trigger('stopdetailsEvent', e);
+ //return this;
+ },
+
+ //close: function() {
+ // $(this.el).unbind();
+ // $(this.el).remove();
+ //}
+
+
+ });
+var stopView = Backbone.View.extend({
+ el: '#content',
+ initialize: function() {
+ _.bindAll(this, "stopDetails");
+ this.collection.bind("stopdetailsEvent", this.stopDetails);
+
+ },
+
stopDetails: function(e) {
- var cid = $(e.target).attr('id');
- //this.trigger
- //console.log(cid);
- this.values= this.collection.getByCid(cid);
- //this.trigger('new-stage', this.collection.get)
- this.stopName = e.target.innerHTML;
- //var test = this.collection.where({official_name: this.stopName});
- console.log(this.values.get('properties').road);
- $('#sLug').append(this.values.get('properties').slug);
- $('#rOads').append(this.values.get('properties').road);
- $('#rOutes').append(this.values.get('properties').routes);
- $('#dIrection').append(this.values.get('properties').direction);
- //console.log(e.target);
- $('#dIsplayName').append(this.values.get('properties').official_name);
- $('#mArathiName').append(this.values.get('properties').name_mr);
- $('#aLtName').append(this.values.get('properties').alternative_names);
- },
- close:function () {
- $(this.el).unbind();
- $(this.el).remove();
- }
-
+ //console.log(e);
+ //alert("you clicked me"+ e.target.innerHTML);
+ var cid = $(e.target).attr('id');
+ //this.trigger
+ //console.log(cid);
+ this.values = this.collection.getByCid(cid);
+ //this.trigger('new-stage', this.collection.get)
+ this.stopName = e.target.innerHTML;
+ //var test = this.collection.where({official_name: this.stopName});
+ //console.log(this.values.get('properties').road);
+ //console.log(this.el);
+ $(this.el).find('input#sLug').val(this.values.get('properties').slug);
+ //$('#sLug').attr('id', 'sLug').value(this.values.get('properties').slug);
+ $(this.el).find('input#rOads').val(this.values.get('properties').road);
+ $(this.el).find('textarea#rOutes').html(this.values.get('properties').routes);
+ $(this.el).find('input#dIrection').val(this.values.get('properties').direction);
+ //console.log(e.target);
+ $(this.el).find('input#dIsplayName').val(this.values.get('properties').official_name);
+ $(this.el).find('input#mArathiName').val(this.values.get('properties').name_mr);
+ $(this.el).find('input#aLtName').val(this.values.get('properties').alternative_names);
+
+ },
+ });
+
- }),
events = new apiCollection();
- $(function() {
+ $(function() {
+ stopDetailsView = new stopView({
+ el: $("#content"),
+ collection: events
+ });
eventView = new apiView({
- el: $("#sideBar"),
- //el: $('#slug'),
- //el:$('#displayName'),
+ el: $("#sideBar"),
+ //el: $('#slug'),
+ //el:$('#displayName'),
collection: events
});
-
- events.fetch({
- success: function() {
- console.log(events.length);
- //console.log(this.official_name);
- //alert();
+
+
+ events.fetch({
+ success: function() {
+ console.log(events.length);
+ //console.log(this.official_name);
+ //alert();
+ }
+ });
+ });
+
+
+
+ var Map = Backbone.Model.extend({});
+
+
+ var MapView = Backbone.View.extend({
+ el: '#mapCol',
+
+ initialize: function() {
+ _.bindAll(this, 'initMap');
+ this.initMap();
+
+ },
+
+ initMap: function() {
+ // Initialize Basic Openlayers;
+ var center = new OpenLayers.LonLat(8110203.9998955, 2170000.4068373);
+ //alert("you are here");
+ map = new OpenLayers.Map(this.el, {
+ projection: new OpenLayers.Projection("EPSG:900913"),
+ displayProjection: new OpenLayers.Projection("EPSG:4326")
+ });
+ //alert(this.el);
+ var layers = [];
+ layers[0] = new OpenLayers.Layer.OSM(); //some more layer will go here
+ //$(this.el).html(map);
+ map.addLayers(layers);
+ map.setCenter(center, 12);
}
});
-});
+ $(function() {
+ var map_view = new MapView();
+ //alert("I am here" + this.el);
+ });
-
-
- var Map = Backbone.Model.extend({});
-
-
- var MapView = Backbone.View.extend({
- el: '#mapCol',
-
- initialize: function() {
- _.bindAll(this, 'initMap');
- this.initMap();
-
- },
-
- initMap: function() {
- // Initialize Basic Openlayers;
- var center = new OpenLayers.LonLat(8110203.9998955, 2170000.4068373);
- //alert("you are here");
- map = new OpenLayers.Map(this.el, {
- projection: new OpenLayers.Projection("EPSG:900913"),
- displayProjection: new OpenLayers.Projection("EPSG:4326")
- });
- //alert(this.el);
- var layers = [];
- layers[0] = new OpenLayers.Layer.OSM(); //some more layer will go here
- //$(this.el).html(map);
- map.addLayers(layers);
- map.setCenter(center, 12);
-
- }
- });
- $(function() {
- var map_view = new MapView();
- //alert("I am here" + this.el);
- });
-
- //var router = Backbone.Router.extend({
- //routes:{
-
- //})
-
- })(jQuery);
+ //var router = Backbone.Router.extend({
+ //routes:{
+ //})
+})(jQuery);
From 97a17f64a21c518fd3fabaa27d889490f9a9bc08 Mon Sep 17 00:00:00 2001
From: Subhodip Biswas
Date: Thu, 10 May 2012 16:21:34 +0530
Subject: [PATCH 04/21] Stop editor form field visible on click
---
chaloBEST/static/js/buseditor.js | 4 ++--
chaloBEST/templates/buseditor.html | 11 +++++++----
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/chaloBEST/static/js/buseditor.js b/chaloBEST/static/js/buseditor.js
index 70bef40..eedc741 100644
--- a/chaloBEST/static/js/buseditor.js
+++ b/chaloBEST/static/js/buseditor.js
@@ -1,6 +1,6 @@
(function($) {
- var API_BASE = 'http://localhost:8000/1.0/';
- console.log(API_BASE);
+ var API_BASE = 'http://chalobest.in/1.0/';
+ //console.log(API_BASE);
var clickedName = 'stops';
var searchQuery = 'None';
var url1 = API_BASE + clickedName + '/' + '?q=';
diff --git a/chaloBEST/templates/buseditor.html b/chaloBEST/templates/buseditor.html
index 25ab622..f86b075 100644
--- a/chaloBEST/templates/buseditor.html
+++ b/chaloBEST/templates/buseditor.html
@@ -6,9 +6,10 @@
{% block head %}
+
-
+
@@ -24,7 +25,7 @@
-
+
@@ -37,14 +38,16 @@
This BEST Bus stop editor allows you to edit Stops and Areas.
-
+
-
+
+
+
From 7793fbb380038f5a61639766d4e6da440a14f0b6 Mon Sep 17 00:00:00 2001
From: Sanj
Date: Fri, 11 May 2012 02:59:05 +0530
Subject: [PATCH 05/21] edit fabfile
---
fabfile.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fabfile.py b/fabfile.py
index 4efca94..bbe31a6 100644
--- a/fabfile.py
+++ b/fabfile.py
@@ -42,5 +42,5 @@ def setup():
def deploy():
bzr_push()
bzr_update()
- virtual_run('python %(project_name)s/manage.py syncdb;python %(project_name)s/manage.py migrate'%env)
+# virtual_run('python %(project_name)s/manage.py syncdb;python %(project_name)s/manage.py migrate'%env)
run('touch %(project_root)s/wsgi/django.wsgi'%env)
From 252b947758d3762297b70a83b86b0af7eb6747b2 Mon Sep 17 00:00:00 2001
From: Sanj
Date: Tue, 15 May 2012 18:33:43 +0530
Subject: [PATCH 06/21] add css / templates for smsBEST
---
chaloBEST/mumbai/models.py | 11 +-
chaloBEST/mumbai/views.py | 10 +
chaloBEST/templates/base.html | 4 +
chaloBEST/templates/route.html | 90 ++++-
chaloBEST/urls.py | 5 +
smsBEST/settings.py | 13 +-
.../rapidsms/icons/silk/accept--dull.png | Bin 0 -> 691 bytes
smsBEST/static/rapidsms/icons/silk/accept.png | Bin 0 -> 781 bytes
smsBEST/static/rapidsms/icons/silk/add.png | Bin 0 -> 733 bytes
.../static/rapidsms/icons/silk/building.png | Bin 0 -> 556 bytes
.../rapidsms/icons/silk/bullet_white.png | Bin 0 -> 201 bytes
.../static/rapidsms/icons/silk/decline.png | Bin 0 -> 781 bytes
smsBEST/static/rapidsms/icons/silk/delete.png | Bin 0 -> 715 bytes
smsBEST/static/rapidsms/icons/silk/email.png | Bin 0 -> 641 bytes
.../rapidsms/icons/silk/email_error.png | Bin 0 -> 792 bytes
.../static/rapidsms/icons/silk/email_go.png | Bin 0 -> 754 bytes
.../static/rapidsms/icons/silk/email_open.png | Bin 0 -> 783 bytes
.../rapidsms/icons/silk/exclamation.png | Bin 0 -> 701 bytes
smsBEST/static/rapidsms/icons/silk/help.png | Bin 0 -> 786 bytes
.../static/rapidsms/icons/silk/magnifier.png | Bin 0 -> 615 bytes
.../rapidsms/icons/silk/package_add.png | Bin 0 -> 899 bytes
.../static/rapidsms/icons/silk/package_go.png | Bin 0 -> 898 bytes
smsBEST/static/rapidsms/icons/silk/phone.png | Bin 0 -> 488 bytes
smsBEST/static/rapidsms/icons/silk/reload.png | Bin 0 -> 643 bytes
.../rapidsms/icons/silk/resultset_first.png | Bin 0 -> 836 bytes
.../rapidsms/icons/silk/resultset_last.png | Bin 0 -> 827 bytes
.../rapidsms/icons/silk/resultset_next.png | Bin 0 -> 600 bytes
.../icons/silk/resultset_previous.png | Bin 0 -> 597 bytes
.../icons/silk/section_collapsed--bright.png | Bin 0 -> 253 bytes
.../icons/silk/section_expanded--bright.png | Bin 0 -> 271 bytes
.../rapidsms/icons/silk/sort_ascending.png | Bin 0 -> 506 bytes
.../rapidsms/icons/silk/sort_descending.png | Bin 0 -> 509 bytes
smsBEST/static/rapidsms/icons/silk/user.png | Bin 0 -> 741 bytes
.../rapidsms/images/bessms_header07d.png | Bin 0 -> 26794 bytes
.../rapidsms/images/bestsms_header_final.jpg | Bin 0 -> 18042 bytes
.../rapidsms/images/big-arrows/down.png | Bin 0 -> 876 bytes
.../rapidsms/images/big-arrows/error.png | Bin 0 -> 774 bytes
.../rapidsms/images/big-arrows/left.png | Bin 0 -> 783 bytes
.../rapidsms/images/big-arrows/right.png | Bin 0 -> 806 bytes
.../rapidsms/images/big-arrows/source.xcf | Bin 0 -> 13574 bytes
.../static/rapidsms/images/big-arrows/up.png | Bin 0 -> 737 bytes
smsBEST/static/rapidsms/images/body-bg.png | Bin 0 -> 9325 bytes
.../rapidsms/images/h2-bg-collapsed.png | Bin 0 -> 825 bytes
smsBEST/static/rapidsms/images/h2-bg.png | Bin 0 -> 1051 bytes
smsBEST/static/rapidsms/images/h3-bg.png | Bin 0 -> 932 bytes
smsBEST/static/rapidsms/images/header-bg.png | Bin 0 -> 929 bytes
.../static/rapidsms/images/rapidsms-logo.png | Bin 0 -> 4587 bytes
.../static/rapidsms/images/tab-bg-active.png | Bin 0 -> 142 bytes
.../static/rapidsms/images/tab-bg-hover.png | Bin 0 -> 101 bytes
smsBEST/static/rapidsms/images/tab-bg.png | Bin 0 -> 228 bytes
.../rapidsms/images/table-footer-bg.png | Bin 0 -> 125 bytes
.../images/table-header-bg-highlight.png | Bin 0 -> 226 bytes
.../rapidsms/images/table-header-bg.png | Bin 0 -> 535 bytes
.../rapidsms/images/table-row-bg-active.png | Bin 0 -> 179 bytes
.../static/rapidsms/images/unicef-logo.png | Bin 0 -> 3665 bytes
.../static/rapidsms/javascripts/collapse.js | 12 +
.../javascripts/global/rs-module-help.js | 29 ++
.../javascripts/global/rs-pagination.js | 63 ++++
.../rapidsms/javascripts/jquery-1.3.2.min.js | 19 ++
smsBEST/static/rapidsms/stylesheets/forms.css | 146 ++++++++
smsBEST/static/rapidsms/stylesheets/icons.css | 25 ++
.../static/rapidsms/stylesheets/layout.css | 318 ++++++++++++++++++
.../static/rapidsms/stylesheets/modules.css | 137 ++++++++
.../static/rapidsms/stylesheets/splits.css | 52 +++
.../static/rapidsms/stylesheets/tables.css | 237 +++++++++++++
smsBEST/templates/dashboard.html | 195 +++++++++++
smsBEST/templates/layout.html | 89 +++++
smsBEST/urls.py | 16 +-
68 files changed, 1458 insertions(+), 13 deletions(-)
create mode 100755 smsBEST/static/rapidsms/icons/silk/accept--dull.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/accept.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/add.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/building.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/bullet_white.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/decline.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/delete.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/email.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/email_error.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/email_go.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/email_open.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/exclamation.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/help.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/magnifier.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/package_add.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/package_go.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/phone.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/reload.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/resultset_first.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/resultset_last.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/resultset_next.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/resultset_previous.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/section_collapsed--bright.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/section_expanded--bright.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/sort_ascending.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/sort_descending.png
create mode 100755 smsBEST/static/rapidsms/icons/silk/user.png
create mode 100755 smsBEST/static/rapidsms/images/bessms_header07d.png
create mode 100755 smsBEST/static/rapidsms/images/bestsms_header_final.jpg
create mode 100755 smsBEST/static/rapidsms/images/big-arrows/down.png
create mode 100755 smsBEST/static/rapidsms/images/big-arrows/error.png
create mode 100755 smsBEST/static/rapidsms/images/big-arrows/left.png
create mode 100755 smsBEST/static/rapidsms/images/big-arrows/right.png
create mode 100755 smsBEST/static/rapidsms/images/big-arrows/source.xcf
create mode 100755 smsBEST/static/rapidsms/images/big-arrows/up.png
create mode 100755 smsBEST/static/rapidsms/images/body-bg.png
create mode 100755 smsBEST/static/rapidsms/images/h2-bg-collapsed.png
create mode 100755 smsBEST/static/rapidsms/images/h2-bg.png
create mode 100755 smsBEST/static/rapidsms/images/h3-bg.png
create mode 100755 smsBEST/static/rapidsms/images/header-bg.png
create mode 100755 smsBEST/static/rapidsms/images/rapidsms-logo.png
create mode 100755 smsBEST/static/rapidsms/images/tab-bg-active.png
create mode 100755 smsBEST/static/rapidsms/images/tab-bg-hover.png
create mode 100755 smsBEST/static/rapidsms/images/tab-bg.png
create mode 100755 smsBEST/static/rapidsms/images/table-footer-bg.png
create mode 100755 smsBEST/static/rapidsms/images/table-header-bg-highlight.png
create mode 100755 smsBEST/static/rapidsms/images/table-header-bg.png
create mode 100755 smsBEST/static/rapidsms/images/table-row-bg-active.png
create mode 100755 smsBEST/static/rapidsms/images/unicef-logo.png
create mode 100755 smsBEST/static/rapidsms/javascripts/collapse.js
create mode 100755 smsBEST/static/rapidsms/javascripts/global/rs-module-help.js
create mode 100755 smsBEST/static/rapidsms/javascripts/global/rs-pagination.js
create mode 100755 smsBEST/static/rapidsms/javascripts/jquery-1.3.2.min.js
create mode 100755 smsBEST/static/rapidsms/stylesheets/forms.css
create mode 100755 smsBEST/static/rapidsms/stylesheets/icons.css
create mode 100755 smsBEST/static/rapidsms/stylesheets/layout.css
create mode 100755 smsBEST/static/rapidsms/stylesheets/modules.css
create mode 100755 smsBEST/static/rapidsms/stylesheets/splits.css
create mode 100755 smsBEST/static/rapidsms/stylesheets/tables.css
create mode 100755 smsBEST/templates/dashboard.html
create mode 100755 smsBEST/templates/layout.html
diff --git a/chaloBEST/mumbai/models.py b/chaloBEST/mumbai/models.py
index b575f9a..74c4462 100644
--- a/chaloBEST/mumbai/models.py
+++ b/chaloBEST/mumbai/models.py
@@ -94,7 +94,8 @@ class Area(models.Model):
'slug': self.slug,
'name': self.name,
'name_mr': self.name_mr,
- 'display_name': self.display_name
+ 'display_name': self.display_name,
+ 'url': self.get_absolute_url()
#FIXME add alt_names and geometry
}
@@ -158,7 +159,8 @@ class Stop(models.Model):
'name_mr': self.name_mr,
'direction': self.dbdirection,
'routes': ", ".join([r.alias for r in routes]),
- 'alternative_names': ", ".join([a.name for a in self.alt_names.all().filter(typ='common')])
+ 'alternative_names': ", ".join([a.name for a in self.alt_names.all().filter(typ='common')]),
+ 'url': self.get_absolute_url()
}
def get_geojson(self, srid=4326):
@@ -213,7 +215,7 @@ class Stop(models.Model):
has_point.boolean = True
def get_absolute_url(self):
- return "/admin/mumbai/stop/%d/" % self.id
+ return "/stop/%s" % self.slug
class Route(models.Model):
@@ -242,7 +244,8 @@ class Route(models.Model):
'code': self.code,
'alias': self.alias,
'slug': self.slug,
- 'distance': str(self.distance)
+ 'distance': str(self.distance),
+ 'url': self.get_absolute_url()
}
class RouteDetail(models.Model):
diff --git a/chaloBEST/mumbai/views.py b/chaloBEST/mumbai/views.py
index fbb0bc9..2ee5836 100644
--- a/chaloBEST/mumbai/views.py
+++ b/chaloBEST/mumbai/views.py
@@ -38,14 +38,24 @@ def area(request, name):
return render_to_response("area.html", context)
+def stop(request, slug):
+ stop = get_object_or_404(Stop, slug=slug)
+ context = RequestContext(request, {
+ 'stop': stop
+ })
+ return render_to_response("stop.html", context)
+
+
def editstops(request):
context = RequestContext(request, {})
return render_to_response("editstops.html", context)
+
def buseditor(request):
context = RequestContext(request, {})
return render_to_response("buseditor.html", context)
+
def stats(request):
total_stops_left = Stop.objects.filter(point=None).count()
total_stops = Stop.objects.count()
diff --git a/chaloBEST/templates/base.html b/chaloBEST/templates/base.html
index a6eca7e..2fa39ea 100644
--- a/chaloBEST/templates/base.html
+++ b/chaloBEST/templates/base.html
@@ -3,6 +3,10 @@
+
+
ChaloBEST: {% block title %} {% endblock %}
{% block head %}
diff --git a/chaloBEST/templates/route.html b/chaloBEST/templates/route.html
index 89a207b..82132ae 100644
--- a/chaloBEST/templates/route.html
+++ b/chaloBEST/templates/route.html
@@ -15,19 +15,107 @@
a:hover {
color: #00f;
}
+
+#map {
+ float: left;
+ width: 600px;
+ height: 400px;
+}
+
+
{% endblock %}
{% block body %}
+
+
+
{% endblock %}
diff --git a/chaloBEST/urls.py b/chaloBEST/urls.py
index bff9953..ab4f134 100644
--- a/chaloBEST/urls.py
+++ b/chaloBEST/urls.py
@@ -4,6 +4,7 @@ from os.path import join
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
+from feeds import RouteFeed
#import ox.django.api.urls
#import mumbai
@@ -16,8 +17,12 @@ urlpatterns = patterns('',
url(r'^static/(?P.*)$','django.views.static.serve', {'document_root':'./static'}),
(r'^routes/$', 'mumbai.views.routes'),
(r'^route/(?P[a-zA-Z0-9\s\-]*?)/$', 'mumbai.views.route'),
+ (r'^route/(?P[a-zA-Z0-9\s\-]*?)/georss/$', RouteFeed()),
(r'^areas/$', 'mumbai.views.areas'),
(r'^area/(?P.*?)/$', 'mumbai.views.area'),
+# (r'^area/(?P.*?)/georss/$', AreaFeed()),
+ (r'^stop/(?P.*?)/$', 'mumbai.views.stop'),
+# (r'^stop/(?P.*?)/georss/$', StopFeed()),
(r'^buseditor/$', 'mumbai.views.buseditor'),
(r'^editstops/$', 'mumbai.views.editstops'),
(r'^1.0/', include('mumbai.apiurls')),
diff --git a/smsBEST/settings.py b/smsBEST/settings.py
index fc14793..b6c3d8a 100644
--- a/smsBEST/settings.py
+++ b/smsBEST/settings.py
@@ -5,7 +5,10 @@
# -------------------------------------------------------------------- #
# MAIN CONFIGURATION #
# -------------------------------------------------------------------- #
+import os
+from os.path import join
+PROJECT_PATH = os.path.dirname(__file__)
# you should configure your database here before doing any real work.
# see: http://docs.djangoproject.com/en/dev/ref/settings/#databases
@@ -16,7 +19,8 @@ DATABASES = {
}
}
-
+MEDIA_ROOT = join(PROJECT_PATH, 'static')
+LOCAL_DEVELOPMENT = True
# the rapidsms backend configuration is designed to resemble django's
# database configuration, as a nested dict of (name, configuration).
#
@@ -162,6 +166,13 @@ TEMPLATE_LOADERS = (
'django.template.loaders.eggs.Loader'
)
+TEMPLATE_DIRS = (
+ join(PROJECT_PATH, "templates"),
+ # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+ # Always use forward slashes, even on Windows.
+ # Don't forget to use absolute paths, not relative paths.
+)
+
# -------------------------------------------------------------------- #
# HERE BE DRAGONS! #
# these settings are pure hackery, and will go away soon #
diff --git a/smsBEST/static/rapidsms/icons/silk/accept--dull.png b/smsBEST/static/rapidsms/icons/silk/accept--dull.png
new file mode 100755
index 0000000000000000000000000000000000000000..d76ace75eb4ffe4e6698563374fc8b8939963d7d
GIT binary patch
literal 691
zcmV;k0!;mhP)Px%ZAnByR5;76lg~?HVHAcRHN46#C0B(wnuQ{fL92+M*0q|&{0Z&c_x}WOsZ}sA
ziwLC_L9~d9QVP7$2tvrs{6T(x_xrwC3^~mVt!54!I2?E%UJmbpf2_cti@m+QN#FMu
zlv0aQ%5kL>#+aVg`cf%%T`HBHKLj|AQ;n{+yjZQCK&bw91Ftkh0VPX|E&rBpE*
zjZVCY--PcwpU>mEE}2Y*WHLD+r7Qvj0es&tW-=LGUS9BhAEgvpYm6~yttl3Z8G=HlXlR;z_=+Xx|I
z0Am0`2#hfpV+e=CWV2Z!kqDcco7lFE)|yJCLbKV#vMd6D07@xF4wO=zZnsN39_RJ-
zm2$a^5CYq_F~(3XmuWN_03;F#JkLXG-5CL-lvmYil~^nWK&R8;@bHjkvq_~=q0wlJ
z93~P8&d<*QuHN6^s$Q>mUDsu9Zf*oQIy&O<@$qM1LLuho=c(0d+}zxBrIc5r9Gsk-
z43?Ld+jn<&xp+Jt%H?u|LLr0@jE#*kH8n*#ou*c+ad2=TgTdfe$8o;@73ET?R2UA2
z8?&>s<4a3R*tR`#b9Q#d?d@$Z7z}=M9H;u>Gi_~cO=_)wd!|4j&;u@&QrG+Y`_KH(
Z`T=u;VxLWdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^
zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ
z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n*
z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf
z3SNj(5%jK~i8@b;C9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa
zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov
zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz
zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@
z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A
z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6<
zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv
z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ
P00000NkvXXu0mjf^IS-S
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/building.png b/smsBEST/static/rapidsms/icons/silk/building.png
new file mode 100755
index 0000000000000000000000000000000000000000..11a017cfaa73aef38f8f57db731dd0a7db835109
GIT binary patch
literal 556
zcmV+{0@MA8P)
zlTAwkQ51&X8OIL@qD-Qsuyhv$p|ucNxrho9Y}2|`xDEOTEecw+?FYDO86*-E5rS>n
zv=AvFN@y{a*@rsg{b=qLr6CpRz~LV5-1D6GoVgdAbM)iS(J1e%9TO7RFz?{LbOt3dBco@bbZH_0OdOMw_$XmV%A>MsEcb`Yr*BlX@2gUVQP-&VZd<
za>_O2!3tls`ejI^QczVDilWFhkw~CoyyJ1aXalrwqLnnQIvvPYZe=x1(-01a5s5@(
zETH9D8Lj~r){d6fZGi3U)*z^IKH~J@tdy3AMUwEAiW;e6|7sTjUjW3U2TO;s**1U@
znlwz4-{}Q>zgCgCIR$evI2?{PBz>KRR(Ij;<3(IJKP7CpJp+2|*^>{$@+v3_xR>%u
u#geUGuQH0)r!pqYfZJ_);(s2~f9wYukV^15?ld0&0000C#5QQ<|d}62BjvZR2H60wE-%M_H=O!(Kvthf+1gnf`Cilxr3SC
zCq+y2HhAz(;&}R`x^q^&(wiOs&2u-u^*?dO$=Q}CfYva0y85}Sb4q9e0M-pfO8@`>
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/decline.png b/smsBEST/static/rapidsms/icons/silk/decline.png
new file mode 100755
index 0000000000000000000000000000000000000000..262e4db53e5094526a5ac60de1b4dd1b2e3c927d
GIT binary patch
literal 781
zcmV+o1M>WdP)u;A_#jbZMBLzl5FQ&7HuSGyue>CLq`{=3
zBtU9lV@OQcAX+JXK>?w~mQu>heRyXQYVfhrvzXj_=YGHQopWY@e+=o@gP_Av#VP9{
zp#5A{iWwL?w$#~5%yv7ZJPVLYLD>r?S
z>S!8&?fea(iYcX|1^4fn%~u;iH$MS;AwZTP<>W&uFGu9fTZH@@$BdGJ8&h-6G$1fE
zR4HsP7v5>Lnp&=bx?M<~q##iRnMMO7#=+$jP~U|8xp{2u1;dP!+ilbCO`Qr5;$D-r
z(3*Xv9(3s)P+EcP<~A6Taj@?ZNcL7p)s0Y==TX$&j_lN_l``6^YBd0pXrH;E7HoYL
ziC_TSoCm!n54yVR(ABm;vg8Az49)=J^PyJ
zJy%^5q)QMEwod|nVO@+(z;e6$wCrT#vzUel`l=dScs?j@>tMWi2{E4!Od;Dp0gQ}C
zR#w2RHt=HwI6MG3_=fn*3}Q|v=*~8HbYCRW!%$&EaLujuU_4!d*i0nMS%Z=HZfn7#
z4kTPIh*@hEsc1rUWJJ4adGZv2#aSfeWSB~P;@pSyv8S_3fJTdQ3e83B4&|lkH9mAd>=K!WjZ`ivt8Im`*s7f;!$El0mXM^W
z9U*p{iU0UBEkCC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR
z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y
zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51
zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7
zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp
zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y
z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l
z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/email.png b/smsBEST/static/rapidsms/icons/silk/email.png
new file mode 100755
index 0000000000000000000000000000000000000000..7348aed77fe6a64c2210a202f12c6eccae7fcf24
GIT binary patch
literal 641
zcmV-{0)G98P)Az`{eoOom?Tf*9)f$7n8&|1&5M4#i^32;+&E?
zC3Q;bRFQN#y*%%=_V)Mfa<$xe^kB0TO;vJPkN*k(2v-CI7)OaWj?&eKPos(H4wGh_
zIC;6#q1B5SMap5{(Hc0~XO7OfqZ=x{kupu8-H&9azl`L1pTuu^Znm3EA)kCoG=JuwsyNLEtY83i->Z~j3y~F)`RA1k>zTES07po!kBVS2y#L{jCt|CMY&v{
zxmqM|`OA#P2{R&)OcQd}v0kt6_Dh#`Z$i5_;q|93je3Q^PcfR{TmBHRmr;rWahz~G
z2x-&;d_O~HkmKXt5Cd#Bs?-+qj3zOiUdU24KowBIUPg(gPNmxqX)Fiia~V*$y;5L(
zrGNmU;81MA$F2k%oeUXQ@}N%bXz=qOij$4IYk4W=jfhDxfCz{PGXe-#ge#VfYTyoj
zh4JvDePrW{lf(Oux2xG;VZmlSvDU+Qf@i=O!B`MLglhttCUHDIKkc7gn-s{Jsef@w|XbT!@L
zKqWCIT8+A(7Sx3z9}!4Pu(d7F()NAMIIl$mh8>gK+?nLgnRCyXOBiF=&l0fDCEXmG
zO1fK=fkMUbY^kO|IUx!Li*G1rXYru4dEO2NVi`tlvyl0*xG05#{;n&-JwDA~#O)Gy
zp_Bjjq?zlQDb_VBdhw2?3i+}b*G)Mkej}RiH|=KYV#o;^MY)fCsb9d
zsU|OsN4*FKTk!a82BnG)znj1#sVFUsLkabxPk!I1k)<6rR_jd$gsWp3CfpLm!B_y3
zsXVd;6|1uoP{IT7MFtSAy@Rth*I@QnS)ry`u-WLkiCn3Iu66|{;z1la6h!*_9BM0*
z{Ph5=@-syHFF{yNfEpSa|Bn$Hz+|?+`69m@R^azIIYol*12T?FuMz1z52!OpJxahE
zsKZrEL0x&ntu#0QWkR*Ix~y>@k9Eo{8Whm#vABR1lv)~Yvjinr1J#!7Vpv?v?xE{w
z`;|a0UsB7zvrDA!!ri2^HGa~ics!CzBobHC!F9M6c_^MfJ51b;DNsGT-LnItXArps
z0g2@NX5wr7GudmHX6_GN4fPJ+>*$gBt0~^Ej_Ief7#!&Z5&eLC4(SIs@{H0mdjh0J
zPi6ZrCt{+o3}&v|YVDdoQ9g>?w=bA~e*1~E*Mymx?w%PNsdJ5Z>vTu3e;IaWtm6;T
WSyNB7T~0d>kmp9&fG9>#5EaEn(MD9Xvl47<{Rb2T3D!0$wpy4@P!Tnn
zB0fxQ2!aPL_fZ@!=Wv9zmj8jnf5JO`<=MmZs@#@p
z5O*{}9L5B6J+L7ORza<+9h)-B~<&cwIhUkd?cp4is-ziNrfY^u-7xdbFt=#%1534Oi8ajBBo}VZvCxd1
zTu*VtX+~P45)Om?dG5aS`PPW(%?lDPBwaz$6C^$8$_Q#plJTjpbgj;_rYi*?oK~m+
zDD`C->dkZKh0j6|Q^-0bJxIFHnHJOo$@r8{VNIUWU>31rp3@BVvYIZG2D0>Yuj2Y-
zg?b?AObc>pK`oG+zkPsr3x_BTWXX8H*w}0@e;@>?SdsP&!-HMidhRn*4VkHi+<58}
zTg6ae0~aSoNqRq(^;(g}0#Yiz)&q*YIg-f)mmeJA&3%nD3aJ$X-6L%1+fEQRIeTL*
zS5K6|3cOaNtTtBowSZzzj!ZfM7L<|f+jtyp4ccf7mf6J$n}&ALkZlfLEYRoNvtG0Q
zzJh|U~_Rdjkv}0kGt_?V}5$?sXN`N
zTt|nOa)sx)IIf_-7XW**;!X9`USPjuUUsJrREk)6q*M9ZHEb
zl2A!T3LBjrrTx74{FsUNcVA1zw%IWoiGNMw=s9P8>+qh!B*saR2}S
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/email_open.png b/smsBEST/static/rapidsms/icons/silk/email_open.png
new file mode 100755
index 0000000000000000000000000000000000000000..7b6f9813d41f1d95c8f1cf1495c2314dcf16d3fb
GIT binary patch
literal 783
zcmV+q1MvKbP)FGA|gUiBpPKsNC^f4AtjM-BOo6I
z6r`2%Aq86cL2037X}jIFyW8#V&zXS`i5Q*a$xLSEecpE_F9(1-jh2z%g|>+>+9xA0
zkA`ml?cS-I4VJBEmYFboVFjV6ilGGo&n=#={}R-6x+aGgB1p&v)GVM86wScQ&nTXB
zxV()Yx6hm^cssa#jvorBcDDqH1WO7Kif0)qmB@%>Gn58D97J7@zwm_MRj>bE`@}Bp
zw=N%IUV^D*3FYq{D0}w<#cynQ*tSI0c9ar2tzlGk`gkVb2Lt-h!U1+kCK~*&K_&Eg
zBa1QAcKdbiwZ-XEGCIUmmSv@bUpq<3R0cN(WOi1<+aaYj^vwovvBKizD$OfKf^3*t
zR*wY-2^CREWpg+t!?!14)f;1Hg^#T$ZeGF0j);QBIfEujA4UQ4w
zNg^VWy=WTlU;>5#6gAADc`ObgsZas9yG=GGSPAOrw~1)(ceCIa2^Lcs1{H>cG-|sx
z&^i^zCubH1(vjd+-8>UG_jIg=bbMYEQ2D`$>W=jjJZN)b-Xmkum1P_Y3Lece!FpJS
z!>?lC`#zZ!Ci@+_*F777byLAt?~&jo5nMJ|NvG*p4yY_Uy|}ik{~@5z3VKO`8J7Yf
zK`WRCms>h+q)5+>IRvcjsPGB~y!!?`1Q)?g*ou&Kgj7kMY4<4@AgvzQmr(HHo5AH2
zwR@tHqVEVPBc9SA${J~94M{}<6;sj#nUXm~5M|xA5s~vvmM!jVVbes;o!;2_ve8U#
z#kiJNIi=-SS+z^mR_#j7w05;_TDwNLUVq4q`svKor(cqJN#0$9Ug7g~-`rQ^qx~m@y2OU8A
z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W
zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5%
za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_
zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/help.png b/smsBEST/static/rapidsms/icons/silk/help.png
new file mode 100755
index 0000000000000000000000000000000000000000..5c870176d4dea68aab9e51166cc3d7a582f326d6
GIT binary patch
literal 786
zcmV+t1MU2YP)$XgYMs^AIOw1Qr{*Wn)N-{9ma}x2(<~`9Go1=*>YR!KZvrBS
zCd!u}@M0og%Ev@_;Z?Kk>Wwv=%h_57zmt2<_1msz_niYE=YRNPpd%02TK9oK1z
z>ooPno}v^sikz_|1XHFx_L%~;ljh7i(jiay5F0x*+(9aXXFCl?AdQj5XlQ65%sEv+
ztfe?|YcjPN*@yYtE~ImQh{l|#A6Z8iu>pf43Rj52CzU_dMQm|S2xR62YjQOn+z8WH
zaK=!}ggOZi{4pB7SQ=xC0n|vXP_Bkx_a)FeNd}w8U97BNbSWxa^QW-li9BZ#M1!_xE*?wzt^GcoeoL*JGLSe_+l-JT2#2tz!z&^
z_s5anq&^nBklIMwRvcoP3%qs%%Ea?1c{_*V*Xj&~uLu-2Dp1fUN4<0zMo$EH>*U83
zm_9;Vt%-bE{_J_!If!1y=c+`QVZ>0_BPy
z+%^pgnv`f8H)Z%0&Tp8&u*MCIC4igNW5MeWM_DHpDNi)Zxz|9XboOnitwFq$ETN=X
zj-tkCJnz**Y4k#6_Ty^B=hWo~L!47r`HoP=x&3T1)JLr2t2+#fHgNuvOO$0ks
zMIj=HnnBRUR?tKXG11rxCU4&7dG4NbuvR2_mEvc)n?Cow;~Wve|KR^>9@p5l)|QB+
z$jmun3q#x>;ss-PW_mnr2MHVzLAl1RW&0?VkixF*4t!St0YVb2wnKdU(kmOHiL;aW
zK8Xte%(k>MVGG$E4no6dcNnb>BhVHHGD&1pv4YZ68kE2V03t5#PCEFm7=ad$6)+3B
zTCmn*?A?=u(o~ET7~-7g0)ZB=6|lumi4}B}MLgy~Ysy6)Q5%Al7|05&1z3Jpu>cF8
z3?VXs*3<}%h3`5Wld)N2zJnk%Agw<~3k)sPTLFd=F5;d8-bj-09SkQuynfflNcZLN
z!^_37fdZvzrq=9~mp*($%mcDRKC&qvaaZuX+C=AT6O*~tHl>0mcP<_q>-z%$xO(@!
zYluq5a8VQI$S@4?r*v;gPo!QQ%pX3A#>xx4t=w-L6COWx?aj&`f+!YePsFtj=hOQR
zP3=E2j@9L7s8;T^&s?u(Hdpu?CubjMrGn{t_37>9$|AD)QE08weJlKn8|OyjL~7oP
zC8mPT`jzuH*Dh^I0048RGafUIT)4H~*m8m>egI0iH=(LB%b@@O002ovPDHLkV1lw0
B3i-HS{zx9u^IUGw>*=$qi
z4z(fju8Kxf4E>slBg^es4|nAN~@NV_SFj
zT24(nZf1>C;s&Oa#mmJBSw-p_cY~Y6U)hMyiI9#@b2~OpJ~{tQK#e@V>&ZUL%dC-&
z4K3ksgdE?;g2XJ7a-IC
z{t7T9P!AB)6MkIq=xo`8@fr4Pe+pxHJkq|8i#gBoi7`)S7Dry495@-9|NUzWL5S=I
zI}8e@=#j{*V_TIRYJCHM<4>HSsjdT~`23%KH*e}YU%C<>JM(QmG2_K2&b4Ftok-)u
zSoT!hAJ4MD=!?;n}ksXzJm;^DmMqtaEL0%KcAFfAn>=sgaW^@?6tnFI$DxIX=HQ
z$n|KMeH{mAuJ2-IyqPWur#3F*-
zi1-H*6GJgONgz~1E;+_Oe@~@VF-1Iy-=*@
zV9T!Kgk#%59lVt}Zj7B_)9wTKYBy6YEwPxKqOdeGuEw0%cVhe}Yj*hPSBMNYZ5yz{
z4STT*%d9TVV4NauDND$z(%QKb>=kMr>ckh0lFuesOioc=Nq^^8BQNYYbk1@M%M`O?
zh?6H&UZR}Ol3%#RzJX5(MAktmg_e?7`2>w^4^!6w)4$9==U0)EV$}u1A)*bPRF?jv
zHdar4EJB1b*f+rh!M+8R159x8%Qjd0I{0j+|69pUC)f(>!P(OTs8c~;XuVtXzfO>s`m
zrjW9YI38*Yel_NvP&FVfNEx)sn-kxIx;WzEcpe*LJBYXLr(llS6I0o+c9O
z0L_4N7u$0%Dx~ks;fjYRF0OIOR}1uPI!MtibK=J3pihiBTv)jD>R%(Llj(_XFa#mG
z6Wg=#j7Q7*PFmM*W@B9!ftm;#qU}sCT;|&KtBZ%Fe#3()Pk+9@Sw&8%k=NQD>92qN
zkFT*E2S*%i&!MYvH;;DpF?sU}zb4Mlls)au3~BX$XZr12Z?_sbts>8Fec~0Xl1q`9
zxyH%T#p<5UCqrY2(J4oGEHk9ens22BN3dYXATM07*qoM6N<$g3xBAZ~y=R
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/phone.png b/smsBEST/static/rapidsms/icons/silk/phone.png
new file mode 100755
index 0000000000000000000000000000000000000000..c39f162f854a7c412fab9b6ff38fffdc61754a58
GIT binary patch
literal 488
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
FV1fX;igy42
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/resultset_next.png b/smsBEST/static/rapidsms/icons/silk/resultset_next.png
new file mode 100755
index 0000000000000000000000000000000000000000..da80e54fdd0b6d035e40e60b4cdcb5f8ddbece81
GIT binary patch
literal 600
zcmV-e0;m0nP)Px%5=lfsR7l6|)jenvVHgMS|HVu0`jOgL8YL)QTm%K(9J&P(oCFsIL8{>3SP>M#
z4^XHM>LfTwi>(OOinW4^Rw-hg8jaM1J5#H1Nz*1h)8yW}_v;+onyPo1`-~6&7k==*
z&+`JCwXUu{Db+7OE)BJMe(Ifh@%fCA^qUWD(CU!D`E#SimJkY*FckEUzn)LF1aLXW
zfj&*?>55z!xVvyWD1Zx&UGXTQ?OOlH)Lc3+py6^b&%@4bVf1c|45qK=hJyec%E6^X
zcT`7bhko$RqxXjc0qVqqOC?qt47;~Skm%7)?mavA&@aHH0-Q_O4n;iHj_xjf|D}7=
zM|=Z*5ekP&RM!|v7R8=~hQ4^)@x-awq91_mP;en(6N*~h!H!rbdSh+-&fJ&Rf7#I`qJP)cGLjKzlzW!u+$CeYm09C?3TmdbtU?#H))2NIuO(u`}eFGMe
zaG8LrhF~t1VHDYy;VY?$zvY_%q|QN@#D}Z}Ggloezf7J8G6gmP7#ApfUxE39e;&D(
zdiJk;6F?G%*-QoIeC5INtMow7J;11k!eSZu1(6-Sk(&Hpz8TQqFg`8cUwM1zbSs-s
mP!G9+$c)`gzu5fP{M2vFjRKoA=lLc80000IqP)Px%4@pEpR7l6|RY_}8Q5Ze18Tw*oA+{(*kRpNzx)5Asmr6H+Q&CWnx+sXQ+*old
zSQON56iY>^)Y>s}LaIG2fkw;S*CRCa--f-UXFLLkY
z*^8-Y@YJ^TALr4!`=`Sn%#|{{_
z$krVWiwRgnz$5}Tk&w16aS$fpFb>WoBy(xtN7dXtkvHx?pEeK(Xi!qY
zW&+Z3m%viZ8Jqd`GnXqZz~|Ed1yIhxsB-rN9|yN`06n!sFUHIo-M3{!6b_Y;rn>~r
z9_x|-?i@Y;tcMc1v14@-lt~Dpyq)3q(e(cOhsv#2Zx=zRgd*O~@aoB~d!LGYx>ziO
zaREV<_Z}!e$sGPXxiB*Ix(r36_Z~R2eLPoC+0twUlEb?J0I0m&(fcL4cui5!Tn%69
jeo!c2QZTjrr!~ZH67vgiq+5>f00000NkvXXu0mjfx#16k
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/section_collapsed--bright.png b/smsBEST/static/rapidsms/icons/silk/section_collapsed--bright.png
new file mode 100755
index 0000000000000000000000000000000000000000..12b8eb9924ea018bfcd24685502a813478f70917
GIT binary patch
literal 253
zcmVPx#w@E}nR4C75V4xqk^5Me0{n88!JEV`@JN^M7&IDupyvC`>cX*dE|6y*$Z`TkC
zSYV7Vo`1IUT8f@vVtIS~qbEWEBZ9d{Ncbrm$Cn?^qyyjKaL4wDlOH!kpo+mwxcK4M
zyEnGKU;h&oJj^6yD}d(6!~DOl@hA!%X4Vxw%%}L{8Ws}{@^ftGwfy;qiRJC_51v6E
zu{iRekib(mj;}wSN&De)Px#$w@>(R4C75U?2_bV?!5VM&>jyF#J_!IF3s}6N6oZ!cmC_TvyH_DPV*#S{Q7F
z1fH^SeEsoEdiA@-a0N^-hAltG7FLcQe^@zqwgmDspes1c&$XS;^7H*?7GLfQTJmnk
zV#UP|zuvvE{r&o%sNi8HAzJ~gp4=XB^5cdGR53;bbB~blQ#Ot-Kb}bkzGJ|2{%~;cZ&}BWMFG!t0n6|AUt4^;FKo%b9g6~Xt?&0g*}9$mX#4d(mlgv(0RVO2
VK_a@23XA{%002ovPDHLkV1mbuaccko
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/sort_ascending.png b/smsBEST/static/rapidsms/icons/silk/sort_ascending.png
new file mode 100755
index 0000000000000000000000000000000000000000..c3746d8fc31a95ca592a575b6562b07a808b4580
GIT binary patch
literal 506
zcmVar+caDT2yilUV;BI`?Ee1!dqJQ9Jzu_j
zIRd23fWQ}<0pEW8Lk)wtxVQ$Ojjvc)S(gC~N&$vL!pDyv{{s!0ip_w(fB(bTEYZ=?
zxj-{$~Js0gQL=-tB;Hz>nWZVSpq)Ve;h38$b*{KfeP&
z%`!?#O2@IefRlw$5~uTkn%BF!y1p+iE^f!ACS%@1>|p@X47AxnPfu?~Z*OlUHqD+5
zH?DE9F)>6>dvF!S3&dy!fqU0K2mkxeu;|0vUvYSy4P*xx8X7LeW{7(DX-ycL5kvqr
w9{^JNZ{EDw29tR3;DIzKMt~{QfdLNy033wT!KCPr-2eap07*qoM6N<$g60X>-~a#s
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/sort_descending.png b/smsBEST/static/rapidsms/icons/silk/sort_descending.png
new file mode 100755
index 0000000000000000000000000000000000000000..26cb4e8b2473cd30d41977e19e226a881cddc9bc
GIT binary patch
literal 509
zcmVlee%pFbHse*DPr{rh(?-o1Ob0|Oqwgv6dOdGch3S+iz2
zKsC!KDJeb1rYU5~16`aZ`uX{-cXf4rUtC<=j!R9~j#po>xd5ygXtRT!p5Bb!-rh=F
z1_*F6b7L4ltY#4S_Uj*N7+}*3^g@84q2W?&2K@c|AI@e05kSp?AbQ`veR42O^XAQy
z2E_Grm5+k!!Y1_lN;Kz=jGFd*Le^5x43xWWSfoa5blKLGJ300000NkvXXu0mjf2JPL?
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/icons/silk/user.png b/smsBEST/static/rapidsms/icons/silk/user.png
new file mode 100755
index 0000000000000000000000000000000000000000..79f35ccbdad44489dbf07d1bf688c411aa3b612c
GIT binary patch
literal 741
zcmVz1iyEv%?$mbQ(#
zwJpuiQJP8?X_`#S8b+U_G6=ziYB!xPAcq{)ZJ0bECH@
zYx#`n8^Wzn^J!4>=q^bltNO15ry?0ecSLkjpT@vlid!jk)Fjf7&)q_V5zGs#3N%6*
zbW~7Hg=&P0&~Y(|g>$hC9FL?;ttzPDZbpZu9OLb33^e2;FNTGJxScp1&q4M+y2ntQ
z?C(=hpU$3~`Thx0eHwi0x`q+!d5k@|0_WHe%sG3e-s^MM`xM-ig!VcIA7H}X1ot~L
zg=MLB4w-Q;Bi!!u2|I+Qb;0{{4Q53YX6+4_aXena{nmt*!YG7ua~`qc>o=?@U?rOU
znS7%>klzi*muXnbM6i@4FR@s^8vTjDgy&%J?w?`u>NYMDFa_2%0SQ(qJE<3=<8Bzo
zfdU60e*y(^$RF%r$kl)p7=7tlCDa$+J7w>}DU(O#~fk>pYuRvHi1E9^msg{tLeV
XM&GIRvfA7%00000NkvXXu0mjf&%8>|
literal 0
HcmV?d00001
diff --git a/smsBEST/static/rapidsms/images/bessms_header07d.png b/smsBEST/static/rapidsms/images/bessms_header07d.png
new file mode 100755
index 0000000000000000000000000000000000000000..2ee1fc18ec2287a6d660a56daed8399d1b681a89
GIT binary patch
literal 26794
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