diff options
Diffstat (limited to 'packages')
-rw-r--r-- | packages/models.py | 96 | ||||
-rw-r--r-- | packages/templatetags/package_extras.py | 5 | ||||
-rw-r--r-- | packages/views.py | 96 |
3 files changed, 30 insertions, 167 deletions
diff --git a/packages/models.py b/packages/models.py deleted file mode 100644 index cc3b279e..00000000 --- a/packages/models.py +++ /dev/null @@ -1,96 +0,0 @@ -from django.db import models -from django.contrib.auth.models import User -import re - -class PackageManager(models.Manager): - def get_flag_stats(self): - results = [] - # first the orphans - unflagged = self.filter(maintainer=0).count() - flagged = self.filter(maintainer=0).filter(needupdate=True).count() - flagged_notest = self.filter(maintainer=0).filter(needupdate=True).exclude(repo__name__exact='Testing').count() - results.append((User(id=0,first_name='Orphans'), unflagged, flagged, flagged_notest)) - # now the rest - for maint in User.objects.all().order_by('first_name'): - unflagged = self.filter(maintainer=maint.id).count() - flagged = self.filter(maintainer=maint.id).filter(needupdate=True).count() - flagged_notest = self.filter(maintainer=maint.id).filter(needupdate=True).exclude(repo__name__exact='Testing').count() - results.append((maint, unflagged, flagged, flagged_notest)) - return results - -class Category(models.Model): - id = models.AutoField(primary_key=True) - category = models.CharField(maxlength=255) - class Meta: - db_table = 'categories' - verbose_name_plural = 'categories' - -class Repo(models.Model): - id = models.AutoField(primary_key=True) - name = models.CharField(maxlength=255) - class Meta: - db_table = 'repos' - ordering = ['name'] - def last_update(self): - try: - latest = Package.objects.filter(repo__name__exact=self.name).order_by('-last_update')[0] - return latest.last_update - except IndexError: - return "N/A" - -class Package(models.Model): - id = models.AutoField(primary_key=True) - repo = models.ForeignKey(Repo) - maintainer = models.ForeignKey(User) - category = models.ForeignKey(Category) - needupdate = models.BooleanField(default=False) - pkgname = models.CharField(maxlength=255) - pkgver = models.CharField(maxlength=255) - pkgrel = models.CharField(maxlength=255) - pkgdesc = models.CharField(maxlength=255) - url = models.URLField() - sources = models.TextField() - depends = models.TextField() - last_update = models.DateTimeField(null=True, blank=True) - objects = PackageManager() - class Meta: - db_table = 'packages' - get_latest_by = 'last_update' - - def get_absolute_url(self): - return '/packages/%i/' % self.id - - def depends_urlize(self): - urls = '' - for dep in self.depends.split(' '): - # shave off any version qualifiers - nameonly = re.match(r"([a-z0-9-]+)", dep).group(1) - try: - p = Package.objects.filter(pkgname=nameonly)[0] - except IndexError: - # couldn't find a package in the DB -- it might be a virtual depend - urls = urls + '<li>' + dep + '</li>' - continue - url = '<li><a href="/packages/' + str(p.id) + '">' + dep + '</a></li>' - urls = urls + url - return urls - - def sources_urlize(self): - urls = '' - for source in self.sources.split(' '): - if re.search('://', source): - url = '<li><a href="' + source + '">' + source + '</a></li>' - else: - url = '<li>' + source + '</li>' - urls = urls + url - return urls - -class PackageFile(models.Model): - id = models.AutoField(primary_key=True) - pkg = models.ForeignKey(Package) - path = models.CharField(maxlength=255) - class Meta: - db_table = 'packages_files' - -# vim: set ts=4 sw=4 et: - diff --git a/packages/templatetags/package_extras.py b/packages/templatetags/package_extras.py index 9f165580..5469f297 100644 --- a/packages/templatetags/package_extras.py +++ b/packages/templatetags/package_extras.py @@ -8,7 +8,10 @@ class BuildQueryStringNode(template.Node): def render(self, context): qs = context['querystring'].copy() if qs.has_key('sort') and qs['sort'] == self.sortfield: - qs['sort'] = '-' + self.sortfield + if self.sortfield.startswith('-'): + qs['sort'] = self.sortfield[1:] + else: + qs['sort'] = '-' + self.sortfield else: qs['sort'] = self.sortfield return '?' + qs.urlencode() diff --git a/packages/views.py b/packages/views.py index df0359d2..2a77be53 100644 --- a/packages/views.py +++ b/packages/views.py @@ -3,11 +3,11 @@ from django.shortcuts import get_object_or_404 from django.core.mail import send_mail from django.template import Context, loader from django.core import validators -from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User -from archweb_dev.lib.utils import validate, render_response from datetime import datetime -from archweb_dev.packages.models import Package, PackageFile, Repo, Category +from archweb_dev.main.utils import validate, render_response +from archweb_dev.main.models import Package, PackageFile, PackageDepend +from archweb_dev.main.models import Arch, Repo from django.core.exceptions import ObjectDoesNotExist @@ -37,7 +37,7 @@ def update(request): 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 repo: p = p.filter(repo__name__iexact=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', @@ -45,18 +45,7 @@ def details(request, pkgid=0, name='', repo=''): pkgid = p[0].id pkg = get_object_or_404(Package, id=pkgid) - origin_repo = None - if pkg.repo.name == 'Testing': - try: - origin_repo = Package.objects.filter( - pkgname__exact = pkg.pkgname).exclude( - repo__name__exact = pkg.repo.name).get().repo.name - except ObjectDoesNotExist: - origin_repo = None - return render_response( - request, - 'packages/details.html', - {'pkg': pkg, 'origin_repo': origin_repo}) + return render_response(request, 'packages/details.html', {'pkg': pkg}) def search(request, query=''): if request.GET.has_key('q'): @@ -65,19 +54,20 @@ def search(request, query=''): # fetch the form vars repo = request.GET.get('repo', 'all') - category = request.GET.get('category', 'all') + 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.order_by('name') - cats = Category.objects.order_by('category') + repos = Repo.objects.all() + arches = Arch.objects.all() # copy GET data over and add the lists c = request.GET.copy() - c['repos'], c['categories'] = repos, cats + c['repos'], c['arches'] = repos, arches c['limit'], c['skip'] = limit, skip c['lastupdate'] = lastupdate c['sort'] = sort @@ -99,19 +89,27 @@ def search(request, 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') + 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 == '': - results = results.order_by('repo', 'category', 'pkgname') + results = results.order_by('repo', 'arch', '-last_update', 'pkgname') else: # duplicate sort fields shouldn't hurt anything - results = results.order_by(sort, 'repo', 'category', 'pkgname') + results = results.order_by(sort, 'repo', 'arch', 'pkgname') qs = request.GET.copy() # build pagination urls @@ -137,50 +135,8 @@ def files(request, pkgid): files = PackageFile.objects.filter(pkg=pkgid) return render_response(request, 'packages/files.html', {'pkg':pkg,'files':files}) -def flaghelp(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_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), - 'Arch Website Notification <nobody@archlinux.org>', - [pkg.maintainer.email], - fail_silently=True) - return render_response(request, 'packages/flag.html', context) - -@login_required def unflag(request, pkgid): pkg = get_object_or_404(Package, id=pkgid) - if pkg.maintainer_id == 0 or \ - pkg.maintainer.username != request.user.username: - return render_response(request, 'error_page.html', {'errmsg': 'You do not own this package.'}) pkg.needupdate = 0 pkg.save() return HttpResponseRedirect('/packages/%d/' % (pkg.id)) |