def prepare_value(self, value): return to_dec(value)
def __init__(self, *args, **kwargs): super(CurrencyChoiceField, self).__init__(*args, **kwargs) self.choices = [(to_dec(k), v) for k, v in self.choices]
def get_display_table_rows(app_name, for_export, subsession_pk=None): if not for_export and not subsession_pk: raise ValueError("if this is for the admin results table, " "you need to specify a subsession pk") models_module = otree.common_internal.get_models_module(app_name) Player = models_module.Player Group = models_module.Group Subsession = models_module.Subsession if for_export: model_order = [ Participant, Player, Group, Subsession, Session ] else: model_order = [ Player, Group, Subsession, ] # get title row all_columns = [] for Model in model_order: field_names = get_all_fields(Model, for_export) columns_for_this_model = [ (Model, field_name) for field_name in field_names ] all_columns.extend(columns_for_this_model) if subsession_pk: players = Player.objects.filter(subsession_id=subsession_pk) else: players = Player.objects.all() session_ids = set([player.session_id for player in players]) # initialize parent_objects = {} parent_models = [ Model for Model in model_order if Model not in {Player, Session} ] for Model in parent_models: parent_objects[Model] = { obj.pk: obj for obj in Model.objects.filter(session_id__in=session_ids) } if Session in model_order: parent_objects[Session] = { obj.pk: obj for obj in Session.objects.filter(pk__in=session_ids) } all_rows = [] for player in players: row = [] for column in all_columns: Model, field_name = column if Model == Player: model_instance = player else: fk_name = Model.__name__.lower() parent_object_id = getattr(player, "{}_id".format(fk_name)) if parent_object_id is None: model_instance = None else: model_instance = parent_objects[Model][parent_object_id] attr = getattr(model_instance, field_name, '') if callable(attr): if Model == Player and field_name == 'role' \ and model_instance.group is None: attr = '' else: try: attr = attr() except: attr = "(error)" row.append(attr) all_rows.append(row) values_to_replace = {None: '', True: 1, False: 0} for row in all_rows: for i in range(len(row)): value = row[i] try: replace = value in values_to_replace except TypeError: # if it's an unhashable data type # like Json or Pickle field replace = False if replace: value = values_to_replace[value] elif for_export and isinstance(value, easymoney.Money): # remove currency formatting for easier analysis value = easymoney.to_dec(value) value = unicode(value).encode('UTF-8') value = value.replace('\n', ' ').replace('\r', ' ') row[i] = value column_display_names = [] for Model, field_name in all_columns: column_display_names.append( (Model.__name__, field_name) ) return column_display_names, all_rows
def get_display_table_rows(app_name, for_export, subsession_pk=None): if not for_export and not subsession_pk: raise ValueError("if this is for the admin results table, " "you need to specify a subsession pk") models_module = otree.common_internal.get_models_module(app_name) Player = models_module.Player Group = models_module.Group Subsession = models_module.Subsession if for_export: model_order = [Participant, Player, Group, Subsession, Session] else: model_order = [ Player, Group, Subsession, ] # get title row all_columns = [] for Model in model_order: field_names = get_all_fields(Model, for_export) columns_for_this_model = [(Model, field_name) for field_name in field_names] all_columns.extend(columns_for_this_model) if subsession_pk: players = Player.objects.filter(subsession_id=subsession_pk) else: players = Player.objects.all() session_ids = set([player.session_id for player in players]) # initialize parent_objects = {} parent_models = [ Model for Model in model_order if Model not in {Player, Session} ] for Model in parent_models: parent_objects[Model] = { obj.pk: obj for obj in Model.objects.filter(session_id__in=session_ids) } if Session in model_order: parent_objects[Session] = { obj.pk: obj for obj in Session.objects.filter(pk__in=session_ids) } all_rows = [] for player in players: row = [] for column in all_columns: Model, field_name = column if Model == Player: model_instance = player else: fk_name = Model.__name__.lower() parent_object_id = getattr(player, "{}_id".format(fk_name)) if parent_object_id is None: model_instance = None else: model_instance = parent_objects[Model][parent_object_id] attr = getattr(model_instance, field_name, '') if callable(attr): if Model == Player and field_name == 'role' \ and model_instance.group is None: attr = '' else: try: attr = attr() except: attr = "(error)" row.append(attr) all_rows.append(row) values_to_replace = {None: '', True: 1, False: 0} for row in all_rows: for i in range(len(row)): value = row[i] try: replace = value in values_to_replace except TypeError: # if it's an unhashable data type # like Json or Pickle field replace = False if replace: value = values_to_replace[value] elif for_export and isinstance(value, easymoney.Money): # remove currency formatting for easier analysis value = easymoney.to_dec(value) value = unicode(value).encode('UTF-8') value = value.replace('\n', ' ').replace('\r', ' ') row[i] = value column_display_names = [] for Model, field_name in all_columns: column_display_names.append((Model.__name__, field_name)) return column_display_names, all_rows