Skip to content

Commit

Permalink
[merge] moderated edits branch
Browse files Browse the repository at this point in the history
  • Loading branch information
johnglover committed Jul 27, 2011
2 parents a40230e + 1e3a063 commit 116dd07
Show file tree
Hide file tree
Showing 9 changed files with 108 additions and 23 deletions.
1 change: 1 addition & 0 deletions ckan/controllers/package.py
Expand Up @@ -506,6 +506,7 @@ def authz(self, id):
pkg = model.Package.get(id)
if pkg is None:
abort(404, gettext('Package not found'))
c.pkg = pkg # needed to add in the tab bar to the top of the auth page
c.pkgname = pkg.name
c.pkgtitle = pkg.title

Expand Down
3 changes: 0 additions & 3 deletions ckan/controllers/tag.py
Expand Up @@ -49,9 +49,6 @@ def index(self):
def read(self, id):
query = model.Session.query(model.Tag)
query = query.filter(model.Tag.name==id)
query = query.options(eagerload_all('package_tags.package'))
query = query.options(eagerload_all('package_tags.package.package_tags.tag'))
query = query.options(eagerload_all('package_tags.package.resource_groups_all.resources_all'))
c.tag = query.first()
if c.tag is None:
abort(404)
Expand Down
17 changes: 9 additions & 8 deletions ckan/lib/dictization/model_save.py
Expand Up @@ -5,17 +5,15 @@
##package saving

def resource_dict_save(res_dict, context):

model = context["model"]
session = context["session"]

obj = None

# try to get resource object directly from context, then by ID
# if not found, create a new resource object
id = res_dict.get("id")

if id:
obj = context.get("resource")
if (not obj) and id:
obj = session.query(model.Resource).get(id)

if not obj:
obj = model.Resource()

Expand All @@ -30,14 +28,17 @@ def resource_dict_save(res_dict, context):
if key in fields:
setattr(obj, key, value)
else:
# resources save extras directly onto the object, instead
# of in a separate extras field like packages and groups
obj.extras[key] = value

if context.get('pending'):
if session.is_modified(obj, include_collections=False):
obj.state = 'pending'
obj.state = u'pending'
else:
obj.state = u'active'

session.add(obj)

return obj

def package_resource_list_save(res_dicts, package, context):
Expand Down
15 changes: 11 additions & 4 deletions ckan/logic/action/get.py
@@ -1,5 +1,6 @@
from sqlalchemy.sql import select
from ckan.logic import NotFound, check_access
from ckan.model import Session
from ckan.plugins import (PluginImplementations,
IGroupController,
IPackageController)
Expand All @@ -21,7 +22,9 @@ def package_list(context, data_dict):
api = context.get("api_version", '1')
ref_package_by = 'id' if api == '2' else 'name'

query = ckan.authz.Authorizer().authorized_query(user, model.Package)
query = Session.query(model.PackageRevision)
query = query.filter(model.PackageRevision.state=='active')
query = query.filter(model.PackageRevision.current==True)
packages = query.all()
return [getattr(p, ref_package_by) for p in packages]

Expand All @@ -30,7 +33,7 @@ def current_package_list_with_resources(context, data_dict):
user = context["user"]
limit = data_dict.get("limit")

q = ckan.authz.Authorizer().authorized_query(user, model.PackageRevision)
q = Session.query(model.PackageRevision)
q = q.filter(model.PackageRevision.state=='active')
q = q.filter(model.PackageRevision.current==True)

Expand All @@ -50,8 +53,12 @@ def current_package_list_with_resources(context, data_dict):
result_dict["resources"] = resource_list_dictize(result, context)
license_id = result_dict['license_id']
if license_id:
isopen = model.Package.get_license_register()[license_id].isopen()
result_dict['isopen'] = isopen
try:
isopen = model.Package.get_license_register()[license_id].isopen()
result_dict['isopen'] = isopen
except KeyError:
# TODO: create a log message this error?
result_dict['isopen'] = False
else:
result_dict['isopen'] = False
package_list.append(result_dict)
Expand Down
63 changes: 61 additions & 2 deletions ckan/logic/action/update.py
Expand Up @@ -9,15 +9,18 @@
from ckan.lib.dictization.model_dictize import (package_dictize,
package_to_api1,
package_to_api2,
resource_dictize,
group_dictize,
group_to_api1,
group_to_api2)
from ckan.lib.dictization.model_save import (group_api_to_dict,
package_api_to_dict,
group_dict_save,
package_dict_save)
package_dict_save,
resource_dict_save)
from ckan.logic.schema import (default_update_group_schema,
default_update_package_schema)
default_update_package_schema,
default_update_resource_schema)
from ckan.lib.navl.dictization_functions import validate
log = logging.getLogger(__name__)

