def action(req, fields): req.write(InstDB.header("Edit profile")) if not InstDB.AssertLogin(req): req.write(InstDB.footer()) return itemCells = UsersHelper.edit_cell_format itemFields = InstDB.cells_to_fields(itemCells) errmsg = None # Was Save button clicked? - Update field values if fields.get("Save", None): data = fields password = fields.get("Password", "") verify = fields.get("PassVerify", "") email = fields.get("UserEmail", "") if len(password) > 0 and len(password) < 5: errmsg = "Passwords must be 5-32 characters, leave blank for no change" if not errmsg and password != verify: errmsg = "Password and Verify don't match" if not errmsg: n = string.find(email, "@") n2 = string.find(email, " ") if n <= 0 or n == len(email) - 1 or n2 >= 0: errmsg = "A valid email address is required" if not errmsg: update = UsersHelper.sql_update(itemFields, fields) if password: update.setnesc["Password"] = '******' \ % MySQLdb.escape_string (password + InstDB.FuKraXor) update.where = ("UserId=%d" % InstDB.User["UserId"], ) # Use login if UserName not set if not fields.get("UserName", None): update.setnesc["UserName"] = "******" if update.set.get("UserName"): del update.set["UserName"] InstDB.Cur.execute(update.query()) req.write("<font size=+1>User profile updated</font>\n<p>\n") else: req.write('<font class="error">%s</font><p>\n' % errmsg) else: # First page load? sel = UsersHelper.sql_select(itemFields) sel.where.insert(0, "UserId=%d" % InstDB.User["UserId"]) InstDB.Cur.execute(sel.query()) data = InstDB.Cur.fetchone() tab = (("Password", "<input type=password name=Password>"), ("Verify", "<input type=password name=PassVerify>")) tab += tuple(UsersHelper.form_cell_vals(itemCells, data)) tab += (("<input type=submit name=Save value=\"Save\">\n", ), ) # Display form box = InstDB.html_box() req.write(box.start("User Profile")) req.write( "<table border=0 cellpadding=8>\n<tr>\n<td valign=top bgcolor=#408ee6>\n" ) req.write("<form action=\"patches.py?Action=profile\" method=POST>\n") split = InstDB.tabsplits(tab) req.write(split.render()) req.write("</form>\n") req.write("</td>\n<td valign=top>\n") req.write("<vr>\n</td>\n<td valign=top>\n") req.write(InstDB.IncFile("profile.inc")) req.write("</td>\n</tr>\n</table>\n") req.write(box.end()) req.write(InstDB.footer())
def action(req, fields): req.write(InstDB.header("Patch submission")) if not InstDB.AssertLogin(req): req.write(InstDB.footer()) return req.write(""" Upload files to <a href="ftp://sounds.resonance.org/incoming/">ftp://sounds.resonance.org/incoming/</a>. It is recommended that you read the <a href="patches.py?Action=help&Topic=submit">Content Submission Help</a>. <p> """) # Check if any incoming files have been selected Files = fields.getlist("Files") for fname in Files: (evil, fname) = os.path.split(fname) # Make sure no path of evil if not os.path.isfile(InstDB.IncomingPath + os.sep + fname): InstDB.error(req, "File not found '%s'" % cgi.escape(fname)) else: # Create new import queue task (don't activate yet) InstDB.Cur.execute( "INSERT INTO Queue" " (Type, Status, FileName, UserId)" " VALUES ('Import', 'Queued', %s, %s)", (fname, InstDB.User["UserId"])) # Get list of files in incoming directory file_list = os.listdir(InstDB.IncomingPath) file_list.sort() box = InstDB.html_box() box.tableattr = 'width="100%"' req.write(box.start("Incoming files")) req.write("<form action=\"patches.py?Action=submit\" method=POST>\n") if file_list: table = InstDB.tabular(("Import", "File", "Size", "Date")) table.tableattr = 'width="100%"' for file in file_list: check = "<input type=checkbox name=Files value=\"%s\">" \ % cgi.escape (file) stats = os.stat(InstDB.IncomingPath + "/" + file) req.write( table.addrow((check, cgi.escape(file), InstDB.pretty_size(stats.st_size), time.ctime(stats.st_mtime)))) req.write(table.end()) else: req.write("<b>No files in incoming directory</b><br>\n") req.write(box.end()) req.write("<center><input type=submit name=FileSelect" " value=\"Import and/or Refresh\"></center>\n") req.write("</form>\n") req.write("<p><p>\n") # Get queued tasks box = InstDB.html_box() box.tableattr = 'width="100%"' req.write(box.start("Your queued tasks")) sel = SqlHelpers.Select() sel.fields = ("QueueId", "Type", "Status", "UserId", "FileName", "Date") sel.tables = ("Queue", ) sel.where = ("Type in ('Import','Activate')", ) sel.orderby = "QueueId" InstDB.Cur.execute(sel.query()) table = InstDB.tabular( ("Position", "File Name", "Action", "Status", "Start Time")) table.tableattr = 'width="100%"' index = 0 any = False for row in InstDB.Cur.fetchall(): if row["UserId"] == InstDB.User["UserId"]: any = True if row["Status"] != "Error": ndxval = index status = row["Status"] else: ndxval = "N/A" status = '<font class="Error">' + row["Status"] + '</font>' req.write( table.addrow((ndxval, cgi.escape(row["FileName"]), row["Type"], status, row["Date"]))) if row["Status"] != "Error": index += 1 if any: req.write(table.end()) else: req.write("<b>No queued tasks</b><br>\n") req.write(box.end()) req.write("<p><p>\n") # Any activation form data submitted? Group fields by patch ID. patchFields = {} if fields.get("Activate", None): for field in fields.list: # Fields have "P<PatchId>_" prefix match = re.match("P([0-9]{1,10})_(.+)", field.name) if match: patchId = match.group(1) if not patchFields.get(patchId, None): patchFields[patchId] = {} patchFields[patchId][match.group(2)] = fields[field.name] # Files pending activation box = InstDB.html_box() box.tableattr = 'width="100%"' req.write(box.start("Files pending activation")) InstDB.Cur.execute( "SELECT PatchId, PatchType FROM PatchInfo" " WHERE UserId=%s && State='Imported'", InstDB.User["UserId"]) pendRows = InstDB.Cur.fetchall() if pendRows: activateCells = PatchHelper.edit_cell_format activateFields = InstDB.cells_to_fields(activateCells) displayedOne = False for pendRow in pendRows: pFields = patchFields.get(str(pendRow["PatchId"]), None) patchId = int(pendRow["PatchId"]) activate = pFields and pFields.get("Activate", None) errorMsg = "" if pFields: # Form data submitted for this patch? pFields["FileName"] = pFields["FileName"].strip() if not pFields["FileName"]: errorMsg = "File name is required" # Check if filename already used if not errorMsg: InstDB.Cur.execute( "SELECT COUNT(*) AS count FROM PatchInfo" " WHERE PatchId != %s && FileName=%s" " && PatchType=%s", (patchId, pFields["FileName"], pendRow["PatchType"])) if int(InstDB.Cur.fetchone()["count"]) > 0: errorMsg = "File name already in use" if pFields: update = PatchHelper.sql_update(activateFields, pFields) update.set["FileName"] = pFields["FileName"] update.where = ("PatchInfo.PatchId=%d" % patchId, ) if activate and not errorMsg: update.set["State"] = "Activating" InstDB.Cur.execute(update.query()) props_update(patchId, pFields) # Update extra properties # Queue activation task if activate and not errorMsg: InstDB.Cur.execute( "INSERT INTO Queue" " (Type, Status, UserId, ItemId, FileName)" " VALUES ('Activate', 'Queued', %s, %s, %s)", (InstDB.User["UserId"], patchId, "%s.%s" % (pFields["FileName"], pendRow["PatchType"]))) if (not activate or errorMsg) and not displayedOne: req.write( "<form action=\"patches.py?Action=submit\" method=POST>\n") displayedOne = True if errorMsg: req.write('<font class="error">%s</font><br>\n' % cgi.escape(errorMsg)) if not activate or errorMsg: sel = PatchHelper.sql_select(activateFields) sel.fields.insert(0, "PatchInfo.PatchId") sel.where.insert(0, "PatchInfo.PatchId=%d" % patchId) InstDB.Cur.execute(sel.query()) row = InstDB.Cur.fetchone() display_patch(req, row, pFields) if displayedOne: req.write("<input type=submit name=Activate" " value=\"Update\">\n") req.write("</form>\n") else: req.write("<b>No files pending activation</b><br>\n") req.write(box.end()) req.write(InstDB.footer())