Skip to content

Commit

Permalink
Merge af13550 into cd53956
Browse files Browse the repository at this point in the history
  • Loading branch information
fanglinfang committed Mar 7, 2022
2 parents cd53956 + af13550 commit 20c15d0
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 32 deletions.
43 changes: 29 additions & 14 deletions uw_myplan/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,42 @@
MyPlan, MyPlanTerm, MyPlanCourse, MyPlanCourseSection)

logger = logging.getLogger(__name__)
dao = MyPlan_DAO()


def _get_plan_url(regid, year, quarter, terms):
return "/plan/v1/{year},{quarter},{terms},{uwregid}".format(
year=year, quarter=quarter, terms=terms, uwregid=regid)


def _get_resource(regid, year, quarter, terms, clear_cached_token=False):
if clear_cached_token:
dao.clear_access_token()
return dao.getURL(
_get_plan_url(regid, year, quarter, terms),
{"Accept": "application/json"})


def get_plan(regid, year, quarter, terms=4):
dao = MyPlan_DAO()
url = get_plan_url(regid, year, quarter, terms)
response = _get_resource(regid, year, quarter, terms)
if response.status == 200:
return _process_data(json.loads(response.data))

response = dao.getURL(url, {"Accept": "application/json"})
logger.debug(
{'url': url, 'status': response.status, 'data': response.data})
if response.status != 200:
raise DataFailureException(url, response.status, str(response.data))
if response.status == 401 or response.status == 403:
# clear cached access token, retry once
response = _get_resource(
regid, year, quarter, terms, clear_cached_token=True)
if response.status == 200:
return _process_data(json.loads(response.data))

data = json.loads(response.data)
raise DataFailureException(
_get_plan_url(regid, year, quarter, terms),
response.status, str(response.data))


def _process_data(jdata):
plan = MyPlan()
for term_data in data:
for term_data in jdata:
term = MyPlanTerm()
term.year = term_data["Term"]["Year"]
term.quarter = term_data["Term"]["Quarter"]
Expand Down Expand Up @@ -59,8 +79,3 @@ def get_plan(regid, year, quarter, terms=4):
term.courses.append(course)
plan.terms.append(term)
return plan


def get_plan_url(regid, year, quarter, terms=4):
return "/plan/v1/{year},{quarter},{terms},{uwregid}".format(
year=year, quarter=quarter, terms=terms, uwregid=regid)
27 changes: 17 additions & 10 deletions uw_myplan/dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from restclients_core.exceptions import DataFailureException

logger = logging.getLogger(__name__)
myplan_access_token_url = "/oauth2/token"


class MyPlan_Auth_DAO(DAO):
Expand All @@ -18,18 +19,22 @@ def service_name(self):
def _is_cacheable(self, method, url, headers, body=None):
return True

def clear_token_from_cache(self):
self.clear_cached_response(myplan_access_token_url)

def get_auth_token(self, secret):
url = "/oauth2/token"
headers = {"Authorization": "Basic {}".format(secret),
"Content-type": "application/x-www-form-urlencoded"}

response = self.postURL(url, headers, "grant_type=client_credentials")
logger.debug(
{'url': url,
'status': response.status,
'data': response.data})
response = self.postURL(
myplan_access_token_url, headers, "grant_type=client_credentials")
if response.status != 200:
raise DataFailureException(url, response.status, response.data)
logger.error(
{'url': myplan_access_token_url,
'status': response.status,
'data': response.data})
raise DataFailureException(
myplan_access_token_url, response.status, response.data)

data = json.loads(response.data)
return data.get("access_token", "")
Expand Down Expand Up @@ -63,10 +68,12 @@ def service_mock_paths(self):
return [abspath(os.path.join(dirname(__file__), "resources"))]

def _custom_headers(self, method, url, headers, body):
headers = {}
if not headers:
headers = {}
secret = self.get_service_setting("AUTH_SECRET", "")
if secret:
logger.info("AUTH_SECRET: {}...{}".format(
secret[:10], secret[-10:],))
headers["Authorization"] = self.auth_dao.get_auth_token(secret)
return headers

def clear_access_token(self):
self.auth_dao.clear_token_from_cache()
15 changes: 7 additions & 8 deletions uw_myplan/tests/test_myplan.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,17 @@
# SPDX-License-Identifier: Apache-2.0

from unittest import TestCase
from uw_myplan import get_plan, get_plan_url
from uw_myplan import get_plan, _get_plan_url, _get_resource


class MyPlanTestData(TestCase):
def test_plan_url(self):
self.assertEquals(
get_plan_url(
_get_plan_url(
"9136CCB8F66711D5BE060004AC494FFE", 2013, "spring", 2), (
"/plan/v1/2013,spring,2,"
"9136CCB8F66711D5BE060004AC494FFE"))

self.assertEquals(
get_plan_url(
"9136CCB8F66711D5BE060004AC494FFE", 2012, "summer"), (
"/plan/v1/2012,summer,4,"
"9136CCB8F66711D5BE060004AC494FFE"))

def test_javerage(self):
plan = get_plan(regid="9136CCB8F66711D5BE060004AC494FFE",
year=2013,
Expand Down Expand Up @@ -67,6 +61,11 @@ def test_javerage(self):
self.assertEquals(term_data.courses[0].sections[1].section_id, 'AA')
self.assertEquals(term_data.courses[0].sections[2].section_id, 'AB')

resp = _get_resource(
"9136CCB8F66711D5BE060004AC494FFE", 2013, "spring",
4, clear_cached_token=True)
self.assertIsNotNone(resp)

def test_json(self):
plan = get_plan(regid="9136CCB8F66711D5BE060004AC494FFE",
year=2013, quarter="spring",
Expand Down

0 comments on commit 20c15d0

Please sign in to comment.