diff options
Diffstat (limited to 'pyaggr3g470r/controllers')
-rw-r--r-- | pyaggr3g470r/controllers/article.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/pyaggr3g470r/controllers/article.py b/pyaggr3g470r/controllers/article.py index d22911bd..9051a910 100644 --- a/pyaggr3g470r/controllers/article.py +++ b/pyaggr3g470r/controllers/article.py @@ -1,9 +1,14 @@ +import re +import logging from sqlalchemy import func from bootstrap import db from .abstract import AbstractController +from pyaggr3g470r.controllers import FeedController from pyaggr3g470r.models import Article +logger = logging.getLogger(__name__) + class ArticleController(AbstractController): _db_cls = Article @@ -26,3 +31,37 @@ class ArticleController(AbstractController): .filter(*self._to_filters(readed=False, user_id=self.user_id)) .group_by(Article.feed_id).all()) + + def create(self, **attrs): + assert 'feed_id' in attrs + feed = FeedController( + attrs.get('user_id', self.user_id)).get(id=attrs['feed_id']) + if 'user_id' in attrs: + assert feed.user_id == attrs['user_id'] or self.user_id is None + attrs['user_id'] = feed.user_id + if not feed.filters: + return super().create(**attrs) + for filter_ in feed.filters: + match = False + if filter_.get('type') == 'regex': + match = re.match(filter_['pattern'], attrs.get('title', '')) + elif filter_.get('type') == 'simple match': + match = filter_['pattern'] in attrs.get('title', '') + take_action = match and filter_.get('action on') == 'match' \ + or not match and filter_.get('action on') == 'no match' + + if not take_action: + continue + + if filter_.get('action') == 'mark as read': + attrs['readed'] = True + logger.warn("article %s will be created as read", + attrs['link']) + elif filter_.get('action') == 'mark as favorite': + attrs['like'] = True + logger.warn("article %s will be created as liked", + attrs['link']) + + return super().create(**attrs) + + |