Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/core/jinja2/core/artwork_detail.jinja2
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{% extends '/core/base.jinja2' %}
{% block content %}
<div class="Container">
<h1>{{ artwork.title }}</h1>
<p>{{ _("Author") }}: {{ artwork.author }}</p>
{% if artwork.marker %}
<p>{{ _("Marker") }}: <a href="{{ artwork.marker.get_absolute_url() }}">{{ artwork.marker.title }}</a></p>
{% endif %}
{% if artwork.augmented %}
<p>{{ _("Object") }}: <a href="{{ artwork.augmented.get_absolute_url() }}">{{ artwork.augmented.title }}</a></p>
{% endif %}
<p>{{ _("Uploaded") }}: {{ artwork.uploaded_at }}</p>
</div>
{% endblock %}
11 changes: 11 additions & 0 deletions src/core/jinja2/core/marker_detail.jinja2
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{% extends '/core/base.jinja2' %}
{% block content %}
<div class="Container">
<h1>{{ marker.title }}</h1>
<p>{{ _("Author") }}: {{ marker.author }}</p>
{% if marker.source %}
<img src="/media/public/{{ marker.source.name }}" alt="{{ marker.title }}" style="max-width: 100%;">
{% endif %}
<p>{{ _("Uploaded") }}: {{ marker.uploaded_at }}</p>
</div>
{% endblock %}
14 changes: 14 additions & 0 deletions src/core/jinja2/core/object_detail.jinja2
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{% extends '/core/base.jinja2' %}
{% block content %}
<div class="Container">
<h1>{{ object.title }}</h1>
<p>{{ _("Author") }}: {{ object.author }}</p>
{% if object.source %}
<video src="/media/public/{{ object.source.name }}" controls style="max-width: 100%;"></video>
{% endif %}
{% if object.thumbnail %}
<img src="{{ object.thumbnail.url }}" alt="{{ object.title }}" style="max-width: 100%;">
{% endif %}
<p>{{ _("Uploaded") }}: {{ object.uploaded_at }}</p>
</div>
{% endblock %}
28 changes: 28 additions & 0 deletions src/core/migrations/0028_add_slug_to_marker_object_artwork.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated manually to add slug fields to Marker, Object, and Artwork models

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('core', '0027_sound_soundevent_remove_artwork_insert_insert_and_more'),
]

operations = [
migrations.AddField(
model_name='marker',
name='slug',
field=models.SlugField(blank=True, max_length=80, unique=True),
),
migrations.AddField(
model_name='object',
name='slug',
field=models.SlugField(blank=True, max_length=80, unique=True),
),
migrations.AddField(
model_name='artwork',
name='slug',
field=models.SlugField(blank=True, max_length=80, unique=True),
),
]
46 changes: 46 additions & 0 deletions src/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from django.db.models.signals import post_delete
from django.dispatch import receiver
from django.urls import reverse
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _
from django_extensions.db.models import TimeStampedModel
from fast_html import a, audio, b, div, h1, img, p, render, span, video
Expand Down Expand Up @@ -219,10 +220,22 @@ class Marker(TimeStampedModel, ContentMixin):

# Save the file size of the Marker, so we avoid making requests to S3 / MinIO to check for it.
file_size = models.IntegerField(default=0, blank=True, null=True)
slug = models.SlugField(unique=True, blank=True, max_length=80)

def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.title) or "marker"
slug = base_slug
counter = 1
while Marker.objects.filter(slug=slug).exclude(pk=self.pk).exists():
slug = f"{base_slug}-{counter}"
counter += 1
self.slug = slug
super().save(*args, **kwargs)

def get_absolute_url(self):
return reverse("marker-detail", kwargs={"slug": self.slug})

def __str__(self):
return self.source.name

Expand Down Expand Up @@ -321,6 +334,21 @@ class Object(TimeStampedModel, ContentMixin):
blank=True,
null=True,
)
slug = models.SlugField(unique=True, blank=True, max_length=80)

