From 0caffceec8b58bc3f78c0d8ea36d2f7e9da668ec Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Mon, 3 Aug 2015 14:36:13 +0200 Subject: sqlalchemy was requesting icons everytime feed where listed so i choosed to move the icons into their own table --- pyaggr3g470r/controllers/__init__.py | 4 +++- pyaggr3g470r/controllers/abstract.py | 10 +++++++--- pyaggr3g470r/controllers/feed.py | 19 +++++++++++++++++++ pyaggr3g470r/controllers/icon.py | 23 +++++++++++++++++++++++ 4 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 pyaggr3g470r/controllers/icon.py (limited to 'pyaggr3g470r/controllers') diff --git a/pyaggr3g470r/controllers/__init__.py b/pyaggr3g470r/controllers/__init__.py index d8d1a104..ad77fa1d 100644 --- a/pyaggr3g470r/controllers/__init__.py +++ b/pyaggr3g470r/controllers/__init__.py @@ -1,6 +1,8 @@ from .feed import FeedController from .article import ArticleController from .user import UserController +from .icon import IconController -__all__ = ['FeedController', 'ArticleController', 'UserController'] +__all__ = ['FeedController', 'ArticleController', 'UserController', + 'IconController'] diff --git a/pyaggr3g470r/controllers/abstract.py b/pyaggr3g470r/controllers/abstract.py index 281e1415..f33d241e 100644 --- a/pyaggr3g470r/controllers/abstract.py +++ b/pyaggr3g470r/controllers/abstract.py @@ -65,7 +65,8 @@ class AbstractController(object): dependant) and the user is not an admin and the filters doesn't already contains a filter for that user. """ - if self.user_id and filters.get(self._user_id_key) != self.user_id: + if self._user_id_key is not None and self.user_id \ + and filters.get(self._user_id_key) != self.user_id: filters[self._user_id_key] = self.user_id return self._db_cls.query.filter(*self._to_filters(**filters)) @@ -82,10 +83,11 @@ class AbstractController(object): return obj def create(self, **attrs): - assert self._user_id_key in attrs or self.user_id is not None, \ + assert self._user_id_key is None or self._user_id_key in attrs \ + or self.user_id is not None, \ "You must provide user_id one way or another" - if self._user_id_key not in attrs: + if self._user_id_key is not None and self._user_id_key not in attrs: attrs[self._user_id_key] = self.user_id obj = self._db_cls(**attrs) db.session.add(obj) @@ -108,5 +110,7 @@ class AbstractController(object): def _has_right_on(self, obj): # user_id == None is like being admin + if self._user_id_key is None: + return True return self.user_id is None \ or getattr(obj, self._user_id_key, None) == self.user_id diff --git a/pyaggr3g470r/controllers/feed.py b/pyaggr3g470r/controllers/feed.py index 82714e39..6b3c4fb5 100644 --- a/pyaggr3g470r/controllers/feed.py +++ b/pyaggr3g470r/controllers/feed.py @@ -21,9 +21,11 @@ import logging from datetime import datetime, timedelta +from werkzeug.exceptions import NotFound import conf from .abstract import AbstractController +from .icon import IconController from pyaggr3g470r.models import Feed logger = logging.getLogger(__name__) @@ -52,3 +54,20 @@ class FeedController(AbstractController): self.update({'id__in': [feed.id for feed in feeds]}, {'last_retrieved': now}) return feeds + + def _ensure_icon(self, attrs): + if not attrs.get('icon_url'): + return + icon_contr = IconController() + try: + icon_contr.get(url=attrs['icon_url']) + except NotFound: + icon_contr.create(**{'url': attrs['icon_url']}) + + def create(self, **attrs): + self._ensure_icon(attrs) + return super().create(**attrs) + + def update(self, filters, attrs): + self._ensure_icon(attrs) + return super().update(filters, attrs) diff --git a/pyaggr3g470r/controllers/icon.py b/pyaggr3g470r/controllers/icon.py new file mode 100644 index 00000000..194c601c --- /dev/null +++ b/pyaggr3g470r/controllers/icon.py @@ -0,0 +1,23 @@ +import base64 +import requests +from pyaggr3g470r.models import Icon +from .abstract import AbstractController + + +class IconController(AbstractController): + _db_cls = Icon + _user_id_key = None + + def _build_from_url(self, attrs): + if 'url' in attrs and 'content' not in attrs: + resp = requests.get(attrs['url'], verify=False) + attrs.update({'url': resp.url, + 'mimetype': resp.headers.get('content-type', None), + 'content': base64.b64encode(resp.content).decode('utf8')}) + return attrs + + def create(self, **attrs): + return super().create(**self._build_from_url(attrs)) + + def update(self, filters, attrs): + return super().update(filters, self._build_from_url(attrs)) -- cgit