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
42 lines
1.6 KiB
Python
42 lines
1.6 KiB
Python
from django.core.management.base import BaseCommand, CommandError
|
|
|
|
from core.models import DataSource
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Synchronize a data source from its remote upstream"
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('name', nargs='*', help="Data source(s) to synchronize")
|
|
parser.add_argument(
|
|
"--all", action='store_true', dest='sync_all',
|
|
help="Synchronize all data sources"
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
|
|
# Find DataSources to sync
|
|
if options['sync_all']:
|
|
datasources = DataSource.objects.all()
|
|
elif options['name']:
|
|
datasources = DataSource.objects.filter(name__in=options['name'])
|
|
# Check for invalid names
|
|
found_names = {ds['name'] for ds in datasources.values('name')}
|
|
if invalid_names := set(options['name']) - found_names:
|
|
raise CommandError(f"Invalid data source names: {', '.join(invalid_names)}")
|
|
else:
|
|
raise CommandError(f"Must specify at least one data source, or set --all.")
|
|
|
|
if len(options['name']) > 1:
|
|
self.stdout.write(f"Syncing {len(datasources)} data sources.")
|
|
|
|
for i, datasource in enumerate(datasources, start=1):
|
|
self.stdout.write(f"[{i}] Syncing {datasource}... ", ending='')
|
|
self.stdout.flush()
|
|
datasource.sync()
|
|
self.stdout.write(datasource.get_status_display())
|
|
self.stdout.flush()
|
|
|
|
if len(options['name']) > 1:
|
|
self.stdout.write(f"Finished.")
|