Example #1
0
def view(request, course_prefix, course_suffix):
    # Only use the ready course (for the piazza_id) since Piazza has no notion
    # of draft/live.
    course = request.common_page_data['ready_course']

    lti_params = {
        "lti_message_type": "basic-lti-launch-request",
        "lti_version": "LTI-1p0",
        "resource_link_id": "class2go-forum",
    }
    lti_params['user_id'] = request.user.id

    # TODO: once we get course policies in place, provide an override to enable using real
    # names (see #578)
    #
    # lti_params['lis_person_name_family'] = request.user.last_name
    # lti_params['lis_person_name_given'] = request.user.first_name
    # lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name

    lti_params['lis_person_name_full'] = request.user.username
    lti_params['lis_person_contact_email_primary'] = request.user.email

    # Piazza only supports two roles, instructor and strudent; TA's (readonly too) are instructors.
    if request.common_page_data['is_course_admin']:
        lti_params['roles'] = "Instructor"
    else:
        lti_params['roles'] = "Student"

    lti_params['context_id'] = course.piazza_id
    lti_params['context_label'] = request.common_page_data['course_prefix']
    lti_params['context_title'] = course.title

    # Use OAuthSimple to sign the request.
    signatures = {
        'consumer_key': PIAZZA_KEY,
        'shared_secret': PIAZZA_SECRET,
    }
    oauthsimple = OAuthSimple()
    signed_request = oauthsimple.sign({
        'path': PIAZZA_ENDPOINT,
        'action': "POST",
        'parameters': lti_params,
        'signatures': signatures,
    })

    form = PiazzaAuthForm(initial=signed_request['parameters'])

    # Set common_page_data['can_switch_mode'] to false to hide mode switcher on this page.
    common_page_data['can_switch_mode'] = False

    return render_to_response('forums/piazza.html', {
        'common_page_data': request.common_page_data,
        'form': form,
        'piazza_target_url': PIAZZA_ENDPOINT,
    },
                              context_instance=RequestContext(request))
Example #2
0
def view(request, course_prefix, course_suffix):
    # Only use the ready course (for the piazza_id) since Piazza has no notion
    # of draft/live.
    course = request.common_page_data['ready_course']

    lti_params = {
        "lti_message_type": "basic-lti-launch-request",
        "lti_version": "LTI-1p0",
        "resource_link_id": "class2go-forum",
    }
    lti_params['user_id'] = request.user.id

    # TODO: once we get course policies in place, provide an override to enable using real
    # names (see #578)
    # 
    # lti_params['lis_person_name_family'] = request.user.last_name
    # lti_params['lis_person_name_given'] = request.user.first_name
    # lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name

    lti_params['lis_person_name_full'] = request.user.username
    lti_params['lis_person_contact_email_primary'] = request.user.email

    # Piazza only supports two roles, instructor and strudent; TA's (readonly too) are instructors. 
    if request.common_page_data['is_course_admin']:
        lti_params['roles'] = "Instructor"
    else:
        lti_params['roles'] = "Student"

    lti_params['context_id'] = course.piazza_id
    lti_params['context_label'] = request.common_page_data['course_prefix']
    lti_params['context_title'] = course.title

    # Use OAuthSimple to sign the request. 
    signatures = {
        'consumer_key': PIAZZA_KEY,
        'shared_secret': PIAZZA_SECRET,
    }
    oauthsimple = OAuthSimple()
    signed_request = oauthsimple.sign({
        'path': PIAZZA_ENDPOINT,
        'action': "POST",
        'parameters': lti_params, 
        'signatures': signatures,
    })

    form = PiazzaAuthForm(initial=signed_request['parameters'])

    # Set common_page_data['can_switch_mode'] to false to hide mode switcher on this page.
    common_page_data['can_switch_mode'] = False
    
    return render_to_response('forums/piazza.html', {
            'common_page_data': request.common_page_data, 
            'form': form, 
            'piazza_target_url': PIAZZA_ENDPOINT,
        }, context_instance=RequestContext(request))
