SYMBOL INDEX (653 symbols across 86 files) FILE: app.py function create_app (line 14) | def create_app(*, app_settings: str = None): FILE: config.py function _get_user (line 14) | def _get_user(string: str) -> _UserId: function _get_postgres_uri (line 22) | def _get_postgres_uri(host, user, password, db): class ConfigType (line 31) | class ConfigType(TypedDict): class BaseConfig (line 55) | class BaseConfig: class ProductionConfig (line 93) | class ProductionConfig(BaseConfig): class DevelopmentConfig (line 101) | class DevelopmentConfig(BaseConfig): class TestingConfig (line 112) | class TestingConfig(BaseConfig): FILE: extensions.py class _ModelBase (line 14) | class _ModelBase(Model): FILE: komidabot/api_utils.py function response_ok (line 18) | def response_ok(): function response_bad_request (line 22) | def response_bad_request(): function response_unauthorized (line 26) | def response_unauthorized(): function wrap_exceptions (line 30) | def wrap_exceptions(func): function expects_schema (line 59) | def expects_schema(input_schema: str = None, output_schema: str = None): FILE: komidabot/app.py function get_app (line 8) | def get_app() -> 'App': class App (line 12) | class App: method __init__ (line 13) | def __init__(self, config): method app_context (line 62) | def app_context(self): method config (line 66) | def config(self) -> 'ConfigType': method _get_current_object (line 69) | def _get_current_object(self): FILE: komidabot/blueprint.py function handle_facebook_verification (line 32) | def handle_facebook_verification(): function validate_signature (line 44) | def validate_signature(func): function handle_facebook_webhook (line 74) | def handle_facebook_webhook(): function _do_handle_facebook_webhook (line 121) | def _do_handle_facebook_webhook(event, user: FacebookUser, app): function handle_web_push_subscription (line 271) | def handle_web_push_subscription(): FILE: komidabot/blueprint_api.py function translatable_to_object (line 26) | def translatable_to_object(translatable: models.Translatable): function post_subscribe (line 37) | def post_subscribe(): function delete_subscribe (line 88) | def delete_subscribe(): function put_subscribe (line 129) | def put_subscribe(): function post_trigger (line 159) | def post_trigger(): function get_learning (line 194) | def get_learning(): function post_learning (line 222) | def post_learning(): function get_campus_list (line 254) | def get_campus_list(): function get_active_closing_days (line 278) | def get_active_closing_days(short_name: str, week_str: str): function get_menu (line 323) | def get_menu(short_name: str, day_str: str): FILE: komidabot/blueprint_authentication.py function init_google_client (line 24) | def init_google_client(app: App): function get_google_provider_cfg (line 33) | def get_google_provider_cfg(): function user_loader (line 41) | def user_loader(user_id): function unauthorized_handler (line 46) | def unauthorized_handler(): function get_login (line 52) | def get_login(): function get_login_google (line 59) | def get_login_google(): function get_login_google_callback (line 95) | def get_login_google_callback(): function get_logout (line 167) | def get_logout(): function get_authorized (line 185) | def get_authorized(): FILE: komidabot/bot.py class Bot (line 4) | class Bot: method trigger_received (line 5) | def trigger_received(self, trigger: Trigger): method notify_error (line 9) | def notify_error(self, error: Exception): FILE: komidabot/config.py function is_registrations_enabled (line 4) | def is_registrations_enabled(): FILE: komidabot/debug/administration.py function notify_admins (line 16) | def notify_admins(message: messages.Message): function _send_notification (line 35) | def _send_notification(subscription: AdminSubscription, data) -> message... function _send_text_message (line 75) | def _send_text_message(subscription: AdminSubscription, function _send_exception_message (line 94) | def _send_exception_message(subscription: AdminSubscription, FILE: komidabot/debug/state.py class ProgramStateTrace (line 5) | class ProgramStateTrace: method __init__ (line 6) | def __init__(self): method state (line 10) | def state(self, state: 'ProgramState'): method push (line 13) | def push(self, state: 'ProgramState'): method pop (line 20) | def pop(self): method prepend (line 25) | def prepend(self, parent: 'ProgramStateTrace'): method append (line 33) | def append(self, child: 'ProgramStateTrace'): method get_state (line 39) | def get_state(self) -> 'ProgramState': method __repr__ (line 42) | def __repr__(self): class ProgramState (line 52) | class ProgramState: method __init__ (line 53) | def __init__(self): class InitialProgramState (line 58) | class InitialProgramState(ProgramState): method __repr__ (line 59) | def __repr__(self): class SimpleProgramState (line 63) | class SimpleProgramState(ProgramState): method __init__ (line 64) | def __init__(self, name: str, data: Any = None): method __repr__ (line 69) | def __repr__(self): class DebuggableException (line 73) | class DebuggableException(Exception): method __init__ (line 74) | def __init__(self, message: str, trace: ProgramStateTrace = None): method get_trace (line 78) | def get_trace(self) -> ProgramStateTrace: method get_or_set_trace (line 81) | def get_or_set_trace(self, trace: ProgramStateTrace) -> ProgramStateTr... method get_state (line 86) | def get_state(self) -> ProgramState: method print_info (line 89) | def print_info(self, logger: Logger): class WithProgramState (line 96) | class WithProgramState: method __init__ (line 97) | def __init__(self, trace: ProgramStateTrace, state: ProgramState): method __enter__ (line 101) | def __enter__(self): method __exit__ (line 104) | def __exit__(self, exc_type, exc_val, exc_tb): FILE: komidabot/external_menu.py function _cleanup_session (line 125) | def _cleanup_session(session: requests.Session): function _convert_price (line 132) | def _convert_price(price_students: Union[str, Decimal]) -> Decimal: function _decimal_or_none (line 140) | def _decimal_or_none(value: str) -> Optional[Decimal]: function fetch_raw (line 146) | def fetch_raw(campus: models.Campus, date: datetime.date) -> Optional[Any]: function parse_fetched (line 178) | def parse_fetched(fetched: Dict): function process_parsed (line 266) | def process_parsed(parsed: Dict): function update_menu (line 379) | def update_menu(processed: Dict): FILE: komidabot/facebook/api_interface.py class ApiInterface (line 19) | class ApiInterface: method __init__ (line 20) | def __init__(self, page_access_token: str): method post_send_api (line 36) | def post_send_api(self, data: dict) -> messages.MessageSendResult: method post_profile_api (line 84) | def post_profile_api(self, data: dict): method post_pass_thread_control (line 101) | def post_pass_thread_control(self, data: dict): method lookup_locale (line 119) | def lookup_locale(self, user_id: str) -> str: FILE: komidabot/facebook/messages.py class MessageHandler (line 12) | class MessageHandler(messages.MessageHandler): method send_message (line 13) | def send_message(self, user: users.User, message: messages.Message) ->... method _send_text_message (line 27) | def _send_text_message(user_id: users.UserId, message: messages.TextMe... method _send_menu_message (line 41) | def _send_menu_message(user: users.User, message: messages.MenuMessage... method _send_template_message (line 60) | def _send_template_message(user_id: users.UserId, message: 'TemplateMe... class TemplateMessage (line 77) | class TemplateMessage(messages.Message): method __init__ (line 78) | def __init__(self, trigger: messages.Trigger, payload): FILE: komidabot/facebook/nlp_dates.py function extract_days (line 8) | def extract_days(aspects: List[triggers.DatetimeAspect]): FILE: komidabot/facebook/postbacks.py class Postback (line 15) | class Postback: method call_postback (line 16) | def call_postback(self, trigger: triggers.Trigger, *args, **kwargs) ->... function lookup_postback (line 20) | def lookup_postback(name: str) -> Postback: function postback (line 24) | def postback(name: str = None): function postback_button (line 49) | def postback_button(title: str, payload: str): function url_button (line 53) | def url_button(title: str, url: str): function get_started (line 64) | def get_started(trigger: triggers.Trigger): function menu_today (line 71) | def menu_today(trigger: triggers.Trigger): function settings_subscriptions (line 76) | def settings_subscriptions(trigger: triggers.Trigger): function set_subscription (line 141) | def set_subscription(trigger: triggers.Trigger, day: int, campus: Option... function settings_language (line 172) | def settings_language(trigger: triggers.Trigger): function set_language (line 192) | def set_language(trigger: triggers.Trigger, language: str, display: str): function generate_postback_data (line 207) | def generate_postback_data(include_persistent_menu: bool, production: bo... FILE: komidabot/facebook/triggers.py class PostbackTrigger (line 4) | class PostbackTrigger(Trigger): method __init__ (line 5) | def __init__(self, name, d_args, d_kwargs, *args, **kwargs): method get_repr_text (line 11) | def get_repr_text(self): FILE: komidabot/facebook/users.py class UserManager (line 13) | class UserManager(users.UserManager): method __init__ (line 14) | def __init__(self): method get_user (line 23) | def get_user(self, user: 'Union[users.UserId, models.AppUser]', **kwar... method initialise (line 34) | def initialise(self): method get_identifier (line 44) | def get_identifier(self): class User (line 48) | class User(users.User): method __init__ (line 49) | def __init__(self, manager: UserManager, id_str: str): method get_locale (line 53) | def get_locale(self) -> 'Optional[str]': method get_provider_name (line 61) | def get_provider_name(self) -> 'str': method get_internal_id (line 64) | def get_internal_id(self) -> 'str': method supports_subscription_channel (line 67) | def supports_subscription_channel(self, channel: str) -> bool: method get_manager (line 73) | def get_manager(self) -> UserManager: method get_message_handler (line 76) | def get_message_handler(self) -> messages.MessageHandler: method mark_message_seen (line 79) | def mark_message_seen(self): FILE: komidabot/features.py class _Feature (line 26) | class _Feature: method __init__ (line 27) | def __init__(self, feat: 'Optional[_feature]', obj: 'Optional[models.F... method __repr__ (line 31) | def __repr__(self): function update_active_features (line 35) | def update_active_features(): FILE: komidabot/komidabot.py class Komidabot (line 24) | class Komidabot(Bot): method __init__ (line 25) | def __init__(self, the_app): method start_scheduler (line 74) | def start_scheduler(self): method trigger_received (line 78) | def trigger_received(self, trigger: triggers.Trigger): method notify_error (line 284) | def notify_error(self, error: Exception): method message_admins (line 294) | def message_admins(self, message: messages.Message): function dispatch_daily_menus (line 301) | def dispatch_daily_menus(trigger: triggers.SubscriptionTrigger): function update_menus (line 395) | def update_menus(*campuses: str, dates: 'List[datetime.date]' = None): FILE: komidabot/localisation.py function localisation_definition (line 6) | def localisation_definition(name, obj, fallback='en') -> Callable[[str],... FILE: komidabot/menu.py function get_menu_line (line 10) | def get_menu_line(menu_item: models.MenuItem, translator: translation.Tr... function prepare_menu_text (line 23) | def prepare_menu_text(campus: models.Campus, date: datetime.date, transl... function get_menu_text (line 28) | def get_menu_text(menu: Optional[models.Menu], translator: translation.T... function get_short_menu_text (line 51) | def get_short_menu_text(menu: Optional[models.Menu], translator: transla... FILE: komidabot/messages.py class Aspect (line 9) | class Aspect: method __repr__ (line 12) | def __repr__(self): class Trigger (line 19) | class Trigger: method __init__ (line 20) | def __init__(self, aspects: List[Aspect] = None): method add_aspect (line 26) | def add_aspect(self, aspect: Aspect, aspect_type: Type[Aspect] = None): method __contains__ (line 39) | def __contains__(self, aspect_type: Type[Aspect]) -> bool: method __getitem__ (line 42) | def __getitem__(self, aspect_type: Type[T]) -> Union[List[T], T]: method __delitem__ (line 45) | def __delitem__(self, aspect_type: Type[Aspect]): method extend (line 49) | def extend(cls: Type[T], trigger: 'Trigger', *args, aspects: List[Aspe... method __repr__ (line 64) | def __repr__(self): method get_repr_text (line 71) | def get_repr_text(self): class Message (line 75) | class Message: method __init__ (line 76) | def __init__(self, trigger: Trigger): class TextMessage (line 80) | class TextMessage(Message): method __init__ (line 81) | def __init__(self, trigger: Trigger, text: str): class ExceptionMessage (line 86) | class ExceptionMessage(Message): method __init__ (line 87) | def __init__(self, trigger: Trigger, source: Exception): class MenuMessage (line 92) | class MenuMessage(Message): method __init__ (line 93) | def __init__(self, trigger: Trigger, menu: models.Menu, translator: tr... class SubscriptionMenuMessage (line 99) | class SubscriptionMenuMessage(Message): method __init__ (line 100) | def __init__(self, trigger: Trigger, date: datetime.date, translator: ... method get_prepared (line 107) | def get_prepared(self, campus: models.Campus, lang: str, user_manager:... method set_prepared (line 116) | def set_prepared(self, campus: models.Campus, lang: str, user_manager:... class MessageSendResult (line 127) | class MessageSendResult(enum.Enum): class MessageHandler (line 142) | class MessageHandler: method send_message (line 148) | def send_message(self, user, message: 'Message') -> 'MessageSendResult': FILE: komidabot/models.py class CourseType (line 23) | class CourseType(enum.Enum): class CourseSubType (line 35) | class CourseSubType(enum.Enum): class CourseAttributes (line 42) | class CourseAttributes(enum.Enum): method has_value (line 65) | def has_value(cls, value): class CourseAllergens (line 70) | class CourseAllergens(enum.Enum): method has_value (line 88) | def has_value(cls, value): class Day (line 136) | class Day(enum.Enum): class AppSettings (line 150) | class AppSettings(ModelBase): method __init__ (line 156) | def __init__(self, name: str, value: Any = None): method create_entries (line 164) | def create_entries(): method set_default (line 170) | def set_default(name: str, default: Any) -> 'AppSettings': method get_value (line 181) | def get_value(name: str) -> Any: class Campus (line 189) | class Campus(ModelBase): method __init__ (line 204) | def __init__(self, name: str, short_name: str): method get_keywords (line 214) | def get_keywords(self) -> List[str]: method add_keyword (line 217) | def add_keyword(self, keyword: str): method remove_keyword (line 223) | def remove_keyword(self, keyword: str): method _set_keywords (line 226) | def _set_keywords(self, keywords: List[str]): method create (line 232) | def create(name: str, short_name: str, keywords: List[str], external_i... method get_by_id (line 245) | def get_by_id(campus_id: int) -> 'Optional[Campus]': method get_by_external_id (line 249) | def get_by_external_id(external_id: int) -> 'Optional[Campus]': method get_by_short_name (line 253) | def get_by_short_name(short_name: str) -> 'Optional[Campus]': method find_by_keyword (line 257) | def find_by_keyword(keyword: str) -> 'List[Campus]': method get_all (line 263) | def get_all() -> 'List[Campus]': method get_all_active (line 267) | def get_all_active() -> 'List[Campus]': method __hash__ (line 270) | def __hash__(self): class ClosingDays (line 274) | class ClosingDays(ModelBase): method __init__ (line 284) | def __init__(self, campus_id: int, first_day: datetime.date, last_day:... method create (line 301) | def create(campus: Campus, first_day: datetime.date, last_day: Optiona... method find_is_closed (line 313) | def find_is_closed(campus: Campus, day: datetime.date) -> 'Optional[Cl... method find_closing_days_including (line 323) | def find_closing_days_including(campus: Campus, class Translatable (line 335) | class Translatable(ModelBase): method __init__ (line 346) | def __init__(self, text: str, language: str): method add_translation (line 355) | def add_translation(self, language: str, text: str, provider: str = No... method get_translation (line 370) | def get_translation(self, language: str, translator: 'TranslationServi... method has_translation (line 394) | def has_translation(self, language: str) -> 'bool': method translations (line 408) | def translations(self) -> 'Collection[Translation]': method _get_dummy_translation (line 411) | def _get_dummy_translation(self) -> 'Translation': method get_or_create (line 422) | def get_or_create(text: str, language) -> 'Tuple[Translatable, Transla... method get_by_id (line 433) | def get_by_id(translatable_id) -> 'Optional[Translatable]': method __hash__ (line 436) | def __hash__(self): class Translation (line 440) | class Translation(ModelBase): method __init__ (line 449) | def __init__(self, translatable_id: int, language: str, translation: s... method __eq__ (line 464) | def __eq__(self, other: 'Translation'): method __hash__ (line 473) | def __hash__(self): class Menu (line 477) | class Menu(ModelBase): method __init__ (line 487) | def __init__(self, campus_id: int, day: datetime.date): method delete (line 496) | def delete(self): method add_menu_item (line 499) | def add_menu_item(self, translatable: Translatable, course_type: Cours... method create (line 512) | def create(campus: Campus, day: datetime.date, add_to_db=True) -> 'Menu': method get_menu (line 521) | def get_menu(campus: Campus, day: datetime.date) -> 'Optional[Menu]': method remove_menus_on_closing_days (line 525) | def remove_menus_on_closing_days(): method __hash__ (line 537) | def __hash__(self): class MenuItem (line 541) | class MenuItem(ModelBase): method __init__ (line 558) | def __init__(self, menu: Menu, translatable_id: int, course_type: Cour... method get_translation (line 580) | def get_translation(self, language: str, translator: 'TranslationServi... method format_price (line 584) | def format_price(price: Decimal) -> str: method get_attributes (line 589) | def get_attributes(self) -> List[CourseAttributes]: method set_attributes (line 594) | def set_attributes(self, attributes: List[CourseAttributes]): method get_allergens (line 597) | def get_allergens(self) -> List[CourseAllergens]: method set_allergens (line 601) | def set_allergens(self, allergens: List[CourseAllergens]): method __hash__ (line 604) | def __hash__(self): class UserDayCampusPreference (line 608) | class UserDayCampusPreference(ModelBase): method __init__ (line 620) | def __init__(self, user_id: int, day: Day, campus_id: int, active=True... method get_all_for_user (line 636) | def get_all_for_user(user: 'AppUser') -> 'List[UserDayCampusPreference]': method get_for_user (line 640) | def get_for_user(user: 'AppUser', day: Day) -> 'Optional[UserDayCampus... method create (line 644) | def create(user: 'AppUser', day: Day, campus: Campus, active=True) -> ... method __hash__ (line 654) | def __hash__(self): class AppUser (line 658) | class AppUser(ModelBase): method __init__ (line 677) | def __init__(self, provider: str, internal_id: str, language: str): method set_campus (line 689) | def set_campus(self, day: Day, campus: Campus, active=None): method set_day_active (line 698) | def set_day_active(self, day: Day, active: bool): method get_campus (line 706) | def get_campus(self, day: Day) -> 'Optional[Campus]': method get_subscription (line 713) | def get_subscription(self, day: Day) -> 'Optional[UserDayCampusPrefere... method set_language (line 716) | def set_language(self, language: str): method set_active (line 719) | def set_active(self, day: Day, active: bool): method create (line 727) | def create(provider: str, internal_id: str, language: str) -> 'AppUser': method delete (line 734) | def delete(self): method find_subscribed_users_by_day (line 738) | def find_subscribed_users_by_day(day: Day, provider=None) -> 'List[App... method find_by_id (line 749) | def find_by_id(provider: str, internal_id: str) -> 'Optional[AppUser]': method find_by_provider (line 753) | def find_by_provider(provider: str) -> 'List[AppUser]': method __hash__ (line 756) | def __hash__(self): class Feature (line 760) | class Feature(ModelBase): method __init__ (line 770) | def __init__(self, string_id: str, description: str = None, globally_a... method create (line 783) | def create(string_id: str, description: str = None, globally_available... method find_by_id (line 791) | def find_by_id(string_id: str) -> 'Optional[Feature]': method get_all (line 795) | def get_all() -> 'List[Feature]': method is_user_participating (line 799) | def is_user_participating(user: Optional[AppUser], string_id: str) -> ... method set_user_participating (line 813) | def set_user_participating(user: AppUser, string_id: str, participatin... method __hash__ (line 824) | def __hash__(self): class FeatureParticipation (line 828) | class FeatureParticipation(ModelBase): method __init__ (line 836) | def __init__(self, user_id: int, feature_id: int): method create (line 846) | def create(user: AppUser, feature: Feature) -> 'Optional[FeaturePartic... method get_for_user (line 854) | def get_for_user(user: AppUser, feature: Feature) -> 'Optional[Feature... method __hash__ (line 857) | def __hash__(self): function recreate_db (line 861) | def recreate_db(): function create_standard_values (line 868) | def create_standard_values(): function import_dump (line 879) | def import_dump(dump_file): FILE: komidabot/models_training.py class LearningDatapoint (line 150) | class LearningDatapoint(ModelBase): method __init__ (line 161) | def __init__(self, campus_id: int, menu_day: datetime.date, screenshot... method create (line 177) | def create(campus: 'Campus', menu_day: datetime.date, screenshot: str, method find_by_id (line 186) | def find_by_id(datapoint_id: int) -> 'Optional[LearningDatapoint]': method get_all (line 190) | def get_all() -> 'List[LearningDatapoint]': method get_random (line 194) | def get_random(user: 'RegisteredUser') -> 'Optional[LearningDatapoint]': method user_submit (line 204) | def user_submit(self, user: 'RegisteredUser', submission_data: Any): method __hash__ (line 207) | def __hash__(self): class LearningDatapointSubmission (line 211) | class LearningDatapointSubmission(ModelBase): method __init__ (line 222) | def __init__(self, user_id: int, datapoint_id: int, submission_data: A... method create (line 235) | def create(datapoint: LearningDatapoint, user: 'RegisteredUser', method __hash__ (line 243) | def __hash__(self): FILE: komidabot/models_users.py class AdminSubscription (line 11) | class AdminSubscription(TypedDict): class RegisteredUser (line 23) | class RegisteredUser(ModelBase, UserMixin): method __init__ (line 46) | def __init__(self, provider: str, subject: str, name: str, email: str,... method create (line 65) | def create(provider: str, subject: str, name: str, email: str, profile... method delete (line 74) | def delete(self): method is_active (line 79) | def is_active(self): method get_by_id (line 84) | def get_by_id(user_id: int) -> 'Optional[RegisteredUser]': method find_by_provider_id (line 88) | def find_by_provider_id(provider: str, subject: str) -> 'Optional[Regi... method find_by_email (line 92) | def find_by_email(email: str) -> 'Optional[RegisteredUser]': method get_all (line 96) | def get_all() -> 'List[RegisteredUser]': method get_all_active (line 100) | def get_all_active() -> 'List[RegisteredUser]': method get_all_by_role (line 104) | def get_all_by_role(role: 'Role') -> 'List[RegisteredUser]': method get_roles (line 112) | def get_roles(self) -> 'List[Role]': method add_role (line 115) | def add_role(self, role: 'Role'): method remove_role (line 118) | def remove_role(self, role: 'Role'): method is_role (line 121) | def is_role(self, role: 'Union[str, Role]') -> bool: method get_subscriptions (line 131) | def get_subscriptions(self) -> 'List[AdminSubscription]': method set_subscriptions (line 134) | def set_subscriptions(self, subscriptions: 'List[AdminSubscription]'): method add_subscription (line 137) | def add_subscription(self, endpoint: str, keys: Dict[str, str]): method remove_subscription (line 152) | def remove_subscription(self, endpoint: str): method replace_subscription (line 156) | def replace_subscription(old_endpoint: str, endpoint: str, keys: Dict[... method __hash__ (line 161) | def __hash__(self): class Role (line 165) | class Role(ModelBase): method __init__ (line 173) | def __init__(self, name: str): method create (line 180) | def create(name: str, add_to_db=True) -> 'Role': method find_by_name (line 189) | def find_by_name(name: str) -> 'Optional[Role]': FILE: komidabot/rate_limit.py class Limiter (line 6) | class Limiter: method __init__ (line 7) | def __init__(self, max_rate: int): method __call__ (line 11) | def __call__(self): FILE: komidabot/subscriptions/__init__.py class SubscriptionQuery (line 9) | class SubscriptionQuery: class SubscriptionData (line 13) | class SubscriptionData: class SubscriptionChannel (line 17) | class SubscriptionChannel: method user_supported (line 18) | def user_supported(self, user: 'User') -> bool: method get_subscribed_users (line 21) | def get_subscribed_users(self, /, query: Union[SubscriptionQuery, Dict... method get_query_from (line 24) | def get_query_from(self, query: Dict = None) -> Optional[SubscriptionQ... method deliver_message (line 27) | def deliver_message(self, message: Message): method get_name (line 30) | def get_name(self) -> str: method user_subscribe (line 33) | def user_subscribe(self, user: 'User', /, data: SubscriptionData = Non... method user_unsubscribe (line 36) | def user_unsubscribe(self, user: 'User') -> bool: method user_subscription_data (line 39) | def user_subscription_data(self, user: 'User') -> Optional[Subscriptio... class SubscriptionManager (line 43) | class SubscriptionManager: method __init__ (line 44) | def __init__(self): method register_channel (line 47) | def register_channel(self, channel: 'SubscriptionChannel'): method get_channel (line 53) | def get_channel(self, channel: str) -> 'Optional[SubscriptionChannel]': method get_subscribed_users (line 56) | def get_subscribed_users(self, channel: str, /, query: Union[Subscript... method deliver_message (line 64) | def deliver_message(self, channel: str, message: Message): method user_subscribe (line 70) | def user_subscribe(self, user: 'User', channel: str, /, data: Subscrip... method user_unsubscribe (line 81) | def user_unsubscribe(self, user: 'User', channel: str) -> bool: method user_subscription_data (line 92) | def user_subscription_data(self, user: 'User', channel: str) -> Option... FILE: komidabot/subscriptions/daily_menu.py class Query (line 17) | class Query(subscriptions.SubscriptionQuery): method __init__ (line 18) | def __init__(self, day: models.Day, campus: models.Campus = None): class Data (line 23) | class Data(subscriptions.SubscriptionData): class Day (line 24) | class Day: method __init__ (line 25) | def __init__(self): method __init__ (line 29) | def __init__(self): class Channel (line 39) | class Channel(subscriptions.SubscriptionChannel): method get_subscribed_users (line 40) | def get_subscribed_users(self, /, query: Union[Query, Dict] = None) ->... method get_query_from (line 56) | def get_query_from(self, query: Dict = None) -> Optional[Query]: method deliver_message (line 61) | def deliver_message(self, message: Message): method get_name (line 75) | def get_name(self): method user_subscribe (line 78) | def user_subscribe(self, user: 'User', /, data: Data = None) -> bool: method user_unsubscribe (line 81) | def user_unsubscribe(self, user: 'User') -> bool: method user_subscription_data (line 84) | def user_subscription_data(self, user: 'User') -> Optional[Data]: FILE: komidabot/translation.py function _fix_language (line 10) | def _fix_language(language: Language): class TranslationService (line 19) | class TranslationService: method translate (line 20) | def translate(self, text: str, from_language: Language, to_language: L... method identifier (line 31) | def identifier(self): method pretty_name (line 35) | def pretty_name(self): class KomidaTranslationService (line 39) | class KomidaTranslationService(TranslationService): method translate (line 40) | def translate(self, text: str, from_language: Language, to_language: L... method identifier (line 44) | def identifier(self): method pretty_name (line 48) | def pretty_name(self): class GoogleTranslationService (line 52) | class GoogleTranslationService(TranslationService): method __init__ (line 53) | def __init__(self): method translate (line 56) | def translate(self, text: str, from_language: Language, to_language: L... method identifier (line 60) | def identifier(self): method pretty_name (line 64) | def pretty_name(self): class BingTranslationService (line 68) | class BingTranslationService(TranslationService): method translate (line 69) | def translate(self, text: str, from_language: Language, to_language: L... method identifier (line 73) | def identifier(self): method pretty_name (line 77) | def pretty_name(self): FILE: komidabot/triggers.py class SubscriptionTrigger (line 7) | class SubscriptionTrigger(Trigger): method __init__ (line 8) | def __init__(self, *args, date: datetime.date = None, **kwargs): method get_repr_text (line 12) | def get_repr_text(self): class TextTrigger (line 16) | class TextTrigger(Trigger): method __init__ (line 17) | def __init__(self, text, *args, **kwargs): method get_repr_text (line 21) | def get_repr_text(self): class NewUserAspect (line 25) | class NewUserAspect(Aspect): method __repr__ (line 26) | def __repr__(self): class SenderAspect (line 30) | class SenderAspect(Aspect): method __init__ (line 31) | def __init__(self, sender: users.User): method __repr__ (line 35) | def __repr__(self): class AtAdminAspect (line 39) | class AtAdminAspect(Aspect): method __repr__ (line 40) | def __repr__(self): class DatetimeAspect (line 44) | class DatetimeAspect(Aspect): method __init__ (line 47) | def __init__(self, value: str, grain: str): method __repr__ (line 52) | def __repr__(self): class LocaleAspect (line 56) | class LocaleAspect(Aspect): method __init__ (line 57) | def __init__(self, locale: str, confidence: float): method __repr__ (line 62) | def __repr__(self): FILE: komidabot/users.py class UserId (line 14) | class UserId(NamedTuple): method __repr__ (line 18) | def __repr__(self): class UserManager (line 22) | class UserManager: # TODO: This probably could use more methods method get_user (line 23) | def get_user(self, user: 'Union[UserId, models.AppUser]', **kwargs) ->... method get_administrators (line 26) | def get_administrators(self) -> 'List[User]': method initialise (line 31) | def initialise(self): method get_identifier (line 34) | def get_identifier(self) -> str: class User (line 38) | class User: method id (line 40) | def id(self) -> UserId: method get_provider_name (line 43) | def get_provider_name(self) -> 'str': method manager (line 47) | def manager(self) -> UserManager: method get_manager (line 50) | def get_manager(self) -> UserManager: method get_internal_id (line 53) | def get_internal_id(self) -> 'str': method get_db_user (line 56) | def get_db_user(self) -> 'Optional[models.AppUser]': method add_to_db (line 60) | def add_to_db(self): method remove_from_db (line 64) | def remove_from_db(self): method get_locale (line 74) | def get_locale(self) -> 'Optional[str]': # TODO: Properly look into this method get_is_notified_new_site (line 81) | def get_is_notified_new_site(self) -> 'Optional[bool]': method set_is_notified_new_site (line 88) | def set_is_notified_new_site(self, value: bool): method get_campus_for_day (line 95) | def get_campus_for_day(self, date: Union[models.Day, datetime.date]) -... method set_campus_for_day (line 109) | def set_campus_for_day(self, campus: models.Campus, date: Union[models... method disable_subscription_for_day (line 129) | def disable_subscription_for_day(self, date: Union[models.Day, datetim... method get_subscription_for_day (line 148) | def get_subscription_for_day(self, date: Union[models.Day, datetime.da... method mark_reachable (line 163) | def mark_reachable(self) -> bool: method mark_unreachable (line 178) | def mark_unreachable(self): method is_reachable (line 188) | def is_reachable(self) -> bool: method supports_subscription_channel (line 199) | def supports_subscription_channel(self, channel: str) -> bool: method is_admin (line 202) | def is_admin(self): method is_feature_active (line 206) | def is_feature_active(self, feature_id: str) -> bool: method get_data (line 209) | def get_data(self) -> Optional[Dict]: method set_data (line 224) | def set_data(self, data: Optional[Dict]): method get_message_handler (line 234) | def get_message_handler(self) -> messages.MessageHandler: method send_message (line 237) | def send_message(self, message: 'messages.Message') -> 'messages.Messa... method send_message_or_remove (line 247) | def send_message_or_remove(self, channel: str, message: 'messages.Mess... method __repr__ (line 272) | def __repr__(self): class UnifiedUserManager (line 277) | class UnifiedUserManager(UserManager): method __init__ (line 278) | def __init__(self): method register_manager (line 281) | def register_manager(self, manager: UserManager): method get_user (line 289) | def get_user(self, user: 'Union[UserId, models.AppUser]', **kwargs) ->... method get_administrators (line 295) | def get_administrators(self): method initialise (line 298) | def initialise(self): method get_identifier (line 302) | def get_identifier(self): FILE: komidabot/util.py function check_exceptions (line 9) | def check_exceptions(fallback=None): function get_list_diff (line 29) | def get_list_diff(old_list: List[T], new_list: List[T]) -> Tuple[List[T]... function date_to_string (line 51) | def date_to_string(locale: str, date): function expected (line 73) | def expected(name, value, *types): function expected_or_none (line 78) | def expected_or_none(value, *types): FILE: komidabot/web/messages.py class MessageHandler (line 21) | class MessageHandler(messages.MessageHandler): method send_message (line 22) | def send_message(self, user: users.User, message: messages.Message) ->... method _send_notification (line 36) | def _send_notification(subscription_information, data) -> messages.Mes... method _send_text_message (line 78) | def _send_text_message(user: users.User, message: messages.TextMessage... method _send_menu_message (line 99) | def _send_menu_message(user: users.User, message: messages.MenuMessage... method _send_subscription_menu_message (line 131) | def _send_subscription_menu_message(user: users.User, FILE: komidabot/web/users.py class UserManager (line 12) | class UserManager(users.UserManager): method __init__ (line 13) | def __init__(self): method get_user (line 16) | def get_user(self, user: 'Union[users.UserId, models.AppUser]', **kwar... method initialise (line 27) | def initialise(self): method get_identifier (line 30) | def get_identifier(self): class User (line 34) | class User(users.User): method __init__ (line 35) | def __init__(self, manager: UserManager, id_str: str): method get_provider_name (line 39) | def get_provider_name(self) -> 'str': method get_internal_id (line 42) | def get_internal_id(self) -> 'str': method supports_subscription_channel (line 45) | def supports_subscription_channel(self, channel: str) -> bool: method get_manager (line 48) | def get_manager(self) -> UserManager: method get_message_handler (line 51) | def get_message_handler(self) -> messages.MessageHandler: method get_data (line 54) | def get_data(self) -> 'Optional[UserData]': method set_data (line 57) | def set_data(self, data: 'Optional[UserData]'): class UserData (line 61) | class UserData(TypedDict): FILE: manage.py function recreate_db (line 24) | def recreate_db(): function seed_db (line 29) | def seed_db(): function run_subscription (line 35) | def run_subscription(): function update_menus (line 40) | def update_menus(): function cleanup (line 45) | def cleanup(): function synchronize_menus (line 50) | def synchronize_menus(): function upload_learning_data (line 55) | def upload_learning_data(): function test (line 130) | def test(case: Optional[str]): function handler (line 143) | def handler(signum: int, _): FILE: manual_menu_scraper.py function get_by_external_id (line 21) | def get_by_external_id(campus_id: int): function get_by_short_name (line 25) | def get_by_short_name(short_name: str): FILE: migrations/env.py function run_migrations_offline (line 36) | def run_migrations_offline(): function run_migrations_online (line 57) | def run_migrations_online(): FILE: migrations/versions/1a2e04608ee9_.py function upgrade (line 18) | def upgrade(): function downgrade (line 23) | def downgrade(): FILE: migrations/versions/1dafd2bf730a_.py function upgrade (line 18) | def upgrade(): function downgrade (line 22) | def downgrade(): FILE: migrations/versions/276ad61a41a5_.py function upgrade (line 22) | def upgrade(): function downgrade (line 76) | def downgrade(): FILE: migrations/versions/2887dcc37788_.py function upgrade (line 18) | def upgrade(): function downgrade (line 78) | def downgrade(): FILE: migrations/versions/3806b46f7f00_.py function upgrade (line 18) | def upgrade(): function downgrade (line 28) | def downgrade(): FILE: migrations/versions/4fafafd2400f_.py function upgrade (line 17) | def upgrade(): function downgrade (line 29) | def downgrade(): FILE: migrations/versions/528821121657_.py function upgrade (line 17) | def upgrade(): function downgrade (line 21) | def downgrade(): FILE: migrations/versions/55696107a6b9_.py function upgrade (line 18) | def upgrade(): function downgrade (line 37) | def downgrade(): FILE: migrations/versions/5cd86de4dffe_.py function upgrade (line 18) | def upgrade(): function downgrade (line 26) | def downgrade(): FILE: migrations/versions/5ee455656a96_.py function upgrade (line 17) | def upgrade(): function downgrade (line 21) | def downgrade(): FILE: migrations/versions/7751a57b029e_.py function upgrade (line 18) | def upgrade(): function downgrade (line 34) | def downgrade(): FILE: migrations/versions/79e0c9de90f0_.py function upgrade (line 18) | def upgrade(): function downgrade (line 65) | def downgrade(): FILE: migrations/versions/85b659320f83_.py function upgrade (line 17) | def upgrade(): function downgrade (line 26) | def downgrade(): FILE: migrations/versions/92e4e9f8ff64_.py function upgrade (line 18) | def upgrade(): function downgrade (line 25) | def downgrade(): FILE: migrations/versions/93b9de63cd7b_.py function upgrade (line 17) | def upgrade(): function downgrade (line 24) | def downgrade(): FILE: migrations/versions/9b9afdcf4e4e_.py function upgrade (line 18) | def upgrade(): function downgrade (line 23) | def downgrade(): FILE: migrations/versions/a223b578f7b0_.py function upgrade (line 18) | def upgrade(): function downgrade (line 85) | def downgrade(): FILE: migrations/versions/aa31c90dc353_.py function upgrade (line 17) | def upgrade(): function downgrade (line 26) | def downgrade(): FILE: migrations/versions/b384f281e755_.py function upgrade (line 18) | def upgrade(): function downgrade (line 22) | def downgrade(): FILE: migrations/versions/bc1ef0083bb4_.py function upgrade (line 18) | def upgrade(): function downgrade (line 24) | def downgrade(): FILE: migrations/versions/bd04cd56036f_.py function upgrade (line 17) | def upgrade(): function downgrade (line 29) | def downgrade(): FILE: migrations/versions/d225cbda8c77_.py function upgrade (line 18) | def upgrade(): function downgrade (line 36) | def downgrade(): FILE: migrations/versions/daf22dcadb8d_.py function upgrade (line 17) | def upgrade(): function downgrade (line 22) | def downgrade(): FILE: migrations/versions/ddf5bd871988_.py function upgrade (line 19) | def upgrade(): function downgrade (line 36) | def downgrade(): FILE: migrations/versions/e18b14ed6b98_.py function upgrade (line 17) | def upgrade(): function downgrade (line 42) | def downgrade(): FILE: migrations/versions/ea6e1f581a7b_.py function upgrade (line 18) | def upgrade(): function downgrade (line 23) | def downgrade(): FILE: migrations/versions/ecce0e669d8c_.py function upgrade (line 19) | def upgrade(): function downgrade (line 28) | def downgrade(): FILE: migrations/versions/eda0c928c279_.py function upgrade (line 18) | def upgrade(): function downgrade (line 47) | def downgrade(): FILE: migrations/versions/ee24af8d3121_.py function upgrade (line 17) | def upgrade(): function downgrade (line 24) | def downgrade(): FILE: migrations/versions/fe4aca6853a2_.py function upgrade (line 18) | def upgrade(): function downgrade (line 26) | def downgrade(): FILE: migrations/versions/fe7bda58c5a4_.py function upgrade (line 18) | def upgrade(): function downgrade (line 22) | def downgrade(): FILE: tests/base.py function with_context (line 26) | def with_context(func): class BaseTestCase (line 51) | class BaseTestCase(TestCase): method __init__ (line 52) | def __init__(self, *args, **kwargs): method create_app (line 57) | def create_app(self): method setUp (line 61) | def setUp(self): method tearDown (line 70) | def tearDown(self): method assertEqualCommutative (line 77) | def assertEqualCommutative(self, first, second, msg=None): method assertNotEqualCommutative (line 81) | def assertNotEqualCommutative(self, first, second, msg=None): method create_translation (line 86) | def create_translation(self, data: Dict[str, str], default_language: s... method create_test_campuses (line 109) | def create_test_campuses(self) -> List[models.Campus]: method activate_feature (line 121) | def activate_feature(self, feature_id: str, user_list: 'List[users.Use... method create_menu (line 139) | def create_menu(self, campus: models.Campus, day: datetime.date, items... class HttpCapture (line 151) | class HttpCapture: method __init__ (line 161) | def __init__(self, allow_net_connect=False): method __enter__ (line 164) | def __enter__(self): method __exit__ (line 168) | def __exit__(self, exc_type, exc_val, exc_tb): method register_uri (line 173) | def register_uri(self, method, uri, body, status=200): FILE: tests/external_menus/download_external_jsons.py class Limiter (line 30) | class Limiter: method __init__ (line 31) | def __init__(self, max_rate: int): method __call__ (line 35) | def __call__(self): FILE: tests/test_debug_state.py class TestConstants (line 6) | class TestConstants(unittest.TestCase): method test_no_raise (line 11) | def test_no_raise(self): method test_simple_raise (line 18) | def test_simple_raise(self): method test_simple_nested (line 35) | def test_simple_nested(self): method test_simple_branched (line 54) | def test_simple_branched(self): method test_multi_nested (line 91) | def test_multi_nested(self): method test_multi_branched (line 113) | def test_multi_branched(self): FILE: tests/test_external_menu.py function filter_meta (line 16) | def filter_meta(value: Union[List[Any], Dict[str, Any]]): class TestExternalMenu (line 28) | class TestExternalMenu(BaseTestCase): method setUp (line 29) | def setUp(self): method create_validator (line 50) | def create_validator(schema): method test_saved_requests (line 57) | def test_saved_requests(self): FILE: tests/test_models_campus.py class TestModelsCampus (line 8) | class TestModelsCampus(BaseTestCase): method test_simple_constructors (line 13) | def test_simple_constructors(self): method test_invalid_constructors (line 43) | def test_invalid_constructors(self): method test_create (line 59) | def test_create(self): method test_create_no_add_to_db (line 84) | def test_create_no_add_to_db(self): method test_keywords (line 107) | def test_keywords(self): method test_get_by_id (line 189) | def test_get_by_id(self): method test_get_by_external_id (line 203) | def test_get_by_external_id(self): method test_get_by_short_name (line 217) | def test_get_by_short_name(self): method test_find_by_keyword (line 232) | def test_find_by_keyword(self): method test_get_all (line 259) | def test_get_all(self): method test_get_all_active (line 279) | def test_get_all_active(self): FILE: tests/test_models_closing_days.py class TestModelsClosingDays (line 9) | class TestModelsClosingDays(BaseTestCase): method setUp (line 14) | def setUp(self): method test_simple_constructors (line 19) | def test_simple_constructors(self): method test_invalid_constructors (line 45) | def test_invalid_constructors(self): method test_create (line 74) | def test_create(self): method test_create_no_add_to_db (line 94) | def test_create_no_add_to_db(self): method test_find_is_closed (line 118) | def test_find_is_closed(self): method test_find_closing_days_including (line 152) | def test_find_closing_days_including(self): FILE: tests/test_models_menu.py class TestModelsMenu (line 9) | class TestModelsMenu(BaseTestCase): method setUp (line 14) | def setUp(self): method test_simple_constructors (line 19) | def test_simple_constructors(self): method test_invalid_constructors (line 40) | def test_invalid_constructors(self): method test_create (line 58) | def test_create(self): method test_create_no_add_first (line 72) | def test_create_no_add_first(self): FILE: tests/test_models_menu_item.py class TestModelsMenuItem (line 9) | class TestModelsMenuItem(BaseTestCase): method setUp (line 14) | def setUp(self): method test_simple_constructors (line 19) | def test_simple_constructors(self): method test_add_menu_item (line 41) | def test_add_menu_item(self): method test_get_translation (line 74) | def test_get_translation(self): FILE: tests/test_models_registered_user.py class TestModelsRegisteredUsers (line 10) | class TestModelsRegisteredUsers(BaseTestCase): method test_simple_constructors (line 15) | def test_simple_constructors(self): method test_invalid_constructors (line 35) | def test_invalid_constructors(self): method test_create (line 69) | def test_create(self): method test_get_by_id (line 87) | def test_get_by_id(self): method test_find_by_provider_id (line 105) | def test_find_by_provider_id(self): method test_find_by_email (line 123) | def test_find_by_email(self): method test_get_all (line 140) | def test_get_all(self): method test_get_all_active (line 162) | def test_get_all_active(self): method test_get_all_by_role (line 187) | def test_get_all_by_role(self): method test_roles (line 225) | def test_roles(self): method test_delete (line 261) | def test_delete(self): method test_user_mixin (line 287) | def test_user_mixin(self): method test_subscriptions (line 307) | def test_subscriptions(self): FILE: tests/test_models_translations.py class TestModelsTranslations (line 9) | class TestModelsTranslations(BaseTestCase): method test_simple_constructors (line 14) | def test_simple_constructors(self): method test_get_or_create (line 52) | def test_get_or_create(self): method test_add_translation (line 70) | def test_add_translation(self): method test_has_translation (line 104) | def test_has_translation(self): method test_get_translation (line 127) | def test_get_translation(self): method test_get_by_id (line 168) | def test_get_by_id(self): FILE: tests/test_subscriptions.py class BaseSubscriptionsTestCase (line 16) | class BaseSubscriptionsTestCase(BaseTestCase): method setUp (line 17) | def setUp(self): class TestGenericSubscriptions (line 23) | class TestGenericSubscriptions(BaseSubscriptionsTestCase): method setUp (line 24) | def setUp(self): method setup_subscriptions (line 38) | def setup_subscriptions(self): method setup_menu (line 76) | def setup_menu(self): method test_active_subscriptions (line 113) | def test_active_subscriptions(self): FILE: tests/test_test_utils.py class TestConstants (line 5) | class TestConstants(BaseTestCase): method test_days (line 10) | def test_days(self): method test_days_list (line 19) | def test_days_list(self): FILE: tests/test_triggers.py class TestTriggers (line 8) | class TestTriggers(BaseTestCase): method setUp (line 9) | def setUp(self): method test_simple_trigger_constructors (line 28) | def test_simple_trigger_constructors(self): method test_trigger_constructors_with_aspects (line 34) | def test_trigger_constructors_with_aspects(self): method test_aspect_constructors (line 41) | def test_aspect_constructors(self): method test_simple_extend (line 47) | def test_simple_extend(self): method test_extend_with_aspects (line 57) | def test_extend_with_aspects(self): method test_no_aspects (line 68) | def test_no_aspects(self): method test_single_aspect (line 79) | def test_single_aspect(self): method test_multiple_aspects (line 96) | def test_multiple_aspects(self): FILE: tests/test_users_base.py class TestUsersBase (line 7) | class TestUsersBase(BaseTestCase): method setUp (line 12) | def setUp(self): method test_get_administrators (line 30) | def test_get_administrators(self): FILE: tests/users_stub.py class UserManager (line 13) | class UserManager(users.UserManager): method __init__ (line 14) | def __init__(self): method add_user (line 19) | def add_user(self, internal_id: str, locale: str = 'nl') -> 'User': method get_user (line 33) | def get_user(self, user: 'Union[users.UserId, AppUser]', **kwargs) -> ... method initialise (line 45) | def initialise(self): method get_identifier (line 48) | def get_identifier(self): class User (line 52) | class User(users.User): method __init__ (line 53) | def __init__(self, manager: UserManager, internal_id: str): method get_provider_name (line 57) | def get_provider_name(self) -> 'str': method get_internal_id (line 60) | def get_internal_id(self) -> 'str': method supports_subscription_channel (line 63) | def supports_subscription_channel(self, channel: str) -> bool: method get_manager (line 66) | def get_manager(self) -> UserManager: method get_message_handler (line 69) | def get_message_handler(self): class MessageHandler (line 75) | class MessageHandler(messages.MessageHandler): method __init__ (line 78) | def __init__(self): method reset (line 81) | def reset(self): method send_message (line 84) | def send_message(self, user, message: messages.Message) -> messages.Me... FILE: tests/utils.py class StubTranslator (line 18) | class StubTranslator(translation.TranslationService): method translate (line 19) | def translate(self, text: str, from_language: translation.Language, to... method identifier (line 23) | def identifier(self): method pretty_name (line 27) | def pretty_name(self):