RatingsAndReviews

Differences between revisions 4 and 5
Revision 4 as of 2013-12-19 09:23:53
Size: 3027
Editor: g226043128
Comment: Add example using auth'd api
Revision 5 as of 2014-01-08 14:58:29
Size: 4394
Editor: 89
Comment: Update to demo submitting and filtering review on staging reviews server.
Deletions are marked like this. Additions are marked like this.
Line 37: Line 37:
The following example was run against the *staging* reviews server.
Line 47: Line 49:
>>> oauth1_session_plaintext = requests_oauthlib.OAuth1Session(u1_creds['consumer_key'],
... client_secret=u1_creds['consumer_secret'], resource_owner_key=u1_creds['token'],
... resource_owner_secret=u1_creds['token_secret'], signature_method='PLAINTEXT')
>>> eg_data = {
... 'arch_tag': 'i386',
... 'distroseries': 'ubuntu-sdk-13.10',
... 'language': 'en',
... 'origin': 'com.ubuntu.developer.dholbach.webapp-bvg',
... 'package_name': 'com.ubuntu.developer.dholbach.webapp-bvg',
... 'rating': '4',
... 'review_text': 'top stuff',
... 'summary': 'install it',
... 'version': '0.2'
... }
Line 48: Line 64:
>>> eg_data = {
 'app_name': 'snake',
 'arch_tag': 'i386',
 'distroseries': 'natty',
 'language': 'en',
 'origin': 'ubuntu',
 'package_name': 'snake',
 'rating': '4',
 'review_text': 'good game',
 'summary': 'good',
 'version': '0.1'}
# Creating a review works
Line 60: Line 66:
>>> oauth1_session_plaintext = requests_oauthlib.OAuth1Session(u1_creds['consumer_key'],
client_secret=u1_creds['consumer_secret'], resource_owner_key=u1_creds['token'],
resource_owner_secret=u1_creds['token_secret'], signature_method='PLAINTEXT')
>>> response = oauth1_session_plaintext.post("https://reviews.staging.ubuntu.com/reviews/api/1.0/reviews/", data=json.dumps(eg_data), headers={'Content-Type': 'application/json'})
>>> response.reason
'OK'
Line 64: Line 70:
>>> import json
>>> response = oauth1_session_plaintext.post("https://reviews.ubuntu.com/reviews/api/1.0/reviews/",
data=json.dumps(eg_data), headers={'Content-Type': 'application/json'})
>>> response.status_code
400
>>> print(response.text)
{"errors": {"__all__": [": package snake not in ubuntu natty for natty"]}}
# Creating a second review for the same package does not work

>>> response = oauth1_session_plaintext.post("https://reviews.staging.ubuntu.com/reviews/api/1.0/reviews/", data=json.dumps(eg_data), headers={'Content-Type': 'application/json'})
>>> response.reason
'BAD REQUEST'
>>> response.text
u'{"errors": {"__all__": ["A user cannot create multiple reviews for an app."]}}'

# The filter of all reviews for the package now includes our review:

>>> import requests
>>> response = requests.get("http://reviews.staging.ubuntu.com/reviews/api/1.0/reviews/filter/en/com.ubuntu.developer.dholbach.webapp-bvg/ubuntu-sdk-13.10/any/com.ubuntu.developer.dholbach.webapp-bvg/")
>>> response.json()
[{u'origin': u'com.ubuntu.developer.dholbach.webapp-bvg', u'rating': 4, u'hide': False, u'app_name': u'', u'language': u'en', u'usefulness_total': 0, u'usefulness_favorable': 0, u'reviewer_username': u'michael.nelson2', u'date_deleted': None, u'review_text': u'top stuff', u'package_name': u'com.ubuntu.developer.dholbach.webapp-bvg', u'distroseries': u'ubuntu-sdk-13.10', u'version': u'0.2', u'date_created': u'2014-01-08T13:00:07.735Z', u'reviewer_displayname': u'Michael Nelson', u'summary': u'install it', u'id': 1442}]

Ratings & reviews

Contact: Michael Nelson (noodles)

After checking the code, the existing ratings and reviews client helper can do everything that we need[1][2]:

  1. Query for reviews of a specific packagename or packagename and version
  2. Submit new reviews
  3. Flag reviews as innapropriate etc.
  4. Add a +1 to a review (mark it as useful).

Example usage of public api

$ bzr branch lp:~rnr-developers/rnr-server/rnrclient
$ cd rnrclient && virtualenv venv && venv/bin/python setup.py install && venv/bin/python
>>> from rnrclient import RatingsAndReviewsAPI
>>> api = RatingsAndReviewsAPI("http://reviews.ubuntu.com/reviews/api/1.0")
>>> api.server_status()
u'ok'
>>> skype_reviews = api.get_reviews(packagename='skype')
>>> len(skype_reviews)
10
>>> [review.version for review in skype_reviews]
[u'4.2.0.11-0ubuntu0.12.04.1', u'4.2.0.11-0ubuntu0.12.04.1', 
u'4.1.0.20.0-0ubuntu0.13.04.2', u'4.1.0.20.0-0ubuntu0.13.04.2', 
u'4.1.0.20.0-0ubuntu0.13.04.2', u'4.1.0.20.0-0ubuntu0.12.04.2', 
u'4.1.0.20.0-0ubuntu0.12.04.2', u'4.1.0.20.0-0ubuntu0.12.04.2', 
u'4.1.0.20.0-0ubuntu0.12.04.2', u'4.1.0.20.0-0ubuntu0.12.04.2']
>>> skype_13_04_2_reviews = api.get_reviews(packagename='skype', 
                              version='4.1.0.20.0-0ubuntu0.13.04.2')
>>> len(skype_13_04_2_reviews)
3
>>> api.get_reviews(packagename="com.example.myapp")
[]

Example usage of the authenticated API to submit a review, without rnr-client

The following example was run against the *staging* reviews server.

$ virtualenv testauth
$ . testauth/bin/activate
$ pip install requests requests_oauthlib
$ python

>>> import requests_oauthlib
>>> import urlparse
# Grab the u1 creds from Passwords and Keys app which USC should have created when you review via USC.
>>> u1_creds = dict(urlparse.parse_qsl("consumer_secret=****&token=****&consumer_key=****&token_secret=****"))
>>> oauth1_session_plaintext = requests_oauthlib.OAuth1Session(u1_creds['consumer_key'],
... client_secret=u1_creds['consumer_secret'], resource_owner_key=u1_creds['token'],
... resource_owner_secret=u1_creds['token_secret'], signature_method='PLAINTEXT')
>>> eg_data = {
...   'arch_tag': 'i386',
...   'distroseries': 'ubuntu-sdk-13.10',
...   'language': 'en',
...   'origin': 'com.ubuntu.developer.dholbach.webapp-bvg',
...   'package_name': 'com.ubuntu.developer.dholbach.webapp-bvg',
...   'rating': '4',
...   'review_text': 'top stuff',
...   'summary': 'install it',
...   'version': '0.2'
... }

# Creating a review works

>>> response = oauth1_session_plaintext.post("https://reviews.staging.ubuntu.com/reviews/api/1.0/reviews/", data=json.dumps(eg_data), headers={'Content-Type': 'application/json'})                                  
>>> response.reason
'OK'

# Creating a second review for the same package does not work

>>> response = oauth1_session_plaintext.post("https://reviews.staging.ubuntu.com/reviews/api/1.0/reviews/", data=json.dumps(eg_data), headers={'Content-Type': 'application/json'})
>>> response.reason
'BAD REQUEST'
>>> response.text
u'{"errors": {"__all__": ["A user cannot create multiple reviews for an app."]}}'

# The filter of all reviews for the package now includes our review:

>>> import requests
>>> response = requests.get("http://reviews.staging.ubuntu.com/reviews/api/1.0/reviews/filter/en/com.ubuntu.developer.dholbach.webapp-bvg/ubuntu-sdk-13.10/any/com.ubuntu.developer.dholbach.webapp-bvg/")
>>> response.json()
[{u'origin': u'com.ubuntu.developer.dholbach.webapp-bvg', u'rating': 4, u'hide': False, u'app_name': u'', u'language': u'en', u'usefulness_total': 0, u'usefulness_favorable': 0, u'reviewer_username': u'michael.nelson2', u'date_deleted': None, u'review_text': u'top stuff', u'package_name': u'com.ubuntu.developer.dholbach.webapp-bvg', u'distroseries': u'ubuntu-sdk-13.10', u'version': u'0.2', u'date_created': u'2014-01-08T13:00:07.735Z', u'reviewer_displayname': u'Michael Nelson', u'summary': u'install it', u'id': 1442}]

[1] We may need to update the bulk delivery of stats so that the click package index can consume click-packages only. [2] The tests in the rnrclient module look unmaintained (2 failures), but the rnrclient is tested by the lp:rnr-server project (to ensure it’s always compatible).

AppStore/Interfaces/RatingsAndReviews (last edited 2015-04-22 20:40:02 by 180-172-246-190)