diff options
Diffstat (limited to 'djangopypi/views.py')
-rw-r--r-- | djangopypi/views.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/djangopypi/views.py b/djangopypi/views.py new file mode 100644 index 0000000..90a9846 --- /dev/null +++ b/djangopypi/views.py | |||
@@ -0,0 +1,85 @@ | |||
1 | # Create your views here. | ||
2 | from django.http import HttpResponse, HttpResponseBadRequest, QueryDict | ||
3 | from django.shortcuts import render_to_response | ||
4 | from djangopypi.models import Project | ||
5 | from djangopypi.forms import ProjectRegisterForm | ||
6 | from django.template import RequestContext | ||
7 | from yadayada.utils import template_path_builder | ||
8 | from django.utils.datastructures import MultiValueDict | ||
9 | from django.core.files.uploadedfile import SimpleUploadedFile | ||
10 | |||
11 | T = template_path_builder("djangopypi") | ||
12 | |||
13 | |||
14 | def parse_weird_post_data(data): | ||
15 | sep = data.splitlines()[1] | ||
16 | items = data.split(sep) | ||
17 | post_data = {} | ||
18 | files = {} | ||
19 | for part in items: | ||
20 | if not part.strip(): | ||
21 | continue | ||
22 | item = part.splitlines() | ||
23 | if len(item) < 2: continue | ||
24 | header = item[1].replace("Content-Disposition: form-data; ", "") | ||
25 | kvpairs = header.split(";") | ||
26 | headers = {} | ||
27 | for kvpair in kvpairs: | ||
28 | if not kvpair: continue | ||
29 | key, value = kvpair.split("=") | ||
30 | headers[key] = value.strip('"') | ||
31 | if not "name" in headers: continue | ||
32 | content = part[len("\n".join(item[0:2]))+2:len(part)-1] | ||
33 | if "filename" in headers: | ||
34 | file = SimpleUploadedFile(headers["filename"], content, | ||
35 | content_type="application/gzip") | ||
36 | files[headers["name"]] = file | ||
37 | elif headers["name"] in post_data: | ||
38 | post_data[headers["name"]].append(content) | ||
39 | else: | ||
40 | post_data[headers["name"]] = [content] | ||
41 | |||
42 | return MultiValueDict(post_data), files | ||
43 | |||
44 | |||
45 | def simple(request, template_name=T("simple")): | ||
46 | if request.method == "POST": | ||
47 | post_data, files = parse_weird_post_data(request.raw_post_data) | ||
48 | action = post_data.get(":action") | ||
49 | classifiers = post_data.getlist("classifiers") | ||
50 | register_form = ProjectRegisterForm(post_data.copy()) | ||
51 | if register_form.is_valid(): | ||
52 | return HttpResponse(register_form.save(classifiers, | ||
53 | file=files.get("content"))) | ||
54 | return HttpResponse("Successfully registered.") | ||
55 | return HttpResponse("ERRORS: %s" % register_form.errors) | ||
56 | |||
57 | dists = Project.objects.all() | ||
58 | context = RequestContext(request, { | ||
59 | "dists": dists, | ||
60 | }) | ||
61 | |||
62 | return render_to_response(template_name, context_instance=context) | ||
63 | |||
64 | def show_links(request, dist_name, template_name=T("show_links")): | ||
65 | releases = Project.objects.get(name=dist_name) \ | ||
66 | .releases.all().order_by('-version') | ||
67 | |||
68 | context = RequestContext(request, { | ||
69 | "dist_name": dist_name, | ||
70 | "releases": releases, | ||
71 | }) | ||
72 | |||
73 | return render_to_response(template_name, context_instance=context) | ||
74 | |||
75 | def show_version(request, dist_name, version, template_name=T("show_version")): | ||
76 | release = Project.objects.get(name=dist_name).releases \ | ||
77 | .get(version=version) | ||
78 | |||
79 | context = RequestContext(request, { | ||
80 | "dist_name": dist_name, | ||
81 | "version": version, | ||
82 | "release": release, | ||
83 | }) | ||
84 | |||
85 | return render_to_response(template_name, context_instance=context) | ||