def update(self, metadata, media, lang, force):
        PlexLog.debug("=================== Update Start ===================")

        PlexLog.debug("%s (%s)" % (self.name, self.ver))
        PlexLog.debug("Plex version: %s" % Platform.ServerVersion)

        server = Prefs["Server"]
        if not server:
            PlexLog.error("Missing server!")
            return

        show = request_json(urljoin(server, "show"), as_show(media))
        if show is None:
            return
        set_show(metadata, media, show)

        season_summary = show.get("season_summary", {})
        for season in media.seasons:
            season_id = media.seasons[season].id
            summary = season_summary.get(season)
            if summary is not None:
                update_season_summary(season_id, summary)
            for episode in media.seasons[season].episodes:
                episode_metadata = metadata.seasons[season].episodes[episode]
                model = request_json(urljoin(server, "episode"),
                                     as_episode(media, season, episode))
                set_episode(episode_metadata, model)
                set_episode_cover(episode_metadata, media, season, episode)
        PlexLog.debug("===================  Update end  ===================")
예제 #2
0
    def search(self, results, media, lang, manual):
        PlexLog.debug("=================== Search Start ===================")
        PlexLog.debug("%s (%s)" % (self.name, self.ver))
        PlexLog.debug("Plex version: %s" % Platform.ServerVersion)

        server = Prefs["Server"]
        authKey = Prefs["AuthKey"]
        if not server:
            PlexLog.error("Missing server!")
            return

        requestUrl = urljoin(server, "album")
        if authKey:
            requestUrl = requestUrl + "?AuthKey=" + authKey

        PlexLog.debug("Requesting URL: %s" % requestUrl)

        album = request_json(requestUrl, as_album(media))
        if album is None:
            return

        result = MetadataSearchResult(id=media.id,
                                      name=media.title,
                                      lang=lang,
                                      year=None,
                                      score=100)

        results.Append(result)

        PlexLog.debug("===================  Search end  ===================")
    def search(self, results, media, lang, manual):
        PlexLog.debug("=================== Search Start ===================")

        PlexLog.debug("%s (%s)" % (self.name, self.ver))
        PlexLog.debug("Plex version: %s" % Platform.ServerVersion)

        server = Prefs["Server"]
        if not server:
            PlexLog.error("Missing server!")
            return

        movie = request_json(urljoin(server, "movie"), as_movie(media))
        if movie is None:
            return

        title = movie.get("title")
        if title is None:
            PlexLog.error("Missing or invalid title: %s" % str(movie))
            return

        aired = convert_date(movie.get("aired"))
        year = aired.year if aired is not None else 0

        # Plex throws exception that have "/" in ID
        mid = create_id(title, year)
        result = MetadataSearchResult(id=mid,
                                      name=title,
                                      year=year,
                                      lang=lang,
                                      score=100)
        results.Append(result)
        PlexLog.debug("===================  Search end  ===================")
예제 #4
0
    def _get_tickets(self, message):
        repo_github_api_url = self.data_dict['url']
        ticket_regex = re.compile(self.prefs.ticket_regex)

        ticket_numbers = set(ticket_regex.findall(message))
        tickets = []
        settings = self.user.get_profile().settings

        cache_time = 60 * 5
        for n in ticket_numbers:
            if settings.github:
                cache_key = 'ticket:gh-%s:data_dict' % n
                data_dict = cache.get(cache_key)
                if data_dict is None:
                    try:
                        data_dict = self.api_client.request_json("%s/issues/%s" % (repo_github_api_url, n))
                    except RequestError:
                        pass
                if data_dict is not None:
                    ticket = Ticket(self.user, data_dict={
                        'title': data_dict['title'],
                        'url': data_dict['html_url'],
                        'number': data_dict['number'],
                        'tracker': 'gh',
                        'unicode': 'gh-%d' % data_dict['number'],
                    })
                    cache.set(cache_key, data_dict, cache_time)
                    tickets.append(ticket)

            if settings.redmine:
                cache_key = 'ticket:rm-%s:data_dict' % n
                data_dict = cache.get(cache_key)

                redmine_url = settings.redmine_url

                if data_dict is None:
                    redmine_auth = {'X-Redmine-API-Key': settings.redmine_api_key}

                    try:
                        data_dict = request_json('%s/issues/%s.json' % (redmine_url, n), headers=redmine_auth)['issue']

                    except RequestError:
                        pass

                if data_dict is not None:
                    ticket = Ticket(self.user, data_dict={
                        'title': data_dict['subject'],
                        'url': '%s/issues/%s' % (redmine_url, n),
                        'number': data_dict['id'],
                        'tracker': 'rm',
                        'unicode': 'rm-%d' % data_dict['id'],
                    })
                    cache.set(cache_key, data_dict, cache_time)
                    tickets.append(ticket)

        return tickets
