From 87f08e7bfdcffbf3f42680c3c0b9b5d2bb66e9a0 Mon Sep 17 00:00:00 2001 From: Josue Kouka Date: Tue, 25 Oct 2016 11:56:19 +0200 Subject: [PATCH 1/2] misc: fix pep8 errors --- corbo/api_urls.py | 2 +- corbo/api_views.py | 4 ++-- corbo/models.py | 22 +++++++++++----------- corbo/views.py | 37 ++++++++++++++++++++++++++----------- tests/conftest.py | 1 + tests/test_announces.py | 2 ++ tests/test_api.py | 14 +++++++------- tests/test_emailing.py | 36 +++++++++++++++++------------------- 8 files changed, 67 insertions(+), 51 deletions(-) diff --git a/corbo/api_urls.py b/corbo/api_urls.py index 6f77fc4..a6feaa8 100644 --- a/corbo/api_urls.py +++ b/corbo/api_urls.py @@ -14,7 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from django.conf.urls import patterns, include, url +from django.conf.urls import patterns, url from .api_views import NewslettersView, SubscriptionsView diff --git a/corbo/api_views.py b/corbo/api_views.py index 9a5e562..9eb14b7 100644 --- a/corbo/api_views.py +++ b/corbo/api_views.py @@ -43,8 +43,8 @@ class SubscriptionsView(APIView): def get_subscriptions(self, email, uuid=None): subscriptions = defaultdict(dict) - identifier = 'mailto:'+email - for s in Subscription.objects.filter(Q(identifier=identifier)|Q(uuid=uuid)): + identifier = 'mailto:' + email + for s in Subscription.objects.filter(Q(identifier=identifier) | Q(uuid=uuid)): cat_id = s.category.pk subscriptions[cat_id]['id'] = str(cat_id) subscriptions[cat_id]['text'] = s.category.name diff --git a/corbo/models.py b/corbo/models.py index ba8f654..21c26ef 100644 --- a/corbo/models.py +++ b/corbo/models.py @@ -43,7 +43,7 @@ def transform_image_src(src, **kwargs): class Category(models.Model): name = models.CharField(_('Name'), max_length=64, blank=False, null=False) rss_feed_url = models.URLField(_('Feed URL'), blank=True, null=True, - help_text=_('if defined, announces will be automatically created from rss items')) + help_text= _('if defined, announces will be automatically created from rss items')) ctime = models.DateTimeField(auto_now_add=True) def __unicode__(self): @@ -63,7 +63,6 @@ class Category(models.Model): if feed_response.ok: content = feedparser.parse(feed_response.content) for entry in content.get('entries', []): - substitutions = [] published = datetime.fromtimestamp(mktime(entry.published_parsed)) html_tree = etree.HTML(entry['summary']) storage = DefaultStorage() @@ -82,7 +81,7 @@ class Category(models.Model): img.attrib['src'] = storage.url(new_image_name) announce, created = Announce.objects.get_or_create(identifier=entry['id'], - category=self) + category=self) announce.title = entry['title'] announce.text = etree.tostring(html_tree) announce.publication_time = published @@ -93,7 +92,7 @@ class Category(models.Model): class Announce(models.Model): - category = models.ForeignKey('Category', verbose_name=_('category')) + category = models.ForeignKey('Category', verbose_name=_('category')) title = models.CharField(_('title'), max_length=256, help_text=_('maximum 256 characters')) identifier = models.CharField(max_length=256, null=True, blank=True) @@ -106,8 +105,8 @@ class Announce(models.Model): mtime = models.DateTimeField(_('modification time'), auto_now=True) def __unicode__(self): - return u'{title} ({id}) at {mtime}'.format(title=self.title, - id=self.id, mtime=self.mtime) + return u'{title} ({id}) at {mtime}'.format( + title=self.title, id=self.id, mtime=self.mtime) def is_expired(self): if self.expiration_time: @@ -141,8 +140,9 @@ class Broadcast(models.Model): handler = HTML2Text() template = loader.get_template('corbo/announce.html') message = Message(subject=self.announce.title, mail_from=settings.CORBO_DEFAULT_FROM_EMAIL, - html=template.render(Context({'content': self.announce.text, - 'unsubscribe_link_placeholder': UNSUBSCRIBE_LINK_PLACEHOLDER}))) + html=template.render( + Context({'content': self.announce.text, + 'unsubscribe_link_placeholder': UNSUBSCRIBE_LINK_PLACEHOLDER}))) html_tree = etree.HTML(self.announce.text) storage = DefaultStorage() for img in html_tree.xpath('//img/@src'): @@ -160,8 +160,8 @@ class Broadcast(models.Model): continue unsubscribe_token = signing.dumps({'category': self.announce.category.pk, 'identifier': s.identifier}) - unsubscribe_link = urlparse.urljoin(settings.SITE_BASE_URL, reverse('unsubscribe', - kwargs={'unsubscription_token': unsubscribe_token})) + unsubscribe_link = urlparse.urljoin(settings.SITE_BASE_URL, reverse( + 'unsubscribe', kwargs={'unsubscription_token': unsubscribe_token})) message.html = message.html.replace(UNSUBSCRIBE_LINK_PLACEHOLDER, unsubscribe_link) handler.body_width = 0 message.text = handler.handle(message.html) @@ -185,7 +185,7 @@ class Subscription(models.Model): category = models.ForeignKey('Category', verbose_name=_('Category')) uuid = models.CharField(_('User identifier'), max_length=128, blank=True) identifier = models.CharField(_('identifier'), max_length=128, blank=True, - help_text=_('ex.: mailto, ...')) + help_text=_('ex.: mailto, ...')) def get_identifier_display(self): try: diff --git a/corbo/views.py b/corbo/views.py index 72af6ba..fbdfa20 100644 --- a/corbo/views.py +++ b/corbo/views.py @@ -6,13 +6,11 @@ from django.conf import settings from django.core import signing from django.core.urlresolvers import reverse from django.views.generic import CreateView, UpdateView, DeleteView, \ - ListView, TemplateView, RedirectView, \ - DetailView + ListView, TemplateView, RedirectView, DetailView from django.contrib.syndication.views import Feed from django.shortcuts import resolve_url from django.utils.encoding import force_text from django.utils.feedgenerator import Atom1Feed as DjangoAtom1Feed -from django.utils.http import urlencode from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.contrib.auth import logout as auth_logout from django.contrib.auth import views as auth_views @@ -26,14 +24,16 @@ try: except ImportError: get_idps = lambda: [] + def login(request, *args, **kwargs): if any(get_idps()): - if not 'next' in request.GET: + if 'next' not in request.GET: return HttpResponseRedirect(resolve_url('mellon_login')) - return HttpResponseRedirect(resolve_url('mellon_login') + '?next=' - + urllib.quote(request.GET.get('next'))) + return HttpResponseRedirect(resolve_url('mellon_login') + '?next=' + + urllib.quote(request.GET.get('next'))) return auth_views.login(request, *args, **kwargs) + def logout(request, next_page=None): if any(get_idps()): return HttpResponseRedirect(resolve_url('mellon_logout')) @@ -48,6 +48,7 @@ def logout(request, next_page=None): class HomepageView(RedirectView): pattern_name = 'manage' + homepage = HomepageView.as_view() @@ -69,6 +70,7 @@ class AnnounceCreateView(CreateView): context['category'] = kwargs['form'].initial['category'] return context + add_announce = AnnounceCreateView.as_view() @@ -85,16 +87,20 @@ class AnnounceEditView(UpdateView): def get_success_url(self): return reverse('view_category', kwargs={'pk': self.object.category.pk}) + edit_announce = AnnounceEditView.as_view() + class AnnounceDeleteView(DeleteView): model = models.Announce def get_success_url(self): return reverse('view_category', kwargs={'pk': self.object.category.pk}) + delete_announce = AnnounceDeleteView.as_view() + class CategoryCreateView(CreateView): form_class = CategoryForm template_name = 'corbo/category_form.html' @@ -106,6 +112,7 @@ class CategoryCreateView(CreateView): form.save() return super(CategoryCreateView, self).form_valid(form) + add_category = CategoryCreateView.as_view() @@ -116,6 +123,7 @@ class CategoryEditView(UpdateView): def get_success_url(self): return reverse('view_category', kwargs={'pk': self.object.pk}) + edit_category = CategoryEditView.as_view() @@ -127,6 +135,7 @@ class CategoryView(DetailView): context['announces'] = self.object.announce_set.all() return context + view_category = CategoryView.as_view() @@ -136,6 +145,7 @@ class CategoryDeleteView(DeleteView): def get_success_url(self): return reverse('manage') + delete_category = CategoryDeleteView.as_view() @@ -146,18 +156,20 @@ class UnsubscribeView(DeleteView): data = signing.loads(self.kwargs['unsubscription_token']) try: return models.Subscription.objects.get(category__pk=data['category'], - identifier=data['identifier']) + identifier=data['identifier']) except models.Subscription.DoesNotExist: raise Http404 def get_success_url(self): return reverse('unsubscription_done') + unsubscribe = UnsubscribeView.as_view() class UnsubscriptionDoneView(TemplateView): - template_name='corbo/unsubscription_done.html' + template_name = 'corbo/unsubscription_done.html' + unsubscription_done = UnsubscriptionDoneView.as_view() @@ -166,10 +178,12 @@ class ManageView(ListView): template_name = 'corbo/manage.html' model = models.Category + manage = ManageView.as_view() class Atom1Feed(DjangoAtom1Feed): + def root_attributes(self): attrs = super(Atom1Feed, self).root_attributes() attrs.update({'xml:base': self.feed['link']}) @@ -201,15 +215,16 @@ class AtomView(Feed): def item_pubdate(self, item): return item.publication_time or item.mtime + atom = AtomView() def menu_json(request): label = _('Announces') json_str = json.dumps([{'label': force_text(label), - 'slug': 'announces', - 'url': request.build_absolute_uri(reverse('manage')) - }]) + 'slug': 'announces', + 'url': request.build_absolute_uri(reverse('manage'))}]) + for variable in ('jsonpCallback', 'callback'): if variable in request.GET: response = HttpResponse(content_type='application/javascript') diff --git a/tests/conftest.py b/tests/conftest.py index 674a805..e609d02 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,7 @@ import pytest import django_webtest + @pytest.fixture def app(request): wtm = django_webtest.WebTestMixin() diff --git a/tests/test_announces.py b/tests/test_announces.py index 25546c8..1e11275 100644 --- a/tests/test_announces.py +++ b/tests/test_announces.py @@ -33,8 +33,10 @@ ATOM_FEED = """ """ + def mocked_request_get(*args, **kwargs): storage = DefaultStorage() + class MockResponse: def __init__(self, content): diff --git a/tests/test_api.py b/tests/test_api.py index c6bb505..31c0510 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,5 +1,4 @@ import pytest -import json from uuid import uuid4 @@ -23,6 +22,7 @@ def categories(): categories.append(c) return categories + @pytest.fixture def announces(): announces = [] @@ -35,11 +35,12 @@ def announces(): announces.append(a) return announces + @pytest.fixture def user(): User = get_user_model() - user = User.objects.create(username='john.doe', - first_name=u'John', last_name=u'Doe', email='john.doe@example.net') + user = User.objects.create(username='john.doe', first_name=u'John', + last_name=u'Doe', email='john.doe@example.net') user.set_password('password') user.save() return user @@ -67,8 +68,7 @@ def test_get_subscriptions_by_email(app, categories, announces, user): for identifier, name in channel_choices[:1]: for category in categories: uri = '%s:%s' % (identifier, foo) - subscription = Subscription.objects.create(identifier=uri, - category=category) + Subscription.objects.create(identifier=uri, category=category) resp = app.get(reverse('subscriptions'), {'email': foo}) assert 'data' in resp.json data = resp.json['data'] @@ -92,10 +92,10 @@ def test_update_subscriptions(app, categories, announces, user): subscriptions = [{'id': category_id, 'text': category.name, 'transports': transports}] - resp = app.post_json(subscriptions_url , subscriptions) + resp = app.post_json(subscriptions_url, subscriptions) if resp.json['data']: resp = app.get(subscriptions_url) - print resp.json['data'] + for cat in resp.json['data']: if cat['id'] == category_id: sub_transports = [c['id'] for c in cat['transports']] diff --git a/tests/test_emailing.py b/tests/test_emailing.py index 9f367ea..197321a 100644 --- a/tests/test_emailing.py +++ b/tests/test_emailing.py @@ -1,21 +1,15 @@ -import urlparse import pytest -import json from uuid import uuid4 import os import re import urllib from django.core.urlresolvers import reverse -from django.utils.http import urlencode from django.core import mail, signing from django.utils import timezone from django.core.files.storage import DefaultStorage -from django.core.urlresolvers import reverse -from django.conf import settings -from corbo.models import Category, Announce, Subscription, Broadcast -from corbo.models import channel_choices, transform_image_src +from corbo.models import Category, Announce, Subscription, Broadcast, transform_image_src pytestmark = pytest.mark.django_db @@ -30,6 +24,7 @@ def categories(): categories.append(c) return categories + @pytest.fixture def announces(): announces = [] @@ -46,6 +41,7 @@ def announces(): announces.append(a) return announces + def test_emailing_with_no_subscriptions(app, categories, announces): for announce in announces: broadcast = Broadcast.objects.get(announce=announce) @@ -53,24 +49,26 @@ def test_emailing_with_no_subscriptions(app, categories, announces): assert not broadcast.result assert not mail.outbox + def test_send_email(app, categories, announces): for category in categories: uuid = uuid4() - s = Subscription.objects.create(category=category, - identifier='%s@example.net' % uuid, uuid=uuid) + Subscription.objects.create(category=category, + identifier='%s@example.net' % uuid, uuid=uuid) for announce in announces: - broadcast= Broadcast.objects.get(announce=announce) + broadcast = Broadcast.objects.get(announce=announce) broadcast.send() assert broadcast.result assert mail.outbox + def test_check_inline_css(app, categories, announces): for announce in announces: announce.text = '' + announce.text announce.save() uuid = uuid4() - s = Subscription.objects.create(category=announce.category, - identifier='%s@example.net' % uuid, uuid=uuid) + Subscription.objects.create(category=announce.category, + identifier='%s@example.net' % uuid, uuid=uuid) broadcast = Broadcast.objects.get(announce=announce) broadcast.send() assert broadcast.result @@ -78,6 +76,7 @@ def test_check_inline_css(app, categories, announces): assert 'h2 style="color:#F00"' in mail.outbox[0].html mail.outbox = [] + def test_check_inline_images(app, categories, announces): storage = DefaultStorage() media_path = os.path.join(os.path.dirname(__file__), 'media') @@ -88,8 +87,8 @@ def test_check_inline_images(app, categories, announces): announce.text = announce.text + '' % img_src announce.save() uuid = uuid4() - s = Subscription.objects.create(category=announce.category, - identifier='%s@example.net' % uuid, uuid=uuid) + Subscription.objects.create(category=announce.category, + identifier='%s@example.net' % uuid, uuid=uuid) broadcast = Broadcast.objects.get(announce=announce) broadcast.send() assert broadcast.result @@ -101,19 +100,18 @@ def test_check_inline_images(app, categories, announces): mail.outbox = [] storage.delete(image_name) + def test_unsubscription_link(app, categories, announces): unsubscription_link_sentinel = '' for category in categories: uuid = uuid4() scheme = 'mailto:' uri = scheme + '%s@example.net' % uuid - s = Subscription.objects.create(category=category, - identifier=uri, - uuid=str(uuid)) + Subscription.objects.create(category=category, identifier=uri, uuid=str(uuid)) for announce in announces: if announce.category != category: continue - broadcast= Broadcast.objects.get(announce=announce) + broadcast = Broadcast.objects.get(announce=announce) broadcast.send() assert broadcast.result assert mail.outbox @@ -121,7 +119,7 @@ def test_unsubscription_link(app, categories, announces): signature = urllib.unquote(re.findall('/unsubscribe/(.*)"', mail.outbox[0].html)[0]) unsubscription_link = reverse('unsubscribe', kwargs={'unsubscription_token': signature}) assert signing.loads(signature) == { - 'category': announce.category.pk, 'identifier': uri} + 'category': announce.category.pk, 'identifier': uri} assert mail.outbox[0].subject == announce.title assert unsubscription_link in mail.outbox[0].html assert unsubscription_link in mail.outbox[0].text -- 2.9.3