################################################################################ # # 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