diff options
Diffstat (limited to 'djangopypi/views/dists.py')
-rw-r--r-- | djangopypi/views/dists.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/djangopypi/views/dists.py b/djangopypi/views/dists.py new file mode 100644 index 0000000..9e4a146 --- /dev/null +++ b/djangopypi/views/dists.py | |||
@@ -0,0 +1,79 @@ | |||
1 | import os | ||
2 | |||
3 | from django.conf import settings | ||
4 | from django.http import (HttpResponse, HttpResponseForbidden, | ||
5 | HttpResponseBadRequest) | ||
6 | from django.utils.translation import ugettext_lazy as _ | ||
7 | from django.contrib.auth import login | ||
8 | |||
9 | from djangopypi.http import login_basic_auth, HttpResponseUnauthorized | ||
10 | from djangopypi.forms import ProjectForm, ReleaseForm | ||
11 | from djangopypi.models import Project, Release, Classifier, UPLOAD_TO | ||
12 | |||
13 | ALREADY_EXISTS_FMT = _( | ||
14 | "A file named '%s' already exists for %s. Please create a new release.") | ||
15 | |||
16 | |||
17 | def submit_project_or_release(user, post_data, files): | ||
18 | """Registers/updates a project or release""" | ||
19 | try: | ||
20 | project = Project.objects.get(name=post_data['name']) | ||
21 | if project.owner != user: | ||
22 | return HttpResponseForbidden( | ||
23 | "That project is owned by someone else!") | ||
24 | except Project.DoesNotExist: | ||
25 | project = None | ||
26 | |||
27 | project_form = ProjectForm(post_data, instance=project) | ||
28 | if project_form.is_valid(): | ||
29 | project = project_form.save(commit=False) | ||
30 | project.owner = user | ||
31 | project.save() | ||
32 | for c in post_data.getlist('classifiers'): | ||
33 | classifier, created = Classifier.objects.get_or_create(name=c) | ||
34 | project.classifiers.add(classifier) | ||
35 | if files: | ||
36 | allow_overwrite = getattr(settings, | ||
37 | "DJANGOPYPI_ALLOW_VERSION_OVERWRITE", False) | ||
38 | try: | ||
39 | release = Release.objects.get(version=post_data['version'], | ||
40 | project=project, | ||
41 | distribution=UPLOAD_TO + '/' + | ||
42 | files['distribution']._name) | ||
43 | if not allow_overwrite: | ||
44 | return HttpResponseForbidden(ALREADY_EXISTS_FMT % ( | ||
45 | release.filename, release)) | ||
46 | except Release.DoesNotExist: | ||
47 | release = None | ||
48 | |||
49 | # If the old file already exists, django will append a _ after the | ||
50 | # filename, however with .tar.gz files django does the "wrong" | ||
51 | # thing and saves it as project-0.1.2.tar_.gz. So remove it before | ||
52 | # django sees anything. | ||
53 | release_form = ReleaseForm(post_data, files, instance=release) | ||
54 | if release_form.is_valid(): | ||
55 | if release and os.path.exists(release.distribution.path): | ||
56 | os.remove(release.distribution.path) | ||
57 | release = release_form.save(commit=False) | ||
58 | release.project = project | ||
59 | release.save() | ||
60 | else: | ||
61 | return HttpResponseBadRequest( | ||
62 | "ERRORS: %s" % release_form.errors) | ||
63 | else: | ||
64 | return HttpResponseBadRequest("ERRORS: %s" % project_form.errors) | ||
65 | |||
66 | return HttpResponse() | ||
67 | |||
68 | |||
69 | def register_or_upload(request, post_data, files): | ||
70 | user = login_basic_auth(request) | ||
71 | if not user: | ||
72 | return HttpResponseUnauthorized('pypi') | ||
73 | |||
74 | login(request, user) | ||
75 | if not request.user.is_authenticated(): | ||
76 | return HttpResponseForbidden( | ||
77 | "Not logged in, or invalid username/password.") | ||
78 | |||
79 | return submit_project_or_release(user, post_data, files) | ||