Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,14 @@ To install ckanext-rating:

5. Initialize database tables used by Rating::

ON CKAN >= 2.9:

ckan --config=production.ini rating init

ON CKAN < 2.8:

paster --plugin=ckanext-rating rating init --config=production.ini


6. If you want to use this extension for ckanext-showcase, install it into your environment by following the instructions at https://github.com/ckan/ckanext-showcase

Expand Down
File renamed without changes.
4 changes: 4 additions & 0 deletions ckanext/rating/assets/resource.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[groups]
rating =
js/rating.js
css/rating.css
12 changes: 12 additions & 0 deletions ckanext/rating/assets/webassets.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
rating-js:
filters: rjsmin
output: ckanext-rating/rating.js
extra:
preload:
- base/main
contents:
- js/rating.js
rating-css:
output: ckanext-rating/rating.css
contents:
- css/rating.css
15 changes: 15 additions & 0 deletions ckanext/rating/blueprint.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from flask import Blueprint

import ckanext.rating.utils as utils

rating = Blueprint('rating', __name__)

def submit_package_rating(package, rating):
return utils.submit_package_rating(package, rating)

def submit_showcase_rating(package, rating):
return utils.submit_showcase_rating(package, rating)


rating.add_url_rule('/rating/dataset/<package>/<rating>', view_func=submit_package_rating, endpoint='submit_package_rating')
rating.add_url_rule('/rating/showcase/<package>/<rating>', view_func=submit_showcase_rating, endpoint='submit_showcase_rating')
17 changes: 17 additions & 0 deletions ckanext/rating/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import click

import ckanext.rating.utils as utils


def get_commands():
return [rating]


@click.group()
def rating():
pass


@rating.command()
def init():
utils.init_db()
12 changes: 6 additions & 6 deletions ckanext/rating/commands.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from ckan.lib.cli import CkanCommand
import sys

from ckan.plugins.toolkit import CkanCommand
import ckanext.rating.utils as utils

