def edit_role2(post, permissions):
    #Обновлеяем запись
    obj = get_role2(post['id'])
    if not obj:
        return False
    obj.name = post['rolename']
    obj.rolesgroup = post['rolegroup']
    obj.description = post['description']
    obj.ordering = post['order']  
    
    #Удаляем роли
    DBSession.query(PermissionsRoles).filter(PermissionsRoles.role_id == post['id']).delete()
            
    #Добавляем роли
    for e in permissions:
        pr = PermissionsRoles(post['id'], e)
        DBSession.add(pr)  
    
    try:
        transaction.commit()
    except:
        transaction.rollback()
        return False
    else:
        return True
def get_posts(offset=None, limit=None):
    
    setallroute()
    
    if offset==None or limit==None:
        return DBSession.query(Blogs).all()
    else:
        return (DBSession.query(Blogs).all())[offset:limit]
def get_roles(offset=None, limit=None):
    
    #Добавить короткое описание
    setopt(Roles, 'shortdesc', Roles_shortdesc)
    
    if offset==None or limit==None:
        return DBSession.query(Roles).all()
    else:
        return DBSession.query(Roles).all()[offset:limit]
def get_users(offset=None, limit=None):

    # Форматирование даты и активности
    setallroute()

    if offset == None or limit == None:
        return DBSession.query(Users).all()
    else:
        return (DBSession.query(Users).all())[offset:limit]
def get_permissions2(offset=None, limit=None):
    
    #Добавить короткое описание
    setopt(Permissions, 'shortdesc', Permissions_shortdesc)
    
    if offset==None or limit==None:
        return DBSession.query(Permissions).all()
    else:
        return DBSession.query(Permissions).all()[offset:limit]
def delete_permissions(delitems):
    try:
        for e in delitems:
            DBSession.query(Permissions).filter(Permissions.id == e).delete()
        transaction.commit()
        result = 1
    except:
        transaction.rollback()
        result = 0
    return result
def new_accesslog(ip, e=1, u=0):
    
    l = AccessLog(ip, e, user_id=u)
    DBSession.add(l)
    
    try:
        transaction.commit()
    except:
        DBSession.rollback()
        return False
def delete_posts(delitems, thread='blog'):
    try:
        for e in delitems:
            DBSession.query(Blogs).filter(Blogs.id == e).delete()
            DBSession.query(Comments).filter(Comments.thread == thread).filter(Comments.threadid == e).delete()
        transaction.commit()
        result = 1
    except:
        transaction.rollback()
        result = 0
    return result
def put_userprofile(userid, post):
    p = DBSession.query(Profiles).filter(Profiles.userid == userid).one()
    
    p.fullname = post['fullname']
    
    try:
        transaction.commit()
    except:
        DBSession.rollback()
        return False
    else:
        return True
def delete_comment(itemid):

    DBSession.query(Comments).filter(Comments.id == itemid).delete()

    try:
        transaction.commit()
        result = 1
    except:
        DBSession.rollback()
        result = 0

    return result
def db_set_avatar(post):
    p = DBSession.query(Profiles).filter(Profiles.userid == post['id']).all()
    if not p[0]:
        return False
    p[0].avatar1 = post['avatarsource']
    p[0].avatar2 = post['avatarsize1']
    p[0].avatar3 = post['avatarsize2']
    
    try:
        transaction.commit()
    except:
        DBSession.rollback()
        return False
    else:
        return True
def set_userpassword(post):
    setopt(Users, 'check_password', Users_check_password)
    user = DBSession.query(Users).filter(Users.id == post['userid']).one()
    if user.check_password(post['oldpassword']):
        user.password = hash_password(post['password'])
        
        try:
            transaction.commit()
        except:
            DBSession.rollback()
            return False
        else:
            return 1
        
    else:
        return 2
def get_user(username):
    setopt(Users, 'check_password', Users_check_password)
    user = DBSession.query(Users).filter(Users.username == username).all()
    if user:
        return user[0]
    else:
        return None
def get_accesslog_badlogin(ip, e=1, t=180, attempt=3):
    
    ls = DBSession.query(AccessLog).filter(AccessLog.event_id == e).filter(AccessLog.ip == ip).filter(AccessLog.eventdate > int(time.time())-180).count()
    if ls < attempt:
        return True
    else:
        return False