예제 #5
0
 def update_email(self):
     data = request_json()
     schema = {
         'email': rules['email'],
     }
     v = make_validator(schema)
     if not v.validate(data):
         return failed('Invalid input', {'error': v.errors})
     current_user.email = data['email']
     current_user.email_confirmed = False
     current_user.save()
     return success()
예제 #6
0
 def destroy(self, *args, **kwargs):
     model = self.model
     data = request_json()
     id = data.get('id')
     ids = [id] if ',' not in id else id.split(',')
     errorMsg = None
     try:
         items = model.objects.filter(id__in=ids)[:]
         if not self.canDestroy(items):
             return ut.failed()
         model.objects.filter(id__in=ids).delete()
     except Exception as e:
         errorMsg = str(e)
     return ut.failed(errorMsg) if errorMsg else ut.success()
예제 #7
0
 def send_confirmation_email(self):
     data = request_json()
     # recaptcha
     errorMsg = validate_recaptcha(data['recaptcha'])
     if errorMsg:
         return failed(errorMsg)
     #
     errorMsg = None
     try:
         self.do_send_confirmation_email(data['email'], current_user.id)
     except Exception as e:
         print(e)
         errorMsg = str(e)
     return failed(errorMsg) if errorMsg else success()
예제 #8
0
 def store(self, *args, **kwargs):
     errorMsg = None
     item = None
     data = request_json()
     t = self.beforeWrite(data, 'store')
     if t:
         return t
     try:
         item = store(self.model, data)
     except Exception as e:
         app.logger.debug(e)
         print(e)
         errorMsg = str(e)
     return ut.failed(errorMsg) if errorMsg else ut.success(
         append={'id': str(item.id)})
예제 #9
0
 def login(self):
     data = request_json()
     # recaptcha
     errorMsg = validate_recaptcha(data['recaptcha'])
     if errorMsg:
         return failed(errorMsg)
     user = self.model.objects.filter(email=data['email']).first()
     if user.user_type != data['user_type']:
         user = None
     if not user:
         return failed('User not found')
     if not pwd_hashed_compare(data['password'], user.password):
         return failed('Incorrect password')
     login_user(user, remember=data.get('remember'))
     return success()
예제 #10
0
 def register(self):
     data = request_json()
     # recaptcha
     errorMsg = validate_recaptcha(data['recaptcha'])
     if errorMsg:
         return failed(errorMsg)
     #
     schema = {
         'email': rules['email'],
         'first_name': {
             'required': True,
             'type': 'string',
             'maxlength': 255
         },
         'last_name': {
             'required': True,
             'type': 'string',
             'maxlength': 255
         },
         'password': rules['password'],
         'user_type': {
             'required': True,
             'type': 'string',
             'allowed': ['school', 'student']
         },
     }
     v = make_validator(schema)
     if not v.validate(data):
         return failed('Invalid input', {'error': v.errors})
     if data.get('user_type') != 'student':
         return failed('Invalid user_type')
     user = self.model.objects.filter(email=data['email']).first()
     if user:
         return failed('An account with this email already exists')
     data['password'] = hash_pwd(data['password'])
     try:
         user = store(self.model, data)
         profileData = dict_pluck(data, ['first_name', 'last_name'])
         profileData['user_id'] = user.id
         profile = store(models.student_profile, profileData)
         self.do_send_confirmation_email(user.email, user.id)
     except Exception as e:
         print(e)
         errorMsg = str(e)
     if errorMsg:
         return failed(errorMsg)
     login_user(user)
     return success()
