mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
* WIP * WIP * Add git sync * Fix file hashing * Add last_synced to DataSource * Build out UI & API resources * Add status field to DataSource * Add UI control to sync data source * Add API endpoint to sync data sources * Fix display of DataSource job results * DataSource password should be write-only * General cleanup * Add data file UI view * Punt on HTTP, FTP support for now * Add DataSource URL validation * Add HTTP proxy support to git fetcher * Add management command to sync data sources * DataFile REST API endpoints should be read-only * Refactor fetch methods into backend classes * Replace auth & git branch fields with general-purpose parameters * Fix last_synced time * Render discrete form fields for backend parameters * Enable dynamic edit form for DataSource * Register DataBackend classes in application registry * Add search indexers for DataSource, DataFile * Add single & bulk delete views for DataFile * Add model documentation * Convert DataSource to a primary model * Introduce pre_sync & post_sync signals * Clean up migrations * Rename url to source_url * Clean up filtersets * Add API & filterset tests * Add view tests * Add initSelect() to HTMX refresh handler * Render DataSourceForm fieldsets dynamically * Update compiled static resources
93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
import code
|
|
import platform
|
|
import sys
|
|
|
|
from django import get_version
|
|
from django.apps import apps
|
|
from django.conf import settings
|
|
from django.contrib.auth.models import User
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.core.management.base import BaseCommand
|
|
|
|
APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'wireless')
|
|
|
|
BANNER_TEXT = """### NetBox interactive shell ({node})
|
|
### Python {python} | Django {django} | NetBox {netbox}
|
|
### lsmodels() will show available models. Use help(<model>) for more info.""".format(
|
|
node=platform.node(),
|
|
python=platform.python_version(),
|
|
django=get_version(),
|
|
netbox=settings.VERSION
|
|
)
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Start the Django shell with all NetBox models already imported"
|
|
django_models = {}
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
'-c', '--command',
|
|
help='Python code to execute (instead of starting an interactive shell)',
|
|
)
|
|
|
|
def _lsmodels(self):
|
|
for app, models in self.django_models.items():
|
|
app_name = apps.get_app_config(app).verbose_name
|
|
print(f'{app_name}:')
|
|
for m in models:
|
|
print(f' {m}')
|
|
|
|
def get_namespace(self):
|
|
namespace = {}
|
|
|
|
# Gather Django models and constants from each app
|
|
for app in APPS:
|
|
self.django_models[app] = []
|
|
|
|
# Load models from each app
|
|
for model in apps.get_app_config(app).get_models():
|
|
namespace[model.__name__] = model
|
|
self.django_models[app].append(model.__name__)
|
|
|
|
# Constants
|
|
try:
|
|
app_constants = sys.modules[f'{app}.constants']
|
|
for name in dir(app_constants):
|
|
namespace[name] = getattr(app_constants, name)
|
|
except KeyError:
|
|
pass
|
|
|
|
# Additional objects to include
|
|
namespace['ContentType'] = ContentType
|
|
namespace['User'] = User
|
|
|
|
# Load convenience commands
|
|
namespace.update({
|
|
'lsmodels': self._lsmodels,
|
|
})
|
|
|
|
return namespace
|
|
|
|
def handle(self, **options):
|
|
namespace = self.get_namespace()
|
|
|
|
# If Python code has been passed, execute it and exit.
|
|
if options['command']:
|
|
exec(options['command'], namespace)
|
|
return
|
|
|
|
# Try to enable tab-complete
|
|
try:
|
|
import readline
|
|
import rlcompleter
|
|
except ModuleNotFoundError:
|
|
pass
|
|
else:
|
|
readline.set_completer(rlcompleter.Completer(namespace).complete)
|
|
readline.parse_and_bind('tab: complete')
|
|
|
|
# Run interactive shell
|
|
shell = code.interact(banner=BANNER_TEXT, local=namespace)
|
|
return shell
|