From 2d23bda9a6a2964a608969b6fc611dbbb5ed5ae1 Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 26 Oct 2018 00:15:48 +0000 Subject: [PATCH] Adds a generic object detail view. --- evennia/web/website/urls.py | 1 + evennia/web/website/views.py | 39 +++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/evennia/web/website/urls.py b/evennia/web/website/urls.py index 9076046dff..4a24beb472 100644 --- a/evennia/web/website/urls.py +++ b/evennia/web/website/urls.py @@ -19,6 +19,7 @@ urlpatterns = [ # Character management url(r'^characters/create/$', website_views.CharacterCreateView.as_view(), name="character-create"), url(r'^characters/manage/$', website_views.CharacterManageView.as_view(), name="character-manage"), + url(r'^characters/detail/(?P[\w\d\-]+)/(?P[0-9]+)/$', website_views.CharacterDetailView.as_view(), name="character-detail"), url(r'^characters/puppet/(?P[\w\d\-]+)/(?P[0-9]+)/$', website_views.CharacterPuppetView.as_view(), name="character-puppet"), url(r'^characters/update/(?P[\w\d\-]+)/(?P[0-9]+)/$', website_views.CharacterUpdateView.as_view(), name="character-update"), url(r'^characters/delete/(?P[\w\d\-]+)/(?P[0-9]+)/$', website_views.CharacterDeleteView.as_view(), name="character-delete"), diff --git a/evennia/web/website/views.py b/evennia/web/website/views.py index a993a8258e..43febb5a6b 100644 --- a/evennia/web/website/views.py +++ b/evennia/web/website/views.py @@ -5,6 +5,8 @@ the other applications. Views are django's way of processing e.g. html templates on the fly. """ +from collections import OrderedDict + from django.contrib.admin.sites import site from django.conf import settings from django.contrib import messages @@ -155,6 +157,12 @@ class EvenniaCreateView(CreateView): @property def page_title(self): return 'Create %s' % self.model._meta.verbose_name.title() + +class EvenniaDetailView(DetailView): + + @property + def page_title(self): + return '%s Detail' % self.model._meta.verbose_name.title() class EvenniaUpdateView(UpdateView): @@ -172,10 +180,36 @@ class EvenniaDeleteView(DeleteView): # Object views # -class ObjectDetailView(DetailView): +class ObjectDetailView(EvenniaDetailView): model = class_from_module(settings.BASE_OBJECT_TYPECLASS) access_type = 'view' + template_name = 'website/object_detail.html' + attributes = ['name', 'desc'] + + def get_context_data(self, **kwargs): + """ + Adds an 'attributes' list to the context consisting of the attributes + specified at the class level, in the order provided. + + Django views do not provide a way to reference dynamic attributes, so + we have to grab them all before we render the template. + + """ + context = super(ObjectDetailView, self).get_context_data(**kwargs) + + obj = self.get_object() + attribute_list = OrderedDict() + + for attribute in self.attributes: + if attribute in self.model._meta._property_names: + attribute_list[attribute.title()] = getattr(obj, attribute, '') + else: + attribute_list[attribute.title()] = getattr(obj.db, attribute, '') + + context['attribute_list'] = attribute_list + + return context def get_object(self, queryset=None): """ @@ -357,6 +391,9 @@ class CharacterUpdateView(CharacterMixin, ObjectUpdateView): form_class = CharacterUpdateForm template_name = 'website/character_form.html' +class CharacterDetailView(CharacterMixin, ObjectDetailView): + pass + class CharacterDeleteView(CharacterMixin, ObjectDeleteView): pass