def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.title) or "object"
slug = base_slug
counter = 1
while Object.objects.filter(slug=slug).exclude(pk=self.pk).exists():
slug = f"{base_slug}-{counter}"
counter += 1
self.slug = slug
super().save(*args, **kwargs)

def get_absolute_url(self):
return reverse("object-detail", kwargs={"slug": self.slug})

def __str__(self):
return self.source.name
Expand Down Expand Up @@ -433,6 +461,21 @@ class Artwork(TimeStampedModel, ContentMixin):
scale_y = models.FloatField(default=1.0)
position_x = models.FloatField(default=0.0)
position_y = models.FloatField(default=0.0)
slug = models.SlugField(unique=True, blank=True, max_length=80)

def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.title) or "artwork"
slug = base_slug
counter = 1
while Artwork.objects.filter(slug=slug).exclude(pk=self.pk).exists():
slug = f"{base_slug}-{counter}"
counter += 1
self.slug = slug
super().save(*args, **kwargs)

Comment on lines +468 to +476

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of using this counter in a while. If it conflicts with an existing slug, use directly the ID which is unique, not a counter in a while

def get_absolute_url(self):
return reverse("artwork-detail", kwargs={"slug": self.slug})

@property
def exhibits_count(self):
Expand Down Expand Up @@ -515,6 +558,9 @@ class Exhibit(TimeStampedModel, ContentMixin, models.Model):
def __str__(self):
return self.name

def get_absolute_url(self):
return reverse("exhibit", kwargs={"slug": self.slug})

@property
def artworks_count(self):
return self.artworks.count()
Expand Down
6 changes: 6 additions & 0 deletions src/core/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
service_worker,
)
from core.views.views import (
artwork_detail,
artwork_preview,
collection,
create_artwork,
Expand All @@ -29,8 +30,10 @@
exhibit_detail,
exhibit_select,
get_element,
marker_detail,
marker_preview,
marker_upload,
object_detail,
object_upload,
related_content,
see_all,
Expand All @@ -41,6 +44,7 @@
path("", home_new, name="home"),
path("arviewer/", home_old, name="home-old"),
path("artwork/", artwork_preview, name="artwork-preview"),
path("artworks/<slug:slug>/", artwork_detail, name="artwork-detail"),
path("artworks/create/", create_artwork, name="create-artwork"),
path("artworks/edit/", edit_artwork, name="edit-artwork"),
path("collection/", collection, name="collection"),
Expand All @@ -55,8 +59,10 @@
path("exhibits/edit-mr/", create_or_edit_mr_exhibit, name="edit-mr-exhibit"),
path("generator/", marker_generator, name="marker-generator"),
path("marker/", marker_preview, name="marker-preview"),
path("markers/<slug:slug>/", marker_detail, name="marker-detail"),
path("markers/edit/", edit_marker, name="edit-marker"),
path("markers/upload/", marker_upload, name="marker-upload"),
path("objects/<slug:slug>/", object_detail, name="object-detail"),
path("objects/edit/", edit_object, name="edit-object"),
path("objects/upload/", object_upload, name="object-upload"),
path("sounds/edit/", edit_sound, name="edit-sound"),
Expand Down
21 changes: 21 additions & 0 deletions src/core/views/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,27 @@ def artwork_preview(request):
return render(request, "core/exhibit.jinja2", ctx)


@require_http_methods(["GET"])
def marker_detail(request, slug):
marker = get_object_or_404(Marker, slug=slug)
ctx = {"marker": marker}
return render(request, "core/marker_detail.jinja2", ctx)


@require_http_methods(["GET"])
def object_detail(request, slug):
obj = get_object_or_404(Object, slug=slug)
ctx = {"object": obj}
return render(request, "core/object_detail.jinja2", ctx)


@require_http_methods(["GET"])
def artwork_detail(request, slug):
artwork = get_object_or_404(Artwork, slug=slug)
ctx = {"artwork": artwork}
return render(request, "core/artwork_detail.jinja2", ctx)


@login_required
def get_element(request):
if request.htmx:
Expand Down
Loading