def edit(game_id:int):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        if len(game) == 0:
            raise bottle.HTTPError(404)
        if pages.auth.current().user_id() != game.created_by() and \
                        pages.auth.current().user_id() != game.responsible_user_id() and \
                not pages.auth.current().userlevel.admin():
            return pages.templates.permission_denied()
        _sport_types = sport_types.get(0, dbconnection=db)
        _game_types = game_types.get(0, dbconnection=db)
        _cities = cities.get(0, dbconnection=db)
        _courts = courts.get(0, dbconnection=db)
        responsibles = users.get(0, 2, dbconnection=db)
        unsubscribed = games.get_unsubscribed_users(game_id, dbconnection=db)
        unsubscribed_list = list()
        db.execute("SELECT * FROM users WHERE user_id IN (SELECT DISTINCT user_id FROM reports WHERE user_id!=0 AND status=2 AND game_id IN (SELECT game_id FROM games WHERE deleted=0 AND datetime+INTERVAL duration MINUTE < NOW() AND court_id='{}' AND sport_type='{}' AND game_type='{}'))".format( # as long as my dick
            game.court_id(), game.sport_type(), game.game_type()), dbutils.dbfields['users'])
        last_users = list(map(lambda x: User(x, db), db.last()))
        for i in unsubscribed:
            user = users.get(i[0], dbconnection=db)
            dt = i[1]
            unsubscribed_list.append((user, dt))
        return pages.PageBuilder('editgame', game=game, sports=_sport_types, game_types=_game_types, cities=_cities,
                                 courts=_courts, responsibles=responsibles, unsubscribed=unsubscribed_list,
                                 last_users=last_users)
def post():
    if bottle.request.is_ajax:
        section = bottle.request.forms.get("section")
        startfrom = int(bottle.request.forms.get("startfrom"))
        data = list()
        if section == 'all':
            with dbutils.dbopen() as db:
                allusers = users.get(0, count=slice(startfrom, USERS_PER_PAGE), dbconnection=db)
                page = pages.PageBuilder('user_row')
                if pages.auth.loggedin():
                    if len(pages.auth.current().friends()) > 0:
                        friends = pages.auth.current().friends(True)
                        page.add_param('myfriends', friends)
                for user in allusers:
                    page.add_param('user', user)
                    user_tpl = page.template()
                    data.append(user_tpl)
                return bottle.json_dumps(data)
        return ''
    else:
        if 'search' in bottle.request.forms:
            query = bottle.request.forms.get('q')
            with dbutils.dbopen() as db:
                allusers = users.search(query, dbconnection=db)
                page = pages.PageBuilder('users', allusers=users.get(allusers, dbconnection=db),
                                         count=len(allusers),
                                         search=True, search_q=bottle.request.forms.get('q'))
                if pages.auth.loggedin() and len(pages.auth.current().friends()) > 0:
                    friends = pages.auth.current().friends(True)
                    page.add_param('myfriends', friends)
                return page
def subscribe(game_id: int):
    with dbutils.dbopen() as db:
        user = current_user(db, detalized=True)
        game = games.get_by_id(game_id, dbconnection=db)
        if user.banned():
            raise Error.game_conflict(2)
        if 0 < game.capacity() == len(game.subscribed()):
            raise Error.game_conflict(4)
        if user.user_id() in set(game.subscribed()):
            raise Error.game_conflict(5)
        another_game = games.user_game_intersection(user.user_id(),
                                                    game,
                                                    dbconnection=db)
        if another_game:
            raise Error.game_conflict(1, another_game.game_id())
        games.subscribe(user.user_id(), game_id, dbconnection=db)
        if game.datetime.tommorow or game.datetime.today:
            user = users.get(user.user_id(), dbconnection=db) if user.user_id(
            ) != pages.auth.current().user_id() else pages.auth.current()
            message = 'На игру "{}" записался {}'.format(
                create_link.game(game), create_link.user(user))
            utils.spool_func(
                notificating.site.responsible,
                game.responsible_user_id(),
                message,
                1,
                game_id,
            )
        return {'status': 'ok'}
def current_user(db: dbutils.DBConnection, detalized: bool = False):
    token = bottle.request.query.get('token')
    user_id = db.execute(
        "SELECT user_id FROM api_auth WHERE token='{}'".format(token))[0][0]
    if detalized:
        return users.get(user_id, dbconnection=db)
    return user_id
Beispiel #5
0
def get():
    with dbutils.dbopen() as db:
        user_id = pages.auth.current().user_id()
        user = users.get(user_id, dbconnection=db)
        page = pages.PageBuilder('profile', user=user)
        page.add_param(
            'user_games',
            games.get_by_id(games.get_user_played_games(user_id,
                                                        dbconnection=db),
                            dbconnection=db))
        page.add_param(
            'responsible_games',
            games.get_by_id(games.get_responsible_games(user_id,
                                                        dbconnection=db),
                            dbconnection=db))
        page.add_param(
            'organizer_games',
            games.get_by_id(games.get_organizer_games(user_id,
                                                      dbconnection=db),
                            dbconnection=db))
        with dbutils.dbopen(**dbutils.logsdb_connection) as logsdb:
            logsdb.execute(
                "SELECT COUNT(DISTINCT(ip)), COUNT(ip) FROM access WHERE path='/profile?user_id={}' and user_id!=0"
                .format(user_id))
            page.add_param('views', logsdb.last()[0][1])
            page.add_param('uviews', logsdb.last()[0][0])
        return page