Example #3
0
def view(request, course_prefix, course_suffix):
    try:
        common_page_data = get_common_page_data(request, course_prefix, course_suffix)
    except:
        raise Http404

    # Only use the ready course (for the piazza_id) since Piazza has no notion
    # of draft/live.
    course = common_page_data['ready_course']

    lti_params = {
        "lti_message_type": "basic-lti-launch-request",
        "lti_version": "LTI-1p0",
        "resource_link_id": "class2go-forum",
    }
    lti_params['user_id'] = request.user.id
    lti_params['lis_person_name_given'] = request.user.first_name
    lti_params['lis_person_name_family'] = request.user.last_name
    lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name
    lti_params['lis_person_contact_email_primary'] = request.user.email

    # Piazza only supports two roles, instructor and strudent.  TA's (readonly too) are instructors too. 
    if common_page_data['is_course_admin']:
        lti_params['roles'] = "Instructor"
    else:
        lti_params['roles'] = "Student"

    lti_params['context_id'] = course.piazza_id
    lti_params['context_label'] = common_page_data['course_prefix']
    lti_params['context_title'] = course.title

    # Use OAuthSimple to sign the request. 
    signatures = {
        'consumer_key': PIAZZA_KEY,
        'shared_secret': PIAZZA_SECRET,
    }
    oauthsimple = OAuthSimple()
    signed_request = oauthsimple.sign({
        'path': PIAZZA_ENDPOINT,
        'action': "POST",
        'parameters': lti_params, 
        'signatures': signatures,
    })

    form = PiazzaAuthForm(initial=signed_request['parameters'])

    return render_to_response('forums/piazza.html', {
            'common_page_data': common_page_data, 
            'form': form, 
            'piazza_target_url': PIAZZA_ENDPOINT,
        }, context_instance=RequestContext(request))
Example #4
0
class TestOAuth(unittest.TestCase):
    
    signatures = {'consumer_key': 'v9s778n692e9qvd83wfj9t8c',
            'shared_secret':'54XqbMADta'};
    test_url = 'http://api.netflix.com/catalog/titles';
    parameters = \
        'term=mac%20and+me&expand=formats,' +\
        'synopsis&max_results=1&v=2.0&output=json';
    
    def setUp(self):
        self.o1 = OAuthSimple()
        
    def testUtils(self):
        self.assertEqual(self.o1._oauthEscape('a b+c!d*\\e(f)g+h'), 
                'a%20b%2Bc%21d%2A%5Ce%28f%29g%2Bh');
        self.assertEqual(self.o1._arrayMerge({'a': 0, 'b': 2, 'c': 3},
            {'a': 1, 'd': 4}),
            {'a': 1, 'b': 2, 'c': 3, 'd': 4});
        self.o1.signatures({'api_key': '123', 'shared_secret': '456'})
        self.o1.setParameters({'a': 1, 'b': 2});
        self.assertEqual(self.o1._secrets['oauth_consumer_key'], '123');
        self.assertEqual(self.o1._secrets['shared_secret'], '456')
        self.assertEqual(len(self.o1._getNonce(10)), 10);
        self.assertNotEqual(self.o1._getNonce(),self.o1._getNonce())
        self.o1.reset();
        self.assertTrue(len(self.o1._parameters) == 0)

    def testSimple(self):
        self.o1.reset();
        signed = self.o1.sign({'signatures': self.signatures, 
            'parameters': self.parameters,
            'path': self.test_url});
       # import pdb; pdb.set_trace();
        self.assertTrue(len(signed.get('signature')) > 0)
        self.assertTrue(len(signed.get('signed_url')) > 0)
        # send the link.
        try:
            rsp=urllib2.urlopen(signed.get('signed_url'))
        except urllib2.HTTPError, ex:
            if (ex.headers.get('x-mashery-error-code') == 
                    'ERR_401_TIMESTAMP_IS_INVALID'):
                print "Your clock is off. Check and retry."
                raise
            print ex
            raise
        content = json.loads(rsp.read())
        self.assertTrue(content.get('catalog')[0].get('id') == 
                u'http://api.netflix.com/catalog/titles/movies/60035973')
Example #5
0
 def setUp(self):
     self.o1 = OAuthSimple()
