Adds generic CharacterListView and unit test.

This commit is contained in:
Johnny 2018-10-28 22:12:29 +00:00
parent 4b51e78d00
commit 287d7a999c
5 changed files with 87 additions and 0 deletions

View file

@ -29,6 +29,7 @@ folder and edit it to add/remove links to the menu.
<a class="nav-link" href="https://github.com/evennia/evennia/wiki/Evennia-Introduction/">About</a>
</li>
<li><a class="nav-link" href="https://github.com/evennia/evennia/wiki">Documentation</a></li>
<li><a class="nav-link" href="{% url 'characters' %}">Characters</a></li>
{% if user.is_staff %}
<li><a class="nav-link" href="{% url 'admin:index' %}">Admin</a></li>
{% endif %}

View file

@ -0,0 +1,27 @@
{% extends "base.html" %}
{% block titleblock %}
{{ view.page_title }}
{% endblock %}
{% block content %}
{% load addclass %}
<div class="row">
<div class="col">
<div class="card">
<div class="card-body">
<h1 class="card-title">{{ view.page_title }}</h1>
<hr />
<ul>
{% for object in object_list %}
<li><a href="{{ object.web_get_detail_url }}">{{ object }}</a></li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -158,6 +158,10 @@ class CharacterPuppetView(EvenniaWebTest):
response = self.client.get(reverse(self.url_name, kwargs=kwargs), follow=True)
self.assertTrue(response.status_code >= 400, "Invalid access should return a 4xx code-- either obj not found or permission denied! (Returned %s)" % response.status_code)
class CharacterListView(EvenniaWebTest):
url_name = 'characters'
unauthenticated_response = 302
class CharacterManageView(EvenniaWebTest):
url_name = 'character-manage'
unauthenticated_response = 302

View file

@ -21,6 +21,7 @@ urlpatterns = [
url(r'^help/(?P<category>[\w\d\-]+)/(?P<topic>[\w\d\-]+)/$', website_views.HelpDetailView.as_view(), name="help-entry-detail"),
# Character management
url(r'^characters/$', website_views.CharacterListView.as_view(), name="characters"),
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<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterDetailView.as_view(), name="character-detail"),

View file

@ -576,6 +576,42 @@ class CharacterMixin(TypeclassMixin):
return self.typeclass.objects.filter(id__in=ids).order_by(Lower('db_key'))
class CharacterListView(LoginRequiredMixin, CharacterMixin, ListView):
"""
This view provides a mechanism by which a logged-in player can view a list
of all other characters.
This view requires authentication by default as a nominal effort to prevent
human stalkers and automated bots/scrapers from harvesting data on your users.
"""
# -- Django constructs --
template_name = 'website/character_list.html'
paginate_by = 100
# -- Evennia constructs --
page_title = 'Character List'
access_type = 'view'
def get_queryset(self):
"""
This method will override the Django get_queryset method to return a
list of all characters (filtered/sorted) instead of just those limited
to the account.
Returns:
queryset (QuerySet): Django queryset for use in the given view.
"""
account = self.request.user
# Return a queryset consisting of characters the user is allowed to
# see.
ids = [obj.id for obj in self.model.objects.all() if obj.access(account, self.access_type)]
return self.model.objects.filter(id__in=ids).order_by(Lower('db_key'))
class CharacterPuppetView(LoginRequiredMixin, CharacterMixin, RedirectView, ObjectDetailView):
"""
This view provides a mechanism by which a logged-in player can "puppet" one
@ -653,6 +689,24 @@ class CharacterDetailView(CharacterMixin, ObjectDetailView):
# -- Evennia constructs --
# What attributes to display for this object
attributes = ['name', 'desc']
access_type = 'view'
def get_queryset(self):
"""
This method will override the Django get_queryset method to return a
list of all characters the user may access.
Returns:
queryset (QuerySet): Django queryset for use in the given view.
"""
account = self.request.user
# Return a queryset consisting of characters the user is allowed to
# see.
ids = [obj.id for obj in self.model.objects.all() if obj.access(account, self.access_type)]
return self.model.objects.filter(id__in=ids).order_by(Lower('db_key'))
class CharacterDeleteView(CharacterMixin, ObjectDeleteView):