From 2c70942481376f83a541585411a59b58422484c3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 18:41:05 +0100 Subject: [PATCH 1/6] Convert skills to a list --- daemon.py | 8 ++++---- person.py | 4 ++-- skills.py | 23 ++++++++++++++--------- tests.py | 2 +- webapp_search.py | 8 ++++---- webapp_utils.py | 4 ++-- website/EN/index.html | 2 +- 7 files changed, 28 insertions(+), 23 deletions(-) diff --git a/daemon.py b/daemon.py index 1b616ddf6..cd84224ba 100644 --- a/daemon.py +++ b/daemon.py @@ -7497,9 +7497,9 @@ class PubServer(BaseHTTPRequestHandler): if self.server.keyShortcuts.get(nickname): accessKeys = \ self.server.keyShortcuts[nickname] - actorSkillsStr = \ + actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + skills = getSkillsFromString(actorSkillsList) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7536,9 +7536,9 @@ class PubServer(BaseHTTPRequestHandler): 'show skills') else: if self._fetchAuthenticated(): - actorSkillsStr = \ + actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + skills = getSkillsFromString(actorSkillsList) msg = json.dumps(skills, ensure_ascii=False) msg = msg.encode('utf-8') diff --git a/person.py b/person.py index 7195d70a9..8259d6e16 100644 --- a/person.py +++ b/person.py @@ -281,7 +281,7 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, 'hasOccupation': { '@type': 'Occupation', 'name': "", - 'skills': "" + 'skills': [] }, "affiliation": { "@type": "OrganizationRole", @@ -586,7 +586,7 @@ def personUpgradeActor(baseDir: str, personJson: {}, personJson['hasOccupation'] = { '@type': 'Occupation', 'name': occupationName, - 'skills': "" + 'skills': [] } updateActor = True diff --git a/skills.py b/skills.py index 0c13d4165..1e193599a 100644 --- a/skills.py +++ b/skills.py @@ -17,23 +17,24 @@ 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 """ - skillsList = skillsStr.split(',') + if isinstance(skillsStr, list): + skillsList = skillsStr + else: + skillsList = skillsStr.split(',') skillsDict = {} for skill in skillsList: if ':' not in skill: @@ -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 diff --git a/tests.py b/tests.py index 1b53f0f2e..58da3cb07 100644 --- a/tests.py +++ b/tests.py @@ -3664,7 +3664,7 @@ def testSkills() -> None: 'hasOccupation': { '@type': 'Occupation', 'name': "", - 'skills': "" + 'skills': [] } } skillsDict = { diff --git a/webapp_search.py b/webapp_search.py index 131d019a3..da5c61b1d 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -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 = getSkillsFromString(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 = getSkillsFromString(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..36635d879 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 = \ diff --git a/website/EN/index.html b/website/EN/index.html index cd667bfe8..8ccea5135 100644 --- a/website/EN/index.html +++ b/website/EN/index.html @@ -14,7 +14,7 @@ "email": "bob@freedombone.net", "url": "https://epicyon.freedombone.net/users/bob" }, - "applicationCategory" : "server, software, fediverse, activitypub, self-hosting", + "applicationCategory" : ["server", "software", "bash", "debian", "linux", "self-hosting"], "downloadUrl" : "https://epicyon.net/epicyon.tar.gz" } From e44ed60ffc156d1b7c183bfcc6be31919bb3e6ab Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 18:56:26 +0100 Subject: [PATCH 2/6] roleName becomes a list --- daemon.py | 11 ++++++----- person.py | 10 +++++----- roles.py | 12 +++++------- tests.py | 2 +- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/daemon.py b/daemon.py index cd84224ba..aca43eac9 100644 --- a/daemon.py +++ b/daemon.py @@ -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) diff --git a/person.py b/person.py index 8259d6e16..f97f0750e 100644 --- a/person.py +++ b/person.py @@ -285,7 +285,7 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, }, "affiliation": { "@type": "OrganizationRole", - "roleName": "", + "roleName": [], "affiliation": { "@type": "WebSite", "url": httpPrefix + '://' + domain @@ -598,14 +598,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] @@ -620,7 +620,7 @@ def personUpgradeActor(baseDir: str, personJson: {}, 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..2c4d25e0c 100644 --- a/roles.py +++ b/roles.py @@ -111,19 +111,17 @@ 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 """ - rolesList = rolesStr.split(',') + if isinstance(rolesStr, list): + rolesList = rolesStr + else: + rolesList = rolesStr.split(',') rolesResult = [] for roleName in rolesList: rolesResult.append(roleName.strip().lower()) diff --git a/tests.py b/tests.py index 58da3cb07..42c6c4087 100644 --- a/tests.py +++ b/tests.py @@ -3685,7 +3685,7 @@ def testRoles() -> None: actorJson = { 'affiliation': { "@type": "OrganizationRole", - "roleName": "", + "roleName": [], "affiliation": { "@type": "WebSite", "url": "https://testinstance.org" From 2306d8d393f733531c19cad3531a95c5198555ba Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 19:02:58 +0100 Subject: [PATCH 3/6] Convert strings to lists --- person.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/person.py b/person.py index f97f0750e..0a2a29633 100644 --- a/person.py +++ b/person.py @@ -590,6 +590,11 @@ def personUpgradeActor(baseDir: str, personJson: {}, } 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'] @@ -614,6 +619,11 @@ 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']: From ef5b5d78692a25ee9e86decc27866e8b24e7c22d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 21:02:55 +0100 Subject: [PATCH 4/6] Change function name --- daemon.py | 6 +++--- skills.py | 20 ++++++++++---------- tests.py | 4 ++-- webapp_search.py | 6 +++--- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/daemon.py b/daemon.py index aca43eac9..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 @@ -7500,7 +7500,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.keyShortcuts[nickname] actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsList) + skills = getSkillsFromList(actorSkillsList) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7539,7 +7539,7 @@ class PubServer(BaseHTTPRequestHandler): if self._fetchAuthenticated(): actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsList) + skills = getSkillsFromList(actorSkillsList) msg = json.dumps(skills, ensure_ascii=False) msg = msg.encode('utf-8') diff --git a/skills.py b/skills.py index 1e193599a..8105cc5c0 100644 --- a/skills.py +++ b/skills.py @@ -28,15 +28,15 @@ def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> []: 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 """ - if isinstance(skillsStr, list): - skillsList = skillsStr + if isinstance(skillsList, list): + skillsList2 = skillsList else: - skillsList = skillsStr.split(',') + skillsList2 = skillsList.split(',') skillsDict = {} - for skill in skillsList: + for skill in skillsList2: if ':' not in skill: continue name = skill.split(':')[0].strip().lower() @@ -51,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()) @@ -61,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() @@ -101,7 +101,7 @@ def setActorSkillLevel(actorJson: {}, 'skills': '' } skillsDict = \ - getSkillsFromString(actorJson['hasOccupation']['skills']) + getSkillsFromList(actorJson['hasOccupation']['skills']) if skillLevelPercent > 0: skillsDict[skill] = skillLevelPercent else: @@ -138,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 42c6c4087..20983ce2e 100644 --- a/tests.py +++ b/tests.py @@ -68,7 +68,7 @@ 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 setRole @@ -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 diff --git a/webapp_search.py b/webapp_search.py index da5c61b1d..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 @@ -421,7 +421,7 @@ def htmlSkillsSearch(actor: str, actorJson.get('icon'): actor = actorJson['id'] actorSkillsList = actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsList) + skills = getSkillsFromList(actorSkillsList) for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or @@ -463,7 +463,7 @@ def htmlSkillsSearch(actor: str, actor = actorJson['id'] actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsList) + skills = getSkillsFromList(actorSkillsList) for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or From 4e354c344f63c237edaa19349e2e35fa25f870cd Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 21:07:44 +0100 Subject: [PATCH 5/6] Change function name --- roles.py | 16 ++++++++-------- tests.py | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/roles.py b/roles.py index 2c4d25e0c..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) @@ -115,15 +115,15 @@ def setRolesFromList(actorJson: {}, rolesList: []) -> None: 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 """ - if isinstance(rolesStr, list): - rolesList = rolesStr + if isinstance(rolesList, list): + rolesList2 = rolesList else: - rolesList = rolesStr.split(',') + rolesList2 = rolesList.split(',') rolesResult = [] - for roleName in rolesList: + for roleName in rolesList2: rolesResult.append(roleName.strip().lower()) return rolesResult @@ -152,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/tests.py b/tests.py index 20983ce2e..4a3d84fe3 100644 --- a/tests.py +++ b/tests.py @@ -70,7 +70,7 @@ from skills import setSkillLevel from skills import setSkillsFromDict 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 @@ -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 From 145b8a620b561cfb2aed3ba52516f3aa0c9e3dd6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 15 May 2021 10:08:01 +0100 Subject: [PATCH 6/6] Social networking category --- webapp_utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index 36635d879..00fc3cace 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -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 = \ '