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