Example #6
0
def view(request, course_prefix, course_suffix):
    # Only use the ready course (for the piazza_id) since Piazza has no notion
    # of draft/live.
    course = request.common_page_data['ready_course']

    lti_params = {
        "lti_message_type": "basic-lti-launch-request",
        "lti_version": "LTI-1p0",
        "lis_person_sourcedid": "class2go:user",
        "resource_link_id": "class2go-forum",
        "resource_link_title": "Class2Go",
        "resource_link_description": "Class2Go Forum",
        "tool_consumer_instance_guid": "class2go guid",
        "tool_consumer_instance_description": "Class2Go",
        "oauth_callback": "about:blank",
        "ext_submit": "Press To Launch"
    }
    lti_params['user_id'] = request.user.id

    # TODO: once we get course policies in place, provide an override to enable using real
    # names (see #578)
    # 
    # lti_params['lis_person_name_family'] = request.user.last_name
    # lti_params['lis_person_name_given'] = request.user.first_name
    # lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name
            
    profile = request.user.get_profile()
    show_confirmation = False
    if (not profile.piazza_name):
        show_confirmation = True
        fullname = request.user.first_name + " " + request.user.last_name
        lti_params['lis_person_name_full'] = fullname.encode("utf-8")
    else:
        lti_params['lis_person_name_full'] = profile.piazza_name.encode("utf-8")
        
    if (not profile.piazza_email):
        show_confirmation = True
        lti_params['lis_person_contact_email_primary'] = request.user.email
    else:
        lti_params['lis_person_contact_email_primary'] = profile.piazza_email
            

    # Piazza only supports two roles, instructor and strudent; TA's (readonly too) are instructors. 
    if request.common_page_data['is_course_admin']:
        lti_params['roles'] = "Instructor"
    else:
        lti_params['roles'] = "Student"
        visit_log = PageVisitLog(
            course = course,
            user = request.user,
            page_type= 'forum',
        )
        visit_log.save()

    lti_params['context_id'] = course.piazza_id
    lti_params['context_label'] = request.common_page_data['course_prefix']
    lti_params['context_title'] = course.title

    # Use OAuthSimple to sign the request. 
    signatures = {
        'consumer_key': PIAZZA_KEY,
        'shared_secret': PIAZZA_SECRET,
    }
    oauthsimple = OAuthSimple()
    signed_request = oauthsimple.sign({
        'path': PIAZZA_ENDPOINT,
        'action': "POST",
        'parameters': lti_params, 
        'signatures': signatures,
    })

    form = PiazzaAuthForm(initial=signed_request['parameters'])

    querystring = request.META['QUERY_STRING']

    # Set common_page_data['can_switch_mode'] to false to hide mode switcher on this page.
    request.common_page_data['can_switch_mode'] = False
    
    return render_to_response('forums/piazza.html', {
            'common_page_data': request.common_page_data,
            'show_confirmation': show_confirmation,
            'form': form,
            'piazza_target_url': PIAZZA_ENDPOINT,
            'querystring': querystring,
        }, context_instance=RequestContext(request))
Example #7
0
def view(request, course_prefix, course_suffix):
    # Only use the ready course (for the piazza_id) since Piazza has no notion
    # of draft/live.
    course = request.common_page_data['ready_course']

    lti_params = {
        "lti_message_type": "basic-lti-launch-request",
        "lti_version": "LTI-1p0",
        "lis_person_sourcedid": "class2go:user",
        "resource_link_id": "class2go-forum",
        "resource_link_title": "Class2Go",
        "resource_link_description": "Class2Go Forum",
        "tool_consumer_instance_guid": "class2go guid",
        "tool_consumer_instance_description": "Class2Go",
        "oauth_callback": "about:blank",
        "ext_submit": "Press To Launch"
    }
    lti_params['user_id'] = request.user.id

    # TODO: once we get course policies in place, provide an override to enable using real
    # names (see #578)
    #
    # lti_params['lis_person_name_family'] = request.user.last_name
    # lti_params['lis_person_name_given'] = request.user.first_name
    # lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name

    profile = request.user.get_profile()
    show_confirmation = False
    if (not profile.piazza_name):
        show_confirmation = True
        fullname = request.user.first_name + " " + request.user.last_name
        lti_params['lis_person_name_full'] = fullname.encode("utf-8")
    else:
        lti_params['lis_person_name_full'] = profile.piazza_name.encode(
            "utf-8")

    if (not profile.piazza_email):
        show_confirmation = True
        lti_params['lis_person_contact_email_primary'] = request.user.email
    else:
        lti_params['lis_person_contact_email_primary'] = profile.piazza_email

    # Piazza only supports two roles, instructor and strudent; TA's (readonly too) are instructors.
    if request.common_page_data['is_course_admin']:
        lti_params['roles'] = "Instructor"
    else:
        lti_params['roles'] = "Student"
        visit_log = PageVisitLog(
            course=course,
            user=request.user,
            page_type='forum',
        )
        visit_log.save()

    lti_params['context_id'] = course.piazza_id
    lti_params['context_label'] = request.common_page_data['course_prefix']
    lti_params['context_title'] = course.title

    # Use OAuthSimple to sign the request.
    signatures = {
        'consumer_key': PIAZZA_KEY,
        'shared_secret': PIAZZA_SECRET,
    }
    oauthsimple = OAuthSimple()
    signed_request = oauthsimple.sign({
        'path': PIAZZA_ENDPOINT,
        'action': "POST",
        'parameters': lti_params,
        'signatures': signatures,
    })

    form = PiazzaAuthForm(initial=signed_request['parameters'])

    querystring = request.META['QUERY_STRING']

    # Set common_page_data['can_switch_mode'] to false to hide mode switcher on this page.
    request.common_page_data['can_switch_mode'] = False

    return render_to_response('forums/piazza.html', {
        'common_page_data': request.common_page_data,
        'show_confirmation': show_confirmation,
        'form': form,
        'piazza_target_url': PIAZZA_ENDPOINT,
        'querystring': querystring,
    },
                              context_instance=RequestContext(request))
Example #8
0
class TestOAuth(unittest.TestCase):

    signatures = {
        'consumer_key': 'v9s778n692e9qvd83wfj9t8c',
        'shared_secret': '54XqbMADta'
    }
    test_url = 'http://api.netflix.com/catalog/titles'
    parameters = \
        'term=mac%20and+me&expand=formats,' +\
        'synopsis&max_results=1&v=2.0&output=json'

    def setUp(self):
        self.o1 = OAuthSimple()

    def testUtils(self):
        self.assertEqual(self.o1._oauthEscape('a b+c!d*\\e(f)g+h'),
                         'a%20b%2Bc%21d%2A%5Ce%28f%29g%2Bh')
        self.assertEqual(
            self.o1._arrayMerge({
                'a': 0,
                'b': 2,
                'c': 3
            }, {
                'a': 1,
                'd': 4
            }), {
                'a': 1,
                'b': 2,
                'c': 3,
                'd': 4
            })
        self.o1.signatures({'api_key': '123', 'shared_secret': '456'})
        self.o1.setParameters({
            'a': 1,
            'b': 2
        })
        self.assertEqual(self.o1._secrets['oauth_consumer_key'], '123')
        self.assertEqual(self.o1._secrets['shared_secret'], '456')
        self.assertEqual(len(self.o1._getNonce(10)), 10)
        self.assertNotEqual(self.o1._getNonce(), self.o1._getNonce())
        self.o1.reset()
        self.assertTrue(len(self.o1._parameters) == 0)

    def testSimple(self):
        self.o1.reset()
        signed = self.o1.sign({
            'signatures': self.signatures,
            'parameters': self.parameters,
            'path': self.test_url
        })
        # import pdb; pdb.set_trace();
        self.assertTrue(len(signed.get('signature')) > 0)
        self.assertTrue(len(signed.get('signed_url')) > 0)
        # send the link.
        try:
            rsp = urllib2.urlopen(signed.get('signed_url'))
        except urllib2.HTTPError, ex:
            if (ex.headers.get('x-mashery-error-code') ==
                    'ERR_401_TIMESTAMP_IS_INVALID'):
                print "Your clock is off. Check and retry."
                raise
            print ex
            raise
        content = json.loads(rsp.read())
        self.assertTrue(
            content.get('catalog')[0].get('id') ==
            u'http://api.netflix.com/catalog/titles/movies/60035973')
Example #9
0
 def setUp(self):
     self.o1 = OAuthSimple()