diff --git a/daemon.py b/daemon.py index 1b616ddf6..68b8c8acf 100644 --- a/daemon.py +++ b/daemon.py @@ -98,7 +98,7 @@ from follow import getFollowingFeed from follow import sendFollowRequest from follow import unfollowAccount from follow import createInitialLastSeen -from skills import getSkillsFromString +from skills import getSkillsFromList from skills import noOfActorSkills from skills import actorHasSkill from skills import actorSkillValue @@ -124,7 +124,6 @@ from blocking import isBlockedHashtag from blocking import isBlockedDomain from blocking import getDomainBlocklist from roles import setRole -from roles import getRolesFromString from roles import clearModeratorStatus from roles import clearEditorStatus from roles import clearCounselorStatus @@ -7397,8 +7396,9 @@ class PubServer(BaseHTTPRequestHandler): rolesList = [] if actorJson.get('affiliation'): - actorRolesStr = actorJson['affiliation']['roleName'] - rolesList = getRolesFromString(actorRolesStr) + if isinstance(actorJson['affiliation']['roleName'], + list): + rolesList = actorJson['affiliation']['roleName'] msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7436,8 +7436,9 @@ class PubServer(BaseHTTPRequestHandler): if self._fetchAuthenticated(): rolesList = [] if actorJson.get('affiliation'): - actorRolesStr = actorJson['affiliation']['roleName'] - rolesList = getRolesFromString(actorRolesStr) + if isinstance(actorJson['affiliation']['roleName'], + list): + rolesList = actorJson['affiliation']['roleName'] msg = json.dumps(rolesList, ensure_ascii=False) @@ -7497,9 +7498,9 @@ class PubServer(BaseHTTPRequestHandler): if self.server.keyShortcuts.get(nickname): accessKeys = \ self.server.keyShortcuts[nickname] - actorSkillsStr = \ + actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + skills = getSkillsFromList(actorSkillsList) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7536,9 +7537,9 @@ class PubServer(BaseHTTPRequestHandler): 'show skills') else: if self._fetchAuthenticated(): - actorSkillsStr = \ + actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + skills = getSkillsFromList(actorSkillsList) msg = json.dumps(skills, ensure_ascii=False) msg = msg.encode('utf-8') diff --git a/person.py b/person.py index 7195d70a9..0a2a29633 100644 --- a/person.py +++ b/person.py @@ -281,11 +281,11 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, 'hasOccupation': { '@type': 'Occupation', 'name': "", - 'skills': "" + 'skills': [] }, "affiliation": { "@type": "OrganizationRole", - "roleName": "", + "roleName": [], "affiliation": { "@type": "WebSite", "url": httpPrefix + '://' + domain @@ -586,10 +586,15 @@ def personUpgradeActor(baseDir: str, personJson: {}, personJson['hasOccupation'] = { '@type': 'Occupation', 'name': occupationName, - 'skills': "" + 'skills': [] } updateActor = True + if isinstance(personJson['hasOccupation']['skills'], str): + skillsList = personJson['hasOccupation']['skills'].split(', ') + personJson['hasOccupation']['skills'] = skillsList + updateActor = True + # remove the old skills format if personJson.get('skills'): del personJson['skills'] @@ -598,14 +603,14 @@ def personUpgradeActor(baseDir: str, personJson: {}, # if the older roles format is being used then switch # to the new one if not personJson.get('affiliation'): - rolesStr = '' + rolesList = [] adminName = getConfigParam(baseDir, 'admin') if personJson['id'].endswith('/users/' + adminName): - rolesStr = 'admin, moderator, editor' + rolesList = ["admin", "moderator", "editor"] statusNumber, published = getStatusNumber() personJson['affiliation'] = { "@type": "OrganizationRole", - "roleName": rolesStr, + "roleName": rolesList, "affiliation": { "@type": "WebSite", "url": personJson['id'].split('/users/')[0] @@ -614,13 +619,18 @@ def personUpgradeActor(baseDir: str, personJson: {}, } updateActor = True + if isinstance(personJson['affiliation']['roleName'], str): + rolesList = personJson['affiliation']['roleName'].split(', ') + personJson['affiliation']['roleName'] = rolesList + updateActor = True + # if no roles are defined then ensure that the admin # roles are configured if not personJson['affiliation']['roleName']: adminName = getConfigParam(baseDir, 'admin') if personJson['id'].endswith('/users/' + adminName): personJson['affiliation']['roleName'] = \ - 'admin, moderator, editor' + ["admin", "moderator", "editor"] updateActor = True # remove the old roles format diff --git a/roles.py b/roles.py index 1eba0fa10..3a59d21c3 100644 --- a/roles.py +++ b/roles.py @@ -33,7 +33,7 @@ def _clearRoleStatus(baseDir: str, role: str) -> None: if not actorJson.get('affiliation'): continue rolesList = \ - getRolesFromString(actorJson['affiliation']['roleName']) + getRolesFromList(actorJson['affiliation']['roleName']) if role in rolesList: rolesList.remove(role) saveJson(actorJson, filename) @@ -111,21 +111,19 @@ def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: def setRolesFromList(actorJson: {}, rolesList: []) -> None: """Sets roles from a list """ - rolesStr = '' - for roleName in rolesList: - if rolesStr: - rolesStr += ', ' - rolesStr += roleName.lower() if actorJson.get('affiliation'): - actorJson['affiliation']['roleName'] = rolesStr + actorJson['affiliation']['roleName'] = rolesList.copy() -def getRolesFromString(rolesStr: str) -> []: - """Returns a list of roles from a string +def getRolesFromList(rolesList: []) -> []: + """Returns a list of roles from a list """ - rolesList = rolesStr.split(',') + if isinstance(rolesList, list): + rolesList2 = rolesList + else: + rolesList2 = rolesList.split(',') rolesResult = [] - for roleName in rolesList: + for roleName in rolesList2: rolesResult.append(roleName.strip().lower()) return rolesResult @@ -154,7 +152,7 @@ def setRole(baseDir: str, nickname: str, domain: str, if not actorJson.get('affiliation'): return False rolesList = \ - getRolesFromString(actorJson['affiliation']['roleName']) + getRolesFromList(actorJson['affiliation']['roleName']) actorChanged = False if role: # add the role diff --git a/skills.py b/skills.py index 0c13d4165..8105cc5c0 100644 --- a/skills.py +++ b/skills.py @@ -17,25 +17,26 @@ from utils import getDomainFromActor from utils import loadJson -def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> str: +def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> []: """Converts a dict containing skills to a string Returns the string version of the dictionary """ - skillsStr = '' + skillsList = [] for name, value in skillsDict.items(): - if skillsStr: - skillsStr += ', ' - skillsStr += name + ':' + str(value) - actorJson['hasOccupation']['skills'] = skillsStr - return skillsStr + skillsList.append(name + ':' + str(value)) + actorJson['hasOccupation']['skills'] = skillsList + return skillsList -def getSkillsFromString(skillsStr: str) -> {}: - """Returns a dict of skills from a string +def getSkillsFromList(skillsList: []) -> {}: + """Returns a dict of skills from a list """ - skillsList = skillsStr.split(',') + if isinstance(skillsList, list): + skillsList2 = skillsList + else: + skillsList2 = skillsList.split(',') skillsDict = {} - for skill in skillsList: + for skill in skillsList2: if ':' not in skill: continue name = skill.split(':')[0].strip().lower() @@ -50,7 +51,7 @@ def actorHasSkill(actorJson: {}, skillName: str) -> bool: """Returns true if the actor has the given skill """ skillsDict = \ - getSkillsFromString(actorJson['hasOccupation']['skills']) + getSkillsFromList(actorJson['hasOccupation']['skills']) if not skillsDict: return False return skillsDict.get(skillName.lower()) @@ -60,7 +61,7 @@ def actorSkillValue(actorJson: {}, skillName: str) -> int: """Returns The skill level from an actor """ skillsDict = \ - getSkillsFromString(actorJson['hasOccupation']['skills']) + getSkillsFromList(actorJson['hasOccupation']['skills']) if not skillsDict: return 0 skillName = skillName.lower() @@ -73,7 +74,11 @@ def noOfActorSkills(actorJson: {}) -> int: """Returns the number of skills that an actor has """ if actorJson.get('hasOccupation'): - skillsList = actorJson['hasOccupation']['skills'].split(',') + skillsStr = actorJson['hasOccupation']['skills'] + if isinstance(skillsStr, list): + skillsList = skillsStr + else: + skillsList = skillsStr.split(',') if skillsList: return len(skillsList) return 0 @@ -96,7 +101,7 @@ def setActorSkillLevel(actorJson: {}, 'skills': '' } skillsDict = \ - getSkillsFromString(actorJson['hasOccupation']['skills']) + getSkillsFromList(actorJson['hasOccupation']['skills']) if skillLevelPercent > 0: skillsDict[skill] = skillLevelPercent else: @@ -133,7 +138,7 @@ def getSkills(baseDir: str, nickname: str, domain: str) -> []: if actorJson: if not actorJson.get('hasOccupation'): return None - return getSkillsFromString(actorJson['hasOccupation']['skills']) + return getSkillsFromList(actorJson['hasOccupation']['skills']) return None diff --git a/tests.py b/tests.py index 1b53f0f2e..4a3d84fe3 100644 --- a/tests.py +++ b/tests.py @@ -68,9 +68,9 @@ from person import setBio # from person import generateRSAKey from skills import setSkillLevel from skills import setSkillsFromDict -from skills import getSkillsFromString +from skills import getSkillsFromList from roles import setRolesFromList -from roles import getRolesFromString +from roles import getRolesFromList from roles import setRole from auth import constantTimeStringCheck from auth import createBasicAuthHeader @@ -3664,7 +3664,7 @@ def testSkills() -> None: 'hasOccupation': { '@type': 'Occupation', 'name': "", - 'skills': "" + 'skills': [] } } skillsDict = { @@ -3673,7 +3673,7 @@ def testSkills() -> None: } setSkillsFromDict(actorJson, skillsDict) assert actorJson['hasOccupation']['skills'] - skillsDict = getSkillsFromString(actorJson['hasOccupation']['skills']) + skillsDict = getSkillsFromList(actorJson['hasOccupation']['skills']) assert skillsDict.get('bakery') assert skillsDict.get('gardening') assert skillsDict['bakery'] == 40 @@ -3685,7 +3685,7 @@ def testRoles() -> None: actorJson = { 'affiliation': { "@type": "OrganizationRole", - "roleName": "", + "roleName": [], "affiliation": { "@type": "WebSite", "url": "https://testinstance.org" @@ -3696,7 +3696,7 @@ def testRoles() -> None: testRolesList = ["admin", "moderator"] setRolesFromList(actorJson, testRolesList) assert actorJson['affiliation']['roleName'] - rolesList = getRolesFromString(actorJson['affiliation']['roleName']) + rolesList = getRolesFromList(actorJson['affiliation']['roleName']) assert 'admin' in rolesList assert 'moderator' in rolesList diff --git a/webapp_search.py b/webapp_search.py index 131d019a3..33e9b6de5 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -21,7 +21,7 @@ from utils import isPublicPost from utils import firstParagraphFromString from utils import searchBoxPosts from skills import noOfActorSkills -from skills import getSkillsFromString +from skills import getSkillsFromList from categories import getHashtagCategory from feeds import rss2TagHeader from feeds import rss2TagFooter @@ -420,8 +420,8 @@ def htmlSkillsSearch(actor: str, actorJson.get('name') and \ actorJson.get('icon'): actor = actorJson['id'] - actorSkillsStr = actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + actorSkillsList = actorJson['hasOccupation']['skills'] + skills = getSkillsFromList(actorSkillsList) for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or @@ -461,9 +461,9 @@ def htmlSkillsSearch(actor: str, actorJson.get('name') and \ actorJson.get('icon'): actor = actorJson['id'] - actorSkillsStr = \ + actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + skills = getSkillsFromList(actorSkillsList) for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or diff --git a/webapp_utils.py b/webapp_utils.py index 6fdfbe1ea..00fc3cace 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -721,7 +721,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, skillsMarkup = '' if actorJson.get('hasOccupation'): - skillsStr = actorJson['hasOccupation']['skills'] + skillsList = actorJson['hasOccupation']['skills'] if actorJson['hasOccupation'].get('name'): occupationName = actorJson['hasOccupation']['name'] occupationStr = ' "name": "' + occupationName + '",\n' @@ -729,7 +729,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, ' "hasOccupation": {\n' + \ ' "@type": "Occupation",\n' + \ occupationStr + \ - ' "skills": "' + skillsStr + '"\n' + \ + ' "skills": ' + str(skillsList) + '\n' + \ ' "},\n' personMarkup = \ @@ -758,6 +758,10 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str, systemLanguage) licenseUrl = 'https://www.gnu.org/licenses/agpl-3.0.en.html' + + # social networking category + genreUrl = 'http://vocab.getty.edu/aat/300312270' + websiteMarkup = \ '