mirror of https://gitlab.com/bashrc2/epicyon
Admin can specify moderators
parent
cc332f316b
commit
625e5eb011
33
daemon.py
33
daemon.py
|
@ -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':
|
||||||
|
|
31
roles.py
31
roles.py
|
@ -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,10 +54,12 @@ 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:
|
||||||
f.write(moderator+'\n')
|
if os.path.isdir(baseDir+'/accounts/'+moderator+'@'+domain):
|
||||||
|
f.write(moderator+'\n')
|
||||||
else:
|
else:
|
||||||
with open(moderatorsFile, "w+") as f:
|
with open(moderatorsFile, "w+") as f:
|
||||||
f.write(nickname+'\n')
|
if os.path.isdir(baseDir+'/accounts/'+nickname+'@'+domain):
|
||||||
|
f.write(nickname+'\n')
|
||||||
|
|
||||||
def removeModerator(baseDir: str,nickname: str):
|
def removeModerator(baseDir: str,nickname: str):
|
||||||
"""Removes a moderator nickname from the file
|
"""Removes a moderator nickname from the file
|
||||||
|
@ -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)
|
||||||
|
|
|
@ -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>'
|
||||||
|
|
Loading…
Reference in New Issue