diff --git a/ckan/logic/action/create.py b/ckan/logic/action/create.py index 0eadc45e9f0..fef14af6489 100644 --- a/ckan/logic/action/create.py +++ b/ckan/logic/action/create.py @@ -10,7 +10,6 @@ import ckan.lib.plugins as lib_plugins import ckan.logic as logic -import ckan.rating as ratings import ckan.plugins as plugins import ckan.lib.dictization import ckan.logic.action @@ -847,16 +846,17 @@ def rating_create(context, data_dict): opts_err = _('Rating must be an integer value.') else: package = model.Package.get(package_ref) - if rating < ratings.MIN_RATING or rating > ratings.MAX_RATING: + if rating < model.MIN_RATING or rating > model.MAX_RATING: opts_err = _('Rating must be between %i and %i.') \ - % (ratings.MIN_RATING, ratings.MAX_RATING) + % (model.MIN_RATING, model.MAX_RATING) elif not package: opts_err = _('Not found') + ': %r' % package_ref if opts_err: raise ValidationError(opts_err) user = model.User.by_name(user) - ratings.set_rating(user, package, rating_int) + package.set_rating(user, rating_int) + model.repo.commit() package = model.Package.get(package_ref) ret_dict = {'rating average': package.get_average_rating(), diff --git a/ckan/model/__init__.py b/ckan/model/__init__.py index fd3a59a0279..0b02225615f 100644 --- a/ckan/model/__init__.py +++ b/ckan/model/__init__.py @@ -105,6 +105,8 @@ ) from rating import ( Rating, + MIN_RATING, + MAX_RATING, ) from related import ( Related, diff --git a/ckan/model/package.py b/ckan/model/package.py index eff975780c1..b276c34a232 100644 --- a/ckan/model/package.py +++ b/ckan/model/package.py @@ -24,6 +24,7 @@ 'PACKAGE_NAME_MAX_LENGTH', 'PACKAGE_NAME_MIN_LENGTH', 'PACKAGE_VERSION_MAX_LENGTH', 'PackageTagRevision', 'PackageRevision'] + PACKAGE_NAME_MAX_LENGTH = 100 PACKAGE_NAME_MIN_LENGTH = 2 PACKAGE_VERSION_MAX_LENGTH = 100 @@ -558,6 +559,55 @@ def activity_stream_detail(self, activity_id, activity_type): return activity.ActivityDetail(activity_id, self.id, u"Package", activity_type, {'package': package_dict }) + def set_rating(self, user_or_ip, rating): + '''Record a user's rating of this package. + + The caller function is responsible for doing the commit. + + If a rating is outside the range MAX_RATING - MIN_RATING then a + RatingValueException is raised. + + @param user_or_ip - user object or an IP address string + ''' + user = None + from user import User + from rating import Rating, MAX_RATING, MIN_RATING + if isinstance(user_or_ip, User): + user = user_or_ip + rating_query = meta.Session.query(Rating)\ + .filter_by(package=self, user=user) + else: + ip = user_or_ip + rating_query = meta.Session.query(Rating)\ + .filter_by(package=self, user_ip_address=ip) + + try: + rating = float(rating) + except TypeError: + raise RatingValueException + except ValueError: + raise RatingValueException + if rating > MAX_RATING or rating < MIN_RATING: + raise RatingValueException + + if rating_query.count(): + rating_obj = rating_query.first() + rating_obj.rating = rating + elif user: + rating = Rating(package=self, + user=user, + rating=rating) + meta.Session.add(rating) + else: + rating = Rating(package=self, + user_ip_address=ip, + rating=rating) + meta.Session.add(rating) + + +class RatingValueException(Exception): + pass + # import here to prevent circular import import tag diff --git a/ckan/model/rating.py b/ckan/model/rating.py index fda91b41dd9..ef59d3ac236 100644 --- a/ckan/model/rating.py +++ b/ckan/model/rating.py @@ -8,7 +8,11 @@ import domain_object import types as _types -__all__ = ['Rating'] +__all__ = ['Rating', 'MIN_RATING', 'MAX_RATING'] + +MIN_RATING = 1.0 +MAX_RATING = 5.0 + rating_table = Table('rating', meta.metadata, Column('id', types.UnicodeText, primary_key=True, default=_types.make_uuid), diff --git a/ckan/rating.py b/ckan/rating.py deleted file mode 100644 index bcfdeaed25e..00000000000 --- a/ckan/rating.py +++ /dev/null @@ -1,55 +0,0 @@ -import ckan.model as model - -MIN_RATING = 1.0 -MAX_RATING = 5.0 - -class RatingValueException(Exception): - pass - -def get_rating(package): - return package.get_average_rating(), len(package.ratings) - -def set_my_rating(c, package, rating): - if c.user: - username = c.user - user_or_ip = model.User.by_name(username) - q = model.Session.query(model.Rating).filter_by(package=package, user=user_or_ip) - else: - user_or_ip = c.author - q = model.Session.query(model.Rating).filter_by(package=package, user_ip_address=user_or_ip) - set_rating(user_or_ip, package, rating) - -def set_rating(user_or_ip, package, rating): - # Rates a package. - # Caller function does need to create a new_revision, - # but the commit happens in this one. (TODO leave caller to commit.) - user = None - if isinstance(user_or_ip, model.User): - user = user_or_ip - rating_query = model.Session.query(model.Rating).filter_by(package=package, user=user) - else: - ip = user_or_ip - rating_query = model.Session.query(model.Rating).filter_by(package=package, user_ip_address=ip) - - try: - rating = float(rating) - except TypeError, ValueError: - raise RatingValueException - if rating > MAX_RATING or rating < MIN_RATING: - raise RatingValueException - - if rating_query.count(): - rating_obj = rating_query.first() - rating_obj.rating = rating - elif user: - rating = model.Rating(package=package, - user=user, - rating=rating) - model.Session.add(rating) - else: - rating = model.Rating(package=package, - user_ip_address=ip, - rating=rating) - model.Session.add(rating) - model.repo.commit_and_remove() -