Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
clement committed Jun 7, 2009
0 parents commit fba1c3d
Show file tree
Hide file tree
Showing 8 changed files with 117 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*~
*.pyc
settings_local.py
p/
wurfl.xml
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
How to use
----------

from wurfl import Device
device = Device.get_from_ua(ua, fallback=True)
device = Device.get_from_id()

Views for updating, patching, testing

Settings reference
------------------

- `WURFL_USE_CACHE` : True to use django cache backend ... `False`
- `WURFL_CACHE_PREFIX` : prefix for key `wurfl_`
- `WURFL_CACHE_TIMEOUT` : timeout for cached values, None = timeout for project, 0 = infinite
- `WURFL_USE_PATCH` : ??
- `WURFL_URL` : the url to the XML wurfl file
Empty file added wurfl/__init__.py
Empty file.
Empty file added wurfl/conf/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions wurfl/conf/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.conf import settings

URL = getattr(settings, 'WURFL_URL', 'localhost')
16 changes: 16 additions & 0 deletions wurfl/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from django.db import models

class Update(models.Model):
version = models.CharField(max_length=255)
url = models.URLField()
update_date = models.DateTimeField(auto_now_add=True)
time_for_update = models.IntegerField()
nb_devices = models.IntegerField()
errors = models.TextField()

class Device(models.Model):
id = models.CharField(max_length=128, primary_key=True)
user_agent = models.CharField(max_length=255, blank=True, db_index=True)
fall_back = models.CharField(max_length=128, blank=True, db_index=True)
actual_device_root = models.BooleanField()
capabilities = models.TextField()
75 changes: 75 additions & 0 deletions wurfl/parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from wurfl.conf import settings
from wurfl.models import Update, Device

from xml import sax
from django.utils.simplejson.encoder import JSONEncoder
from django.utils.simplejson.decoder import JSONDecoder
from time import time


class _Handler(sax.ContentHandler):
def __init__(self):
# Parsing version flag
self.parse_version = False
# JSON encoder and decoder
self.e = JSONEncoder()
self.d = JSONDecoder()

def startElement(self, name, attrs):
if name == 'wurfl':
self.start_time = time()
self.stats = {'nb_devices':0, 'url':settings.URL, 'errors':0}
elif name == 'ver':
self.stats['version'] = ''
self.parse_version = True
elif name == 'device':
self.device = {}
self.device['id'] = attrs.get('id', '')
self.device['user_agent'] = attrs.get('user_agent', '')
self.device['fall_back'] = attrs.get('fall_back', '')
self.device['actual_device_root'] = attrs.get('actual_device_root', False) and True
# Prepare the capabilities
self.capabilities = {}
elif name == 'group':
self.current_group = attrs.get('id','')
self.capabilities[self.current_group] = {}
elif name == 'capabilities':
value = attrs.get('value', '')
if value == 'true' or value == 'false':
value = (value == 'true')
if value.isdigit():
value = int(value)

self.capabilities[self.current_group][attrs.get('id','')] = value

def endElement(self, name):
if name == 'device':
# Process the capabilities
self.device['capabilities'] = self.e.encode(self.capabilities)

# Save the device model
Device.objects.create(**self.device)

# Update the stats
self.stats['nb_devices'] += 1

print "Device with id : %s" % self.device['id']
elif name == 'wurfl':
# End of the update
self.stats['time_for_update'] = time() - self.start_time
Update.objects.create(**self.stats)
elif name == 'ver':
self.parse_version = False


def characters(self, ch):
if self.parse_version:
self.stats['version'] += ch

def parse_wurfl(file_name):
parser = sax.make_parser()
handler = _Handler()
parser.setContentHandler(handler)
parser.parse(open(file_name))


1 change: 1 addition & 0 deletions wurfl/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Create your views here.

0 comments on commit fba1c3d

Please sign in to comment.