-
Notifications
You must be signed in to change notification settings - Fork 2k
/
package_formalchemy.py
136 lines (120 loc) · 5.51 KB
/
package_formalchemy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import logging
import urlparse
from ckan.lib.base import BaseController, render, c, model, abort, request
from ckan.lib.base import config, h, ValidationException
from ckan.lib.package_saver import PackageSaver
from ckan.controllers.package import PackageController
import ckan.forms
from pylons.i18n import get_lang, _
from ckan.logic import check_access, NotAuthorized
from ckan.plugins import PluginImplementations, IPackageController
log = logging.getLogger(__name__)
class PackageFormalchemyController(PackageController):
def __init__(self):
self.extensions = PluginImplementations(IPackageController)
def new(self):
c.error = ''
is_admin = self.authorizer.is_sysadmin(c.user)
# Check access control for user to create a package.
try:
context = {'model': model, 'user': c.user or c.author}
check_access('package_create',context)
except NotAuthorized:
abort(401, _('Unauthorized to create a package'))
# Get the name of the package form.
try:
fs = self._get_package_fieldset(is_admin=is_admin)
except ValueError, e:
abort(400, e)
if 'save' in request.params:
if not request.params.has_key('log_message'):
abort(400, ('Missing parameter: log_message'))
log_message = request.params['log_message']
record = model.Package
if request.params.has_key('save'):
fs = fs.bind(record, data=dict(request.params) or None, session=model.Session)
try:
PackageSaver().commit_pkg(fs, log_message, c.author, client=c)
pkgname = fs.name.value
pkg = model.Package.by_name(pkgname)
admins = []
if c.user:
user = model.User.by_name(c.user)
if user:
admins = [user]
model.setup_default_user_roles(pkg, admins)
for item in self.extensions:
item.create(pkg)
model.repo.commit_and_remove()
self._form_save_redirect(pkgname, 'new')
except ValidationException, error:
fs = error.args[0]
c.form = self._render_edit_form(fs, request.params,
clear_session=True)
return render('package/new.html')
except KeyError, error:
abort(400, ('Missing parameter: %s' % error.args).encode('utf8'))
# use request params even when starting to allow posting from "outside"
# (e.g. bookmarklet)
if 'name' in request.params or 'url' in request.params:
# ensure all fields specified in params (formalchemy needs this on bind)
from ckan.forms import add_to_package_dict,get_package_dict
data = add_to_package_dict(get_package_dict(fs=fs), request.params)
fs = fs.bind(model.Package, data=data, session=model.Session)
else:
fs = fs.bind(session=model.Session)
c.form = self._render_edit_form(fs, request.params, clear_session=True)
return render('package/new.html')
def edit(self, id=None): # allow id=None to allow posting
# TODO: refactor to avoid duplication between here and new
c.error = ''
c.pkg = pkg = model.Package.get(id)
if pkg is None:
abort(404, '404 Not Found')
model.Session().autoflush = False
context = {'model': model, 'user': c.user or c.author, 'package':pkg}
try:
check_access('package_update',context)
except NotAuthorized:
abort(401, _('User %r not authorized to edit %s') % (c.user, pkg.id))
try:
check_access('package_change_state',context)
auth_for_change_state = True
except NotAuthorized:
auth_for_change_state = False
try:
fs = self._get_package_fieldset(is_admin=auth_for_change_state)
except ValueError, e:
abort(400, e)
if 'save' in request.params:
if not request.params.has_key('log_message'):
abort(400, ('Missing parameter: log_message'))
log_message = request.params['log_message']
# id is the name (pre-edited state)
pkgname = id
params = dict(request.params) # needed because request is nested
# multidict which is read only
fs = fs.bind(pkg, data=params or None)
try:
for item in self.extensions:
item.edit(fs.model)
PackageSaver().commit_pkg(fs, log_message, c.author, client=c)
# do not use package name from id, as it may have been edited
pkgname = fs.name.value
self._form_save_redirect(pkgname, 'edit')
except ValidationException, error:
fs = error.args[0]
c.form = self._render_edit_form(fs, request.params,
clear_session=True)
return render('package/edit.html')
except KeyError, error:
abort(400, 'Missing parameter: %s' % error.args)
else:
# edit
c.pkgname = pkg.name
c.pkgtitle = pkg.title
if pkg.license_id:
self._adjust_license_id_options(pkg, fs)
fs = fs.bind(pkg)
c.form = self._render_edit_form(fs, request.params)
return render('package/edit.html')