import os import re from time import strftime, gmtime from hashlib import sha256 from peewee import * from app import app, cache, db board_db = MySQLDatabase(app.config['FORUM_NAME'], **{'passwd': app.config['FORUM_PASSWORD'], 'host': app.config['FORUM_HOST'], 'user': app.config['FORUM_USERNAME']}) def registerUserForumId(user, username, password): try: u = Users.filter(name=username).get() hashpass = sha256(password+app.config['FORUM_SALT']+u.pss).hexdigest() if hashpass == u.password: user.forum_id = u.id db.session.commit() return {"forum_name":u.name, "forum_id":u.id} except DoesNotExist: pass return False @cache.memoize(60*5) def latest_news(num=3): latest_news = [] try: board_db.connect() news_forum = Forums.get(fn.Lower(Forums.title) % '%news%') for thread in Threads.select().where( Threads.forum == news_forum.id).order_by(Threads.date.desc()).limit(num): # Last revision of the first post post = Posts.select().where(Posts.thread == thread.id).get() raw_text = PostsText.select().where(PostsText.pid == post.id).order_by(PostsText.revision.desc()).limit(1).get() #remove BBCode text = re.sub(r"\[(\/)?(\w+)\]", '', raw_text.text) timestamp = thread.date date = strftime('%B %d, %Y %H:%M:%S UTC', gmtime(timestamp)) if not timestamp: post = Posts.select().where(Posts.thread == thread.id).get() timestamp = post and post.date url = 'http://board.dotanoobs.com/?page=thread&id=%d' % thread.id latest_news.append({'title':thread.title, 'text':text, 'date':date, 'timestamp':timestamp, 'url':url}) except Exception as e: latest_news.append({'title':'Error with forum db', 'text':e, 'url':''}) finally: board_db.close() return latest_news class UnknownFieldType(object): pass class BaseModel(Model): class Meta: database = board_db class Badges(BaseModel): color = IntegerField() name = CharField() owner = IntegerField() class Meta: db_table = 'badges' class Blockedlayouts(BaseModel): blockee = IntegerField() user = IntegerField() class Meta: db_table = 'blockedlayouts' class Categories(BaseModel): corder = IntegerField() name = CharField() class Meta: db_table = 'categories' class Enabledplugins(BaseModel): plugin = CharField() class Meta: db_table = 'enabledplugins' class Forummods(BaseModel): forum = IntegerField() user = IntegerField() class Meta: db_table = 'forummods' class Forums(BaseModel): catid = IntegerField() description = TextField(null=True) forder = IntegerField() hidden = IntegerField() lastpostdate = IntegerField() lastpostid = IntegerField() lastpostuser = IntegerField() minpower = IntegerField() minpowerreply = IntegerField() minpowerthread = IntegerField() numposts = IntegerField() numthreads = IntegerField() title = CharField() class Meta: db_table = 'forums' class Guests(BaseModel): bot = IntegerField() date = IntegerField() ip = CharField() lastforum = IntegerField() lasturl = CharField() useragent = CharField() class Meta: db_table = 'guests' class Ignoredforums(BaseModel): fid = IntegerField() uid = IntegerField() class Meta: db_table = 'ignoredforums' class Ip2C(BaseModel): cc = CharField(null=True) ip_from = BigIntegerField() ip_to = BigIntegerField() class Meta: db_table = 'ip2c' class Ipbans(BaseModel): date = IntegerField() ip = CharField() reason = CharField() class Meta: db_table = 'ipbans' class Log(BaseModel): date = IntegerField() forum = IntegerField() forum2 = IntegerField() ip = CharField() pm = IntegerField() post = IntegerField() text = CharField() thread = IntegerField() type = CharField() user = IntegerField() user2 = IntegerField() class Meta: db_table = 'log' class Misc(BaseModel): hotcount = IntegerField() maxpostsday = IntegerField() maxpostsdaydate = IntegerField() maxpostshour = IntegerField() maxpostshourdate = IntegerField() maxusers = IntegerField() maxusersdate = IntegerField() maxuserstext = TextField(null=True) milestone = TextField(null=True) version = IntegerField() views = IntegerField() class Meta: db_table = 'misc' class Moodavatars(BaseModel): mid = IntegerField() name = CharField() uid = IntegerField() class Meta: db_table = 'moodavatars' class Notifications(BaseModel): description = TextField(null=True) link = IntegerField() linklocation = CharField() time = IntegerField() title = CharField() type = CharField() uid = IntegerField() class Meta: db_table = 'notifications' class Pmsgs(BaseModel): date = IntegerField() deleted = IntegerField() drafting = IntegerField() ip = CharField() msgread = IntegerField() userfrom = IntegerField() userto = IntegerField() class Meta: db_table = 'pmsgs' class PmsgsText(BaseModel): pid = IntegerField() text = TextField(null=True) title = CharField() class Meta: db_table = 'pmsgs_text' class Poll(BaseModel): briefing = TextField(null=True) closed = IntegerField() doublevote = IntegerField() question = CharField() class Meta: db_table = 'poll' class PollChoices(BaseModel): choice = CharField() color = CharField() poll = IntegerField() class Meta: db_table = 'poll_choices' class Pollvotes(BaseModel): choiceid = IntegerField() poll = IntegerField() user = IntegerField() class Meta: db_table = 'pollvotes' class Postplusones(BaseModel): post = IntegerField() user = IntegerField() class Meta: db_table = 'postplusones' class Posts(BaseModel): currentrevision = IntegerField() date = IntegerField() deleted = IntegerField() deletedby = IntegerField() ip = CharField() mood = IntegerField() num = IntegerField() options = IntegerField() postplusones = IntegerField() reason = CharField() thread = IntegerField() user = IntegerField() class Meta: db_table = 'posts' class PostsText(BaseModel): date = IntegerField() pid = IntegerField(primary_key=True) revision = IntegerField() text = TextField(null=True) user = IntegerField() class Meta: db_table = 'posts_text' class Proxybans(BaseModel): ip = CharField() class Meta: db_table = 'proxybans' class Queryerrors(BaseModel): cookie = TextField(null=True) error = TextField(null=True) get = TextField(null=True) ip = CharField() post = TextField(null=True) query = TextField(null=True) time = IntegerField() user = IntegerField() class Meta: db_table = 'queryerrors' class Reports(BaseModel): hidden = IntegerField() ip = CharField() request = TextField(null=True) severity = IntegerField() text = CharField() time = IntegerField() user = IntegerField() class Meta: db_table = 'reports' class Sessions(BaseModel): autoexpire = IntegerField() expiration = IntegerField() id = CharField() iplock = IntegerField() iplockaddr = CharField() lastip = CharField() lasttime = IntegerField() lasturl = CharField() user = IntegerField() class Meta: db_table = 'sessions' class Settings(BaseModel): name = CharField() plugin = CharField() value = TextField(null=True) class Meta: db_table = 'settings' class Smilies(BaseModel): code = CharField() image = CharField() class Meta: db_table = 'smilies' class Threads(BaseModel): closed = IntegerField() date = IntegerField() firstpostid = IntegerField() forum = IntegerField() icon = CharField() lastpostdate = IntegerField() lastposter = IntegerField() lastpostid = IntegerField() poll = IntegerField() replies = IntegerField() sticky = IntegerField() title = CharField() user = IntegerField() views = IntegerField() class Meta: db_table = 'threads' class Threadsread(BaseModel): date = IntegerField() thread = IntegerField() class Meta: db_table = 'threadsread' class Uploader(BaseModel): category = IntegerField() date = IntegerField() description = CharField() downloads = IntegerField() filename = CharField() private = IntegerField() user = IntegerField() class Meta: db_table = 'uploader' class UploaderCategories(BaseModel): description = TextField(null=True) name = CharField() ord = IntegerField() class Meta: db_table = 'uploader_categories' class Usercomments(BaseModel): cid = IntegerField() date = IntegerField() text = TextField(null=True) uid = IntegerField() class Meta: db_table = 'usercomments' class Usergroups(BaseModel): inherits = IntegerField() permissions = TextField(null=True) title = CharField() class Meta: db_table = 'usergroups' class Userpermissions(BaseModel): permissions = TextField(null=True) uid = IntegerField() class Meta: db_table = 'userpermissions' class Users(BaseModel): bio = TextField(null=True) birthday = IntegerField() blocklayouts = IntegerField() color = CharField() dateformat = CharField() displayname = CharField() email = CharField() fontsize = IntegerField() forbiddens = CharField() globalblock = IntegerField() hascolor = IntegerField() homepagename = CharField() homepageurl = CharField() karma = IntegerField() lastactivity = IntegerField() lastforum = IntegerField() lastip = CharField() lastknownbrowser = TextField(null=True) lastposttime = IntegerField() lasturl = CharField() location = CharField() loggedin = IntegerField() lostkey = CharField() lostkeytimer = IntegerField() minipic = CharField() name = CharField() newcomments = IntegerField() password = CharField() picture = CharField() pluginsettings = TextField(null=True) postheader = TextField(null=True) postplusones = IntegerField() postplusonesgiven = IntegerField() posts = IntegerField() postsperpage = IntegerField() powerlevel = IntegerField() pss = CharField() rankset = CharField() realname = CharField() regdate = IntegerField() sex = IntegerField() showemail = IntegerField() signature = TextField(null=True) signsep = IntegerField() tempbanpl = IntegerField() tempbantime = BigIntegerField() theme = CharField() threadsperpage = IntegerField() timeformat = CharField() timezone = FloatField() title = CharField() usebanners = IntegerField() class Meta: db_table = 'users' class Uservotes(BaseModel): uid = IntegerField() up = IntegerField() voter = IntegerField() class Meta: db_table = 'uservotes' class WikiPages(BaseModel): flags = IntegerField() id = CharField() revision = IntegerField() class Meta: db_table = 'wiki_pages' class WikiPagesText(BaseModel): date = IntegerField() id = CharField() revision = IntegerField() text = TextField(null=True) user = IntegerField() class Meta: db_table = 'wiki_pages_text'