misagodbrelations.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from django.apps import apps
  2. from django.core.management.base import BaseCommand
  3. from django.db.models.fields.related import (ForeignKey, OneToOneField,
  4. ManyToManyField)
  5. class Command(BaseCommand):
  6. help = 'Lists relations between models'
  7. def handle(self, *args, **options):
  8. relation_fields = (ForeignKey, OneToOneField, ManyToManyField)
  9. field_pattern = "%s=%s(%s, on_delete=%s)\n"
  10. for app in apps.get_app_configs():
  11. app_header_printed = False
  12. if app.name.startswith('misago.') and app.models_module:
  13. for model in app.get_models():
  14. # Search model for relations
  15. model_relations = []
  16. for field in model._meta.fields:
  17. if isinstance(field, relation_fields):
  18. model_relations.append(field)
  19. # If model has relations, print them
  20. if model_relations:
  21. if not app_header_printed:
  22. # Lazy print app header
  23. self.print_app_header(app)
  24. app_header_printed = True
  25. # Print model header
  26. self.print_model_header(model)
  27. # Finally list model relations
  28. for field in model_relations:
  29. self.stdout.write(field_pattern % (
  30. field.name,
  31. field.__class__.__name__,
  32. field.related.parent_model.__name__,
  33. field.rel.on_delete.__name__,
  34. ))
  35. def print_app_header(self, app):
  36. # Fancy title
  37. self.stdout.write("\n\n%s" % app.name)
  38. self.stdout.write('=' * len(app.name))
  39. def print_model_header(self, model):
  40. self.stdout.write("\n%s" % model.__name__)
  41. self.stdout.write('-' * len(model.__name__))
  42. self.stdout.write("\n")