7 from django
.shortcuts
import render_to_response
, get_object_or_404
8 from django
.http
import HttpResponse
, HttpResponseRedirect
9 from BetterPaginator
import BetterPaginator
10 from django
import forms
11 from django
.contrib
.auth
.decorators
import login_required
12 from django
.core
.urlresolvers
import reverse
13 from django
.core
import serializers
14 from django
.utils
.translation
import ugettext
16 from archlinux
.aur
.models
import *
17 from archlinux
.aur
.forms
import PackageSearchForm
, PackageSubmitForm
19 def search(request
, query
= ''):
20 if request
.method
== 'GET' and request
.GET
.has_key('query'):
21 form
= PackageSearchForm(request
.GET
)
22 # If there are any errors in the forum, render the template and exit
23 if not form
.is_valid():
24 return render_to_response('aur/search.html', {
29 form
= PackageSearchForm()
31 results
= form
.search()
32 # Get sorting variables from query string or fallback on defaults
33 if request
.GET
.has_key('sortby'):
34 sortby
= request
.GET
['sortby']
35 if sortby
== 'maintainer':
39 if request
.GET
.has_key('order') and request
.GET
['order'] == 'desc':
40 sortby
= "".join(('-', sortby
))
42 results
= results
.order_by(sortby
, 'repository', 'category', 'name')
43 # If we only got one hit, just go to the package's detail page
44 if form
.is_bound
and results
.count() == 1:
45 return HttpResponseRedirect(reverse('aur-package_detail',
46 args
=[results
[0].name
,]))
47 # Replace the current page with the new one if it's already in GET
48 full_path
= request
.get_full_path()
49 if request
.GET
.has_key('page'):
50 link_template
= sub(r
'page=\d+', 'page=%d', request
.get_full_path())
51 elif full_path
.find('?') >= 0:
52 link_template
= full_path
+ '&page=%d'
54 link_template
= full_path
+ '?page=%d'
55 # Initialise the pagination
56 paginator
= BetterPaginator(results
, int(form
.get_or_default('limit')), link_template
)
57 paginator
.set_page(int(request
.GET
.get('page', '1')))
59 return render_to_response('aur/search.html', {
61 'packages': paginator
.get_page(),
69 if request
.method
== 'POST':
70 form
= PackageSubmitForm(request
.POST
, request
.FILES
)
72 form
.save(request
.user
)
73 return HttpResponseRedirect(reverse('aur-package_detail',
74 args
=[form
.cleaned_data
['package']['name'],]))
76 form
= PackageSubmitForm()
77 return render_to_response('aur/submit.html', {
82 def comment(request
, object_id
):
83 if request
.POST
and 'message' in request
.POST
:
84 package
= get_object_or_404(Package
, name
=object_id
)
85 comment
= Comment(package
=package
, user
=request
.user
,
86 message
=request
.POST
['message'],
87 ip
=request
.META
['REMOTE_ADDR'])
88 if 'reply_to' in request
.POST
:
89 comment
.parent
=request
.POST
['reply_to']
91 return HttpResponseRedirect(package
.get_absolute_url())
92 elif 'reply_to' in request
.POST
:
93 return render_to_response('aur/comment_form.html', {
95 'package_id': object_id
,
96 'reply_to': request
.POST
['reply_to'],
99 return HttpResponseRedirect(
100 reverse('aur-package_detail', args
=[object_id
,]))
102 def flag_out_of_date(request
, object_id
):
103 package
= get_object_or_404(Package
, name
=object_id
)
104 package
.outdated
= True
106 return HttpResponseRedirect(package
.get_absolute_url())
109 def notify_of_updates(request
, object_id
):
110 """Subscribe a user to package updates"""
111 package
= get_object_or_404(Package
, name
=object_id
)
112 PackageNotification(package
=package
, user
=request
.user
).save()
113 return HttpResponseRedirect(package
.get_absolute_url())
116 def denotify_of_updates(request
, object_id
):
117 """Unsubscribe a user from package updates"""
118 PackageNotification
.objects
.get(package__name
=object_id
, user
=request
.user
).delete()
119 return HttpResponseRedirect(reverse('aur-package_detail',
122 def api_search(request
, query
):
123 results
= Package
.objects
.filter(name__icontains
=query
)
124 data
= serializers
.serialize('json', results
,
132 return HttpResponse(data
, mimetype
="text/plain")
135 def manage_packages(request
):
136 if request
.method
!= 'POST':
137 return HttpResponseRedirect(reverse('aur-search'))
138 packages
= request
.POST
.getlist('packages')
139 if request
.POST
['action'] == 'unflag-ood':
140 for package_name
in packages
:
141 package
= Package
.objects
.get(name
=package_name
)
142 if request
.user
.get_profile().can_modify_package(package
):
143 package
.outdated
= False
146 return render_to_response('aur/error.html', dict(
147 heading
= ugettext("Permission denied"),
148 error
= "You are not allowed to edit %s" % package_name
,
150 elif request
.POST
['action'] == 'flag-ood':
151 for package_name
in packages
:
152 package
= Package
.objects
.get(name
=package_name
)
153 if request
.user
.get_profile().can_modify_package(package
):
154 package
.outdated
= True
157 return render_to_response('aur/error.html', dict(
158 heading
= ugettext("Permission denied"),
159 error
= "You are not allowed to edit %s" % package_name
,
161 elif request
.POST
['action'] == 'disown':
162 for package_name
in packages
:
163 package
= Package
.objects
.get(name
=package_name
)
164 if request
.user
.get_profile().can_modify_package(package
):
165 package
.maintainers
.clear()
167 return render_to_response('aur/error.html', dict(
168 heading
= ugettext("Permission denied"),
169 error
= "You cannot disown %s" % package_name
,
171 elif request
.POST
['action'] == 'adopt':
172 for package_name
in packages
:
173 package
= Package
.objects
.get(name
=package_name
)
174 if package
.maintainers
.count() == 0:
175 package
.maintainers
.add(request
.user
)
176 elif request
.user
.get_profile().is_moderator():
177 package
.maintainers
.add(request
.user
)
179 return render_to_response('aur/error.html', dict(
180 heading
= ugettext("Permission denied"),
181 error
= "You cannot adopt %s" % package_name
,
183 elif request
.POST
['action'] == 'delete':
184 for package_name
in packages
:
185 package
= Package
.objects
.get(name
=package_name
)
186 if request
.user
.get_profile().can_delete_package(package
):
189 return render_to_response('aur/error.html', dict(
190 heading
= ugettext("Permission denied"),
191 error
= "You are not allowed to delete %s" % package_name
,
193 return HttpResponseRedirect(request
.META
['HTTP_REFERER'])
195 def api_package_info(request
, object_id
):
196 package
= get_object_or_404(Package
, name
=object_id
)
197 data
= serializers
.serialize('json', [package
,])
198 return HttpResponse(data
, mimetype
="text/plain")
200 def api_package_comments(request
, object_id
):
201 comments
= Comment
.objects
.filter(package
=object_id
)
202 data
= serializers
.serialize('json', comments
)
203 return HttpResponse(data
, mimetype
="text/plain")