summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/models.py96
-rw-r--r--packages/templatetags/package_extras.py5
-rw-r--r--packages/views.py96
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))