evorepo/packages/views.py

174 lines
6.0 KiB
Python
Raw Normal View History

2008-10-05 18:46:28 -07:00
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.contrib.auth.models import User
from datetime import datetime
2008-10-05 18:41:08 -07:00
from archweb_dev.main.utils import render_response
2008-10-05 18:46:28 -07:00
from archweb_dev.main.models import Package, PackageFile
from archweb_dev.main.models import Arch, Repo, Signoff
2008-02-26 18:36:20 -08:00
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'
2008-06-29 17:44:02 -07:00
ids = request.POST.getlist('pkgid')
for id in ids:
pkg = Package.objects.get(id=id)
if mode == 'adopt':
pkg.maintainer = request.user
elif mode == 'disown':
pkg.maintainer_id = 0
pkg.save()
return render_response(request, 'status_page.html', {'message':message})
def details(request, pkgid=0, name='', repo='', arch=''):
if pkgid != 0:
pkg = get_object_or_404(Package, id=pkgid)
elif all([name, repo, arch]):
pkg= get_object_or_404(Package,
pkgname=name, repo__name__iexact=repo, arch__name=arch)
else:
p = Package.objects.filter(pkgname=name)
if repo: p = p.filter(repo__name__iexact=repo)
lenp = p.count()
# if more then one result, send to the search view
if lenp > 1: return search(request, name)
if lenp < 1: return render_response(request, 'error_page.html',
{'errmsg': 'No matching packages.'})
pkg = p[0]
2008-03-08 12:11:02 -08:00
return render_response(request, 'packages/details.html', {'pkg': pkg})
# @TODO: replace search form with a newform
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')
2008-03-08 12:11:02 -08:00
arch = request.GET.get('arch', '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')
flagged_only = request.GET.get('flagged_only', 'n')
# build the form lists
repos = Repo.objects.all()
arches = Arch.objects.all()
users = User.objects.all()
# copy GET data over and add the lists
c = request.GET.copy()
c['repos'], c['arches'] = repos, arches
c['users'] = users
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' and repo in [x.name for x in repos]:
results = results.filter(repo__name__iexact=repo)
if arch != 'all' and arch in [x.name for x in arches]:
results = results.filter(arch__name__iexact=arch)
if maint != 'all':
results = results.filter(maintainer=maint)
if flagged_only != 'n':
results = results.filter(needupdate=1)
if lastupdate:
results = results.filter(
last_update__gte=datetime(
int(lastupdate[0:4]),
int(lastupdate[5:7]),
int(lastupdate[8:10])))
# sort results
if sort == '':
2008-06-19 16:18:44 -07:00
results = results.order_by('repo', 'arch', '-last_update', 'pkgname')
else:
# duplicate sort fields shouldn't hurt anything
2008-03-08 12:11:02 -08:00
results = results.order_by(sort, 'repo', 'arch', 'pkgname')
qs = request.GET.copy()
# build pagination urls
2008-04-28 19:39:03 -07:00
if results.count() > (skip + limit) and limit > 0:
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_response(request, 'packages/files.html', {'pkg':pkg,'files':files})
def unflag(request, pkgid):
pkg = get_object_or_404(Package, id=pkgid)
pkg.needupdate = 0
pkg.save()
return HttpResponseRedirect('/packages/%d/' % (pkg.id))
def signoffs(request, message=None):
2008-08-06 14:58:15 -07:00
packages = Package.objects.filter(repo__name="Testing").order_by("pkgname")
2008-08-06 14:54:11 -07:00
return render_response(request, 'packages/signoffs.html',
{'packages': packages, 'message': message})
def signoff_package(request, arch, pkgname):
pkg = get_object_or_404(Package,
arch__name=arch,
pkgname=pkgname,
repo__name="Testing")
signoff, created = Signoff.objects.get_or_create(
pkg=pkg,
pkgver=pkg.pkgver,
pkgrel=pkg.pkgrel,
packager=request.user)
if created:
message = "You have successfully signed off for %s on %s" % (
pkg.pkgname, pkg.arch)
else:
message = "You have already signed off for %s on %s" % (
pkg.pkgname, pkg.arch)
return signoffs(request, message)
2008-08-06 14:54:11 -07:00
# vim: set ts=4 sw=4 et: