Import forms instead of newforms (Django 1.0)
[aur2.git] / archlinux / aur / views.py
blob3d0db0ad21730642da33dfa27bce732d095c07d8
1 from re import sub
2 import os
3 import sys
4 import tarfile
5 import hashlib
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', {
25 'form': form,
26 'user': request.user
28 else:
29 form = PackageSearchForm()
30 # Execute the search
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':
36 sortby = 'name'
37 else:
38 sortby = 'name'
39 if request.GET.has_key('order') and request.GET['order'] == 'desc':
40 sortby = "".join(('-', sortby))
41 # Sort the results
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'
53 else:
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', {
60 'form': form,
61 'packages': paginator.get_page(),
62 'pager': paginator,
63 'user': request.user,
64 'request': request,
67 @login_required
68 def submit(request):
69 if request.method == 'POST':
70 form = PackageSubmitForm(request.POST, request.FILES)
71 if form.is_valid():
72 form.save(request.user)
73 return HttpResponseRedirect(reverse('aur-package_detail',
74 args=[form.cleaned_data['package']['name'],]))
75 else:
76 form = PackageSubmitForm()
77 return render_to_response('aur/submit.html', {
78 'user': request.user,
79 'form': form,
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']
90 comment.save()
91 return HttpResponseRedirect(package.get_absolute_url())
92 elif 'reply_to' in request.POST:
93 return render_to_response('aur/comment_form.html', {
94 'user': request.user,
95 'package_id': object_id,
96 'reply_to': request.POST['reply_to'],
98 else:
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
105 package.save()
106 return HttpResponseRedirect(package.get_absolute_url())
108 @login_required
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())
115 @login_required
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',
120 args=[object_id,]))
122 def api_search(request, query):
123 results = Package.objects.filter(name__icontains=query)
124 data = serializers.serialize('json', results,
125 fields=(
126 'name',
127 'version',
128 'respository__name',
129 'description'
132 return HttpResponse(data, mimetype="text/plain")
134 @login_required
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
144 package.save()
145 else:
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
155 package.save()
156 else:
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()
166 else:
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)
178 else:
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):
187 package.delete()
188 else:
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")