Просмотр исходного кода

Remove the old JobResult model

jeremystretch 2 лет назад
Родитель
Сommit
82080ef491
2 измененных файлов с 17 добавлено и 195 удалено
  1. 16 0
      netbox/extras/migrations/0092_delete_jobresult.py
  2. 1 195
      netbox/extras/models/models.py

+ 16 - 0
netbox/extras/migrations/0092_delete_jobresult.py

@@ -0,0 +1,16 @@
+# Generated by Django 4.1.7 on 2023-03-27 17:31
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('extras', '0091_create_managedfiles'),
+    ]
+
+    operations = [
+        migrations.DeleteModel(
+            name='JobResult',
+        ),
+    ]

+ 1 - 195
netbox/extras/models/models.py

@@ -1,18 +1,15 @@
 import json
 import json
-import uuid
 
 
-import django_rq
 from django.conf import settings
 from django.conf import settings
 from django.contrib import admin
 from django.contrib import admin
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
 from django.contrib.contenttypes.fields import GenericForeignKey
 from django.contrib.contenttypes.fields import GenericForeignKey
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes.models import ContentType
 from django.core.cache import cache
 from django.core.cache import cache
-from django.core.validators import MinValueValidator, ValidationError
+from django.core.validators import ValidationError
 from django.db import models
 from django.db import models
 from django.http import HttpResponse, QueryDict
 from django.http import HttpResponse, QueryDict
 from django.urls import reverse
 from django.urls import reverse
-from django.urls.exceptions import NoReverseMatch
 from django.utils import timezone
 from django.utils import timezone
 from django.utils.formats import date_format
 from django.utils.formats import date_format
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
@@ -22,14 +19,11 @@ from extras.choices import *
 from extras.conditions import ConditionSet
 from extras.conditions import ConditionSet
 from extras.constants import *
 from extras.constants import *
 from extras.utils import FeatureQuery, image_upload
 from extras.utils import FeatureQuery, image_upload
-from netbox.config import get_config
-from netbox.constants import RQ_QUEUE_DEFAULT
 from netbox.models import ChangeLoggedModel
 from netbox.models import ChangeLoggedModel
 from netbox.models.features import (
 from netbox.models.features import (
     CloningMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, SyncedDataMixin, TagsMixin,
     CloningMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, SyncedDataMixin, TagsMixin,
 )
 )
 from utilities.querysets import RestrictedQuerySet
 from utilities.querysets import RestrictedQuerySet
