Commit 15ceff77 authored by eliott's avatar eliott
Browse files

Modified render_template and renamed it to render_response (consistent with

archweb_pub conventions).
Moved pkgmaint_guide to a template.
parent d1cc0f54
......@@ -2,7 +2,7 @@
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.core import validators
from archweb_dev.utils import render_template
from archweb_dev.utils import render_response
from archweb_dev.packages.models import Package
from archweb_dev.todolists.models import Todolist, TodolistPkg
from archweb_dev.settings import DATA_DIR
......@@ -11,57 +11,58 @@
@login_required
def index(request):
try:
thismaint = User.objects.get(username=request.user.username)
except User.DoesNotExist:
# weird, we don't have a maintainer record for this logged-in user
thismaint = None
try:
thismaint = User.objects.get(username=request.user.username)
except User.DoesNotExist:
# weird, we don't have a maintainer record for this logged-in user
thismaint = None
# get a list of incomplete package todo lists
todos = Todolist.objects.get_incomplete()
# get flagged-package stats for all maintainers
stats = Package.objects.get_flag_stats()
if thismaint:
# get list of flagged packages for this maintainer
pkgs = Package.objects.filter(maintainer=thismaint.id).filter(needupdate=True).order_by('repo', 'pkgname')
else:
pkgs = None
# get a list of incomplete package todo lists
todos = Todolist.objects.get_incomplete()
# get flagged-package stats for all maintainers
stats = Package.objects.get_flag_stats()
if thismaint:
# get list of flagged packages for this maintainer
pkgs = Package.objects.filter(maintainer=thismaint.id).filter(needupdate=True).order_by('repo', 'pkgname')
else:
pkgs = None
return render_template('devel/index.html', request,
{'stats':stats, 'pkgs':pkgs, 'todos':todos, 'maint':thismaint})
return render_response(request, 'devel/index.html',
{'stats':stats, 'pkgs':pkgs, 'todos':todos, 'maint':thismaint})
@login_required
#@is_maintainer
def change_notify(request):
maint = User.objects.get(username=request.user.username)
notify = request.POST.get('notify', 'no')
try:
maint.get_profile().notify = notify == 'yes'
except UserProfile.DoesNotExist:
UserProfile(user_id=maint.id ,notify=notify == 'yes').save()
maint.get_profile().save()
return HttpResponseRedirect('/devel/')
maint = User.objects.get(username=request.user.username)
notify = request.POST.get('notify', 'no')
try:
maint.get_profile().notify = notify == 'yes'
except UserProfile.DoesNotExist:
UserProfile(user_id=maint.id ,notify=notify == 'yes').save()
maint.get_profile().save()
return HttpResponseRedirect('/devel/')
@login_required
def change_profile(request):
errors = {}
if request.POST:
passwd1, passwd2 = request.POST['passwd'], request.POST['passwd2']
email = request.POST['email']
# validate
if passwd1 != passwd2:
errors['password'] = [' Passwords do not match. ']
validate(errors, 'Email', email, validators.isValidEmail, False, request)
# apply changes
if not errors:
request.user.email = email
if passwd1:
request.user.set_password(passwd1)
request.user.save()
return HttpResponseRedirect('/devel/')
return render_template('devel/profile.html', request, {'errors':errors,'email':request.user.email})
errors = {}
if request.POST:
passwd1, passwd2 = request.POST['passwd'], request.POST['passwd2']
email = request.POST['email']
# validate
if passwd1 != passwd2:
errors['password'] = [' Passwords do not match. ']
validate(errors, 'Email', email, validators.isValidEmail, False, request)
# apply changes
if not errors:
request.user.email = email
if passwd1:
request.user.set_password(passwd1)
request.user.save()
return HttpResponseRedirect('/devel/')
return render_response(request, 'devel/profile.html', {'errors':errors,'email':request.user.email})
@login_required
def guide(request):
return HttpResponse(file(DATA_DIR + '/pkgmaint_guide.txt').read(),
mimetype='text/plain')
return render_response(request, 'devel/pkgmaint_guide.txt', {'errors':errors,'email':request.user.email})
return HttpResponse(file(DATA_DIR + '/pkgmaint_guide.txt').read(),
mimetype='text/plain')
from django.core import validators
from django.conf import settings
from django.core.cache import cache
from django.shortcuts import render_to_response
from django.template import RequestContext
def validate(errdict, fieldname, fieldval, validator, blankallowed, request):
"""
A helper function that allows easy access to Django's validators without
going through a Manipulator object. Will return a dict of all triggered
errors.
"""
if blankallowed and not fieldval:
return
alldata = ' '.join(request.POST.values()) + ' '.join(request.GET.values())
try:
validator(fieldval, alldata)
except validators.ValidationError, e:
if not errdict.has_key(fieldname):
errdict[fieldname] = []
errdict[fieldname].append(e)
def prune_cache(django_page_url):
if not settings.CACHE:
return
cache_prefix = 'views.decorators.cache.cache_page.'
cache_prefix += settings.CACHE_MIDDLEWARE_KEY_PREFIX + '.'
cache_postfix = '.d41d8cd98f00b204e9800998ecf8427e'
cache.delete('%s%s%s' % (cache_prefix,django_page_url,cache_postfix))
def render_response(req, *args, **kwargs):
kwargs['context_instance'] = RequestContext(req)
return render_to_response(*args, **kwargs)
......@@ -3,80 +3,80 @@
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth.models import User
from django import forms
from archweb_dev.utils import render_template
from archweb_dev.lib.utils import render_response
from archweb_dev.news.models import News
from datetime import date
def view(request, newsid):
news = get_object_or_404(News, id=newsid)
return render_template('news/view.html', request, {'news':news})
news = get_object_or_404(News, id=newsid)
return render_response(request, 'news/view.html', {'news':news})
def list(request):
news = News.objects.order_by('-postdate', '-id')
return render_template('news/list.html', request, {'news':news})
news = News.objects.order_by('-postdate', '-id')
return render_response(request, 'news/list.html', {'news':news})
@user_passes_test(lambda u: u.has_perm('news.add_news'))
def add(request):
try:
m = User.objects.get(username=request.user.username)
except User.DoesNotExist:
return render_template('error_page.html', request,
{'errmsg': 'Cannot find a maintainer record for you! No posting allowed.'})
try:
m = User.objects.get(username=request.user.username)
except User.DoesNotExist:
return render_response(request, 'error_page.html',
{'errmsg': 'Cannot find a maintainer record for you! No posting allowed.'})
manipulator = News.AddManipulator()
if request.POST:
data = request.POST.copy()
# add in the author ID
data['author'] = m.id
errors = manipulator.get_validation_errors(data)
if not errors:
manipulator.do_html2python(data)
manipulator.save(data)
return HttpResponseRedirect('/news/')
else:
errors = {}
data = {}
manipulator = News.AddManipulator()
if request.POST:
data = request.POST.copy()
# add in the author ID
data['author'] = m.id
errors = manipulator.get_validation_errors(data)
if not errors:
manipulator.do_html2python(data)
manipulator.save(data)
return HttpResponseRedirect('/news/')
else:
errors = {}
data = {}
form = forms.FormWrapper(manipulator, data, errors)
return render_template('news/add.html', request, {'form': form})
form = forms.FormWrapper(manipulator, data, errors)
return render_response(request, 'news/add.html', {'form': form})
@user_passes_test(lambda u: u.has_perm('news.delete_news'))
def delete(request, newsid):
news = get_object_or_404(News, id=newsid)
#if news.author.id != request.user.id:
# return render_template('error_page.html', request, {'errmsg': 'You do not own this news item'})
if request.POST:
news.delete()
return HttpResponseRedirect('/news/')
return render_template('news/delete.html', request)
news = get_object_or_404(News, id=newsid)
#if news.author.id != request.user.id:
# return render_response(request, 'error_page.html', {'errmsg': 'You do not own this news item'})
if request.POST:
news.delete()
return HttpResponseRedirect('/news/')
return render_response(request, 'news/delete.html')
@user_passes_test(lambda u: u.has_perm('news.change_news'))
def edit(request, newsid):
try:
m = User.objects.get(username=request.user.username)
except User.DoesNotExist:
return render_template('error_page.html', request,
{'errmsg': 'Cannot find a maintainer record for you! No posting allowed.'})
try:
manipulator = News.ChangeManipulator(newsid)
except News.DoesNotExist:
raise Http404
try:
m = User.objects.get(username=request.user.username)
except User.DoesNotExist:
return render_response(request, 'error_page.html',
{'errmsg': 'Cannot find a maintainer record for you! No posting allowed.'})
try:
manipulator = News.ChangeManipulator(newsid)
except News.DoesNotExist:
raise Http404
news = manipulator.original_object
# if news.author != m:
# return render_template('error_page.html', request, {'errmsg': 'You do not own this news item'})
if request.POST:
data = request.POST.copy()
# add in the author ID
data['author'] = news.author.id
errors = manipulator.get_validation_errors(data)
if not errors:
manipulator.do_html2python(data)
manipulator.save(data)
return HttpResponseRedirect('/news/')
else:
errors = {}
data = news.__dict__
news = manipulator.original_object
# if news.author != m:
# return render_response(request, 'error_page.html', {'errmsg': 'You do not own this news item'})
if request.POST:
data = request.POST.copy()
# add in the author ID
data['author'] = news.author.id
errors = manipulator.get_validation_errors(data)
if not errors:
manipulator.do_html2python(data)
manipulator.save(data)
return HttpResponseRedirect('/news/')
else:
errors = {}
data = news.__dict__
form = forms.FormWrapper(manipulator, data, errors)
return render_template('news/add.html', request, {'form': form, 'news':news})
form = forms.FormWrapper(manipulator, data, errors)
return render_response(request, 'news/add.html', {'form': form, 'news':news})
......@@ -5,168 +5,168 @@
from django.core import validators
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from archweb_dev.utils import validate, render_template
from archweb_dev.lib.utils import validate, render_response
from datetime import datetime
from archweb_dev.packages.models import Package, PackageFile, Repo, Category
def update(request):
if request.POST.has_key('adopt'):
mode = 'adopt'
message = 'Adoption was successful'
if request.POST.has_key('disown'):
mode = 'disown'
message = 'Disown was successful'
try:
maint = User.objects.get(username=request.user.username)
except User.DoesNotExist:
return render_template('error_page.html', request, {'errmsg':'No maintainer record found! Are you a maintainer?'})
ids = request.POST.getlist('pkgid')
for id in ids:
pkg = Package.objects.get(id=id)
if mode == 'adopt' and pkg.maintainer_id == 0:
pkg.maintainer = maint
elif mode == 'disown' and pkg.maintainer == maint:
pkg.maintainer_id = 0
else:
message = "You are not the current maintainer"
pkg.save()
return render_template('status_page.html', request, {'message':message})
if request.POST.has_key('adopt'):
mode = 'adopt'
message = 'Adoption was successful'
if request.POST.has_key('disown'):
mode = 'disown'
message = 'Disown was successful'
try:
maint = User.objects.get(username=request.user.username)
except User.DoesNotExist:
return render_response(request, 'error_page.html', {'errmsg':'No maintainer record found! Are you a maintainer?'})
ids = request.POST.getlist('pkgid')
for id in ids:
pkg = Package.objects.get(id=id)
if mode == 'adopt' and pkg.maintainer_id == 0:
pkg.maintainer = maint
elif mode == 'disown' and pkg.maintainer == maint:
pkg.maintainer_id = 0
else:
message = "You are not the current maintainer"
pkg.save()
return render_response(request, 'status_page.html', {'message':message})
def details(request, pkgid=0, name='', repo=''):
if pkgid == 0:
p = Package.objects.filter(pkgname=name)
if repo: p = p.filter(repo__name__exact=repo)
# if more then one result, send to the search view
if len(p) > 1: return search(request, name)
if len(p) < 1: return render_template('error_page.html', request,
{'errmsg': 'No matching packages.'})
pkgid = p[0].id
pkg = get_object_or_404(Package, id=pkgid)
return render_template('packages/details.html', request, {'pkg':pkg})
if pkgid == 0:
p = Package.objects.filter(pkgname=name)
if repo: p = p.filter(repo__name__exact=repo)
# if more then one result, send to the search view
if len(p) > 1: return search(request, name)
if len(p) < 1: return render_response(request, 'error_page.html',
{'errmsg': 'No matching packages.'})
pkgid = p[0].id
pkg = get_object_or_404(Package, id=pkgid)
return render_response(request, 'packages/details.html', {'pkg':pkg})
def search(request, query=''):
if request.GET.has_key('q'):
# take the q GET var over the one passed on the URL
query = request.GET['q'].strip()
# fetch the form vars
repo = request.GET.get('repo', 'all')
category = request.GET.get('category', 'all')
lastupdate = request.GET.get('lastupdate', '')
limit = int(request.GET.get('limit', '50'))
skip = int(request.GET.get('skip', '0'))
sort = request.GET.get('sort', '')
maint = request.GET.get('maint', 'all')
# build the form lists
repos = Repo.objects.order_by('name')
cats = Category.objects.order_by('category')
# copy GET data over and add the lists
c = request.GET.copy()
c['repos'], c['categories'] = repos, cats
c['limit'], c['skip'] = limit, skip
c['lastupdate'] = lastupdate
c['sort'] = sort
# 'q' gets renamed to 'query', so it's not in GET
c['query'] = query
# validate
errors = {}
validate(errors, 'Last Update', lastupdate, validators.isValidANSIDate, True, request)
validate(errors, 'Page Limit', str(limit), validators.isOnlyDigits, True, request)
validate(errors, 'Page Skip', str(skip), validators.isOnlyDigits, True, request)
if errors:
c['errors'] = errors
return render_template('packages/search.html', request, c)
if query:
res1 = Package.objects.filter(pkgname__icontains=query)
res2 = Package.objects.filter(pkgdesc__icontains=query)
results = res1 | res2
else:
results = Package.objects.all()
if repo != 'all': results = results.filter(repo__name__exact=repo)
if category != 'all': results = results.filter(category__category__exact=category)
if maint != 'all': results = results.filter(maintainer=maint)
if lastupdate: results = results.filter(last_update__gte=datetime(int(lastupdate[0:4]),int(lastupdate[5:7]),int(lastupdate[8:10])))
# select_related() shouldn't be needed -- we're working around a Django bug
#results = results.select_related().order_by('repos.name', 'category', 'pkgname')
# sort results
if sort == '':
results = results.order_by('repo', 'category', 'pkgname')
else:
# duplicate sort fields shouldn't hurt anything
results = results.order_by(sort, 'repo', 'category', 'pkgname')
qs = request.GET.copy()
# build pagination urls
if results.count() > (skip + limit):
qs['skip'] = skip + limit
c['nextpage'] = '?' + qs.urlencode()
if skip > 0:
qs['skip'] = max(0, skip - limit)
c['prevpage'] = '?' + qs.urlencode()
# pass the querystring to the template so we can build sort queries
c['querystring'] = request.GET
# if only there's only one result, pass right to the package details view
if results.count() == 1: return details(request, results[0].id)
# limit result set
if limit > 0: results = results[skip:(skip+limit)]
c['results'] = results
return render_template('packages/search.html', request, c)
if request.GET.has_key('q'):
# take the q GET var over the one passed on the URL
query = request.GET['q'].strip()
# fetch the form vars
repo = request.GET.get('repo', 'all')
category = request.GET.get('category', 'all')
lastupdate = request.GET.get('lastupdate', '')
limit = int(request.GET.get('limit', '50'))
skip = int(request.GET.get('skip', '0'))
sort = request.GET.get('sort', '')
maint = request.GET.get('maint', 'all')
# build the form lists
repos = Repo.objects.order_by('name')
cats = Category.objects.order_by('category')
# copy GET data over and add the lists
c = request.GET.copy()
c['repos'], c['categories'] = repos, cats
c['limit'], c['skip'] = limit, skip
c['lastupdate'] = lastupdate
c['sort'] = sort
# 'q' gets renamed to 'query', so it's not in GET
c['query'] = query
# validate
errors = {}
validate(errors, 'Last Update', lastupdate, validators.isValidANSIDate, True, request)
validate(errors, 'Page Limit', str(limit), validators.isOnlyDigits, True, request)
validate(errors, 'Page Skip', str(skip), validators.isOnlyDigits, True, request)
if errors:
c['errors'] = errors
return render_response(request, 'packages/search.html', c)
if query:
res1 = Package.objects.filter(pkgname__icontains=query)
res2 = Package.objects.filter(pkgdesc__icontains=query)
results = res1 | res2
else:
results = Package.objects.all()
if repo != 'all': results = results.filter(repo__name__exact=repo)
if category != 'all': results = results.filter(category__category__exact=category)
if maint != 'all': results = results.filter(maintainer=maint)
if lastupdate: results = results.filter(last_update__gte=datetime(int(lastupdate[0:4]),int(lastupdate[5:7]),int(lastupdate[8:10])))
# select_related() shouldn't be needed -- we're working around a Django bug
#results = results.select_related().order_by('repos.name', 'category', 'pkgname')
# sort results
if sort == '':
results = results.order_by('repo', 'category', 'pkgname')
else:
# duplicate sort fields shouldn't hurt anything
results = results.order_by(sort, 'repo', 'category', 'pkgname')
qs = request.GET.copy()
# build pagination urls
if results.count() > (skip + limit):
qs['skip'] = skip + limit
c['nextpage'] = '?' + qs.urlencode()
if skip > 0:
qs['skip'] = max(0, skip - limit)
c['prevpage'] = '?' + qs.urlencode()
# pass the querystring to the template so we can build sort queries
c['querystring'] = request.GET
# if only there's only one result, pass right to the package details view
if results.count() == 1: return details(request, results[0].id)
# limit result set
if limit > 0: results = results[skip:(skip+limit)]
c['results'] = results
return render_response(request, 'packages/search.html', c)
def files(request, pkgid):
pkg = get_object_or_404(Package, id=pkgid)
files = PackageFile.objects.filter(pkg=pkgid)
return render_template('packages/files.html', request, {'pkg':pkg,'files':files})
pkg = get_object_or_404(Package, id=pkgid)
files = PackageFile.objects.filter(pkg=pkgid)
return render_response(request, 'packages/files.html', {'pkg':pkg,'files':files})
def flaghelp(request):
return render_template('packages/flaghelp.html', request)
return render_response(request, 'packages/flaghelp.html')
def flag(request, pkgid):
pkg = get_object_or_404(Package, id=pkgid)
context = {'pkg': pkg}
if request.POST.has_key('confirmemail'):
email = request.POST['confirmemail']
if request.POST.has_key('usermessage'):
message = request.POST['usermessage']
else:
message = None
# validate
errors = {}
validate(errors, 'Email Address', email, validators.isValidEmail, False, request)
if errors:
context['errors'] = errors
return render_template('packages/flag.html', request, context)
context['confirmemail'] = email
pkg.needupdate = 1
pkg.save()
if pkg.maintainer_id > 0:
# send notification email to the maintainer
t = loader.get_template('packages/outofdate.txt')
c = Context({
'email': request.POST['confirmemail'],
'message': message,
'pkgname': pkg.pkgname,
'weburl': 'http://www.archlinux.org/packages/' + str(pkg.id) + '/'
})
send_mail('arch: Package [%s] marked out-of-date' % pkg.pkgname,
t.render(c),
'Arch Website Notification <nobody@archlinux.org>',
[pkg.maintainer.email],
fail_silently=True)
return render_template('packages/flag.html', request, context)
pkg = get_object_or_404(Package, id=pkgid)
context = {'pkg': pkg}
if request.POST.has_key('confirmemail'):
email = request.POST['confirmemail']
if request.POST.has_key('usermessage'):
message = request.POST['usermessage']
else:
message = None
# validate
errors = {}
validate(errors, 'Email Address', email, validators.isValidEmail, False, request)
if errors:
context['errors'] = errors
return render_response(request, 'packages/flag.html', context)
context['confirmemail'] = email
pkg.needupdate = 1
pkg.save()
if pkg.maintainer_id > 0:
# send notification email to the maintainer
t = loader.get_template('packages/outofdate.txt')
c = Context({
'email': request.POST['confirmemail'],
'message': message,
'pkgname': pkg.pkgname,
'weburl': 'http://www.archlinux.org/packages/' + str(pkg.id) + '/'
})
send_mail('arch: Package [%s] marked out-of-date' % pkg.pkgname,
t.render(c),