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 ===================")
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 ===================")
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
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()
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()
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()
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)})
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()
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()
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()
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 ===================")
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))
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)
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 ===================")
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 ===================")
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 ===================")
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()
def track_by_id(store_id, order_key): return request_json(TRACK_BY_ID, storeID=store_id, orderKey=order_key)
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))
def get_menu(self, lang='en'): response = request_json(MENU_URL, store_id=self.id, lang=lang) menu = Menu(response) return menu
def get_details(self): details = request_json(INFO_URL, store_id=self.id) return details
"""用于检查服务器状态,比如有多少人在监听服务器、推送者有哪些等等 """ 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)
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)
def track_by_order(store_id, order_key): return request_json(TRACK_BY_ORDER, store_id=store_id, order_key=order_key)
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
def request_json(self, *args, **kwargs): kwargs['headers'] = self.GITHUB_AUTH return request_json(*args, **kwargs)
def from_store(cls, store_id, lang='en'): response = request_json(MENU_URL, store_id=store_id, lang=lang) menu = cls(response) return menu
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]]
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)