def resolve(userid, otherid, othername, myself=True): """ Attempts to determine the userid of a specified user; resolves using otherid, othername, and userid (if myself is True), in that order. If no userid can be resolved, returns 0 instead. """ result = None if otherid: result = d.execute("SELECT userid FROM login WHERE userid = %i", [d.get_int(otherid)], ["element"]) if result: return result elif othername: result = d.execute("SELECT userid FROM login WHERE login_name = '%s'", [d.get_sysname(othername)], ["element"]) if result: return result result = d.execute( "SELECT userid FROM useralias WHERE alias_name = '%s'", [d.get_sysname(othername)], ["element"]) if result: return result elif userid and myself: return userid return 0
def charactersbyuser(userid, form): if userid not in staff.MODS: raise WeasylError("Unexpected") query = d.execute(""" SELECT ch.charid, pr.username, ch.unixtime, ch.char_name, ch.age, ch.gender, ch.height, ch.weight, ch.species, ch.content, ch.rating, ch.settings, ch.page_views, pr.config FROM character ch INNER JOIN profile pr ON ch.userid = pr.userid INNER JOIN login ON ch.userid = login.userid WHERE login.login_name = '%s' """, [d.get_sysname(form.name)]) return [{ "contype": 20, "userid": userid, "charid": item[0], "username": item[1], "unixtime": item[2], "title": item[3], "rating": item[10], "settings": item[11], "sub_media": character.fake_media_items(item[0], userid, d.get_sysname(item[1]), item[11]), } for item in query]
def resolve(userid, otherid, othername, myself=True): """ Attempts to determine the userid of a specified user; resolves using otherid, othername, and userid (if myself is True), in that order. If no userid can be resolved, returns 0 instead. """ result = None if otherid: result = d.execute("SELECT userid FROM login WHERE userid = %i", [d.get_int(otherid)], ["element"]) if result: return result elif othername: result = d.execute("SELECT userid FROM login WHERE login_name = '%s'", [d.get_sysname(othername)], ["element"]) if result: return result result = d.execute("SELECT userid FROM useralias WHERE alias_name = '%s'", [d.get_sysname(othername)], ["element"]) if result: return result elif userid and myself: return userid return 0
def select_view(userid, charid, rating, ignore=True, anyway=None): query = _select_character_and_check( userid, charid, rating=rating, ignore=ignore, anyway=anyway == 'anyway') login = define.get_sysname(query['username']) return { 'charid': charid, 'userid': query['userid'], 'username': query['username'], 'user_media': media.get_user_media(query['userid']), 'mine': userid == query['userid'], 'unixtime': query['unixtime'], 'title': query['char_name'], 'age': query['age'], 'gender': query['gender'], 'height': query['height'], 'weight': query['weight'], 'species': query['species'], 'content': query['content'], 'rating': query['rating'], 'settings': query['settings'], 'reported': report.check(charid=charid), 'favorited': favorite.check(userid, charid=charid), 'page_views': query['page_views'], 'friends_only': 'f' in query['settings'], 'hidden_submission': 'h' in query['settings'], 'fave_count': favorite.count(charid, 'character'), 'comments': comment.select(userid, charid=charid), 'sub_media': fake_media_items( charid, query['userid'], login, query['settings']), 'tags': searchtag.select(charid=charid), }
def select_view_api(userid, journalid, anyway=False, increment_views=False): rating = d.get_rating(userid) journal = _select_journal_and_check( userid, journalid, rating=rating, ignore=anyway, anyway=anyway, increment_views=increment_views) content = files.read(files.make_resource(userid, journalid, 'journal/submit')) return { 'journalid': journalid, 'title': journal['title'], 'owner': journal['username'], 'owner_login': d.get_sysname(journal['username']), 'owner_media': api.tidy_all_media( media.get_user_media(journal['userid'])), 'content': text.markdown(content), 'tags': searchtag.select(journalid=journalid), 'link': d.absolutify_url('/journal/%d/%s' % (journalid, text.slug_for(journal['title']))), 'type': 'journal', 'rating': ratings.CODE_TO_NAME[journal['rating']], 'views': journal['page_views'], 'favorites': favorite.count(journalid, 'journal'), 'comments': comment.count(journalid, 'journal'), 'favorited': favorite.check(userid, journalid=journalid), 'friends_only': 'f' in journal['settings'], 'posted_at': d.iso8601(journal['unixtime']), }
def submissionsbyuser(userid, form): if userid not in staff.MODS: raise WeasylError("Unexpected") query = d.execute( """ SELECT su.submitid, su.title, su.rating, su.unixtime, su.userid, pr.username, su.settings FROM submission su INNER JOIN profile pr USING (userid) WHERE su.userid = (SELECT userid FROM login WHERE login_name = '%s') ORDER BY su.submitid DESC """, [d.get_sysname(form.name)]) ret = [{ "contype": 10, "submitid": i[0], "title": i[1], "rating": i[2], "unixtime": i[3], "userid": i[4], "username": i[5], "settings": i[6], } for i in query] media.populate_with_submission_media(ret) return ret
def select_view_api(userid, charid, anyway=False, increment_views=False): rating = define.get_rating(userid) query = _select_character_and_check( userid, charid, rating=rating, ignore=anyway, anyway=anyway, increment_views=increment_views) login = define.get_sysname(query.username) return { 'charid': charid, 'owner': query.username, 'owner_login': login, 'owner_media': api.tidy_all_media(media.get_user_media(query.userid)), 'posted_at': define.iso8601(query.unixtime), 'title': query.char_name, 'age': query.age, 'gender': query.gender, 'height': query.height, 'weight': query.weight, 'species': query.species, 'content': text.markdown(query.content), 'rating': ratings.CODE_TO_NAME[query.rating], 'favorited': favorite.check(userid, charid=charid), 'views': query.page_views, 'friends_only': 'f' in query.settings, 'favorites': favorite.count(charid, 'character'), 'comments': comment.count(charid, 'character'), 'media': fake_media_items(charid, query.userid, login, query.settings, absolutify=True), 'tags': searchtag.select(charid=charid), 'type': 'character', 'link': define.absolutify_url('/character/%d/%s' % (charid, text.slug_for(query.char_name))), }
def select_view_api(userid, journalid, anyway=False, increment_views=False): rating = d.get_rating(userid) journal = _select_journal_and_check( userid, journalid, rating=rating, ignore=anyway, anyway=anyway, increment_views=increment_views) content = files.read(files.make_resource(userid, journalid, 'journal/submit')) return { 'journalid': journalid, 'title': journal['title'], 'owner': journal['username'], 'owner_login': d.get_sysname(journal['username']), 'owner_media': api.tidy_all_media( media.get_user_media(journal['userid'])), 'content': text.markdown(content), 'tags': searchtag.select(journalid=journalid), 'link': d.absolutify_url('/journal/%d/%s' % (journalid, text.slug_for(journal['title']))), 'type': 'journal', 'rating': ratings.CODE_TO_NAME[journal['rating']], 'views': journal['page_views'], 'favorites': favorite.count(journalid, 'journal'), 'comments': comment.count(journalid, 'journal'), 'favorited': favorite.check(userid, journalid=journalid), 'friends_only': 'f' in journal['settings'], 'posted_at': d.iso8601(journal['unixtime']), }
def select_view(userid, charid, rating, ignore=True, anyway=None): query = _select_character_and_check( userid, charid, rating=rating, ignore=ignore, anyway=anyway=='anyway') login = define.get_sysname(query.username) return { 'charid': charid, 'userid': query.userid, 'username': query.username, 'user_media': media.get_user_media(query.userid), 'mine': userid == query.userid, 'unixtime': query.unixtime, 'title': query.char_name, 'age': query.age, 'gender': query.gender, 'height': query.height, 'weight': query.weight, 'species': query.species, 'content': query.content, 'rating': query.rating, 'settings': query.settings, 'reported': report.check(charid=charid), 'favorited': favorite.check(userid, charid=charid), 'page_views': query.page_views, 'friends_only': 'f' in query.settings, 'hidden_submission': 'h' in query.settings, 'fave_count': favorite.count(charid, 'character'), 'comments': comment.select(userid, charid=charid), 'sub_media': fake_media_items(charid, query.userid, login, query.settings), 'tags': searchtag.select(charid=charid), }
def select_view(userid, charid, rating, ignore=True, anyway=None): query = define.execute(""" SELECT ch.userid, pr.username, ch.unixtime, ch.char_name, ch.age, ch.gender, ch.height, ch.weight, ch.species, ch.content, ch.rating, ch.settings, ch.page_views, pr.config FROM character ch INNER JOIN profile pr USING (userid) WHERE ch.charid = %i """, [charid], options=["single", "list"]) if query and userid in staff.MODS and anyway == "true": pass elif not query or "h" in query[11]: raise WeasylError("characterRecordMissing") elif query[10] > rating and ((userid != query[0] and userid not in staff.MODS) or define.is_sfw_mode()): raise WeasylError("RatingExceeded") elif "f" in query[11] and not frienduser.check(userid, query[0]): raise WeasylError("FriendsOnly") elif ignore and ignoreuser.check(userid, query[0]): raise WeasylError("UserIgnored") elif ignore and blocktag.check(userid, charid=charid): raise WeasylError("TagBlocked") if define.common_view_content(userid, charid, "char"): query[12] += 1 login = define.get_sysname(query[1]) return { "charid": charid, "userid": query[0], "username": query[1], "user_media": media.get_user_media(query[0]), "mine": userid == query[0], "unixtime": query[2], "title": query[3], "age": query[4], "gender": query[5], "height": query[6], "weight": query[7], "species": query[8], "content": query[9], "rating": query[10], "settings": query[11], "reported": report.check(charid=charid), "favorited": favorite.check(userid, charid=charid), "page_views": query[12], "friends_only": "f" in query[11], "hidden_submission": "h" in query[11], # todo "fave_count": define.execute("SELECT COUNT(*) FROM favorite WHERE (targetid, type) = (%i, 'f')", [charid], ["element"]), "comments": comment.select(userid, charid=charid), "sub_media": fake_media_items(charid, query[0], login, query[11]), "tags": searchtag.select(charid=charid), }
def select_char(userid, rating, limit, otherid=None, backid=None, nextid=None, config=None): if config is None: config = d.get_config(userid) query = [] statement = [""" SELECT ch.charid, ch.char_name, ch.rating, fa.unixtime, ch.userid, pr.username, ch.settings FROM favorite fa INNER JOIN character ch ON fa.targetid = ch.charid INNER JOIN profile pr ON ch.userid = pr.userid WHERE fa.type = 'f' AND ch.settings !~ 'h' """] if userid: # filter own content in SFW mode if d.is_sfw_mode(): statement.append(" AND (ch.rating <= %i)" % (rating,)) else: statement.append(" AND (ch.userid = %i OR ch.rating <= %i)" % (userid, rating)) statement.append(m.MACRO_FRIENDUSER_CHARACTER % (userid, userid, userid)) statement.append(m.MACRO_IGNOREUSER % (userid, "ch")) statement.append(m.MACRO_BLOCKTAG_CHAR % (userid, userid)) else: statement.append(" AND ch.rating <= %i AND ch.settings !~ 'f'" % (rating,)) if otherid: statement.append(" AND fa.userid = %i" % (otherid,)) if backid: statement.append(" AND fa.unixtime > " "(SELECT unixtime FROM favorite WHERE (userid, targetid, type) = (%i, %i, 'f'))" % (otherid, backid)) elif nextid: statement.append(" AND fa.unixtime < " "(SELECT unixtime FROM favorite WHERE (userid, targetid, type) = (%i, %i, 'f'))" % (otherid, nextid)) statement.append(" ORDER BY fa.unixtime%s LIMIT %i" % ("" if backid else " DESC", limit)) from weasyl import character query = [{ "contype": 20, "charid": i[0], "title": i[1], "rating": i[2], "unixtime": i[3], "userid": i[4], "username": i[5], "sub_media": character.fake_media_items(i[0], i[4], d.get_sysname(i[5]), i[6]), } for i in d.execute("".join(statement))] return query[::-1] if backid else query
def journalsbyuser(userid, form): if userid not in staff.MODS: raise WeasylError("Unexpected") results = d.engine.execute(""" SELECT journalid, title, journal.settings, journal.unixtime, rating, profile.username, 30 contype FROM journal JOIN profile USING (userid) JOIN login USING (userid) WHERE login_name = %(sysname)s """, sysname=d.get_sysname(form.name)).fetchall() return map(dict, results)
def charactersbyuser(userid, form): if userid not in staff.MODS: raise WeasylError("Unexpected") query = d.execute( """ SELECT ch.charid, pr.username, ch.unixtime, ch.char_name, ch.age, ch.gender, ch.height, ch.weight, ch.species, ch.content, ch.rating, ch.settings, ch.page_views, pr.config FROM character ch INNER JOIN profile pr ON ch.userid = pr.userid INNER JOIN login ON ch.userid = login.userid WHERE login.login_name = '%s' """, [d.get_sysname(form.name)]) return [{ "contype": 20, "userid": userid, "charid": item[0], "username": item[1], "unixtime": item[2], "title": item[3], "rating": item[10], "settings": item[11], "sub_media": character.fake_media_items(item[0], userid, d.get_sysname(item[1]), item[11]), } for item in query]
def journalsbyuser(userid, form): if userid not in staff.MODS: raise WeasylError("Unexpected") results = d.engine.execute(""" SELECT journalid, title, journal.settings, journal.unixtime, rating, profile.username, 30 contype FROM journal JOIN profile USING (userid) JOIN login USING (userid) WHERE login_name = %(sysname)s """, sysname=d.get_sysname(form.name)).fetchall() return map(dict, results)
def select_list(userid, rating, limit, otherid=None, backid=None, nextid=None, options=[], config=None): statement = ["SELECT ch.charid, ch.char_name, ch.rating, ch.unixtime, ch.userid, pr.username, ch.settings "] statement.extend(select_query(userid, rating, otherid, backid, nextid, options, config)) statement.append(" ORDER BY ch.charid%s LIMIT %i" % ("" if backid else " DESC", limit)) query = [] for i in define.execute("".join(statement)): query.append({ "contype": 20, "charid": i[0], "title": i[1], "rating": i[2], "unixtime": i[3], "userid": i[4], "username": i[5], "sub_media": fake_media_items(i[0], i[4], define.get_sysname(i[5]), i[6]), }) return query[::-1] if backid else query
def manageuser(userid, form): if userid not in staff.MODS: raise WeasylError("Unexpected") query = d.execute( "SELECT userid, username, config, profile_text, catchphrase FROM profile" " WHERE userid = (SELECT userid FROM login WHERE login_name = '%s')", [d.get_sysname(form.name)], ["single"]) if not query: raise WeasylError("noUser") return { "userid": query[0], "username": query[1], "config": query[2], "profile_text": query[3], "catchphrase": query[4], "user_media": media.get_user_media(query[0]), "staff_notes": shout.count(query[0], staffnotes=True), }
def select_list(userid, rating, limit, otherid=None, backid=None, nextid=None, options=[], config=None): statement = ["SELECT ch.charid, ch.char_name, ch.rating, ch.unixtime, ch.userid, pr.username, ch.settings "] statement.extend(select_query(userid, rating, otherid, backid, nextid, options, config)) statement.append(" ORDER BY ch.charid%s LIMIT %i" % ("" if backid else " DESC", limit)) query = [] for i in define.execute("".join(statement)): query.append({ "contype": 20, "charid": i[0], "title": i[1], "rating": i[2], "unixtime": i[3], "userid": i[4], "username": i[5], "sub_media": fake_media_items(i[0], i[4], define.get_sysname(i[5]), i[6]), }) return query[::-1] if backid else query
def manageuser(userid, form): if userid not in staff.MODS: raise WeasylError("Unexpected") query = d.execute( "SELECT userid, username, config, profile_text, catchphrase FROM profile" " WHERE userid = (SELECT userid FROM login WHERE login_name = '%s')", [d.get_sysname(form.name)], ["single"]) if not query: raise WeasylError("noUser") return { "userid": query[0], "username": query[1], "config": query[2], "profile_text": query[3], "catchphrase": query[4], "user_media": media.get_user_media(query[0]), "staff_notes": shout.count(query[0], staffnotes=True), }
def select_view_api(userid, charid, anyway=False, increment_views=False): rating = define.get_rating(userid) query = _select_character_and_check( userid, charid, rating=rating, ignore=anyway, anyway=anyway, increment_views=increment_views) login = define.get_sysname(query['username']) return { 'charid': charid, 'owner': query['username'], 'owner_login': login, 'owner_media': api.tidy_all_media( media.get_user_media(query['userid'])), 'posted_at': define.iso8601(query['unixtime']), 'title': query['char_name'], 'age': query['age'], 'gender': query['gender'], 'height': query['height'], 'weight': query['weight'], 'species': query['species'], 'content': text.markdown(query['content']), 'rating': ratings.CODE_TO_NAME[query['rating']], 'favorited': favorite.check(userid, charid=charid), 'views': query['page_views'], 'friends_only': 'f' in query['settings'], 'favorites': favorite.count(charid, 'character'), 'comments': comment.count(charid, 'character'), 'media': api.tidy_all_media(fake_media_items( charid, query['userid'], login, query['settings'])), 'tags': searchtag.select(charid=charid), 'type': 'character', 'link': define.absolutify_url( '/character/%d/%s' % (charid, text.slug_for(query['char_name']))), }
def submissionsbyuser(userid, form): if userid not in staff.MODS: raise WeasylError("Unexpected") query = d.execute(""" SELECT su.submitid, su.title, su.rating, su.unixtime, su.userid, pr.username, su.settings FROM submission su INNER JOIN profile pr USING (userid) WHERE su.userid = (SELECT userid FROM login WHERE login_name = '%s') ORDER BY su.submitid DESC """, [d.get_sysname(form.name)]) ret = [{ "contype": 10, "submitid": i[0], "title": i[1], "rating": i[2], "unixtime": i[3], "userid": i[4], "username": i[5], "settings": i[6], } for i in query] media.populate_with_submission_media(ret) return ret
def do_manage(my_userid, userid, username=None, full_name=None, catchphrase=None, birthday=None, gender=None, country=None): updates = [] # Username if username is not None: if not d.get_sysname(username): raise WeasylError("usernameInvalid") elif d.execute("SELECT EXISTS (SELECT 0 FROM login WHERE login_name = '%s')", [d.get_sysname(username)], ["bool"]): raise WeasylError("usernameExists") elif d.execute("SELECT EXISTS (SELECT 0 FROM useralias WHERE alias_name = '%s')", [d.get_sysname(username)], ["bool"]): raise WeasylError("usernameExists") elif d.execute("SELECT EXISTS (SELECT 0 FROM logincreate WHERE login_name = '%s')", [d.get_sysname(username)], ["bool"]): raise WeasylError("usernameExists") d.execute("UPDATE login SET login_name = '%s' WHERE userid = %i", [d.get_sysname(username), userid]) d._get_display_name.invalidate(userid) d.execute("UPDATE profile SET username = '******' WHERE userid = %i", [username, userid]) updates.append('- Username: %s' % (username,)) # Full name if full_name is not None: d.execute("UPDATE profile SET full_name = '%s' WHERE userid = %i", [full_name, userid]) updates.append('- Full name: %s' % (full_name,)) # Catchphrase if catchphrase is not None: d.execute("UPDATE profile SET catchphrase = '%s' WHERE userid = %i", [catchphrase, userid]) updates.append('- Catchphrase: %s' % (catchphrase,)) # Birthday if birthday is not None and d.convert_inputdate(birthday): unixtime = d.convert_inputdate(birthday) age = d.convert_age(unixtime) d.execute("UPDATE userinfo SET birthday = %i WHERE userid = %i", [unixtime, userid]) if age < ratings.MODERATE.minimum_age: max_rating = ratings.GENERAL.code rating_flag = "" elif age < ratings.EXPLICIT.minimum_age: max_rating = ratings.MODERATE.code rating_flag = "m" else: max_rating = ratings.EXPLICIT.code if d.get_rating(userid) > max_rating: d.execute( """ UPDATE profile SET config = REGEXP_REPLACE(config, '[map]', '', 'g') || '%s' WHERE userid = %i """, [rating_flag, userid] ) d._get_config.invalidate(userid) updates.append('- Birthday: %s' % (birthday,)) # Gender if gender is not None: d.execute("UPDATE userinfo SET gender = '%s' WHERE userid = %i", [gender, userid]) updates.append('- Gender: %s' % (gender,)) # Location if country is not None: d.execute("UPDATE userinfo SET country = '%s' WHERE userid = %i", [country, userid]) updates.append('- Country: %s' % (country,)) if updates: from weasyl import moderation moderation.note_about(my_userid, userid, 'The following fields were changed:', '\n'.join(updates))
def select_char(userid, rating, limit, otherid=None, backid=None, nextid=None, config=None): if config is None: config = d.get_config(userid) query = [] statement = [ """ SELECT ch.charid, ch.char_name, ch.rating, fa.unixtime, ch.userid, pr.username, ch.settings FROM favorite fa INNER JOIN character ch ON fa.targetid = ch.charid INNER JOIN profile pr ON ch.userid = pr.userid WHERE fa.type = 'f' AND ch.settings !~ 'h' """ ] if userid: # filter own content in SFW mode if d.is_sfw_mode(): statement.append(" AND (ch.rating <= %i)" % (rating, )) else: statement.append(" AND (ch.userid = %i OR ch.rating <= %i)" % (userid, rating)) statement.append(m.MACRO_FRIENDUSER_CHARACTER % (userid, userid, userid)) statement.append(m.MACRO_IGNOREUSER % (userid, "ch")) statement.append(m.MACRO_BLOCKTAG_CHAR % (userid, userid)) else: statement.append(" AND ch.rating <= %i AND ch.settings !~ 'f'" % (rating, )) if otherid: statement.append(" AND fa.userid = %i" % (otherid, )) if backid: statement.append( " AND fa.unixtime > " "(SELECT unixtime FROM favorite WHERE (userid, targetid, type) = (%i, %i, 'f'))" % (otherid, backid)) elif nextid: statement.append( " AND fa.unixtime < " "(SELECT unixtime FROM favorite WHERE (userid, targetid, type) = (%i, %i, 'f'))" % (otherid, nextid)) statement.append(" ORDER BY fa.unixtime%s LIMIT %i" % ("" if backid else " DESC", limit)) from weasyl import character query = [{ "contype": 20, "charid": i[0], "title": i[1], "rating": i[2], "unixtime": i[3], "userid": i[4], "username": i[5], "sub_media": character.fake_media_items(i[0], i[4], d.get_sysname(i[5]), i[6]), } for i in d.execute("".join(statement))] return query[::-1] if backid else query
def do_manage(my_userid, userid, username=None, full_name=None, catchphrase=None, birthday=None, gender=None, country=None): updates = [] # Username if username is not None: if not d.get_sysname(username): raise WeasylError("usernameInvalid") elif d.execute( "SELECT EXISTS (SELECT 0 FROM login WHERE login_name = '%s')", [d.get_sysname(username)], ["bool"]): raise WeasylError("usernameExists") elif d.execute( "SELECT EXISTS (SELECT 0 FROM useralias WHERE alias_name = '%s')", [d.get_sysname(username)], ["bool"]): raise WeasylError("usernameExists") elif d.execute( "SELECT EXISTS (SELECT 0 FROM logincreate WHERE login_name = '%s')", [d.get_sysname(username)], ["bool"]): raise WeasylError("usernameExists") d.execute("UPDATE login SET login_name = '%s' WHERE userid = %i", [d.get_sysname(username), userid]) d._get_display_name.invalidate(userid) d.execute("UPDATE profile SET username = '******' WHERE userid = %i", [username, userid]) updates.append('- Username: %s' % (username, )) # Full name if full_name is not None: d.execute("UPDATE profile SET full_name = '%s' WHERE userid = %i", [full_name, userid]) updates.append('- Full name: %s' % (full_name, )) # Catchphrase if catchphrase is not None: d.execute("UPDATE profile SET catchphrase = '%s' WHERE userid = %i", [catchphrase, userid]) updates.append('- Catchphrase: %s' % (catchphrase, )) # Birthday if birthday is not None and d.convert_inputdate(birthday): unixtime = d.convert_inputdate(birthday) age = d.convert_age(unixtime) d.execute("UPDATE userinfo SET birthday = %i WHERE userid = %i", [unixtime, userid]) if age < ratings.MODERATE.minimum_age: max_rating = ratings.GENERAL.code rating_flag = "" elif age < ratings.EXPLICIT.minimum_age: max_rating = ratings.MODERATE.code rating_flag = "m" else: max_rating = ratings.EXPLICIT.code if d.get_rating(userid) > max_rating: d.execute( """ UPDATE profile SET config = REGEXP_REPLACE(config, '[map]', '', 'g') || '%s' WHERE userid = %i """, [rating_flag, userid]) d._get_config.invalidate(userid) updates.append('- Birthday: %s' % (birthday, )) # Gender if gender is not None: d.execute("UPDATE userinfo SET gender = '%s' WHERE userid = %i", [gender, userid]) updates.append('- Gender: %s' % (gender, )) # Location if country is not None: d.execute("UPDATE userinfo SET country = '%s' WHERE userid = %i", [country, userid]) updates.append('- Country: %s' % (country, )) if updates: from weasyl import moderation moderation.note_about(my_userid, userid, 'The following fields were changed:', '\n'.join(updates))