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
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', {
26 form
= PackageSearchForm()
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())
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', {
44 'packages': paginator
.get_page(),
49 # TODO: Implement transactions
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
})
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
)
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
,]})
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'],
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
90 #if Package.objects.filter(name=dependency).count() == 0:
91 # TODO: Display an error
92 #return render_to_response("aur/submit.html")
94 dep
= Package
.objects
.get(name__exact
=dependency
)
95 except Package
.DoesNotExist
:
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
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']:
112 object = Architecture
.objects
.get(name
=arch
)
113 except Architecture
.DoesNotExist
:
115 return render_to_response('aur/submit.html', {
116 'user': request
.user
,
118 'errors': ['architecture %s does not exist' % arch
,],
121 package
.architectures
.add(object)
123 for index
in range(len(pkg
['source'])):
124 source
= PackageFile(package
=package
,
125 filename
=pkg
['source'][index
])
127 # Check for any hashes this file may have
129 hash = PackageHash(hash=pkg
['md5sums'][index
], file=source
,
133 hash = PackageHash(hash=pkg
['sha1sums'][index
], file=source
,
136 if pkg
['sha256sums']:
137 hash = PackageHash(hash=pkg
['sha256sums'][index
], file=source
,
140 if pkg
['sha384sums']:
141 hash = PackageHash(hash=pkg
['sha384sums'][index
], file=source
,
144 if pkg
['sha512sums']:
145 hash = PackageHash(hash=pkg
['sha512sums'][index
], file=source
,
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())
154 return HttpResponseRedirect(
155 reverse('django.views.generic.list_detail.object_detail',
156 args
=[package
.name
,]))
158 form
= PackageSubmitForm()
160 return render_to_response('aur/submit.html', {
161 'user': request
.user
,
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']
174 return HttpResponseRedirect(
175 reverse('django.views.generic.list_detail.object_detail',
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']})
181 return HttpResponseRedirect(
182 reverse('django.views.generic.list_detail.object_detail',