class RatingCommand(CkanCommand):
'''
Expand All @@ -21,8 +23,8 @@ def command(self):
Parse command line arguments and call appropriate method.
"""
if not self.args or self.args[0] in ['--help', '-h', 'help']:
print(RatingCommand.__doc__)
return
self.parser.print_usage()
sys.exit(1)

cmd = self.args[0]
self._load_config()
Expand All @@ -33,6 +35,4 @@ def command(self):
self.log.error('Command "%s" not recognized' % (cmd,))

def init_db(self):
import ckan.model as model
from ckanext.rating.model import init_tables
init_tables(model.meta.engine)
utils.init_db()
45 changes: 4 additions & 41 deletions ckanext/rating/controller.py
Original file line number Diff line number Diff line change
@@ -1,48 +1,11 @@
import ckan.plugins as p
import ckan.model as model
import ckan.logic as logic
from ckan.lib.base import h
from ckan.controllers.package import PackageController
from ckan.common import request, _
import ckan.lib.base as base

c = p.toolkit.c
flatten_to_string_key = logic.flatten_to_string_key
NotAuthorized = logic.NotAuthorized
abort = base.abort

import ckanext.rating.utils as utils

class RatingController(p.toolkit.BaseController):

def submit_package_rating(self, package, rating):
context = {'model': model, 'user': c.user or c.author}
data_dict = {'package': package, 'rating': rating}
try:
p.toolkit.check_access('check_access_user', context, data_dict)
p.toolkit.get_action('rating_package_create')(context, data_dict)
h.redirect_to(controller='package', action='read', id=package)
except NotAuthorized:
abort(403, _('Unauthenticated user not allowed to submit ratings.'))

return utils.submit_package_rating(package, rating)

def submit_showcase_rating(self, package, rating):
context = {'model': model, 'user': c.user or c.author}
data_dict = {'package': package, 'rating': rating}
try:
p.toolkit.check_access('check_access_user', context, data_dict)
p.toolkit.get_action('rating_package_create')(context, data_dict)
h.redirect_to(controller='ckanext.sixodp_showcase.controller:Sixodp_ShowcaseController', action='read', id=package)
except NotAuthorized:
abort(403, _('Unauthenticated user not allowed to submit ratings.'))


class RatingPackageController(PackageController):

def search(self):
cur_page = request.params.get('page')
if cur_page is not None:
c.current_page = h.get_page_number(request.params)
else:
c.current_page = 1
c.pkg_type = 'dataset'
result = super(RatingPackageController, self).search()
return result
return utils.submit_showcase_rating(package, rating)
3 changes: 1 addition & 2 deletions ckanext/rating/helpers.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from ckanext.rating.model import Rating
from ckan.plugins import toolkit
from pylons import config
from ckantoolkit import config

c = toolkit.c


def get_user_rating(package_id):
if not c.userobj:
user = toolkit.request.environ.get('REMOTE_ADDR')
Expand Down
3 changes: 1 addition & 2 deletions ckanext/rating/logic/auth/create.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import pylons.config as config
from ckantoolkit import config
from ckan.plugins import toolkit
import ckan.logic as logic
c = toolkit.c


def rating_create_auth():
return {
'check_access_user': check_access_user,
Expand Down
6 changes: 5 additions & 1 deletion ckanext/rating/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@


def make_uuid():
return str(uuid.uuid4())
try:
unicode('')
except NameError:
unicode = str
return unicode(uuid.uuid4())


class Rating(Base):
Expand Down
55 changes: 23 additions & 32 deletions ckanext/rating/plugin.py → ckanext/rating/plugin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,32 @@
import ckan.model as model

from ckanext.rating.logic import action
from ckanext.rating import helpers
import ckanext.rating.logic.auth as rating_auth
from ckanext.rating.model import Rating
from ckan.lib.plugins import DefaultTranslation
from ckan.plugins.toolkit import get_action
from helpers import show_rating_in_type
from ckanext.rating import helpers
from ckanext.rating.helpers import show_rating_in_type

import logging

log = logging.getLogger(__name__)

if toolkit.check_ckan_version(min_version='2.5'):
from ckan.lib.plugins import DefaultTranslation

class RatingPluginBase(plugins.SingletonPlugin, DefaultTranslation):
plugins.implements(plugins.ITranslation, inherit=True)
else:
class RatingPluginBase(plugins.SingletonPlugin):
pass

if toolkit.check_ckan_version(u'2.9'):
from ckanext.rating.plugin.flask_plugin import MixinPlugin
ckan_29_or_higher = True
else:
from ckanext.rating.plugin.pylons_plugin import MixinPlugin
ckan_29_or_higher = False


def sort_by_rating(sort):
limit = g.datasets_per_page
Expand Down Expand Up @@ -56,25 +71,19 @@ def sort_by_rating(sort):
q = tmp[:-4] + ')'
return q


class RatingPlugin(plugins.SingletonPlugin, DefaultTranslation):
class RatingPlugin(RatingPluginBase, MixinPlugin):
plugins.implements(plugins.IConfigurer)
plugins.implements(plugins.IActions)
plugins.implements(plugins.ITemplateHelpers)
plugins.implements(plugins.IAuthFunctions)
plugins.implements(plugins.IPackageController, inherit=True)
plugins.implements(plugins.IRoutes, inherit=True)
if toolkit.check_ckan_version(min_version='2.5.0'):
plugins.implements(plugins.ITranslation, inherit=True)

# IConfigurer

def update_config(self, config_):
toolkit.add_template_directory(config_, 'templates')
toolkit.add_public_directory(config_, 'public')
toolkit.add_resource('fanstatic', 'rating')
toolkit.add_resource('public/css/', 'rating_css')
toolkit.add_resource('public/js/', 'rating_js')
toolkit.add_template_directory(config_, '../templates')
toolkit.add_public_directory(config_, '../public')
toolkit.add_resource('../assets', 'rating')

# IActions

Expand Down Expand Up @@ -124,22 +133,4 @@ def after_search(self, search_results, search_params):
pkg['ratings_count'] = rating_dict.get('ratings_count', 0)
return search_results

# IRoutes

def before_map(self, map):
map.connect('/rating/dataset/:package/:rating',
controller='ckanext.rating.controller:RatingController',
action='submit_package_rating')

map.connect('/rating/showcase/:package/:rating',
controller='ckanext.rating.controller:RatingController',
action='submit_showcase_rating')

map.connect(
'/dataset',
controller='ckanext.rating.controller:RatingPackageController',
action='search',
highlight_actions='index search'
)

return map

15 changes: 15 additions & 0 deletions ckanext/rating/plugin/flask_plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import ckan.plugins as p

from ckanext.rating.blueprint import rating as rating_blueprint
import ckanext.rating.cli as cli

class MixinPlugin(p.SingletonPlugin):

p.implements(p.IBlueprint)
p.implements(p.IClick)

def get_blueprint(self):
return [rating_blueprint]

def get_commands(self):
return cli.get_commands()
19 changes: 19 additions & 0 deletions ckanext/rating/plugin/pylons_plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import ckan.plugins as p


class MixinPlugin(p.SingletonPlugin):

p.implements(p.IRoutes, inherit=True)

# IRoutes

def before_map(self, map):
map.connect('/rating/dataset/:package/:rating',
controller='ckanext.rating.controller:RatingController',
action='submit_package_rating')

map.connect('/rating/showcase/:package/:rating',
controller='ckanext.rating.controller:RatingController',
action='submit_showcase_rating')

return map
2 changes: 1 addition & 1 deletion ckanext/rating/templates/rating/snippets/rating.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
{% snippet "rating/snippets/rating.html", package=pkg %}
#}

{% resource "rating_css/rating.css" %}
{% asset "rating/rating-css" %}
{% if h.show_rating_in_type(package.type) %}
<div class="rating">
{% block general_rating %}
Expand Down
4 changes: 2 additions & 2 deletions ckanext/rating/templates/rating/snippets/rating_single.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
{% snippet "rating/snippets/rating_single.html", package=pkg %}
#}

{% resource "rating_css/rating.css" %}
{% asset "rating/rating-css" %}
{% if enable_input %}
{% resource "rating_js/rating.js" %}
{% asset "rating/rating-js" %}
{% endif %}

{% set action = 'submit_package_rating' %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
{% snippet "rating/snippets/rating_single_flat.html", package=pkg %}
#}

{% resource "rating_css/rating.css" %}
{% asset "rating/rating-css" %}
{% if enable_input %}
{% resource "rating_js/rating.js" %}
{% asset "rating/rating-js" %}
{% endif %}

{% set action = 'submit_package_rating' %}
Expand Down
19 changes: 15 additions & 4 deletions ckanext/rating/templates/rating/snippets/stars.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
{% snippet "rating/snippets/stars.html", package=pkg %}

#}
{% set ckan_29_or_higher = h.ckan_version().split('.')[1] | int >= 9 %}

{% resource "rating_css/rating.css" %}
{% resource "rating_js/rating.js" %}
{% asset "rating/rating-css" %}
{% asset "rating/rating-js" %}

{% set action = 'submit_package_rating' %}
{% if package.type == 'showcase' %}
Expand All @@ -20,10 +21,20 @@
<span class="star-rating{% if stars == 0 %} no-stars{% endif %}">
<span class="star-rating-stars">
{%- for index in range(stars|int) -%}
<a class="icon icon-star rating-star" id="star-{{index}}" href="{{ h.url_for(controller='ckanext.rating.controller:RatingController', action=action, package=package.name, rating=index+1) }}"></a>
{% if ckan_29_or_higher %}
{% set url = h.url_for('rating.'+action, package=package.name, rating=index+1) %}
{% else %}
{% set url = h.url_for(controller='ckanext.rating.controller:RatingController', action=action, package=package.name, rating=index+1) %}
{% endif %}
<a class="icon icon-star rating-star" id="star-{{index}}" href="{{ url }}"></a>
{%- endfor -%}
{%- for index in range(stars|int, 5) -%}
<a class="icon icon-star-empty rating-star" href="{{ h.url_for(controller='ckanext.rating.controller:RatingController', action=action, package=package.name, rating=index+1) }}"></a>
{% if ckan_29_or_higher %}
{% set url = h.url_for('rating.'+action, package=package.name, rating=index+1) %}
{% else %}
{% set url = h.url_for(controller='ckanext.rating.controller:RatingController', action=action, package=package.name, rating=index+1) %}
{% endif %}
<a class="icon icon-star-empty rating-star" href="{{ url }}"></a>
{%- endfor -%}
</span>
</span>
2 changes: 1 addition & 1 deletion ckanext/rating/templates/snippets/package_item.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{% resource "rating_css/rating.css" %}
{% asset "rating/rating-css" %}

{% ckan_extends %}

Expand Down
Loading