Redirect straight to package details if only one package is found
[aur2.git] / archlinux / aur / views.py
blobb4c1fb4f7ab244d8204a54b2ee7fbbf2e23cce1e
1 from re import sub
2 import os
4 from django.shortcuts import render_to_response, get_object_or_404
5 from django.http import HttpResponse, HttpResponseRedirect
6 from BetterPaginator import BetterPaginator
7 from django import newforms as forms # This will change to forms in 0.68 or 1.0
8 from django.contrib.auth.decorators import login_required
9 from django.core.urlresolvers import reverse
10 from django.db import transaction
12 from archlinux.aur.models import *
13 import archlinux.aur.Package as PKGBUILD
14 import datetime
16 def search(request, query = ''):
17 if request.method == 'GET' and request.GET.has_key('query'):
18 form = PackageSearchForm(request.GET)
19 # If there are any errors in the forum, render the template and exit
20 if not form.is_valid():
21 return render_to_response('aur/search.html', {
22 'form': form,
23 'user': request.user
25 else:
26 form = PackageSearchForm()
27 # Execute the search
28 results = form.search()
29 # If we only got one hit, just go to the package's detail page
30 if results.count() == 1:
31 return HttpResponseRedirect(reverse('package-detail',
32 args=[results[0].name,]))
33 # Replace the current page with the new one if it's already in GET
34 if request.GET.has_key('page'):
35 link_template = sub(r'page=\d+', 'page=%d', request.get_full_path())
36 else:
37 link_template = request.get_full_path() + '&page=%d'
38 # Initialise the pagination
39 paginator = BetterPaginator(results, int(form.get_or_default('limit')), link_template)
40 paginator.set_page(int(request.GET.get('page', '1')))
42 return render_to_response('aur/search.html', {
43 'form': form,
44 'packages': paginator.get_page(),
45 'pager': paginator,
46 'user': request.user,
49 # TODO: Implement transactions
50 @login_required
51 def submit(request):
52 if request.method == 'POST':
53 form = PackageSubmitForm(request.POST, request.FILES)
54 if not form.is_valid():
55 return render_to_response('aur/submit.html', {
56 'user': request.user, 'form': form})
57 import tempfile
58 directory = tempfile.mkdtemp()
59 filename = os.path.join(directory, form.cleaned_data['file'].filename)
60 # Save the uploaded file to disk
61 fp = open(filename, "wb")
62 fp.write(form.cleaned_data['file'].content)
63 fp.close()
65 try:
66 pkg = PKGBUILD.Package(filename)
67 except PKGBUILD.InvalidPackage, e:
68 # TODO: Add error to form
69 return render_to_response('aur/submit.html', {
70 'user': request.user, 'form': form, 'errors': [e,]})
71 pkg.validate()
72 if not pkg.is_valid() or pkg.has_warnings():
73 return render_to_response('aur/submit.html', {
74 'user': request.user, 'form': form, 'errors': pkg.get_errors(),
75 'warnings': pkg.get_warnings()})
77 # Check if we are updating an existing package or creating one
79 package = Package(name=pkg['name'], version=pkg['version'],
80 release=pkg['release'], description=pkg['description'],
81 url=pkg['url'])
83 package.repository=Repository.objects.get(name__exact="Unsupported")
84 package.category=Category.objects.get(name__iexact=form.cleaned_data['category'])
86 # Check for, and add dependencies
87 for dependency in pkg['depends']:
88 # This would be nice, but we don't have access to the official
89 # repositories
90 #if Package.objects.filter(name=dependency).count() == 0:
91 # TODO: Display an error
92 #return render_to_response("aur/submit.html")
93 try:
94 dep = Package.objects.get(name__exact=dependency)
95 except Package.DoesNotExist:
96 # Fail silently
97 pass
98 else:
99 package.depends.add(dep)
101 package.updated = datetime.datetime.now()
102 package.added = datetime.datetime.now()
104 # Save the package so we can reference it
105 package.save()
106 package.maintainers.add(request.user)
107 for license in pkg['licenses']:
108 object, created = License.objects.get_or_create(name=license)
109 package.licenses.add(object)
110 for arch in pkg['arch']:
111 try:
112 object = Architecture.objects.get(name=arch)
113 except Architecture.DoesNotExist:
114 # TODO: Add an error
115 return render_to_response('aur/submit.html', {
116 'user': request.user,
117 'form': form,
118 'errors': ['architecture %s does not exist' % arch,],
120 else:
121 package.architectures.add(object)
123 for index in range(len(pkg['source'])):
124 source = PackageFile(package=package,
125 filename=pkg['source'][index])
126 source.save()
127 # Check for any hashes this file may have
128 if pkg['md5sums']:
129 hash = PackageHash(hash=pkg['md5sums'][index], file=source,
130 type='md5sum')
131 hash.save()
132 if pkg['sha1sums']:
133 hash = PackageHash(hash=pkg['sha1sums'][index], file=source,
134 type='sha1sum')
135 hash.save()
136 if pkg['sha256sums']:
137 hash = PackageHash(hash=pkg['sha256sums'][index], file=source,
138 type='sha256sum')
139 hash.save()
140 if pkg['sha384sums']:
141 hash = PackageHash(hash=pkg['sha384sums'][index], file=source,
142 type='sha384sum')
143 hash.save()
144 if pkg['sha512sums']:
145 hash = PackageHash(hash=pkg['sha512sums'][index], file=source,
146 type='sha512sum')
147 hash.save()
149 comment = Comment(package=package, user=request.user,
150 message=form.cleaned_data['comment'],
151 ip=request.META['REMOTE_ADDR'], commit=True,
152 added=datetime.datetime.now())
153 comment.save()
154 return HttpResponseRedirect(
155 reverse('django.views.generic.list_detail.object_detail',
156 args=[package.name,]))
157 else:
158 form = PackageSubmitForm()
160 return render_to_response('aur/submit.html', {
161 'user': request.user,
162 'form': form,
165 def comment(request, object_id):
166 if request.POST and 'message' in request.POST:
167 package = get_object_or_404(Package, name=object_id)
168 comment = Comment(package=package, user=request.user,
169 message=request.POST['message'], added=datetime.datetime.now(),
170 ip=request.META['REMOTE_ADDR'])
171 if 'reply_to' in request.POST:
172 comment.parent=request.POST['reply_to']
173 comment.save()
174 return HttpResponseRedirect(
175 reverse('django.views.generic.list_detail.object_detail',
176 args=[object_id,]))
177 elif 'reply_to' in request.POST:
178 return render_to_response('aur/comment_form.html', {'user': request.user,
179 'package_id': object_id, 'reply_to': request.POST['reply_to']})
180 else:
181 return HttpResponseRedirect(
182 reverse('django.views.generic.list_detail.object_detail',
183 args=[object_id,]))