Browse Source

Small utility for #408

Rafał Pitoń 10 years ago
parent
commit
9edb9b0a31
1 changed files with 51 additions and 0 deletions
  1. 51 0
      misago/core/management/commands/misagodbrelations.py

+ 51 - 0
misago/core/management/commands/misagodbrelations.py

@@ -0,0 +1,51 @@
+from django.apps import apps
+from django.core.management.base import BaseCommand
+from django.db.models.fields.related import (ForeignKey, OneToOneField,
+                                             ManyToManyField)
+
+
+class Command(BaseCommand):
+    help = 'Lists relations between models'
+
+    def handle(self, *args, **options):
+        relation_fields = (ForeignKey, OneToOneField, ManyToManyField)
+        field_pattern = "%s=%s(%s, on_delete=%s)\n"
+
+        for app in apps.get_app_configs():
+            app_header_printed = False
+            if app.name.startswith('misago.') and app.models_module:
+                for model in app.get_models():
+                    # Search model for relations
+                    model_relations = []
+                    for field in model._meta.fields:
+                        if isinstance(field, relation_fields):
+                            model_relations.append(field)
+
+                    # If model has relations, print them
+                    if model_relations:
+                        if not app_header_printed:
+                            # Lazy print app header
+                            self.print_app_header(app)
+                            app_header_printed = True
+
+                        # Print model header
+                        self.print_model_header(model)
+
+                        # Finally list model relations
+                        for field in model_relations:
+                            self.stdout.write(field_pattern % (
+                                field.name,
+                                field.__class__.__name__,
+                                field.related.parent_model.__name__,
+                                field.rel.on_delete.__name__,
+                            ))
+
+    def print_app_header(self, app):
+        # Fancy title
+        self.stdout.write("\n\n%s" % app.name)
+        self.stdout.write('=' * len(app.name))
+
+    def print_model_header(self, model):
+        self.stdout.write("\n%s" % model.__name__)
+        self.stdout.write('-' * len(model.__name__))
+        self.stdout.write("\n")