diff --git a/devel/views.py b/devel/views.py
index 978837b2..66843610 100644
--- a/devel/views.py
+++ b/devel/views.py
@@ -3,8 +3,8 @@
from django.contrib.auth.models import User
from django.core import validators
from archweb_dev.main.utils import render_response, validate
-from archweb_dev.main.models import Package, Repo, Todolist, TodolistPkg
-from archweb_dev.main.models import UserProfile, News, Donor, Mirror, Arch
+from archweb_dev.main.models import Package, Todolist, TodolistPkg
+from archweb_dev.main.models import UserProfile, News, Donor, Mirror
from django.http import HttpResponse
from django.template import Context, loader
@@ -35,11 +35,11 @@ def index(request):
})
repo_stats = []
- for repo in Repo.objects.all():
+ for repo in Package.REPOS:
repo_stats.append({
- 'name': repo.name,
- 'count': Package.objects.filter(repo__exact = repo).count(),
- 'flagged': Package.objects.filter(repo__exact = repo).filter(needupdate=True).count()
+ 'name': repo,
+ 'count': Package.objects.filter(repo = Package.REPOS[repo]).count(),
+ 'flagged': Package.objects.filter(Package.REPOS[repo]).filter(needupdate=True).count()
})
return render_response(
@@ -89,8 +89,8 @@ def guide(request):
def siteindex(request):
# get the most recent 10 news items
news = News.objects.order_by('-postdate', '-id')[:10]
- pkgs = Package.objects.exclude(repo__name__exact='Testing').order_by('-last_update')[:15]
- repos = Repo.objects.order_by('name')
+ pkgs = Package.objects.exclude(repo = Package.REPOS.testing).order_by('-last_update')[:15]
+ repos = Package.REPOS
return render_response(
request, 'devel/siteindex.html',
{'news_updates': news, 'pkg_updates': pkgs, 'repos': repos})
diff --git a/main/models.py b/main/models.py
index 44a8065e..74f2cdbf 100644
--- a/main/models.py
+++ b/main/models.py
@@ -2,7 +2,34 @@
from django.contrib.auth.models import User
import re
+###########################
+### Model help classes ###
+###########################
+class Container(dict):
+ def __init__(self, dict_entries=None, **entries):
+ if dict_entries:
+ self.update(dict_entries)
+ if entries:
+ self.update(entries)
+ def __iter__(self):
+ rev_items = [(v, k) for k, v in self.items()]
+ rev_items.sort()
+ items = [k for v, k in rev_items]
+ return items.__iter__()
+
+ def itertransp(self):
+ rev_items = [(v, k) for k, v in self.items()]
+ rev_items.sort()
+ return rev_items.__iter__()
+
+ def __getattr__(self,name):
+ return self[name]
+
+ def __setattr__(self,name,val):
+ self[name] = val
+
+
###########################
### User Profile Class ####
###########################
@@ -133,33 +160,19 @@ class Meta:
def get_absolute_url(self):
return '/news/%i/' % self.id
-class Arch(models.Model):
- id = models.AutoField(primary_key=True)
- name = models.CharField(unique=True,maxlength=255)
- class Meta:
- db_table = 'archs'
- ordering = ['name']
- def __str__(self):
- return self.name
-
-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):
+ ## note: purposefully inlining arch and repo.
+ ## they don't change very often (rarely), and it should help compact
+ ## the general model
+ # architectures
+ ARCHES = Container(i686=1, x86_64=2)
+ # repositories
+ REPOS = Container(core=1, extra=2, testing=3, unstable=4)
+
id = models.AutoField(primary_key=True)
- repo = models.ForeignKey('Repo')
- arch = models.ForeignKey('Arch')
+ ## note: the arch and repo elements might need to be indexed. not sure.
+ repo = models.IntegerField(choices=REPOS.itertransp())
+ arch = models.IntegerField(choices=ARCHES.itertransp())
maintainer = models.ForeignKey(User, related_name='package_maintainer')
needupdate = models.BooleanField(default=False)
pkgname = models.CharField(maxlength=255)
@@ -178,7 +191,8 @@ def get_absolute_url(self):
def required_by_urlize(self):
urls = []
- requiredby = PackageDepends.objects.filter(depname=self.pkgname)
+ requiredby = PackageDepend.objects.filter(
+ depname=self.pkgname).order_by('depname')
for req in requiredby:
urls.append(
'
%s ' % \
@@ -187,15 +201,16 @@ def required_by_urlize(self):
def depends_urlize(self):
urls = []
- for dep in self.packagedepends_set.all():
+ for dep in self.packagedepend_set.order_by('depname'):
try:
+ # we only need depend on same-arch-packages
p = Package.objects.get(
pkgname=dep.depname,
arch=self.arch)
- except IndexError:
+ except Package.DoesNotExist, IndexError:
# couldn't find a package in the DB
# it might be a virtual depend
- urls.append('%s (v) ' % dep.depname)
+ urls.append('%s ' % dep.depname)
continue
urls.append(
'%s %s ' % \
@@ -207,15 +222,15 @@ class PackageFile(models.Model):
pkg = models.ForeignKey('Package')
path = models.CharField(maxlength=255)
class Meta:
- db_table = 'packages_files'
+ db_table = 'package_files'
-class PackageDepends(models.Model):
+class PackageDepend(models.Model):
id = models.AutoField(primary_key=True)
pkg = models.ForeignKey('Package')
depname = models.CharField(db_index=True, maxlength=255)
depvcmp = models.CharField(maxlength=255)
class Meta:
- db_table = 'packages_depends'
+ db_table = 'package_depends'
class Todolist(models.Model):
id = models.AutoField(primary_key=True)
diff --git a/packages/views.py b/packages/views.py
index fef5efc9..0b19235c 100644
--- a/packages/views.py
+++ b/packages/views.py
@@ -7,8 +7,7 @@
from django.contrib.auth.models import User
from datetime import datetime
from archweb_dev.main.utils import validate, render_response
-from archweb_dev.main.models import Arch, Repo
-from archweb_dev.main.models import Package, PackageFile, PackageDepends
+from archweb_dev.main.models import Package, PackageFile, PackageDepend
from django.core.exceptions import ObjectDoesNotExist
@@ -38,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=Package.REPOS[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',
@@ -63,11 +62,11 @@ def search(request, query=''):
maint = request.GET.get('maint', 'all')
# build the form lists
- repos = Repo.objects.order_by('name')
- archs = Arch.objects.order_by('name')
+ repos = Package.REPOS
+ arches = Package.ARCHES
# copy GET data over and add the lists
c = request.GET.copy()
- c['repos'], c['archs'] = repos, archs
+ c['repos'], c['arches'] = repos, arches
c['limit'], c['skip'] = limit, skip
c['lastupdate'] = lastupdate
c['sort'] = sort
@@ -89,10 +88,18 @@ def search(request, query=''):
results = res1 | res2
else:
results = Package.objects.all()
- if repo != 'all': results = results.filter(repo__name__exact=repo)
- if arch != 'all': results = results.filter(arch__name__exact=arch)
- 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])))
+ if repo != 'all' and repo in Package.REPOS:
+ results = results.filter(repo=Package.REPOS[repo])
+ if arch != 'all' and arch in Package.ARCHES:
+ results = results.filter(arch=Package.ARCHES[arch])
+ 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])))
# sort results
if sort == '':
diff --git a/templates/devel/siteindex.html b/templates/devel/siteindex.html
index 3cbf08a9..9747470a 100644
--- a/templates/devel/siteindex.html
+++ b/templates/devel/siteindex.html
@@ -107,8 +107,8 @@ Package Repositories
diff --git a/templates/packages/details.html b/templates/packages/details.html
index 1435557b..873609ee 100644
--- a/templates/packages/details.html
+++ b/templates/packages/details.html
@@ -33,10 +33,10 @@ {{ pkg.pkgname }} {{ pkg.pkgver }}-{{ pkg.pkgrel }}
Architecture:
- {{ pkg.arch.name }}
+ {{ pkg.get_arch_display }}
Repository:
- {{ pkg.repo.name }}
+ {{ pkg.get_repo_display|capfirst }}
Description:
{{ pkg.pkgdesc }}
@@ -54,7 +54,7 @@ {{ pkg.pkgname }} {{ pkg.pkgver }}-{{ pkg.pkgrel }}
-
+
Dependencies:
@@ -62,8 +62,6 @@ Dependencies:
-
-
Required By:
diff --git a/templates/packages/search.html b/templates/packages/search.html
index 309f926d..1e8d2659 100644
--- a/templates/packages/search.html
+++ b/templates/packages/search.html
@@ -26,15 +26,15 @@
Search Criteria
All
- {% for a in archs %}
- {{ a.name }}
+ {% for a in arches %}
+ {{ a }}
{% endfor %}
All
{% for r in repos %}
- {{ r.name|capfirst }}
+ {{ r|capfirst }}
{% endfor %}
@@ -87,8 +87,8 @@ Search Criteria
{% if not user.is_anonymous %}
{% endif %}
-
{{ pkg.arch.name }}
-
{{ pkg.repo.name }}
+
{{ pkg.get_arch_display }}
+
{{ pkg.get_repo_display|capfirst }}
{{ pkg.pkgname }}
{% if pkg.needupdate %}
{{ pkg.pkgver }}-{{ pkg.pkgrel }}