def test_value_property_getter_and_setter_works_with_enum_field(self): risk_type = RiskType(name="Car", description="Risk template for car") risk_type.save() enum_field = Field(name="Car Type", field_type=Field.ENUM_FIELD, risk_type=risk_type) enum_field.save() option_sedan = OptionValue.objects.create(value="Sedan") option_suv = OptionValue.objects.create(value="SUV") option_hatchback = OptionValue.objects.create(value="Hatchback") enum_field.options.add(option_suv) enum_field.options.add(option_sedan) enum_field.options.add(option_hatchback) risk = Risk.objects.create(risk_type=risk_type) field_value = FieldValue(field=enum_field, risk=risk) field_value.value = option_sedan self.assertEqual(field_value.value_option, option_sedan) field_value.save() self.assertEqual(field_value.value, field_value.value_option)
def create_fields(self, entity, fields): for k, v in fields.items(): field_type = self.MAP_TYPES[v[0]] field = Field(entity=entity, name=k, field_type=field_type) if field_type == self.MAP_TYPES['string']: field.precision = 200 yield field
def handle(self, *args, **options): user_list = create_user() field_list = [] field_type = ["date", "string"] for i in range(100): choice = random.choice(field_type) f1 = Field(field_type=choice, field_name=f"choice_{i}") f1.save() field_list.append(f1) for i in range(2000000): rand_user = random.randrange(0, 9999) u = user_list[rand_user] rand_field = random.randrange(0, 99) field = field_list[rand_field] field_data = [] if field.field_type == "date": rand_hour = random.randrange(0, 23) rand_minute = random.randrange(0, 59) today = datetime.now().date() if i > 1000000: today = datetime.now().date() + timedelta(days=1) random_date = datetime(today.year, today.month, today.day, rand_hour, rand_minute) field_value = FieldValue(field=field, date_value=random_date, user=u) field_data.append(field_value) else: field_value = FieldValue(field=field, string_value=f"string_{i}", user=u) field_data.append(field_value) FieldValue.objects.bulk_create(field_data) date_fields = Field.objects.filter(field_type="date")[20:] date_len = len(date_fields) for i in range(date_len): if len(date_fields) == 0: break rand_hour = random.randrange(0, 11) rand_minute = random.randrange(0, 59) period = random.choice(["am", "pm"]) offset_type = random.choice( ["on_days", "days_before", "days_after"]) date_offset = 0 if offset_type != "on_days": date_offset = random.randrange(0, 5) trigger = Trigger( field=date_fields[i], time=f"{rand_hour}:{rand_minute}", period=period, offset_type=offset_type, date_offset=date_offset, ) trigger.save()
def test_string_representation(self): risk_type = RiskType(name="Car", description="Risk template for car") risk_type.save() field = Field(name="Name", description="Name of car", field_type=Field.TEXT_FIELD, risk_type=risk_type) field.save() self.assertEqual(field.__str__(), field.name)
def handle(self, *args, **kwargs): csv_filename = kwargs["csv_filename"] table = rows.import_from_csv( csv_filename, force_types={"options": rows.fields.JSONField}) expected_field_names = set( "dataset_slug description frontend_filter has_choices " "link_template order null name options obfuscate show " "show_on_frontend table_name title type version_name".split()) if set(table.field_names) != expected_field_names: raise ValueError("Field names didn't match") with transaction.atomic(): fields_to_add = [] for row in table: # First pass: get objects from database: won't add Field here, # since if there are errors, the script will raise exception inside # this first `for`. row = row._asdict() row["version_name"] = str(row["version_name"]) row["dataset"] = Dataset.objects.get( slug=row.pop("dataset_slug")) row["version"] = Version.objects.get( dataset=row["dataset"], name=row.pop("version_name")) row["table"] = Table.with_hidden.get( dataset=row["dataset"], version=row["version"], name=row.pop("table_name"), ) existing_field = Field.objects.filter( dataset=row["dataset"], version=row["version"], table=row["table"], name=row["name"], ) if not existing_field.exists(): action = "created" field = Field(**row) else: action = "updated" field = existing_field.first() for key, value in row.items(): if key in ("dataset", "version", "table"): continue setattr(field, key, value) fields_to_add.append((action, field)) for action, field in fields_to_add: print(f"{action}: {field}") field.save()
def test_string_representation(self): risk_type = RiskType(name="Car", description="Risk template for car") risk_type.save() risk = Risk.objects.create(risk_type=risk_type) field = Field(name="Name", description="Name of car", field_type=Field.TEXT_FIELD, risk_type=risk_type) field.save() field_value = FieldValue(field=field, risk=risk, value_text="Honda") field_value.save() self.assertEqual(field_value.__str__(), field_value.value_text)
def test_value_property_getter_and_setter_works_with_date_field(self): risk_type = RiskType(name="Car", description="Risk template for car") risk_type.save() date_field = Field(name="Purchase Date", field_type=Field.DATE_FIELD, risk_type=risk_type) date_field.save() risk = Risk.objects.create(risk_type=risk_type) field_value = FieldValue(field=date_field, risk=risk) field_value.value = timezone.now().date() self.assertEqual(field_value.value_date, timezone.now().date()) field_value.save() self.assertEqual(field_value.value, field_value.value_date)
def test_value_property_getter_and_setter_works_with_number_field(self): risk_type = RiskType(name="Car", description="Risk template for car") risk_type.save() number_field = Field(name="Model No.", description="Model serial no.", field_type=Field.NUMBER_FIELD, risk_type=risk_type) number_field.save() risk = Risk.objects.create(risk_type=risk_type) field_value = FieldValue(field=number_field, risk=risk) field_value.value = 12345 self.assertEqual(field_value.value_number, 12345) field_value.save() self.assertEqual(field_value.value, field_value.value_number)
def test_value_property_getter_and_setter_works_with_text_field(self): risk_type = RiskType(name="Car", description="Risk template for car") risk_type.save() text_field = Field(name="Name", description="Name of car", field_type=Field.TEXT_FIELD, risk_type=risk_type) text_field.save() risk = Risk.objects.create(risk_type=risk_type) field_value = FieldValue(field=text_field, risk=risk) field_value.value = "Honda" self.assertEqual(field_value.value_text, "Honda") field_value.save() self.assertEqual(field_value.value, field_value.value_text)
def handle(self, *args, **kwargs): csv_filename = kwargs["csv_filename"] table = rows.import_from_csv( csv_filename, force_types={"options": rows.fields.JSONField}) expected_fieldset = set( "dataset_slug description frontend_filter has_choices " "link_template order null name options obfuscate show " "show_on_frontend table_name title type version_name searchable". split()) fieldset = set(table.field_names) if fieldset != expected_fieldset: raise ValueError( f"Field names didn't match ({fieldset - expected_fieldset} / {expected_fieldset - fieldset})" ) with transaction.atomic(): fields_to_save, tables_created = [], [] for row in table: # First pass: get objects from database: won't add Field here, # since if there are errors, the script will raise exception inside # this first `for`. row = row._asdict() row["version_name"] = str(row["version_name"]) row["dataset"], _ = Dataset.objects.get_or_create( slug=row.pop("dataset_slug"), defaults={"show": True}) row["version"], _ = Version.objects.get_or_create( dataset=row["dataset"], name=row.pop("version_name"), defaults={ "collected_at": timezone.now(), "order": 1 }, ) row["table"], table_created = Table.with_hidden.get_or_create( dataset=row["dataset"], version=row["version"], name=row.pop("table_name"), defaults={ "default": False, "ordering": ["id"], "search_fields": [] }, ) existing_field = Field.objects.filter( dataset=row["dataset"], version=row["version"], table=row["table"], name=row["name"], ) if not existing_field.exists(): action = "created" field = Field(**row) else: action = "updated" field = existing_field.first() for key, value in row.items(): if key in ("dataset", "version", "table"): continue setattr(field, key, value) fields_to_save.append((action, field)) if table_created: tables_created.append(row["table"]) for table in tables_created: table.search_fields = [ field.name for action, field in fields_to_save if field.table == table and field.type in ( "text", "string") and field.searchable ] table.save() for action, field in fields_to_save: print(f"{action}: {field}") field.save()