Skip to content

Commit

Permalink
Merge pull request #9 from uw-it-aca/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
fanglinfang committed Oct 18, 2019
2 parents 1246c07 + 8d04a50 commit a3ee856
Show file tree
Hide file tree
Showing 8 changed files with 170 additions and 9 deletions.
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
include_package_data=True,
install_requires=[
'UW-RestClients-Core<2.0',
'UW-RestClients-PWS<3.0',
'python-dateutil'
],
license='Apache License, Version 2.0',
Expand Down
43 changes: 42 additions & 1 deletion uw_hrp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,8 @@ def __init__(self, *args, **kwargs):
self.employee_status = EmploymentStatus(
data=data.get("WorkerEmploymentStatus"))

if self.employee_status.is_active:
if (self.employee_status.is_active or
self.employee_status.is_retired):
positions = data.get("WorkerPositions")
if positions is not None and len(positions) > 0:
for position in positions:
Expand All @@ -236,3 +237,43 @@ def __init__(self, *args, **kwargs):
self.primary_position = position
else:
self.other_active_positions.append(position)


class WorkerRef(models.Model):
netid = models.CharField(max_length=32)
regid = models.CharField(max_length=32)
employee_id = models.CharField(max_length=16)
employee_status = models.CharField(max_length=32)
is_active = models.BooleanField(default=False)
is_current_faculty = models.BooleanField(default=False)
workday_person_type = models.CharField(max_length=64)
href = models.CharField(max_length=255)

def is_terminated(self):
return self.employee_status == "Terminated"

def to_json(self):
return {"netid": self.netid,
'regid': self.regid,
'employee_id': self.employee_id,
'employee_status': self.employee_status,
'is_active': self.is_active,
'is_current_faculty': self.is_current_faculty,
'workday_person_type': self.workday_person_type,
'href': self.href}

def __str__(self):
return json.dumps(self.to_json())

def __init__(self, *args, **kwargs):
data = kwargs.get("data")
if data is None:
return super(WorkerRef, self).__init__(*args, **kwargs)
self.netid = data.get("NetID")
self.regid = data.get("RegID")
self.employee_id = data.get("EmployeeID")
self.employee_status = data.get("EmployeeStatus")
self.is_active = data.get("IsActive")
self.is_current_faculty = data.get("IsCurrentFaculty")
self.workday_person_type = data.get("WorkdayPersonType")
self.href = data.get("Href")
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{"TotalCount":2,
"Workers":[
{"Href":"/hrp/v2/worker/10000000000000000000000000000015.json",
"EmployeeID":"000000015",
"EmployeeStatus":"Terminated",
"IsActive":true,
"NetID":"chair",
"RegID":"10000000000000000000000000000015",
"IsCurrentFaculty":true,
"WorkdayPersonType":"Academic Affiliate"}],
"Next":null,
"Previous":null}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{"TotalCount":2,
"Workers":[
{"Href":"/hrp/v2/worker/10000000000000000000000000000005.json",
"EmployeeID":"000000005",
"EmployeeStatus":"Active",
"IsActive":true,
"NetID":"faculty",
"RegID":"10000000000000000000000000000005",
"IsCurrentFaculty":true,
"WorkdayPersonType":"Employee"}],
"Next":{
"Href":"/hrp/v2/Worker.json?changed_since=2019&page_size=200&page_start=2"},
"Previous":null}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{"TotalCount":2,
"Workers":[],
"Next":null,
"Previous":null}
30 changes: 29 additions & 1 deletion uw_hrp/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from datetime import datetime, timedelta, timezone
from uw_hrp.models import (
EmploymentStatus, JobProfile, SupervisoryOrganization,
Worker, WorkerPosition, parse_date)
Worker, WorkerPosition, parse_date, WorkerRef)
from uw_hrp.util import fdao_hrp_override


Expand Down Expand Up @@ -337,3 +337,31 @@ def test_worker(self):
self.assertTrue(worker.employee_status.is_terminated)
self.assertFalse(worker.employee_status.is_active)
self.assertIsNotNone(str(worker))

