commit
612c672ff6
5 changed files with 100 additions and 6 deletions
|
|
@ -25,15 +25,23 @@ folder and edit it to add/remove links to the menu.
|
||||||
<li>
|
<li>
|
||||||
<a class="nav-link" href="{% url 'index' %}">Home</a>
|
<a class="nav-link" href="{% url 'index' %}">Home</a>
|
||||||
</li>
|
</li>
|
||||||
|
<!-- evennia documentation -->
|
||||||
<li>
|
<li>
|
||||||
<a class="nav-link" href="https://github.com/evennia/evennia/wiki/Evennia-Introduction/">About</a>
|
<a class="nav-link" href="https://github.com/evennia/evennia/wiki/Evennia-Introduction/">About</a>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="nav-link" href="https://github.com/evennia/evennia/wiki">Documentation</a></li>
|
<li><a class="nav-link" href="https://github.com/evennia/evennia/wiki">Documentation</a></li>
|
||||||
|
<!-- end evennia documentation -->
|
||||||
|
|
||||||
|
<!-- game views -->
|
||||||
|
<li><a class="nav-link" href="{% url 'characters' %}">Characters</a></li>
|
||||||
<li><a class="nav-link" href="{% url 'channels' %}">Channels</a></li>
|
<li><a class="nav-link" href="{% url 'channels' %}">Channels</a></li>
|
||||||
<li><a class="nav-link" href="{% url 'help' %}">Help</a></li>
|
<li><a class="nav-link" href="{% url 'help' %}">Help</a></li>
|
||||||
|
<!-- end game views -->
|
||||||
|
|
||||||
{% if webclient_enabled %}
|
{% if webclient_enabled %}
|
||||||
<li><a class="nav-link" href="{% url 'webclient:index' %}">Play Online</a></li>
|
<li><a class="nav-link" href="{% url 'webclient:index' %}">Play Online</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if user.is_staff %}
|
{% if user.is_staff %}
|
||||||
<li><a class="nav-link" href="{% url 'admin:index' %}">Admin</a></li>
|
<li><a class="nav-link" href="{% url 'admin:index' %}">Admin</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
||||||
27
evennia/web/website/templates/website/character_list.html
Normal file
27
evennia/web/website/templates/website/character_list.html
Normal 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 %}
|
||||||
|
|
@ -191,6 +191,10 @@ class CharacterPuppetView(EvenniaWebTest):
|
||||||
response = self.client.get(reverse(self.url_name, kwargs=kwargs), follow=True)
|
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)
|
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):
|
class CharacterManageView(EvenniaWebTest):
|
||||||
url_name = 'character-manage'
|
url_name = 'character-manage'
|
||||||
unauthenticated_response = 302
|
unauthenticated_response = 302
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ urlpatterns = [
|
||||||
url(r'^channels/(?P<slug>[\w\d\-]+)/$', website_views.ChannelDetailView.as_view(), name="channel-detail"),
|
url(r'^channels/(?P<slug>[\w\d\-]+)/$', website_views.ChannelDetailView.as_view(), name="channel-detail"),
|
||||||
|
|
||||||
# Character management
|
# 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/create/$', website_views.CharacterCreateView.as_view(), name="character-create"),
|
||||||
url(r'^characters/manage/$', website_views.CharacterManageView.as_view(), name="character-manage"),
|
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"),
|
url(r'^characters/detail/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterDetailView.as_view(), name="character-detail"),
|
||||||
|
|
|
||||||
|
|
@ -577,6 +577,42 @@ class CharacterMixin(TypeclassMixin):
|
||||||
return self.typeclass.objects.filter(id__in=ids).order_by(Lower('db_key'))
|
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.typeclass.objects.all() if obj.access(account, self.access_type)]
|
||||||
|
|
||||||
|
return self.typeclass.objects.filter(id__in=ids).order_by(Lower('db_key'))
|
||||||
|
|
||||||
|
|
||||||
class CharacterPuppetView(LoginRequiredMixin, CharacterMixin, RedirectView, ObjectDetailView):
|
class CharacterPuppetView(LoginRequiredMixin, CharacterMixin, RedirectView, ObjectDetailView):
|
||||||
"""
|
"""
|
||||||
This view provides a mechanism by which a logged-in player can "puppet" one
|
This view provides a mechanism by which a logged-in player can "puppet" one
|
||||||
|
|
@ -654,6 +690,24 @@ class CharacterDetailView(CharacterMixin, ObjectDetailView):
|
||||||
# -- Evennia constructs --
|
# -- Evennia constructs --
|
||||||
# What attributes to display for this object
|
# What attributes to display for this object
|
||||||
attributes = ['name', 'desc']
|
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.typeclass.objects.all() if obj.access(account, self.access_type)]
|
||||||
|
|
||||||
|
return self.typeclass.objects.filter(id__in=ids).order_by(Lower('db_key'))
|
||||||
|
|
||||||
|
|
||||||
class CharacterDeleteView(CharacterMixin, ObjectDeleteView):
|
class CharacterDeleteView(CharacterMixin, ObjectDeleteView):
|
||||||
|
|
@ -718,7 +772,7 @@ class CharacterCreateView(CharacterMixin, ObjectCreateView):
|
||||||
# Channel views
|
# Channel views
|
||||||
#
|
#
|
||||||
|
|
||||||
class ChannelMixin(object):
|
class ChannelMixin(TypeclassMixin):
|
||||||
"""
|
"""
|
||||||
This is a "mixin", a modifier of sorts.
|
This is a "mixin", a modifier of sorts.
|
||||||
|
|
||||||
|
|
@ -748,13 +802,13 @@ class ChannelMixin(object):
|
||||||
account = self.request.user
|
account = self.request.user
|
||||||
|
|
||||||
# Get list of all Channels
|
# Get list of all Channels
|
||||||
channels = self.model.objects.all().iterator()
|
channels = self.typeclass.objects.all().iterator()
|
||||||
|
|
||||||
# Now figure out which ones the current user is allowed to see
|
# Now figure out which ones the current user is allowed to see
|
||||||
bucket = [channel.id for channel in channels if channel.access(account, 'listen')]
|
bucket = [channel.id for channel in channels if channel.access(account, 'listen')]
|
||||||
|
|
||||||
# Re-query and set a sorted list
|
# Re-query and set a sorted list
|
||||||
filtered = self.model.objects.filter(
|
filtered = self.typeclass.objects.filter(
|
||||||
id__in=bucket
|
id__in=bucket
|
||||||
).order_by(
|
).order_by(
|
||||||
Lower('db_key')
|
Lower('db_key')
|
||||||
|
|
@ -880,7 +934,7 @@ class ChannelDetailView(ChannelMixin, ObjectDetailView):
|
||||||
# Help views
|
# Help views
|
||||||
#
|
#
|
||||||
|
|
||||||
class HelpMixin(object):
|
class HelpMixin(TypeclassMixin):
|
||||||
"""
|
"""
|
||||||
This is a "mixin", a modifier of sorts.
|
This is a "mixin", a modifier of sorts.
|
||||||
|
|
||||||
|
|
@ -906,13 +960,13 @@ class HelpMixin(object):
|
||||||
account = self.request.user
|
account = self.request.user
|
||||||
|
|
||||||
# Get list of all HelpEntries
|
# Get list of all HelpEntries
|
||||||
entries = self.model.objects.all().iterator()
|
entries = self.typeclass.objects.all().iterator()
|
||||||
|
|
||||||
# Now figure out which ones the current user is allowed to see
|
# Now figure out which ones the current user is allowed to see
|
||||||
bucket = [entry.id for entry in entries if entry.access(account, 'view')]
|
bucket = [entry.id for entry in entries if entry.access(account, 'view')]
|
||||||
|
|
||||||
# Re-query and set a sorted list
|
# Re-query and set a sorted list
|
||||||
filtered = self.model.objects.filter(
|
filtered = self.typeclass.objects.filter(
|
||||||
id__in=bucket
|
id__in=bucket
|
||||||
).order_by(
|
).order_by(
|
||||||
Lower('db_key')
|
Lower('db_key')
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue