Changeset 857:2a85b3f15ff9
- Timestamp:
- 03/10/10 12:40:08 (6 months ago)
- Branch:
- default
- Parents:
- 856:53f62c87b551 (diff), 855:68630d75f031 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- ckan
- Files:
-
- 16 modified
-
getdata/cospread.py (modified) (2 diffs)
-
getdata/cospread.py (modified) (1 diff)
-
getdata/data4nr.py (modified) (1 diff)
-
getdata/data4nr.py (modified) (1 diff)
-
getdata/ons_import.py (modified) (2 diffs)
-
getdata/ons_import.py (modified) (1 diff)
-
lib/create_test_data.py (modified) (9 diffs)
-
lib/create_test_data.py (modified) (3 diffs)
-
lib/package_saver.py (modified) (1 diff)
-
lib/package_saver.py (modified) (4 diffs)
-
lib/search.py (modified) (2 diffs)
-
lib/search.py (modified) (7 diffs)
-
model/core.py (modified) (9 diffs)
-
model/core.py (modified) (1 diff)
-
templates/package/read_core.html (modified) (2 diffs)
-
templates/package/read_core.html (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
ckan/getdata/cospread.py
r850 r857 140 140 _dict['%s - standard' % field] == 'Other (specify)' else \ 141 141 _dict['%s - standard' % field] 142 if 'HESA' in _dict['licence']:143 license_str= u'OKD Compliant::Higher Education Statistics Agency Copyright with data.gov.uk rights'144 else:145 license_str= u'OKD Compliant::UK Crown Copyright with data.gov.uk rights'142 #if 'HESA' in _dict['licence']: 143 # license_title = u'OKD Compliant::Higher Education Statistics Agency Copyright with data.gov.uk rights' 144 #else: 145 # license_title = u'OKD Compliant::UK Crown Copyright with data.gov.uk rights' 146 146 147 147 # extras … … 240 240 pkg.add_resource(resource['url'], format=format, description=resource['description']) 241 241 pkg.notes=notes 242 pkg.license =model.License.by_name(license_str)242 pkg.license_id = u'dsl' # Todo: Fix this. model.License.by_name(license_str) 243 243 assert pkg.license 244 244 if not existing_pkg: -
ckan/getdata/cospread.py
r856 r857 299 299 group = model.Group(name=self._groupname) 300 300 model.Session.add(group) 301 user = model.User.by_name(self._username) 302 model.setup_default_user_roles(group, [user]) 301 303 302 304 def _new_revision(self): -
ckan/getdata/data4nr.py
r850 r857 123 123 pkg.add_resource(res_url, description=res_description) 124 124 pkg.notes=notes 125 license_str = u'OKD Compliant::UK Crown Copyright with data.gov.uk rights' 126 pkg.license = model.License.by_name(license_str) 125 pkg.license_id = u'dsl' # Todo: Fix this. 127 126 if not existing_pkg: 128 127 user = model.User.by_name(self._username) -
ckan/getdata/data4nr.py
r856 r857 188 188 group = model.Group(name=self._groupname) 189 189 model.Session.add(group) 190 user = model.User.by_name(self._username) 191 model.setup_default_user_roles(group, [user]) 190 192 191 193 self._existing_pkgs = [] -
ckan/getdata/ons_import.py
r850 r857 119 119 pkg.title = title 120 120 pkg.notes = '\n\n'.join(notes_list) 121 pkg.license = model.Session.query(model.License).get(self._crown_license_id)121 pkg.license_id = self._crown_license_id 122 122 pkg.extras = extras 123 123 if extras['department']: … … 190 190 self._item_count = 0 191 191 self._new_package_count = 0 192 license_str = u'OKD Compliant::UK Crown Copyright with data.gov.uk rights' 193 self._crown_license_id = model.License.by_name(license_str).id 192 self._crown_license_id = u'dsl' # Todo: Fix this. 194 193 195 194 -
ckan/getdata/ons_import.py
r856 r857 208 208 group = model.Group(name=groupname) 209 209 model.Session.add(group) 210 user = model.User.by_name(username) 211 model.setup_default_user_roles(group, [user]) 210 212 211 213 if model.Session.new: -
ckan/lib/create_test_data.py
r850 r857 108 108 pkg.groups.append(group) 109 109 elif attr == 'license': 110 license = model.License.by_name(val) 111 pkg.license = license 110 pkg.license_id = val 112 111 elif attr == 'license_id': 113 license = model.Session.query(model.License).get(val) 114 pkg.license = license 112 pkg.license_id = val 115 113 elif attr == 'extras': 116 114 pkg.extras = val … … 204 202 pkg2.tags = [ tag1 ] 205 203 self.tag_names = [u'russian', u'tolstoy'] 206 license1 = model.License.by_name(u'OKD Compliant::Other') 207 pkg1.license = license1 204 pkg1.license_id = u'agpl-v3' 208 205 pkg2.title = u'A Wonderful Story' 209 206 genre_extra = model.PackageExtra(key=u'genre', value='romantic novel') … … 284 281 'tags':'registry country-usa government federal gov workshop-20081101', 285 282 'groups':'ukgov test1 test2 penguin', 286 'license':' OKD Compliant::Other',283 'license':'agpl-v3', 287 284 'notes':'''From <http://www.gpoaccess.gov/gils/about.html> 288 285 … … 297 294 'tags':'images graphics photographs photos pictures us usa america history wildlife nature war military todo-split gov', 298 295 'groups':'ukgov test1 penguin', 299 'license':' OKD Compliant::Other',296 'license':'agpl-v3', 300 297 'notes':'''## About 301 298 … … 313 310 'tags':'us courts case-law us courts case-law gov legal law access-bulk penguins penguin', 314 311 'groups':'ukgov test2 penguin', 315 'license':' OKD Compliant::Creative Commons CCZero',312 'license':'cc-zero', 316 313 'notes':'''### Description 317 314 … … 335 332 'groups':'penguin', 336 333 'tags':'country-sweden format-pdf access-www documents publications government eutransparency', 337 'license':' Other::License Not Specified',334 'license':'', 338 335 'notes':'''### About 339 336 … … 351 348 'download_url':'http://www.opengov.se/data/open/', 352 349 'tags':'country-sweden government data', 353 'license':' OKD Compliant::Creative Commons Attribution-ShareAlike',350 'license':'cc-by-sa', 354 351 'notes':'''### About 355 352 … … 379 376 'author':'DCSF Data Services Group', 380 377 'author_email':'statistics@dcsf.gsi.gov.uk', 381 'license':' Non-OKD Compliant::Crown Copyright',378 'license':'dsl', 382 379 'tags':'children fostering', 383 380 'extras':{ … … 406 403 'author':'DECC Energy Statistics Team', 407 404 'author_email':'energy.stats@decc.gsi.gov.uk', 408 'license':' Non-OKD Compliant::Crown Copyright',405 'license':'dsl', 409 406 'tags':'fuel prices', 410 407 'extras':{ -
ckan/lib/create_test_data.py
r856 r857 56 56 self.pkg_names = [] 57 57 self.tag_names = [] 58 self.group_names = []58 self.group_names = set() 59 59 self.user_names = extra_user_names 60 60 admins_list = [] # list of (package_name, admin_names) … … 104 104 if not group: 105 105 group = model.Group(name=group_name) 106 self.group_names.a ppend(group_name)106 self.group_names.add(group_name) 107 107 model.Session.add(group) 108 108 pkg.groups.append(group) … … 129 129 user = model.User(name=unicode(user_name)) 130 130 model.Session.add(user) 131 for group_name in self.group_names: 132 model.setup_default_user_roles(group) 131 133 model.repo.commit_and_remove() 132 134 -
ckan/lib/package_saver.py
r854 r857 73 73 # remove everything from session so nothing can get saved accidentally 74 74 model.Session.clear() 75 # license field's _id only updated, not object.id, so cludge that:76 if fs.model.license_id:77 fs.model.license = model.Session.query(model.License).get(fs.model.license_id)78 75 return out 79 76 -
ckan/lib/package_saver.py
r856 r857 17 17 log_message=None, 18 18 author=None): 19 'Renders a package on the basis of a fieldset - perfect for preview' 19 '''Renders a package on the basis of a fieldset - perfect for 20 preview of form data. 21 Note that the actual calling of render('package/read') is left 22 to the caller.''' 20 23 pkg = cls._preview_pkg(fs, original_name, record_id, 21 24 log_message, author) … … 25 28 @classmethod 26 29 def render_package(cls, pkg): 27 'Renders a package' 30 '''Prepares for rendering a package. Takes a Package object and 31 formats it for the various context variables required to call 32 render. 33 Note that the actual calling of render('package/read') is left 34 to the caller.''' 28 35 c.pkg = pkg 29 36 notes_formatted = ckan.misc.MarkdownFormat().to_html(pkg.notes) … … 33 40 c.pkg_author_link = cls._person_email_link(c.pkg.author, c.pkg.author_email, "Author") 34 41 c.pkg_maintainer_link = cls._person_email_link(c.pkg.maintainer, c.pkg.maintainer_email, "Maintainer") 42 c.package_relationships = pkg.relationships_printable() 35 43 # c.auth_for_change_state and c.auth_for_edit may also used 36 44 # return render('package/read') … … 57 65 fs.model.groups 58 66 fs.model.ratings 67 fs.model.relationships_as_subject 68 fs.model.relationships_as_object 59 69 except ValidationException, e: 60 70 # remove everything from session so nothing can get saved accidentally -
ckan/lib/search.py
r848 r857 5 5 6 6 import ckan.model as model 7 from licenses import LicenseList 7 8 8 from ckan import authz 9 9 … … 277 277 return query 278 278 279 def _update_open_licenses(self): 279 def _update_open_licenses(self): # Update, or init? 280 280 self._open_licenses = [] 281 for license_name in LicenseList.all_formatted: 282 _license = model.License.by_name(license_name, autoflush=False) 283 if _license and _license.isopen(): 284 self._open_licenses.append(_license.id) 281 for license in model.Package.get_license_register().values(): 282 if license and license.isopen(): 283 self._open_licenses.append(license.id) 285 284 286 285 def _format_results(self): -
ckan/lib/search.py
r856 r857 5 5 6 6 import ckan.model as model 7 8 from ckan import authz 7 9 8 10 ENABLE_CACHING = bool(config.get('enable_caching', '')) … … 60 62 return self.run(options) 61 63 62 def query(self, options ):64 def query(self, options, username=None): 63 65 '''For the given search options, returns a query object.''' 64 66 self._options = options … … 70 72 71 73 if self._options.entity == 'package': 72 query = self._build_package_query(general_terms, field_specific_terms) 74 query = authz.Authorizer().authorized_query(username, model.Package) 75 query = self._build_package_query(query, general_terms, field_specific_terms) 73 76 elif self._options.entity == 'tag': 74 77 query = self._build_tags_query(general_terms) 75 78 elif self._options.entity == 'group': 76 query = self._build_groups_query(general_terms) 79 query = authz.Authorizer().authorized_query(username, model.Group) 80 query = self._build_groups_query(query, general_terms) 77 81 else: 78 82 # error … … 80 84 return query 81 85 82 def run(self, options ):86 def run(self, options, username=None): 83 87 '''For the given search options, returns query results.''' 84 query = self.query(options )88 query = self.query(options, username) 85 89 86 90 self._results = {} … … 151 155 return general_terms, field_specific_terms 152 156 153 def _build_package_query(self, general_terms, field_specific_terms): 157 def _build_package_query(self, authorized_package_query, 158 general_terms, field_specific_terms): 154 159 make_like = lambda x,y: x.ilike('%' + y + '%') 155 query = model.Session.query(model.Package)160 query = authorized_package_query 156 161 query = query.filter(model.package_search_table.c.package_id==model.Package.id) 157 162 … … 206 211 207 212 query = query.distinct() 208 query = query.filter(model.Package.state == model.State.ACTIVE)209 213 return query 210 214 … … 215 219 return query 216 220 217 def _build_groups_query(self, general_terms):218 query = model.Session.query(model.Group)221 def _build_groups_query(self, authorized_package_query, general_terms): 222 query = authorized_package_query 219 223 for term in general_terms: 220 224 query = query.filter(model.Group.name.contains(term.lower())) -
ckan/model/core.py
r854 r857 7 7 from types import make_uuid 8 8 import full_search 9 from license import License, LicenseRegister 9 10 10 11 ## VDM-specific tables … … 13 14 14 15 ## Our Domain Object Tables 15 16 license_table = Table('license', metadata,17 Column('id', types.Integer, primary_key=True),18 Column('name', types.Unicode(100)),19 )20 16 21 17 package_table = Table('package', metadata, … … 30 26 Column('maintainer_email', types.UnicodeText), 31 27 Column('notes', types.UnicodeText), 32 Column('license_id', types. Integer, ForeignKey('license.id')),28 Column('license_id', types.UnicodeText), 33 29 ) 34 30 … … 45 41 46 42 47 vdm.sqlalchemy.make_table_stateful(license_table)48 43 vdm.sqlalchemy.make_table_stateful(package_table) 49 44 vdm.sqlalchemy.make_table_stateful(package_tag_table) … … 117 112 return self.__unicode__() 118 113 119 120 class License(DomainObject):121 def isopen(self):122 if self.name and \123 (self.name.startswith('OKD Compliant')124 or125 self.name.startswith('OSI Approved')126 ):127 return True128 return False129 114 130 115 class Package(vdm.sqlalchemy.RevisionedObjectMixin, … … 181 166 _dict['groups'] = [group.name for group in self.groups] 182 167 if self.license: 183 _dict['license'] = self.license. name168 _dict['license'] = self.license.id 184 169 else: 185 170 _dict['license'] = '' … … 207 192 else: 208 193 raise NotImplementedError, 'Package relationship type: %r' % type_ 209 194 195 210 196 rel = package_relationship.PackageRelationship( 211 197 subject=subject, … … 252 238 rel_list.append((child_pkg, type_printable)) 253 239 return rel_list 240 # 241 ## Licenses are currently integrated into the domain model here. 242 243 @classmethod 244 def get_license_register(self): 245 if not hasattr(self, '_license_register'): 246 self._license_register = LicenseRegister() 247 return self._license_register 248 249 @classmethod 250 def get_license_options(self): 251 register = self.get_license_register() 252 return [(l.title, l.id) for l in register.values()] 253 254 def get_license(self): 255 license = None 256 if self.license_id: 257 license = self.get_license_register()[self.license_id] 258 return license 259 260 def set_license(self, license): 261 if type(license) == License: 262 self.license_id = license.id 263 elif type(license) == dict: 264 self.license_id = license['id'] 265 else: 266 msg = "Value not a license object or entity: %s" % repr(license) 267 raise Exception, msg 268 269 license = property(get_license, set_license) 270 254 271 255 272 class Tag(DomainObject): … … 299 316 Revision = vdm.sqlalchemy.make_Revision(mapper, revision_table) 300 317 301 mapper(License, license_table,302 order_by=license_table.c.id)303 304 318 mapper(Package, package_table, properties={ 305 'license':relation(License),306 319 # delete-orphan on cascade does NOT work! 307 320 # Why? Answer: because of way SQLAlchemy/our code works there are points -
ckan/model/core.py
r856 r857 205 205 return self.relationships_as_subject + self.relationships_as_object 206 206 207 def relationships_printable(self): 208 '''Returns a list of tuples describing related packages, including 209 non-direct relationships (such as siblings). 210 @return: e.g. [(annakarenina, u"is a parent"), ...] 211 ''' 212 from package_relationship import PackageRelationship 213 rel_list = [] 214 # forward types 215 for rel_as_subject in self.relationships_as_subject: 216 type_printable = PackageRelationship.make_type_printable(rel_as_subject.type) 217 rel_list.append((rel_as_subject.object, type_printable)) 218 # reverse types 219 for rel_as_object in self.relationships_as_object: 220 type_printable = PackageRelationship.make_type_printable(\ 221 PackageRelationship.forward_to_reverse_type( 222 rel_as_object.type) 223 ) 224 rel_list.append((rel_as_object.subject, type_printable)) 225 # sibling types 226 # e.g. 'gary' is a child of 'mum', looking for 'bert' is a child of 'mum' 227 # i.e. for each 'child_of' type relationship ... 228 for rel_as_subject in self.relationships_as_subject: 229 # ... parent is the object 230 parent_pkg = rel_as_subject.object 231 # Now look for the parent's other relationships as object ... 232 for parent_rel_as_object in parent_pkg.relationships_as_object: 233 # and check children 234 child_pkg = parent_rel_as_object.subject 235 if child_pkg != self and \ 236 parent_rel_as_object.type == rel_as_subject.type: 237 type_printable = PackageRelationship.inferred_types_printable['sibling'] 238 rel_list.append((child_pkg, type_printable)) 239 return rel_list 207 240 # 208 241 ## Licenses are currently integrated into the domain model here. -
ckan/templates/package/read_core.html
r854 r857 20 20 <dt>${package_license_icon(c.pkg)}</dt> 21 21 <py:choose test=""> 22 <dd py:when="c.pkg.license">${c.pkg.license.name} 23 </dd> 22 <dd py:when="c.pkg.license">${c.pkg.license.title}</dd> 24 23 <dd py:otherwise=""> 25 24 License not given … … 76 75 <p py:when="c.pkg.license"> 77 76 This package is licensed 78 <strong>${c.pkg.license. name}</strong>.77 <strong>${c.pkg.license.title}</strong>. 79 78 </p> 80 79 <p py:otherwise=""> -
ckan/templates/package/read_core.html
r856 r857 28 28 <dd>${"Resources available for download" if c.pkg.resources else "No resources given"}</dd> 29 29 </dl> 30 <py:if test="c.package_relationships"> 31 <h3>Related packages</h3> 32 <ul> 33 <py:for each="pkg, relationship_str in c.package_relationships"> 34 <li>${h.literal(relationship_str % (h.link_to(pkg.name, h.url_for(controller="package", action="read", id=pkg.name))))}</li> 35 </py:for> 36 </ul> 37 </py:if> 30 38 </div> 31 39