def db_count_comments(thread, threadid):
    return (
        DBSession.query(Comments)
        .filter(Comments.thread == thread)
        .filter(Comments.published == 1)
        .filter(Comments.threadid == threadid)
        .count()
    )
def edit_comment(itemid, title, content):

    ts = int(time.time())

    obj = get_comment(itemid)
    obj.title = title
    obj.content = content
    obj.last_edited = ts

    try:
        transaction.commit()
        result = 1
    except:
        DBSession.rollback()
        result = 0

    return result
def count_comments(component, componentid):
    return (
        DBSession.query(Comments)
        .filter(Comments.thread == component)
        .filter(Comments.threadid == componentid)
        .filter(Comments.published == 1)
        .count()
    )
def get_comment2(id, ordering="id", component="blog", componentid=1):
    # Вывод с форматированием даты
    setopt(Comments, "datefromtimestamp", Comments_datefromtimestamp)
    return (
        DBSession.query(Comments)
        .filter(Comments.id == id)
        .filter(Comments.thread == component)
        .filter(Comments.threadid == componentid)
        .one()
    )
def get_posts2(post, orderbytable, offset, limit):
    
    for key in orderbytable.keys():
        if post['col'] == key:
            order_by=orderbytable[key]
    
    if post['asc'] == '1':
        ordering = asc(order_by)
    if post['asc'] == '0':
        ordering = desc(order_by)
    
    if 'phr' in post:
        if post['phr'] != '':
            phr = '%'+ post['phr'] +'%'
            filter = (dict(Blogs.__dict__))[post['lke']].like(phr)
            blogs = (DBSession.query(Blogs).filter(filter).order_by(ordering).all())[offset:limit]
    else:
        blogs = (DBSession.query(Blogs).order_by(ordering).all())[offset:limit]
    return blogs
def db_put_comment(itemid, post):

    p = get_bbparser()

    content = p.format(post["content"])

    obj = get_comment(itemid)
    obj.title = post["title"]
    obj.content = content
    obj.last_edited = post["last_edited"]

    try:
        transaction.commit()
        result = 1
    except:
        DBSession.rollback()
        result = 0

    return (result, content)
def get_comments(ordering, component, componentid, offset, limit):
    # Вывод с форматированием даты
    setopt(Comments, "datefromtimestamp", Comments_datefromtimestamp)
    order_by = asc(ordering)
    return (
        DBSession.query(Comments)
        .filter(Comments.thread == component)
        .filter(Comments.threadid == componentid)
        .order_by(order_by)
        .all()
    )[offset:limit]
def edit_post2(post, tags):
    
    ts = time.time()
    
    obj = get_post2(post['id'])
    if not obj:
        return False
    obj.title = post['title']
    obj.slug = post['alias']
    obj.userid = post['userid']
    obj.intro = post['into']
    obj.content = post['content']
    obj.published = post['published']
    obj.comments = post['comments']
    obj.comments_premoderation = post['comments_premoderation']
    obj.last_edited = ts
    
    #Удаляем тэги
    DBSession.query(TagsPosts).filter(TagsPosts.post_id == post['id']).delete()
    
    #Добавляем тэги
    for e in tags:
        pt = TagsPosts(post['id'], e)
        DBSession.add(pt)
    
    try:
        transaction.commit()
    except:
        DBSession.rollback()
        return False
    else:
        return True
def edit_user2(post, roles, useavatars):
    # Обновлеяем запись
    obj = get_user2(post["id"])
    if not obj:
        return False
    obj.username = post["username"]
    obj.email = post["email"]
    obj.profiles.fullname = post["fullname"]
    if useavatars == 1 and "avatarsource" in post:
        obj.profiles.avatar1 = post["avatarsource"]
        obj.profiles.avatar2 = post["avatarsize1"]
        obj.profiles.avatar3 = post["avatarsize2"]
    if post["password"] != "":
        obj.password = hash_password(post["password"])

    # Удаляем роли
    DBSession.query(RolesUsers).filter(RolesUsers.user_id == post["id"]).delete()

    # Добавляем роли
    for e in roles:
        ru = RolesUsers(post["id"], e)
        DBSession.add(ru)

    try:
        transaction.commit()
    except:
        DBSession.rollback()
        return False
    else:
        return True
