aboutsummaryrefslogtreecommitdiff
path: root/djangopypi/views/dists.py
diff options
context:
space:
mode:
Diffstat (limited to 'djangopypi/views/dists.py')
-rw-r--r--djangopypi/views/dists.py79
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 @@
1import os
2
3from django.conf import settings
4from django.http import (HttpResponse, HttpResponseForbidden,
5 HttpResponseBadRequest)
6from django.utils.translation import ugettext_lazy as _
7from django.contrib.auth import login
8
9from djangopypi.http import login_basic_auth, HttpResponseUnauthorized
10from djangopypi.forms import ProjectForm, ReleaseForm
11from djangopypi.models import Project, Release, Classifier, UPLOAD_TO
12
13ALREADY_EXISTS_FMT = _(
14 "A file named '%s' already exists for %s. Please create a new release.")
15
16
17def 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
69def 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)