예제 #11
0
 def send_reset_password_email(self):
     data = request_json()
     # recaptcha
     errorMsg = validate_recaptcha(data['recaptcha'])
     if errorMsg:
         return failed(errorMsg)
     # validate
     schema = {
         'email': rules['email'],
     }
     v = make_validator(schema)
     if not v.validate(data):
         return failed('Invalid input', {'error': v.errors})
     # whether exist
     email = data['email']
     user = self.model.objects.filter(email=email).first()
     if not user:
         return failed('The account for the given email does not exist')
     if user.user_type == 'school' and get_user_profile(
             user).status != 'normal':
         return failed('This account is currently not enabled')
     #
     data = {
         'token': md5(str_rand(16)),
         'email': email,
     }
     record = models.reset_password_email.objects.filter(
         email=email).first()
     if record:
         item = update(models.reset_password_email, data, record.id)
     else:
         item = store(models.reset_password_email, data)
     link = url_for('index',
                    _external=True) + 'reset-password?token=' + data[
                        'token']  # generate absolute link
     print('reset password link:', link)
     try:
         msg = Message('[%s] Reset your account password' %
                       (app.config['site_name']),
                       recipients=[email])
         msg.html = render_template('email/reset-password.html',
                                    email=email,
                                    link=link,
                                    app=app)
         mail.send(msg)
     except Exception as e:
         return failed(str(e))
     return success()
예제 #12
0
 def update(self, *args, **kwargs):
     errorMsg = None
     data = request_json()
     t = self.beforeWrite(data, 'update')
     if t:
         return t
     id = data.get('id')
     item = self.model.objects(id=id).first()
     if not item:
         return ut.failed('Not found', code=404)
     if not self.canUpdate(item):
         return ut.failed()
     try:
         item = update(self.model, data, id)
     except Exception as e:
         errorMsg = str(e)
     return ut.failed(errorMsg) if errorMsg else ut.success()
    def update(self, metadata, media, lang, force):
        PlexLog.debug("=================== Update Start ===================")
        PlexLog.debug("%s (%s)" % (self.name, self.ver))
        PlexLog.debug("Plex version: %s" % Platform.ServerVersion)

        server = Prefs["Server"]
        if not server:
            PlexLog.error("Missing server!")
            return

        album = request_json(urljoin(server, "album"), as_album(media))
        if album is None:
            return

        set_album(metadata, media, album)

        PlexLog.debug("===================  Update end  ===================")
예제 #14
0
 def check_reset_password_token(self):
     data = request_json()
     # recaptcha
     errorMsg = validate_recaptcha(data['recaptcha'])
     if errorMsg:
         return failed(errorMsg)
     token = data.get('token', None)
     if not token:
         return failed('Illegal request')
     item = models.reset_password_email.objects.filter(token=token).first()
     if not item:
         return failed('No record found with given token')
     expired = (datetime.now() - item.updated_at).seconds > 3600 * 1
     if expired:
         return failed('Link expired')
     user = self.model.objects.filter(email=item.email).first()
     return success(user_to_dict(user))
예제 #15
0
 def select(self, id=None, *args, **kwargs):
     model = self.model
     data = request_json()
     if not id:
         id = data.get('id')
     if id:
         # return one row
         item = model.objects.filter(id=id).first()
         return ut.success(data=to_dict(item)) if item else ut.failed(
             'Not found', code=404)
     else:
         # return resources list
         # default page: 1, per_page: 20
         page = int(request.args.get('page') or 1)
         per_page = int(request.args.get('per_page') or 20)
         start = (page - 1) * per_page
         end = page * per_page
         models = model.objects.all()[start:end]
         modelsDict = [to_dict(item) for item in models]
         return ut.success(modelsDict)
예제 #16
0
    def search(self, results, media, lang, manual):
        PlexLog.debug("=================== Search Start ===================")

        PlexLog.debug("%s (%s)" % (self.name, self.ver))
        PlexLog.debug("Plex version: %s" % Platform.ServerVersion)

        server = Prefs["Server"]
        authKey = Prefs["AuthKey"]
        if not server:
            PlexLog.error("Missing server!")
            return

        requestUrl = urljoin(server, "show")
        if authKey:
            requestUrl = requestUrl + "?AuthKey=" + authKey

        PlexLog.debug("Requesting URL: %s" % requestUrl)

        show = request_json(requestUrl, as_show(media))
        if show is None:
            return

        title = show.get("title")
        if title is None:
            PlexLog.error("Missing or invalid title: %s" % str(show))
            return

        aired = convert_date(show.get("aired"))
        year = aired.year if aired is not None else 0

        # Plex throws exception that have "/" in ID
        mid = create_id(title, year)
        result = MetadataSearchResult(id=mid,
                                      name=title,
                                      year=year,
                                      lang=lang,
                                      score=100)
        results.Append(result)
        PlexLog.debug("===================  Search end  ===================")
