class HoursField(models.TextField): description = "List of HoursListings" __metaclass__ = models.SubfieldBase def __init__(self, *args, **kwargs): self.pickler = CSVPickler() super(HoursField, self).__init__(*args, **kwargs) def to_python(self, value): value = super(HoursField, self).to_python(value) if isinstance(value, list) or value is None: return value return [HoursListing(*pair) for pair in self.pickler.from_csv(value)] def get_prep_value(self, value): if value is None: prepped = value else: tuples = [(v.days.strip(), v.hours.strip()) for v in value] prepped = self.pickler.to_csv(tuples) return super(HoursField, self).get_prep_value(prepped) # TODO: do a custom widget/field for this def formfield(self, **kwargs): return super(HoursField, self).formfield(**kwargs)
class Parking(ViewModel): ''' Object to handle parking options. ''' choices = (('street', 'Street'), ('lot', 'Lot'), ('garage', 'Garage'), ('valet', 'Valet')) def __init__(self): self.parking_options = [] self.pickler = CSVPickler() def add_option(self, option): if option not in [c[0] for c in Parking.choices]: raise ValueError('Invalid parking option') self.parking_options.append(option) def to_data(self): choice_map = dict(Parking.choices) return [choice_map[option_key] for option_key in self.parking_options] @classmethod def deserialize(cls, data): inst = Parking() inst.parking_options = [row[0] for row in inst.pickler.from_csv(data)] return inst def serialize(self): return self.pickler.to_csv([[opt] for opt in self.parking_options]) def __str__(self): return self.serialize()
def __init__(self): self.parking_options = [] self.pickler = CSVPickler()
def __init__(self, *args, **kwargs): self.pickler = CSVPickler() super(HoursField, self).__init__(*args, **kwargs)