forked from pennlabs/penn-courses
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow multiple degrees per degreeplan and multiple degrees per rule (…
…for deduplication)
- Loading branch information
Showing
8 changed files
with
124 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
from textwrap import dedent | ||
|
||
from django.core.management.base import BaseCommand | ||
from django.db import transaction | ||
from degree.models import Rule | ||
from degree.serializers import RuleSerializer | ||
import json | ||
from collections import defaultdict | ||
|
||
class Command(BaseCommand): | ||
help = dedent( | ||
""" | ||
Removes rules that are identical (based on content hash except for rule ids) | ||
""" | ||
) | ||
|
||
@transaction.atomic | ||
def handle(self, *args, **kwargs): | ||
# get toposort of rules | ||
rules = list(Rule.objects.filter(parent=None).order_by('id')) | ||
|
||
# serialize rules to fixed format | ||
rules = { | ||
rule.id: hash(json.dumps( | ||
RuleSerializer(rule).data, | ||
sort_keys=True, | ||
ensure_ascii=True | ||
)) | ||
for rule in rules | ||
} | ||
|
||
# invert rules | ||
inverted_rules = defaultdict(list) | ||
for rule, hash in rules.items(): | ||
inverted_rules[hash].append(rule) | ||
|
||
# fold the rules | ||
for hash, rule_ids in inverted_rules.items(): | ||
if len(rule_ids) > 1: | ||
print(f"Removing rules {rule_ids[1:]}") | ||
Rule.objects.filter(id__in=rule_ids[1:]).values_list("parent_id", flat=True).update(parent_id=rule_ids[0] | ||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
# Generated by Django 3.2.23 on 2024-02-06 00:50 | ||
|
||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
('degree', '0005_auto_20240205_0150'), | ||
] | ||
|
||
operations = [ | ||
migrations.RemoveField( | ||
model_name='degreeplan', | ||
name='degree', | ||
), | ||
migrations.RemoveField( | ||
model_name='rule', | ||
name='degree', | ||
), | ||
migrations.AddField( | ||
model_name='degree', | ||
name='rules', | ||
field=models.ManyToManyField(blank=True, help_text='\nThe rules for this degree. Blank if this degree has no rules.\n', related_name='degrees', to='degree.Rule'), | ||
), | ||
migrations.AddField( | ||
model_name='degreeplan', | ||
name='degrees', | ||
field=models.ManyToManyField(help_text='The degree this is associated with.', to='degree.Degree'), | ||
), | ||
migrations.AlterField( | ||
model_name='rule', | ||
name='parent', | ||
field=models.ForeignKey(help_text="\nThis rule's parent Rule if it has one. Null if this is a top level rule\n(i.e., this rule belongs to some Degree's `.rules` set).\n", null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='degree.rule'), | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters