-
-
-
-
-

List

-
+
+
+
+
+

{{ view.page_title }}

+
-
    - {% for object in object_list %} -
  • {{ object }}
  • - {% endfor %} -
- -
+
    + {% for object in object_list %} +
  • {{ object }}
  • + {% endfor %} +
+
From 337a477985fe6013718882dd12276472f08e46fe Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 27 Oct 2018 11:07:25 +0000 Subject: [PATCH 12/15] Implements HelpViews. --- .../web/website/templates/website/_menu.html | 5 +- .../templates/website/help_detail.html | 86 +++++++++++++ .../website/templates/website/help_list.html | 110 ++++++++++++++++ evennia/web/website/urls.py | 6 +- evennia/web/website/views.py | 117 +++++++++++++++--- 5 files changed, 308 insertions(+), 16 deletions(-) create mode 100644 evennia/web/website/templates/website/help_detail.html create mode 100644 evennia/web/website/templates/website/help_list.html diff --git a/evennia/web/website/templates/website/_menu.html b/evennia/web/website/templates/website/_menu.html index 18fc6ec3a5..32c17db361 100644 --- a/evennia/web/website/templates/website/_menu.html +++ b/evennia/web/website/templates/website/_menu.html @@ -29,7 +29,10 @@ folder and edit it to add/remove links to the menu. About
  • Documentation
  • -
  • Admin Interface
  • + {% if user.is_staff %} +
  • Admin
  • + {% endif %} +
  • Help
  • {% if webclient_enabled %}
  • Play Online
  • {% endif %} diff --git a/evennia/web/website/templates/website/help_detail.html b/evennia/web/website/templates/website/help_detail.html new file mode 100644 index 0000000000..ea3310f352 --- /dev/null +++ b/evennia/web/website/templates/website/help_detail.html @@ -0,0 +1,86 @@ +{% extends "base.html" %} + +{% block titleblock %} +{{ view.page_title }} ({{ object|title }}) +{% endblock %} + +{% block content %} + +{% load addclass %} +
    +
    + + +
    +
    +

    {{ view.page_title }} ({{ object|title }})

    +
    + +
    + +
    + +
    +

    {{ entry_text|safe }}

    + + {% if topic_previous or topic_next %} +
    + + + + {% endif %} + +
    + + + +
    + + {% if request.user.is_staff %} + + Edit + +
    + {% endif %} + +
    +
    {{ object.db_help_category|title }}
    + + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +{% endblock %} diff --git a/evennia/web/website/templates/website/help_list.html b/evennia/web/website/templates/website/help_list.html new file mode 100644 index 0000000000..00ee2f1df0 --- /dev/null +++ b/evennia/web/website/templates/website/help_list.html @@ -0,0 +1,110 @@ +{% extends "base.html" %} + +{% block titleblock %} +{{ view.page_title }} +{% endblock %} + +{% block content %} + +{% load addclass %} +
    +
    +
    +
    +

    {{ view.page_title }}

    +
    + +
    +
    + {% regroup object_list by help_category as category_list %} + + {% if category_list %} + +
    + + +
    +
    +

    The {{ game_name }} Compendium

    +

    This section of the site is your guide to learning all about {{ game_name }}-- its rules, its setting, its people, customs, classes, castes, conflicts, races, religions, lore and more!

    +

    It is organized first by category, then by topic. The box to the right will let you skip to particular categories.

    +
    +
    +
    + + + +
    + {% for help_category in category_list %} +
    {{ help_category.grouper|title }}
    + + {% endfor %} + +
    + +
    + + + +
    + {% if user.is_staff %} + + Create New + +
    + {% endif %} + +
    +
    Category Index
    + + + +
    +
    + + {% else %} + {% if user.is_staff %} +
    + +
    + {% endif %} + +
    + +
    + {% endif %} + +
    +
    +
    +
    +
    +
    +{% endblock %} diff --git a/evennia/web/website/urls.py b/evennia/web/website/urls.py index 4a24beb472..f254cbaaae 100644 --- a/evennia/web/website/urls.py +++ b/evennia/web/website/urls.py @@ -13,8 +13,12 @@ urlpatterns = [ url(r'^tbi/', website_views.to_be_implemented, name='to_be_implemented'), # User Authentication (makes login/logout url names available) - url(r'^auth/', include('django.contrib.auth.urls')), url(r'^auth/register', website_views.AccountCreateView.as_view(), name="register"), + url(r'^auth/', include('django.contrib.auth.urls')), + + # Help Topics + url(r'^help/$', website_views.HelpListView.as_view(), name="help"), + url(r'^help/(?P[\w\d\-]+)/(?P[\w\d\-]+)/$', website_views.HelpDetailView.as_view(), name="help-entry-detail"), # Character management url(r'^characters/create/$', website_views.CharacterCreateView.as_view(), name="character-create"), diff --git a/evennia/web/website/views.py b/evennia/web/website/views.py index 98c53e977a..d7aae357be 100644 --- a/evennia/web/website/views.py +++ b/evennia/web/website/views.py @@ -512,7 +512,7 @@ class AccountMixin(object): form_class = AccountForm -class AccountCreateView(AccountMixin, ObjectCreateView): +class AccountCreateView(AccountMixin, EvenniaCreateView): """ Account creation view. @@ -729,7 +729,7 @@ class CharacterCreateView(CharacterMixin, ObjectCreateView): # # Help views # -#from evennia.help.models import HelpEntry + class HelpMixin(object): """ This is a "mixin", a modifier of sorts. @@ -741,27 +741,36 @@ class HelpMixin(object): # -- Django constructs -- model = HelpEntry + # -- Evennia constructs -- + page_title = 'Help' + def get_queryset(self): """ Django hook; here we want to return a list of only those HelpEntries - that the current user is allowed to see. + and other documentation that the current user is allowed to see. Returns: queryset (QuerySet): List of Help entries available to the user. """ + account = self.request.user + # Get list of all HelpEntries - entries = HelpEntry.objects.all() + entries = self.model.objects.all().iterator() # Now figure out which ones the current user is allowed to see - bucket = [] - for entry in entries: - if entry.access(self.request.user, 'view'): - bucket.append(entry.id) - - # Re-query to just get those - entries = HelpEntry.objects.filter(id__in=bucket) - return entries + bucket = [entry.id for entry in entries if entry.access(account, 'view')] + + # Re-query and set a sorted list + filtered = self.model.objects.filter( + id__in=bucket + ).order_by( + Lower('db_key') + ).order_by( + Lower('db_help_category') + ) + + return filtered class HelpListView(HelpMixin, ListView): """ @@ -770,5 +779,85 @@ class HelpListView(HelpMixin, ListView): """ # -- Django constructs -- - paginate_by = 10 - template_name = 'website/object_list.html' \ No newline at end of file + paginate_by = 500 + template_name = 'website/help_list.html' + + # -- Evennia constructs -- + page_title = "Help Index" + +class HelpDetailView(HelpMixin, EvenniaDetailView): + """ + Returns the detail page for a given help entry. + + """ + # -- Django constructs -- + template_name = 'website/help_detail.html' + + def get_context_data(self, **kwargs): + """ + Adds navigational data to the template to let browsers go to the next + or previous entry in the help list. + + Returns: + context (dict): Django context object + + """ + context = super(HelpDetailView, self).get_context_data(**kwargs) + + # Get the object in question + obj = self.get_object() + + # Get queryset and filter out non-related categories + queryset = self.get_queryset().filter(db_help_category=obj.db_help_category).order_by(Lower('db_key')) + context['topic_list'] = queryset + + # Find the index position of the given obj in the queryset + objs = list(queryset) + for i, x in enumerate(objs): + if obj is x: + break + + # Find the previous and next topics, if either exist + try: + assert i+1 <= len(objs) and objs[i+1] is not obj + context['topic_next'] = objs[i+1] + except: context['topic_next'] = None + + try: + assert i-1 >= 0 and objs[i-1] is not obj + context['topic_previous'] = objs[i-1] + except: context['topic_previous'] = None + + # Format the help entry using HTML instead of newlines + text = obj.db_entrytext + text = text.replace('\r\n\r\n', '\n\n') + text = text.replace('\r\n', '\n') + text = text.replace('\n', '
    ') + context['entry_text'] = text + + return context + + def get_object(self, queryset=None): + """ + Override of Django hook that retrieves an object by category and topic + instead of pk and slug. + + Returns: + entry (HelpEntry): HelpEntry requested in the URL. + + """ + # Get the queryset for the help entries the user can access + if not queryset: + queryset = self.get_queryset() + + # Find the object in the queryset + category = slugify(self.kwargs.get('category', '')) + topic = slugify(self.kwargs.get('topic', '')) + obj = next((x for x in queryset if slugify(x.db_help_category)==category and slugify(x.db_key)==topic), None) + + # Check if this object was requested in a valid manner + if not obj: + raise HttpResponseBadRequest(u"No %(verbose_name)s found matching the query" % + {'verbose_name': queryset.model._meta.verbose_name}) + + return obj \ No newline at end of file From 7aff3ecc62f0f7e09d10ff5002a6aee7b79f8b1c Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 27 Oct 2018 11:07:54 +0000 Subject: [PATCH 13/15] Fixes bug with register view because of improper scrubbing. --- evennia/web/website/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evennia/web/website/forms.py b/evennia/web/website/forms.py index 022d819cbe..66c5224914 100644 --- a/evennia/web/website/forms.py +++ b/evennia/web/website/forms.py @@ -32,7 +32,7 @@ class EvenniaForm(forms.Form): cleaned = {k:escape(v) for k,v in cleaned.items()} return cleaned -class AccountForm(EvenniaForm, UserCreationForm): +class AccountForm(UserCreationForm): """ This is a generic Django form tailored to the Account model. From 7b1565ee348c0074b84a0446659115519d3a5005 Mon Sep 17 00:00:00 2001 From: Johnny Date: Sat, 27 Oct 2018 11:42:30 +0000 Subject: [PATCH 14/15] Corrects unit test check (registerview should always return 200 regardless of authentication) --- evennia/web/website/tests.py | 1 - 1 file changed, 1 deletion(-) diff --git a/evennia/web/website/tests.py b/evennia/web/website/tests.py index f2b321b652..69b570b1b7 100644 --- a/evennia/web/website/tests.py +++ b/evennia/web/website/tests.py @@ -78,7 +78,6 @@ class IndexTest(EvenniaWebTest): class RegisterTest(EvenniaWebTest): url_name = 'register' - unauthenticated_response = 302 class LoginTest(EvenniaWebTest): url_name = 'login' From 35e2ab6485bb47a65c3178bb4280d336d7995823 Mon Sep 17 00:00:00 2001 From: Johnny Date: Sun, 28 Oct 2018 08:13:51 +0000 Subject: [PATCH 15/15] Makes intro text less verbose. --- evennia/web/website/templates/website/help_list.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/evennia/web/website/templates/website/help_list.html b/evennia/web/website/templates/website/help_list.html index 00ee2f1df0..12751731f7 100644 --- a/evennia/web/website/templates/website/help_list.html +++ b/evennia/web/website/templates/website/help_list.html @@ -27,8 +27,7 @@
    -

    The {{ game_name }} Compendium

    -

    This section of the site is your guide to learning all about {{ game_name }}-- its rules, its setting, its people, customs, classes, castes, conflicts, races, religions, lore and more!

    +

    This section of the site is a guide to understanding the mechanics behind {{ game_name }}.

    It is organized first by category, then by topic. The box to the right will let you skip to particular categories.