def deleteGroupAutoReleases(data): if not current_user.is_mod(): return getResponse(error=True, message="I see what you (tried) to do there!") assert 'item-id' in data assert 'mode' in data assert data['mode'] == "delete-auto-from-group" try: delete_id = int(data["item-id"]) except ValueError: raise AssertionError("Failure converting item ID to integer!") clean_item = Translators.query.filter(Translators.id==delete_id).one() print(clean_item) for release in clean_item.releases: if release.changeuser == FeedFeeder.FeedFeeder.RSS_USER_ID: db.session.delete(release) # print(release.id, release.volume, release.chapter, release.postfix, release.changeuser) else: print("Not deleting: ", release.id, release.volume, release.chapter, release.postfix, release.changeuser) db.session.commit() return getResponse("Autogen releases deleted. Reloading.", error=False)
def flatten_series_by_url(data): if not current_user.is_mod(): return getResponse(error=True, message="You have to have moderator privileges to do that!") dups = db.engine.execute(''' SELECT website, COUNT(*) AS dupes FROM series WHERE website IS NOT NULL AND website != '' GROUP BY website HAVING (COUNT(*) > 1);''') dups = list(dups) match_num = 0 for website, number in dups: print(website, number) matches = Series.query.filter(Series.website==website).all() ids = [match.id for match in matches] zipped = list(zip(ids, ids[1:])) for m1, m2 in zipped: match_num += 1 merge_series_ids(m1, m2) return getResponse("%s Items merged." % match_num, error=False)
def mergeSeriesItems(data): if not current_user.is_mod(): return getResponse(error=True, message="You have to have moderator privileges to do that!") assert 'mode' in data assert data['mode'] == 'merge-id' assert 'item-id' in data assert 'merge_id' in data m1, m2 = int(data['item-id']), int(data['merge_id']) return merge_series_ids(m1, m2)
def delete_duplicate_releases(data): if not current_user.is_mod(): return getResponse(error=True, message="You have to have moderator privileges to do that!") dups = db.engine.execute(''' SELECT srcurl, COUNT(*) AS dupes FROM releases WHERE srcurl IS NOT NULL AND srcurl != '' GROUP BY srcurl HAVING (COUNT(*) > 1);''') dups = list(dups) match_num = 0 mismatches = set() for website, number in dups: # print(website, number) matches = Releases.query.filter(Releases.srcurl==website).all() zipped = list(zip(matches, matches[1:])) for m1, m2 in zipped: if m1.series != m2.series: tup = (m1.series, m2.series) if tup not in mismatches: print("Mismatch!") print(m1.series, m2.series) mismatches.add(tup) else: match_num += 1 # print(m1.series, m2.series) # Sort by change-time, since we care more about # the latest change (since it'll probably be more accurate) if m1.changetime < m2.changetime: older = m1 newer = m2 else: older = m2 newer = m1 db.session.delete(older) db.session.commit() # print(dups) # print(list(dups)) return getResponse("%s Items merged." % match_num, error=False)
def deleteSeries(data): if not current_user.is_mod(): return getResponse(error=True, message="I see what you (tried) to do there!") assert 'item-id' in data assert 'mode' in data delete_id = data["item-id"] clean_item = Series.query.filter(Series.id==delete_id).one() # !Ordering here matters! # Change-tables have to go second. delete_from = [ AlternateNames, AlternateNamesChanges, Author, AuthorChanges, Illustrators, IllustratorsChanges, Tags, TagsChanges, Genres, GenresChanges, Publishers, PublishersChanges, Covers, CoversChanges, Releases, ReleasesChanges, # Series, # SeriesChanges, ] for clearTable in delete_from: clearTable.query.filter(clearTable.series==clean_item.id).delete() Watches.query.filter(Watches.series_id==clean_item.id).delete() Series.query.filter(Series.id==clean_item.id).delete() SeriesChanges.query.filter(SeriesChanges.srccol==clean_item.id).delete() # db.session.delete(clean_item) db.session.commit() return getResponse("Series was deleted entirely!", error=False)
def alterReleaseItem(data): if not current_user.is_mod(): return getResponse(error=True, message="You have to have moderator privileges to do that!") assert 'op' in data assert 'mode' in data assert 'count' in data assert 'id' in data assert data['mode'] == "release-ctrl" try: data['id'] = int(data['id']) except ValueError: raise AssertionError("Failure converting item ID to integer!") assert data['count'] in BOOL_LUT data['count'] = BOOL_LUT[data['count']] assert data['op'] in RELEASE_OPS return RELEASE_OPS[data['op']](data)
def fix_escaped_quotes(dummy_data): if not current_user.is_mod(): return getResponse(error=True, message="You have to have moderator privileges to do that!") # SELECT * FROM series WHERE title LIKE E'%\\\'%'; bad_title = 0 q = Series.query.filter(or_(Series.title.like(r"%'%"), Series.title.like(r"%’%"), Series.title.like(r"%‘%"), Series.title.like(r"%“%"), Series.title.like(r"%”%"))) items = q.all() print("Name fixing processing query resulted in %s items" % len(items)) for item in items: old = item.title new = old while any([r"\"" in new, r"\'" in new, "’" in new, "‘" in new, "“" in new, "”" in new]): new = new.replace(r"\'", "'") new = new.replace(r'\"', '"') new = new.replace(r"’", "'") new = new.replace(r"‘", "'") new = new.replace(r"“", '"') new = new.replace(r"”", '"') have = Series.query.filter(Series.title == new).scalar() if old != new: if have: print("Duplicate item!", (old, new), old==new) merge_series_ids(have.id, item.id) else: print("Fixing title.") item.title = new db.session.commit() bad_title += 1 bad_alt_title = 0 q = AlternateNames.query.filter(or_(AlternateNames.name.like(r"%'%"), AlternateNames.name.like(r"%’%"), AlternateNames.name.like(r"%‘%"), AlternateNames.name.like(r"%“%"), AlternateNames.name.like(r"%”%"))) conflicts = '' items = q.all() print("Alternate names processing query resulted in %s items" % len(items)) for item in items: old = item.name new = old while any([r"\"" in new, r"\'" in new, "’" in new, "‘" in new, "“" in new, "”" in new]): new = new.replace(r"\'", "'") new = new.replace(r'\"', '"') new = new.replace(r"’", "'") new = new.replace(r"‘", "'") new = new.replace(r"“", '"') new = new.replace(r"”", '"') if old != new: have = AlternateNames.query.filter(AlternateNames.name == new).scalar() if have: if have.series == item.series: print("Duplicate names") assert have.series == item.series # We don't care about duplicates if one is the escaped version of the other db.session.delete(item) db.session.commit() else: conflicts += """\nSeries mismatch?\nSeries %s: '%s'\nSeries %s: '%s'""" % (have.series, have.name, item.series, item.name) print("Wat?", have.name, item.name) print("Wat?", have.series, item.series) else: print("Fixing title.") item.name = new db.session.commit() bad_alt_title += 1 bad_desc = 0 # F**K ALL SMART QUOTE BULLSHITS EVER q = Series.query.filter(or_(Series.description.like(r"%'%"), Series.description.like(r"%’%"), Series.description.like(r"%‘%"), Series.description.like(r"%“%"), Series.description.like(r"%”%"))) items = q.all() print("Series description processing query resulted in %s items" % len(items)) for item in items: old = item.description new = old while any([r"\"" in new, r"\'" in new, "’" in new, "‘" in new, "“" in new, "”" in new]): new = new.replace(r"\'", "'") new = new.replace(r'\"', '"') new = new.replace(r"’", "'") new = new.replace(r"‘", "'") new = new.replace(r"“", '"') new = new.replace(r"”", '"') if old != new: print("Fixing description smart-quotes and over-escapes for series: %s" % item.id) item.description = new db.session.commit() bad_desc += 1 print("Update complete.") return getResponse("%s main titles, %s alt titles, %s descriptions required fixing.%s" % (bad_title, bad_alt_title, bad_desc, conflicts), error=False)
def processMangaUpdateJson(data): validated = validateMangaData(data) sid = validated['id'] series = Series.query.filter(Series.id==sid).one() print(validated) for entry in validated['entries']: # print(entry) if entry['type'] == 'title': if not current_user.is_mod(): return getResponse(error=True, message="You have to have moderator privileges to do that!") ret = updateTitle(series, bleach.clean(entry['data'], strip=True)) if ret: return ret elif entry['type'] == 'description': processedData = markdown.markdown(bleach.clean(entry['data'], strip=True)) if series.description == processedData: # print("No change?") pass else: series.description = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'demographic': processedData = bleach.clean(entry['data'], strip=True) if series.demographic == processedData: # print("No change?") pass else: series.demographic = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'orig_status': processedData = bleach.clean(entry['data'], strip=True) if series.orig_status == processedData: # print("No change?") pass else: series.orig_status = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'region': processedData = bleach.clean(entry['data'], strip=True) if series.demographic == processedData: # print("No change?") pass else: series.region = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'tl_type': processedData = bleach.clean(entry['data'], strip=True) if series.tl_type == processedData: # print("No change?") pass else: series.tl_type = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'license_en': lic_state = entry['data'] if lic_state not in VALID_LICENSE_STATES: raise ValueError("Invalid license data!") else: lic_state = VALID_LICENSE_STATES[lic_state] series.license_en = lic_state series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() # if series.demographic == processedData: # # print("No change?") # pass # else: # series.region = processedData # series.changeuser = getCurrentUserId() # series.changetime = datetime.datetime.now() elif entry['type'] == 'type': processedData = bleach.clean(entry['data'], strip=True) if series.type == processedData: # print("No change?") pass else: series.type = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'origin_loc': processedData = bleach.clean(entry['data'], strip=True) if series.origin_loc == processedData: # print("No change?") pass else: series.origin_loc = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'orig_lang': processedData = bleach.clean(entry['data'], strip=True) if series.orig_lang == processedData: # print("No change?") pass else: series.orig_lang = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'website': processedData = bleach.clean(entry['data'], strip=True, tags=[]) if series.website == processedData: # print("No change?") pass else: series.website = processedData series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'first_publish_date': pub_date = entry['data'] if series.pub_date == pub_date: # print("No change?") pass else: series.pub_date = pub_date print("Publish date: ", series.pub_date) series.changeuser = getCurrentUserId() series.changetime = datetime.datetime.now() elif entry['type'] == 'author': ret = app.series_tools.setAuthorIllust(series, author=entry['data']) if ret: return ret elif entry['type'] == 'illustrators': ret = app.series_tools.setAuthorIllust(series, illust=entry['data']) if ret: return ret elif entry['type'] == 'publisher': ret = app.series_tools.updatePublishers(series, publishers=entry['data']) if ret: return ret elif entry['type'] == 'tag': ret = app.series_tools.updateTags(series, entry['data']) if ret: return ret elif entry['type'] == 'genre': ret = app.series_tools.updateGenres(series, entry['data']) if ret: return ret elif entry['type'] == 'alternate-names': ret = app.series_tools.updateAltNames(series, entry['data']) if ret: return ret else: raise AssertionError("Unknown modifification type!") db.session.commit() ret = { "error" : False, "message" : "Wat?!" } return ret