# Copyright (c) 2009 - 2016, UChicago Argonne, LLC.
# See LICENSE file for details.
'''
Data for one Reviewer of General User Proposals
'''
from lxml import etree
import proposal
import tools
import topics
import xml_utility
[docs]class AGUP_Reviewer_Data(object):
'''
A Reviewer of General User Proposals
'''
# these are the XML tags to find in a Reviewer node
tagList = ('full_name', 'phone', 'email', 'notes', 'joined', 'URL')
def __init__(self, xmlParentNode = None, xmlFile = None):
'''
:param xmlParentNode: lxml node of the Reviewer
:param xmlFile: name of the XML file
:param xmlFile: str
'''
self.db = {}
self.topics = topics.Topics()
self.db['name'] = None
self.xmlFile = xmlFile
for item in self.tagList:
self.db[item] = None
if xmlParentNode != None:
self.importXml( xmlParentNode )
def __str__(self):
'''
Canonical string representation
'''
if self.getFullName() == None or self.getKey('email') == None:
return str(None)
return "%s <%s>" % (self.getFullName(), self.getKey('email'))
[docs] def importXml(self, reviewer):
'''
Fill the class variables with values from the XML node
:param reviewer: lxml node node of the Reviewer
'''
self.db['name'] = reviewer.attrib['name'].strip()
for k in self.tagList:
text = xml_utility.getXmlText(reviewer, k)
if text is None:
self.db[k] = None
else:
self.db[k] = tools.text_encode(text)
self.topics = topics.Topics()
node = reviewer.find('Topics')
if node is not None:
for t_node in node.findall('Topic'):
key = t_node.attrib['name']
try:
value = float( t_node.attrib['value'])
except ValueError:
value = 0.0
self.topics.add(key, value)
[docs] def writeXmlNode(self, specified_node):
'''
write this Reviewer's data to a specified node in the XML document
:param obj specified_node: XML node to contain this data
'''
specified_node.attrib['name'] = self.getSortName()
for tag in self.tagList:
etree.SubElement(specified_node, tag).text = self.getKey(tag)
self.topics.writeXml(specified_node)
[docs] def getSortName(self):
''' '''
return self.getKey('name')
[docs] def getFullName(self):
''' '''
return self.getKey('full_name')
[docs] def getKey(self, key):
''' '''
return self.db[key]
[docs] def setKey(self, key, value):
'''
save a value to a known key
example::
self.setKey('full_name', 'Pete Jemian')
'''
if key not in self.db:
raise KeyError('unknown key: ' + key)
self.db[key] = value
[docs] def getTopic(self, topic):
'''
return the value of the named topic
'''
return self.topics.get(topic)
[docs] def getTopicList(self):
'''
return a list of all topics
'''
return self.topics.getTopicList()
[docs] def addTopic(self, topic, value=None):
'''
declare a new topic and give it an initial value
topic must not exist or KeyError exception will be raised
'''
value = value or topics.DEFAULT_TOPIC_VALUE
self.topics.add(topic, value)
[docs] def addTopics(self, topics_list):
'''
declare several new topics and give them all default values
each topic must not exist or KeyError exception will be raised
'''
self.topics.addTopics(topics_list)
[docs] def setTopic(self, topic, value=None):
'''
set value of an existing topic
topic must exist or KeyError exception will be raised
'''
value = value or topics.DEFAULT_TOPIC_VALUE
self.topics.set(topic, value)
[docs] def removeTopic(self, key):
'''
remove the named topic
'''
self.topics.remove(key)
[docs] def removeTopics(self, key_list):
'''
remove several topics at once
'''
for key in key_list:
self.removeTopic(key)
[docs] def getAssignments(self, proposals, role):
'''find all proposals assigned to this reviewer with the given role'''
if role not in (proposal.PRIMARY_REVIEWER_ROLE, proposal.SECONDARY_REVIEWER_ROLE):
raise ValueError('unknown role value: ' + str(role))
my_name = self.db['full_name']
assignments = []
for prop_num, prop in proposals.proposals.items():
reviewers = prop.getAssignedReviewers()
if my_name == reviewers[role-1]:
assignments.append(prop_num)
return sorted(assignments)