diff --git a/blog.py b/blog.py index fde6de7c5..2ba055066 100644 --- a/blog.py +++ b/blog.py @@ -895,7 +895,7 @@ def html_edit_blog(media_instance: bool, translate: {}, content_str = content_str.replace('

', '').replace('

', '\n') edit_blog_form += \ - edit_text_area(placeholder_message, 'message', content_str, + edit_text_area(placeholder_message, None, 'message', content_str, message_box_height, '', True) edit_blog_form += date_and_location if not media_instance: diff --git a/daemon.py b/daemon.py index 4ab1e3aad..ae1188933 100644 --- a/daemon.py +++ b/daemon.py @@ -152,13 +152,8 @@ from blocking import remove_global_block from blocking import is_blocked_hashtag from blocking import is_blocked_domain from blocking import get_domain_blocklist +from roles import set_roles_from_list from roles import get_actor_roles_list -from roles import set_role -from roles import clear_moderator_status -from roles import clear_editor_status -from roles import clear_devops_status -from roles import clear_counselor_status -from roles import clear_artist_status from blog import path_contains_blog_link from blog import html_blog_page_rss2 from blog import html_blog_page_rss3 @@ -6547,335 +6542,29 @@ class PubServer(BaseHTTPRequestHandler): si_tokens) # change moderators list - if fields.get('moderators'): - if path.startswith('/users/' + - admin_nickname + '/'): - moderators_file = \ - base_dir + \ - '/accounts/moderators.txt' - clear_moderator_status(base_dir) - if ',' in fields['moderators']: - # if the list was given as comma separated - mods = fields['moderators'].split(',') - try: - with open(moderators_file, 'w+', - encoding='utf-8') as modfile: - for mod_nick in mods: - mod_nick = mod_nick.strip() - mod_dir = base_dir + \ - '/accounts/' + mod_nick + \ - '@' + domain - if os.path.isdir(mod_dir): - modfile.write(mod_nick + - '\n') - except OSError: - print('EX: ' + - 'unable to write moderators ' + - moderators_file) - - for mod_nick in mods: - mod_nick = mod_nick.strip() - mod_dir = base_dir + \ - '/accounts/' + mod_nick + \ - '@' + domain - if os.path.isdir(mod_dir): - set_role(base_dir, - mod_nick, domain, - 'moderator') - else: - # nicknames on separate lines - mods = fields['moderators'].split('\n') - try: - with open(moderators_file, 'w+', - encoding='utf-8') as modfile: - for mod_nick in mods: - mod_nick = mod_nick.strip() - mod_dir = \ - base_dir + \ - '/accounts/' + mod_nick + \ - '@' + domain - if os.path.isdir(mod_dir): - modfile.write(mod_nick + - '\n') - except OSError: - print('EX: ' + - 'unable to write moderators 2 ' + - moderators_file) - - for mod_nick in mods: - mod_nick = mod_nick.strip() - mod_dir = \ - base_dir + \ - '/accounts/' + \ - mod_nick + '@' + \ - domain - if os.path.isdir(mod_dir): - set_role(base_dir, - mod_nick, domain, - 'moderator') + set_roles_from_list(base_dir, domain, admin_nickname, + 'moderators', 'moderator', fields, + path, 'moderators.txt') # change site editors list - if fields.get('editors'): - if path.startswith('/users/' + - admin_nickname + '/'): - editors_file = \ - base_dir + \ - '/accounts/editors.txt' - clear_editor_status(base_dir) - if ',' in fields['editors']: - # if the list was given as comma separated - eds = fields['editors'].split(',') - try: - with open(editors_file, 'w+', - encoding='utf-8') as edfil: - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - edfil.write(ed_nick + '\n') - except OSError as ex: - print('EX: unable to write editors ' + - editors_file + ' ' + str(ex)) - - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - set_role(base_dir, - ed_nick, domain, - 'editor') - else: - # nicknames on separate lines - eds = fields['editors'].split('\n') - try: - with open(editors_file, 'w+', - encoding='utf-8') as edfile: - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = \ - base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - edfile.write(ed_nick + - '\n') - except OSError as ex: - print('EX: unable to write editors ' + - editors_file + ' ' + str(ex)) - - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = \ - base_dir + \ - '/accounts/' + \ - ed_nick + '@' + \ - domain - if os.path.isdir(ed_dir): - set_role(base_dir, - ed_nick, domain, - 'editor') + set_roles_from_list(base_dir, domain, admin_nickname, + 'editors', 'editor', fields, + path, 'editors.txt') # change site devops list - if fields.get('devopslist'): - if path.startswith('/users/' + - admin_nickname + '/'): - devops_file = \ - base_dir + \ - '/accounts/devops.txt' - clear_devops_status(base_dir) - if ',' in fields['devopslist']: - # if the list was given as comma separated - dos = fields['devopslist'].split(',') - try: - with open(devops_file, 'w+', - encoding='utf-8') as dofil: - for do_nick in dos: - do_nick = do_nick.strip() - do_dir = base_dir + \ - '/accounts/' + do_nick + \ - '@' + domain - if os.path.isdir(do_dir): - dofil.write(do_nick + '\n') - except OSError as ex: - print('EX: unable to write devops ' + - devops_file + ' ' + str(ex)) - - for do_nick in dos: - do_nick = do_nick.strip() - do_dir = base_dir + \ - '/accounts/' + do_nick + \ - '@' + domain - if os.path.isdir(do_dir): - set_role(base_dir, - do_nick, domain, - 'devops') - else: - # nicknames on separate lines - dos = fields['devopslist'].split('\n') - try: - with open(devops_file, 'w+', - encoding='utf-8') as dofile: - for do_nick in dos: - do_nick = do_nick.strip() - do_dir = \ - base_dir + \ - '/accounts/' + do_nick + \ - '@' + domain - if os.path.isdir(do_dir): - dofile.write(do_nick + - '\n') - except OSError as ex: - print('EX: unable to write devops ' + - devops_file + ' ' + str(ex)) - - for do_nick in dos: - do_nick = do_nick.strip() - do_dir = \ - base_dir + \ - '/accounts/' + \ - do_nick + '@' + \ - domain - if os.path.isdir(do_dir): - set_role(base_dir, - do_nick, domain, - 'devops') + set_roles_from_list(base_dir, domain, admin_nickname, + 'devopslist', 'devops', fields, + path, 'devops.txt') # change site counselors list - if fields.get('counselors'): - if path.startswith('/users/' + - admin_nickname + '/'): - counselors_file = \ - base_dir + \ - '/accounts/counselors.txt' - clear_counselor_status(base_dir) - if ',' in fields['counselors']: - # if the list was given as comma separated - eds = fields['counselors'].split(',') - try: - with open(counselors_file, 'w+', - encoding='utf-8') as edfile: - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - edfile.write(ed_nick + - '\n') - except OSError as ex: - print('EX: ' + - 'unable to write counselors ' + - counselors_file + ' ' + str(ex)) - - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - set_role(base_dir, - ed_nick, domain, - 'counselor') - else: - # nicknames on separate lines - eds = fields['counselors'].split('\n') - try: - with open(counselors_file, 'w+', - encoding='utf-8') as edfile: - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = \ - base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - edfile.write(ed_nick + - '\n') - except OSError as ex: - print('EX: ' + - 'unable to write counselors ' + - counselors_file + ' ' + str(ex)) - - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = \ - base_dir + \ - '/accounts/' + \ - ed_nick + '@' + \ - domain - if os.path.isdir(ed_dir): - set_role(base_dir, - ed_nick, domain, - 'counselor') + set_roles_from_list(base_dir, domain, admin_nickname, + 'counselors', 'counselor', fields, + path, 'counselors.txt') # change site artists list - if fields.get('artists'): - if path.startswith('/users/' + - admin_nickname + '/'): - artists_file = \ - base_dir + \ - '/accounts/artists.txt' - clear_artist_status(base_dir) - if ',' in fields['artists']: - # if the list was given as comma separated - eds = fields['artists'].split(',') - try: - with open(artists_file, 'w+', - encoding='utf-8') as edfil: - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - edfil.write(ed_nick + '\n') - except OSError as ex: - print('EX: unable to write artists ' + - artists_file + ' ' + str(ex)) - - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - set_role(base_dir, - ed_nick, domain, - 'artist') - else: - # nicknames on separate lines - eds = fields['artists'].split('\n') - try: - with open(artists_file, 'w+', - encoding='utf-8') as edfil: - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = \ - base_dir + \ - '/accounts/' + ed_nick + \ - '@' + domain - if os.path.isdir(ed_dir): - edfil.write(ed_nick + - '\n') - except OSError as ex: - print('EX: unable to write artists ' + - artists_file + ' ' + str(ex)) - - for ed_nick in eds: - ed_nick = ed_nick.strip() - ed_dir = \ - base_dir + \ - '/accounts/' + \ - ed_nick + '@' + \ - domain - if os.path.isdir(ed_dir): - set_role(base_dir, - ed_nick, domain, - 'artist') + set_roles_from_list(base_dir, domain, admin_nickname, + 'artists', 'artist', fields, + path, 'artists.txt') # remove scheduled posts if fields.get('removeScheduledPosts'): diff --git a/person.py b/person.py index 733ff24b6..7285d9c6e 100644 --- a/person.py +++ b/person.py @@ -35,7 +35,7 @@ from posts import create_moderation from auth import store_basic_credentials from auth import remove_password from roles import set_role -from roles import set_rolesFromList +from roles import actor_roles_from_list from roles import get_actor_roles_list from media import process_meta_data from utils import safe_system_string @@ -860,7 +860,7 @@ def person_upgrade_actor(base_dir: str, person_json: {}, admin_name = get_config_param(base_dir, 'admin') if person_json['id'].endswith('/users/' + admin_name): roles_list = ["admin", "moderator", "editor"] - set_rolesFromList(person_json, roles_list) + actor_roles_from_list(person_json, roles_list) update_actor = True # remove the old roles format diff --git a/roles.py b/roles.py index 58ff40647..69f396bbb 100644 --- a/roles.py +++ b/roles.py @@ -38,50 +38,10 @@ def _clear_role_status(base_dir: str, role: str) -> None: roles_list = get_actor_roles_list(actor_json) if role in roles_list: roles_list.remove(role) - set_rolesFromList(actor_json, roles_list) + actor_roles_from_list(actor_json, roles_list) save_json(actor_json, filename) -def clear_editor_status(base_dir: str) -> None: - """Removes editor status from all accounts - This could be slow if there are many users, but only happens - rarely when editors are appointed or removed - """ - _clear_role_status(base_dir, 'editor') - - -def clear_devops_status(base_dir: str) -> None: - """Removes devops status from all accounts - This could be slow if there are many users, but only happens - rarely when devops are appointed or removed - """ - _clear_role_status(base_dir, 'devops') - - -def clear_counselor_status(base_dir: str) -> None: - """Removes counselor status from all accounts - This could be slow if there are many users, but only happens - rarely when counselors are appointed or removed - """ - _clear_role_status(base_dir, 'editor') - - -def clear_artist_status(base_dir: str) -> None: - """Removes artist status from all accounts - This could be slow if there are many users, but only happens - rarely when artists are appointed or removed - """ - _clear_role_status(base_dir, 'artist') - - -def clear_moderator_status(base_dir: 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 - """ - _clear_role_status(base_dir, 'moderator') - - def _add_role(base_dir: str, nickname: str, domain: str, role_filename: str) -> None: """Adds a role nickname to the file. @@ -212,7 +172,7 @@ def _set_actor_role(actor_json: {}, role_name: str) -> bool: return True -def set_rolesFromList(actor_json: {}, roles_list: []) -> None: +def actor_roles_from_list(actor_json: {}, roles_list: []) -> None: """Sets roles from a list """ # clear Roles from the occupation list @@ -285,7 +245,7 @@ def set_role(base_dir: str, nickname: str, domain: str, if role not in roles_list: roles_list.append(role) roles_list.sort() - set_rolesFromList(actor_json, roles_list) + actor_roles_from_list(actor_json, roles_list) actor_changed = True else: # remove the role @@ -293,7 +253,7 @@ def set_role(base_dir: str, nickname: str, domain: str, _remove_role(base_dir, nickname, role_files[role]) if role in roles_list: roles_list.remove(role) - set_rolesFromList(actor_json, roles_list) + actor_roles_from_list(actor_json, roles_list) actor_changed = True if actor_changed: save_json(actor_json, actor_filename) @@ -334,3 +294,64 @@ def is_devops(base_dir: str, nickname: str) -> bool: if devops == nickname: return True return False + + +def set_roles_from_list(base_dir: str, domain: str, admin_nickname: str, + list_name: str, role_name: str, fields: [], path: str, + list_filename: str) -> None: + """Sets the roles from a list returned from the edit profile screen under + role assignments + """ + # check for admin user + if not path.startswith('/users/' + admin_nickname + '/'): + return + roles_filename = base_dir + '/accounts/' + list_filename + if not fields.get(list_name): + if os.path.isfile(roles_filename): + _clear_role_status(base_dir, role_name) + try: + os.remove(roles_filename) + except OSError: + print('EX: failed to remove roles file ' + roles_filename) + return + _clear_role_status(base_dir, role_name) + if ',' in fields[list_name]: + # if the list was given as comma separated + roles_list = fields[list_name].split(',') + try: + with open(roles_filename, 'w+', + encoding='utf-8') as rolesfile: + for roles_nick in roles_list: + roles_nick = roles_nick.strip() + roles_dir = acct_dir(base_dir, roles_nick, domain) + if os.path.isdir(roles_dir): + rolesfile.write(roles_nick + '\n') + except OSError as ex: + print('EX: unable to write ' + list_name + ' ' + + roles_filename + ' ' + str(ex)) + + for roles_nick in roles_list: + roles_nick = roles_nick.strip() + roles_dir = acct_dir(base_dir, roles_nick, domain) + if os.path.isdir(roles_dir): + set_role(base_dir, roles_nick, domain, role_name) + else: + # nicknames on separate lines + roles_list = fields[list_name].split('\n') + try: + with open(roles_filename, 'w+', + encoding='utf-8') as rolesfile: + for roles_nick in roles_list: + roles_nick = roles_nick.strip() + roles_dir = acct_dir(base_dir, roles_nick, domain) + if os.path.isdir(roles_dir): + rolesfile.write(roles_nick + '\n') + except OSError as ex: + print('EX: unable to write ' + list_name + ' ' + + roles_filename + ' ' + str(ex)) + + for roles_nick in roles_list: + roles_nick = roles_nick.strip() + roles_dir = acct_dir(base_dir, roles_nick, domain) + if os.path.isdir(roles_dir): + set_role(base_dir, roles_nick, domain, role_name) diff --git a/tests.py b/tests.py index 3dcb75603..8b9ba7068 100644 --- a/tests.py +++ b/tests.py @@ -107,7 +107,7 @@ from skills import set_skill_level from skills import actor_skill_value from skills import set_skills_from_dict from skills import actor_has_skill -from roles import set_rolesFromList +from roles import actor_roles_from_list from roles import set_role from roles import actor_has_role from auth import constant_time_string_check @@ -6420,7 +6420,7 @@ def _test_roles() -> None: ] } test_roles_list = ["admin", "moderator"] - set_rolesFromList(actor_json, test_roles_list) + actor_roles_from_list(actor_json, test_roles_list) assert actor_has_role(actor_json, "admin") assert actor_has_role(actor_json, "moderator") assert not actor_has_role(actor_json, "editor") diff --git a/webapp_profile.py b/webapp_profile.py index f88a231f9..b993cd3c8 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1423,7 +1423,7 @@ def _html_edit_profile_instance(base_dir: str, translate: {}, 'instanceDescriptionShort', instance_description_short) instance_str += '
\n' instance_str += \ - edit_text_area(translate['Instance Description'], + edit_text_area(translate['Instance Description'], None, 'instanceDescription', instance_description, 200, '', True) instance_str += \ @@ -1493,37 +1493,30 @@ def _html_edit_profile_instance(base_dir: str, translate: {}, instance_str += end_edit_section() # Role assignments section + role_assign_str = \ + begin_edit_section(translate['Role Assignment']) + \ + '