import urllib from django import forms from django.shortcuts import render_to_response from django.template import RequestContext from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.contrib.auth.models import User from django.contrib.admin.widgets import AdminDateWidget from django.views.generic import list_detail from django.db.models import Q import datetime from archweb_dev.main.utils import render_response from archweb_dev.main.models import Package, PackageFile from archweb_dev.main.models import Arch, Repo, Signoff from archweb_dev.main.utils import make_choice def update(request): ids = request.POST.getlist('pkgid') if request.POST.has_key('adopt'): mode = 'adopt' maint_id = request.user.id if request.POST.has_key('disown'): mode = 'disown' maint_id = 0 for id in ids: pkg = Package.objects.get(id=id) pkg.maintainer_id = maint_id pkg.save() request.user.message_set.create(message="%d packages %sed" % ( len(ids), mode)) return HttpResponseRedirect('/packages/search/') 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] return render_response(request, 'packages/details.html', {'pkg': pkg}) class PackageSearchForm(forms.Form): repo = forms.ChoiceField(required=False) arch = forms.ChoiceField(required=False) q = forms.CharField(required=False) maintainer = forms.ChoiceField(required=False) last_update = forms.DateField(required=False, widget=AdminDateWidget()) flagged = forms.ChoiceField( choices=[('', 'All')] + make_choice(['Flagged', 'Not Flagged']), required=False) limit = forms.ChoiceField( choices=make_choice([50, 100, 250]) + [('all', 'All')], required=False, initial=50) def clean_limit(self): limit = self.cleaned_data['limit'] if limit == 'all': limit = None elif limit: try: limit = int(limit) except: raise forms.ValidationError("Should be an integer") else: limit = 50 return limit def __init__(self, *args, **kwargs): super(PackageSearchForm, self).__init__(*args, **kwargs) self.fields['repo'].choices = self.fields[ 'repo'].widget.choices = [('', 'All')] + make_choice( [repo.name for repo in Repo.objects.all()]) self.fields['arch'].choices = self.fields[ 'arch'].widget.choices = [('', 'All')] + make_choice( [arch.name for arch in Arch.objects.all()]) self.fields['maintainer'].choices = self.fields[ 'maintainer'].widget.choices = [ ('', 'All'), ('orphan', 'Orphan')] + make_choice( [m.username for m in User.objects.all()]) def search(request, page=None): current_query = '?' limit=50 packages = Package.objects.all() if request.GET: current_query += urllib.urlencode(request.GET) form = PackageSearchForm(data=request.GET) if form.is_valid(): if form.cleaned_data['repo']: packages = packages.filter( repo__name=form.cleaned_data['repo']) if form.cleaned_data['arch']: packages = packages.filter( arch__name=form.cleaned_data['arch']) if form.cleaned_data['maintainer'] == 'orphan': packages=packages.filter(maintainer__id = 0) elif form.cleaned_data['maintainer']: packages = packages.filter( maintainer__username=form.cleaned_data['maintainer']) if form.cleaned_data['flagged'] == 'Flagged': packages=packages.filter(needupdate=True) elif form.cleaned_data['flagged'] == 'Not Flagged': packages = packages.filter(needupdate=False) if form.cleaned_data['q']: query = form.cleaned_data['q'] q = Q(pkgname__icontains=query) | Q(pkgdesc__icontains=query) packages = packages.filter(q) if form.cleaned_data['last_update']: lu = form.cleaned_data['last_update'] packages = packages.filter(last_update__gte= datetime.datetime(lu.year, lu.month, lu.day, 0, 0)) limit = form.cleaned_data['limit'] else: form = PackageSearchForm() page_dict = {'search_form': form, 'current_query': current_query } if len(packages) == 1: return HttpResponseRedirect(packages[0].get_absolute_url()) if 'sort' in request.GET: packages = packages.order_by( request.GET['sort'], 'repo', 'arch', 'pkgname') else: packages = packages.order_by('repo', 'arch', '-last_update', 'pkgname') return list_detail.object_list(request, packages, template_name="packages/search.html", page=page, paginate_by=limit, template_object_name="package", extra_context=page_dict) 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): packages = Package.objects.filter(repo__name="Testing").order_by("pkgname") 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) # vim: set ts=4 sw=4 et: