Admin can specify moderators

master
Bob Mottram 2019-08-12 22:20:47 +01:00
parent cc332f316b
commit 625e5eb011
3 changed files with 76 additions and 5 deletions

View File

@ -60,7 +60,10 @@ from blocking import outboxUndoBlock
from blocking import addBlock from blocking import addBlock
from blocking import removeBlock from blocking import removeBlock
from config import setConfigParam from config import setConfigParam
from config import getConfigParam
from roles import outboxDelegate from roles import outboxDelegate
from roles import setRole
from roles import clearModeratorStatus
from skills import outboxSkills from skills import outboxSkills
from availability import outboxAvailability from availability import outboxAvailability
from webinterface import htmlIndividualPost from webinterface import htmlIndividualPost
@ -2008,6 +2011,36 @@ class PubServer(BaseHTTPRequestHandler):
for tagName,tag in actorTags.items(): for tagName,tag in actorTags.items():
actorJson['tag'].append(tag) actorJson['tag'].append(tag)
actorChanged=True actorChanged=True
if fields.get('moderators'):
adminNickname=getConfigParam(self.server.baseDir,'admin')
if self.path.startswith('/users/'+adminNickname+'/'):
moderatorsFile=self.server.baseDir+'/accounts/moderators.txt'
clearModeratorStatus(self.server.baseDir)
if ',' in fields['moderators']:
# if the list was given as comma separated
modFile=open(moderatorsFile,"w+")
for modNick in fields['moderators'].split(','):
modNick=modNick.strip()
if os.path.isdir(self.server.baseDir+'/accounts/'+modNick+'@'+self.server.domain):
modFile.write(modNick+'\n')
modFile.close()
for modNick in fields['moderators'].split(','):
modNick=modNick.strip()
if os.path.isdir(self.server.baseDir+'/accounts/'+modNick+'@'+self.server.domain):
setRole(self.server.baseDir,modNick,self.server.domain,'instance','moderator')
else:
# nicknames on separate lines
modFile=open(moderatorsFile,"w+")
for modNick in fields['moderators'].split('\n'):
modNick=modNick.strip()
if os.path.isdir(self.server.baseDir+'/accounts/'+modNick+'@'+self.server.domain):
modFile.write(modNick+'\n')
modFile.close()
for modNick in fields['moderators'].split('\n'):
modNick=modNick.strip()
if os.path.isdir(self.server.baseDir+'/accounts/'+modNick+'@'+self.server.domain):
setRole(self.server.baseDir,modNick,self.server.domain,'instance','moderator')
approveFollowers=False approveFollowers=False
if fields.get('approveFollowers'): if fields.get('approveFollowers'):
if fields['approveFollowers']=='on': if fields['approveFollowers']=='on':

View File

@ -16,9 +16,30 @@ from session import postJson
from utils import getNicknameFromActor from utils import getNicknameFromActor
from utils import getDomainFromActor from utils import getDomainFromActor
def addModerator(baseDir: str,nickname: str): def clearModeratorStatus(baseDir: str) -> None:
"""Removes moderator status from all accounts
This could be slow if there are many users, but only happens
rarely when moderators are appointed or removed
"""
directory = os.fsencode(baseDir+'/accounts/')
for f in os.listdir(directory):
filename = os.fsdecode(f)
if filename.endswith(".json") and '@' in filename:
filename=os.path.join(baseDir+'/accounts/', filename)
if '"moderator"' in open(filename).read():
with open(filename, 'r') as fp:
actorJson=commentjson.load(fp)
if actorJson['roles'].get('instance'):
if 'moderator' in actorJson['roles']['instance']:
actorJson['roles']['instance'].remove('moderator')
with open(filename, 'w') as fp:
commentjson.dump(actorJson, fp, indent=4, sort_keys=False)
def addModerator(baseDir: str,nickname: str,domain: str) -> None:
"""Adds a moderator nickname to the file """Adds a moderator nickname to the file
""" """
if ':' in domain:
domain=domain.split(':')[0]
moderatorsFile=baseDir+'/accounts/moderators.txt' moderatorsFile=baseDir+'/accounts/moderators.txt'
if os.path.isfile(moderatorsFile): if os.path.isfile(moderatorsFile):
# is this nickname already in the file? # is this nickname already in the file?
@ -33,9 +54,11 @@ def addModerator(baseDir: str,nickname: str):
for moderator in lines: for moderator in lines:
moderator=moderator.strip('\n') moderator=moderator.strip('\n')
if len(moderator)>1: if len(moderator)>1:
if os.path.isdir(baseDir+'/accounts/'+moderator+'@'+domain):
f.write(moderator+'\n') f.write(moderator+'\n')
else: else:
with open(moderatorsFile, "w+") as f: with open(moderatorsFile, "w+") as f:
if os.path.isdir(baseDir+'/accounts/'+nickname+'@'+domain):
f.write(nickname+'\n') f.write(nickname+'\n')
def removeModerator(baseDir: str,nickname: str): def removeModerator(baseDir: str,nickname: str):
@ -68,7 +91,7 @@ def setRole(baseDir: str,nickname: str,domain: str, \
if role: if role:
# add the role # add the role
if project=='instance' and 'role'=='moderator': if project=='instance' and 'role'=='moderator':
addModerator(baseDir,nickname) addModerator(baseDir,nickname,domain)
if actorJson['roles'].get(project): if actorJson['roles'].get(project):
if role not in actorJson['roles'][project]: if role not in actorJson['roles'][project]:
actorJson['roles'][project].append(role) actorJson['roles'][project].append(role)

View File

@ -174,6 +174,21 @@ def htmlEditProfile(baseDir: str,path: str,domain: str,port: int) -> str:
with open(baseDir+'/epicyon-profile.css', 'r') as cssFile: with open(baseDir+'/epicyon-profile.css', 'r') as cssFile:
newPostCSS = cssFile.read() newPostCSS = cssFile.read()
moderatorsStr=''
adminNickname=getConfigParam(baseDir,'admin')
if path.startswith('/users/'+adminNickname+'/'):
moderators=''
moderatorsFile=baseDir+'/accounts/moderators.txt'
if os.path.isfile(moderatorsFile):
with open(moderatorsFile, "r") as f:
moderators = f.read()
moderatorsStr= \
'<div class="container">' \
' <b>Moderators</b><br>' \
' A list of moderator nicknames. One per line.' \
' <textarea id="message" name="moderators" placeholder="List of moderator nicknames..." style="height:200px">'+moderators+'</textarea>' \
'</div>'
editProfileForm=htmlHeader(newPostCSS) editProfileForm=htmlHeader(newPostCSS)
editProfileForm+= \ editProfileForm+= \
'<form enctype="multipart/form-data" method="POST" action="'+path+'/profiledata">' \ '<form enctype="multipart/form-data" method="POST" action="'+path+'/profiledata">' \
@ -214,7 +229,7 @@ def htmlEditProfile(baseDir: str,path: str,domain: str,port: int) -> str:
' <div class="container">' \ ' <div class="container">' \
' <b>Skills</b><br>' \ ' <b>Skills</b><br>' \
' If you want to participate within organizations then you can indicate some skills that you have and approximate proficiency levels. This helps organizers to construct teams with an appropriate combination of skills.'+ \ ' If you want to participate within organizations then you can indicate some skills that you have and approximate proficiency levels. This helps organizers to construct teams with an appropriate combination of skills.'+ \
skillsStr+ \ skillsStr+moderatorsStr+ \
' </div>' \ ' </div>' \
' </div>' \ ' </div>' \
'</form>' '</form>'