Beispiel #6
0
def get_by_id(user_id: int):
    with dbutils.dbopen() as db:
        if user_id == pages.auth.current().user_id():
            raise bottle.redirect('/profile')
        user = users.get(user_id, dbconnection=db)
        if len(user) == 0:
            raise bottle.HTTPError(404)
        page = pages.PageBuilder('profile',
                                 user=user,
                                 myfriend=users.are_friends(
                                     pages.auth.current().user_id(),
                                     user_id,
                                     dbconnection=db))
        page.add_param(
            'user_games',
            games.get_by_id(games.get_user_played_games(user_id,
                                                        dbconnection=db),
                            dbconnection=db))
        page.add_param(
            'responsible_games',
            games.get_by_id(games.get_responsible_games(user_id,
                                                        dbconnection=db),
                            dbconnection=db))
        page.add_param('organizer_games', games.get_all(dbconnection=db))
        with dbutils.dbopen(**dbutils.logsdb_connection) as logsdb:
            logsdb.execute(
                "SELECT COUNT(DISTINCT(ip)), COUNT(ip) FROM access WHERE (path='/profile?user_id={}' or path='/profile/{}') and user_id!=0"
                .format(user_id, user_id))
            page.add_param('views', logsdb.last()[0][1])
            page.add_param('uviews', logsdb.last()[0][0])
        return page
def add():
    with dbutils.dbopen() as db:
        _sports = sport_types.get(0, dbconnection=db)
        _game_types = game_types.get(0, dbconnection=db)
        _cities = cities.get(0, dbconnection=db)
        _courts = courts.get(0, dbconnection=db)
        responsibles = users.get(0, 2, dbconnection=db)
        return pages.PageBuilder("addgame", sports=_sports, game_types=_game_types, cities=_cities, courts=_courts,
                                 responsibles=responsibles)
def notify_array(game_id:int):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        db.execute("SELECT DISTINCT user_id FROM reports WHERE user_id!=0 AND status=2 AND game_id IN (SELECT game_id FROM games WHERE deleted=0 AND datetime+INTERVAL duration MINUTE < NOW() AND court_id='{}' AND sport_type='{}' AND game_type='{}')".format( # as long as my dick
            game.court_id(), game.sport_type(), game.game_type()))
        if len(db.last())==0: return json.dumps({'users':list(), 'count':0})
        users_ = users.get(list(map(lambda x: x[0], db.last())), dbconnection=db)
        users_ = list(map(lambda x: {'user_id':x.user_id(), 'name':str(x.name), 'visits':user_visits(x, db)}, users_))
        return json.dumps({'count':len(users_), 'users':users_})
def get():
    with dbutils.dbopen() as db:
        count = db.execute("SELECT COUNT(user_id) FROM users")[0][0]
        allusers = users.get(0, count=slice(*modules.pager(1, count=USERS_PER_PAGE)))
        page = pages.PageBuilder('users', allusers=allusers, count=count)
        if pages.auth.loggedin():
            if len(pages.auth.current().friends()) > 0:
                friends = pages.auth.current().friends(True)
                page.add_param('myfriends', friends)
        return page
def edit():
    with dbutils.dbopen() as db:
        _cities = cities.get(0, dbconnection=db)
        user = users.get(pages.auth.current().user_id(), dbconnection=db)
        _ampluas = ampluas.get(0, dbconnection=db)
        _ampluas = {
            sport_type_title: list(filter(lambda x: x.sport_type(True).title() == sport_type_title, _ampluas)) for
            sport_type_title in {i.sport_type(True).title() for i in _ampluas}}
        return pages.PageBuilder('editprofile', user=user, cities=_cities, ampluas=_ampluas,
                                 haveavatar=images.have_avatar(pages.auth.current().user_id()))
def check_responsible(user_id:int, datetime:str, duration:int, db):
    query = """\
         SELECT game_id FROM games WHERE responsible_user_id={user_id} AND (\
         (DATETIME BETWEEN '{datetime}' AND '{datetime}' + INTERVAL {duration} MINUTE) OR \
         (DATETIME + INTERVAL {duration} MINUTE BETWEEN '{datetime}' AND '{datetime}' + INTERVAL {duration} MINUTE));\
         """.format(user_id=user_id, datetime=datetime, duration=duration)
    db.execute(query)
    if len(db.last()) != 0:
        return pages.templates.message("{} уже занят на это время".format(
            modules.create_link.user(users.get(user_id, dbconnection=db))), '')
def settings_post():
    with dbutils.dbopen() as db:
        send_email = 'email_notify' in bottle.request.forms
        show_phone = bottle.request.forms['phone']
        db.execute("UPDATE users SET settings='{}' WHERE user_id={}".format(
            json.dumps({'send_mail': send_email, 'show_phone': show_phone}), pages.auth.current().user_id()))
        user = users.get(pages.auth.current().user_id(), dbconnection=db)
        pages.auth.reloaduser(user._pure)
        #cacher.drop_by_table_name('users', 'user_id', pages.auth.current().user_id())
        raise bottle.redirect("/profile/settings")
 def notify_reserved(game, user_id:int):
     user = users.get(user_id)
     html_email = pages.PageBuilder('mail_notify_reserved', game=game, user=user).template()
     email = user.email()
     plain = 'На игре освободилось место http://{}/games/{}'.format(config.server.str, game.game_id())
     subject = 'В игре освободилось место!'
     if user.settings.send_mail():
         try:
             mail.html(subject, html_email, email, plain)
         except Exception as e:
             logging.message("Error sending email to <{}>".format(email), e)
Beispiel #14
0
    def exposed_get_user(self, session_id, token, user_id):
        if (session_id in self.login_users
                and token == self.login_users[session_id]['token']):
            # token有效
            operator = self.login_users[session_id]['id']

            # 检查用户权限
            operator_info = users.get(self.host, self.user, self.passwd,
                                      operator)
            if (operator_info
                    and int.from_bytes(operator_info[0]['dominated'], 'big')):
                result = users.get(self.host, self.user, self.passwd, user_id)
            else:
                result = 2  # 用户权限不足
            mnemosyne.create(self.host, self.user, self.passwd, 'user',
                             operator, 3, 1 if result else 0)
        else:
            # token失效
            result = -1
        return result
Beispiel #15
0
def get():
    with dbutils.dbopen() as db:
        count = db.execute("SELECT COUNT(user_id) FROM users")[0][0]
        allusers = users.get(
            0, count=slice(*modules.pager(1, count=USERS_PER_PAGE)))
        page = pages.PageBuilder('users', allusers=allusers, count=count)
        if pages.auth.loggedin():
            if len(pages.auth.current().friends()) > 0:
                friends = pages.auth.current().friends(True)
                page.add_param('myfriends', friends)
        return page
def notify(game_id:int):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        db.execute("SELECT DISTINCT user_id FROM reports WHERE user_id!=0 AND status=2 AND game_id IN (SELECT game_id FROM games WHERE deleted=0 AND datetime+INTERVAL duration MINUTE < NOW() AND court_id='{}' AND sport_type='{}' AND game_type='{}')".format( # as long as my dick
            game.court_id(), game.sport_type(), game.game_type()))
        if len(db.last())==0: return json.dumps({'users':list(), 'count':0})
        users_ = users.get(list(map(lambda x: x[0], db.last())), dbconnection=db)
        users_ = list(filter(lambda x: user_visits(x, db)<3 and x.user_id() not in set(game.subscribed()), users_))
        for user in users_:
            send_notify_email(user.user_id(), game.game_id())
        ids = list(map(lambda x: x.user_id(), users_))
        return json.dumps({'count':len(ids), 'users':[[user.user_id(), str(user.name)] for user in users_]})
Beispiel #17
0
def check_responsible(user_id: int, datetime: str, duration: int, db):
    query = """\
         SELECT game_id FROM games WHERE responsible_user_id={user_id} AND (\
         (DATETIME BETWEEN '{datetime}' AND '{datetime}' + INTERVAL {duration} MINUTE) OR \
         (DATETIME + INTERVAL {duration} MINUTE BETWEEN '{datetime}' AND '{datetime}' + INTERVAL {duration} MINUTE));\
         """.format(user_id=user_id, datetime=datetime, duration=duration)
    db.execute(query)
    if len(db.last()) != 0:
        return pages.templates.message(
            "{} уже занят на это время".format(
                modules.create_link.user(users.get(user_id, dbconnection=db))),
            '')
Beispiel #18
0
def add():
    with dbutils.dbopen() as db:
        _sports = sport_types.get(0, dbconnection=db)
        _game_types = game_types.get(0, dbconnection=db)
        _cities = cities.get(0, dbconnection=db)
        _courts = courts.get(0, dbconnection=db)
        responsibles = users.get(0, 2, dbconnection=db)
        return pages.PageBuilder("addgame",
                                 sports=_sports,
                                 game_types=_game_types,
                                 cities=_cities,
                                 courts=_courts,
                                 responsibles=responsibles)
Beispiel #19
0
def settings_post():
    with dbutils.dbopen() as db:
        send_email = 'email_notify' in bottle.request.forms
        show_phone = bottle.request.forms['phone']
        db.execute("UPDATE users SET settings='{}' WHERE user_id={}".format(
            json.dumps({
                'send_mail': send_email,
                'show_phone': show_phone
            }),
            pages.auth.current().user_id()))
        user = users.get(pages.auth.current().user_id(), dbconnection=db)
        pages.auth.reloaduser(user._pure)
        #cacher.drop_by_table_name('users', 'user_id', pages.auth.current().user_id())
        raise bottle.redirect("/profile/settings")
