From ba05b0fa5390bcbe0447ef2dabf495f56a4e5a9d Mon Sep 17 00:00:00 2001 From: Hlamalani Date: Mon, 17 Feb 2025 09:17:28 +0200 Subject: [PATCH] code refractor --- home/import_content_pages.py | 199 +++++++++++++++++++++++++---------- 1 file changed, 141 insertions(+), 58 deletions(-) diff --git a/home/import_content_pages.py b/home/import_content_pages.py index 6c6aca0b..52e8baa4 100644 --- a/home/import_content_pages.py +++ b/home/import_content_pages.py @@ -60,6 +60,9 @@ def __init__( self.go_to_page_list_items: dict[PageId, dict[int, list[dict[str, Any]]]] = ( defaultdict(lambda: defaultdict(list)) ) + self.go_to_page: dict[PageId, dict[int, list[dict[str, Any]]]] = ( + defaultdict(lambda: defaultdict(list)) + ) def locale_from_display_name(self, langname: str) -> Locale: if langname not in self.locale_map: @@ -339,6 +342,72 @@ def add_variation_to_shadow_content_page_from_row( ) ) + def _get_shadow_page(self, slug: str, locale: Locale): + + try: + return self.shadow_pages[(slug, locale)] + except KeyError: + raise ImportException( + f"This is a message for page with slug '{slug}' and locale '{locale}', but no such page exists" + ) + + def _get_form(self, slug: str, locale: Locale, title: str, page_slug: str, field: str): + try: + return Assessment.objects.get(slug=slug, locale=locale) + except Assessment.DoesNotExist: + raise ImportException( + f"No form found with slug '{slug}' and locale '{locale}' for go_to_form {field} '{title}' on page '{page_slug}'" + ) + + def _create_interactive_items(self, row_field, page, slug, locale, field_name) -> list: + messages = [] + for index, field in enumerate(row_field): + if field["type"] == "next_message": + messages.append( + { + "id": str(uuid4()), + "type": field["type"], + "value": {"title": field["title"]}, + } + ) + elif field["type"] == "go_to_page": + field["index"] = index + if field_name == "button": + go_to_page = self.go_to_page_buttons + else: + go_to_page = self.go_to_page_list_items + page_gtp = go_to_page[(slug, locale)] + page_gtp[len(page.whatsapp_body)].append(field) + elif field["type"] == "go_to_form": + form = self._get_form(field["slug"], locale, field["title"], slug, field_name) + + try: + form = Assessment.objects.get( + slug=field["slug"], locale=locale + ) + except Assessment.DoesNotExist: + raise ImportException( + f"No form found with slug '{field['slug']}' and locale " + f"'{locale}' for go_to_form button '{field['title']}' on " + f"page '{slug}'" + ) + messages.append( + { + "id": str(uuid4()), + "type": field["type"], + "value": {"title": field["title"], "form": form.id}, + } + ) + + # else: + # raise ImportException( + # f"{field_name} with invalid type '{field['type']}'" + # ) + # except KeyError as e: + # raise ImportException(f"{field_name} is missing key {e}") + return messages + + def add_message_to_shadow_content_page_from_row( self, row: "ContentRow", locale: Locale ) -> None: @@ -350,69 +419,83 @@ def add_message_to_shadow_content_page_from_row( ) if row.is_whatsapp_message: page.enable_whatsapp = True - buttons = [] - for index, button in enumerate(row.buttons): - if button["type"] == "next_message": - buttons.append( - { - "id": str(uuid4()), - "type": button["type"], - "value": {"title": button["title"]}, - } - ) - elif button["type"] == "go_to_page": - button["index"] = index - page_gtps = self.go_to_page_buttons[(row.slug, locale)] - page_gtps[len(page.whatsapp_body)].append(button) - elif button["type"] == "go_to_form": - try: - form = Assessment.objects.get( - slug=button["slug"], locale=locale - ) - except Assessment.DoesNotExist: - raise ImportException( - f"No form found with slug '{button['slug']}' and locale " - f"'{locale}' for go_to_form button '{button['title']}' on " - f"page '{row.slug}'" - ) - buttons.append( - { - "id": str(uuid4()), - "type": button["type"], - "value": {"title": button["title"], "form": form.id}, - } - ) + # buttons = [] + # for index, button in enumerate(row.buttons): + # if button["type"] == "next_message": + # buttons.append( + # { + # "id": str(uuid4()), + # "type": button["type"], + # "value": {"title": button["title"]}, + # } + # ) + # elif button["type"] == "go_to_page": + # button["index"] = index + # page_gtps = self.go_to_page_buttons[(row.slug, locale)] + # page_gtps[len(page.whatsapp_body)].append(button) + # elif button["type"] == "go_to_form": + # try: + # form = Assessment.objects.get( + # slug=button["slug"], locale=locale + # ) + # except Assessment.DoesNotExist: + # raise ImportException( + # f"No form found with slug '{button['slug']}' and locale " + # f"'{locale}' for go_to_form button '{button['title']}' on " + # f"page '{row.slug}'" + # ) + # buttons.append( + # { + # "id": str(uuid4()), + # "type": button["type"], + # "value": {"title": button["title"], "form": form.id}, + # } + # ) + page = self._get_shadow_page(row.slug, locale) + buttons = self._create_interactive_items(row.buttons, page, row.slug, locale, "button") + list_items = self._create_interactive_items(row.list_items, page, row.slug, locale, "List Item") list_items = [] for index, item in enumerate(row.list_items): - if item["type"] == "next_message": - list_items.append( - { - "id": str(uuid4()), - "type": item["type"], - "value": {"title": item["title"]}, - } - ) - elif item["type"] == "go_to_page": - item["index"] = index - page_gtpli = self.go_to_page_list_items[(row.slug, locale)] - page_gtpli[len(page.whatsapp_body)].append(item) - elif item["type"] == "go_to_form": - try: - form = Assessment.objects.get(slug=item["slug"], locale=locale) - except Assessment.DoesNotExist: + try: + if item["type"] == "next_message": + list_items.append( + { + "id": str(uuid4()), + "type": item["type"], + "value": {"title": item["title"]}, + } + ) + elif item["type"] == "go_to_page": + item["index"] = index + page_gtpli = self.go_to_page_list_items[(row.slug, locale)] + page_gtpli[len(page.whatsapp_body)].append(item) + elif item["type"] == "go_to_form": + try: + form = Assessment.objects.get( + slug=item["slug"], locale=locale + ) + except Assessment.DoesNotExist: + raise ImportException( + f"No form found with slug '{item['slug']}' and locale " + f"'{locale}' for go_to_form list item '{item['title']}' on " + f"page '{row.slug}'" + ) + list_items.append( + { + "id": str(uuid4()), + "type": item["type"], + "value": {"title": item["title"], "form": form.id}, + } + ) + else: raise ImportException( - f"No form found with slug '{item['slug']}' and locale " - f"'{locale}' for go_to_form list item '{item['title']}' on " - f"page '{row.slug}'" + f"List item with invalid type '{item['type']}'" ) - list_items.append( - { - "id": str(uuid4()), - "type": item["type"], - "value": {"title": item["title"], "form": form.id}, - } - ) + except ImportException: + raise + except KeyError as e: + raise ImportException(f"List item is missing key {e}") page.whatsapp_body.append( ShadowWhatsappBlock( message=row.whatsapp_body,