Merge branch 'main' of ssh://code.freedombone.net:2222/bashrc/epicyon

main
Bob Mottram 2021-05-15 10:08:38 +01:00
commit 764f5a7804
8 changed files with 78 additions and 60 deletions

View File

@ -98,7 +98,7 @@ from follow import getFollowingFeed
from follow import sendFollowRequest from follow import sendFollowRequest
from follow import unfollowAccount from follow import unfollowAccount
from follow import createInitialLastSeen from follow import createInitialLastSeen
from skills import getSkillsFromString from skills import getSkillsFromList
from skills import noOfActorSkills from skills import noOfActorSkills
from skills import actorHasSkill from skills import actorHasSkill
from skills import actorSkillValue from skills import actorSkillValue
@ -124,7 +124,6 @@ from blocking import isBlockedHashtag
from blocking import isBlockedDomain from blocking import isBlockedDomain
from blocking import getDomainBlocklist from blocking import getDomainBlocklist
from roles import setRole from roles import setRole
from roles import getRolesFromString
from roles import clearModeratorStatus from roles import clearModeratorStatus
from roles import clearEditorStatus from roles import clearEditorStatus
from roles import clearCounselorStatus from roles import clearCounselorStatus
@ -7397,8 +7396,9 @@ class PubServer(BaseHTTPRequestHandler):
rolesList = [] rolesList = []
if actorJson.get('affiliation'): if actorJson.get('affiliation'):
actorRolesStr = actorJson['affiliation']['roleName'] if isinstance(actorJson['affiliation']['roleName'],
rolesList = getRolesFromString(actorRolesStr) list):
rolesList = actorJson['affiliation']['roleName']
msg = \ msg = \
htmlProfile(self.server.rssIconAtTop, htmlProfile(self.server.rssIconAtTop,
self.server.cssCache, self.server.cssCache,
@ -7436,8 +7436,9 @@ class PubServer(BaseHTTPRequestHandler):
if self._fetchAuthenticated(): if self._fetchAuthenticated():
rolesList = [] rolesList = []
if actorJson.get('affiliation'): if actorJson.get('affiliation'):
actorRolesStr = actorJson['affiliation']['roleName'] if isinstance(actorJson['affiliation']['roleName'],
rolesList = getRolesFromString(actorRolesStr) list):
rolesList = actorJson['affiliation']['roleName']
msg = json.dumps(rolesList, msg = json.dumps(rolesList,
ensure_ascii=False) ensure_ascii=False)
@ -7497,9 +7498,9 @@ class PubServer(BaseHTTPRequestHandler):
if self.server.keyShortcuts.get(nickname): if self.server.keyShortcuts.get(nickname):
accessKeys = \ accessKeys = \
self.server.keyShortcuts[nickname] self.server.keyShortcuts[nickname]
actorSkillsStr = \ actorSkillsList = \
actorJson['hasOccupation']['skills'] actorJson['hasOccupation']['skills']
skills = getSkillsFromString(actorSkillsStr) skills = getSkillsFromList(actorSkillsList)
msg = \ msg = \
htmlProfile(self.server.rssIconAtTop, htmlProfile(self.server.rssIconAtTop,
self.server.cssCache, self.server.cssCache,
@ -7536,9 +7537,9 @@ class PubServer(BaseHTTPRequestHandler):
'show skills') 'show skills')
else: else:
if self._fetchAuthenticated(): if self._fetchAuthenticated():
actorSkillsStr = \ actorSkillsList = \
actorJson['hasOccupation']['skills'] actorJson['hasOccupation']['skills']
skills = getSkillsFromString(actorSkillsStr) skills = getSkillsFromList(actorSkillsList)
msg = json.dumps(skills, msg = json.dumps(skills,
ensure_ascii=False) ensure_ascii=False)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')

View File

@ -281,11 +281,11 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int,
'hasOccupation': { 'hasOccupation': {
'@type': 'Occupation', '@type': 'Occupation',
'name': "", 'name': "",
'skills': "" 'skills': []
}, },
"affiliation": { "affiliation": {
"@type": "OrganizationRole", "@type": "OrganizationRole",
"roleName": "", "roleName": [],
"affiliation": { "affiliation": {
"@type": "WebSite", "@type": "WebSite",
"url": httpPrefix + '://' + domain "url": httpPrefix + '://' + domain
@ -586,10 +586,15 @@ def personUpgradeActor(baseDir: str, personJson: {},
personJson['hasOccupation'] = { personJson['hasOccupation'] = {
'@type': 'Occupation', '@type': 'Occupation',
'name': occupationName, 'name': occupationName,
'skills': "" 'skills': []
} }
updateActor = True updateActor = True
if isinstance(personJson['hasOccupation']['skills'], str):
skillsList = personJson['hasOccupation']['skills'].split(', ')
personJson['hasOccupation']['skills'] = skillsList
updateActor = True
# remove the old skills format # remove the old skills format
if personJson.get('skills'): if personJson.get('skills'):
del personJson['skills'] del personJson['skills']
@ -598,14 +603,14 @@ def personUpgradeActor(baseDir: str, personJson: {},
# if the older roles format is being used then switch # if the older roles format is being used then switch
# to the new one # to the new one
if not personJson.get('affiliation'): if not personJson.get('affiliation'):
rolesStr = '' rolesList = []
adminName = getConfigParam(baseDir, 'admin') adminName = getConfigParam(baseDir, 'admin')
if personJson['id'].endswith('/users/' + adminName): if personJson['id'].endswith('/users/' + adminName):
rolesStr = 'admin, moderator, editor' rolesList = ["admin", "moderator", "editor"]
statusNumber, published = getStatusNumber() statusNumber, published = getStatusNumber()
personJson['affiliation'] = { personJson['affiliation'] = {
"@type": "OrganizationRole", "@type": "OrganizationRole",
"roleName": rolesStr, "roleName": rolesList,
"affiliation": { "affiliation": {
"@type": "WebSite", "@type": "WebSite",
"url": personJson['id'].split('/users/')[0] "url": personJson['id'].split('/users/')[0]
@ -614,13 +619,18 @@ def personUpgradeActor(baseDir: str, personJson: {},
} }
updateActor = True 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 # if no roles are defined then ensure that the admin
# roles are configured # roles are configured
if not personJson['affiliation']['roleName']: if not personJson['affiliation']['roleName']:
adminName = getConfigParam(baseDir, 'admin') adminName = getConfigParam(baseDir, 'admin')
if personJson['id'].endswith('/users/' + adminName): if personJson['id'].endswith('/users/' + adminName):
personJson['affiliation']['roleName'] = \ personJson['affiliation']['roleName'] = \
'admin, moderator, editor' ["admin", "moderator", "editor"]
updateActor = True updateActor = True
# remove the old roles format # remove the old roles format

View File

@ -33,7 +33,7 @@ def _clearRoleStatus(baseDir: str, role: str) -> None:
if not actorJson.get('affiliation'): if not actorJson.get('affiliation'):
continue continue
rolesList = \ rolesList = \
getRolesFromString(actorJson['affiliation']['roleName']) getRolesFromList(actorJson['affiliation']['roleName'])
if role in rolesList: if role in rolesList:
rolesList.remove(role) rolesList.remove(role)
saveJson(actorJson, filename) saveJson(actorJson, filename)
@ -111,21 +111,19 @@ def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None:
def setRolesFromList(actorJson: {}, rolesList: []) -> None: def setRolesFromList(actorJson: {}, rolesList: []) -> None:
"""Sets roles from a list """Sets roles from a list
""" """
rolesStr = ''
for roleName in rolesList:
if rolesStr:
rolesStr += ', '
rolesStr += roleName.lower()
if actorJson.get('affiliation'): if actorJson.get('affiliation'):
actorJson['affiliation']['roleName'] = rolesStr actorJson['affiliation']['roleName'] = rolesList.copy()
def getRolesFromString(rolesStr: str) -> []: def getRolesFromList(rolesList: []) -> []:
"""Returns a list of roles from a string """Returns a list of roles from a list
""" """
rolesList = rolesStr.split(',') if isinstance(rolesList, list):
rolesList2 = rolesList
else:
rolesList2 = rolesList.split(',')
rolesResult = [] rolesResult = []
for roleName in rolesList: for roleName in rolesList2:
rolesResult.append(roleName.strip().lower()) rolesResult.append(roleName.strip().lower())
return rolesResult return rolesResult
@ -154,7 +152,7 @@ def setRole(baseDir: str, nickname: str, domain: str,
if not actorJson.get('affiliation'): if not actorJson.get('affiliation'):
return False return False
rolesList = \ rolesList = \
getRolesFromString(actorJson['affiliation']['roleName']) getRolesFromList(actorJson['affiliation']['roleName'])
actorChanged = False actorChanged = False
if role: if role:
# add the role # add the role

View File

@ -17,25 +17,26 @@ from utils import getDomainFromActor
from utils import loadJson from utils import loadJson
def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> str: def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> []:
"""Converts a dict containing skills to a string """Converts a dict containing skills to a string
Returns the string version of the dictionary Returns the string version of the dictionary
""" """
skillsStr = '' skillsList = []
for name, value in skillsDict.items(): for name, value in skillsDict.items():
if skillsStr: skillsList.append(name + ':' + str(value))
skillsStr += ', ' actorJson['hasOccupation']['skills'] = skillsList
skillsStr += name + ':' + str(value) return skillsList
actorJson['hasOccupation']['skills'] = skillsStr
return skillsStr
def getSkillsFromString(skillsStr: str) -> {}: def getSkillsFromList(skillsList: []) -> {}:
"""Returns a dict of skills from a string """Returns a dict of skills from a list
""" """
skillsList = skillsStr.split(',') if isinstance(skillsList, list):
skillsList2 = skillsList
else:
skillsList2 = skillsList.split(',')
skillsDict = {} skillsDict = {}
for skill in skillsList: for skill in skillsList2:
if ':' not in skill: if ':' not in skill:
continue continue
name = skill.split(':')[0].strip().lower() 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 """Returns true if the actor has the given skill
""" """
skillsDict = \ skillsDict = \
getSkillsFromString(actorJson['hasOccupation']['skills']) getSkillsFromList(actorJson['hasOccupation']['skills'])
if not skillsDict: if not skillsDict:
return False return False
return skillsDict.get(skillName.lower()) return skillsDict.get(skillName.lower())
@ -60,7 +61,7 @@ def actorSkillValue(actorJson: {}, skillName: str) -> int:
"""Returns The skill level from an actor """Returns The skill level from an actor
""" """
skillsDict = \ skillsDict = \
getSkillsFromString(actorJson['hasOccupation']['skills']) getSkillsFromList(actorJson['hasOccupation']['skills'])
if not skillsDict: if not skillsDict:
return 0 return 0
skillName = skillName.lower() skillName = skillName.lower()
@ -73,7 +74,11 @@ def noOfActorSkills(actorJson: {}) -> int:
"""Returns the number of skills that an actor has """Returns the number of skills that an actor has
""" """
if actorJson.get('hasOccupation'): 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: if skillsList:
return len(skillsList) return len(skillsList)
return 0 return 0
@ -96,7 +101,7 @@ def setActorSkillLevel(actorJson: {},
'skills': '' 'skills': ''
} }
skillsDict = \ skillsDict = \
getSkillsFromString(actorJson['hasOccupation']['skills']) getSkillsFromList(actorJson['hasOccupation']['skills'])
if skillLevelPercent > 0: if skillLevelPercent > 0:
skillsDict[skill] = skillLevelPercent skillsDict[skill] = skillLevelPercent
else: else:
@ -133,7 +138,7 @@ def getSkills(baseDir: str, nickname: str, domain: str) -> []:
if actorJson: if actorJson:
if not actorJson.get('hasOccupation'): if not actorJson.get('hasOccupation'):
return None return None
return getSkillsFromString(actorJson['hasOccupation']['skills']) return getSkillsFromList(actorJson['hasOccupation']['skills'])
return None return None

View File

@ -68,9 +68,9 @@ from person import setBio
# from person import generateRSAKey # from person import generateRSAKey
from skills import setSkillLevel from skills import setSkillLevel
from skills import setSkillsFromDict from skills import setSkillsFromDict
from skills import getSkillsFromString from skills import getSkillsFromList
from roles import setRolesFromList from roles import setRolesFromList
from roles import getRolesFromString from roles import getRolesFromList
from roles import setRole from roles import setRole
from auth import constantTimeStringCheck from auth import constantTimeStringCheck
from auth import createBasicAuthHeader from auth import createBasicAuthHeader
@ -3664,7 +3664,7 @@ def testSkills() -> None:
'hasOccupation': { 'hasOccupation': {
'@type': 'Occupation', '@type': 'Occupation',
'name': "", 'name': "",
'skills': "" 'skills': []
} }
} }
skillsDict = { skillsDict = {
@ -3673,7 +3673,7 @@ def testSkills() -> None:
} }
setSkillsFromDict(actorJson, skillsDict) setSkillsFromDict(actorJson, skillsDict)
assert actorJson['hasOccupation']['skills'] assert actorJson['hasOccupation']['skills']
skillsDict = getSkillsFromString(actorJson['hasOccupation']['skills']) skillsDict = getSkillsFromList(actorJson['hasOccupation']['skills'])
assert skillsDict.get('bakery') assert skillsDict.get('bakery')
assert skillsDict.get('gardening') assert skillsDict.get('gardening')
assert skillsDict['bakery'] == 40 assert skillsDict['bakery'] == 40
@ -3685,7 +3685,7 @@ def testRoles() -> None:
actorJson = { actorJson = {
'affiliation': { 'affiliation': {
"@type": "OrganizationRole", "@type": "OrganizationRole",
"roleName": "", "roleName": [],
"affiliation": { "affiliation": {
"@type": "WebSite", "@type": "WebSite",
"url": "https://testinstance.org" "url": "https://testinstance.org"
@ -3696,7 +3696,7 @@ def testRoles() -> None:
testRolesList = ["admin", "moderator"] testRolesList = ["admin", "moderator"]
setRolesFromList(actorJson, testRolesList) setRolesFromList(actorJson, testRolesList)
assert actorJson['affiliation']['roleName'] assert actorJson['affiliation']['roleName']
rolesList = getRolesFromString(actorJson['affiliation']['roleName']) rolesList = getRolesFromList(actorJson['affiliation']['roleName'])
assert 'admin' in rolesList assert 'admin' in rolesList
assert 'moderator' in rolesList assert 'moderator' in rolesList

View File

@ -21,7 +21,7 @@ from utils import isPublicPost
from utils import firstParagraphFromString from utils import firstParagraphFromString
from utils import searchBoxPosts from utils import searchBoxPosts
from skills import noOfActorSkills from skills import noOfActorSkills
from skills import getSkillsFromString from skills import getSkillsFromList
from categories import getHashtagCategory from categories import getHashtagCategory
from feeds import rss2TagHeader from feeds import rss2TagHeader
from feeds import rss2TagFooter from feeds import rss2TagFooter
@ -420,8 +420,8 @@ def htmlSkillsSearch(actor: str,
actorJson.get('name') and \ actorJson.get('name') and \
actorJson.get('icon'): actorJson.get('icon'):
actor = actorJson['id'] actor = actorJson['id']
actorSkillsStr = actorJson['hasOccupation']['skills'] actorSkillsList = actorJson['hasOccupation']['skills']
skills = getSkillsFromString(actorSkillsStr) skills = getSkillsFromList(actorSkillsList)
for skillName, skillLevel in skills.items(): for skillName, skillLevel in skills.items():
skillName = skillName.lower() skillName = skillName.lower()
if not (skillName in skillsearch or if not (skillName in skillsearch or
@ -461,9 +461,9 @@ def htmlSkillsSearch(actor: str,
actorJson.get('name') and \ actorJson.get('name') and \
actorJson.get('icon'): actorJson.get('icon'):
actor = actorJson['id'] actor = actorJson['id']
actorSkillsStr = \ actorSkillsList = \
actorJson['hasOccupation']['skills'] actorJson['hasOccupation']['skills']
skills = getSkillsFromString(actorSkillsStr) skills = getSkillsFromList(actorSkillsList)
for skillName, skillLevel in skills.items(): for skillName, skillLevel in skills.items():
skillName = skillName.lower() skillName = skillName.lower()
if not (skillName in skillsearch or if not (skillName in skillsearch or

View File

@ -721,7 +721,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str,
skillsMarkup = '' skillsMarkup = ''
if actorJson.get('hasOccupation'): if actorJson.get('hasOccupation'):
skillsStr = actorJson['hasOccupation']['skills'] skillsList = actorJson['hasOccupation']['skills']
if actorJson['hasOccupation'].get('name'): if actorJson['hasOccupation'].get('name'):
occupationName = actorJson['hasOccupation']['name'] occupationName = actorJson['hasOccupation']['name']
occupationStr = ' "name": "' + occupationName + '",\n' occupationStr = ' "name": "' + occupationName + '",\n'
@ -729,7 +729,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str,
' "hasOccupation": {\n' + \ ' "hasOccupation": {\n' + \
' "@type": "Occupation",\n' + \ ' "@type": "Occupation",\n' + \
occupationStr + \ occupationStr + \
' "skills": "' + skillsStr + '"\n' + \ ' "skills": ' + str(skillsList) + '\n' + \
' "},\n' ' "},\n'
personMarkup = \ personMarkup = \
@ -758,6 +758,10 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str,
systemLanguage) systemLanguage)
licenseUrl = 'https://www.gnu.org/licenses/agpl-3.0.en.html' licenseUrl = 'https://www.gnu.org/licenses/agpl-3.0.en.html'
# social networking category
genreUrl = 'http://vocab.getty.edu/aat/300312270'
websiteMarkup = \ websiteMarkup = \
' <script type="application/ld+json">\n' + \ ' <script type="application/ld+json">\n' + \
' {\n' + \ ' {\n' + \
@ -768,7 +772,7 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str,
' "license": "' + licenseUrl + '",\n' + \ ' "license": "' + licenseUrl + '",\n' + \
' "inLanguage": "' + systemLanguage + '",\n' + \ ' "inLanguage": "' + systemLanguage + '",\n' + \
' "isAccessibleForFree": true,\n' + \ ' "isAccessibleForFree": true,\n' + \
' "genre": "https://en.wikipedia.org/wiki/Fediverse",\n' + \ ' "genre": "' + genreUrl + '",\n' + \
' "accessMode": ["textual", "visual"],\n' + \ ' "accessMode": ["textual", "visual"],\n' + \
' "accessModeSufficient": ["textual"],\n' + \ ' "accessModeSufficient": ["textual"],\n' + \
' "accessibilityAPI" : ["ARIA"],\n' + \ ' "accessibilityAPI" : ["ARIA"],\n' + \

View File

@ -14,7 +14,7 @@
"email": "bob@freedombone.net", "email": "bob@freedombone.net",
"url": "https://epicyon.freedombone.net/users/bob" "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" "downloadUrl" : "https://epicyon.net/epicyon.tar.gz"
} }
</script> </script>