misagodbrelations.py 2.1 KB

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