def main(id, qdict): # Open database connection. cnx = dbconfig.connect(readonly=True, devel=qdict['dev']) # Get project name. name = dbutil.get_project_name(cnx, id) # Generate html document header. print 'Content-type: text/plain' print # Generate main part of html document. if id == 0 or name == '': print 'No such project.' else: # Generate POMS ini file. ini = StringIO.StringIO() dbutil.export_poms_project(cnx, id, qdict['dev'], ini) print ini.getvalue()
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(id, qdict): # Open database connection. cnx = dbconfig.connect(readonly=True, devel=qdict['dev']) # Get project name. name = dbutil.get_project_name(cnx, id) # Generate document header. print 'Content-type: text/plain' print # Generate main part of text document. if id == 0 or name == '': print 'No such project.' else: # Generate text. cfg = StringIO.StringIO() dbutil.export_fife_project(cnx, id, cfg) print cfg.getvalue()
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(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, 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(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 find_by_username(cls,username): try: conn = connect() query = 'SELECT * FROM {} WHERE `username`="{}"'.format(cls.tablename,username) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.execute(query) res = cursor.fetchone() return res except Exception as e: print(e) return None finally: close(cursor,conn)
def getByUserId(cls, user_id): try: conn = connect() cursor = conn.cursor(pymysql.cursors.DictCursor) query = "SELECT * FROM {} WHERE `user_id`={}".format( cls.tablename, user_id) cursor.execute(query) res = cursor.fetchall() return res except Exception as e: print(e) return None finally: close(cursor, conn)
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 save(cls,data): try: conn = connect() cursor = conn.cursor() query = "INSERT INTO {}(`username`,`password`) VALUES(%s,%s)".format(cls.tablename) #generate password hash pass_hash = generate_password_hash(data["password"]) bind = (data["username"],pass_hash) cursor.execute(query,bind) conn.commit() return True except Exception as e: print(e) return False finally: close(cursor,conn)
def save(cls, data): try: conn = connect() cursor = conn.cursor() query = "INSERT INTO {}(`user_id`,`website`,`username`,`password`) VALUES(%s,%s,%s,%s)".format( cls.tablename) bind = (data["user"], data["website"], data["username"], data["password"]) cursor.execute(query, bind) conn.commit() return True except Exception as e: print(e) return False finally: close(cursor, conn)
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 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 submit(qdict, argdict): # This function is currently implemented to do the following actions. # # 1. Add a project to the production database. # 2. Optionally store a text document on the web server. # 3. Optionally send an email containing a text summary. # # Whether actions 2 and 3 are taken depends on parameters "email" and "request_dir" # in dbconfig.py. # Generate a request name. # The request name is used to generate the name of the saved text file, # the subject of the email, and the project name in the database. # The request name is required to be different from any existing project name # in the database. The request name is also required to be different from any # request file in the request directory. # Generate a base project name based on project name specified in form, if specified, # or based on a time stamp otherwise. base_name = '' if argdict.has_key('name'): base_name = argdict['name'] else: base_name = 'request_%s' % datetime.datetime.now().strftime( '%Y%m%d_%H%M%S') # Generate a non-existing project name based off base name. n = 0 done = False request_name = '' cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) c = cnx.cursor() while not done: if n == 0: request_name = base_name else: request_name = '%s_%d' % (base_name, n) # See if this candidate name already exists. q = 'SELECT COUNT(*) FROM projects WHERE name=%s' c.execute(q, (request_name, )) row = c.fetchone() count = row[0] if count == 0: done = True else: n += 1 # Check request directory. if done and dbconfig.request_dir != '': rfn = '%s/%s.txt' % (dbconfig.request_dir, request_name) if os.path.exists(rfn): done = False n += 1 # Generate html document header. print 'Content-type: text/html' print print '<!DOCTYPE html>' print '<html>' print '<body>' # Maybe add request file. if dbconfig.request_dir != '': if not os.path.isdir(dbconfig.request_dir): os.makedirs(dbconfig.request_dir) # Make new request file. rfn = '%s/%s.txt' % (dbconfig.request_dir, request_name) f = open(rfn, 'w') f.write(gentext(argdict)) f.close() # Maybe send email. if dbconfig.email != '': p = subprocess.Popen(['sendmail', dbconfig.email], stdin=subprocess.PIPE) message = 'Subject:Sample request %s\n%s' % (request_name, gentext(argdict)) p.communicate(input=message) p.wait() # Construct query to add project. # Use values from form, or defaults. cols = databaseDict['projects'] q = 'INSERT INTO projects SET name=%s' params = [request_name] # Loop over columns. for n in range(2, len(cols)): coltup = cols[n] colname = coltup[0] coltype = coltup[2] colarray = coltup[3] value = coltup[5] # Update default values. if colname == 'username' and argdict.has_key('user'): value = argdict['user'] elif colname == 'description' and argdict.has_key('description'): value = argdict['description'] elif colname == 'experiment' and argdict.has_key('exp'): value = argdict['exp'] elif colname == 'file_type' and argdict.has_key('ftype'): value = argdict['ftype'] elif colname == 'role' and argdict.has_key('role'): value = argdict['role'] elif colname == 'campaign' and argdict.has_key('camp'): value = argdict['camp'] elif colname == 'physics_group' and argdict.has_key('wgroup'): value = argdict['wgroup'] elif colname == 'status': value = 'Requested' elif colname == 'num_events' and argdict.has_key('num_events'): value = argdict['num_events'] elif colname == 'num_jobs' and argdict.has_key('num_jobs'): value = argdict['num_jobs'] elif colname == 'max_files_per_job' and argdict.has_key('max_files'): value = argdict['max_files'] elif colname == 'release_tag' and argdict.has_key('version'): value = argdict['version'] elif colname == 'version' and argdict.has_key('version'): value = 'test_%s' % argdict['version'] elif colname == 'validate_on_worker': value = 1 # Update query to include this column if colarray: q += ',%s=%%s' % colname params.append(value) elif coltype[:3] == 'INT': q += ',%s=%%s' % colname params.append(value) elif coltype[:7] == 'VARCHAR': if value != None: q += ',%s=%%s' % colname params.append(value.replace('&', '&')) elif coltype[:6] == 'DOUBLE': q += ',%s=%%s' % colname params.append(value) # Execute query. c.execute(q, params) # Get id of inserted row. q = 'SELECT LAST_INSERT_ID()' c.execute(q) row = c.fetchone() new_project_id = row[0] # Generate a list of stage keys in argdict. stage_keys = [] for key in argdict: if key.startswith('stage_'): stage_keys.append(key) # Loop over stage keys in ascending order. stage_names = set() for stage_key in sorted(stage_keys): # Get the stage name for this key. stage_name = argdict[stage_key] # Only process this stage name if it hasn't already been seen. if stage_name not in stage_names: stage_names.add(stage_name) # Construct a query to insert a new stage row in database. stage_cols = databaseDict['stages'] q = 'INSERT INTO stages SET name=%s,project_id=%s,seqnum=%s' params = [stage_name, new_project_id, len(stage_names)] # Loop over columns. for n in range(4, len(stage_cols)): stage_coltup = stage_cols[n] stage_colname = stage_coltup[0] stage_coltype = stage_coltup[2] stage_colarray = stage_coltup[3] value = stage_coltup[5] # Update default values. mem_key = 'memory_%s' % stage_key[6:] project_name = '' if argdict.has_key('name'): project_name = argdict['name'] else: project_name = request_name if stage_colname == 'memory' and argdict.has_key(mem_key): value = argdict[mem_key] elif stage_colname == 'inputdef' and len( stage_names) == 1 and argdict.has_key('input'): value = argdict['input'] elif (stage_colname == 'outdir' or stage_colname == 'logdir') and \ argdict.has_key('user') and argdict.has_key('exp'): value = '/pnfs/%s/scratch/users/%s/output/%s/%s' % ( argdict['exp'], argdict['user'], project_name, stage_name) elif stage_colname == 'workdir' and argdict.has_key( 'user') and argdict.has_key('exp'): value = '/pnfs/%s/resilient/users/%s/work/%s/%s' % ( argdict['exp'], argdict['user'], project_name, stage_name) elif stage_colname == 'bookdir' and argdict.has_key( 'user') and argdict.has_key('exp'): value = '/%s/data/users/%s/book/%s/%s' % ( argdict['exp'], argdict['user'], project_name, stage_name) elif stage_colname == 'num_events' and argdict.has_key( 'num_events'): value = argdict['num_events'] elif stage_colname == 'num_jobs' and argdict.has_key( 'num_jobs'): value = argdict['num_jobs'] elif stage_colname == 'max_files_per_job' and argdict.has_key( 'max_files'): value = argdict['max_files'] elif stage_colname == 'schema_' and argdict.has_key('schema'): value = argdict['schema'] # Update query to include this column if stage_colarray: q += ',%s=%%s' % stage_colname params.append(value) elif stage_coltype[:3] == 'INT': q += ',%s=%%s' % stage_colname params.append(value) elif stage_coltype[:7] == 'VARCHAR': if value != None: q += ',%s=%%s' % stage_colname params.append(value.replace('&', '&')) elif stage_coltype[:6] == 'DOUBLE': q += ',%s=%%s' % stage_colname params.append(value) # Execute query. c.execute(q, params) # Get id of inserted row. q = 'SELECT LAST_INSERT_ID()' c.execute(q) row = c.fetchone() new_stage_id = row[0] # Find fcl files associated with this stage name. fcl_keys = [] for key in argdict.keys(): if key.startswith('stage_') and argdict[key] == stage_name: fcl_key = 'fcl_%s' % key[6:] if argdict.has_key(fcl_key): fcl_keys.append(fcl_key) # Loop over fcl keys in ascending order. seq = 0 for fcl_key in sorted(fcl_keys): seq += 1 # Get fcl name for this key. fcl_name = argdict[fcl_key] # Construct a query to insert a new substage row in the database. substage_cols = databaseDict['substages'] q = 'INSERT INTO substages SET fclname=%s,stage_id=%s,seqnum=%s' params = [fcl_name, new_stage_id, seq] # Loop over columns. for n in range(4, len(substage_cols)): substage_coltup = substage_cols[n] substage_colname = substage_coltup[0] substage_coltype = substage_coltup[2] substage_colarray = substage_coltup[3] value = substage_coltup[5] # Update query to include this column if substage_colarray: q += ',%s=%%s' % substage_colname params.append(value) elif substage_coltype[:3] == 'INT': q += ',%s=%%s' % substage_colname params.append(value) elif substage_coltype[:7] == 'VARCHAR': if value != None: q += ',%s=%%s' % substage_colname params.append(value.replace('&', '&')) elif substage_coltype[:6] == 'DOUBLE': q += ',%s=%%s' % substage_colname params.append(value) # Execute query. c.execute(q, params) # Commit database updates. cnx.commit() # Generate message. print 'Sample request %s submitted.' % request_name print '<br><br>' # Add hidden form data with some buttons. print '<form action="%s/request.py" method="post" target="_self">' % dbconfig.rel_url # Add hidden form data. for key in qdict: print '<input type="hidden" name="%s" value="%s">' % ( dbutil.convert_str(key), dbutil.convert_str(qdict[key])) for key in argdict: if key != 'submit': print '<input type="hidden" name="%s" value="%s">' % ( dbutil.convert_str(key), dbutil.convert_str(argdict[key])) # Add buttons. print '<input type="submit" name="reload" value="Back">' # Done with form. print '<form>' # Generate document trailer. print '</body>' print '</html>' # Done. return
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 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, 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
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(argdict): # Open database connection. qdict = dbargs.extract_qdict(argdict) cnx = dbconfig.connect(readonly=False, devel=qdict['dev']) # Get table name and id (primary key). # Both of these values should exist and be non-null, or else operation will fail. table = '' id = 0 saveurl = '' update_db = False if 'table' in argdict: table = argdict['table'] if 'id' in argdict: id = int(argdict['id']) if 'saveurl' in argdict and 'submit' in argdict and \ (argdict['submit'] == 'Save' or argdict['submit'] == 'Back'): saveurl = argdict['saveurl'] if 'submit' in argdict and (argdict['submit'] == 'Save' or argdict['submit'] == 'Update'): update_db = True # Check access restrictions. if not dbconfig.restricted_access_allowed(): # Check whether this table/id is restricted access. if dbutil.restricted_access(cnx, table, id): dbutil.restricted_error() # If the projects table is being updated to a status which is anything other # than '' or 'Requested', it is an error. if table == 'projects' and 'status' in argdict and \ argdict['status'] != '' and argdict['status'] != 'Requested': dbutil.restricted_error() if update_db: # Update database. c = cnx.cursor() q = 'UPDATE %s SET ' % table params = [] # Loop over columns of this table. cols = databaseDict[table] first = True for n in range(len(cols)): coltup = cols[n] colname = coltup[0] coltype = coltup[2] colarray = coltup[3] coldesc = coltup[4] if colname != '' and colname != 'id': # Did form supply a value for this column? if colname in argdict: # Maybe add separator. if first: first = False else: q += ', ' # Add value. if colarray == 0: # Scalar column. if coltype[0:3] == 'INT': q += '%s=%%s' % colname params.append(int(argdict[colname])) elif coltype[0:6] == 'DOUBLE': q += '%s=%%s' % colname params.append(float(argdict[colname])) elif coltype[0:7] == 'VARCHAR': q += '%s=%%s' % colname params.append(argdict[colname]) else: # String array. strs = argdict[colname].split() strid = dbutil.update_strings(cnx, strs) q += '%s=%%s' % colname params.append(strid) # Add where clause. q += ' WHERE id=%s' params.append(id) # Run query. c.execute(q, params) # Special handling for table groups. if table == 'groups': # Loop over arguments to find projects to add to this group. project_ids = [] for k in argdict: if k.startswith('add'): project_ids.append(int(argdict[k])) # Loop over projects. for project_id in project_ids: q = 'INSERT INTO group_project SET group_id=%s,project_id=%s' c.execute(q, (id, project_id)) # Loop over arguments to find projects to remove from this group. project_ids = [] for k in argdict: if k.startswith('remove'): project_ids.append(int(argdict[k])) # Loop over projects. for project_id in project_ids: q = 'DELETE FROM group_project WHERE group_id=%s AND project_id=%s' c.execute(q, (id, project_id)) # Commit updates. cnx.commit() # Calculate redirect url. url = '%s/query_projects.py' % dbconfig.base_url if saveurl != '': url = saveurl elif 'HTTP_REFERER' in os.environ: url = os.environ['HTTP_REFERER'] # Generate html redirect document. print 'Content-type: text/html' print 'Status: 303 See Other' print 'Location: %s' % url print print '<!DOCTYPE html>' print '<html>' print '<body>' if table != '': print 'Database table "%s" updated.' % table else: print 'Database not updated.' print '<br><br>' print 'If page does not automatically reload click this <a href=%s>link</a>' % url 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 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>'