Initial work on #19591

This commit is contained in:
Jeremy Stretch 2025-07-21 08:18:06 -04:00
parent 4e0e4598b0
commit 6985169db6
6 changed files with 84 additions and 1 deletions

View File

@ -139,6 +139,10 @@ social-auth-app-django
# https://github.com/python-social-auth/social-core/blob/master/CHANGELOG.md
social-auth-core
# Image thumbnail generation
# https://github.com/jazzband/sorl-thumbnail/blob/master/CHANGES.rst
sorl-thumbnail
# Strawberry GraphQL
# https://github.com/strawberry-graphql/strawberry/blob/main/CHANGELOG.md
strawberry-graphql

View File

@ -686,6 +686,10 @@ def register_models(*models):
register_model_view(model, 'jobs', kwargs={'model': model})(
'netbox.views.generic.ObjectJobsView'
)
if issubclass(model, ImageAttachmentsMixin):
register_model_view(model, 'image-attachments', kwargs={'model': model})(
'netbox.views.generic.ObjectImageAttachmentsView'
)
if issubclass(model, SyncedDataMixin):
register_model_view(model, 'sync', kwargs={'model': model})(
'netbox.views.generic.ObjectSyncDataView'

View File

@ -424,6 +424,7 @@ INSTALLED_APPS = [
'mptt',
'rest_framework',
'social_django',
'sorl.thumbnail',
'taggit',
'timezone_field',
'core',

View File

@ -10,7 +10,7 @@ from django.views.generic import View
from core.models import Job, ObjectChange
from core.tables import JobTable, ObjectChangeTable
from extras.forms import JournalEntryForm
from extras.models import JournalEntry
from extras.models import ImageAttachment, JournalEntry
from extras.tables import JournalEntryTable
from tenancy.models import ContactAssignment
from tenancy.tables import ContactAssignmentTable
@ -25,6 +25,7 @@ __all__ = (
'BulkSyncDataView',
'ObjectChangeLogView',
'ObjectContactsView',
'ObjectImageAttachmentsView',
'ObjectJobsView',
'ObjectJournalView',
'ObjectSyncDataView',
@ -84,6 +85,52 @@ class ObjectChangeLogView(ConditionalLoginRequiredMixin, View):
})
class ObjectImageAttachmentsView(ConditionalLoginRequiredMixin, View):
"""
Render a list of all Job assigned to an object. For example:
path(
'data-sources/<int:pk>/jobs/',
ObjectJobsView.as_view(),
name='datasource_jobs',
kwargs={'model': DataSource}
)
Attributes:
base_template: The name of the template to extend. If not provided, "{app}/{model}.html" will be used.
"""
base_template = None
tab = ViewTab(
label=_('Images'),
# badge=lambda obj: obj.imageattachments.count(),
permission='extras.view_imageattachment',
weight=6000
)
def get_object(self, request, **kwargs):
return get_object_or_404(self.model.objects.restrict(request.user, 'view'), **kwargs)
def get(self, request, model, **kwargs):
self.model = model
obj = self.get_object(request, **kwargs)
image_attachments = ImageAttachment.objects.filter(
object_type=ContentType.objects.get_for_model(obj),
object_id=obj.pk,
)
# Default to using "<app>/<model>.html" as the template, if it exists. Otherwise,
# fall back to using base.html.
if self.base_template is None:
self.base_template = f"{model._meta.app_label}/{model._meta.model_name}.html"
return render(request, 'extras/object_imageattachments.html', {
'object': obj,
'image_attachments': image_attachments,
'base_template': self.base_template,
'tab': self.tab,
})
class ObjectJournalView(ConditionalLoginRequiredMixin, View):
"""
Show all journal entries for an object. The model class must be passed as a keyword argument when referencing this

View File

@ -0,0 +1,26 @@
{% extends base_template %}
{% load render_table from django_tables2 %}
{% load thumbnail %}
{% block content %}
<div class="container">
<div class="row row-cards">
{% for object in image_attachments %}
<div class="col">
<div class="card card-sm">
{% thumbnail object.image "200x200" crop="center" as tn %}
<a href="{{ object.get_absolute_url }}" class="d-block">
<img src="{{ tn.url }}" width="{{ tn.width }}" height="{{ tn.height }}" class="card-img-top" />
</a>
{% endthumbnail %}
<div class="card-body p-1">
<div class="text-center">
<small class="text-secondary">{{ object }}</small>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@ -33,6 +33,7 @@ requests==2.32.4
rq==2.4.0
social-auth-app-django==5.5.1
social-auth-core==4.7.0
sorl-thumbnail==12.11.0
strawberry-graphql==0.276.0
strawberry-graphql-django==0.60.0
svgwrite==1.4.3