예제 #17
0
 def confirm_email(self):
     data = request_json()
     token = data.get('token', None)
     user = current_user
     errorMsg = None
     if user.email_confirmed:
         errorMsg = 'Your email already be confirmed'
     if token:
         item = models.confirmation_email.objects().filter(
             token=token).first()
         if not item or item.email != user.email:
             errorMsg = 'Illegal request'
         else:
             expired = (datetime.now() - item.updated_at).seconds > 3600 * 1
             if expired:
                 errorMsg = 'Link expired'
             else:
                 user.email_confirmed = True
                 user.save()
                 item.delete()
     else:
         errorMsg = 'Token is required'
     return failed(errorMsg) if errorMsg else success()
    def search(self, results, media, lang, manual):
        PlexLog.debug("=================== Search Start ===================")
        PlexLog.debug("%s (%s)" % (self.name, self.ver))
        PlexLog.debug("Plex version: %s" % Platform.ServerVersion)

        server = Prefs["Server"]
        if not server:
            PlexLog.error("Missing server!")
            return

        artist = request_json(urljoin(server, "artist"), as_artist(media))
        if artist is None:
            return

        result = MetadataSearchResult(id=media.id,
                                      name=media.title,
                                      lang=lang,
                                      year=None,
                                      score=100)

        results.Append(result)

        PlexLog.debug("===================  Search end  ===================")
예제 #19
0
    def update(self, metadata, media, lang, force):
        PlexLog.debug("=================== Update Start ===================")
        PlexLog.debug("%s (%s)" % (self.name, self.ver))
        PlexLog.debug("Plex version: %s" % Platform.ServerVersion)

        server = Prefs["Server"]
        authKey = Prefs["AuthKey"]
        if not server:
            PlexLog.error("Missing server!")
            return

        requestUrl = urljoin(server, "album")
        if authKey:
            requestUrl = requestUrl + "?AuthKey=" + authKey

        PlexLog.debug("Requesting URL: %s" % requestUrl)

        album = request_json(requestUrl, as_album(media))
        if album is None:
            return

        set_album(metadata, media, album)

        PlexLog.debug("===================  Update end  ===================")
예제 #20
0
 def reset_password(self):
     data = request_json()
     # recaptcha
     errorMsg = validate_recaptcha(data['recaptcha'])
     if errorMsg:
         return failed(errorMsg)
     # validate
     schema = {
         'user_id': {
             'required': True,
             'type': 'string'
         },
         'token': {
             'required': True,
             'type': 'string'
         },
         'password': rules['password'],
     }
     v = make_validator(schema)
     if not v.validate(data):
         return failed('Invalid input', {'error': v.errors})
     #
     record = models.reset_password_email.objects.filter(
         token=data['token']).first()
     user = self.model.objects.filter(id=data['user_id']).first()
     if not record or not user or record.email != user.email:
         return failed('Illegal request')
     #
     expired = (datetime.now() - record.updated_at).seconds > 3600 * 1
     if expired:
         return failed('Link expired')
     user.password = hash_pwd(data['password'])
     user.email_confirmed = True
     user.save()
     record.delete()
     return success()
예제 #21
0
def track_by_id(store_id, order_key):
    return request_json(TRACK_BY_ID, storeID=store_id, orderKey=order_key)
예제 #22
0
import utils


distributed_clients = [
    'http://127.0.0.1:9001',
    'http://127.0.0.1:9001',
    'http://127.0.0.1:9001'
]

center_clients = 'http://127.0.0.1:9000'

sum_online_rooms_num = 0
max_rooms_num = 0

for client in distributed_clients:
    data = utils.request_json(
        'GET',
        f'{client}/check')['data']
    online_rooms_num = len(data['roomids_monitored'])
    sum_online_rooms_num += online_rooms_num
    max_rooms_num += online_rooms_num + data['remain_roomids']
    
    
print('sum_online_rooms_num', sum_online_rooms_num)
print('max_rooms_num', max_rooms_num)
print('center_clients', utils.request_json('GET', center_clients))

예제 #23
0
 def get_menu(self, lang='en'):
     response = request_json(MENU_URL, store_id=self.id, lang=lang)
     menu = Menu(response)
     return menu
예제 #24
0
 def get_details(self):
     details = request_json(INFO_URL, store_id=self.id)
     return details
예제 #25
0
"""用于检查服务器状态,比如有多少人在监听服务器、推送者有哪些等等
"""

import rsa

import utils
import global_var

name = 'bbbn'  # 用户名没必要改
key = 'V_F<Nv)!WeK]irWY'  # 检测 key 是否存在以及相关信息

with open(f'{global_var.KEY_PATH}/admin_privkey.pem', 'rb') as f:
    admin_privkey = rsa.PrivateKey.load_pkcs1(f.read())