def test_workerref(self):
regid = '10000000000000000000000000000005'
wr = WorkerRef(netid="test", regid=regid)
self.assertIsNotNone(wr)
print(wr)
wr = WorkerRef(
data={
'Href': '/hrp/v2/worker/{}.json'.format(regid),
'EmployeeID': '000000005',
'EmployeeStatus': 'Active',
'IsActive': True,
'NetID': 'faculty',
'RegID': '10000000000000000000000000000005',
'IsCurrentFaculty': True,
'WorkdayPersonType': 'Employee'})
self.assertFalse(wr.is_terminated())
self.assertEqual(
wr.to_json(),
{'employee_id': '000000005',
'employee_status': 'Active',
'is_active': True,
'is_current_faculty': True,
'netid': 'faculty',
'regid': '10000000000000000000000000000005',
'workday_person_type': 'Employee',
'href': '/hrp/v2/worker/10000000000000000000000000000005.json'})
self.assertIsNotNone(str(wr))
13 changes: 12 additions & 1 deletion uw_hrp/tests/test_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
from restclients_core.exceptions import (
DataFailureException, InvalidEmployeeID, InvalidRegID, InvalidNetID)
from uw_hrp.worker import (
get_worker_by_netid, get_worker_by_employee_id, get_worker_by_regid)
get_worker_by_netid, get_worker_by_employee_id, get_worker_by_regid,
worker_search)
from uw_hrp.util import fdao_hrp_override


Expand Down Expand Up @@ -105,3 +106,13 @@ def test_get_worker_by_regid(self):
"00000000000000000000000000000001")
self.assertRaises(InvalidRegID,
get_worker_by_regid, "000")

def test_worker_search(self):
worker_refs = worker_search(changed_since=2019)
self.assertEqual(len(worker_refs), 2)
self.assertEqual(worker_refs[0].netid, "faculty")
self.assertTrue(worker_refs[1].is_terminated())
self.assertEqual(worker_refs[1].netid, "chair")

none = worker_search(changed_since=2020)
self.assertEqual(len(none), 0)
63 changes: 58 additions & 5 deletions uw_hrp/worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,36 @@
from datetime import datetime
import logging
import json
import re
from urllib.parse import urlencode
from restclients_core.exceptions import InvalidRegID, InvalidNetID,\
InvalidEmployeeID
from uw_pws import PWS
from uw_hrp import get_resource
from uw_hrp.models import Worker
from uw_hrp.models import Worker, WorkerRef


logger = logging.getLogger(__name__)
re_netid = re.compile(r'^[a-z][a-z0-9\-\_\.]{,127}$', re.I)
re_regid = re.compile(r'^[A-F0-9]{32}$', re.I)
re_employee_id = re.compile(r'^\d{9}$')
URL_PREFIX = "/hrp/v2/worker"
CURRENT_FUTURE_SUFFIX = "workerpositionstate=current,future"


def get_worker_by_employee_id(employee_id, current_future=True):
if not PWS().valid_employee_id(employee_id):
if not valid_employee_id(employee_id):
raise InvalidEmployeeID(employee_id)
return _get_worker(employee_id, current_future)


def get_worker_by_netid(netid, current_future=True):
if not PWS().valid_uwnetid(netid):
if not valid_uwnetid(netid):
raise InvalidNetID(netid)
return _get_worker(netid, current_future)


def get_worker_by_regid(regid, current_future=True):
if not PWS().valid_uwregid(regid):
if not valid_uwregid(regid):
raise InvalidRegID(regid)
return _get_worker(regid, current_future)

Expand All @@ -43,3 +47,52 @@ def _get_worker(id, current_future):
if current_future:
url = "{0}?{1}".format(url, CURRENT_FUTURE_SUFFIX)
return Worker(data=json.loads(get_resource(url)))


def worker_search(**kwargs):
"""
Returns a list of WorkerRef objects
Parameters can be:
legal_first_name_contains: string
legal_first_name_starts_with: string
legal_last_name_contains: string
legal_last_name_starts_with: string
preferred_first_name_contains: string
preferred_first_name_starts_with: string
preferred_last_name_contains: string
preferred_last_name_starts_with: string
is_current_faculty: string
cost_center_id: string
workday_person_type: string
ascii_only: string
location_id: string
changed_since: string
page_start: string (default: 1)
"""
url = "{0}.json?{1}&page_size=200".format(URL_PREFIX, urlencode(kwargs))
workerefs = []
while True:
data = json.loads(get_resource(url))
if len(data["Workers"]) > 0:
for wkr_data in data.get("Workers"):
workerefs.append(WorkerRef(data=wkr_data))
if data.get("Next") is not None and len(data["Next"]["Href"]) > 0:
url = data["Next"]["Href"]
else:
break
return workerefs


def valid_uwnetid(netid):
return (netid is not None and
re_netid.match(str(netid)) is not None)


def valid_uwregid(regid):
return (regid is not None and
re_regid.match(str(regid)) is not None)


def valid_employee_id(employee_id):
return (employee_id is not None and
re_employee_id.match(str(employee_id)) is not None)

0 comments on commit a3ee856

Please sign in to comment.