mirror of https://github.com/sgoudham/Enso-Bot.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.6 KiB
Python
147 lines
4.6 KiB
Python
5 years ago
|
from django.shortcuts import render_to_response
|
||
|
from django.template import RequestContext
|
||
|
from django.http import HttpResponse, HttpResponseRedirect, \
|
||
|
Http404, HttpResponseNotModified
|
||
|
from django.contrib import messages
|
||
|
from django.db.models import Count
|
||
|
|
||
|
from voice import settings
|
||
|
from voice.models import Feature
|
||
|
from voice.forms import VoteForm, FeatureForm
|
||
|
|
||
|
def index(request):
|
||
|
feature_id = None
|
||
|
form = VoteForm()
|
||
|
|
||
|
sort, features = features_by_sort(request.GET.get('sort', None))
|
||
|
|
||
|
grouped = []
|
||
|
group = []
|
||
|
for i, feature in enumerate(features):
|
||
|
group.append(feature)
|
||
|
if (i + 1) % 4 == 0:
|
||
|
grouped.append(group)
|
||
|
group = []
|
||
|
if len(group) > 0:
|
||
|
grouped.append(group)
|
||
|
|
||
|
context = RequestContext(request, {
|
||
|
'grouped_features': grouped,
|
||
|
'form': form,
|
||
|
'feature_id': feature_id,
|
||
|
'request': request,
|
||
|
'sort': sort,
|
||
|
})
|
||
|
|
||
|
return render_to_response('voice/index.html', context)
|
||
|
|
||
|
def feature(request, feature_id):
|
||
|
feature = Feature.objects.get(id=feature_id)
|
||
|
|
||
|
if request.method == 'POST':
|
||
|
form = VoteForm(request.POST)
|
||
|
if form.is_valid():
|
||
|
vote = form.save(commit=False)
|
||
|
vote.feature = feature
|
||
|
vote.save()
|
||
|
messages.success(request, 'Vote successfully submitted!')
|
||
|
else:
|
||
|
form = VoteForm()
|
||
|
|
||
|
context = RequestContext(request, {
|
||
|
'form': form,
|
||
|
'request': request,
|
||
|
'feature': feature,
|
||
|
})
|
||
|
|
||
|
return render_to_response('voice/feature.html', context)
|
||
|
|
||
|
def new_feature(request):
|
||
|
if request.method == 'POST':
|
||
|
form = FeatureForm(request.POST)
|
||
|
if form.is_valid():
|
||
|
feature = form.save(commit=False)
|
||
|
feature.votes_needed = settings.DEFAULT_VOTES_NEEDED
|
||
|
feature.save()
|
||
|
messages.success(request, 'Thanks for requesting a feature!')
|
||
|
form = FeatureForm()
|
||
|
else:
|
||
|
form = FeatureForm()
|
||
|
|
||
|
context = RequestContext(request, {
|
||
|
'form': form,
|
||
|
})
|
||
|
return render_to_response('voice/new_feature.html', context)
|
||
|
|
||
|
def admin(request):
|
||
|
sort, features = features_by_sort(request.GET.get('sort', None))
|
||
|
return render_to_response('voice/admin/index.html', {
|
||
|
'request': request,
|
||
|
'features': features,
|
||
|
'sort': sort,
|
||
|
})
|
||
|
|
||
|
def features_by_sort(sort):
|
||
|
if sort == 'newest':
|
||
|
features = Feature.objects.filter(state='V').order_by('-created')
|
||
|
elif sort == 'in-progress':
|
||
|
features = Feature.objects.filter(state='W')
|
||
|
elif sort == 'finished':
|
||
|
features = Feature.objects.filter(state='F')
|
||
|
else:
|
||
|
sort = 'popular'
|
||
|
features = Feature.objects.filter(state='V').annotate(
|
||
|
Count('votes')).order_by('-votes__count')
|
||
|
return (sort, features)
|
||
|
|
||
|
|
||
|
def static_media(request, path):
|
||
|
"""
|
||
|
Taken from django-sentry:
|
||
|
http://github.com/dcramer/django-sentry
|
||
|
|
||
|
Serve static files below a given point in the directory structure.
|
||
|
"""
|
||
|
from django.utils.http import http_date
|
||
|
from django.views.static import was_modified_since
|
||
|
import mimetypes
|
||
|
import os.path
|
||
|
import posixpath
|
||
|
import stat
|
||
|
import urllib
|
||
|
|
||
|
document_root = os.path.join(settings.ROOT, 'static')
|
||
|
print document_root
|
||
|
|
||
|
path = posixpath.normpath(urllib.unquote(path))
|
||
|
path = path.lstrip('/')
|
||
|
newpath = ''
|
||
|
for part in path.split('/'):
|
||
|
if not part:
|
||
|
# Strip empty path components.
|
||
|
continue
|
||
|
drive, part = os.path.splitdrive(part)
|
||
|
head, part = os.path.split(part)
|
||
|
if part in (os.curdir, os.pardir):
|
||
|
# Strip '.' and '..' in path.
|
||
|
continue
|
||
|
newpath = os.path.join(newpath, part).replace('\\', '/')
|
||
|
if newpath and path != newpath:
|
||
|
return HttpResponseRedirect(newpath)
|
||
|
fullpath = os.path.join(document_root, newpath)
|
||
|
if os.path.isdir(fullpath):
|
||
|
raise Http404("Directory indexes are not allowed here.")
|
||
|
if not os.path.exists(fullpath):
|
||
|
raise Http404('"%s" does not exist' % fullpath)
|
||
|
# Respect the If-Modified-Since header.
|
||
|
statobj = os.stat(fullpath)
|
||
|
mimetype = mimetypes.guess_type(fullpath)[0] or 'application/octet-stream'
|
||
|
if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'),
|
||
|
statobj[stat.ST_MTIME], statobj[stat.ST_SIZE]):
|
||
|
return HttpResponseNotModified(mimetype=mimetype)
|
||
|
contents = open(fullpath, 'rb').read()
|
||
|
response = HttpResponse(contents, mimetype=mimetype)
|
||
|
response["Last-Modified"] = http_date(statobj[stat.ST_MTIME])
|
||
|
response["Content-Length"] = len(contents)
|
||
|
return response
|