|
@@ -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")
|