def select_list(userid, rating, limit, otherid=None, pending=False, backid=None, nextid=None): statement = [ "SELECT su.submitid, su.title, su.subtype, su.rating, co.unixtime, " "su.userid, pr.username, cpr.username, cpr.userid " ] statement.extend( select_query(userid, rating, otherid, pending, backid, nextid)) statement.append(" ORDER BY co.unixtime%s LIMIT %i" % ("" if backid else " DESC", limit)) query = [] for i in d.execute("".join(statement)): query.append({ "contype": 10, "collection": True, "submitid": i[0], "title": i[1], "subtype": i[2], "rating": i[3], "unixtime": i[4], "userid": i[5], "username": i[6], # username of creator "collector": i[7], # username of collector "collectorid": i[8], "sub_media": media.get_submission_media(i[0]), }) return query[::-1] if backid else query
def submission_media_(request): link_type = request.matchdict['linktype'] submitid = int(request.matchdict['submitid']) if link_type == "submissions": link_type = "submission" submission = Submission.query.get(submitid) if submission is None: raise httpexceptions.HTTPForbidden() elif submission.is_hidden or submission.is_friends_only: raise httpexceptions.HTTPForbidden() media_items = media.get_submission_media(submitid) if not media_items.get(link_type): raise httpexceptions.HTTPNotFound() return Response(headerlist=[ ( 'X-Accel-Redirect', str(media_items[link_type][0]['file_url']), ), ( 'Cache-Control', 'max-age=0', ), ])
def select_list(userid, rating, limit, otherid=None, pending=False, backid=None, nextid=None, config=None, options=[]): if config is None: config = d.get_config(userid) statement = ["SELECT su.submitid, su.title, su.rating, co.unixtime, " "su.userid, pr.username, su.settings, cpr.username, cpr.userid "] statement.extend(select_query(userid, rating, otherid, pending, backid, nextid, config)) statement.append(" ORDER BY co.unixtime%s LIMIT %i" % ("" if backid else " DESC", limit)) query = [] for i in d.execute("".join(statement)): query.append({ "contype": 10, "collection": True, "submitid": i[0], "title": i[1], "rating": i[2], "unixtime": i[3], "userid": i[4], "username": i[5], # username of creator "collector": i[7], # username of collector "collectorid": i[8], "sub_media": media.get_submission_media(i[0]), }) return query[::-1] if backid else query
def twitter_card(submitid): query = d.execute( """ SELECT su.title, su.settings, su.content, su.subtype, su.userid, pr.username, pr.full_name, pr.config, ul.link_value, su.rating FROM submission su INNER JOIN profile pr USING (userid) LEFT JOIN user_links ul ON su.userid = ul.userid AND ul.link_type = 'twitter' WHERE submitid = %i LIMIT 1 """, [submitid], ["single"]) if not query: raise WeasylError("submissionRecordMissing") title, settings, content, subtype, userid, username, full_name, config, twitter, rating = query if 'h' in settings: raise WeasylError("submissionRecordMissing") elif 'f' in settings: raise WeasylError("FriendsOnly") if 'v' in settings: content = d.text_first_line(content, strip=True) content = d.summarize(html.strip_html(content)) if not content: content = "[This submission has no description.]" ret = { 'url': d.absolutify_url('/submission/%s/%s' % (submitid, text.slug_for(title))), } if twitter: ret['creator'] = '@%s' % (twitter.lstrip('@'), ) ret['title'] = title else: ret['title'] = '%s by %s' % (title, full_name) if ratings.CODE_MAP[rating].minimum_age >= 18: ret['card'] = 'summary' ret['description'] = 'This image is rated 18+ and only viewable on weasyl.com' return ret ret['description'] = content subcat = subtype / 1000 * 1000 media_items = media.get_submission_media(submitid) if subcat == m.ART_SUBMISSION_CATEGORY and media_items.get('submission'): ret['card'] = 'photo' ret['image:src'] = d.absolutify_url( media_items['submission'][0]['display_url']) else: ret['card'] = 'summary' thumb = media_items.get('thumbnail-custom') or media_items.get( 'thumbnail-generated') if thumb: ret['image:src'] = d.absolutify_url(thumb[0]['display_url']) return ret
def thumbnail_source(submitid): media_items = media.get_submission_media(submitid) source = None for link_type in ['thumbnail-source', 'cover']: if media_items.get(link_type): source = media_items[link_type][0] break if source is None: raise WeasylError('noImageSource') return source
def twitter_card(submitid): query = d.execute(""" SELECT su.title, su.settings, su.content, su.subtype, su.userid, pr.username, pr.full_name, pr.config, ul.link_value, su.rating FROM submission su INNER JOIN profile pr USING (userid) LEFT JOIN user_links ul ON su.userid = ul.userid AND ul.link_type = 'twitter' WHERE submitid = %i LIMIT 1 """, [submitid], ["single"]) if not query: raise WeasylError("submissionRecordMissing") title, settings, content, subtype, userid, username, full_name, config, twitter, rating = query if 'h' in settings: raise WeasylError("submissionRecordMissing") elif 'f' in settings: raise WeasylError("FriendsOnly") if 'v' in settings: content = d.text_first_line(content, strip=True) content = d.summarize(html.strip_html(content)) if not content: content = "[This submission has no description.]" ret = { 'url': d.absolutify_url( '/submission/%s/%s' % (submitid, text.slug_for(title))), } if twitter: ret['creator'] = '@%s' % (twitter.lstrip('@'),) ret['title'] = title else: ret['title'] = '%s by %s' % (title, full_name) if ratings.CODE_MAP[rating].minimum_age >= 18: ret['card'] = 'summary' ret['description'] = 'This image is rated 18+ and only viewable on weasyl.com' return ret ret['description'] = content subcat = subtype / 1000 * 1000 media_items = media.get_submission_media(submitid) if subcat == m.ART_SUBMISSION_CATEGORY and media_items.get('submission'): ret['card'] = 'photo' ret['image:src'] = d.absolutify_url(media_items['submission'][0]['display_url']) else: ret['card'] = 'summary' thumb = media_items.get('thumbnail-custom') or media_items.get('thumbnail-generated') if thumb: ret['image:src'] = d.absolutify_url(thumb[0]['display_url']) return ret
def select_view_api(userid, submitid, anyway=False, increment_views=False): rating = d.get_rating(userid) db = d.connect() sub = db.query(orm.Submission).get(submitid) if sub is None or 'hidden' in sub.settings: raise WeasylError("submissionRecordMissing") sub_rating = sub.rating.code if 'friends-only' in sub.settings and not frienduser.check(userid, sub.userid): raise WeasylError("submissionRecordMissing") elif sub_rating > rating and userid != sub.userid: raise WeasylError("RatingExceeded") elif not anyway and ignoreuser.check(userid, sub.userid): raise WeasylError("UserIgnored") elif not anyway and blocktag.check(userid, submitid=submitid): raise WeasylError("TagBlocked") description = sub.content embedlink = None if 'embedded-content' in sub.settings: embedlink, _, description = description.partition('\n') elif 'gdocs-embed' in sub.settings: embedlink = sub.google_doc_embed.embed_url views = sub.page_views if increment_views and d.common_view_content(userid, submitid, 'submit'): views += 1 return { 'submitid': submitid, 'title': sub.title, 'owner': sub.owner.profile.username, 'owner_login': sub.owner.login_name, 'owner_media': api.tidy_all_media(media.get_user_media(sub.userid)), 'media': api.tidy_all_media(media.get_submission_media(submitid)), 'description': text.markdown(description), 'embedlink': embedlink, 'folderid': sub.folderid, 'folder_name': sub.folder.title if sub.folderid else None, 'posted_at': d.iso8601(sub.unixtime), 'tags': searchtag.select(submitid=submitid), 'link': d.absolutify_url("/submission/%d/%s" % (submitid, text.slug_for(sub.title))), 'type': 'submission', 'subtype': m.CATEGORY_PARSABLE_MAP[sub.subtype // 1000 * 1000], 'rating': sub.rating.name, 'views': views, 'favorites': favorite.count(submitid), 'comments': comment.count(submitid), 'favorited': favorite.check(userid, submitid=submitid), 'friends_only': 'friends-only' in sub.settings, }
def select_manage(userid, rating, limit, pending, backid=None, nextid=None, config=None): query = [] statement = [ "SELECT su.submitid, su.title, su.subtype, su.rating, co.unixtime, su.userid, pr.username" " FROM collection co" " INNER JOIN submission su ON co.submitid = su.submitid" " INNER JOIN profile pr ON su.userid = pr.userid" " WHERE (su.rating <= %i OR su.userid = %i) AND co.settings %s~ 'p' AND su.settings !~ '[fh]'" % (rating, userid, "" if pending else "!") ] # Content owner and browse selection statement.append(" AND co.userid = %i" % userid) if backid: statement.append( " AND co.unixtime > (SELECT unixtime FROM collection WHERE (userid, submitid) = (%i, %i))" % (userid, backid)) elif nextid: statement.append( " AND co.unixtime < (SELECT unixtime FROM collection WHERE (userid, submitid) = (%i, %i))" % (userid, nextid)) # Ignored users and blocked tags statement.append(" ORDER BY co.unixtime%s LIMIT %i" % ("" if backid else " DESC", limit)) try: for i in d.execute("".join(statement)): query.append({ "contype": 10, "collection": True, "submitid": i[0], "title": i[1], "subtype": i[2], "rating": i[3], "unixtime": i[4], "userid": i[5], "username": i[6], "sub_media": media.get_submission_media(i[0]), }) except PostgresError: return [] return query[::-1] if backid else query
def GET(self, username, link_type, submitid): submitid = int(submitid) if link_type == "submissions": link_type = "submission" submission = Submission.query.get(submitid) if submission is None: return web.notfound() elif submission.is_hidden or submission.is_friends_only: return web.forbidden() media_items = media.get_submission_media(submitid) if not media_items.get(link_type): return web.notfound() web.header('X-Accel-Redirect', media_items[link_type][0]['file_url']) web.header('Cache-Control', 'max-age=0') return ''
def submission_media_(request): link_type = request.matchdict['linktype'] submitid = int(request.matchdict['submitid']) if link_type == "submissions": link_type = "submission" submission = Submission.query.get(submitid) if submission is None: raise httpexceptions.HTTPForbidden() elif submission.is_hidden or submission.is_friends_only: raise httpexceptions.HTTPForbidden() media_items = media.get_submission_media(submitid) if not media_items.get(link_type): raise httpexceptions.HTTPNotFound() return Response(headerlist=[ ('X-Accel-Redirect', str(media_items[link_type][0]['file_url']),), ('Cache-Control', 'max-age=0',), ])
def select_manage(userid, rating, limit, pending, backid=None, nextid=None, config=None): query = [] statement = ["SELECT su.submitid, su.title, su.subtype, su.rating, co.unixtime, su.userid, pr.username" " FROM collection co" " INNER JOIN submission su ON co.submitid = su.submitid" " INNER JOIN profile pr ON su.userid = pr.userid" " WHERE (su.rating <= %i OR su.userid = %i) AND co.settings %s~ 'p' AND su.settings !~ '[fh]'" % (rating, userid, "" if pending else "!")] # Content owner and browse selection statement.append(" AND co.userid = %i" % userid) if backid: statement.append(" AND co.unixtime > (SELECT unixtime FROM collection WHERE (userid, submitid) = (%i, %i))" % (userid, backid)) elif nextid: statement.append(" AND co.unixtime < (SELECT unixtime FROM collection WHERE (userid, submitid) = (%i, %i))" % (userid, nextid)) # Ignored users and blocked tags statement.append(" ORDER BY co.unixtime%s LIMIT %i" % ("" if backid else " DESC", limit)) try: for i in d.execute("".join(statement)): query.append({ "contype": 10, "collection": True, "submitid": i[0], "title": i[1], "subtype": i[2], "rating": i[3], "unixtime": i[4], "userid": i[5], "username": i[6], "sub_media": media.get_submission_media(i[0]), }) except PostgresError: return [] return query[::-1] if backid else query
def select_preview(userid, otherid, rating, limit=3): """ Picks out random folders up to the limit, and get a count, name, and random submission to use as a preview for each. The rules below ensure that the following images won't be used or counted: Hidden images, friends only images from non-friends, submissions above the specified rating. Except for hidden images, these rules are ignored when a user views their own folders. Params: userid: The id of the viewing user. otherid: The id of the users whose folders we're viewing. rating: The maximum rating of submissions that will be considered for counts or a preview. limit: The maximum number of folders to consider. Defaults to 3. Returns: An array of dicts, each of which has a folderid, a title, a count, and sub_media to use for a preview. """ query = [] folder_query = d.engine.execute(""" SELECT fd.folderid, fd.title, (SELECT COUNT(*) FROM submission su WHERE folderid = fd.folderid AND settings !~ '[hu]' AND (rating <= %(rating)s OR (userid = %(userid)s AND NOT %(sfwmode)s)) AND (settings !~ 'f' OR su.userid = %(userid)s OR EXISTS (SELECT 0 FROM frienduser WHERE ((userid, otherid) = (%(userid)s, su.userid) OR (userid, otherid) = (su.userid, %(userid)s)) AND settings !~ 'p'))) FROM folder fd WHERE fd.userid = %(otherid)s AND fd.settings !~ '[hu]' AND EXISTS (SELECT 0 FROM submission WHERE folderid = fd.folderid AND (rating <= %(rating)s OR (userid = %(userid)s AND NOT %(sfwmode)s))) ORDER BY RANDOM() LIMIT %(limit)s """, rating=rating, userid=userid, otherid=otherid, limit=limit, sfwmode=d.is_sfw_mode()) for i in folder_query: submit = d.engine.execute(""" SELECT submitid, settings FROM submission su WHERE (rating <= %(rating)s OR (userid = %(userid)s AND NOT %(sfwmode)s)) AND folderid = %(folderid)s AND settings !~ 'h' AND (settings !~ 'f' OR su.userid = %(userid)s OR EXISTS (SELECT 0 FROM frienduser WHERE ((userid, otherid) = (%(userid)s, su.userid) OR (userid, otherid) = (su.userid, %(userid)s)) AND settings !~ 'p')) ORDER BY RANDOM() LIMIT 1 """, rating=rating, folderid=i.folderid, userid=userid, sfwmode=d.is_sfw_mode()).first() if submit: query.append({ "folderid": i.folderid, "title": i.title, "count": i.count, "userid": otherid, "sub_media": media.get_submission_media(submit.submitid), }) return query
def select_view(userid, submitid, rating, ignore=True, anyway=None): query = d.execute(""" SELECT su.userid, pr.username, su.folderid, su.unixtime, su.title, su.content, su.subtype, su.rating, su.settings, su.page_views, su.sorttime, pr.config, fd.title FROM submission su INNER JOIN profile pr USING (userid) LEFT JOIN folder fd USING (folderid) WHERE su.submitid = %i """, [submitid], options=["single", "list"]) # Sanity check if query and userid in staff.MODS and anyway == "true": pass elif not query or "h" in query[8]: raise WeasylError("submissionRecordMissing") elif query[7] > rating and ((userid != query[0] and userid not in staff.MODS) or d.is_sfw_mode()): raise WeasylError("RatingExceeded") elif "f" in query[8] 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, submitid=submitid): raise WeasylError("TagBlocked") # Get submission filename submitfile = media.get_submission_media(submitid).get('submission', [None])[0] # Get submission text if submitfile and submitfile['file_type'] in ['txt', 'htm']: submittext = files.read(submitfile['full_file_path']) else: submittext = None embedlink = d.text_first_line(query[5]) if "v" in query[8] else None google_doc_embed = None if 'D' in query[8]: db = d.connect() gde = d.meta.tables['google_doc_embeds'] q = (sa.select([gde.c.embed_url]) .where(gde.c.submitid == submitid)) results = db.execute(q).fetchall() if not results: raise WeasylError("can't find embed information") google_doc_embed = results[0] tags, artist_tags = searchtag.select_with_artist_tags(submitid) settings = d.get_profile_settings(query[0]) return { "submitid": submitid, "userid": query[0], "username": query[1], "folderid": query[2], "unixtime": query[3], "title": query[4], "content": (d.text_first_line(query[5], strip=True) if "v" in query[8] else query[5]), "subtype": query[6], "rating": query[7], "settings": query[8], "page_views": ( query[9] + 1 if d.common_view_content(userid, 0 if anyway == "true" else submitid, "submit") else query[9]), "fave_count": d.execute( "SELECT COUNT(*) FROM favorite WHERE (targetid, type) = (%i, 's')", [submitid], ["element"]), "mine": userid == query[0], "reported": report.check(submitid=submitid), "favorited": favorite.check(userid, submitid=submitid), "friends_only": "f" in query[8], "hidden_submission": "h" in query[8], "collectors": collection.find_owners(submitid), "no_request": not settings.allow_collection_requests, "text": submittext, "sub_media": media.get_submission_media(submitid), "user_media": media.get_user_media(query[0]), "submit": submitfile, "embedlink": embedlink, "embed": embed.html(embedlink) if embedlink is not None else None, "google_doc_embed": google_doc_embed, "tags": tags, "artist_tags": artist_tags, "removable_tags": searchtag.removable_tags(userid, query[0], tags, artist_tags), "can_remove_tags": searchtag.can_remove_tags(userid, query[0]), "folder_more": select_near(userid, rating, 1, query[0], query[2], submitid), "folder_title": query[12] if query[12] else "Root", "comments": comment.select(userid, submitid=submitid), }
def select_view(userid, submitid, rating, ignore=True, anyway=None): query = d.execute(""" SELECT su.userid, pr.username, su.folderid, su.unixtime, su.title, su.content, su.subtype, su.rating, su.settings, su.page_views, su.sorttime, pr.config, fd.title FROM submission su INNER JOIN profile pr USING (userid) LEFT JOIN folder fd USING (folderid) WHERE su.submitid = %i """, [submitid], options=["single", "list"]) # Sanity check if query and userid in staff.MODS and anyway == "true": pass elif not query or "h" in query[8]: raise WeasylError("submissionRecordMissing") elif query[7] > rating and ( (userid != query[0] and userid not in staff.MODS) or d.is_sfw_mode()): raise WeasylError("RatingExceeded") elif "f" in query[8] 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, submitid=submitid): raise WeasylError("TagBlocked") # Get submission filename submitfile = media.get_submission_media(submitid).get( 'submission', [None])[0] # Get submission text if submitfile and submitfile['file_type'] in ['txt', 'htm']: submittext = files.read(submitfile['full_file_path']) else: submittext = None embedlink = d.text_first_line(query[5]) if "v" in query[8] else None google_doc_embed = None if 'D' in query[8]: db = d.connect() gde = d.meta.tables['google_doc_embeds'] q = (sa.select([gde.c.embed_url]).where(gde.c.submitid == submitid)) results = db.execute(q).fetchall() if not results: raise WeasylError("can't find embed information") google_doc_embed = results[0] tags, artist_tags = searchtag.select_with_artist_tags(submitid) settings = d.get_profile_settings(query[0]) return { "submitid": submitid, "userid": query[0], "username": query[1], "folderid": query[2], "unixtime": query[3], "title": query[4], "content": (d.text_first_line(query[5], strip=True) if "v" in query[8] else query[5]), "subtype": query[6], "rating": query[7], "settings": query[8], "page_views": (query[9] + 1 if d.common_view_content( userid, 0 if anyway == "true" else submitid, "submit") else query[9]), "fave_count": d.execute( "SELECT COUNT(*) FROM favorite WHERE (targetid, type) = (%i, 's')", [submitid], ["element"]), "mine": userid == query[0], "reported": report.check(submitid=submitid), "favorited": favorite.check(userid, submitid=submitid), "friends_only": "f" in query[8], "hidden_submission": "h" in query[8], "collectors": collection.find_owners(submitid), "no_request": not settings.allow_collection_requests, "text": submittext, "sub_media": media.get_submission_media(submitid), "user_media": media.get_user_media(query[0]), "submit": submitfile, "embedlink": embedlink, "embed": embed.html(embedlink) if embedlink is not None else None, "google_doc_embed": google_doc_embed, "tags": tags, "artist_tags": artist_tags, "removable_tags": searchtag.removable_tags(userid, query[0], tags, artist_tags), "can_remove_tags": searchtag.can_remove_tags(userid, query[0]), "folder_more": select_near(userid, rating, 1, query[0], query[2], submitid), "folder_title": query[12] if query[12] else "Root", "comments": comment.select(userid, submitid=submitid), }