From 30a40988174cd6d51fa97acc55cdad557810ce5c Mon Sep 17 00:00:00 2001
From: OndraRehounek <ondra.rehounek@seznam.cz>
Date: Mon, 28 Mar 2022 15:05:46 +0200
Subject: [PATCH] fixed Prague imports

---
 district/jekyll_import.py | 75 ++++++++++++++++++++++++++++++---------
 1 file changed, 59 insertions(+), 16 deletions(-)

diff --git a/district/jekyll_import.py b/district/jekyll_import.py
index 123a4223..47b28e90 100644
--- a/district/jekyll_import.py
+++ b/district/jekyll_import.py
@@ -121,18 +121,27 @@ def get_or_create_image(
                 try:
                     urllib.request.urlretrieve(img_url, img_path)
                 except (HTTPError, UnicodeEncodeError, InvalidURL, IsADirectoryError):
-                    # FIXME praha má např. https://a.pirati.cz/praha/img/posts/srovnani.png
-                    # ale dává to 'https://a.pirati.cz//img/assets/img/posts/srovnani.png'
-
-                    logger.warning(
-                        "Nedohledán obrázek při importu článků",
-                        extra={
-                            "file_path": file_path,
-                            "img_name": img_name,
-                            "img_url": img_url,
-                        },
-                    )
-                    return None
+                    try:
+                        # druhý pokus s "posts" přidáno do URL (obvykle je ve file_path)
+                        img_url = "https://a.pirati.cz/{}/img/posts/{}".format(
+                            img_assets_folder, img_name.split()[0]
+                        )
+                        urllib.request.urlretrieve(img_url, img_path)
+                    except (
+                        HTTPError,
+                        UnicodeEncodeError,
+                        InvalidURL,
+                        IsADirectoryError,
+                    ):
+                        logger.warning(
+                            "Nedohledán obrázek při importu článků",
+                            extra={
+                                "file_path": file_path,
+                                "img_name": img_name,
+                                "img_url": img_url,
+                            },
+                        )
+                        return None
 
                 file = ImageFile(open(img_path, "rb"), name=img_path)
                 image = Image(title=file_path, file=file, collection=collection)
@@ -277,7 +286,7 @@ class JekyllArticleImporter:
             self.message_list.append(
                 {
                     "level": INFO,
-                    "text": "{} článků s tímto názvev již existuje".format(
+                    "text": "{} článků s tímto názvem již existuje".format(
                         self.exists_counter
                     ),
                 }
@@ -310,6 +319,39 @@ class JekyllArticleImporter:
         text = re.split(r"^\s*$", text.strip(), flags=re.MULTILINE)[0]
         return plain_md.convert(text)
 
+    @staticmethod
+    def handle_meta_is_str(meta: str) -> dict:
+        """
+        Snaží se vyřešit situaci, že meta se nenaparsovala na dict, ale na string,
+        kde je sice klíč:hodnota, ale další klíč následuje za mezerou po předchozí
+        hodnotě.
+        Iteruju teda přes rozesekaný string přes dvojtečky, ale každá value kromě
+        poslední (viz if idx == len(string_parts) - 2) má za poslední mezerou klíč
+        pro další hodnotu. Takže položku z další iterace splitnu přes mezery,
+        spojím všechny kromě poslední do value a tu přiřadím klíči z aktuální iterace.
+        Poslední položka iterace už je samotná value, takže tam handluju jinak.
+        Protože sahám na +1, tak hlídám číslo iterace pro přeskočení poslední (kde
+        už je položka iterace pouze value bez key, takže jí beru
+        v před-předposlední...).
+        """
+        logger.info(
+            "Meta se neparsuje na dict, ale na str - zkouším složitější parse",
+            extra={"article_meta": meta},
+        )
+        string_parts = meta.split(":")
+        meta_dict = {}
+        for idx, part in enumerate(string_parts):
+            if idx == len(string_parts) - 1:
+                break
+
+            key = part.split()[-1]
+            if idx == len(string_parts) - 2:
+                value = string_parts[idx + 1]
+            else:
+                value = " ".join(string_parts[idx + 1].split()[0:-1])
+            meta_dict.update({key: value})
+        return meta_dict
+
     def import_post(self, file_path):
         from district.models import DistrictArticlePage
 
@@ -328,13 +370,14 @@ class JekyllArticleImporter:
         md = r[2]
         html = html_md.convert(md)
 
-        # meta_date = meta["date"]
-        # article_date = meta_date if isinstance(meta_date, date) else meta["date"].split()[0]
+        if isinstance(meta, str):  # pokud se špatně naparsovalo meta (není dict)
+            meta = self.handle_meta_is_str(meta)
+
         try:
             title = meta["title"]
         except TypeError:
             logger.warning(
-                "Nelze importovat článek - YAML se neparsuje na dict",
+                "Nelze importovat článek - nepodařilo se získat title",
                 extra={"article_meta": meta},
             )
             self.skipped_counter += 1
-- 
GitLab