def main(group_id, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Get original group name. group_name = dbutil.get_group_name(cnx, group_id) clone_id = 0 if group_name != '': # Generate first candidate clone group name. clone_group_name = 'Clone of %s' % group_name # Check whether this group name is already used. dup_id = dbutil.get_group_id(cnx, clone_group_name) # Modify group name until we find one that isn't alrady used. ntry = 1 while dup_id > 0: ntry += 1 clone_group_name = 'Clone %d of %s' % (ntry, group_name) dup_id = dbutil.get_group_id(cnx, clone_group_name) # Now clone the group. clone_id = dbutil.clone_group(cnx, group_id, clone_group_name) # Generate redirect html document header to invoke the gropu editor for # the newly created document. url = '' if clone_id > 0: url = '%s/edit_group.py?id=%d&%s' % \ (dbconfig.base_url, clone_id, dbargs.convert_args(qdict)) else: url = '%s/query_groups.py?%s' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' url = '' if clone_id > 0: print 'Cloned group %s' % group_name else: print 'Group not cloned.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>'
def main(substage_id, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Query the stage id. c = cnx.cursor() q = 'SELECT id,fclname,stage_id FROM substages WHERE id=%s' c.execute(q, (substage_id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch substage id %d' % substage_id) row = rows[0] fclname = row[1] stage_id = row[2] # Now clone the substage. clone_id = dbutil.clone_substage(cnx, substage_id, stage_id) # Generate redirect html document header to invoke the substage editor for # the newly created document. url = '' if clone_id > 0: url = '%s/edit_substage.py?id=%d&%s' % \ (dbconfig.base_url, clone_id, dbargs.convert_args(qdict)) else: url = '%s/edit_stage.py?id=%d&%s' % \ (dbconfig.base_url, stage_id, dbargs.convert_args(qdict)) print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' if clone_id > 0: print 'Cloned substage %s' % fclname else: print 'Substage not cloned.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>'
def main(stage_id, name, override_type, value, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Add override and redirect to stage editor. override_id = dbutil.add_override(cnx, stage_id, name, override_type, value) url = '%s/edit_stage.py?id=%d&%s' % \ (dbconfig.base_url, stage_id, dbargs.convert_args(qdict)) # Generate redirect page. print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'Add override.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>' # Done. return
def main(qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Add project and redirect to project editor. project_id = dbutil.insert_blank_project(cnx) url = '%s/edit_project.py?id=%d&%s' % \ (dbconfig.base_url, project_id, dbargs.convert_args(qdict)) # Generate redirect page. print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'Add project.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>' # Done. return
def main(qdict, argdict): # Open database connection. cnx = dbconfig.connect(readonly=True, devel=qdict['dev']) # Generate html document header. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Sample Request</title>' print '</head>' print '<body>' print '<a href=%s/query_projects.py?%s>Project list</a><br>' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) # Generate main part of html document. request_form(cnx, qdict, argdict) # Generate html document trailer. print '</body>' print '</html>' # Done. return
def main(id, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Generate html document header. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Dataset Editor</title>' print '</head>' print '<body>' print '<a href=%s/query_projects.py?%s>Project list</a><br>' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) # Generate main parg of html document. dataset_form(cnx, id, qdict) # Generate html document trailer. print '</body>' print '</html>'
def main(dataset_id, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Check access. if not dbconfig.restricted_access_allowed() and dbutil.restricted_access( cnx, 'datasets', dataset_id): dbutil.restricted_error() # Query the project id, dataset type, and sequence number. c = cnx.cursor() q = 'SELECT id,project_id,type,seqnum FROM datasets WHERE id=%s' c.execute(q, (dataset_id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch dataset id %d' % dataset_id) row = rows[0] project_id = row[1] dataset_type = row[2] seqnum = row[3] # Query the succeeding sequence number q = 'SELECT id, project_id, type, seqnum FROM datasets WHERE project_id=%s AND type=%s AND seqnum>%s ORDER BY seqnum' c.execute(q, (project_id, dataset_type, seqnum)) rows = c.fetchall() if len(rows) > 0: row = rows[0] next_dataset_id = row[0] next_seqnum = row[3] # Swap sequence numbers. q = 'UPDATE datasets SET seqnum=%s WHERE id=%s' c.execute(q, (next_seqnum, dataset_id)) q = 'UPDATE datasets SET seqnum=%s WHERE id=%s' c.execute(q, (seqnum, next_dataset_id)) cnx.commit() # Generate redirect html document header to invoke the dataset editor for # the newly created document. url = '' url = '%s/edit_datasets.py?id=%d&%s' % \ (dbconfig.base_url, project_id, dbargs.convert_args(qdict)) print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>'
def main(dataset_id, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Query the project id. # This is only needed for the redirect page. c = cnx.cursor() q = 'SELECT id,project_id FROM datasets WHERE id=%s' c.execute(q, (dataset_id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch dataset id %d' % dataset_id) row = rows[0] project_id = row[1] # Clone the dataset row. clone_id = dbutil.clone_dataset(cnx, dataset_id, project_id) # Generate redirect html document header to invoke the dataset editor for # the newly created document. url = '%s/edit_datasets.py?id=%d&%s' % \ (dbconfig.base_url, project_id, dbargs.convert_args(qdict)) print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' if clone_id > 0: print 'Cloned dataset.' else: print 'Dataset not cloned.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>'
def main(id, qdict): # Open database connection. cnx = dbconfig.connect(readonly = False, devel = qdict['dev']) # Query the stage id. c = cnx.cursor() q = 'SELECT id,stage_id FROM overrides WHERE id=%s' c.execute(q, (id,)) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch override id %d' % id) row = rows[0] stage_id = row[1] # Delete override and redirect to stage editor. dbutil.delete_override(cnx, id) url = '%s/edit_stage.py?id=%d&%s' % \ (dbconfig.base_url, stage_id, dbargs.convert_args(qdict)) # Generate redirect page. print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'Deleted override.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>' # Done. return
def override_form(cnx, id, qdict): # Construct global disabled option for restricted controls. disabled = '' if not dbconfig.restricted_access_allowed() and dbutil.restricted_access( cnx, 'overrides', id): disabled = 'disabled' # Query override from database. c = cnx.cursor() q = 'SELECT stage_id,name,override_type,value FROM overrides WHERE id=%s' c.execute(q, (id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch override id %d' % id) row = rows[0] stage_id = row[0] name = row[1] override_type = row[2] value = row[3] # Query stage name and project id. q = 'SELECT id, name, project_id FROM stages WHERE id=%s' c.execute(q, (stage_id, )) stage_rows = c.fetchall() if len(stage_rows) == 0: raise IOError('Unable to fetch stage id %d' % stage_id) stage_row = stage_rows[0] stage_name = stage_row[1] project_id = stage_row[2] project_name = dbutil.get_project_name(cnx, project_id) # Generate form. print '<h2>Project %s</h2>' % project_name print '<h2>Stage %s</h2>' % stage_name print '<h2>Override %s</h2>' % name print '<form action="%s/dbhandler.py" method="post">' % dbconfig.rel_url # Add hidden input field to store table name. print '<input type="hidden" id="table" name="table" value="overrides">' # Add hidden input field to store save url (parent of this page). print '<input type="hidden" id="saveurl" name="saveurl" value="%s/edit_stage.py?id=%d&%s">' % \ (dbconfig.base_url, stage_id, dbargs.convert_args(qdict)) # Add hidden qdict input fields. for key in qdict: print '<input type="hidden" name="%s" value="%s">' % ( dbutil.convert_str(key), dbutil.convert_str(qdict[key])) # Add form fields in a table. print '<table border=1 style="border-collapse:collapse">' print '<tr>' print '<td>' print '<label for="id">ID:</label>' print '</td>' print '<td>' print '<input type="number" id="id" name="id" value="%d" readonly>' % id print '</td>' print '</tr>' print '<tr>' print '<td>' print '<label for="stage_id">Stage ID:</label>' print '</td>' print '<td>' print '<input type="number" id="stage_id" name="stage_id" value="%d" readonly>' % stage_id print '</td>' print '</tr>' print '<tr>' print '<td>' print '<label for="name">Name:</label>' print '</td>' print '<td>' print '<input type="text" id="name" name="name" value="%s">' % name print '</td>' print '</tr>' print '<tr>' print '<td>' print '<label for="override_type">Type:</label>' print '</td>' print '<td>' print '<select id="override_type" name="override_type" size=0>' pulldown_list = pulldowns['override_type'] for override_value in pulldown_list: sel = '' if override_value == override_type: sel = 'selected' print '<option value="%s" %s>%s</option>' % (override_value, sel, override_value) print '</select>' print '</td>' print '</tr>' print '<tr>' print '<td>' print '<label for="value">Value:</label>' print '</td>' print '<td>' print '<input type="text" id="value" name="value" value="%s">' % value print '</td>' print '</tr>' # Finish table. print '</table>' # Add "Save" and "Back" buttons. print '<input type="submit" name="submit" value="Save" %s>' % disabled print '<input type="submit" name="submit" value="Update" %s>' % disabled print '<input type="submit" name="submit" value="Back">' print '</form>'
def main(id, confirm, qdict): # Open database connection. cnx = dbconfig.connect(readonly = False, devel = qdict['dev']) # Query the fclname and stage id. c = cnx.cursor() q = 'SELECT id,fclname,stage_id FROM substages WHERE id=%s' c.execute(q, (id,)) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch substage id %d' % id) row = rows[0] fclname = row[1] stage_id = row[2] # Check confirm flag. if confirm == 0: # If confirm flag is zero, generate a confirmation page. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Delete Substage</title>' print '</head>' print '<body>' if id == 0 or fclname == '': print 'No such substage.' else: print 'Delete substage %s?' % fclname # Generate a form with two buttons "Delete" and "Cancel." print '<br>' print '<form action="%s/delete_substage.py?id=%d&confirm=1&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<input type="submit" value="Delete">' print '<input type="submit" value="Cancel" formaction="%s/edit_stage.py?id=%d&%s">' % \ (dbconfig.rel_url, stage_id, dbargs.convert_args(qdict)) print '</form>' print '</body>' print '</html>' else: # If confirm flag is nonzero, delete substage and redirect to stage editor. dbutil.delete_substage(cnx, id) url = '%s/edit_stage.py?id=%d&%s' % \ (dbconfig.base_url, stage_id, dbargs.convert_args(qdict)) # Generate redirect page. print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'Deleted substage %s.' % fclname print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>' # Done. return
def page_links(qdict, max_page): current_page = qdict['page'] # Base url. url = '%s/query_groups.py' % dbconfig.base_url # Calculate which pages to display. # Display some number of links centered around the current page. offset = 4 # The maximum number of links to display. min_link = current_page - offset max_link = current_page + offset if min_link < 1: min_link = 1 max_link = min(2 * offset + 1, max_page) if max_link > max_page: min_link = max(max_page - 2 * offset, 1) max_link = max_page # Add page links. print '<table>' print '<tr>' print '<td>Go to page: </td>' # Add button for first page. disabled = '' if current_page == 1: disabled = 'disabled' print '<td>' new_qdict = copy.deepcopy(qdict) new_qdict['page'] = 1 print '<form action="%s/query_groups.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(new_qdict)) print '<input type="submit" value="◄◄" %s>' % disabled print '</form>' print '</td>' # Add button for previous page. prev_page = max(current_page - 1, 1) print '<td>' new_qdict = copy.deepcopy(qdict) new_qdict['page'] = prev_page print '<form action="%s/query_groups.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(new_qdict)) print '<input type="submit" value="◄" %s>' % disabled print '</form>' print '</td>' # Links to specific pages. for page in range(min_link, max_link + 1): if page != current_page: new_qdict = copy.deepcopy(qdict) new_qdict['page'] = page print '<td align="center" style="width:25px;"><a href="%s?%s">%d</a></td>' % \ (url, dbargs.convert_args(new_qdict), page) else: print '<th align="center" style="width:25px;">%d</th>' % page # Link to next page. disabled = '' if current_page == max_page: disabled = 'disabled' next_page = min(current_page + 1, max_page) print '<td>' new_qdict = copy.deepcopy(qdict) new_qdict['page'] = next_page print '<form action="%s/query_groups.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(new_qdict)) print '<input type="submit" value="►" %s>' % disabled print '</form>' print '</td>' # Link to last page. print '<td>' new_qdict = copy.deepcopy(qdict) new_qdict['page'] = max_page print '<form action="%s/query_groups.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(new_qdict)) print '<input type="submit" value="►►" %s >' % disabled print '</form>' print '</td>' # Finish table. print '</tr>' print '</table>' # Done. return
def main(qdict): # Extract arguments. results_per_page = qdict['results_per_page'] current_page = qdict['page'] pattern = qdict['pattern'] devel = qdict['dev'] sort = qdict['sort'] # Open database connection and query groups. cnx = dbconfig.connect(readonly=True, devel=qdict['dev']) # Get list of project groups. groups = list_groups(cnx, pattern, sort) max_page = (len(groups) + results_per_page - 1) / results_per_page # Generate html document header. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Project Groups</title>' print '</head>' print '<body>' # Add styles. print '<style>' print '.small-btn {' print ' padding:0 5px;' print ' text-decoration:none;' print ' border:none;' print ' background-color:white;' print '}' print '</style>' # Add link to project full list. print '<a href=%s/query_projects.py?%s>Project list</a><br>' % \ (dbconfig.base_url, dbargs.convert_args(qdict, 'gid', 0)) # Generate main part of html document. print '<h1>Project Groups</h1>' # Add button to create new group. print '<form action="%s/add_group.py?%s" method="post" target="_self">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict)) print '<label for="submit">Generate a new empty project group: </label>' print '<input type="submit" id="submit" value="New Group">' print '</form>' print '<p>' # Generate search panel form. search_panel(results_per_page, pattern, devel) # Display number of results. print '<p>%d project groups found</p>' % len(groups) # Generate upper navigation panel. page_links(qdict, max_page) # Group table. print '<table border=1 style="border-collapse:collapse">' print '<tr>' print '<th nowrap>' print ' Group ID ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_groups.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'id_u')) if sort == 'id_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_groups.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'id_d')) if sort == 'id_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' print '<th nowrap>' print ' Group Name ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_groups.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'name_u')) if sort == 'name_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_groups.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'name_d')) if sort == 'name_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' print '</tr>' # Loop over groups. for i in range((current_page - 1) * results_per_page, min(current_page * results_per_page, len(groups))): group = groups[i] print '<tr>' id = group[0] name = group[1] print '<td align="center">%d</td>' % id # Construct disabled option for restricted controls. disabled = '' if not dbconfig.restricted_access_allowed(): disabled = 'disabled' # Add group name with link to projects page. url = '%s/query_projects.py?%s' % \ (dbconfig.base_url, dbargs.convert_args(qdict, 'gid', id)) print '<td> <a href="%s">%s</a> </td>' % (url, name) # Add Edit button/column print '<td>' print '<form target="_self" action="%s/edit_group.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Edit group">' print '<input type="submit" value="✎">' print '</div>' print '</form>' print '</td>' # Add Clone button/column print '<td>' print '<form target="_self" action="%s/clone_group.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Clone group">' print '<input type="submit" value="⎘">' print '</div>' print '</form>' print '</td>' # Add Delete button/column print '<td>' print '<form action="%s/delete_group.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Delete group">' print '<input type="submit" value="🗑" %s>' % disabled print '</div>' print '</form>' print '</td>' print '</tr>' print '</table>' # Add lower navigation panel. page_links(qdict, max_page) # Generate html document trailer. print '</body>' print '</html>'
def main(project_id, update_id, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # See if we want to update any dataset. if update_id != 0: update_ok = False # Query dataset name. c = cnx.cursor() q = 'SELECT name FROM datasets WHERE id=%s' c.execute(q, (update_id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch dataset id %d' % update_id) dataset_name = rows[0][0] # Query experiment name. q = 'SELECT experiment FROM projects WHERE id=%s' c.execute(q, (project_id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch project id %d' % project_id) row = rows[0] experiment = row[0] # Query event count form sam. files = 0 events = 0 parent_files = 0 parent_events = 0 update_ok = True r = dbutil.get_stats(dbconfig.samweb_url[experiment], dataset_name) if r == None: update_ok = False else: files = r[0] events = r[1] r = dbutil.get_parent_stats(dbconfig.samweb_url[experiment], dataset_name) if r == None: update_ok = False else: parent_files = r[0] parent_events = r[1] # Do update. if update_ok: # Check access. if not dbconfig.restricted_access_allowed( ) and dbutil.restricted_access(cnx, 'datasets', dataset_id): dbutil.restricted_error() # Update database. q = 'UPDATE datasets SET events=%s, files=%s, parent_events=%s, parent_files=%s WHERE id=%s' c.execute(q, (events, files, parent_events, parent_files, update_id)) cnx.commit() else: url = '%s/edit_datasets.py?id=%d&%s' % \ (dbconfig.base_url, project_id, dbargs.convert_args(qdict)) print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Update Datasets</title>' print '</head>' print '<body>' print 'Failed to update dataset statistics.' print '<br><br>' print '<a href=%s>Return to dataset list</a>.' % url print '</body>' print '</html>' return # Generate html document header. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Project Datasets Editor</title>' print '</head>' print '<body>' print '<a href=%s/query_projects.py?%s>Project list</a><br>' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) # Generate main parg of html document. datasets_form(cnx, project_id, qdict) # Generate html document trailer. print '</body>' print '</html>'
def main(qdict): # Extract arguments. results_per_page = qdict['results_per_page'] current_page = qdict['page'] pattern = qdict['pattern'] group = qdict['group'] status = qdict['status'] devel = qdict['dev'] gid = qdict['gid'] file_type = qdict['file_type'] campaign = qdict['campaign'] sort = qdict['sort'] experiment = qdict['experiment'] # Open database connection and query projects. cnx = dbconfig.connect(readonly = True, devel = qdict['dev']) # Get list of projects. prjs = list_projects(cnx, pattern, group, status, gid, experiment, file_type, campaign, sort) max_page = (len(prjs) + results_per_page - 1) / results_per_page # Generate html document header. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Projects</title>' print '</head>' print '<body>' # Add styles. print '<style>' print '.small-btn {' print ' padding:0 5px;' print ' text-decoration:none;' print ' border:none;' print ' background-color:white;' print '}' print '</style>' # Add link to project group list. print '<a href=%s/query_groups.py?%s>Group list</a><br>' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) # Generate main part of html document. print '<h1>Projects</h1>' # Add button to request a new sample. print '<form action="%s/request.py?%s" method="post" target="_self">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict)) print '<label for="submit">Request a sample: </label>' print '<input type="submit" id="submit" value="Request">' print '</form>' print '<p>' # Add button to create new project. print '<form action="%s/add_project.py?%s" method="post" target="_self">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict)) print '<label for="submit">Generate a new empty project: </label>' print '<input type="submit" id="submit" value="New Project">' print '</form>' print '<p>' # Add button to import a project from local xml file. print '<form action="%s/import_project.py?%s" method="post" target="_self">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict)) print '<label for="submit">Import project from local XML file: </label>' print '<input type="submit" id="submit" value="Import Project">' print '</form>' print '<p>' # Generate search panel form. search_panel(results_per_page, pattern, group, status, gid, experiment, file_type, campaign, devel) # Display number of results. print '<p>%d projects found</p>' % len(prjs) # Generate upper navigation panel. page_links(qdict, max_page) # Project table. print '<table border=1 style="border-collapse:collapse">' print '<tr>' # Project ID column. print '<th nowrap>' print ' Project ID ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'id_u')) if sort == 'id_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'id_d')) if sort == 'id_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' # Project name column. print '<th nowrap>' print ' Project Name (Datasets) ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'name_u')) if sort == 'name_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'name_d')) if sort == 'name_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' # Experiment column. print '<th nowrap>' print ' Experiment ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'experiment_u')) if sort == 'experiment_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'experiment_d')) if sort == 'experiment_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' # File type column. print '<th nowrap>' print ' File Type ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'file_type_u')) if sort == 'file_type_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'file_type_d')) if sort == 'file_type_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' # Campaign column. print '<th nowrap>' print ' Campaign ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'campaign_u')) if sort == 'campaign_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'campaign_d')) if sort == 'campaign_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' # Physics group column. print '<th nowrap>' print ' Physics ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'group_u')) if sort == 'group_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'group_d')) if sort == 'group_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' # Status column. print '<th nowrap>' print ' Status ' # Add sort buttons. print '<div style="display:inline-block">' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'status_u')) if sort == 'status_u': print '<input class="small-btn" type="submit" value="▲">' else: print '<input class="small-btn" type="submit" value="△">' print '</form>' print '<form action="%s/query_projects.py?%s" method="post">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict, 'sort', 'status_d')) if sort == 'status_d': print '<input class="small-btn" type="submit" value="▼">' else: print '<input class="small-btn" type="submit" value="▽">' print '</form>' print '</div>' print '</th>' print '</tr>' # Loop over projects. for i in range((current_page-1) * results_per_page, min(current_page * results_per_page, len(prjs))): prj = prjs[i] print '<tr>' id = prj[0] name = prj[1] file_type = prj[2] experiment = prj[3] campaign = prj[4] physics_group = prj[5] status = prj[6] color_style = '' if status in colors: color_style = 'style="background-color: %s"' % colors[status] print '<td align="center" %s>%d</td>' % (color_style, id) # Construct disabled option for restricted controls. disabled = '' if not dbconfig.restricted_access_allowed() and dbutil.restricted_access(cnx, 'projects', id): disabled = 'disabled' # Add link to datasets page with project name. print '<td %s> <a target=_self href=%s/edit_datasets.py?id=%d&%s>%s</a> </td>' % \ (color_style, dbconfig.base_url, id, dbargs.convert_args(qdict), name) # Add middle columns print '<td align="center" %s> %s </td>' % (color_style, experiment) print '<td align="center" %s> %s </td>' % (color_style, file_type) print '<td align="center" %s> %s </td>' % (color_style, campaign) print '<td align="center" %s> %s </td>' % (color_style, physics_group) print '<td align="center" %s> %s </td>' % (color_style, status) # Add XML button/column xml_disabled = '' if dbutil.xml_disabled(cnx, id): xml_disabled = 'disabled' print '<td>' print '<form target="_self" action="%s/export_project.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Generate project.py XML">' print '<input type="submit" value="XML" %s>' % xml_disabled print '</div>' print '</form>' print '</td>' # Add FIFE button/column fife_disabled = '' if dbutil.xml_disabled(cnx, id): fife_disabled = 'disabled' print '<td>' print '<form target="_self" action="%s/export_fife.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Generate fife_launch config">' print '<input type="submit" value="FIFE" %s>' % xml_disabled print '</div>' print '</form>' print '</td>' # Add POMS button/column print '<td>' print '<form target="_self" action="%s/export_poms.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Generate POMS .ini file">' print '<input type="submit" value="POMS">' print '</form>' print '</td>' # Add Edit button/column print '<td>' print '<form target="_self" action="%s/edit_project.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Edit project">' print '<input type="submit" value="✎">' print '</div>' print '</form>' print '</td>' # Add Clone button/column print '<td>' print '<form target="_self" action="%s/clone_project.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Clone project">' print '<input type="submit" value="⎘">' print '</div>' print '</form>' print '</td>' # Add Delete button/column print '<td>' print '<form action="%s/delete_project.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<div title="Delete project">' print '<input type="submit" value="🗑" %s>' % disabled print '</div>' print '</form>' print '</td>' print '</tr>' print '</table>' # Add lower navigation panel. page_links(qdict, max_page) # Generate html document trailer. print '</body>' print '</html>'
def group_form(cnx, id, qdict): # Construct global disabled option for restricted controls. disabled = '' if not dbconfig.restricted_access_allowed(): disabled = 'disabled' # Get group name. name = dbutil.get_group_name(cnx, id) # Generate form. print '<h2>Group %s</h2>' % name # Query full group from database. c = cnx.cursor() q = 'SELECT %s FROM groups WHERE id=%%s' % dbutil.columns('groups') c.execute(q, (id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch group id %d' % id) row = rows[0] print '<form action="%s/dbhandler.py" method="post">' % dbconfig.rel_url # Add hidden input field to store table name. print '<input type="hidden" id="table" name="table" value="groups">' # Add hidden input field to store save url (parent of this page). print '<input type="hidden" id="saveurl" name="saveurl" value="%s/query_groups.py?%s">' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) # Add hidden qdict input fields. for key in qdict: print '<input type="hidden" name="%s" value="%s">' % ( dbutil.convert_str(key), dbutil.convert_str(qdict[key])) # Loop over fields of this group. # Put fields in a table. print '<table border=1 style="border-collapse:collapse">' cols = databaseDict['groups'] for n in range(len(cols)): coltup = cols[n] colname = coltup[0] coltype = coltup[2] colarray = coltup[3] coldesc = coltup[4] if colname != '': # Set readonly attribute readonly = '' if colname == 'id': readonly = 'readonly' elif disabled != '': readonly = 'readonly' print '<tr>' print '<td>' print '<label for="%s">%s: </label>' % (colname, coldesc) print '</td>' print '<td>' if colarray == 0: # Scalar column. if coltype[0:3] == 'INT': print '<input type="number" id="%s" name="%s" size=10 value="%d" %s>' % \ (colname, colname, row[n], readonly) elif coltype[0:6] == 'DOUBLE': print '<input type="text" id="%s" name="%s" size=10 value="%8.6f" %s>' % \ (colname, colname, row[n], readonly) elif coltype[0:7] == 'VARCHAR': if colname in pulldowns: print '<select id="%s" name="%s" size=0 %s>' % ( colname, colname, disabled) for value in pulldowns[colname]: sel = '' if value == row[n]: sel = 'selected' if value == '' or value == 'Requested': print '<option value="%s" %s>%s</option>' % ( value, sel, value) else: print '<option value="%s" %s %s>%s</option>' % ( value, sel, option_disabled, value) print '</select>' else: print '<input type="text" id="%s" name="%s" size=100 value="%s" %s>' % \ (colname, colname, row[n], readonly) else: # Array columns. # Display using multiline <textarea>. strs = dbutil.get_strings(cnx, row[n]) print '<textarea id="%s" name="%s" rows=%d cols=80 %s>' % \ (colname, colname, max(len(strs),1), readonly) print '\n'.join(strs) print '</textarea>' print '</td>' print '</tr>' # Finish table. print '</table>' # Projects section. print '<h3>Projects</h3>' # Query all projects. project_ids = [] q = 'SELECT id,name FROM projects ORDER BY name' c.execute(q, ()) rows = c.fetchall() for row in rows: project_id = row[0] project_ids.append(project_id) # Query all projects in this group. project_group_ids = set() q = 'SELECT project_id FROM group_project WHERE group_id=%s' c.execute(q, (id, )) rows = c.fetchall() for row in rows: project_id = row[0] project_group_ids.add(project_id) # Projects table. print '<table border=1 style="border-collapse:collapse">' print '<tr>' print '<th>Group Projects</th>' print '<th>Available Projects</th>' print '</tr>' # Generate project lists. print '<td>' # Generate selection list for projects in group. # Loop over project ids in name order. print '<select id="ingroup" name="remove" size=20 multiple>' for project_id in project_ids: if project_id in project_group_ids: project_name = dbutil.get_project_name(cnx, project_id) print '<option value="%d">%s</option>' % (project_id, project_name) print '</select>' print '</td>' print '<td>' # Generate selection list for projects not in group. # Loop over project ids in name order. print '<select id="available" name="add" size=20 multiple>' for project_id in project_ids: if not project_id in project_group_ids: project_name = dbutil.get_project_name(cnx, project_id) print '<option value="%d">%s</option>' % (project_id, project_name) print '</select>' print '</td>' # Finish datasets table. print '</table>' # Add "Save" and "Back" buttons. print '<input type="submit" name="submit" value="Save" %s>' % disabled print '<input type="submit" name="submit" value="Update" %s>' % disabled print '<input type="submit" name="submit" value="Back">' print '</form>'
def stage_form(cnx, id, qdict): # Construct global disabled option for restricted controls. disabled = '' if not dbconfig.restricted_access_allowed() and dbutil.restricted_access( cnx, 'stages', id): disabled = 'disabled' # Query project name and id from database. c = cnx.cursor() q = 'SELECT id, name, project_id FROM stages WHERE id=%s' c.execute(q, (id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch stage id %d' % id) row = rows[0] name = row[1] project_id = row[2] project_name = dbutil.get_project_name(cnx, project_id) # Generate form. print '<h2>Project %s</h2>' % project_name print '<h2>Stage %s</h2>' % name # Substages section. print '<h2>Substages</h2>' # Add a button to add a new substage. print '<form action="%s/add_substage.py?id=%d&%s" method="post" target="_self">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<input type="submit" value="Add Substage" %s>' % disabled print '</form>' print '<br>' # Query substage ids belonging to this stage. q = 'SELECT id, fclname FROM substages WHERE stage_id=%s ORDER BY seqnum' c.execute(q, (id, )) rows = c.fetchall() if len(rows) > 0: # Add links to edit project stages. print '<table border=1 style="border-collapse:collapse">' print '<tr>' print '<th> Substage ID </th>' print '<th> FCL </th>' print '</tr>' for row in rows: print '<tr>' substage_id = row[0] fclname = row[1] print '<td align="center">%d</td>' % substage_id print '<td> <a target="_self" href="%s/edit_substage.py?id=%d&%s">%s</a> </td>' % \ (dbconfig.base_url, substage_id, dbargs.convert_args(qdict), fclname) # Add Edit button/column print '<td>' print '<form target="_self" action="%s/edit_substage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, substage_id, dbargs.convert_args(qdict)) print '<div title="Edit substage">' print '<input type="submit" value="✎">' print '</div>' print '</form>' print '</td>' # Add Clone button/column print '<td>' print '<form target="_self" action="%s/clone_substage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, substage_id, dbargs.convert_args(qdict)) print '<div title="Clone substage">' print '<input type="submit" value="⎘" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Delete button/column print '<td>' print '<form action="%s/delete_substage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, substage_id, dbargs.convert_args(qdict)) print '<div title="Delete substage">' print '<input type="submit" value="🗑" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Up button/column print '<td>' print '<form action="%s/up_substage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, substage_id, dbargs.convert_args(qdict)) print '<div title="Move up">' print '<input type="submit" value="▲" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Down button/column print '<td>' print '<form action="%s/down_substage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, substage_id, dbargs.convert_args(qdict)) print '<div title="Move down">' print '<input type="submit" value="▼" %s>' % disabled print '</div>' print '</form>' print '</td>' # Finish row. print '</tr>' # Finish table. print '</table>' # Overrides section. print '<h2>Overrides</h2>' # Add a button to add a new override. print '<form action="%s/add_override.py?id=%d&%s" method="post" target="_self">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<table>' print '<tr>' print '<td>' print '<label for="name">Name:</label>' print '</td>' print '<td>' print '<input type="text" id="name" name="name" value="">' print '</td>' print '</tr>' print '<tr>' print '<td>' print '<label for="override_type">Type:</label>' print '</td>' print '<td>' print '<select id="override_type" name="override_type" size=0>' pulldown_list = pulldowns['override_type'] sel = 'selected' for value in pulldown_list: print '<option value="%s" %s>%s</option>' % (value, sel, value) sel = '' print '</select>' print '</td>' print '</tr>' print '<tr>' print '<td>' print '<label for="value">Value:</label>' print '</td>' print '<td>' print '<input type="text" id="value" name="value" value="">' print '</td>' print '</tr>' print '</table>' print '<input type="submit" value="Add Override" %s>' % disabled print '</form>' print '<br>' # Query override ids belonging to this stage. q = 'SELECT id, name, override_type, value FROM overrides WHERE stage_id=%s ORDER BY override_type' c.execute(q, (id, )) rows = c.fetchall() if len(rows) > 0: # Add links to edit project stages. print '<table border=1 style="border-collapse:collapse">' print '<tr>' print '<th> ID </th>' print '<th> Name </th>' print '<th> Type </th>' print '<th> Value </th>' print '</tr>' for row in rows: print '<tr>' override_id = row[0] name = row[1] override_type = row[2] value = row[3] print '<td align="center">%d</td>' % override_id print '<td align="left"> %s </td>' % name print '<td align="left"> %s </td>' % override_type print '<td align="value" > %s </td>' % value # Add Edit button/column print '<td>' print '<form target="_self" action="%s/edit_override.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, override_id, dbargs.convert_args(qdict)) print '<div title="Edit override">' print '<input type="submit" value="✎">' print '</div>' print '</form>' print '</td>' # Add Clone button/column print '<td>' print '<form target="_self" action="%s/clone_override.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, override_id, dbargs.convert_args(qdict)) print '<div title="Clone override">' print '<input type="submit" value="⎘" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Delete button/column print '<td>' print '<form action="%s/delete_override.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, override_id, dbargs.convert_args(qdict)) print '<div title="Delete override">' print '<input type="submit" value="🗑" %s>' % disabled print '</div>' print '</form>' print '</td>' # Finish row. print '</tr>' # Finish table. print '</table>' print '<h2>Stage Data</h2>' # Query full stage from database. q = 'SELECT %s FROM stages WHERE id=%%s' % dbutil.columns('stages') c.execute(q, (id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch stage id %d' % id) row = rows[0] print '<form action="%s/dbhandler.py" method="post">' % dbconfig.rel_url # Add hidden input field to store table name. print '<input type="hidden" id="table" name="table" value="stages">' # Add hidden input field to store save url (parent of this page). print '<input type="hidden" id="saveurl" name="saveurl" value="%s/edit_project.py?id=%d&%s">' % \ (dbconfig.base_url, project_id, dbargs.convert_args(qdict)) # Add hidden qdict input fields. for key in qdict: print '<input type="hidden" name="%s" value="%s">' % ( dbutil.convert_str(key), dbutil.convert_str(qdict[key])) # Loop over fields of this stage. # Put fields in a table. print '<table border=1 style="border-collapse:collapse">' cols = databaseDict['stages'] for n in range(len(cols)): coltup = cols[n] colname = coltup[0] coltype = coltup[2] colarray = coltup[3] coldesc = coltup[4] if colname != '': # Set readonly attribute readonly = '' if colname == 'id' or colname == 'project_id': readonly = 'readonly' elif disabled != '': readonly = 'readonly' print '<tr>' print '<td>' print '<label for="%s">%s: </label>' % (colname, coldesc) print '</td>' print '<td>' if colarray == 0: # Scalar column. if coltype[0:3] == 'INT': print '<input type="number" id="%s" name="%s" size=10 value="%d" %s>' % \ (colname, colname, row[n], readonly) elif coltype[0:6] == 'DOUBLE': value = row[n] if value == None: value = 0. print '<input type="text" id="%s" name="%s" size=100 value="%8.6f" %s>' % \ (colname, colname, value, readonly) elif coltype[0:7] == 'VARCHAR': if colname in pulldowns: print '<select id="%s" name="%s" size=0 %s>' % ( colname, colname, disabled) pulldown_list = pulldowns[colname] if type(pulldown_list) == type({}): if experiment in pulldown_list: pulldown_list = pulldowns[colname][experiment] else: pulldown_list = [''] for value in pulldown_list: sel = '' if value == row[n]: sel = 'selected' print '<option value="%s" %s>%s</option>' % ( value, sel, value) print '</select>' else: print '<input type="text" id="%s" name="%s" size=100 value="%s" %s>' % \ (colname, colname, row[n], readonly) # Add datasets. #if (colname == 'defname' or colname == 'ana_defname') and row[n] != '': # dbutil.add_dataset(cnx, project_id, 'output', row[n]) #if colname == 'inputdef' and row[n] != '': # dbutil.add_dataset(cnx, project_id, 'input', row[n]) else: # Array columns. # Display using multiline <textarea>. strs = dbutil.get_strings(cnx, row[n]) print '<textarea id="%s" name="%s" rows=%d cols=80 %s>' % \ (colname, colname, max(len(strs), 1), readonly) print '\n'.join(strs) print '</textarea>' print '</td>' print '</tr>' # Finish table. print '</table>' # Add "Save" and "Back" buttons. print '<input type="submit" name="submit" value="Save" %s>' % disabled print '<input type="submit" name="submit" value="Update" %s>' % disabled print '<input type="submit" name="submit" value="Back">' print '</form>'
def main(id, confirm, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Get project name. name = dbutil.get_project_name(cnx, id) # Check confirm flag. if confirm == 0: # If confirm flag is zero, generate a confirmation page. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Delete Project</title>' print '</head>' print '<body>' if id == 0 or name == '': print 'No such project.' else: print 'Delete project %s?' % name # Generate a form with two buttons "Delete" and "Cancel." print '<br>' print '<form action="%s/delete_project.py?id=%d&confirm=1&%s" method="post">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<input type="submit" value="Delete">' print '<input type="submit" value="Cancel" formaction="%s/query_projects.py?%s">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict)) print '</form>' print '</body>' print '</html>' else: # If confirm flag is nonzero, delete project and redirect to project list. dbutil.delete_project(cnx, id) url = '%s/query_projects.py?%s' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) # Generate redirect page. print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'Deleted project %s.' % name print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>'
def datasets_form(cnx, project_id, qdict): # Query project name and experiment. c = cnx.cursor() q = 'SELECT name, experiment FROM projects WHERE id=%s' c.execute(q, (project_id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch project id %d' % project_id) row = rows[0] name = row[0] experiment = row[1] # Construct global disabled option for restricted controls. disabled = '' if not dbconfig.restricted_access_allowed() and dbutil.restricted_access( cnx, 'projects', project_id): disabled = 'disabled' # Generate form. print '<h2>Datasets for Project %s</h2>' % name for dataset_type in ('input', 'output'): title_type = dataset_type[0].upper() + dataset_type[1:] # Section title. print '<h3>%s Datasets</h3>' % title_type # Add button to add dataset. print '<form action="%s/add_dataset.py?id=%d&type=%s&%s" method="post">' % \ (dbconfig.rel_url, project_id, dataset_type, dbargs.convert_args(qdict)) print '<label for="submit">Add %s Dataset: </label>' % title_type print '<input type="submit" id="submit" value="Add" %s>' % disabled print '</form>' print '<p>' # Query datasets belonging to this project and type. q = 'SELECT id, name, files, events, parent_files, parent_events, parent_id FROM datasets WHERE project_id=%s AND type=%s ORDER BY seqnum' c.execute(q, (project_id, dataset_type)) rows = c.fetchall() # Make dataset table. print '<table border=1 style="border-collapse:collapse">' print '<tr>' print '<th> Dataset ID </th>' print '<th> Dataset Name </th>' print '<th> Files </th>' print '<th> Events </th>' if dataset_type == 'output': print '<th> Parent Files </th>' print '<th> Parent Events </th>' print '<th> Complete (%) </th>' print '</tr>' for row in rows: print '<tr>' dataset_id = row[0] dataset_name = row[1] nfile = row[2] nev = row[3] pfile = row[4] pev = row[5] parent_id = row[6] # If the parent_id is nonzero, query statistics of parent dataset. pfile2 = 0 pev2 = 0 if parent_id != 0: q2 = 'SELECT files, events FROM datasets WHERE id=%s' c.execute(q2, (parent_id, )) rows2 = c.fetchall() if len(rows2) > 0: row2 = rows2[0] pfile2 = row2[0] pev2 = row2[1] # Calculate complete fraction. frac = 0. if pev2 > 0: frac = float(pev) / float(pev2) print '<td align="center">%d</td>' % dataset_id print '<td> <a href=%s/definitions/name/%s>%s</a> </td>' % \ (dbconfig.samweb_url[experiment], dataset_name, dataset_name) print '<td align="right"> %d </td>' % nfile print '<td align="right"> %d </td>' % nev if dataset_type == 'output': print '<td align="right"> %d </td>' % pfile print '<td align="right"> %d </td>' % pev print '<td align="right"> %6.2f </td>' % (100. * frac) # Add Update button/column print '<td>' print '<form action="%s/edit_datasets.py?id=%d&update=%d&%s" method="post">' % \ (dbconfig.rel_url, project_id, dataset_id, dbargs.convert_args(qdict)) print '<div title="Update statistics">' print '<input type="submit" value="+Stats" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Edit button/column print '<td>' print '<form target="_self" action="%s/edit_dataset.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, dataset_id, dbargs.convert_args(qdict)) print '<div title="Edit dataset">' print '<input type="submit" value="✎" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Clone button/column print '<td>' print '<form action="%s/clone_dataset.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, dataset_id, dbargs.convert_args(qdict)) print '<div title="Clone dataset">' print '<input type="submit" value="⎘" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Delete button/column print '<td>' print '<form action="%s/delete_dataset.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, dataset_id, dbargs.convert_args(qdict)) print '<div title="Delete dataset">' print '<input type="submit" value="🗑" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Up button/column print '<td>' print '<form action="%s/up_dataset.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, dataset_id, dbargs.convert_args(qdict)) print '<div title="Move up">' print '<input type="submit" value="▲" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Down button/column print '<td>' print '<form action="%s/down_dataset.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, dataset_id, dbargs.convert_args(qdict)) print '<div title="Move down">' print '<input type="submit" value="▼" %s>' % disabled print '</div>' print '</form>' print '</td>' # Finish row. print '</tr>' # Finish table. print '</table>'
def substage_form(cnx, id, qdict): # Construct global disabled option for restricted controls. disabled = '' if not dbconfig.restricted_access_allowed() and dbutil.restricted_access( cnx, 'substages', id): disabled = 'disabled' # Query substage from database. c = cnx.cursor() q = 'SELECT %s FROM substages WHERE id=%%s' % dbutil.columns('substages') c.execute(q, (id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch substage id %d' % id) row = rows[0] fclname = row[1] stage_id = row[2] # Query stage name and project id. q = 'SELECT id, name, project_id FROM stages WHERE id=%s' c.execute(q, (stage_id, )) stage_rows = c.fetchall() if len(stage_rows) == 0: raise IOError('Unable to fetch stage id %d' % stage_id) stage_row = stage_rows[0] stage_name = stage_row[1] project_id = stage_row[2] project_name = dbutil.get_project_name(cnx, project_id) # Generate form. print '<h2>Project %s</h2>' % project_name print '<h2>Stage %s</h2>' % stage_name print '<h2>FCL %s</h2>' % fclname print '<form action="%s/dbhandler.py" method="post">' % dbconfig.rel_url # Add hidden input field to store table name. print '<input type="hidden" id="table" name="table" value="substages">' # Add hidden input field to store save url (parent of this page). print '<input type="hidden" id="saveurl" name="saveurl" value="%s/edit_stage.py?id=%d&%s">' % \ (dbconfig.base_url, stage_id, dbargs.convert_args(qdict)) # Add hidden qdict input fields. for key in qdict: print '<input type="hidden" name="%s" value="%s">' % ( dbutil.convert_str(key), dbutil.convert_str(qdict[key])) # Loop over fields of this stage. # Put fields in a table. print '<table border=1 style="border-collapse:collapse">' cols = databaseDict['substages'] for n in range(len(cols)): coltup = cols[n] colname = coltup[0] coltype = coltup[2] colarray = coltup[3] coldesc = coltup[4] if colname != '': # Set readonly attribute readonly = '' if colname == 'id' or colname == 'stage_id': readonly = 'readonly' elif disabled != '': readonly = 'readonly' print '<tr>' print '<td>' print '<label for="%s">%s: </label>' % (colname, coldesc) print '</td>' print '<td>' if colarray == 0: # Scalar column. if coltype[0:3] == 'INT': print '<input type="number" id="%s" name="%s" size=10 value="%d" %s>' % \ (colname, colname, row[n], readonly) elif coltype[0:6] == 'DOUBLE': print '<input type="text" id="%s" name="%s" size=100 value="%8.6f" %s>' % \ (colname, colname, row[n], readonly) elif coltype[0:7] == 'VARCHAR': print '<input type="text" id="%s" name="%s" size=100 value="%s" %s>' % \ (colname, colname, row[n], readonly) else: # Array columns. # Display using multiline <textarea>. strs = dbutil.get_strings(cnx, row[n]) print '<textarea id="%s" name="%s" rows=%d cols=80 %s>' % \ (colname, colname, max(len(strs), 1), readonly) print '\n'.join(strs) print '</textarea>' print '</td>' print '</tr>' # Finish table. print '</table>' # Add "Save" and "Back" buttons. print '<input type="submit" name="submit" value="Save" %s>' % disabled print '<input type="submit" name="submit" value="Update" %s>' % disabled print '<input type="submit" name="submit" value="Back">' print '</form>'
sys.exit(0) # Maybe view form summary. if 'view' in argdict: view(qdict, argdict) sys.exit(0) # If the user hit the cancel button, redirect to project list. if 'cancel' in argdict: # Calculate redirect url. url = '%s/query_projects.py?%s' % (dbconfig.base_url, dbargs.convert_args(qdict)) # Generate redirect html document. print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>' sys.exit(0)
def project_form(cnx, id, qdict): # Construct global disabled option for restricted controls. disabled = '' if not dbconfig.restricted_access_allowed() and dbutil.restricted_access( cnx, 'projects', id): disabled = 'disabled' # Construct disable option that applies only to status options. option_disabled = '' if not dbconfig.restricted_access_allowed(): option_disabled = 'disabled' # Get project name. name = dbutil.get_project_name(cnx, id) # Get experiment. experiment = dbutil.get_project_experiment(cnx, id) # Generate form. print '<h2>Project %s</h2>' % name # Add button to insert another stage. print '<h2>Stages</h2>' print '<form action="%s/add_stage.py?id=%d&%s" method="post" target="_self">' % \ (dbconfig.rel_url, id, dbargs.convert_args(qdict)) print '<input type="submit" value="Add Stage" %s>' % disabled print '</form>' print '<br>' # Query stage ids belonging to this project. c = cnx.cursor() q = 'SELECT id, name FROM stages WHERE project_id=%s ORDER BY seqnum' c.execute(q, (id, )) rows = c.fetchall() if len(rows) > 0: # Add links to edit project stages. print '<table border=1 style="border-collapse:collapse">' print '<tr>' print '<th> Stage ID </th>' print '<th> Stage Name </th>' print '</tr>' for row in rows: print '<tr>' stage_id = row[0] stage_name = row[1] print '<td align="center">%d</td>' % stage_id print '<td> <a target="_self" href="%s/edit_stage.py?id=%d&%s">%s</a> </td>' % \ (dbconfig.base_url, stage_id, dbargs.convert_args(qdict), stage_name) # Add Edit button/column print '<td>' print '<form target="_self" action="%s/edit_stage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, stage_id, dbargs.convert_args(qdict)) print '<div title="Edit stage">' print '<input type="submit" value="✎">' print '</div>' print '</form>' print '</td>' # Add Clone button/column print '<td>' print '<form target="_self" action="%s/clone_stage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, stage_id, dbargs.convert_args(qdict)) print '<div title="Clone stage">' print '<input type="submit" value="⎘" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Delete button/column print '<td>' print '<form action="%s/delete_stage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, stage_id, dbargs.convert_args(qdict)) print '<div title="Delete stage">' print '<input type="submit" value="🗑" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Up button/column print '<td>' print '<form action="%s/up_stage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, stage_id, dbargs.convert_args(qdict)) print '<div title="Move up">' print '<input type="submit" value="▲" %s>' % disabled print '</div>' print '</form>' print '</td>' # Add Down button/column print '<td>' print '<form action="%s/down_stage.py?id=%d&%s" method="post">' % \ (dbconfig.rel_url, stage_id, dbargs.convert_args(qdict)) print '<div title="Move down">' print '<input type="submit" value="▼" %s>' % disabled print '</div>' print '</form>' print '</td>' # Finish row. print '</tr>' # Finish table. print '</table>' print '<h2>Project Data</h2>' # Query full project from database. q = 'SELECT %s FROM projects WHERE id=%%s' % dbutil.columns('projects') c.execute(q, (id, )) rows = c.fetchall() if len(rows) == 0: raise IOError('Unable to fetch project id %d' % id) row = rows[0] print '<form action="%s/dbhandler.py" method="post">' % dbconfig.rel_url # Add hidden input field to store table name. print '<input type="hidden" id="table" name="table" value="projects">' # Add hidden input field to store save url (parent of this page). print '<input type="hidden" id="saveurl" name="saveurl" value="%s/query_projects.py?%s">' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) # Add hidden qdict input fields. for key in qdict: print '<input type="hidden" name="%s" value="%s">' % ( dbutil.convert_str(key), dbutil.convert_str(qdict[key])) # Loop over fields of this project. # Put fields in a table. print '<table border=1 style="border-collapse:collapse">' cols = databaseDict['projects'] for n in range(len(cols)): coltup = cols[n] colname = coltup[0] coltype = coltup[2] colarray = coltup[3] coldesc = coltup[4] if colname != '': # Set readonly attribute readonly = '' if colname == 'id': readonly = 'readonly' elif disabled != '': readonly = 'readonly' print '<tr>' print '<td>' print '<label for="%s">%s: </label>' % (colname, coldesc) print '</td>' print '<td>' if colarray == 0: # Scalar column. if coltype[0:3] == 'INT': print '<input type="number" id="%s" name="%s" size=10 value="%d" %s>' % \ (colname, colname, row[n], readonly) elif coltype[0:6] == 'DOUBLE': print '<input type="text" id="%s" name="%s" size=10 value="%8.6f" %s>' % \ (colname, colname, row[n], readonly) elif coltype[0:7] == 'VARCHAR': if colname in pulldowns: print '<select id="%s" name="%s" size=0 %s>' % ( colname, colname, disabled) pulldown_list = pulldowns[colname] if type(pulldown_list) == type({}): if experiment in pulldown_list: pulldown_list = pulldowns[colname][experiment] else: pulldown_list = [''] for value in pulldown_list: sel = '' if value == row[n]: sel = 'selected' if value == '' or value == 'Requested': print '<option value="%s" %s>%s</option>' % ( value, sel, value) else: print '<option value="%s" %s %s>%s</option>' % ( value, sel, option_disabled, value) print '</select>' else: print '<input type="text" id="%s" name="%s" size=100 value="%s" %s>' % \ (colname, colname, row[n], readonly) else: # Array columns. # Display using multiline <textarea>. strs = dbutil.get_strings(cnx, row[n]) print '<textarea id="%s" name="%s" rows=%d cols=80 %s>' % \ (colname, colname, max(len(strs),1), readonly) print '\n'.join(strs) print '</textarea>' print '</td>' print '</tr>' # Finish table. print '</table>' # Add "Save" and "Back" buttons. print '<input type="submit" name="submit" value="Save" %s>' % disabled print '<input type="submit" name="submit" value="Update" %s>' % disabled print '<input type="submit" name="submit" value="Back">' print '</form>'
def main(xmldata, qdict): # Open database connection. cnx = dbconfig.connect(readonly = False, devel = qdict['dev']) if xmldata == '': # If xml data is empty, generate a dialog to browse for local xml name. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Import Project</title>' print '</head>' print '<body>' # Generate a form with file dialog and two buttons "Import" and "Cancel." print '<form action="%s/import_project.py" method="post" enctype="multipart/form-data">' % dbconfig.rel_url for key in qdict: print '<input type="hidden" name="%s" value="%s">' % (dbutil.convert_str(key), dbutil.convert_str(qdict[key])) print '<label for="xmldata">Choose input xml file: </label>' print '<input type="file" id="xmldata" name="data" accept=".xml">' print '<br>' print '<input type="submit" value="Import">' print '<input type="submit" value="Cancel" formaction="%s/query_projects.py?%s">' % \ (dbconfig.rel_url, dbargs.convert_args(qdict)) print '</body>' print '</html>' else: # Got uploaded xml data. # Check any project are not already in database. names = [] try: names = dbutil.xml_project_names(xmldata) except: names = [] if len(names) == 0: # XML error. url = '%s/query_projects.py?%s' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Import Project</title>' print '</head>' print '<body>' print 'Initial XML parsing error.' print '<br><br>' print '<a href=%s>Return to project list</a>.' % url print '</body>' print '</html>' return # See if names already exist in database. ok = False for name in names: id = dbutil.get_project_id(cnx, name) if id == 0: ok = True break if not ok: # All project names are already in database. # Generate informative page. url = '%s/query_projects.py?%s' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Import Project</title>' print '</head>' print '<body>' print 'Project with same name is already in database.' print '<br><br>' print '<a href=%s>Return to project list</a>.' % url print '</body>' print '</html>' return # Insert project in database. ids = [] try: ids = dbutil.import_project(cnx, xmldata) except: #print 'Content-type: text/html' #print #ids = dbutil.import_project(cnx, xmldata) ids = [] if len(ids) > 0: # Import successful. # Redirect to project editor. project_id = ids[0] url = '%s/edit_project.py?id=%d&%s' % \ (dbconfig.base_url, project_id, dbargs.convert_args(qdict)) print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'Import project successful.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>' else: # Import failed. url = '%s/query_projects.py?%s' % \ (dbconfig.base_url, dbargs.convert_args(qdict)) print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Import Project</title>' print '</head>' print '<body>' print 'XML parsing error.' print '<br><br>' print '<a href=%s>Return to project list</a>.' % url print '</body>' print '</html>' # Done. return
def main(project_id, dataset_name, dataset_type, qdict): # Open database connection. cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) c = cnx.cursor() if dataset_name == '': # If dataset name is empty, generate a dialog to query the dataset name. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Add Dataset</title>' print '</head>' print '<body>' # Generate a form with file dialog and two buttons "Import" and "Cancel." print '<h2>Add %s dataset</h2>' % dataset_type print '<form action="%s/add_dataset.py" method="post">' % dbconfig.rel_url for key in qdict: print '<input type="hidden" name="%s" value="%s">' % ( dbutil.convert_str(key), dbutil.convert_str(qdict[key])) print '<input type="hidden" name="id" value=%d>' % project_id print '<input type="hidden" name="type" value=\'%s\'>' % dataset_type print '<label for="dataset_name">Dataset Name: </label>' print '<input type="text" id="dataset_name" name="name">' print '<br>' print '<input type="submit" value="Add">' print '<input type="submit" value="Cancel" formaction="%s/edit_datasets.py">' % dbconfig.rel_url print '</form>' print '</body>' print '</html>' else: # Maybe insert dataset. dataset_id = dbutil.add_dataset(cnx, project_id, dataset_type, dataset_name) if dataset_id == 0: # This dataset name is already used. # Generate informative page. url = '%s/edit_datasets.py?id=%d&%s' % \ (dbconfig.base_url, project_id, dbargs.convert_args(qdict)) print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<head>' print '<title>Add Dataset</title>' print '</head>' print '<body>' print 'Dataset with same name is already in database.' print '<br><br>' print '<a href=%s>Return to dataset list</a>.' % url print '</body>' print '</html>' return else: # Insert succeeded. # Redirect to dataset list. url = '%s/edit_datasets.py?id=%d&%s' % \ (dbconfig.base_url, project_id, dbargs.convert_args(qdict)) print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' print 'Dataset addition successful.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url print '</body>' print '</html>' # Done. return