dict_signature = utils.make_signature(name, admin_privkey, need_name=True)

data = {}
if key:
    naive_hashed_key = utils.naive_hash(key)
    data['naive_hashed_key'] = naive_hashed_key

data = {
    'code': 0,
    'type': 'raffle',
    'data': data,
    'verification': dict_signature,
}

json_rsp = utils.request_json('GET', f'{global_var.URL}/check', json=data)
print('JSON结果:', json_rsp)
예제 #26
0
def serve_layout():

    page_children = [

        dcc.Location(id='url', refresh=False),

        html.H1(
            html.A('Благодарие', href='https://health.blagodarie.org'),
            style={'textAlign': 'center'},
        ),
    ]
    rc, data = request_json('/api/getstats/users')
    if rc == 200:
        page_children.extend([
            html.Div(
                'Пользователей: ' + str(data['users']) +
                ' Сообщений: ' + str(data['symptoms']),
                style={'textAlign': 'center'},
            )
        ])
    page_children.extend([
        html.Div(
            html.A(
                html.Img(
                    src='https://play.google.com/intl/en_us/badges/static/images/badges/ru_badge_web_generic.png',
                    alt='Доступно в Google Play',
                ),
                href='https://play.google.com/store/apps/details?id=org.blagodarie',
            ),
            style={'textAlign': 'center'},
        ),
        html.Div([
                html.Span('''
                    Дорогие бабушки и дедушки, было время когда вы жили
                    не замечая воздействия окружающей среды,
                    со временем вы начали их ощущать, дальше - больше...
                    Ваши дети и внуки идут за вами следом -
                    по мере взросления у них тоже начнут появляться похожие ощущения
                    с похожей периодичностью -
                '''),
                html.A(
                    'Установите приложение Благодарие для Android',
                    href='https://play.google.com/store/apps/details?id=org.blagodarie',
                ),
                html.Span('''
                    и отмечайте периодические улучшения и ухудшения вашего самочувствия -
                    мы сопоставим данные о самочувствии всех пользователей
                    с периодами вращения Земли, Луны, Венеры, Марса и других известных планет,
                    и используем математическую статистику для определения зависимостей
                    и подготовки персональных прогнозов самочувствия!
                    К тому времени, когда ваши дети и внуки
                    начнут ощущать влияние окружающей среды -
                    у каждого их них будет, оставленный вами,
                    детальный персональный прогноз самочувствия
                    с учётом наследственно-родовых особенностей!
                '''),
                html.Br(),
                html.Span('''
                    Приложение "Благодарие" не требует оплаты и регистрации -
                    все данные отправляются
                '''),
                html.A('обезличенными',
                    href=r'https://ru.wikisource.org/wiki/%D0%A4%D0%B5%D0%B4%D0%B5%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD_%D0%BE%D1%82_27.07.2006_%E2%84%96_152-%D0%A4%D0%97#%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F_3._%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D1%8F,_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC%D1%8B%D0%B5_%D0%B2_%D0%BD%D0%B0%D1%81%D1%82%D0%BE%D1%8F%D1%89%D0%B5%D0%BC_%D0%A4%D0%B5%D0%B4%D0%B5%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%B5'
                ),
                html.Span('''
                    Ежедневно отмечайте улучшения и ухудшения самочувствия
                    и следите за результатами на этом сайте!
                '''),
                html.Br(),
                html.Br(),
            ],
            style={'textAlign': 'center'},
        )
    ])

    symptoms_list = []
    rc, data = request_json('/api/getstats/symptoms/names')
    if rc == 200:
        symptoms_list = data
    page_children.extend([
        dcc.Dropdown(
            id='dropdown-symptoms',
            options=[
                {'value': d['id'], 'label': d['name']} \
                for d in symptoms_list
            ],
            multi=True,
            value=[],
        ),
        html.Br(),
        html.Div(
            id='div-chart-user-symptoms',
        ),
    ])

    page_children.extend([
        html.Div([
                html.Br(),
                html.Span(
                    '''
                    Чтобы каждый мог убедиться в отсутствии вредоносных закладок и
                    нежелательной утечки личных данных,
                    а также присоединиться к разработке -
                    мы публикуем наш программный код под открытой лицензией
                    '''
                ),
                html.A(
                    'GPLv3:',
                    href='https://ru.wikipedia.org/wiki/GNU_General_Public_License',
                ),
                html.Br(),
                html.A(
                    'Код приложения Android',
                    href='https://github.com/6jlarogap/blagodarie',
                ),
                html.Br(),
                html.A(
                    'Код сайта',
                    href='https://github.com/6jlarogap/blagodarie-site',
                ),
                html.Br(),
                html.A(
                    'Код сервера',
                    href='https://github.com/6jlarogap/blagodarie-srv',
                ),
                html.Br(),
                html.Br(),
                html.A(
                    'Метрика',
                    href='https://metrika.yandex.ru/dashboard?id=62165461',
                ),
                html.Br(),
                html.Span(
                    'Обратная связь: 6jlarogap-at-mail.ru',
                ),
                html.Br(),
                html.A(
                    'Соглашение пользователя',
                    href='https://blagodarie.org/agreement',
                ),
                html.Br(),
                html.A(
                    'Для благодарности и поддержки:',
                    href='https://privetmir.ru/services/p2p/',
                ),
                html.Span(
                    ' 2200020206816318',
                ),
                html.Br(),
                html.A(
                    'Вверх',
                    title='Вернуться к началу страницы',
                    href='#',
                    style=dict(
                        color='green',
                        position='fixed',
                        left='45px',
                        bottom='45px',
                    ),
                ),
            ],
        )
    ])

    app.title = 'Благодарие'
    return html.Div(page_children)
예제 #27
0
파일: track.py 프로젝트: n-zav/pizzapi
def track_by_order(store_id, order_key):
    return request_json(TRACK_BY_ORDER, store_id=store_id, order_key=order_key)
예제 #28
0
def update_chart_users_symptoms(search, value):
    result = []
    get_str = make_get_str(search, value)
    counts_all = counts_48h = counts_24h = titles = []
    rc, data = request_json('/api/getstats/symptoms/' + get_str)
    if rc == 200:
        counts_all = data['counts_all']
        counts_48h = data['counts_48h']
        counts_24h = data['counts_24h']
        titles = data['titles']
    any_counts_all = any(counts_all)
    if any_counts_all:
        figure_data =  [
            {
                'type': 'scatterpolar',
                'r': counts_all,
                'theta': titles,
                'fill': 'toself',
                'name': 'всего'
            },
            {
                'type': 'scatterpolar',
                'r': counts_48h,
                'theta': titles,
                'fill': 'toself',
                'name': 'За 48 часов'
            },
            {
                'type': 'scatterpolar',
                'r': counts_24h,
                'theta': titles,
                'fill': 'toself',
                'name': 'За 24 часа'
            },
        ]
        figure_layout = {
            'polar': {
                'radialaxis': {
                    'type': 'log',
                    'visible': True,
                }
            },
            'dragmode': False,
            'fixedrange': True,
            'showlegend': True,
            'width': 1050,
            'height': 700,
            'font': {
                'size': 14
            }
        }
        result.extend([
            html.H3(
                'Количества сообщений (всего, за 48 часов, за 24 часа)',
                style={'textAlign': 'center'},
            ),
            dcc.Graph(
                figure=dict(data=figure_data, layout=figure_layout),
                config = {'displayModeBar': False }
            )
        ])
    else:
        msg = 'Данные '
        if value:
            msg += 'по выбранным типам сообщений '
        msg += 'не поступали'
        result.extend([
            html.Div(
                html.B(msg),
                style={'textAlign': 'center'},
            )
        ])

    colors = named_colors()
    result.extend([
        html.H3(
            'Количества сообщений по последним 48 часам',
            style={'textAlign': 'center'},
        )
    ])
    if any_counts_all:
        rc, data = request_json('api/getstats/symptoms/hist/data/' + get_str)
        if rc == 200 and any(data['times']):
            fig = go.Figure()
            d_times = [
                {
                    'order': i,
                    'times': t,
                    'count': len(t),
                    'name': data['symptom_names'][str(i)]
                } \
                    for i, t in enumerate(data['times'])
            ]
            d_times.sort(key=cmp_to_key(cmp_symptoms_count_name))
            while len(colors) < len(data['times']):
                colors += colors
            tick_times = []
            t = data['time_1st']
            while t <= data['time_last']:
                tick_times.append(t)
                t += 3600
            tick_labels = []
            for i, t in enumerate(tick_times):
                tick_labels.append(datetime.datetime.fromtimestamp(t).strftime('%d.%m %H:00'))

            for d in d_times:
                fig.add_trace(go.Histogram(
                    type='histogram',
                    x=d['times'],
                    name=d['name'] + ' (' + str(d['count']) + ')',
                    marker=dict(color=colors[d['order']]),
                    xbins={
                        'start': data['time_1st'],
                        'end': data['time_last'],
                        'size': 3600,
                    },
                    hoverinfo="none",
                ))

            fig.update_layout(
                barmode='stack',
                xaxis={
                    'range': (data['time_1st'], data['time_last']),
                    'tickmode': 'array',
                    'tickvals': tick_times,
                    'ticktext': tick_labels,
                    'tickangle': -45,
                },
                yaxis={
                    'type': 'linear'
                },
            )
            result.extend([
                dcc.Graph(
                    figure=fig,
                    config = {'displayModeBar': False }
                )
            ])
        else:
            msg = 'За последние 48 часов данные '
            if value:
                msg += 'по выбранным типам сообщений'
            msg += 'не поступали'
            result.extend([
                html.Div(
                    html.B(msg),
                    style={'textAlign': 'center'},
                )
            ])

        rc, data = request_json('/api/getstats/symptoms/moon/data/' + get_str)
        if rc == 200 and data['moon_bars']:
            while len(colors) < len(data['moon_bars']):
                colors += colors
            d_symptoms = [
                {
                    'order': i,
                    'name': data['symptom_names'][str(i)],
                    'color': colors[i],
                    'count': sum(s),
                } \
                    for i, s in enumerate(data['moon_bars'])
            ]
            d_symptoms.sort(key=cmp_to_key(cmp_symptoms_count_name))
            figure_data = []
            x = [i for i in range(30) ]
            ticks = [str(i+1) for i in range(30)]
            ticks[data['current_moon_day']] = '*'
            for i, t in enumerate(ticks):
                ticks[i] += '<br>' + moon_phases[i]
            ticks[data['current_moon_day']] += '<br>' + datetime.datetime.now().strftime('%d.%m')
            for i, d in enumerate(d_symptoms):
                symptom_bars = data['moon_bars'][d['order']]
                if not symptom_bars:
                    continue
                figure_data.append({
                    'type': 'bar',
                    'name': d['name'] + ' (' + str(d['count']) + ')',
                    'x': x,
                    'y': symptom_bars,
                    'marker': dict(color=colors[d['order']],),
                    'hoverinfo': "none",
                })
            figure_layout = {
                'height': 800,
                'barmode': 'stack',
                'xaxis': {
                    'tickvals': x,
                    'ticktext': ticks,
                    'tickangle': 0,
                },
            }
            result.extend([
                html.H3(
                    'Распределение сообщений циклу Луны',
                    style={'textAlign': 'center'},
                ),
                dcc.Graph(
                    figure=dict(data=figure_data, layout=figure_layout),
                    config = {'displayModeBar': False }
                ),
            ])
            figure_data = []
            SIZE_TO_PX = 3
            DESIRED_MAX_SIZE = 20
            d_symptoms.reverse()
            for i, d in enumerate(d_symptoms):
                symptom_bubbles = data['moon_hour'][d['order']]
                if not symptom_bubbles:
                    continue
                x = []
                y = []
                size=[]
                max_count_in_hour = min(data['max_count_in_hour'], DESIRED_MAX_SIZE)
                for sb in symptom_bubbles:
                    for key in sb.keys():
                        x.append(key)
                        break
                    y.append(sb[key]['pos'])
                    size.append(sb[key]['count'] * SIZE_TO_PX)
                figure_data.append({
                    'type': 'scatter',
                    'name': d['name'] + ' (' + str(d['count']) + ')',
                    'x': x,
                    'y': y,
                    'mode': 'markers',
                    'marker': dict(
                        color=colors[d['order']],
                        opacity=0.5,
                        size=size,
                        sizemode='area',
                        sizeref=2. * max_count_in_hour / (DESIRED_MAX_SIZE ** 2),
                        sizemin=4,
                    ),
                    'hoverinfo': "none",
                })
            figure_layout = {
                'showlegend': True,
                'legend': {'itemsizing': 'constant'},
                'height': 800,
                'xaxis': {
                    'tickvals': [i for i in range(30)],
                    'ticktext': ticks,
                    'tickangle': 0,
                    'showgrid':False,
                    'showline':False,
                    'zeroline':False,
                },
                'yaxis': {
                    'tickvals': [i for i in range(25)],
                    'ticktext': [i for i in range(24)] + [0],
                    'tickangle': 0,
                    'showgrid':False,
                    'showline':False,
                    'zeroline':False,
                },
            }
            result.extend([
                html.H3(
                    'Распределение сообщений по часам и циклу Луны с учётом часового пояса',
                    style={'textAlign': 'center'},
                ),
                dcc.Graph(
                    figure=dict(data=figure_data, layout=figure_layout),
                    config = {'displayModeBar': False }
                ),
            ])

    rc, data = request_json('/api/getstats/user_connections/')
    if rc == 200:
        pk_sorted = list(data['users'].keys())
        pk_sorted.sort()
        num_users = len(pk_sorted)
        if num_users:
            for pk in pk_sorted:
                data['users'][pk]['connections'] = 0
            for pk_from, pk_to in data['connections']:
                data['users'][str(pk_from)]['connections'] += 1
                data['users'][str(pk_to)]['connections'] += 1

            figure_data = []
            n_side = math.ceil(math.sqrt(num_users))
            drift = 0.8/n_side
            x = 0.
            y = 1.
            for pk in pk_sorted:
                if x >= n_side:
                    y += 1
                    x = 1
                else:
                    x += 1
                xx = x - 0.4
                yy = y - 0.4
                xx += random.randint(0, int(n_side) - 1) * drift
                yy += random.randint(0, int(n_side) - 1) * drift
                data['users'][pk]['x'] = xx
                data['users'][pk]['y'] = yy
                figure_data.append({
                    'type': 'scatter',
                    'text': data['users'][pk]['initials'],
                    'x': [xx],
                    'y': [yy],
                    'mode': 'markers+text',
                    'marker': dict(color='blue', size=20, opacity=0.1),
                    'customdata': [
                        'Связей: %s' % \
                            data['users'][pk]['connections']
                    ],
                    'hovertemplate': '%{customdata}<extra></extra>',

                })

            x_edges = []
            y_edges = []
            for pk_from, pk_to in data['connections']:
                x_edges.append(data['users'][str(pk_from)]['x'])
                x_edges.append(data['users'][str(pk_to)]['x'])
                x_edges.append(None)
                y_edges.append(data['users'][str(pk_from)]['y'])
                y_edges.append(data['users'][str(pk_to)]['y'])
                y_edges.append(None)
            if x_edges:
                figure_data = [{
                    'type': 'scatter',
                    'x': x_edges,
                    'y': y_edges,
                    'mode': 'lines',
                    'line': dict(width=0.5, color='green'),
                    'hoverinfo': "none",
                }] + figure_data
            figure_layout = {
                'hovermode': 'closest',
                'showlegend': False,
                'height': 800,
                'xaxis': {
                    'showgrid':False,
                    'showline':False,
                    'zeroline':False,
                    'showticklabels': False,
                },
                'yaxis': {
                    'showgrid':False,
                    'showline':False,
                    'zeroline':False,
                    'showticklabels': False,
                },
            }
            result.extend([
                html.H3(
                    'Связи пользователей',
                    style={'textAlign': 'center'},
                ),
                dcc.Graph(
                    figure=dict(data=figure_data, layout=figure_layout),
                    config = {'displayModeBar': False }
                ),
            ])

    return result
