From 7b74732b3bd4df8a2765e4bd421014c1585cfde6 Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Tue, 30 Jan 2024 14:22:25 +0200 Subject: [PATCH 1/2] big slugs, cascade slug changes --- .../migrations/0118_auto_20240130_1221.py | 28 +++++++++++++++++++ peachjam/models/taxonomies.py | 8 +++++- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 peachjam/migrations/0118_auto_20240130_1221.py diff --git a/peachjam/migrations/0118_auto_20240130_1221.py b/peachjam/migrations/0118_auto_20240130_1221.py new file mode 100644 index 000000000..0d4e5fe44 --- /dev/null +++ b/peachjam/migrations/0118_auto_20240130_1221.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.20 on 2024-01-30 12:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("peachjam", "0117_coredocument_published"), + ] + + operations = [ + migrations.AlterField( + model_name="coredocument", + name="published", + field=models.BooleanField( + db_index=True, + default=True, + help_text="Is this document published and visible on the website?", + verbose_name="published", + ), + ), + migrations.AlterField( + model_name="taxonomy", + name="slug", + field=models.SlugField(max_length=10240, unique=True, verbose_name="slug"), + ), + ] diff --git a/peachjam/models/taxonomies.py b/peachjam/models/taxonomies.py index b52697072..735368ae7 100644 --- a/peachjam/models/taxonomies.py +++ b/peachjam/models/taxonomies.py @@ -9,7 +9,7 @@ class Taxonomy(MP_Node): name = models.CharField(_("name"), max_length=255) - slug = models.SlugField(_("slug"), max_length=255, unique=True) + slug = models.SlugField(_("slug"), max_length=10 * 1024, unique=True) node_order_by = ["name"] entity_profile = GenericRelation( "peachjam.EntityProfile", verbose_name=_("profile") @@ -33,10 +33,16 @@ def get_entity_profile(self): return self.get_parent().get_entity_profile() def save(self, *args, **kwargs): + old_slug = self.slug parent = self.get_parent() self.slug = (f"{parent.slug}-" if parent else "") + slugify(self.name) super().save(*args, **kwargs) + if old_slug != self.slug: + # update all our children to use the new slug + for child in self.get_children(): + child.save() + class DocumentTopic(models.Model): document = models.ForeignKey( From bec81cb643125c411a71df00a5cfb2e376b24077 Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Tue, 30 Jan 2024 14:24:20 +0200 Subject: [PATCH 2/2] updated refugees taxonomy mgmt command takes taxonomy root slug so it's more accurate --- peachjam/fixtures/taxonomies/refugees.json | 2 +- peachjam/management/commands/taxonomies.py | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/peachjam/fixtures/taxonomies/refugees.json b/peachjam/fixtures/taxonomies/refugees.json index ed3a89864..236b50df5 100644 --- a/peachjam/fixtures/taxonomies/refugees.json +++ b/peachjam/fixtures/taxonomies/refugees.json @@ -1 +1 @@ -[{"data":{"name":"Refugees","slug":"case-indexes-refugees"},"children":[{"data":{"name":"Administrative action","slug":"refugees-administrative-action"},"children":[{"data":{"name":"Escaping Persecution","slug":"refugees-administrative-action-escaping-persecution"},"children":[{"data":{"name":"Persecution","slug":"refugees-administrative-action-escaping-persecution-persecution"}},{"data":{"name":"Persecution based on belonging to a social group","slug":"refugees-administrative-action-escaping-persecution-persecution-based-on-belonging-to-a-social-group"}},{"data":{"name":"Persecution based on nationality","slug":"refugees-administrative-action-escaping-persecution-persecution-based-on-nationality"}},{"data":{"name":"Persecution based on political opinion","slug":"refugees-administrative-action-escaping-persecution-persecution-based-on-political-opinion"}},{"data":{"name":"Persecution based on race","slug":"refugees-administrative-action-escaping-persecution-persecution-based-on-race"}},{"data":{"name":"Persecution based on religion","slug":"refugees-administrative-action-escaping-persecution-persecution-based-on-religion"}},{"data":{"name":"Persecution based on sexual orientation","slug":"refugees-administrative-action-escaping-persecution-persecution-based-on-sexual-orientation"}},{"data":{"name":"Threats to life","slug":"refugees-administrative-action-escaping-persecution-threats-to-life"}},{"data":{"name":"Threats to movement","slug":"refugees-administrative-action-escaping-persecution-threats-to-movement"},"children":[{"data":{"name":"Immutable characteristics","slug":"refugees-administrative-action-escaping-persecution-threats-to-movement-immutable-characteristics"},"children":[{"data":{"name":"Non-immutable characteristics","slug":"refugees-administrative-action-escaping-persecution-threats-to-movement-immutable-characteristics-non-immutable-characteristics"}}]},{"data":{"name":"Well-founded fear of persecution","slug":"refugees-administrative-action-escaping-persecution-threats-to-movement-well-founded-fear-of-persecution"}}]}]},{"data":{"name":"Procedure for the determination of refugee status","slug":"refugees-administrative-action-procedure-for-the-determination-of-refugee-status"}}]},{"data":{"name":"Alienage","slug":"refugees-alienage"}},{"data":{"name":"Arrest and detention","slug":"refugees-arrest-and-detention"}},{"data":{"name":"Asylum Seeker","slug":"refugees-asylum-seeker"},"children":[{"data":{"name":"Definition of an asylum seeker","slug":"refugees-asylum-seeker-definition-of-an-asylum-seeker"}}]},{"data":{"name":"Audience","slug":"refugees-audience"}},{"data":{"name":"Cessation","slug":"refugees-cessation"}},{"data":{"name":"Children's rights","slug":"refugees-childrens-rights"}},{"data":{"name":"Constitutional law","slug":"refugees-constitutional-law"},"children":[{"data":{"name":"Bill of Rights","slug":"refugees-constitutional-law-bill-of-rights"}}]},{"data":{"name":"Criminal law","slug":"refugees-criminal-law"},"children":[{"data":{"name":"False documents","slug":"refugees-criminal-law-false-documents"}},{"data":{"name":"Murder","slug":"refugees-criminal-law-murder"}},{"data":{"name":"Provocation","slug":"refugees-criminal-law-provocation"}}]},{"data":{"name":"Deportation","slug":"refugees-deportation"}},{"data":{"name":"Durable Solutions","slug":"refugees-durable-solutions"},"children":[{"data":{"name":"Naturalisation","slug":"refugees-durable-solutions-naturalisation"}},{"data":{"name":"Resettlement","slug":"refugees-durable-solutions-resettlement"}},{"data":{"name":"Voluntary repatriation","slug":"refugees-durable-solutions-voluntary-repatriation"}}]},{"data":{"name":"Escaping War","slug":"refugees-escaping-war"}},{"data":{"name":"Exclusion","slug":"refugees-exclusion"}},{"data":{"name":"Extradition","slug":"refugees-extradition"}},{"data":{"name":"Human Rights and Fundamental Freedoms","slug":"refugees-human-rights-and-fundamental-freedoms"}},{"data":{"name":"Illegal entry","slug":"refugees-illegal-entry"},"children":[{"data":{"name":"Port of entry","slug":"refugees-illegal-entry-port-of-entry"},"children":[{"data":{"name":"By air","slug":"refugees-illegal-entry-port-of-entry-by-air"}},{"data":{"name":"By land","slug":"refugees-illegal-entry-port-of-entry-by-land"}},{"data":{"name":"By sea","slug":"refugees-illegal-entry-port-of-entry-by-sea"}}]}]},{"data":{"name":"Immigration law","slug":"refugees-immigration-law"},"children":[{"data":{"name":"Citizenship","slug":"refugees-immigration-law-citizenship"}},{"data":{"name":"Discrimination","slug":"refugees-immigration-law-discrimination"}},{"data":{"name":"Illegal immigrant(s)","slug":"refugees-immigration-law-illegal-immigrants"}}]},{"data":{"name":"Internally Displaced Person","slug":"refugees-internally-displaced-person"},"children":[{"data":{"name":"Definition of an internally displaced person","slug":"refugees-internally-displaced-person-definition-of-an-internally-displaced-person"}}]},{"data":{"name":"International Refugee Law","slug":"refugees-international-refugee-law"}},{"data":{"name":"Jurisdiction","slug":"refugees-jurisdiction"}},{"data":{"name":"Land ownership","slug":"refugees-land-ownership"}},{"data":{"name":"National security","slug":"refugees-national-security"}},{"data":{"name":"Nullification of passport","slug":"refugees-nullification-of-passport"}},{"data":{"name":"Procedural fairness","slug":"refugees-procedural-fairness"}},{"data":{"name":"Refoulement","slug":"refugees-refoulement"},"children":[{"data":{"name":"Principle of non-refoulement","slug":"refugees-refoulement-principle-of-non-refoulement"}}]},{"data":{"name":"Refugee","slug":"refugees-refugee"},"children":[{"data":{"name":"Definition of a refugee","slug":"refugees-refugee-definition-of-a-refugee"}},{"data":{"name":"Designated refugee camps","slug":"refugees-refugee-designated-refugee-camps"}},{"data":{"name":"Registered refugee","slug":"refugees-refugee-registered-refugee"}},{"data":{"name":"Revocation of refugee status","slug":"refugees-refugee-revocation-of-refugee-status"}},{"data":{"name":"Rights of refugees","slug":"refugees-refugee-rights-of-refugees"},"children":[{"data":{"name":"Access to information","slug":"refugees-refugee-rights-of-refugees-access-to-information"}},{"data":{"name":"Access to justice","slug":"refugees-refugee-rights-of-refugees-access-to-justice"}},{"data":{"name":"Administrative justice","slug":"refugees-refugee-rights-of-refugees-administrative-justice"},"children":[{"data":{"name":"Equality and non-discrimination","slug":"refugees-refugee-rights-of-refugees-administrative-justice-equality-and-non-discrimination"}},{"data":{"name":"Identity documents/certificates","slug":"refugees-refugee-rights-of-refugees-administrative-justice-identity-documentscertificates"}},{"data":{"name":"Travel documents","slug":"refugees-refugee-rights-of-refugees-administrative-justice-travel-documents"}}]},{"data":{"name":"Freedom of movement","slug":"refugees-refugee-rights-of-refugees-freedom-of-movement"}},{"data":{"name":"Housing","slug":"refugees-refugee-rights-of-refugees-housing"}},{"data":{"name":"Marriage","slug":"refugees-refugee-rights-of-refugees-marriage"}},{"data":{"name":"Property rights","slug":"refugees-refugee-rights-of-refugees-property-rights"}},{"data":{"name":"Right of free assembly","slug":"refugees-refugee-rights-of-refugees-right-of-free-assembly"}},{"data":{"name":"Right of free association","slug":"refugees-refugee-rights-of-refugees-right-of-free-association"}},{"data":{"name":"Right of free expression","slug":"refugees-refugee-rights-of-refugees-right-of-free-expression"}},{"data":{"name":"Right to education","slug":"refugees-refugee-rights-of-refugees-right-to-education"}},{"data":{"name":"Right to work","slug":"refugees-refugee-rights-of-refugees-right-to-work"},"children":[{"data":{"name":"Employment","slug":"refugees-refugee-rights-of-refugees-right-to-work-employment"},"children":[{"data":{"name":"Self-employment","slug":"refugees-refugee-rights-of-refugees-right-to-work-employment-self-employment"}}]}]},{"data":{"name":"Safe return","slug":"refugees-refugee-rights-of-refugees-safe-return"}},{"data":{"name":"Social services","slug":"refugees-refugee-rights-of-refugees-social-services"}},{"data":{"name":"Unity of the family","slug":"refugees-refugee-rights-of-refugees-unity-of-the-family"}}]},{"data":{"name":"Work permit","slug":"refugees-refugee-work-permit"}}]},{"data":{"name":"Residence permit","slug":"refugees-residence-permit"}},{"data":{"name":"Returnee","slug":"refugees-returnee"},"children":[{"data":{"name":"Definition of a returnee","slug":"refugees-returnee-definition-of-a-returnee"}}]},{"data":{"name":"Sentence","slug":"refugees-sentence"}},{"data":{"name":"Stateless Person","slug":"refugees-stateless-person"},"children":[{"data":{"name":"Definition of a stateless person","slug":"refugees-stateless-person-definition-of-a-stateless-person"}}]},{"data":{"name":"Temporary Resident","slug":"refugees-temporary-resident"},"children":[{"data":{"name":"Definition of a temporary resident","slug":"refugees-temporary-resident-definition-of-a-temporary-resident"}}]},{"data":{"name":"Validity of legislation","slug":"refugees-validity-of-legislation"}}]}] +[{"data": {"name": "Refugees", "slug": "case-indexes-refugees"}, "children": [{"data": {"name": "Abduction", "slug": "refugees-abduction"}}, {"data": {"name": "Administrative action", "slug": "refugees-administrative-action"}, "children": [{"data": {"name": "Persecution", "slug": "refugees-administrative-action-persecution"}, "children": [{"data": {"name": "Escaping Persecution", "slug": "refugees-administrative-action-persecution-escaping-persecution"}}, {"data": {"name": "Persecution based on belonging to a social group", "slug": "refugees-administrative-action-persecution-persecution-based-on-belonging-to-a-social-group"}}, {"data": {"name": "Persecution based on nationality", "slug": "refugees-administrative-action-persecution-persecution-based-on-nationality"}}, {"data": {"name": "Persecution based on political opinion", "slug": "refugees-administrative-action-persecution-persecution-based-on-political-opinion"}}, {"data": {"name": "Persecution based on race", "slug": "refugees-administrative-action-persecution-persecution-based-on-race"}}, {"data": {"name": "Persecution based on religion", "slug": "refugees-administrative-action-persecution-persecution-based-on-religion"}}, {"data": {"name": "Persecution based on sexual orientation", "slug": "refugees-administrative-action-persecution-persecution-based-on-sexual-orientation"}}, {"data": {"name": "Threats to life", "slug": "refugees-administrative-action-persecution-threats-to-life"}}, {"data": {"name": "Threats to movement", "slug": "refugees-administrative-action-persecution-threats-to-movement"}, "children": [{"data": {"name": "Immutable characteristics", "slug": "refugees-administrative-action-persecution-threats-to-movement-immutable-characteristics"}}, {"data": {"name": "Non-immutable characteristics", "slug": "refugees-administrative-action-persecution-threats-to-movement-non-immutable-characteristics"}}]}, {"data": {"name": "Well-founded fear of persecution", "slug": "refugees-administrative-action-persecution-well-founded-fear-of-persecution"}}]}, {"data": {"name": "Procedure for the determination of refugee status", "slug": "refugees-administrative-action-procedure-for-the-determination-of-refugee-status"}}]}, {"data": {"name": "Alienage", "slug": "refugees-alienage"}}, {"data": {"name": "Arrest and detention", "slug": "refugees-arrest-and-detention"}, "children": [{"data": {"name": "Release from detention", "slug": "refugees-arrest-and-detention-release-from-detention"}}]}, {"data": {"name": "Asylum Seeker", "slug": "refugees-asylum-seeker"}, "children": [{"data": {"name": "Application", "slug": "refugees-asylum-seeker-application"}, "children": [{"data": {"name": "Rejection of application", "slug": "refugees-asylum-seeker-application-rejection-of-application"}}]}, {"data": {"name": "Child of asylum seeker", "slug": "refugees-asylum-seeker-child-of-asylum-seeker"}}, {"data": {"name": "Definition of an asylum seeker", "slug": "refugees-asylum-seeker-definition-of-an-asylum-seeker"}}, {"data": {"name": "Protection of asylum seeker", "slug": "refugees-asylum-seeker-protection-of-asylum-seeker"}}]}, {"data": {"name": "Audience", "slug": "refugees-audience"}}, {"data": {"name": "Cessation", "slug": "refugees-cessation"}}, {"data": {"name": "Children's rights", "slug": "refugees-childrens-rights"}, "children": [{"data": {"name": "Protection of children", "slug": "refugees-childrens-rights-protection-of-children"}}]}, {"data": {"name": "Constitutional law", "slug": "refugees-constitutional-law"}, "children": [{"data": {"name": "Bill of Rights", "slug": "refugees-constitutional-law-bill-of-rights"}}, {"data": {"name": "Declaration of invalidity", "slug": "refugees-constitutional-law-declaration-of-invalidity"}}]}, {"data": {"name": "Contract law", "slug": "refugees-contract-law"}, "children": [{"data": {"name": "Defence of non-enrichment", "slug": "refugees-contract-law-defence-of-non-enrichment"}}, {"data": {"name": "Restitutionary claims - condictio indebiti", "slug": "refugees-contract-law-restitutionary-claims-condictio-indebiti"}}]}, {"data": {"name": "Criminal law", "slug": "refugees-criminal-law"}, "children": [{"data": {"name": "Bail", "slug": "refugees-criminal-law-bail"}}, {"data": {"name": "Bail appeal", "slug": "refugees-criminal-law-bail-appeal"}}, {"data": {"name": "False documents", "slug": "refugees-criminal-law-false-documents"}}, {"data": {"name": "Murder", "slug": "refugees-criminal-law-murder"}}, {"data": {"name": "Provocation", "slug": "refugees-criminal-law-provocation"}}, {"data": {"name": "Refusal of bail", "slug": "refugees-criminal-law-refusal-of-bail"}}]}, {"data": {"name": "Deportation", "slug": "refugees-deportation"}, "children": [{"data": {"name": "deportation orders", "slug": "refugees-deportation-deportation-orders"}}]}, {"data": {"name": "Durable Solutions", "slug": "refugees-durable-solutions"}, "children": [{"data": {"name": "Naturalisation", "slug": "refugees-durable-solutions-naturalisation"}}, {"data": {"name": "Resettlement", "slug": "refugees-durable-solutions-resettlement"}}, {"data": {"name": "Voluntary repatriation", "slug": "refugees-durable-solutions-voluntary-repatriation"}}]}, {"data": {"name": "Escaping War", "slug": "refugees-escaping-war"}}, {"data": {"name": "Exclusion", "slug": "refugees-exclusion"}}, {"data": {"name": "Extradition", "slug": "refugees-extradition"}}, {"data": {"name": "Human Rights and Fundamental Freedoms", "slug": "refugees-human-rights-and-fundamental-freedoms"}}, {"data": {"name": "Illegal entry", "slug": "refugees-illegal-entry"}, "children": [{"data": {"name": "Port of entry", "slug": "refugees-illegal-entry-port-of-entry"}, "children": [{"data": {"name": "By air", "slug": "refugees-illegal-entry-port-of-entry-by-air"}}, {"data": {"name": "By land", "slug": "refugees-illegal-entry-port-of-entry-by-land"}}, {"data": {"name": "By sea", "slug": "refugees-illegal-entry-port-of-entry-by-sea"}}]}]}, {"data": {"name": "Immigration law", "slug": "refugees-immigration-law"}, "children": [{"data": {"name": "Citizenship", "slug": "refugees-immigration-law-citizenship"}}, {"data": {"name": "Discrimination", "slug": "refugees-immigration-law-discrimination"}}, {"data": {"name": "Illegal immigrant(s)", "slug": "refugees-immigration-law-illegal-immigrants"}}, {"data": {"name": "Prohibited Person", "slug": "refugees-immigration-law-prohibited-person"}}]}, {"data": {"name": "Internally Displaced Person", "slug": "refugees-internally-displaced-person"}, "children": [{"data": {"name": "Definition of an internally displaced person", "slug": "refugees-internally-displaced-person-definition-of-an-internally-displaced-person"}}]}, {"data": {"name": "International Refugee Law", "slug": "refugees-international-refugee-law"}}, {"data": {"name": "Jurisdiction", "slug": "refugees-jurisdiction"}}, {"data": {"name": "Labour law", "slug": "refugees-labour-law"}, "children": [{"data": {"name": "Illegal contract", "slug": "refugees-labour-law-illegal-contract"}}]}, {"data": {"name": "Land ownership", "slug": "refugees-land-ownership"}}, {"data": {"name": "National security", "slug": "refugees-national-security"}}, {"data": {"name": "Nullification of passport", "slug": "refugees-nullification-of-passport"}}, {"data": {"name": "Procedural fairness", "slug": "refugees-procedural-fairness"}}, {"data": {"name": "Refoulement", "slug": "refugees-refoulement"}, "children": [{"data": {"name": "Principle of non-refoulement", "slug": "refugees-refoulement-principle-of-non-refoulement"}}]}, {"data": {"name": "Refugee", "slug": "refugees-refugee"}, "children": [{"data": {"name": "Definition of a refugee", "slug": "refugees-refugee-definition-of-a-refugee"}}, {"data": {"name": "Designated refugee camps", "slug": "refugees-refugee-designated-refugee-camps"}}, {"data": {"name": "Protection of refugee", "slug": "refugees-refugee-protection-of-refugee"}}, {"data": {"name": "Registered refugee", "slug": "refugees-refugee-registered-refugee"}}, {"data": {"name": "Revocation/Rescission of refugee status", "slug": "refugees-refugee-revocationrescission-of-refugee-status"}}, {"data": {"name": "Rights of refugees", "slug": "refugees-refugee-rights-of-refugees"}, "children": [{"data": {"name": "Access to information", "slug": "refugees-refugee-rights-of-refugees-access-to-information"}}, {"data": {"name": "Access to justice", "slug": "refugees-refugee-rights-of-refugees-access-to-justice"}}, {"data": {"name": "Administrative justice", "slug": "refugees-refugee-rights-of-refugees-administrative-justice"}, "children": [{"data": {"name": "Identity documents/certificates", "slug": "refugees-refugee-rights-of-refugees-administrative-justice-identity-documentscertificates"}}, {"data": {"name": "Status Seeker", "slug": "refugees-refugee-rights-of-refugees-administrative-justice-status-seeker"}}, {"data": {"name": "Travel documents", "slug": "refugees-refugee-rights-of-refugees-administrative-justice-travel-documents"}}]}, {"data": {"name": "Equality and non-discrimination", "slug": "refugees-refugee-rights-of-refugees-equality-and-non-discrimination"}}, {"data": {"name": "Freedom of movement", "slug": "refugees-refugee-rights-of-refugees-freedom-of-movement"}}, {"data": {"name": "Housing", "slug": "refugees-refugee-rights-of-refugees-housing"}}, {"data": {"name": "Marriage", "slug": "refugees-refugee-rights-of-refugees-marriage"}}, {"data": {"name": "Property rights", "slug": "refugees-refugee-rights-of-refugees-property-rights"}}, {"data": {"name": "Right of free assembly", "slug": "refugees-refugee-rights-of-refugees-right-of-free-assembly"}}, {"data": {"name": "Right of free association", "slug": "refugees-refugee-rights-of-refugees-right-of-free-association"}}, {"data": {"name": "Right of free expression", "slug": "refugees-refugee-rights-of-refugees-right-of-free-expression"}}, {"data": {"name": "Right to bail", "slug": "refugees-refugee-rights-of-refugees-right-to-bail"}}, {"data": {"name": "Right to choose a place of residence", "slug": "refugees-refugee-rights-of-refugees-right-to-choose-a-place-of-residence"}}, {"data": {"name": "Right to education", "slug": "refugees-refugee-rights-of-refugees-right-to-education"}}, {"data": {"name": "Right to extension", "slug": "refugees-refugee-rights-of-refugees-right-to-extension"}}, {"data": {"name": "Right to seek and enjoy asylum", "slug": "refugees-refugee-rights-of-refugees-right-to-seek-and-enjoy-asylum"}}, {"data": {"name": "Right to work", "slug": "refugees-refugee-rights-of-refugees-right-to-work"}, "children": [{"data": {"name": "Employment", "slug": "refugees-refugee-rights-of-refugees-right-to-work-employment"}}, {"data": {"name": "Self-employment", "slug": "refugees-refugee-rights-of-refugees-right-to-work-self-employment"}}]}, {"data": {"name": "Safe return", "slug": "refugees-refugee-rights-of-refugees-safe-return"}}, {"data": {"name": "Social services", "slug": "refugees-refugee-rights-of-refugees-social-services"}}, {"data": {"name": "Unity of the family", "slug": "refugees-refugee-rights-of-refugees-unity-of-the-family"}}]}, {"data": {"name": "Work permit", "slug": "refugees-refugee-work-permit"}}]}, {"data": {"name": "Residence permit", "slug": "refugees-residence-permit"}}, {"data": {"name": "Returnee", "slug": "refugees-returnee"}, "children": [{"data": {"name": "Definition of a returnee", "slug": "refugees-returnee-definition-of-a-returnee"}}]}, {"data": {"name": "Sentence", "slug": "refugees-sentence"}}, {"data": {"name": "Stateless Person", "slug": "refugees-stateless-person"}, "children": [{"data": {"name": "Definition of a stateless person", "slug": "refugees-stateless-person-definition-of-a-stateless-person"}}]}, {"data": {"name": "Temporary Resident", "slug": "refugees-temporary-resident"}, "children": [{"data": {"name": "Definition of a temporary resident", "slug": "refugees-temporary-resident-definition-of-a-temporary-resident"}}]}, {"data": {"name": "Validity of legislation", "slug": "refugees-validity-of-legislation"}}]}] diff --git a/peachjam/management/commands/taxonomies.py b/peachjam/management/commands/taxonomies.py index 58024f584..bd53faab0 100644 --- a/peachjam/management/commands/taxonomies.py +++ b/peachjam/management/commands/taxonomies.py @@ -11,7 +11,7 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument( - "--root", type=str, help="Root of the taxonomy to import or export" + "--root", type=str, help="Slug of the taxonomy to import or export" ) parser.add_argument( "--import", action="store_true", help="Import the taxonomy tree" @@ -49,7 +49,7 @@ def do_import(self, **kwargs): root_node = None root = kwargs.get("root") if root: - root_node = Taxonomy.get_root_nodes().filter(name=root).first() + root_node = Taxonomy.objects.filter(slug=root).first() if not root_node: root_node = Taxonomy.add_root(name=root) data = json.load(kwargs["infile"]) @@ -59,8 +59,20 @@ def do_export(self, **kwargs): root_node = None root = kwargs.get("root") if root: - root_node = Taxonomy.get_root_nodes().filter(name=root).first() + root_node = Taxonomy.objects.filter(slug=root).first() if not root_node: raise ValueError("Root node not found: " + root) data = Taxonomy.dump_bulk(root_node, keep_ids=False) + + # keep only the name and slug of the data + def fixup(node): + node["data"] = { + k: v for k, v in node["data"].items() if k in ["name", "slug"] + } + for child in node.get("children", []): + fixup(child) + + for node in data: + fixup(node) + json.dump(data, kwargs["outfile"])