Renamed static ev directory to evennia_general
Removed defunct news app.
This commit is contained in:
parent
a34ddea236
commit
def97b58a8
18 changed files with 5 additions and 298 deletions
|
|
@ -569,7 +569,6 @@ INSTALLED_APPS = (
|
||||||
'src.comms',
|
'src.comms',
|
||||||
'src.help',
|
'src.help',
|
||||||
'src.scripts',
|
'src.scripts',
|
||||||
'src.web.news',
|
|
||||||
'src.web.webclient')
|
'src.web.webclient')
|
||||||
# The user profile extends the User object with more functionality;
|
# The user profile extends the User object with more functionality;
|
||||||
# This should usually not be changed.
|
# This should usually not be changed.
|
||||||
|
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
#
|
|
||||||
# This makes the news model visible in the admin web interface
|
|
||||||
# so one can add/edit/delete news items etc.
|
|
||||||
#
|
|
||||||
|
|
||||||
from django.contrib import admin
|
|
||||||
from src.web.news.models import NewsTopic, NewsEntry
|
|
||||||
|
|
||||||
class NewsTopicAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ('name', 'icon')
|
|
||||||
admin.site.register(NewsTopic, NewsTopicAdmin)
|
|
||||||
|
|
||||||
class NewsEntryAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ('title', 'author', 'topic', 'date_posted')
|
|
||||||
list_filter = ('topic',)
|
|
||||||
search_fields = ['title']
|
|
||||||
admin.site.register(NewsEntry, NewsEntryAdmin)
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
#
|
|
||||||
# This module implements a simple news entry system
|
|
||||||
# for the evennia website. One needs to use the
|
|
||||||
# admin interface to add/edit/delete entries.
|
|
||||||
#
|
|
||||||
|
|
||||||
from django.db import models
|
|
||||||
from django.contrib.auth import get_user_model
|
|
||||||
|
|
||||||
User = get_user_model()
|
|
||||||
|
|
||||||
class NewsTopic(models.Model):
|
|
||||||
"""
|
|
||||||
Represents a news topic.
|
|
||||||
"""
|
|
||||||
name = models.CharField(max_length=75, unique=True)
|
|
||||||
description = models.TextField(blank=True)
|
|
||||||
icon = models.ImageField(upload_to='newstopic_icons',
|
|
||||||
default='newstopic_icons/default.png',
|
|
||||||
blank=True, help_text="Image for the news topic.")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
try:
|
|
||||||
return self.name
|
|
||||||
except:
|
|
||||||
return "Invalid"
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
ordering = ['name']
|
|
||||||
|
|
||||||
class NewsEntry(models.Model):
|
|
||||||
"""
|
|
||||||
An individual news entry.
|
|
||||||
"""
|
|
||||||
author = models.ForeignKey(User, related_name='author')
|
|
||||||
title = models.CharField(max_length=255)
|
|
||||||
body = models.TextField()
|
|
||||||
topic = models.ForeignKey(NewsTopic, related_name='newstopic')
|
|
||||||
date_posted = models.DateTimeField(auto_now_add=True)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.title
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
ordering = ('-date_posted',)
|
|
||||||
verbose_name_plural = "News entries"
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
"""
|
|
||||||
This structures the url tree for the news application.
|
|
||||||
It is imported from the root handler, game.web.urls.py.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from django.conf.urls import *
|
|
||||||
|
|
||||||
urlpatterns = [
|
|
||||||
url(r'^show/(?P<entry_id>\d+)/$', 'show_news', name="show"),
|
|
||||||
url(r'^archive/$', 'news_archive', name="archive"),
|
|
||||||
url(r'^search/$', 'search_form', name="search"),
|
|
||||||
url(r'^search/results/$', 'search_results', name="search_results")]
|
|
||||||
|
|
@ -1,129 +0,0 @@
|
||||||
|
|
||||||
"""
|
|
||||||
This is a very simple news application, with most of the expected features
|
|
||||||
like news-categories/topics and searchable archives.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
from django.views.generic import ListView
|
|
||||||
from django.shortcuts import render_to_response, get_object_or_404
|
|
||||||
from django.template import RequestContext
|
|
||||||
from django.conf import settings
|
|
||||||
from django.http import HttpResponseRedirect
|
|
||||||
from django.contrib.auth.models import User
|
|
||||||
from django import forms
|
|
||||||
from django.db.models import Q
|
|
||||||
|
|
||||||
from src.web.news.models import NewsTopic, NewsEntry
|
|
||||||
|
|
||||||
# The sidebar text to be included as a variable on each page. There's got to
|
|
||||||
# be a better, cleaner way to include this on every page.
|
|
||||||
sidebar = """
|
|
||||||
<p class='doNotDisplay doNotPrint'>This page’s menu:</p>
|
|
||||||
<ul id='side-bar'>
|
|
||||||
<li><a href='/news/archive'>News Archive</a></li>
|
|
||||||
<li><a href='/news/search'>Search News</a></li>
|
|
||||||
</ul>
|
|
||||||
"""
|
|
||||||
|
|
||||||
class SearchForm(forms.Form):
|
|
||||||
"""
|
|
||||||
Class to represent a news search form under Django's newforms. This is used
|
|
||||||
to validate the input on the search_form view, as well as the search_results
|
|
||||||
view when we're picking the query out of GET. This makes searching safe
|
|
||||||
via the search form or by directly inputing values via GET key pairs.
|
|
||||||
"""
|
|
||||||
search_terms = forms.CharField(max_length=100, min_length=3, required=True)
|
|
||||||
|
|
||||||
def show_news(request, entry_id):
|
|
||||||
"""
|
|
||||||
Show an individual news entry. Display some basic information along with
|
|
||||||
the title and content.
|
|
||||||
"""
|
|
||||||
news_entry = get_object_or_404(NewsEntry, id=entry_id)
|
|
||||||
|
|
||||||
pagevars = {
|
|
||||||
"page_title": "News Entry",
|
|
||||||
"news_entry": news_entry,
|
|
||||||
"sidebar": sidebar
|
|
||||||
}
|
|
||||||
|
|
||||||
context_instance = RequestContext(request)
|
|
||||||
return render_to_response('news/show_entry.html', pagevars, context_instance)
|
|
||||||
|
|
||||||
def news_archive(request):
|
|
||||||
"""
|
|
||||||
Shows an archive of news entries.
|
|
||||||
|
|
||||||
TODO: Expand this a bit to allow filtering by month/year.
|
|
||||||
"""
|
|
||||||
news_entries = NewsEntry.objects.all().order_by('-date_posted')
|
|
||||||
# TODO: Move this to either settings.py or the SQL configuration.
|
|
||||||
entries_per_page = 15
|
|
||||||
|
|
||||||
pagevars = {
|
|
||||||
"page_title": "News Archive",
|
|
||||||
"browse_url": "/news/archive",
|
|
||||||
"sidebar": sidebar
|
|
||||||
}
|
|
||||||
view = ListView.as_view(queryset=news_entries)
|
|
||||||
return view(request, template_name='news/archive.html', \
|
|
||||||
extra_context=pagevars, paginate_by=entries_per_page)
|
|
||||||
|
|
||||||
def search_form(request):
|
|
||||||
"""
|
|
||||||
Render the news search form. Don't handle much validation at all. If the
|
|
||||||
user enters a search term that meets the minimum, send them on their way
|
|
||||||
to the results page.
|
|
||||||
"""
|
|
||||||
if request.method == 'GET':
|
|
||||||
# A GET request was sent to the search page, load the value and
|
|
||||||
# validate it.
|
|
||||||
search_form = SearchForm(request.GET)
|
|
||||||
if search_form.is_valid():
|
|
||||||
# If the input is good, send them to the results page with the
|
|
||||||
# query attached in GET variables.
|
|
||||||
return HttpResponseRedirect('/news/search/results/?search_terms='+ search_form.cleaned_data['search_terms'])
|
|
||||||
else:
|
|
||||||
# Brand new search, nothing has been sent just yet.
|
|
||||||
search_form = SearchForm()
|
|
||||||
|
|
||||||
pagevars = {
|
|
||||||
"page_title": "Search News",
|
|
||||||
"search_form": search_form,
|
|
||||||
"debug": settings.DEBUG,
|
|
||||||
"sidebar": sidebar
|
|
||||||
}
|
|
||||||
|
|
||||||
context_instance = RequestContext(request)
|
|
||||||
return render_to_response('news/search_form.html', pagevars, context_instance)
|
|
||||||
|
|
||||||
def search_results(request):
|
|
||||||
"""
|
|
||||||
Shows an archive of news entries. Use the generic news browsing template.
|
|
||||||
"""
|
|
||||||
# TODO: Move this to either settings.py or the SQL configuration.
|
|
||||||
entries_per_page = 15
|
|
||||||
|
|
||||||
# Load the form values from GET to validate against.
|
|
||||||
search_form = SearchForm(request.GET)
|
|
||||||
# You have to call is_valid() or cleaned_data won't be populated.
|
|
||||||
valid_search = search_form.is_valid()
|
|
||||||
# This is the safe data that we can pass to queries without huge worry of
|
|
||||||
# badStuff(tm).
|
|
||||||
cleaned_get = search_form.cleaned_data
|
|
||||||
|
|
||||||
# Perform searches that match the title and contents.
|
|
||||||
# TODO: Allow the user to specify what to match against and in what
|
|
||||||
# topics/categories.
|
|
||||||
news_entries = NewsEntry.objects.filter(Q(title__contains=cleaned_get['search_terms']) | Q(body__contains=cleaned_get['search_terms']))
|
|
||||||
|
|
||||||
pagevars = {
|
|
||||||
"game_name": settings.SERVERNAME,
|
|
||||||
"page_title": "Search Results",
|
|
||||||
"searchtext": cleaned_get['search_terms'],
|
|
||||||
"browse_url": "/news/search/results",
|
|
||||||
"sidebar": sidebar
|
|
||||||
}
|
|
||||||
view = ListView.as_view(queryset=news_entries)
|
|
||||||
return view(request, news_entries, template_name='news/archive.html', extra_context=pagevars, paginate_by=entries_per_page)
|
|
||||||
|
Before Width: | Height: | Size: 678 KiB After Width: | Height: | Size: 678 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
|
@ -9,12 +9,12 @@
|
||||||
<meta name="generator" content="haran" />
|
<meta name="generator" content="haran" />
|
||||||
|
|
||||||
{% if sidebar %}
|
{% if sidebar %}
|
||||||
<link rel="stylesheet" type="text/css" href="{% static "ev/css/prosimii-screen-alt.css" %}" media="screen" title="Prosimii (Sidebar)" />
|
<link rel="stylesheet" type="text/css" href="{% static "evennia_general/css/prosimii-screen-alt.css" %}" media="screen" title="Prosimii (Sidebar)" />
|
||||||
{% else %}
|
{% else %}
|
||||||
<link rel="stylesheet" type="text/css" href="{% static "ev/css/prosimii-screen.css" %}" media="screen" title="Prosimii" />
|
<link rel="stylesheet" type="text/css" href="{% static "evennia_general/css/prosimii-screen.css" %}" media="screen" title="Prosimii" />
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<link rel="stylesheet alternative" type="text/css" href="{% static "ev/css/prosimii-print.css" %}" media="screen" title="Print Preview" />
|
<link rel="stylesheet alternative" type="text/css" href="{% static "evennia_general/css/prosimii-print.css" %}" media="screen" title="Print Preview" />
|
||||||
<link rel="stylesheet" type="text/css" href="{% static "ev/css/prosimii-print.css" %}" media="print" />
|
<link rel="stylesheet" type="text/css" href="{% static "evennia_general/css/prosimii-print.css" %}" media="print" />
|
||||||
|
|
||||||
{% block header_ext %}
|
{% block header_ext %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="midHeader">
|
<div class="midHeader">
|
||||||
<img src="{% static "ev/images/evennia_logo_small.png" %}" align='left'/> <h1 class="headerTitle" lang="la">{{game_name}}</h1>
|
<img src="{% static "evennia_general/images/evennia_logo_small.png" %}" align='left'/> <h1 class="headerTitle" lang="la">{{game_name}}</h1>
|
||||||
<div class="headerSubTitle" title="Slogan">
|
<div class="headerSubTitle" title="Slogan">
|
||||||
<!-- Insert a slogan here if you want -->
|
<!-- Insert a slogan here if you want -->
|
||||||
{{game_slogan}}
|
{{game_slogan}}
|
||||||
|
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block header_ext %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block sidebar %}
|
|
||||||
{{sidebar|safe}}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<h1 id="alt-layout">{{page_title}}</h1>
|
|
||||||
|
|
||||||
<strong>Navigation:</strong> <a href="{{browse_url}}/?page=1&search_terms={{searchtext|urlencode}}">First</a> |
|
|
||||||
{% if has_previous %}
|
|
||||||
<a href="{{browse_url}}/?page={{previous}}&search_terms={{searchtext|urlencode}}">Prev</a>
|
|
||||||
{% else %}
|
|
||||||
Prev
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
| <em>{{page}}</em> of <em>{{pages}}</em> pages |
|
|
||||||
|
|
||||||
{% if has_next %}
|
|
||||||
<a href="{{browse_url}}/?page={{next}}&search_terms={{searchtext|urlencode}}">Next</a>
|
|
||||||
{% else %}
|
|
||||||
Next
|
|
||||||
{% endif %}
|
|
||||||
| <a href="{{browse_url}}/?page={{pages}}&search_terms={{searchtext|urlencode}}">Last</a>
|
|
||||||
|
|
||||||
{% for entry in object_list %}
|
|
||||||
<a href="/news/show/{{entry.id}}" class="newsHeading">{{entry.topic.name}}: {{entry.title}}</a>
|
|
||||||
<p class="newsDate">By {{entry.author.username}} on {{entry.date_posted|time}}</p>
|
|
||||||
<p class="newsSummary">{{entry.body|truncatewords:80}}</p>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<strong>Navigation:</strong> <a href="{{browse_url}}/?page=1&search_terms={{searchtext|urlencode}}">First</a> |
|
|
||||||
{% if has_previous %}
|
|
||||||
<a href="{{browse_url}}/?page={{previous}}&search_terms={{searchtext|urlencode}}">Prev</a>
|
|
||||||
{% else %}
|
|
||||||
Prev
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
| <em>{{page}}</em> of <em>{{pages}}</em> pages |
|
|
||||||
|
|
||||||
{% if has_next %}
|
|
||||||
<a href="{{browse_url}}/?page={{next}}&search_terms={{searchtext|urlencode}}">Next</a>
|
|
||||||
{% else %}
|
|
||||||
Next
|
|
||||||
{% endif %}
|
|
||||||
| <a href="{{browse_url}}/?page={{pages}}&search_terms={{searchtext|urlencode}}">Last</a>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block header_ext %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block sidebar %}
|
|
||||||
{{sidebar|safe}}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<h1 id="alt-layout">Search News</h1>
|
|
||||||
<p>Enter a search term or phrase to search by. Matches will be made against
|
|
||||||
news titles and their contents. Searches must be at least three characters
|
|
||||||
long.</p>
|
|
||||||
<form method="GET">
|
|
||||||
{{search_form.search_terms}}
|
|
||||||
<button type="Submit">Search</button>
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block header_ext %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block sidebar %}
|
|
||||||
{{sidebar|safe}}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<h1 id="alt-layout">{{news_entry.topic.name}}: {{news_entry.title}}</h1>
|
|
||||||
<p class="newsDate">By {{news_entry.author.username}} on {{news_entry.date_posted|time}}</p>
|
|
||||||
<p class="newsSummary">{{news_entry.body}}</p>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
@ -29,9 +29,6 @@ urlpatterns = [
|
||||||
url(r'^accounts/login', 'django.contrib.auth.views.login', name="login"),
|
url(r'^accounts/login', 'django.contrib.auth.views.login', name="login"),
|
||||||
url(r'^accounts/logout', 'django.contrib.auth.views.logout', name="logout"),
|
url(r'^accounts/logout', 'django.contrib.auth.views.logout', name="logout"),
|
||||||
|
|
||||||
# News stuff
|
|
||||||
# url(r'^news/', include('src.web.news.urls')),
|
|
||||||
|
|
||||||
# Page place-holder for things that aren't implemented yet.
|
# Page place-holder for things that aren't implemented yet.
|
||||||
url(r'^tbi/', 'src.web.views.to_be_implemented', name='to_be_implemented'),
|
url(r'^tbi/', 'src.web.views.to_be_implemented', name='to_be_implemented'),
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue