summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2012-07-21 11:26:34 -0500
committerDan McGee <dan@archlinux.org>2012-07-21 11:26:34 -0500
commit872d4bcaa2ce85d2d319a1146e0fc05ab6808eb9 (patch)
treed069b8fdaed926939771a754f49dde4b6f73185b
parentd5a19db526c0ef95a5166311f845719090d0f487 (diff)
Split details/display package views into new module
This moves a lot of the package and group display logic into a new view module, similar to what we already did earlier with a bunch of other views. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--packages/views/__init__.py154
-rw-r--r--packages/views/display.py160
2 files changed, 167 insertions, 147 deletions
diff --git a/packages/views/__init__.py b/packages/views/__init__.py
index 3e574c26..fa67daa8 100644
--- a/packages/views/__init__.py
+++ b/packages/views/__init__.py
@@ -1,27 +1,24 @@
import hashlib
import json
-from string import Template
-from urllib import urlencode
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from django.contrib.auth.models import User
from django.core.cache import cache
-from django.http import HttpResponse, Http404
-from django.shortcuts import get_object_or_404, redirect
+from django.http import HttpResponse
+from django.shortcuts import redirect
from django.views.decorators.cache import cache_control
from django.views.decorators.http import require_GET, require_POST
-from django.views.decorators.vary import vary_on_headers
from django.views.generic.simple import direct_to_template
-from main.models import Package, PackageFile, Arch, Repo
-from mirrors.models import MirrorUrl
-from mirrors.utils import get_mirror_url_for_download
+from main.models import Package, Arch
from ..models import PackageRelation
-from ..utils import (get_group_info, get_differences_info,
- multilib_differences, get_wrong_permissions, PackageJSONEncoder)
+from ..utils import (get_differences_info,
+ multilib_differences, get_wrong_permissions)
# make other views available from this same package
+from .display import (details, groups, group_details, files, details_json,
+ files_json, download)
from .flag import flaghelp, flag, flag_confirmed, unflag, unflag_all
from .search import search, search_json
from .signoff import signoffs, signoff_package, signoff_options, signoffs_json
@@ -105,143 +102,6 @@ def update(request):
messages.error(request, "Are you trying to adopt or disown?")
return redirect('/packages/')
-def split_package_details(request, name='', repo='', arch=''):
- arch = get_object_or_404(Arch, name=arch)
- arches = [ arch ]
- arches.extend(Arch.objects.filter(agnostic=True))
- repo = get_object_or_404(Repo, name__iexact=repo)
- pkgs = Package.objects.normal().filter(pkgbase=name,
- repo__testing=repo.testing, repo__staging=repo.staging,
- arch__in=arches).order_by('pkgname')
- if len(pkgs) == 0:
- raise Http404
- # we have packages, but ensure at least one is in the given repo
- if not any(True for pkg in pkgs if pkg.repo == repo):
- raise Http404
- context = {
- 'list_title': 'Split Package Details',
- 'name': name,
- 'arch': arch,
- 'packages': pkgs,
- }
- return direct_to_template(request, 'packages/packages_list.html',
- context)
-
-def details(request, name='', repo='', arch=''):
- if all([name, repo, arch]):
- try:
- pkg = Package.objects.select_related(
- 'arch', 'repo', 'packager').get(pkgname=name,
- repo__name__iexact=repo, arch__name=arch)
- return direct_to_template(request, 'packages/details.html',
- {'pkg': pkg, })
- except Package.DoesNotExist:
- arch_obj = get_object_or_404(Arch, name=arch)
- # for arch='any' packages, we can issue a redirect to them if we
- # have a single non-ambiguous option by changing the arch to match
- # any arch-agnostic package
- if not arch_obj.agnostic:
- pkgs = Package.objects.select_related(
- 'arch', 'repo', 'packager').filter(pkgname=name,
- repo__name__iexact=repo, arch__agnostic=True)
- if len(pkgs) == 1:
- return redirect(pkgs[0], permanent=True)
- return split_package_details(request, name, repo, arch)
- else:
- pkg_data = [
- ('arch', arch.lower()),
- ('repo', repo.lower()),
- ('q', name),
- ]
- # only include non-blank values in the query we generate
- pkg_data = [(x, y.encode('utf-8')) for x, y in pkg_data if y]
- return redirect("/packages/?%s" % urlencode(pkg_data))
-
-def groups(request, arch=None):
- arches = []
- if arch:
- get_object_or_404(Arch, name=arch, agnostic=False)
- arches.append(arch)
- grps = get_group_info(arches)
- context = {
- 'groups': grps,
- 'arch': arch,
- }
- return direct_to_template(request, 'packages/groups.html', context)
-
-def group_details(request, arch, name):
- arch = get_object_or_404(Arch, name=arch)
- arches = [ arch ]
- arches.extend(Arch.objects.filter(agnostic=True))
- pkgs = Package.objects.normal().filter(
- groups__name=name, arch__in=arches).order_by('pkgname')
- if len(pkgs) == 0:
- raise Http404
- context = {
- 'list_title': 'Group Details',
- 'name': name,
- 'arch': arch,
- 'packages': pkgs,
- }
- return direct_to_template(request, 'packages/packages_list.html', context)
-
-@vary_on_headers('X-Requested-With')
-def files(request, name, repo, arch):
- pkg = get_object_or_404(Package,
- pkgname=name, repo__name__iexact=repo, arch__name=arch)
- # files are inserted in sorted order, so preserve that
- fileslist = PackageFile.objects.filter(pkg=pkg).order_by('id')
- dir_count = sum(1 for f in fileslist if f.is_directory)
- files_count = len(fileslist) - dir_count
- context = {
- 'pkg': pkg,
- 'files': fileslist,
- 'files_count': files_count,
- 'dir_count': dir_count,
- }
- template = 'packages/files.html'
- if request.is_ajax():
- template = 'packages/files_list.html'
- return direct_to_template(request, template, context)
-
-def details_json(request, name, repo, arch):
- pkg = get_object_or_404(Package,
- pkgname=name, repo__name__iexact=repo, arch__name=arch)
- to_json = json.dumps(pkg, ensure_ascii=False, cls=PackageJSONEncoder)
- return HttpResponse(to_json, mimetype='application/json')
-
-def files_json(request, name, repo, arch):
- pkg = get_object_or_404(Package,
- pkgname=name, repo__name__iexact=repo, arch__name=arch)
- # files are inserted in sorted order, so preserve that
- fileslist = PackageFile.objects.filter(pkg=pkg).order_by('id')
- data = {
- 'pkgname': pkg.pkgname,
- 'repo': pkg.repo.name.lower(),
- 'arch': pkg.arch.name.lower(),
- 'files': fileslist,
- }
- to_json = json.dumps(data, ensure_ascii=False, cls=PackageJSONEncoder)
- return HttpResponse(to_json, mimetype='application/json')
-
-def download(request, name, repo, arch):
- pkg = get_object_or_404(Package,
- pkgname=name, repo__name__iexact=repo, arch__name=arch)
- url = get_mirror_url_for_download()
- if not url:
- raise Http404
- arch = pkg.arch.name
- if pkg.arch.agnostic:
- # grab the first non-any arch to fake the download path
- arch = Arch.objects.exclude(agnostic=True)[0].name
- values = {
- 'host': url.url,
- 'arch': arch,
- 'repo': pkg.repo.name.lower(),
- 'file': pkg.filename,
- }
- url = Template('${host}${repo}/os/${arch}/${file}').substitute(values)
- return redirect(url)
def arch_differences(request):
# TODO: we have some hardcoded magic here with respect to the arches.
diff --git a/packages/views/display.py b/packages/views/display.py
new file mode 100644
index 00000000..dd57571a
--- /dev/null
+++ b/packages/views/display.py
@@ -0,0 +1,160 @@
+import json
+from string import Template
+from urllib import urlencode
+
+from django.http import HttpResponse, Http404
+from django.shortcuts import get_object_or_404, redirect
+from django.views.generic.simple import direct_to_template
+from django.views.decorators.vary import vary_on_headers
+
+from main.models import Package, PackageFile, Arch, Repo
+from mirrors.utils import get_mirror_url_for_download
+from ..utils import get_group_info, PackageJSONEncoder
+
+
+def split_package_details(request, name='', repo='', arch=''):
+ arch = get_object_or_404(Arch, name=arch)
+ arches = [ arch ]
+ arches.extend(Arch.objects.filter(agnostic=True))
+ repo = get_object_or_404(Repo, name__iexact=repo)
+ pkgs = Package.objects.normal().filter(pkgbase=name,
+ repo__testing=repo.testing, repo__staging=repo.staging,
+ arch__in=arches).order_by('pkgname')
+ if len(pkgs) == 0:
+ raise Http404
+ # we have packages, but ensure at least one is in the given repo
+ if not any(True for pkg in pkgs if pkg.repo == repo):
+ raise Http404
+ context = {
+ 'list_title': 'Split Package Details',
+ 'name': name,
+ 'arch': arch,
+ 'packages': pkgs,
+ }
+ return direct_to_template(request, 'packages/packages_list.html',
+ context)
+
+
+def details(request, name='', repo='', arch=''):
+ if all([name, repo, arch]):
+ try:
+ pkg = Package.objects.select_related(
+ 'arch', 'repo', 'packager').get(pkgname=name,
+ repo__name__iexact=repo, arch__name=arch)
+ return direct_to_template(request, 'packages/details.html',
+ {'pkg': pkg, })
+ except Package.DoesNotExist:
+ arch_obj = get_object_or_404(Arch, name=arch)
+ # for arch='any' packages, we can issue a redirect to them if we
+ # have a single non-ambiguous option by changing the arch to match
+ # any arch-agnostic package
+ if not arch_obj.agnostic:
+ pkgs = Package.objects.select_related(
+ 'arch', 'repo', 'packager').filter(pkgname=name,
+ repo__name__iexact=repo, arch__agnostic=True)
+ if len(pkgs) == 1:
+ return redirect(pkgs[0], permanent=True)
+ return split_package_details(request, name, repo, arch)
+ else:
+ pkg_data = [
+ ('arch', arch.lower()),
+ ('repo', repo.lower()),
+ ('q', name),
+ ]
+ # only include non-blank values in the query we generate
+ pkg_data = [(x, y.encode('utf-8')) for x, y in pkg_data if y]
+ return redirect("/packages/?%s" % urlencode(pkg_data))
+
+
+def groups(request, arch=None):
+ arches = []
+ if arch:
+ get_object_or_404(Arch, name=arch, agnostic=False)
+ arches.append(arch)
+ grps = get_group_info(arches)
+ context = {
+ 'groups': grps,
+ 'arch': arch,
+ }
+ return direct_to_template(request, 'packages/groups.html', context)
+
+
+def group_details(request, arch, name):
+ arch = get_object_or_404(Arch, name=arch)
+ arches = [ arch ]
+ arches.extend(Arch.objects.filter(agnostic=True))
+ pkgs = Package.objects.normal().filter(
+ groups__name=name, arch__in=arches).order_by('pkgname')
+ if len(pkgs) == 0:
+ raise Http404
+ context = {
+ 'list_title': 'Group Details',
+ 'name': name,
+ 'arch': arch,
+ 'packages': pkgs,
+ }
+ return direct_to_template(request, 'packages/packages_list.html', context)
+
+
+@vary_on_headers('X-Requested-With')
+def files(request, name, repo, arch):
+ pkg = get_object_or_404(Package,
+ pkgname=name, repo__name__iexact=repo, arch__name=arch)
+ # files are inserted in sorted order, so preserve that
+ fileslist = PackageFile.objects.filter(pkg=pkg).order_by('id')
+ dir_count = sum(1 for f in fileslist if f.is_directory)
+ files_count = len(fileslist) - dir_count
+ context = {
+ 'pkg': pkg,
+ 'files': fileslist,
+ 'files_count': files_count,
+ 'dir_count': dir_count,
+ }
+ template = 'packages/files.html'
+ if request.is_ajax():
+ template = 'packages/files_list.html'
+ return direct_to_template(request, template, context)
+
+
+def details_json(request, name, repo, arch):
+ pkg = get_object_or_404(Package,
+ pkgname=name, repo__name__iexact=repo, arch__name=arch)
+ to_json = json.dumps(pkg, ensure_ascii=False, cls=PackageJSONEncoder)
+ return HttpResponse(to_json, mimetype='application/json')
+
+
+def files_json(request, name, repo, arch):
+ pkg = get_object_or_404(Package,
+ pkgname=name, repo__name__iexact=repo, arch__name=arch)
+ # files are inserted in sorted order, so preserve that
+ fileslist = PackageFile.objects.filter(pkg=pkg).order_by('id')
+ data = {
+ 'pkgname': pkg.pkgname,
+ 'repo': pkg.repo.name.lower(),
+ 'arch': pkg.arch.name.lower(),
+ 'files': fileslist,
+ }
+ to_json = json.dumps(data, ensure_ascii=False, cls=PackageJSONEncoder)
+ return HttpResponse(to_json, mimetype='application/json')
+
+
+def download(request, name, repo, arch):
+ pkg = get_object_or_404(Package,
+ pkgname=name, repo__name__iexact=repo, arch__name=arch)
+ url = get_mirror_url_for_download()
+ if not url:
+ raise Http404
+ arch = pkg.arch.name
+ if pkg.arch.agnostic:
+ # grab the first non-any arch to fake the download path
+ arch = Arch.objects.exclude(agnostic=True)[0].name
+ values = {
+ 'host': url.url,
+ 'arch': arch,
+ 'repo': pkg.repo.name.lower(),
+ 'file': pkg.filename,
+ }
+ url = Template('${host}${repo}/os/${arch}/${file}').substitute(values)
+ return redirect(url)
+
+# vim: set ts=4 sw=4 et: