def load_collection(self,collection_node,parent_instance): # Dynamically load instance model = getAttributes(collection_node)['model'] tokens = model.split('.') module_name = ".".join(tokens[:len(tokens)-1]) class_name = tokens[len(tokens)-1:][0] models = __import__(module_name,globals(),locals(),[class_name],-1) # Load collection (from filters or from source) if hasAttribute(collection_node,'filters'): return self.load_collection_from_filters(collection_node,parent_instance,models,class_name) else: source = getAttributes(collection_node)['source'] return self.load_collection_from_source(collection_node,parent_instance,models,class_name)
def load_collection_from_filters(self,collection_node,parent_instance,models,class_name): # Construct filters filters_str = getAttributes(collection_node)['filters'] filters = filters_str.split('|') args = {} for filter in filters: tokens = filter.split('=') filter_by = tokens[0] filter_value = tokens[1] # Evaluate parameters filter_value = self.evaluate_parameters(filter_value) args[filter_by]=filter_value # Perform query if hasAttribute(collection_node,"order_by"): order_by = getAttributes(collection_node)['order_by'] return getattr(models,class_name).objects.filter(**args).order_by(*order_by.split("|")) else: return getattr(models,class_name).objects.filter(**args)
def serialize_field(self,instance,field_node,output_node): print "Serializing field : '" + str(field_node.name) + "'" val = getattr(instance,field_node.name) if val: prop_val = unicode(val).encode("utf-8") if len(prop_val)>0: if hasAttribute(field_node,'html_encode'): html_encode = getAttributes(field_node)['html_encode'] if html_encode == "True": prop_val = django.utils.html.escape(prop_val) output_node.setProp(field_node.name, prop_val)
def load_collection_from_source(self,collection_node,parent_instance,models,class_name): print 'Entering load_collection_from_source' source = getAttributes(collection_node)['source'] if parent_instance: source = source.replace('@parentid',str(getattr(parent_instance,"id"))) source = self.evaluate_parameters(source).encode("utf-8") # Import additionnal classes, if specified import_directives = [] imports = "" if hasAttribute(collection_node,'import'): import_str = getAttributes(collection_node)['import'] import_tokens = import_str.split(',') for import_token in import_tokens: import_directives.append(self.evaluate_import_directive(import_token)) imports ="\n".join(import_directives) imports += '\n' # Execute code source = "results="+source source = imports + source print "Compiling : " + source byte_code = compile(source,"compilation_errors.txt","exec") exec(byte_code) print 'Loaded collection. Number of elements :'+str(len(results)) return results