from fields import Field class Model(object): record_identifier = ' ' def __init__(self): for (key, value) in self.__class__.__dict__.items(): if isinstance(value, Field): field = getattr(self, key) if not field.name: setattr(field, 'name', key) def __setattr__(self, key, value): if hasattr(self, key) and isinstance(getattr(self, key), Field): getattr(self, key).value = value else: self.__dict__[key] = value def get_fields(self): fields = [] for key in self.__class__.__dict__.keys(): attr = getattr(self, key) if isinstance(attr, Field): fields.append(attr) return fields def get_sorted_fields(self): fields = self.get_fields() fields.sort(key=lambda x:x.creation_counter) return fields def validate(self): for f in self.get_fields(): f.validate() try: custom_validator = getattr(self, 'validate_' + f.name) except AttributeError, e: continue if callable(custom_validator): custom_validator(f) def output(self): return ''.join([self.record_identifier] + [field.get_data() for field in self.get_sorted_fields()]) def read(self, fp): for field in self.get_sorted_fields(): field.read(fp)