Expand All @@ -39,6 +42,18 @@ def package_error_summary(error_dict):
error_summary[_(prettify(key))] = error[0]
return error_summary

def resource_error_summary(error_dict):

error_summary = {}
for key, error in error_dict.iteritems():
if key == 'extras':
error_summary[_('Extras')] = _('Missing Value')
elif key == 'extras_validation':
error_summary[_('Extras')] = error[0]
else:
error_summary[_(prettify(key))] = error[0]
return error_summary

def group_error_summary(error_dict):

error_summary = {}
Expand Down Expand Up @@ -146,6 +161,50 @@ def make_latest_pending_package_active(context, data_dict):
session.remove()


def resource_update(context, data_dict):
model = context['model']
session = context['session']
user = context['user']
id = context["id"]
schema = context.get('schema') or default_update_resource_schema()
model.Session.remove()

resource = model.Resource.get(id)
context["resource"] = resource

if not resource:
raise NotFound(_('Resource was not found.'))
context["id"] = resource.id

# TODO: can check_access be used against a resource?
query = session.query(model.Package
).join(model.ResourceGroup
).join(model.Resource
).filter(model.ResourceGroup.id == resource.resource_group_id)
pkg = query.first()
if not pkg:
raise NotFound(_('No package found for this resource, cannot check auth.'))

check_access(pkg, model.Action.EDIT, context)

data, errors = validate(data_dict, schema, context)

if errors:
model.Session.rollback()
raise ValidationError(errors, resource_error_summary(errors))

rev = model.repo.new_revision()
rev.author = user
if 'message' in context:
rev.message = context['message']
else:
rev.message = _(u'REST API: Update object %s') % data.get("name")

resource = resource_dict_save(data, context)
model.repo.commit()
return resource_dictize(resource, context)


def package_update(context, data_dict):
model = context['model']
user = context['user']
Expand Down
4 changes: 4 additions & 0 deletions ckan/logic/schema.py
Expand Up @@ -44,6 +44,10 @@ def default_resource_schema():

return schema

def default_update_resource_schema():
schema = default_resource_schema()
return schema

def default_tags_schema():

schema = {
Expand Down
9 changes: 9 additions & 0 deletions ckan/model/resource.py
Expand Up @@ -81,6 +81,15 @@ def as_dict(self, core_columns_only=False):
if self.resource_group and not core_columns_only:
_dict["package_id"] = self.resource_group.package_id
return _dict

@classmethod
def get(cls, reference):
'''Returns a resource object referenced by its id.'''
query = Session.query(ResourceRevision).filter(ResourceRevision.id==reference)
query = query.filter(and_(
ResourceRevision.state == u'active', ResourceRevision.current == True
))
return query.first()

@classmethod
def get_columns(cls, extra_columns=True):
Expand Down
17 changes: 12 additions & 5 deletions ckan/model/tag.py
@@ -1,4 +1,5 @@
from sqlalchemy.orm import eagerload_all
from sqlalchemy import and_
import vdm.sqlalchemy

from types import make_uuid
Expand Down Expand Up @@ -60,15 +61,21 @@ def search_by_name(cls, text_query):
@classmethod
def all(cls):
q = Session.query(cls)
q = q.distinct().join(cls.package_tags)
q = q.filter(PackageTag.state == 'active')
q = q.distinct().join(PackageTagRevision)
q = q.filter(and_(
PackageTagRevision.state == 'active', PackageTagRevision.current == True
))
return q

@property
def packages_ordered(self):
## make sure packages are active
packages = [package for package in self.packages
if package.state == State.ACTIVE]
q = Session.query(Package)
q = q.join(PackageTagRevision)
q = q.filter(PackageTagRevision.tag_id == self.id)
q = q.filter(and_(
PackageTagRevision.state == 'active', PackageTagRevision.current == True
))
packages = [p for p in q]
ourcmp = lambda pkg1, pkg2: cmp(pkg1.name, pkg2.name)
return sorted(packages, cmp=ourcmp)

Expand Down
2 changes: 1 addition & 1 deletion ckan/templates/layout_base.html
Expand Up @@ -30,7 +30,7 @@
<![endif]-->

<script type="text/javascript" src="${g.site_url}/language.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript" src="http://assets.okfn.org/ext/jquery.cookie/jquery.cookie.min.js"></script>
<script type="text/javascript" src="http://assets.okfn.org/ext/jquery.placeholder/jquery.placeholder.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.min.js"></script>
Expand Down

0 comments on commit 116dd07

Please sign in to comment.