set_default_site.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # -*- coding: utf-8 -*-
  2. import socket
  3. from django.conf import settings
  4. from django.core.management.base import BaseCommand, CommandError
  5. from django_extensions.management.utils import signalcommand
  6. class Command(BaseCommand):
  7. help = "Set parameters of the default django.contrib.sites Site"
  8. def add_arguments(self, parser):
  9. super().add_arguments(parser)
  10. parser.add_argument(
  11. '--name', dest='site_name', default=None,
  12. help='Use this as site name.'
  13. )
  14. parser.add_argument(
  15. '--domain', dest='site_domain', default=None,
  16. help='Use this as site domain.'
  17. )
  18. parser.add_argument(
  19. '--system-fqdn', dest='set_as_system_fqdn', default=False,
  20. action="store_true",
  21. help='Use the systems FQDN (Fully Qualified Domain Name) as name '
  22. 'and domain. Can be used in combination with --name'
  23. )
  24. @signalcommand
  25. def handle(self, *args, **options):
  26. if 'django.contrib.sites' not in settings.INSTALLED_APPS:
  27. raise CommandError('The sites framework is not installed.')
  28. from django.contrib.sites.models import Site
  29. try:
  30. site = Site.objects.get(pk=settings.SITE_ID)
  31. except Site.DoesNotExist:
  32. raise CommandError("Default site with pk=%s does not exist" %
  33. settings.SITE_ID)
  34. else:
  35. name = options["site_name"]
  36. domain = options["site_domain"]
  37. set_as_system_fqdn = options["set_as_system_fqdn"]
  38. if all([domain, set_as_system_fqdn]):
  39. raise CommandError(
  40. "The set_as_system_fqdn cannot be used with domain option.") # noqa
  41. if set_as_system_fqdn:
  42. domain = socket.getfqdn()
  43. if not domain:
  44. raise CommandError("Cannot find systems FQDN")
  45. if name is None:
  46. name = domain
  47. update_kwargs = {}
  48. if name and name != site.name:
  49. update_kwargs["name"] = name
  50. if domain and domain != site.domain:
  51. update_kwargs["domain"] = domain
  52. if update_kwargs:
  53. Site.objects.filter(
  54. pk=settings.SITE_ID).update(**update_kwargs)
  55. site = Site.objects.get(pk=settings.SITE_ID)
  56. print("Updated default site. You might need to restart django as sites are cached aggressively.")
  57. else:
  58. print("Nothing to update (need --name, --domain and/or --system-fqdn)")
  59. print("Default Site:")
  60. print("\tid = %s" % site.id)
  61. print("\tname = %s" % site.name)
  62. print("\tdomain = %s" % site.domain)