################################################################################
#
# Four Worlds
# Copyright (c) 2009-????
#
# Package: polc
# File: parsers.py
#
# The automatic Python OLC system, capable of generating an online content editor
# for a given Python class or dict by using dictionaries to discover properties.
#
# OLC Response Parsing
#
# Author: Stendec
#
################################################################################
from data import *
from types import *
################################################################################
# Variables
################################################################################
def parse_choice(sock, data, key, val):
'''Parse a multiple-choice value.'''
if not val.isdigit(): return False
val = int(val)
c = data.k(key,'choices')
if type(c) is dict: ks = sorted(c.keys())
else: ks = sorted(c)
# Is it valid?
if val < 0 or val >= len(ks): return False
return ks[val]
'''if type(data.opts['_'+key]['choices']) == dict:
ks = sorted(data.opts['_'+key]['choices'].keys())
if val < 0 or val >= len(ks): return False
val = ks[val]
else:
if val < 0 or val >= len(data.opts['_'+key]['choices']): return False
val = data.opts['_'+key]['choices'][val]
# It's okay.
return val'''
def parse_number(sock, data, key, val):
'''Parse a numeric value.'''
if type(data.object) == dict: old = data.object[key]
else: old = getattr(data.object, key)
# Is val nothing? Return True to get the hell out.
if val == '': return True
# Convert val into the right type.
try:
if type(old) == int: val = int(val)
elif type(old) == float: val = float(val)
elif type(old) == long: val = long(val)
except:
return False
# Range check?
if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('range'):
min, max = data.opts['_'+key]['range'].split(',')
if val < type(old)(min) or val > type(old)(max):
sock.send("Value must be between %s and %s." % (min, max))
return False
if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('min') and val < data.opts['_'+key]['min']:
sock.send("Value must be at least: " + str(data.opts['_'+key]['min']))
return False
if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('max') and val > data.opts['_'+key]['max']:
sock.send("Value must be no more then: " + str(data.opts['_'+key]['max']))
return False
# It's okay.
return val
def parse_list(sock, data, key, val):
'''Parse a list or tuple.'''
if type(data.object) == dict: old = data.object[key]
else: old = getattr(data.object, key)
# Split the list, based on commas.
val = val.replace(', ',',').split(',')
# Should we be making a tuple?
if type(old) == tuple:
val = tuple(val)
# It's okay.
return val
def parse_string(sock, data, key, val):
'''Parse a string value.'''
# Content check?
if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('type'):
if data.opts['_'+key]['type'] == 'alnum' and not val.isalnum(): return False
elif data.opts['_'+key]['type'] == 'alpha' and not val.isalpha(): return False
elif data.opts['_'+key]['type'] == 'digit' and not val.isdigit(): return False
# Length check?
if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('range'):
min, max = data.opts['_'+key]['range'].split(',')
if len(val) < int(min) or len(val) > int(max):
sock.send("Value must be between %s and %s characters long." % (min, max))
return False
if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('min') and len(val) < data.opts['_'+key]['min']:
sock.send("Value must be at least %d characters long." % data.opts['_'+key]['min'])
return False
if data.opts.has_key('_'+key) and data.opts['_'+key].has_key('max') and len(val) > data.opts['_'+key]['max']:
sock.send("Value must be no more then %d characters long." % data.opts['_'+key]['max'])
return False
# It's okay.
return val