def add_comment(userid, thread, threadid, threadtitle, title, content):

    p = Parser()
    p.add_simple_formatter(
        "video",
        '<object width="480" height="360"><embed src="http://www.youtube.com/v/%(value)s" type="application/x-shockwave-flash" width="480" height="360"></embed></object>',
    )
    p.add_simple_formatter(
        "img", '<img style="max-width:480px; max-height:400px;" src="%(value)s" alt="" />', replace_links=False
    )

    ts = int(time.time())

    DBSession.autoflush = False
    c = Comments(userid, thread, threadid, threadtitle, title, p.format(content), created=ts)
    DBSession.add(c)
    DBSession.flush()

    try:
        transaction.commit()
        result = 1
    except:
        DBSession.rollback()
        result = 0

    return result
def get_users2(post, orderbytable, offset, limit):

    # Форматирование даты и активности
    setallroute()

    for key in orderbytable.keys():
        if post["col"] == key:
            order_by = orderbytable[key]

    if post["asc"] == "1":
        ordering = asc(order_by)
    if post["asc"] == "0":
        ordering = desc(order_by)

    if "phr" in post:
        if post["phr"] != "":
            phr = "%" + post["phr"] + "%"
            filter = (dict(Users.__dict__))[post["lke"]].like(phr)
            users = (DBSession.query(Users).filter(filter).order_by(ordering).all())[offset:limit]
    else:
        users = (DBSession.query(Users).order_by(ordering).all())[offset:limit]
    return users
def new_permission2(post):
    #Добавляем запись
    DBSession.autoflush = False
    r = Permissions(post['permname'], description=post['description'], ordering=post['order'])   
    DBSession.add(r)
    DBSession.flush()
    DBSession.refresh(r)
            
    try:
        transaction.commit()
    except:
        DBSession.rollback()
        return False
    else:
        return r
def get_roles2(post, orderbytable, offset, limit):
    
    #Добавить короткое описание
    setopt(Roles, 'shortdesc', Roles_shortdesc)
    
    for key in orderbytable.keys():
        if post['col'] == key:
            order_by=orderbytable[key]
    
    if post['asc'] == '1':
        ordering = asc(order_by)
    if post['asc'] == '0':
        ordering = desc(order_by)
    
    if 'phr' in post:
        if post['phr'] != '':
            phr = '%'+ post['phr'] +'%'
            filter = (dict(Roles.__dict__))[post['lke']].like(phr)
            roles = (DBSession.query(Roles).filter(filter).order_by(ordering).all())[offset:limit]
    else:
        roles = (DBSession.query(Roles).order_by(ordering).all())[offset:limit]
    
    return roles
def get_comments2(get, ordering="id", thread="blog", threadid=1, offset=0, limit=100):
    # Вывод с форматированием даты
    setopt(Comments, "datefromtimestamp", Comments_datefromtimestamp)
    # order_by = asc(ordering)
    if get["sortorder"] == "asc":
        order_by = asc(ordering)
    if get["sortorder"] == "desc":
        order_by = desc(ordering)
    return (
        DBSession.query(Comments)
        .filter(Comments.thread == thread)
        .filter(Comments.threadid == threadid)
        .filter(Comments.published == 1)
        .order_by(order_by)
        .all()
    )[offset:limit]
def db_add_comment(post):

    p = get_bbparser()

    content = p.format(post["content"])

    DBSession.autoflush = False
    c = Comments(
        post["userid"], post["thread"], post["threadid"], post["threadtitle"], post["title"], content, post["created"]
    )
    DBSession.add(c)
    DBSession.flush()
    DBSession.refresh(c)

    try:
        transaction.commit()
        result = 1
    except:
        DBSession.rollback()
        result = 0

    u = DBSession.query(Users).filter(Users.id == post["userid"]).one()

    return (result, content, c.id, u.profiles.avatar3)
def db_get_useractivation(post, roles):
    ua = DBSession.query(UsersActivation).filter(UsersActivation.code == post['ticket']).all()
    if ua:
        DBSession.query(RolesUsers).filter(RolesUsers.user_id == ua[0].userid).delete()
        for e in roles:
            ru = RolesUsers(ua[0].userid, e)
            DBSession.add(ru)
        
        try:
            transaction.commit()
        except:
            DBSession.rollback()
            return False
        else:
            return True
        
        return ua[0]
    else:
        return None