Beispiel #20
0
def post():
    if bottle.request.is_ajax:
        section = bottle.request.forms.get("section")
        startfrom = int(bottle.request.forms.get("startfrom"))
        data = list()
        if section == 'all':
            with dbutils.dbopen() as db:
                allusers = users.get(0,
                                     count=slice(startfrom, USERS_PER_PAGE),
                                     dbconnection=db)
                page = pages.PageBuilder('user_row')
                if pages.auth.loggedin():
                    if len(pages.auth.current().friends()) > 0:
                        friends = pages.auth.current().friends(True)
                        page.add_param('myfriends', friends)
                for user in allusers:
                    page.add_param('user', user)
                    user_tpl = page.template()
                    data.append(user_tpl)
                return bottle.json_dumps(data)
        return ''
    else:
        if 'search' in bottle.request.forms:
            query = bottle.request.forms.get('q')
            with dbutils.dbopen() as db:
                allusers = users.search(query, dbconnection=db)
                page = pages.PageBuilder(
                    'users',
                    allusers=users.get(allusers, dbconnection=db),
                    count=len(allusers),
                    search=True,
                    search_q=bottle.request.forms.get('q'))
                if pages.auth.loggedin() and len(
                        pages.auth.current().friends()) > 0:
                    friends = pages.auth.current().friends(True)
                    page.add_param('myfriends', friends)
                return page
def unsubscribe(user_id:int, game_id:int, suspress:bool=False):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        if game.datetime.passed: raise bottle.HTTPError(404)
        if user_id not in set(game.subscribed()):
            return pages.PageBuilder("game", game=game, conflict=6)
        if not suspress and game.datetime.tommorow and game.datetime.time().hour<=12 and datetime.datetime.now().hour>=20:
            return pages.PageBuilder("game", game=game, conflict=11)
        games.unsubscribe(user_id, game_id, dbconnection=db)
        if datetime.datetime.now()-game.datetime()<datetime.timedelta(days=3):
            user = users.get(user_id, dbconnection=db) if user_id!=pages.auth.current().user_id() else pages.auth.current()
            message = '{} отписался от игры "{}"'.format(create_link.user(user), create_link.game(game))
            utils.spool_func(notificating.site.responsible, game.responsible_user_id(), message, 1, game_id)
        game = games.get_by_id(game_id, dbconnection=db)
        return pages.PageBuilder("game", game=game)
def get():
    with dbutils.dbopen() as db:
        user_id = pages.auth.current().user_id()
        user = users.get(user_id, dbconnection=db)
        page = pages.PageBuilder('profile', user=user)
        page.add_param('user_games',
                       games.get_by_id(games.get_user_played_games(user_id, dbconnection=db), dbconnection=db))
        page.add_param('responsible_games',
                       games.get_by_id(games.get_responsible_games(user_id, dbconnection=db), dbconnection=db))
        page.add_param('organizer_games',
                       games.get_by_id(games.get_organizer_games(user_id, dbconnection=db), dbconnection=db))
        with dbutils.dbopen(**dbutils.logsdb_connection) as logsdb:
            logsdb.execute("SELECT COUNT(DISTINCT(ip)), COUNT(ip) FROM access WHERE path='/profile?user_id={}' and user_id!=0".format(user_id))
            page.add_param('views', logsdb.last()[0][1])
            page.add_param('uviews', logsdb.last()[0][0])
        return page
Beispiel #23
0
    def exposed_update_env(self, session_id, token, env, read_host, write_host,
                           user, passwd):
        if (session_id in self.login_users
                and token == self.login_users[session_id]['token']):
            # token有效
            operator = self.login_users[session_id]['id']

            # 检查用户权限
            operator_info = users.get(self.host, self.user, self.passwd,
                                      operator)
            if (operator_info
                    and int.from_bytes(operator_info[0]['dominated'], 'big')):
                result = 999
                if write_host and user and passwd:
                    result1 = 0
                    result2 = 0
                    if read_host:
                        result1 = mysql.test(read_host, user, passwd)
                    result2 = mysql.test(write_host, user, passwd)
                    result = result1 + result2
                    if not result:
                        # 是否存在重复的环境
                        dup_env = environments.find_duplicate(
                            self.host, self.user, self.passwd, env, read_host,
                            write_host)
                        if dup_env is None:
                            result = 3  # 数据库错误
                        else:
                            if dup_env:
                                dup_envname = dup_env[0]['name']
                                if dup_envname != env:
                                    return dup_envname
                            # 更新数据库
                            if environments.update(self.host, self.user,
                                                   self.passwd, env, read_host,
                                                   write_host, user, passwd):
                                result = 3  # 数据库错误
                else:
                    result = 2  # 写库连接失败
            else:
                result = 4  # 用户权限不足
            mnemosyne.create(self.host, self.user, self.passwd, 'environment',
                             operator, 2, 1 if result else 0)
        else:
            # token失效
            result = -1
        return result
Beispiel #24
0
    def exposed_get_environments(self, session_id, token):
        if (session_id in self.login_users
                and token == self.login_users[session_id]['token']):
            # token有效
            operator = self.login_users[session_id]['id']

            # 检查用户是否为管理员
            operator_info = users.get(self.host, self.user, self.passwd,
                                      operator)
            if (operator_info
                    and int.from_bytes(operator_info[0]['dominated'], 'big')):
                return environments.list(self.host, self.user, self.passwd)
            else:
                return environments.list(self.host, self.user, self.passwd,
                                         operator)
        else:
            # token失效
            return -1
def unsubscribe(game_id: int):
    with dbutils.dbopen() as db:
        user = current_user(db, detalized=True)
        game = games.get_by_id(game_id, dbconnection=db)
        if user.user_id() not in set(game.subscribed()):
            return pages.PageBuilder("game", game=game, conflict=6)
        if game.datetime.tommorow and game.datetime.time(
        ).hour <= 12 and datetime.datetime.now().hour >= 20:
            return pages.PageBuilder("game", game=game, conflict=11)
        games.unsubscribe(user.user_id(), game_id, dbconnection=db)
        if datetime.datetime.now() - game.datetime() < datetime.timedelta(
                days=3):
            user = users.get(user.user_id(), dbconnection=db) if user.user_id(
            ) != pages.auth.current().user_id() else pages.auth.current()
            message = '{} отписался от игры "{}"'.format(
                create_link.user(user), create_link.game(game))
            utils.spool_func(notificating.site.responsible,
                             game.responsible_user_id(), message, 1, game_id)
        return {'status': 'ok'}
Beispiel #26
0
    def exposed_get_current_user(self, session_id, token):
        if (session_id in self.login_users
                and token == self.login_users[session_id]['token']):
            # token有效
            operator = self.login_users[session_id]['id']

            # 检查用户权限
            operator_info = users.get(self.host, self.user, self.passwd,
                                      operator)
            if operator_info:
                result = operator_info[0]
            else:
                result = 2  # 出错
            mnemosyne.create(self.host, self.user, self.passwd, 'user',
                             operator, 3, 1 if result else 0)
        else:
            # token失效
            result = -1
        return result
Beispiel #27
0
def notify_array(game_id: int):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        db.execute(
            "SELECT DISTINCT user_id FROM reports WHERE user_id!=0 AND status=2 AND game_id IN (SELECT game_id FROM games WHERE deleted=0 AND datetime+INTERVAL duration MINUTE < NOW() AND court_id='{}' AND sport_type='{}' AND game_type='{}')"
            .format(  # as long as my dick
                game.court_id(), game.sport_type(), game.game_type()))
        if len(db.last()) == 0:
            return json.dumps({'users': list(), 'count': 0})
        users_ = users.get(list(map(lambda x: x[0], db.last())),
                           dbconnection=db)
        users_ = list(
            map(
                lambda x: {
                    'user_id': x.user_id(),
                    'name': str(x.name),
                    'visits': user_visits(x, db)
                }, users_))
        return json.dumps({'count': len(users_), 'users': users_})
Beispiel #28
0
def edit():
    with dbutils.dbopen() as db:
        _cities = cities.get(0, dbconnection=db)
        user = users.get(pages.auth.current().user_id(), dbconnection=db)
        _ampluas = ampluas.get(0, dbconnection=db)
        _ampluas = {
            sport_type_title: list(
                filter(
                    lambda x: x.sport_type(True).title() == sport_type_title,
                    _ampluas))
            for sport_type_title in
            {i.sport_type(True).title()
             for i in _ampluas}
        }
        return pages.PageBuilder('editprofile',
                                 user=user,
                                 cities=_cities,
                                 ampluas=_ampluas,
                                 haveavatar=images.have_avatar(
                                     pages.auth.current().user_id()))
def get_by_id(user_id:int):
    with dbutils.dbopen() as db:
        if user_id == pages.auth.current().user_id():
            raise bottle.redirect('/profile')
        user = users.get(user_id, dbconnection=db)
        if len(user) == 0:
            raise bottle.HTTPError(404)
        page = pages.PageBuilder('profile', user=user,
                                 myfriend=users.are_friends(
                                     pages.auth.current().user_id(),
                                     user_id, dbconnection=db))
        page.add_param('user_games',
                       games.get_by_id(games.get_user_played_games(user_id, dbconnection=db), dbconnection=db))
        page.add_param('responsible_games',
                       games.get_by_id(games.get_responsible_games(user_id, dbconnection=db), dbconnection=db))
        page.add_param('organizer_games', games.get_all(dbconnection=db))
        with dbutils.dbopen(**dbutils.logsdb_connection) as logsdb:
            logsdb.execute("SELECT COUNT(DISTINCT(ip)), COUNT(ip) FROM access WHERE (path='/profile?user_id={}' or path='/profile/{}') and user_id!=0".format(user_id, user_id))
            page.add_param('views', logsdb.last()[0][1])
            page.add_param('uviews', logsdb.last()[0][0])
        return page
def unsubscribe(user_id: int, game_id: int, suspress: bool = False):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        if game.datetime.passed: raise bottle.HTTPError(404)
        if user_id not in set(game.subscribed()):
            return pages.PageBuilder("game", game=game, conflict=6)
        if not suspress and game.datetime.tommorow and game.datetime.time(
        ).hour <= 12 and datetime.datetime.now().hour >= 20:
            return pages.PageBuilder("game", game=game, conflict=11)
        games.unsubscribe(user_id, game_id, dbconnection=db)
        if datetime.datetime.now() - game.datetime() < datetime.timedelta(
                days=3):
            user = users.get(user_id,
                             dbconnection=db) if user_id != pages.auth.current(
                             ).user_id() else pages.auth.current()
            message = '{} отписался от игры "{}"'.format(
                create_link.user(user), create_link.game(game))
            utils.spool_func(notificating.site.responsible,
                             game.responsible_user_id(), message, 1, game_id)
        game = games.get_by_id(game_id, dbconnection=db)
        return pages.PageBuilder("game", game=game)
Beispiel #31
0
    def exposed_update_env_name(self, session_id, token, env, new_env):
        if (session_id in self.login_users
                and token == self.login_users[session_id]['token']):
            # token有效
            operator = self.login_users[session_id]['id']

            # 检查用户权限
            operator_info = users.get(self.host, self.user, self.passwd,
                                      operator)
            if (operator_info
                    and int.from_bytes(operator_info[0]['dominated'], 'big')):
                result = environments.update_name(self.host, self.user,
                                                  self.passwd, env, new_env)
            else:
                result = 2  # 用户权限不足
            mnemosyne.create(self.host, self.user, self.passwd, 'environment',
                             operator, 2, 1 if result else 0)
        else:
            # token失效
            result = -1
        return result
Beispiel #32
0
 def exposed_validate_application(self, env, session_id, token, params,
                                  param_type, tenant_id):
     if (session_id in self.login_users
             and token == self.login_users[session_id]['token']):  # token有效
         operator = self.login_users[session_id]['id']
         # 检查用户权限
         operator_info = users.get(self.host, self.user, self.passwd,
                                   operator)
         if (operator_info
                 and int.from_bytes(operator_info[0]['dominated'], 'big')):
             env_info = environments.get(self.host, self.user, self.passwd,
                                         env)
         else:
             env_info = environments.get(self.host, self.user, self.passwd,
                                         env, operator)
         if env_info:
             read_host = env_info[0]['read_host']
             db_user = env_info[0]['user']
             db_passwd = env_info[0]['passwd']
             tenant_db = tenants.get_tenant_db(read_host, db_user,
                                               db_passwd, tenant_id)
             if tenant_db:
                 tenant_db_name = tenant_db[0]['tenant_db']
                 if param_type == 'KEY':
                     result = applications.list_by_keys(
                         read_host, db_user, db_passwd, tenant_db_name,
                         tenant_id, params)
                 elif param_type == 'FLOWNO':
                     result = applications.list_by_flownos(
                         read_host, db_user, db_passwd, tenant_db_name,
                         tenant_id, params)
             else:
                 result = 2  # 找不到商户数据库
         else:
             result = 1  # 环境无效
         mnemosyne.create(self.host, self.user, self.passwd, 'application',
                          operator, 3, 1 if isinstance(result, int) else 0)
     else:  # token失效
         return -1
     return result
def subscribe(user_id:int, game_id:int):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        if game.datetime.passed: raise bottle.HTTPError(404)
        if pages.auth.current().banned():
            return pages.PageBuilder("game", game=game, conflict=2)
        #if not pages.auth.current().activated():
        #    return pages.PageBuilder("game", game=game, conflict=3)
        if game.capacity() > 0 and len(game.subscribed()) == game.capacity():
            return pages.PageBuilder("game", game=game, conflict=4)
        if user_id in set(game.subscribed()):
            return pages.PageBuilder("game", game=game, conflict=5)
        another_game = games.user_game_intersection(user_id, game, dbconnection=db)
        if another_game:
            return pages.PageBuilder("game", game=game, conflict=1, conflict_data=another_game)
        games.subscribe(user_id, game_id, dbconnection=db)
        if game.datetime.tommorow or game.datetime.today:
            user = users.get(user_id, dbconnection=db) if user_id!=pages.auth.current().user_id() else pages.auth.current()
            message = 'На игру "{}" записался {}'.format(create_link.game(game), create_link.user(user))
            utils.spool_func(notificating.site.responsible, game.responsible_user_id(), message, 1, game_id,)
        game = games.get_by_id(game_id, dbconnection=db)
        return pages.PageBuilder("game", game=game)
Beispiel #34
0
 def exposed_get_tenants(self, env, session_id, token):
     if (session_id in self.login_users
             and token == self.login_users[session_id]['token']):  # token有效
         operator = self.login_users[session_id]['id']
         # 检查用户权限
         operator_info = users.get(self.host, self.user, self.passwd,
                                   operator)
         if (operator_info
                 and int.from_bytes(operator_info[0]['dominated'], 'big')):
             env_info = environments.get(self.host, self.user, self.passwd,
                                         env)
         else:
             env_info = environments.get(self.host, self.user, self.passwd,
                                         env, operator)
         if env_info:
             list_tenants = tenants.list(env_info[0]['read_host'],
                                         env_info[0]['user'],
                                         env_info[0]['passwd'])
             return list_tenants if list_tenants else list()
         else:
             return 1  # 环境无效
     else:  # token失效
         return -1
Beispiel #35
0
def notify(game_id: int):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        db.execute(
            "SELECT DISTINCT user_id FROM reports WHERE user_id!=0 AND status=2 AND game_id IN (SELECT game_id FROM games WHERE deleted=0 AND datetime+INTERVAL duration MINUTE < NOW() AND court_id='{}' AND sport_type='{}' AND game_type='{}')"
            .format(  # as long as my dick
                game.court_id(), game.sport_type(), game.game_type()))
        if len(db.last()) == 0:
            return json.dumps({'users': list(), 'count': 0})
        users_ = users.get(list(map(lambda x: x[0], db.last())),
                           dbconnection=db)
        users_ = list(
            filter(
                lambda x: user_visits(x, db) < 3 and x.user_id() not in set(
                    game.subscribed()), users_))
        for user in users_:
            send_notify_email(user.user_id(), game.game_id())
        ids = list(map(lambda x: x.user_id(), users_))
        return json.dumps({
            'count':
            len(ids),
            'users': [[user.user_id(), str(user.name)] for user in users_]
        })
Beispiel #36
0
    def exposed_update_own_passwd(self, session_id, token, passwd):
        if (session_id in self.login_users
                and token == self.login_users[session_id]['token']):
            # token有效
            operator = self.login_users[session_id]['id']

            # 检查用户权限
            operator_info = users.get(self.host, self.user, self.passwd,
                                      operator)
            if operator_info:
                result = users.update_passwd(self.host, self.user, self.passwd,
                                             operator_info[0]['id'], passwd)
                for k, v in list(self.login_users.items()):
                    if v['id'] == operator_info[0]['id']:
                        del self.login_users[k]
            else:
                result = 2  # 出错
            mnemosyne.create(self.host, self.user, self.passwd, 'user',
                             operator, 2, 1 if result else 0)
        else:
            # token失效
            result = -1
        return result
def post(game_id:int):
    game = games.get_by_id(game_id)
    if game.created_by() != pages.auth.current().user_id() and game.responsible_user_id() != pages.auth.current().user_id() and not pages.auth.current().userlevel.admin():
        return pages.templates.permission_denied()
    if game.reported() or game.deleted(): return pages.templates.message('Чё', 'Эээ')
    users_ = {int(user_id.split('=')[-1]): {"status": bottle.request.forms.get(user_id)} for user_id in
              filter(lambda x: x.startswith("status"), bottle.request.forms)}
    registered = {user_id: users_[user_id] for user_id in filter(lambda x: x > 0, users_)}
    unregistered = {user_id: users_[user_id] for user_id in filter(lambda x: x < 0, users_)}
    for user_id in unregistered:
        info = {key.split('=')[0]: bottle.request.forms.get(key) for key in
                filter(lambda x: x.endswith(str(user_id)), bottle.request.forms)}
        unregistered[user_id] = info
    report = dict()
    report['registered'] = {'count': len(registered), 'users': registered}
    report['unregistered'] = {'count': len(unregistered), 'users': unregistered}
    report['additional_charges'] = {int(i.split('=')[1]):(bottle.request.forms.get(i), bottle.request.forms.get('amount'+i.split('=')[1])) for i in filter(lambda x: x.startswith('description'), bottle.request.forms)}
    with dbutils.dbopen() as db:
        for user_id in report['unregistered']['users']:
            user = report['unregistered']['users'][user_id]
            name = user['first_name'].strip()+' '+user['last_name'].strip()
            reports.report_unregistered(game_id, user['status'], name, user['phone'], dbconnection=db)
        for user_id in report['registered']['users']:
            user = report['registered']['users'][user_id]
            status = user['status']
            reports.report(game_id, user_id, status, dbconnection=db)
        for n in report['additional_charges']:
            reports.report_additional_charges(game_id, *report['additional_charges'][n], dbconnection=db)
    if "photo" in bottle.request.files:
        images.save_report(game_id, bottle.request.files.get("photo"))
    if pages.auth.current().user_id() != game.created_by():
        notificating.site.responsible(game.created_by(), 'Ответственный "{}" отправил отчет по игре "{}"'.format(
            modules.create_link.user(users.get(pages.auth.current().user_id())),
            modules.create_link.game(game)), game_id)
    finances.add_game_finances(game_id, dbconnection=db)
    cacher.drop_by_table_name('games', 'game_id', game_id)
    raise bottle.redirect('/games/report/{}?ask_autocreate'.format(game_id))
Beispiel #38
0
    def exposed_update_user_passwd(self, session_id, token, user_id, passwd):
        if (session_id in self.login_users
                and token == self.login_users[session_id]['token']):
            # token有效
            operator = self.login_users[session_id]['id']

            # 检查用户权限
            operator_info = users.get(self.host, self.user, self.passwd,
                                      operator)
            if (operator_info
                    and int.from_bytes(operator_info[0]['dominated'], 'big')):
                result = users.update_passwd(self.host, self.user, self.passwd,
                                             user_id, passwd)
                for k, v in list(self.login_users.items()):
                    if v['id'] == user_id:
                        del self.login_users[k]
            else:
                result = 2  # 用户权限不足
            mnemosyne.create(self.host, self.user, self.passwd, 'user',
                             operator, 2, 1 if result else 0)
        else:
            # token失效
            result = -1
        return result
def subscribe(user_id: int, game_id: int):
    with dbutils.dbopen() as db:
        game = games.get_by_id(game_id, dbconnection=db)
        if game.datetime.passed: raise bottle.HTTPError(404)
        if pages.auth.current().banned():
            return pages.PageBuilder("game", game=game, conflict=2)
        #if not pages.auth.current().activated():
        #    return pages.PageBuilder("game", game=game, conflict=3)
        if game.capacity() > 0 and len(game.subscribed()) == game.capacity():
            return pages.PageBuilder("game", game=game, conflict=4)
        if user_id in set(game.subscribed()):
            return pages.PageBuilder("game", game=game, conflict=5)
        another_game = games.user_game_intersection(user_id,
                                                    game,
                                                    dbconnection=db)
        if another_game:
            return pages.PageBuilder("game",
                                     game=game,
                                     conflict=1,
                                     conflict_data=another_game)
        games.subscribe(user_id, game_id, dbconnection=db)
        if game.datetime.tommorow or game.datetime.today:
            user = users.get(user_id,
                             dbconnection=db) if user_id != pages.auth.current(
                             ).user_id() else pages.auth.current()
            message = 'На игру "{}" записался {}'.format(
                create_link.game(game), create_link.user(user))
            utils.spool_func(
                notificating.site.responsible,
                game.responsible_user_id(),
                message,
                1,
                game_id,
            )
        game = games.get_by_id(game_id, dbconnection=db)
        return pages.PageBuilder("game", game=game)
def send_notify_email(user_id, game_id):
    user = users.get(user_id)
    game = games.get_by_id(game_id)
    notificating.mail.tpl.game_invite(game, user)
 def html_to_id(subject:str, body:str, user_id:int, plain:str=None, dbconnection:dbutils.DBConnection=None):
     user = users.get(user_id, dbconnection=dbconnection)
     email = user.email()
     if user.settings.send_mail():
         return mail.html(subject, body, email, plain)
 def raw_to_id(subject:str, body:str, user_id:int, dbconnection:dbutils.DBConnection=None):
     user = users.get(user_id, dbconnection=dbconnection)
     email = user.email()
     return mail.raw(subject, body, email)
 def sms_to_id(user_id:int, text:str, source:str=None, dbconnection:dbutils.DBConnection=None):
     user = users.get(user_id, dbconnection=dbconnection)
     phone = user.phone()
     if not phone:
         raise ValueError('Invalid number <{}> - <{}>'.format(user_id, phone))
     return sms.raw(phone, text, source)
Beispiel #44
0
def get_ban():
    if 'user_id' not in bottle.request.query:
        raise bottle.HTTPError(404)
    user = users.get(int(bottle.request.query.get('user_id')))
    return pages.PageBuilder('ban', user=user)
Beispiel #45
0
def post(game_id: int):
    game = games.get_by_id(game_id)
    if game.created_by() != pages.auth.current(
    ).user_id() and game.responsible_user_id() != pages.auth.current().user_id(
    ) and not pages.auth.current().userlevel.admin():
        return pages.templates.permission_denied()
    if game.reported() or game.deleted():
        return pages.templates.message('Чё', 'Эээ')
    users_ = {
        int(user_id.split('=')[-1]): {
            "status": bottle.request.forms.get(user_id)
        }
        for user_id in filter(lambda x: x.startswith("status"),
                              bottle.request.forms)
    }
    registered = {
        user_id: users_[user_id]
        for user_id in filter(lambda x: x > 0, users_)
    }
    unregistered = {
        user_id: users_[user_id]
        for user_id in filter(lambda x: x < 0, users_)
    }
    for user_id in unregistered:
        info = {
            key.split('=')[0]: bottle.request.forms.get(key)
            for key in filter(lambda x: x.endswith(str(user_id)),
                              bottle.request.forms)
        }
        unregistered[user_id] = info
    report = dict()
    report['registered'] = {'count': len(registered), 'users': registered}
    report['unregistered'] = {
        'count': len(unregistered),
        'users': unregistered
    }
    report['additional_charges'] = {
        int(i.split('=')[1]):
        (bottle.request.forms.get(i),
         bottle.request.forms.get('amount' + i.split('=')[1]))
        for i in filter(lambda x: x.startswith('description'),
                        bottle.request.forms)
    }
    with dbutils.dbopen() as db:
        for user_id in report['unregistered']['users']:
            user = report['unregistered']['users'][user_id]
            name = user['first_name'].strip() + ' ' + user['last_name'].strip()
            reports.report_unregistered(game_id,
                                        user['status'],
                                        name,
                                        user['phone'],
                                        dbconnection=db)
        for user_id in report['registered']['users']:
            user = report['registered']['users'][user_id]
            status = user['status']
            reports.report(game_id, user_id, status, dbconnection=db)
        for n in report['additional_charges']:
            reports.report_additional_charges(game_id,
                                              *report['additional_charges'][n],
                                              dbconnection=db)
    if "photo" in bottle.request.files:
        images.save_report(game_id, bottle.request.files.get("photo"))
    if pages.auth.current().user_id() != game.created_by():
        notificating.site.responsible(
            game.created_by(),
            'Ответственный "{}" отправил отчет по игре "{}"'.format(
                modules.create_link.user(
                    users.get(pages.auth.current().user_id())),
                modules.create_link.game(game)), game_id)
    finances.add_game_finances(game_id, dbconnection=db)
    cacher.drop_by_table_name('games', 'game_id', game_id)
    raise bottle.redirect('/games/report/{}?ask_autocreate'.format(game_id))
def referal(user_id: int):
    with dbutils.dbopen() as db:
        user = users.get(user_id, dbconnection=db)
        if len(user) == 0:
            raise bottle.HTTPError(404)
        return pages.PageBuilder('referal', user=user)