integrations.slack.events.home_tab.ranking
integrations/slack/events/home_tab/ranking.py
1""" 2integrations/slack/events/home_tab/ranking.py 3""" 4 5import logging 6 7import libs.global_value as g 8from cls.timekit import ExtendedDatetime as ExtDt 9from integrations.slack.adapter import ServiceAdapter 10from integrations.slack.events.handler_registry import register 11from integrations.slack.events.home_tab import ui_parts 12from libs.commands import ranking 13from libs.utils import dictutil 14 15 16def build_ranking_menu(adapter: ServiceAdapter): 17 """ランキングメニュー生成 18 19 Args: 20 adapter (ServiceAdapter): インターフェースアダプタ 21 """ 22 23 adapter.conf.tab_var["screen"] = "RankingMenu" 24 adapter.conf.tab_var["no"] = 0 25 adapter.conf.tab_var["view"] = {"type": "home", "blocks": []} 26 adapter.conf.tab_var.setdefault("sday", ExtDt().format("ymd", "-")) 27 adapter.conf.tab_var.setdefault("eday", ExtDt().format("ymd", "-")) 28 ui_parts.header(adapter, text="【ランキング】") 29 30 # 検索範囲設定 31 date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]} 32 ui_parts.divider(adapter) 33 ui_parts.radio_buttons( 34 adapter=adapter, 35 id_suffix="search_range", 36 title="検索範囲", 37 flag={ 38 "今月": f"今月:{date_dict["今月"]["start"]} ~ {date_dict["今月"]["end"]}", 39 "先月": f"先月:{date_dict["先月"]["start"]} ~ {date_dict["先月"]["end"]}", 40 "全部": f"全部:{date_dict["全部"]["start"]} ~ {date_dict["全部"]["end"]}", 41 "指定": f"範囲指定:{adapter.conf.tab_var["sday"]} ~ {adapter.conf.tab_var["eday"]}", 42 } 43 ) 44 ui_parts.button(adapter, text="検索範囲設定", action_id="modal-open-period") 45 46 # 検索オプション 47 ui_parts.divider(adapter) 48 ui_parts.checkboxes( 49 adapter=adapter, 50 id_suffix="search_option", 51 title="検索オプション", 52 flag={ 53 "unregistered_replace": "ゲスト無効", 54 }, 55 initial=["unregistered_replace"], 56 ) 57 58 ui_parts.input_ranked(adapter, block_id="bid-ranked") 59 60 ui_parts.divider(adapter) 61 ui_parts.button(adapter, text="集計", action_id="ranking_aggregation", style="primary") 62 ui_parts.button(adapter, text="戻る", action_id="actionId-back", style="danger") 63 64 65@register 66def register_ranking_handlers(app, adapter: ServiceAdapter): 67 """ランキングメニュー""" 68 69 @app.action("ranking_menu") 70 def handle_menu_action(ack, body): 71 """メニュー項目生成 72 73 Args: 74 ack (_type_): ack 75 body (dict): イベント内容 76 """ 77 78 ack() 79 logging.trace(body) # type: ignore 80 81 adapter.conf.tab_var["user_id"] = body["user"]["id"] 82 adapter.conf.tab_var["view_id"] = body["view"]["id"] 83 logging.debug("[ranking_menu] %s", adapter.conf.tab_var) 84 85 build_ranking_menu(adapter) 86 adapter.api.appclient.views_publish( 87 user_id=adapter.conf.tab_var["user_id"], 88 view=adapter.conf.tab_var["view"], 89 ) 90 91 @app.action("ranking_aggregation") 92 def handle_aggregation_action(ack, body): 93 """メニュー項目生成 94 95 Args: 96 ack (_type_): ack 97 body (dict): イベント内容 98 """ 99 100 ack() 101 logging.trace(body) # type: ignore 102 103 m = adapter.parser() 104 105 m.parser(body) 106 add_argument, app_msg, update_flag = ui_parts.set_command_option(adapter, body) 107 m.data.text = f"dummy {" ".join(add_argument)}" 108 g.params = dictutil.placeholder(g.cfg.ranking, m) 109 g.params.update(update_flag) 110 111 adapter.api.appclient.views_update( 112 view_id=adapter.conf.tab_var["view_id"], 113 view=ui_parts.plain_text(f"{chr(10).join(app_msg)}"), 114 ) 115 116 search_options = body["view"]["state"]["values"] 117 if "bid-ranked" in search_options: 118 if "value" in search_options["bid-ranked"]["aid-ranked"]: 119 ranked = int(search_options["bid-ranked"]["aid-ranked"]["value"]) 120 if ranked > 0: 121 g.params.update(ranked=ranked) 122 123 app_msg.pop() 124 app_msg.append("集計完了") 125 126 m.status.command_type = "ranking" 127 ranking.ranking.aggregation(m) 128 adapter.api.post(m) 129 130 ui_parts.update_view(adapter, m, app_msg) 131 132 @app.view("RankingMenu_ModalPeriodSelection") 133 def handle_view_submission(ack, view): 134 """view更新 135 136 Args: 137 ack (_type_): ack 138 view (dict): 描写内容 139 """ 140 141 ack() 142 143 for i in view["state"]["values"].keys(): 144 if "aid-sday" in view["state"]["values"][i]: 145 adapter.conf.tab_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"] 146 if "aid-eday" in view["state"]["values"][i]: 147 adapter.conf.tab_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"] 148 149 logging.debug("[global var] %s", adapter.conf.tab_var) 150 151 adapter.api.appclient.views_update( 152 view_id=adapter.conf.tab_var["view_id"], 153 view=build_ranking_menu(adapter), 154 )
register_ranking_handlers =
None
ランキングメニュー