def main(client_id, user_arguments_dict): """Main function used by front end""" (configuration, logger, output_objects, op_name) = \ initialize_main_variables(client_id, op_header=False) status = returnvalues.OK defaults = signature()[1] (validate_status, accepted) = validate_input_and_cert( user_arguments_dict, defaults, output_objects, client_id, configuration, allow_rejects=False, ) if not validate_status: return (accepted, returnvalues.CLIENT_ERROR) (stat, vgrid_list) = vgrid_list_vgrids(configuration) if not stat: output_objects.append({'object_type': 'error_text', 'text' : 'Error getting list of %s.' % \ configuration.site_vgrid_label}) # Check if user wants advanced VGrid component links settings = load_settings(client_id, configuration) collaboration_links = settings.get('SITE_COLLABORATION_LINKS', 'default') if not collaboration_links in configuration.site_collaboration_links or \ collaboration_links == 'default': active_vgrid_links = configuration.site_default_vgrid_links elif collaboration_links == 'advanced': active_vgrid_links = configuration.site_advanced_vgrid_links # Iterate through vgrids and print details for each member_list = {'object_type': 'vgrid_list', 'vgrids': [], 'components': active_vgrid_links} if 'monitor' in active_vgrid_links: vgrid_list = [all_vgrids] + vgrid_list else: vgrid_list.remove(default_vgrid) for vgrid_name in vgrid_list: vgrid_obj = {'object_type': 'vgrid', 'name': vgrid_name} if vgrid_name == default_vgrid: # Everybody is member and allowed to see statistics, Noone # can own it or leave it. Do not add any page links. vgrid_obj['privatemonitorlink'] = {'object_type': 'link', 'destination': 'showvgridmonitor.py?vgrid_name=%s'\ % vgrid_name, 'class': 'monitorlink', 'title': 'View %s monitor' % vgrid_name, 'text': 'View'} vgrid_obj['memberlink'] = {'object_type': 'link', 'destination':'', 'class': 'infolink', 'title': 'Every user is member of the %s %s' \ % (default_vgrid, configuration.site_vgrid_label), 'text': ''} vgrid_obj['administratelink'] = {'object_type': 'link', 'destination':'', 'class': 'infolink', 'title': 'Nobody owns the %s %s' \ % (default_vgrid, configuration.site_vgrid_label), 'text': ''} member_list['vgrids'].append(vgrid_obj) continue elif vgrid_name == all_vgrids: # Only show global monitor link for all_vgrids, Noone # can own it or leave it. Do not add any page links. vgrid_obj['privatemonitorlink'] = {'object_type': 'link', 'destination': 'showvgridmonitor.py?vgrid_name=%s'\ % vgrid_name, 'class': 'monitorlink', 'title': 'View global monitor', 'text': 'View'} vgrid_obj['memberlink'] = {'object_type': 'link', 'destination':'', 'class': 'infolink', 'title': 'Not a real %s - only for global monitor' % \ configuration.site_vgrid_label, 'text': ''} vgrid_obj['administratelink'] = {'object_type': 'link', 'destination':'', 'class': 'infolink', 'title': 'Not a real %s - only for global monitor' % \ configuration.site_vgrid_label, 'text': ''} member_list['vgrids'].append(vgrid_obj) continue # links for everyone: public pages and membership request vgrid_obj['publicscmlink'] = {'object_type': 'link', 'destination': '%s/vgridpublicscm/%s'\ % (configuration.migserver_http_url, vgrid_name), 'class': 'scmlink public', 'title': 'Open %s public SCM' % \ vgrid_name, 'text': 'Open'} vgrid_obj['publictrackerlink'] = {'object_type': 'link', 'destination': '%s/vgridpublictracker/%s'\ % (configuration.migserver_http_url, vgrid_name), 'class': 'trackerlink public', 'title': 'Open %s public tracker' % \ vgrid_name, 'text': 'Open'} vgrid_obj['enterpubliclink'] = {'object_type': 'link', 'destination': '%s/vgrid/%s/path/index.html' % \ (configuration.migserver_http_url, vgrid_name), 'class': 'urllink member', 'title': 'View public %s web page' % \ vgrid_name, 'text': 'View'} # link to become member: overwritten later for members js_name = 'reqvgridmember%s' % hexlify(vgrid_name) helper = html_post_helper(js_name, 'sendrequestaction.py', {'vgrid_name': vgrid_name, 'request_type': 'vgridmember', 'request_text': ''}) output_objects.append({'object_type': 'html_form', 'text': helper}) vgrid_obj['memberlink'] = \ {'object_type': 'link', 'destination': "javascript: confirmDialog(%s, '%s', '%s');"\ % (js_name, "Request membership of " + \ vgrid_name + ":<br/>" + \ "\nPlease write a message to the owners (field below).", 'request_text'), 'class': 'addlink', 'title': 'Request membership of %s' % \ vgrid_name, 'text': ''} # link to become owner: overwritten later for owners js_name = 'reqvgridowner%s' % hexlify(vgrid_name) helper = html_post_helper(js_name, 'sendrequestaction.py', {'vgrid_name': vgrid_name, 'request_type': 'vgridowner', 'request_text': ''}) output_objects.append({'object_type': 'html_form', 'text': helper}) vgrid_obj['administratelink'] = \ {'object_type': 'link', 'destination': "javascript: confirmDialog(%s, '%s', '%s');"\ % (js_name, "Request ownership of " + \ vgrid_name + ":<br/>" + \ "\nPlease write a message to the owners (field below).", 'request_text'), 'class': 'addadminlink', 'title': 'Request ownership of %s' % \ vgrid_name, 'text': ''} # members/owners are allowed to view private pages and monitor if vgrid_is_owner_or_member(vgrid_name, client_id, configuration): vgrid_obj['enterprivatelink'] = {'object_type': 'link', 'destination': '../vgrid/%s/path/index.html' % \ vgrid_name, 'class': 'urllink owner', 'title': 'View private %s web page' % \ vgrid_name, 'text': 'View'} vgrid_obj['sharedfolderlink'] = {'object_type': 'link', 'destination': 'fileman.py?path=%s/' % vgrid_name, 'class': 'sharedfolderlink', 'title': 'Open shared %s folder' \ % vgrid_name, 'text': 'Open'} vgrid_obj['memberscmlink'] = {'object_type': 'link', 'destination': '/vgridscm/%s' % \ vgrid_name, 'class': 'scmlink member', 'title': 'View %s members scm' % \ vgrid_name, 'text': 'View'} vgrid_obj['membertrackerlink'] = {'object_type': 'link', 'destination': '/vgridtracker/%s' % \ vgrid_name, 'class': 'trackerlink member', 'title': 'View %s members tracker' % \ vgrid_name, 'text': 'View'} vgrid_obj['privateforumlink'] = {'object_type': 'link', 'destination': 'vgridforum.py?vgrid_name=%s' % \ vgrid_name, 'class': 'forumlink', 'title': 'Open %s private forum' \ % vgrid_name, 'text': 'Open'} vgrid_obj['privateworkflowslink'] = {'object_type': 'link', 'destination': 'vgridworkflows.py?vgrid_name=%s' % \ vgrid_name, 'class': 'workflowslink', 'title': 'Open %s private workflows' \ % vgrid_name, 'text': 'Open'} vgrid_obj['privatemonitorlink'] = {'object_type': 'link', 'destination': 'showvgridmonitor.py?vgrid_name=%s'\ % vgrid_name, 'class': 'monitorlink', 'title': 'View %s monitor' % \ vgrid_name, 'text': 'View'} # to leave this VGrid (remove ourselves). Note that we are # going to overwrite the link later for owners. js_name = 'rmvgridmember%s' % hexlify(vgrid_name) helper = html_post_helper(js_name, 'rmvgridmember.py', {'vgrid_name': vgrid_name, 'cert_id': client_id}) output_objects.append({'object_type': 'html_form', 'text': helper}) vgrid_obj['memberlink'] = \ {'object_type': 'link', 'destination': "javascript: confirmDialog(%s, '%s');"\ % (js_name, "Really leave " + vgrid_name + "?"), 'class': 'removelink', 'title': 'Leave %s members' % vgrid_name, 'text': ''} # owners are allowed to edit pages and administrate if vgrid_is_owner(vgrid_name, client_id, configuration): vgrid_obj['ownerscmlink'] = {'object_type': 'link', 'destination': '/vgridownerscm/%s' % \ vgrid_name, 'class': 'scmlink owner', 'title': 'View %s owners scm' % \ vgrid_name, 'text': 'View'} vgrid_obj['ownertrackerlink'] = {'object_type': 'link', 'destination': '/vgridownertracker/%s' % \ vgrid_name, 'class': 'trackerlink owner', 'title': 'View %s owners tracker' % \ vgrid_name, 'text': 'View'} # correct the link to leave the VGrid js_name = 'rmvgridowner%s' % hexlify(vgrid_name) helper = html_post_helper(js_name, 'rmvgridowner.py', {'vgrid_name': vgrid_name, 'cert_id': client_id}) output_objects.append({'object_type': 'html_form', 'text': helper}) vgrid_obj['memberlink']['destination'] = \ "javascript: confirmDialog(%s,'%s');" % \ (js_name, "Really leave " + vgrid_name + "?") vgrid_obj['memberlink']['class'] = 'removeadminlink' vgrid_obj['memberlink']['title'] = 'Leave %s owners' % vgrid_name # add more links: administrate and edit pages vgrid_obj['administratelink'] = {'object_type': 'link', 'destination': 'adminvgrid.py?vgrid_name=%s'\ % vgrid_name, 'class': 'adminlink', 'title': 'Administrate %s' % vgrid_name, 'text': ''} vgrid_obj['editprivatelink'] = {'object_type': 'link', 'destination': 'fileman.py?path=private_base/%s/'\ % vgrid_name, 'class': 'editlink owner', 'title': 'Edit private %s web page' % vgrid_name, 'text': 'Edit'} vgrid_obj['editpubliclink'] = {'object_type': 'link', 'destination': 'fileman.py?path=public_base/%s/'\ % vgrid_name, 'class': 'editlink member', 'title': 'Edit public %s web page' % vgrid_name, 'text': 'Edit'} member_list['vgrids'].append(vgrid_obj) title_entry = find_entry(output_objects, 'title') label = "%ss" % configuration.site_vgrid_label # Append VGrid note if custom if label != 'VGrid': label += ' (i.e. VGrids)' title_entry['text'] = '%s administration' % label # jquery support for tablesorter and confirmation on "leave": title_entry['style'] = themed_styles(configuration) title_entry['javascript'] = ''' <script type="text/javascript" src="/images/js/jquery.js"></script> <script type="text/javascript" src="/images/js/jquery.tablesorter.js"></script> <script type="text/javascript" src="/images/js/jquery.tablesorter.pager.js"></script> <script type="text/javascript" src="/images/js/jquery.tablesorter.widgets.js"></script> <script type="text/javascript" src="/images/js/jquery-ui.js"></script> <script type="text/javascript" src="/images/js/jquery.confirm.js"></script> <script type="text/javascript" > $(document).ready(function() { // init confirmation dialog $( "#confirm_dialog" ).dialog( // see http://jqueryui.com/docs/dialog/ for options { autoOpen: false, modal: true, closeOnEscape: true, width: 500, buttons: { "Cancel": function() { $( "#" + name ).dialog("close"); } } }); // table initially sorted by col. 1 (admin), then 2 (member), then 0 (name) var sortOrder = [[1,1],[2,1],[0,0]]; // use image path for sorting if there is any inside var imgTitle = function(contents) { var key = $(contents).find("a").attr("class"); if (key == null) { key = $(contents).html(); } return key; } $("#vgridtable").tablesorter({widgets: ["zebra", "saveSort"], sortList:sortOrder, textExtraction: imgTitle }) .tablesorterPager({ container: $("#pager"), size: %s }); } ); </script> ''' % default_pager_entries output_objects.append({'object_type': 'html_form', 'text':''' <div id="confirm_dialog" title="Confirm" style="background:#fff;"> <div id="confirm_text"><!-- filled by js --></div> <textarea cols="40" rows="4" id="confirm_input" style="display:none;"></textarea> </div> ''' }) output_objects.append({'object_type': 'header', 'text': label}) output_objects.append({'object_type': 'text', 'text' : ''' %ss share files, a number of collaboration tools and resources. Members can access web pages, files, tools and resources. Owners can additionally edit pages, as well as add and remove members or resources. ''' % configuration.site_vgrid_label }) if configuration.site_vgrid_label != 'VGrid': output_objects.append({'object_type': 'text', 'text' : """Please note that for historical reasons %ss are also referred to as VGrids in some contexts.""" % \ configuration.site_vgrid_label}) output_objects.append({'object_type': 'sectionheader', 'text' : '%ss managed on this server' % \ configuration.site_vgrid_label}) output_objects.append({'object_type': 'table_pager', 'entry_name': '%ss' % \ configuration.site_vgrid_label, 'default_entries': default_pager_entries}) output_objects.append(member_list) user_map = get_full_user_map(configuration) user_dict = user_map.get(client_id, None) # Optional limitation of create vgrid permission if user_dict and vgrid_create_allowed(configuration, user_dict): output_objects.append({'object_type': 'sectionheader', 'text' : 'Additional %ss' % \ configuration.site_vgrid_label}) output_objects.append( {'object_type': 'text', 'text': '''Please enter a name for the new %(label)s to add, using slashes to specify nesting. I.e. if you own a %(label)s called ABC, you can create a sub-%(label)s called DEF by entering ABC/DEF below.''' % \ {'label': configuration.site_vgrid_label}}) output_objects.append({'object_type': 'html_form', 'text': '''<form method="post" action="createvgrid.py"> <input type="text" size=40 name="vgrid_name" /> <input type="hidden" name="output_format" value="html" /> <input type="submit" value="Create %s" /> </form> ''' % configuration.site_vgrid_label}) output_objects.append({'object_type': 'sectionheader', 'text' : 'Request Access to %ss' % \ configuration.site_vgrid_label}) output_objects.append( {'object_type': 'text', 'text': '''You can request access to %(label)ss using the individual plus-icons above directly or by entering the name of the %(label)s to request access to, what kind of access and an optional message to the admins below''' % \ {'label': configuration.site_vgrid_label}}) output_objects.append({'object_type': 'html_form', 'text': '''<form method="post" action="sendrequestaction.py"> <input type="text" size=40 name="vgrid_name" /> <select name="request_type"> <option value="vgridmember">membership</option> <option value="vgridowner">ownership</option> </select> <input type="text" size=50 name="request_text" /> <input type="hidden" name="output_format" value="html" /> <input type="submit" value="Request %s access" /> </form> ''' % configuration.site_vgrid_label}) return (output_objects, status)
def main(client_id, user_arguments_dict): """Main function used by front end""" (configuration, logger, output_objects, op_name) = \ initialize_main_variables(client_id, op_header=False) client_dir = client_id_dir(client_id) defaults = signature()[1] (validate_status, accepted) = validate_input_and_cert( user_arguments_dict, defaults, output_objects, client_id, configuration, allow_rejects=False, ) if not validate_status: return (accepted, returnvalues.CLIENT_ERROR) if not correct_handler('POST'): output_objects.append( {'object_type': 'error_text', 'text' : 'Only accepting POST requests to prevent unintended updates'}) return (output_objects, returnvalues.CLIENT_ERROR) vgrid_name = accepted['vgrid_name'][-1].strip() title_entry = find_entry(output_objects, 'title') title_entry['text'] = 'Create %s' % configuration.site_vgrid_label output_objects.append({'object_type': 'header', 'text': 'Create %s' % \ configuration.site_vgrid_label}) # No owner check here so we need to specifically check for illegal # directory access reserved_names = (default_vgrid, any_vgrid, all_vgrids) if vgrid_name in reserved_names or \ not valid_dir_input(configuration.vgrid_home, vgrid_name): output_objects.append({'object_type': 'error_text', 'text' : 'Illegal vgrid_name: %s' % vgrid_name}) logger.warning("""createvgrid possible illegal directory access attempt by '%s': vgrid_name '%s'""" % (client_id, vgrid_name)) return (output_objects, returnvalues.CLIENT_ERROR) user_map = get_full_user_map(configuration) user_dict = user_map.get(client_id, None) # Optional limitation of create vgrid permission if not user_dict or \ not vgrid_create_allowed(configuration, user_dict): logger.warning("user %s is not allowed to create %ss!" % \ (client_id, configuration.site_vgrid_label)) output_objects.append( {'object_type': 'error_text', 'text' : 'Only privileged users can create %ss' % \ configuration.site_vgrid_label}) return (output_objects, returnvalues.CLIENT_ERROR) # Please note that base_dir must end in slash to avoid access to other # user dirs when own name is a prefix of another user name base_dir = os.path.abspath(os.path.join(configuration.vgrid_home, vgrid_name)) + os.sep public_base_dir = \ os.path.abspath(os.path.join(configuration.vgrid_public_base, vgrid_name)) + os.sep public_scm_dir = \ os.path.abspath(os.path.join(configuration.vgrid_public_base, vgrid_name, '.vgridscm')) + os.sep public_tracker_dir = \ os.path.abspath(os.path.join(configuration.vgrid_public_base, vgrid_name, '.vgridtracker')) + os.sep private_base_dir = \ os.path.abspath(os.path.join(configuration.vgrid_private_base, vgrid_name)) + os.sep private_scm_dir = \ os.path.abspath(os.path.join(configuration.vgrid_private_base, vgrid_name, '.vgridscm')) + os.sep private_tracker_dir = \ os.path.abspath(os.path.join(configuration.vgrid_private_base, vgrid_name, '.vgridtracker')) + os.sep private_forum_dir = \ os.path.abspath(os.path.join(configuration.vgrid_private_base, vgrid_name, '.vgridforum')) + os.sep vgrid_files_dir = \ os.path.abspath(os.path.join(configuration.vgrid_files_home, vgrid_name)) + os.sep vgrid_scm_dir = \ os.path.abspath(os.path.join(configuration.vgrid_files_home, vgrid_name, '.vgridscm')) + os.sep vgrid_tracker_dir = \ os.path.abspath(os.path.join(configuration.vgrid_files_home, vgrid_name, '.vgridtracker')) + os.sep # does vgrid exist? if os.path.isdir(base_dir): output_objects.append( {'object_type': 'error_text', 'text' : '%s %s cannot be created because it already exists!' % (configuration.site_vgrid_label, vgrid_name)}) return (output_objects, returnvalues.CLIENT_ERROR) # verify that client is owner of imada or imada/topology if trying to # create imada/topology/test vgrid_name_list = vgrid_name.split('/') vgrid_name_list_length = len(vgrid_name_list) if vgrid_name_list_length <= 0: output_objects.append({'object_type': 'error_text', 'text' : 'vgrid_name not specified?'}) return (output_objects, returnvalues.SYSTEM_ERROR) elif vgrid_name_list_length == 1: # anyone can create base vgrid new_base_vgrid = True else: new_base_vgrid = False vgrid_name_without_last_fragment = \ '/'.join(vgrid_name_list[0:vgrid_name_list_length - 1]) parent_base = os.path.dirname(base_dir.rstrip(os.sep)) if not os.path.isdir(parent_base): output_objects.append( {'object_type': 'error_text', 'text' : 'Parent %s %s does not exist!' % \ (configuration.site_vgrid_label, vgrid_name_without_last_fragment) }) return (output_objects, returnvalues.CLIENT_ERROR) if not vgrid_is_owner(vgrid_name_without_last_fragment, client_id, configuration): output_objects.append( {'object_type': 'error_text', 'text' : 'You must own a parent %s to create a sub vgrid' % \ configuration.site_vgrid_label }) return (output_objects, returnvalues.CLIENT_ERROR) # make sure all dirs can be created (that a file or directory with the same # name do not exist prior to the vgrid creation) try_again_string = \ """%s cannot be created, a file or directory exists with the same name, please try again with a new name!""" % configuration.site_vgrid_label if os.path.exists(public_base_dir): output_objects.append({'object_type': 'error_text', 'text' : try_again_string}) return (output_objects, returnvalues.CLIENT_ERROR) if os.path.exists(private_base_dir): output_objects.append({'object_type': 'error_text', 'text' : try_again_string}) return (output_objects, returnvalues.CLIENT_ERROR) if os.path.exists(vgrid_files_dir): output_objects.append({'object_type': 'error_text', 'text' : try_again_string}) return (output_objects, returnvalues.CLIENT_ERROR) # create directory to store vgrid files try: os.mkdir(base_dir) except Exception, exc: output_objects.append( {'object_type': 'error_text', 'text' : """Could not create %(_label)s directory, remember to create parent %(_label)s before creating a sub-%(_label)s.""" % \ {'_label': configuration.site_vgrid_label} }) return (output_objects, returnvalues.CLIENT_ERROR)
def main(client_id, user_arguments_dict): """Main function used by front end""" (configuration, logger, output_objects, op_name) = \ initialize_main_variables(client_id, op_header=False) status = returnvalues.OK defaults = signature()[1] title_entry = find_entry(output_objects, 'title') label = "%s" % configuration.site_vgrid_label title_entry['text'] = "%s Management" % label (validate_status, accepted) = validate_input_and_cert( user_arguments_dict, defaults, output_objects, client_id, configuration, allow_rejects=False, ) if not validate_status: return (accepted, returnvalues.CLIENT_ERROR) operation = accepted['operation'][-1] caching = (accepted['caching'][-1].lower() in ('true', 'yes')) if not operation in allowed_operations: output_objects.append({ 'object_type': 'error_text', 'text': '''Operation must be one of %s.''' % ', '.join(allowed_operations) }) return (output_objects, returnvalues.OK) logger.info("%s %s begin for %s" % (op_name, operation, client_id)) vgrid_items, active_vgrid_links = [], [] member_list = { 'object_type': 'vgrid_list', 'vgrids': vgrid_items, 'components': active_vgrid_links } # Check if user wants advanced VGrid component links user_settings = title_entry.get('user_settings', {}) collaboration_links = user_settings.get('SITE_COLLABORATION_LINKS', 'default') if not collaboration_links in configuration.site_collaboration_links or \ collaboration_links == 'default': active_vgrid_links += configuration.site_default_vgrid_links elif collaboration_links == 'advanced': active_vgrid_links += configuration.site_advanced_vgrid_links # General fill helpers including CSRF fields form_method = 'post' csrf_limit = get_csrf_limit(configuration) fill_helpers = { 'vgrid_label': label, 'form_method': form_method, 'csrf_field': csrf_field, 'csrf_limit': csrf_limit } if operation in show_operations: # jquery support for tablesorter and confirmation on request and leave # table initially sorted by col. 2 (admin), then 3 (member), then 0 (name) # NOTE: We distinguish between caching on page load and forced refresh refresh_helper = 'ajax_vgridman("%s", %s, %%s)' refresh_call = refresh_helper % (label, active_vgrid_links) table_spec = { 'table_id': 'vgridtable', 'sort_order': '[[2,1],[3,1],[0,0]]', 'refresh_call': refresh_call % 'false' } (add_import, add_init, add_ready) = man_base_js(configuration, [table_spec]) if operation == "show": add_ready += '%s;' % (refresh_call % 'true') title_entry['script']['advanced'] += add_import title_entry['script']['init'] += add_init title_entry['script']['ready'] += add_ready output_objects.append({ 'object_type': 'html_form', 'text': man_base_html(configuration) }) # Append VGrid alias note if custom if label != 'VGrid': long_label = '%ss (i.e. VGrids)' % label else: long_label = "%ss" % label output_objects.append({ 'object_type': 'header', 'text': "%s" % long_label }) output_objects.append({ 'object_type': 'text', 'text': '''%ss share files, a number of collaboration tools and resources. Members can access web pages, files, tools and resources. Owners can additionally edit pages, as well as add and remove members or resources.''' % label }) if label != 'VGrid': output_objects.append({ 'object_type': 'text', 'text': """Please note that for historical reasons %ss are also referred to as VGrids in some contexts.""" % label }) output_objects.append({ 'object_type': 'sectionheader', 'text': '%ss managed on this server' % label }) # Helper forms for requests and removes for post_type in ["vgridowner", "vgridmember"]: target_op = 'sendrequestaction' csrf_token = make_csrf_token(configuration, form_method, target_op, client_id, csrf_limit) helper = html_post_helper( 'req%s' % post_type, '%s.py' % target_op, { 'vgrid_name': '__DYNAMIC__', 'request_type': post_type, 'request_text': '', csrf_field: csrf_token }) output_objects.append({'object_type': 'html_form', 'text': helper}) for post_type in ["vgridowner", "vgridmember"]: target_op = 'rm%s' % post_type csrf_token = make_csrf_token(configuration, form_method, target_op, client_id, csrf_limit) helper = html_post_helper( target_op, '%s.py' % target_op, { 'vgrid_name': '__DYNAMIC__', 'cert_id': client_id, csrf_field: csrf_token }) output_objects.append({'object_type': 'html_form', 'text': helper}) output_objects.append({ 'object_type': 'table_pager', 'entry_name': '%ss' % label, 'default_entries': default_pager_entries }) if operation in list_operations: logger.info("get vgrid map with caching %s" % caching) vgrid_map = get_vgrid_map(configuration, caching=caching) member_list['pending_updates'] = False if caching: modified_vgrids, _ = check_vgrids_modified(configuration) if modified_vgrids: logger.info("pending cache updates: %s" % modified_vgrids) member_list['pending_updates'] = True else: logger.info("no pending cache updates") vgrid_list = vgrid_map[VGRIDS].keys() # Iterate through vgrids and print details for each if 'monitor' in active_vgrid_links: vgrid_list = [all_vgrids] + vgrid_list else: vgrid_list.remove(default_vgrid) # User vgrid_list here to include default and all mangling above for vgrid_name in vgrid_list: vgrid_dict = vgrid_map[VGRIDS].get(vgrid_name, {}) settings_dict = dict(vgrid_dict.get(SETTINGS, [])) # Mark and show hidden vgrids if owner or member and hide otherwise view_icon, hidden_status = "infolink", " " if settings_dict.get('hidden', False): if client_id in vgrid_dict[OWNERS] + vgrid_dict[MEMBERS]: logger.debug("show hidden vgrid %s for participant" % vgrid_name) view_icon, hidden_status = "shadeinfolink", " hidden " else: logger.debug("skip hidden vgrid %s" % vgrid_name) continue vgrid_obj = {'object_type': 'vgrid', 'name': vgrid_name} if vgrid_name == default_vgrid: # Everybody is member and allowed to see statistics, Noone # can own it or leave it. Do not add any page links. vgrid_obj['privatemonitorlink'] = { 'object_type': 'link', 'destination': 'showvgridmonitor.py?vgrid_name=%s' % vgrid_name, 'class': 'monitorlink iconspace', 'title': 'View %s monitor' % vgrid_name, 'text': 'View' } vgrid_obj['memberlink'] = { 'object_type': 'link', 'destination': '', 'class': 'infolink iconspace', 'title': 'Every user is member of the %s %s' % (default_vgrid, label), 'text': '' } vgrid_obj['administratelink'] = { 'object_type': 'link', 'destination': '', 'class': 'infolink iconspace', 'title': 'Nobody owns the %s %s' % (default_vgrid, label), 'text': '' } vgrid_obj['viewvgridlink'] = { 'object_type': 'link', 'destination': 'viewvgrid.py?vgrid_name=%s' % vgrid_name, 'class': 'infolink iconspace', 'title': 'View details for the %s %s' % (default_vgrid, label), 'text': '' } vgrid_items.append(vgrid_obj) continue elif vgrid_name == all_vgrids: # Only show global monitor link for all_vgrids, Noone # can own it or leave it. Do not add any page links. vgrid_obj['privatemonitorlink'] = { 'object_type': 'link', 'destination': 'showvgridmonitor.py?vgrid_name=%s' % vgrid_name, 'class': 'monitorlink iconspace', 'title': 'View global monitor', 'text': 'View' } vgrid_obj['memberlink'] = { 'object_type': 'link', 'destination': '', 'class': 'infolink iconspace', 'title': 'Not a real %s - only for global monitor' % label, 'text': '' } vgrid_obj['administratelink'] = { 'object_type': 'link', 'destination': '', 'class': '', 'title': '', 'text': '' } vgrid_obj['viewvgridlink'] = { 'object_type': 'link', 'destination': '', 'class': 'infolink iconspace', 'title': 'Not a real %s - only for global monitor' % label, 'text': '' } vgrid_items.append(vgrid_obj) continue # links for everyone: public pages and membership request vgrid_obj['publicscmlink'] = { 'object_type': 'link', 'destination': '%s/vgridpublicscm/%s' % (configuration.migserver_http_url, vgrid_name), 'class': 'scmlink public iconspace', 'title': 'Open %s public SCM' % vgrid_name, 'text': 'Open' } vgrid_obj['publictrackerlink'] = { 'object_type': 'link', 'destination': '%s/vgridpublictracker/%s' % (configuration.migserver_http_url, vgrid_name), 'class': 'trackerlink public iconspace', 'title': 'Open %s public tracker' % vgrid_name, 'text': 'Open' } vgrid_obj['enterpubliclink'] = { 'object_type': 'link', 'destination': '%s/vgrid/%s/path/index.html' % (configuration.migserver_http_url, vgrid_name), 'class': 'urllink member iconspace', 'title': 'View public %s web page' % vgrid_name, 'text': 'View' } # Link to show vgrid details vgrid_obj['viewvgridlink'] = \ {'object_type': 'link', 'destination': 'viewvgrid.py?vgrid_name=%s' % vgrid_name, 'class': '%s iconspace' % view_icon, 'title': 'View details for the %s%s%s' % (vgrid_name, hidden_status, label), 'text': ''} # link to become member: overwritten later for members vgrid_obj['memberlink'] = { 'object_type': 'link', 'destination': "javascript: confirmDialog(%s, '%s', '%s', %s);" % ('reqvgridmember', "Request membership of " + vgrid_name + ":<br/>\nPlease write a message to the owners (field below).", 'request_text', "{vgrid_name: '%s'}" % vgrid_name), 'class': 'addlink iconspace', 'title': 'Request membership of %s' % vgrid_name, 'text': '' } # link to become owner: overwritten later for owners vgrid_obj['administratelink'] = { 'object_type': 'link', 'destination': "javascript: confirmDialog(%s, '%s', '%s', %s);" % ('reqvgridowner', "Request ownership of " + vgrid_name + ":<br/>\nPlease write a message to the owners (field below).", 'request_text', "{vgrid_name: '%s'}" % vgrid_name), 'class': 'addadminlink iconspace', 'title': 'Request ownership of %s' % vgrid_name, 'text': '' } # members/owners are allowed to view private pages and monitor if client_id in vgrid_dict[OWNERS] + vgrid_dict[MEMBERS]: vgrid_obj['enterprivatelink'] = { 'object_type': 'link', 'destination': '../vgrid/%s/path/index.html' % vgrid_name, 'class': 'urllink owner iconspace', 'title': 'View private %s web page' % vgrid_name, 'text': 'View' } vgrid_obj['sharedfolderlink'] = { 'object_type': 'link', 'destination': 'fileman.py?path=%s/' % vgrid_name, 'class': 'sharedfolderlink iconspace', 'title': 'Open shared %s folder' % vgrid_name, 'text': 'Open' } vgrid_obj['memberscmlink'] = { 'object_type': 'link', 'destination': '/vgridscm/%s' % vgrid_name, 'class': 'scmlink member iconspace', 'title': 'View %s members scm' % vgrid_name, 'text': 'View' } vgrid_obj['membertrackerlink'] = { 'object_type': 'link', 'destination': '/vgridtracker/%s' % vgrid_name, 'class': 'trackerlink member iconspace', 'title': 'View %s members tracker' % vgrid_name, 'text': 'View' } vgrid_obj['privateforumlink'] = { 'object_type': 'link', 'destination': 'vgridforum.py?vgrid_name=%s' % vgrid_name, 'class': 'forumlink iconspace', 'title': 'Open %s private forum' % vgrid_name, 'text': 'Open' } vgrid_obj['privateworkflowslink'] = { 'object_type': 'link', 'destination': 'vgridworkflows.py?vgrid_name=%s' % vgrid_name, 'class': 'workflowslink iconspace', 'title': 'Open %s private workflows' % vgrid_name, 'text': 'Open' } vgrid_obj['privatemonitorlink'] = { 'object_type': 'link', 'destination': 'showvgridmonitor.py?vgrid_name=%s' % vgrid_name, 'class': 'monitorlink iconspace', 'title': 'View %s monitor' % vgrid_name, 'text': 'View' } # to leave this VGrid (remove ourselves). Note that we are # going to overwrite the link later for owners. vgrid_obj['memberlink'].update({ 'destination': "javascript: confirmDialog(%s, '%s', %s, %s);" % ('rmvgridmember', "Really leave " + vgrid_name + "?", 'undefined', "{vgrid_name: '%s'}" % vgrid_name), 'class': 'removelink iconspace', 'title': 'Leave %s members' % vgrid_name, }) # owners are allowed to edit pages and administrate if client_id in vgrid_dict[OWNERS]: vgrid_obj['ownerscmlink'] = { 'object_type': 'link', 'destination': '/vgridownerscm/%s' % vgrid_name, 'class': 'scmlink owner iconspace', 'title': 'View %s owners scm' % vgrid_name, 'text': 'View' } vgrid_obj['ownertrackerlink'] = { 'object_type': 'link', 'destination': '/vgridownertracker/%s' % vgrid_name, 'class': 'trackerlink owner iconspace', 'title': 'View %s owners tracker' % vgrid_name, 'text': 'View' } # correct the link to leave the VGrid vgrid_obj['memberlink'].update({ 'destination': "javascript: confirmDialog(%s, '%s', %s, %s);" % ('rmvgridowner', "Really leave " + vgrid_name + "?", 'undefined', "{vgrid_name: '%s'}" % vgrid_name), 'class': 'removeadminlink iconspace', 'title': 'Leave %s owners' % vgrid_name }) # add more links: administrate and edit pages vgrid_obj['administratelink'] = { 'object_type': 'link', 'destination': 'adminvgrid.py?vgrid_name=%s' % vgrid_name, 'class': 'adminlink iconspace', 'title': 'Administrate %s' % vgrid_name, 'text': '' } vgrid_obj['editprivatelink'] = { 'object_type': 'link', 'destination': 'fileman.py?path=private_base/%s/' % vgrid_name, 'class': 'editlink owner iconspace', 'title': 'Edit private %s web page' % vgrid_name, 'text': 'Edit' } vgrid_obj['editpubliclink'] = { 'object_type': 'link', 'destination': 'fileman.py?path=public_base/%s/' % vgrid_name, 'class': 'editlink member iconspace', 'title': 'Edit public %s web page' % vgrid_name, 'text': 'Edit' } vgrid_items.append(vgrid_obj) if operation == "show": # insert dummy placeholder to build table vgrid_obj = {'object_type': 'vgrid', 'name': default_vgrid} for field in active_vgrid_links: vgrid_obj[field] = '' vgrid_items.append(vgrid_obj) output_objects.append(member_list) if operation in show_operations: user_map = get_full_user_map(configuration) user_dict = user_map.get(client_id, None) # Optional limitation of create vgrid permission if user_dict and vgrid_create_allowed(configuration, user_dict): output_objects.append({ 'object_type': 'sectionheader', 'text': 'Additional %ss' % label }) output_objects.append({ 'object_type': 'text', 'text': '''Please enter a name for the new %(vgrid_label)s to add, using slashes to specify nesting. I.e. if you own a %(vgrid_label)s called ABC, you can create a sub-%(vgrid_label)s called DEF by entering ABC/DEF below. ''' % fill_helpers }) target_op = 'createvgrid' csrf_token = make_csrf_token(configuration, form_method, target_op, client_id, csrf_limit) fill_helpers.update({ 'target_op': target_op, 'csrf_token': csrf_token }) output_objects.append({ 'object_type': 'html_form', 'text': ''' <form method="%(form_method)s" action="%(target_op)s.py"> <input type="hidden" name="%(csrf_field)s" value="%(csrf_token)s" /> <input class="p60width" type="text" name="vgrid_name" required pattern="[a-zA-Z0-9 /_.-]*" title="unique name of ASCII letters and digits separated only by underscores, periods, spaces and hyphens. Slashes are additionally allowed when creating nested sub-%(vgrid_label)ss" /> <input type="hidden" name="output_format" value="html" /> <input type="submit" value="Create %(vgrid_label)s" /> </form> ''' % fill_helpers }) output_objects.append({ 'object_type': 'sectionheader', 'text': 'Request Access to %ss' % label }) output_objects.append({ 'object_type': 'text', 'text': '''You can request access to %(vgrid_label)ss using the individual plus-icons above directly or by entering the name of the %(vgrid_label)s to request access to, what kind of access and an optional message to the admins below''' % fill_helpers }) target_op = 'sendrequestaction' csrf_token = make_csrf_token(configuration, form_method, target_op, client_id, csrf_limit) fill_helpers.update({'target_op': target_op, 'csrf_token': csrf_token}) output_objects.append({ 'object_type': 'html_form', 'text': ''' <form method="%(form_method)s" action="%(target_op)s.py"> <input type="hidden" name="%(csrf_field)s" value="%(csrf_token)s" /> <input class="p60width" type="text" name="vgrid_name" required pattern="[a-zA-Z0-9 /_.-]*" title="the name of an existing %(vgrid_label)s" /> <select class="styled-select html-select" name="request_type"> <option value="vgridmember">membership</option> <option value="vgridowner">ownership</option> </select> <br/> <input class="p60width" type="text" name="request_text" required /> <input type="hidden" name="output_format" value="html" /> <input type="submit" value="Request %(vgrid_label)s access" /> </form> ''' % fill_helpers }) logger.info("%s %s end for %s" % (op_name, operation, client_id)) return (output_objects, status)