From d86fc0eb7153bc832546873f1d14b6aa12a07e5c Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Sat, 2 Nov 2024 00:29:06 +0000 Subject: [PATCH] save method for content --- src/models.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/models.py b/src/models.py index 61d90e8..bcddb33 100644 --- a/src/models.py +++ b/src/models.py @@ -5,7 +5,7 @@ import asyncio from enum import Enum from time import perf_counter from abc import ABC, abstractmethod -from dataclasses import dataclass +from dataclasses import dataclass, asdict from datetime import datetime, timezone from textwrap import shorten @@ -323,6 +323,7 @@ class Subscription(DjangoDataModel): for content in contents: log.debug(f"filtering: '{content.item_title}'") if any(content_filter.matches(content) for content_filter in self.filters): + content.blocked = True invalid_contents.append(content) else: valid_contents.append(content) @@ -340,14 +341,16 @@ class Content(DjangoDataModel): item_url: str item_title: str item_description: str + item_content_hash: str item_image_url: str | None item_thumbnail_url: str | None item_published: datetime | None item_author: str - item_author_url: str + item_author_url: str | None item_feed_title: str item_feed_url: str _subscription: Subscription | None = None + blocked: bool = False @staticmethod def parser(item: dict) -> dict: @@ -355,6 +358,24 @@ class Content(DjangoDataModel): item["subscription_id"] = item.pop("subscription") return item + async def save(self, client: httpx.AsyncClient, base_url: str, headers: dict): + log.debug(f"saving content {self.item_content_hash}") + + data = asdict(self) + data.pop("id") + data["subscription"] = data.pop("subscription_id") + item_published = data.pop("item_published") + data["item_published"] = item_published.strftime("%Y-%m-%d") if item_published else None + data.pop("_subscription") + + response = await client.post( + url=base_url + "content/", + headers=headers, + data=data + ) + log.debug(response.text) + response.raise_for_status() + @classmethod async def from_raw_rss(cls, rss: str, subscription: Subscription, client: httpx.AsyncClient): style = subscription.message_style @@ -362,9 +383,8 @@ class Content(DjangoDataModel): contents = [] async def create_content(entry: feedparser.FeedParserDict): - # content_hash = hashlib.new("sha256") - # content_hash.update(entry.get("description", "").encode()) - # content_hash.hexdigest() + content_hash = hashlib.new("sha256") + content_hash.update(entry.get("description", "").encode()) item_url = entry.get("link", "") item_image_url = entry.get("media_thumbnail", [{}])[0].get("url") @@ -382,11 +402,12 @@ class Content(DjangoDataModel): "item_url": item_url, "item_title": entry.get("title", ""), "item_description": entry.get("description", ""), + "item_content_hash": content_hash.hexdigest(), "item_image_url": item_image_url, "item_thumbnail_url": parsed_rss.feed.image.href or None, "item_published": published, "item_author": entry.get("author", ""), - "item_author_url": entry.get("author_detail", {}).get("href", ""), + "item_author_url": entry.get("author_detail", {}).get("href"), "item_feed_title": parsed_rss.get("feed", {}).get("title"), "item_feed_url": parsed_rss.get("feed", {}).get("link") })