예제 #29
0
 def request_json(self, *args, **kwargs):
     kwargs['headers'] = self.GITHUB_AUTH
     return request_json(*args, **kwargs)
예제 #30
0
파일: menu.py 프로젝트: n-zav/pizzapi
 def from_store(cls, store_id, lang='en'):
     response = request_json(MENU_URL, store_id=store_id, lang=lang)
     menu = cls(response)
     return menu
예제 #31
0
파일: address.py 프로젝트: n-zav/pizzapi
 def nearby_stores(self, service='Delivery'):
     data = request_json(FIND_URL, line1=self.line1, line2=self.line2, type=service)
     return [Store(x) for x in data['Stores']
             if x['IsOnlineNow'] and x['ServiceIsOpen'][service]]
예제 #32
0
dict_signature = utils.make_signature(
    name,
    super_admin_privkey,
    need_name=False)

data = {
    'code': 0,
    'type': 'create_key',
    'data': {
        'max_users': max_users,
        'available_days': available_days
        },
    'verification': dict_signature
    }

json_rsp = utils.request_json(
    'GET',
    f'{global_var.URL}/create_key',
    json=data)

print('JSON结果:', json_rsp)
if not json_rsp['code']:
    encrypted_key = json_rsp['data']['encrypted_key']
    bytes_orig_key = rsa.decrypt(
        base64.b64decode(encrypted_key.encode('utf8')),
        super_admin_privkey
        ).decode('utf8')
    print('KEY(16位)解密结果为:', bytes_orig_key)