misagodbrelations.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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(field_pattern % (
  29. field.name,
  30. field.__class__.__name__,
  31. field.related.model.__name__,
  32. field.rel.on_delete.__name__,
  33. ))
  34. def print_app_header(self, app):
  35. # Fancy title
  36. self.stdout.write("\n\n%s" % app.name)
  37. self.stdout.write('=' * len(app.name))
  38. def print_model_header(self, model):
  39. self.stdout.write("\n%s" % model.__name__)
  40. self.stdout.write('-' * len(model.__name__))
  41. self.stdout.write("\n")