-from utilities.rqworker import get_queue_for_model
 from utilities.utils import render_jinja2
 from utilities.utils import render_jinja2
 
 
 __all__ = (
 __all__ = (
@@ -37,7 +31,6 @@ __all__ = (
     'CustomLink',
     'CustomLink',
     'ExportTemplate',
     'ExportTemplate',
     'ImageAttachment',
     'ImageAttachment',
-    'JobResult',
     'JournalEntry',
     'JournalEntry',
     'SavedFilter',
     'SavedFilter',
     'Webhook',
     'Webhook',
@@ -583,193 +576,6 @@ class JournalEntry(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ExportTemplat
         return JournalEntryKindChoices.colors.get(self.kind)
         return JournalEntryKindChoices.colors.get(self.kind)
 
 
 
 
-class JobResult(models.Model):
-    """
-    This model stores the results from running a user-defined report.
-    """
-    name = models.CharField(
-        max_length=255
-    )
-    obj_type = models.ForeignKey(
-        to=ContentType,
-        related_name='job_results',
-        verbose_name='Object types',
-        limit_choices_to=FeatureQuery('jobs'),
-        help_text=_("The object type to which this job result applies"),
-        on_delete=models.CASCADE,
-    )
-    created = models.DateTimeField(
-        auto_now_add=True
-    )
-    scheduled = models.DateTimeField(
-        null=True,
-        blank=True
-    )
-    interval = models.PositiveIntegerField(
-        blank=True,
-        null=True,
-        validators=(
-            MinValueValidator(1),
-        ),
-        help_text=_("Recurrence interval (in minutes)")
-    )
-    started = models.DateTimeField(
-        null=True,
-        blank=True
-    )
-    completed = models.DateTimeField(
-        null=True,
-        blank=True
-    )
-    user = models.ForeignKey(
-        to=User,
-        on_delete=models.SET_NULL,
-        related_name='+',
-        blank=True,
-        null=True
-    )
-    status = models.CharField(
-        max_length=30,
-        choices=JobResultStatusChoices,
-        default=JobResultStatusChoices.STATUS_PENDING
-    )
-    data = models.JSONField(
-        null=True,
-        blank=True
-    )
-    job_id = models.UUIDField(
-        unique=True
-    )
-
-    objects = RestrictedQuerySet.as_manager()
-
-    class Meta:
-        ordering = ['-created']
-
-    def __str__(self):
-        return str(self.job_id)
-
-    def delete(self, *args, **kwargs):
-        super().delete(*args, **kwargs)
-
-        rq_queue_name = get_config().QUEUE_MAPPINGS.get(self.obj_type.model, RQ_QUEUE_DEFAULT)
-        queue = django_rq.get_queue(rq_queue_name)
-        job = queue.fetch_job(str(self.job_id))
-
-        if job:
-            job.cancel()
-
-    def get_absolute_url(self):
-        try:
-            return reverse(f'extras:{self.obj_type.model}_result', args=[self.pk])
-        except NoReverseMatch:
-            return None
-
-    def get_status_color(self):
-        return JobResultStatusChoices.colors.get(self.status)
-
-    @property
-    def duration(self):
-        if not self.completed:
-            return None
-
-        start_time = self.started or self.created
-
-        if not start_time:
-            return None
-
-        duration = self.completed - start_time
-        minutes, seconds = divmod(duration.total_seconds(), 60)
-
-        return f"{int(minutes)} minutes, {seconds:.2f} seconds"
-
-    def start(self):
-        """
-        Record the job's start time and update its status to "running."
-        """
-        if self.started is not None:
-            return
-
-        # Start the job
-        self.started = timezone.now()
-        self.status = JobResultStatusChoices.STATUS_RUNNING
-        JobResult.objects.filter(pk=self.pk).update(started=self.started, status=self.status)
-
-        # Handle webhooks
-        self.trigger_webhooks(event=EVENT_JOB_START)
-
-    def terminate(self, status=JobResultStatusChoices.STATUS_COMPLETED):
-        """
-        Mark the job as completed, optionally specifying a particular termination status.
-        """
-        valid_statuses = JobResultStatusChoices.TERMINAL_STATE_CHOICES
-        if status not in valid_statuses:
-            raise ValueError(f"Invalid status for job termination. Choices are: {', '.join(valid_statuses)}")
-
-        # Mark the job as completed
-        self.status = status
-        self.completed = timezone.now()
-        JobResult.objects.filter(pk=self.pk).update(status=self.status, completed=self.completed)
-
-        # Handle webhooks
-        self.trigger_webhooks(event=EVENT_JOB_END)
-
-    @classmethod
-    def enqueue_job(cls, func, name, obj_type, user, schedule_at=None, interval=None, *args, **kwargs):
-        """
-        Create a JobResult instance and enqueue a job using the given callable
-
-        Args:
-            func: The callable object to be enqueued for execution
-            name: Name for the JobResult instance
-            obj_type: ContentType to link to the JobResult instance obj_type
-            user: User object to link to the JobResult instance
-            schedule_at: Schedule the job to be executed at the passed date and time
-            interval: Recurrence interval (in minutes)
-        """
-        rq_queue_name = get_queue_for_model(obj_type.model)
-        queue = django_rq.get_queue(rq_queue_name)
-        status = JobResultStatusChoices.STATUS_SCHEDULED if schedule_at else JobResultStatusChoices.STATUS_PENDING
-        job_result: JobResult = JobResult.objects.create(
-            name=name,
-            status=status,
-            obj_type=obj_type,
-            scheduled=schedule_at,
-            interval=interval,
-            user=user,
-            job_id=uuid.uuid4()
-        )
-
-        if schedule_at:
-            queue.enqueue_at(schedule_at, func, job_id=str(job_result.job_id), job_result=job_result, **kwargs)
-        else:
-            queue.enqueue(func, job_id=str(job_result.job_id), job_result=job_result, **kwargs)
-
-        return job_result
-
-    def trigger_webhooks(self, event):
-        rq_queue_name = get_config().QUEUE_MAPPINGS.get('webhook', RQ_QUEUE_DEFAULT)
-        rq_queue = django_rq.get_queue(rq_queue_name, is_async=False)
-
-        # Fetch any webhooks matching this object type and action
-        webhooks = Webhook.objects.filter(
-            **{f'type_{event}': True},
-            content_types=self.obj_type,
-            enabled=True
-        )
-
-        for webhook in webhooks:
-            rq_queue.enqueue(
-                "extras.webhooks_worker.process_webhook",
-                webhook=webhook,
-                model_name=self.obj_type.model,
-                event=event,
-                data=self.data,
-                timestamp=str(timezone.now()),
-                username=self.user.username
-            )
-
-
 class ConfigRevision(models.Model):
 class ConfigRevision(models.Model):
     """
     """
     An atomic revision of NetBox's configuration.
     An atomic revision of NetBox's configuration.