diff --git a/ram/bookshelf/admin.py b/ram/bookshelf/admin.py index 011b6e0..5c297b8 100644 --- a/ram/bookshelf/admin.py +++ b/ram/bookshelf/admin.py @@ -139,4 +139,4 @@ class CatalogAdmin(SortableAdminBase, admin.ModelAdmin): @admin.display(description="Scales") def get_scales(self, obj): - return ", ".join(s.scale for s in obj.scales.all()) + return "/".join(s.scale for s in obj.scales.all()) diff --git a/ram/bookshelf/models.py b/ram/bookshelf/models.py index af0643e..83c32c9 100644 --- a/ram/bookshelf/models.py +++ b/ram/bookshelf/models.py @@ -54,9 +54,6 @@ class BaseBook(BaseModel): Tag, related_name="bookshelf", blank=True ) - def get_absolute_url(self): - return reverse("book", kwargs={"uuid": self.uuid}) - def delete(self, *args, **kwargs): shutil.rmtree( os.path.join( @@ -110,6 +107,9 @@ class Book(BaseBook): def publisher_name(self): return self.publisher.name + def get_absolute_url(self): + return reverse("book", kwargs={"uuid": self.uuid}) + class Catalog(BaseBook): manufacturer = models.ForeignKey( @@ -127,3 +127,6 @@ class Catalog(BaseBook): def __str__(self): scales = "/".join([s.scale for s in self.scales.all()]) return "%s %s %s" % (self.manufacturer.name, self.years, scales) + + def get_absolute_url(self): + return reverse("catalog", kwargs={"uuid": self.uuid}) diff --git a/ram/portal/templates/bookshelf/bookshelf_menu.html b/ram/portal/templates/bookshelf/bookshelf_menu.html index 2c6ab5f..52ce111 100644 --- a/ram/portal/templates/bookshelf/bookshelf_menu.html +++ b/ram/portal/templates/bookshelf/bookshelf_menu.html @@ -5,6 +5,7 @@ {% endif %} diff --git a/ram/portal/templatetags/show_menu.py b/ram/portal/templatetags/show_menu.py index 44cf520..951a7ba 100644 --- a/ram/portal/templatetags/show_menu.py +++ b/ram/portal/templatetags/show_menu.py @@ -1,13 +1,15 @@ from django import template from portal.models import Flatpage -from bookshelf.models import Book +from bookshelf.models import Book, Catalog register = template.Library() @register.inclusion_tag('bookshelf/bookshelf_menu.html') def show_bookshelf_menu(): - return {"bookshelf_menu": Book.objects.exists()} + return { + "bookshelf_menu": (Book.objects.exists() or Catalog.objects.exists()) + } @register.inclusion_tag('flatpages/flatpages_menu.html') diff --git a/ram/portal/urls.py b/ram/portal/urls.py index 0b27cf4..be996c1 100644 --- a/ram/portal/urls.py +++ b/ram/portal/urls.py @@ -15,6 +15,8 @@ from portal.views import ( Types, Books, GetBook, + Catalogs, + GetCatalog, SearchObjects, ) @@ -98,6 +100,21 @@ urlpatterns = [ name="books_pagination" ), path("bookshelf/book/", GetBook.as_view(), name="book"), + path( + "bookshelf/catalogs", + Catalogs.as_view(template="bookshelf/books.html"), + name="catalogs" + ), + path( + "bookshelf/catalogs/page/", + Catalogs.as_view(template="bookshelf/books.html"), + name="catalogs_pagination" + ), + path( + "bookshelf/catalog/", + GetCatalog.as_view(), + name="catalog" + ), path( "search", SearchObjects.as_view(http_method_names=["post"]), diff --git a/ram/portal/views.py b/ram/portal/views.py index fbe4ca1..5edca3d 100644 --- a/ram/portal/views.py +++ b/ram/portal/views.py @@ -15,7 +15,7 @@ from portal.utils import get_site_conf from portal.models import Flatpage from roster.models import RollingStock from consist.models import Consist -from bookshelf.models import Book +from bookshelf.models import Book, Catalog from metadata.models import ( Company, Manufacturer, @@ -536,6 +536,34 @@ class GetBook(View): ) +class Catalogs(GetData): + title = "Catalogs" + item_type = "book" + + def get_data(self, request): + return Catalog.objects.get_published(request.user).all() + + +class GetCatalog(View): + def get(self, request, uuid): + try: + catalog = Catalog.objects.get_published(request.user).get(uuid=uuid) + except ObjectDoesNotExist: + raise Http404 + + catalog_properties = catalog.property.get_public(request.user) + return render( + request, + "bookshelf/book.html", + { + "title": catalog, + "catalog_properties": catalog_properties, + "book": catalog, + }, + ) + + + class GetFlatpage(View): def get(self, request, flatpage): try: