Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Organiza metadados de campos #466

Merged
merged 10 commits into from
Oct 9, 2020
14 changes: 14 additions & 0 deletions core/migrations/0023_auto_20201006_1435.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Generated by Django 3.1.1 on 2020-10-06 17:35

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("core", "0022_auto_20200918_1805"),
]

operations = [
migrations.RenameField(model_name="table", old_name="filtering", new_name="filtering_fields",),
]
31 changes: 31 additions & 0 deletions core/migrations/0024_auto_20201006_1439.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 3.1.1 on 2020-10-06 17:39

from django.db import migrations


def ensure_filtering_fields_config(apps, schema_editor):
Table = apps.get_model("core.Table")

for table in Table.objects.all():
fields = table.field_set.all()

fields_maps = {f.name: f for f in fields}
for fieldname in table.filtering_fields or []:
field = fields.get(name=fieldname)
if not field.frontend_filter:
field.frontend_filter = True
field.save()
print(f"{table.dataset.slug}.{table.name}.{fieldname} atualizado como frontend_filter")


def rollback(*args, **kwargs):
pass


class Migration(migrations.Migration):

dependencies = [
("core", "0023_auto_20201006_1435"),
]

operations = [migrations.RunPython(ensure_filtering_fields_config, rollback)]
11 changes: 9 additions & 2 deletions core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ class Table(models.Model):
name = models.CharField(max_length=255, null=False, blank=False)
options = models.JSONField(null=True, blank=True)
ordering = ArrayField(models.CharField(max_length=63), null=False, blank=False)
filtering = ArrayField(models.CharField(max_length=63), null=True, blank=True)
filtering_fields = ArrayField(models.CharField(max_length=63), null=True, blank=True)
search = ArrayField(models.CharField(max_length=63), null=True, blank=True)
version = models.ForeignKey(Version, on_delete=models.CASCADE, null=False, blank=False)
import_date = models.DateTimeField(null=True, blank=True)
Expand All @@ -306,6 +306,10 @@ class Table(models.Model):
def __str__(self):
return "{}.{}.{}".format(self.dataset.slug, self.version.name, self.name)

@property
def filtering(self):
return [f.name for f in self.fields.frontend_filters()]

@property
def collect_date(self):
return self.version.collected_at
Expand Down Expand Up @@ -470,7 +474,10 @@ def for_table(self, table):
return self.filter(table=table)

def choiceables(self):
return self.filter(has_choices=True, frontend_filter=True)
return self.frontend_filter().filter(has_choices=True)
berinhard marked this conversation as resolved.
Show resolved Hide resolved

def frontend_filters(self):
return self.filter(frontend_filter=True)


class Field(models.Model):
Expand Down
14 changes: 5 additions & 9 deletions core/tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class DynamicModelFormTests(BaseTestCaseWithSampleDataset):
]

def setUp(self):
self.table.filtering = []
self.table.field_set.all().update(frontend_filter=False)
self.table.save()

def get_model_field(self, name):
Expand All @@ -26,8 +26,7 @@ def test_table_without_filters_gets_empty_form(self):
assert 0 == len(form.fields)

def test_generate_form_based_in_table_filtering(self):
self.table.filtering = ["uf", "city"]
self.table.save()
self.table.field_set.filter(name__in=["uf", "city"]).update(frontend_filter=True)

DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)
form = DynamicFormClasss()
Expand All @@ -38,8 +37,7 @@ def test_generate_form_based_in_table_filtering(self):
assert isinstance(form.fields["city"], type(self.get_model_field("city").formfield()))

def test_filter_form_does_not_invalidate_if_no_data(self):
self.table.filtering = ["uf", "city"]
self.table.save()
self.table.field_set.filter(name__in=["uf", "city"]).update(frontend_filter=True)

DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)
form = DynamicFormClasss(data={})
Expand All @@ -48,8 +46,7 @@ def test_filter_form_does_not_invalidate_if_no_data(self):
assert {"uf": "", "city": ""} == form.cleaned_data

def test_validate_form_against_field_choices(self):
self.table.filtering = ["uf", "city"]
self.table.save()
self.table.field_set.filter(name__in=["uf", "city"]).update(frontend_filter=True)
uf_field = self.table.get_field("uf")
uf_field.has_choices = True
uf_field.choices = {"data": ["RJ", "SP", "MG"]}
Expand All @@ -76,8 +73,7 @@ def test_validate_form_against_field_choices(self):
assert {"city": "Rio de Janeiro"} == form.cleaned_data

def test_choice_failback_to_default_type_if_has_choice_field_but_no_data(self):
self.table.filtering = ["uf", "city"]
self.table.save()
self.table.field_set.filter(name__in=["uf", "city"]).update(frontend_filter=True)
uf_field = self.table.get_field("uf")
uf_field.has_choices = True
uf_field.save()
Expand Down