From e0dc1276f099429248a9cae3ef86a1d798485496 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20K=C3=B6gl?= Date: Fri, 15 Mar 2013 17:59:38 +0100 Subject: [PATCH] pep8-ify some code --- mygpo/cache.py | 4 +-- mygpo/constants.py | 3 +- mygpo/decorators.py | 8 +---- mygpo/web/__init__.py | 1 - mygpo/web/auth.py | 15 ++++---- mygpo/web/forms.py | 97 +++++++++++++++++++++++++++++++++++++-------------- mygpo/web/google.py | 1 + mygpo/web/heatmap.py | 17 ++++----- mygpo/web/logo.py | 12 +++---- mygpo/web/tests.py | 8 ++--- mygpo/web/utils.py | 18 +++++----- 11 files changed, 106 insertions(+), 78 deletions(-) diff --git a/mygpo/cache.py b/mygpo/cache.py index 85dfc1e1..38da88ce 100644 --- a/mygpo/cache.py +++ b/mygpo/cache.py @@ -21,7 +21,8 @@ def cache_result(**cache_kwargs): @wraps(f) def _get(*args, **kwargs): - key = sha1(str(f.__module__) + str(f.__name__) + unicode(args) + unicode(kwargs)).hexdigest() + key = sha1(str(f.__module__) + str(f.__name__) + + unicode(args) + unicode(kwargs)).hexdigest() # the timeout parameter can't be used when getting from a cache get_kwargs = dict(cache_kwargs) @@ -36,7 +37,6 @@ def cache_result(**cache_kwargs): return value - return _get return _wrapper diff --git a/mygpo/constants.py b/mygpo/constants.py index 9c80e029..d03b2726 100644 --- a/mygpo/constants.py +++ b/mygpo/constants.py @@ -18,8 +18,7 @@ PODCAST_LOGO_SIZE = 32 -PODCAST_LOGO_MEDIUM_SIZE=64 +PODCAST_LOGO_MEDIUM_SIZE = 64 PODCAST_LOGO_BIG_SIZE = 128 DEFAULT_LOGIN_REDIRECT = '/' - diff --git a/mygpo/decorators.py b/mygpo/decorators.py index 76825755..f5197ea6 100644 --- a/mygpo/decorators.py +++ b/mygpo/decorators.py @@ -62,7 +62,7 @@ def requires_token(token_name, denied_template=None): if denied_template: return render(request, denied_template, { 'other_user': user - }) + }) else: return HttpResponseForbidden() @@ -99,11 +99,9 @@ class repeat_on_conflict(object): self.obj_names = obj_names self.reload_f = reload_f or self.default_reload - def default_reload(self, obj): return obj.__class__.get(obj._id) - def build_locals(self, f, args, kwargs): argspec = getattr(f, self.ARGSPEC) if len(args) > len(argspec.args): @@ -119,9 +117,6 @@ class repeat_on_conflict(object): locals.update(kwargs) return locals - - - def __call__(self, f): if not hasattr(f, self.ARGSPEC): @@ -146,7 +141,6 @@ class repeat_on_conflict(object): return wrapper - def query_if_required(): """ If required, queries some resource before calling the function diff --git a/mygpo/web/__init__.py b/mygpo/web/__init__.py index 617b87b1..a932e20b 100644 --- a/mygpo/web/__init__.py +++ b/mygpo/web/__init__.py @@ -14,4 +14,3 @@ # You should have received a copy of the GNU Affero General Public License # along with my.gpodder.org. If not, see . # - diff --git a/mygpo/web/auth.py b/mygpo/web/auth.py index eb15ecbf..e2ea6a8c 100644 --- a/mygpo/web/auth.py +++ b/mygpo/web/auth.py @@ -49,12 +49,13 @@ def get_google_oauth_flow(request): callback = 'http{s}://{domain}{callback}'.format( s='s' if request.is_secure() else '', - domain = site.domain, - callback = reverse('login-google-callback')) - - flow = OAuth2WebServerFlow(client_id=settings.GOOGLE_CLIENT_ID, - client_secret=settings.GOOGLE_CLIENT_SECRET, - scope='https://www.googleapis.com/auth/userinfo.email', - redirect_uri=callback) + domain=site.domain, + callback=reverse('login-google-callback')) + + flow = OAuth2WebServerFlow( + client_id=settings.GOOGLE_CLIENT_ID, + client_secret=settings.GOOGLE_CLIENT_SECRET, + scope='https://www.googleapis.com/auth/userinfo.email', + redirect_uri=callback) return flow diff --git a/mygpo/web/forms.py b/mygpo/web/forms.py index 85a42937..3d9b5299 100644 --- a/mygpo/web/forms.py +++ b/mygpo/web/forms.py @@ -16,48 +16,75 @@ class UserAccountForm(forms.Form): and the current and new passwords are checked. """ email = forms.EmailField(label=_('E-Mail address')) - password_current = forms.CharField(label=_(u'Current password'),widget=forms.PasswordInput(render_value=False), required=False) - password1 = forms.CharField(label=_(u'New password'),widget=forms.PasswordInput(render_value=False), required=False) - password2 = forms.CharField(label=_(u'Confirm password'),widget=forms.PasswordInput(render_value=False), required=False) + password_current = forms.CharField( + label=_(u'Current password'), + widget=forms.PasswordInput(render_value=False), + required=False) + + password1 = forms.CharField( + label=_(u'New password'), + widget=forms.PasswordInput(render_value=False), + required=False) + + password2 = forms.CharField( + label=_(u'Confirm password'), + widget=forms.PasswordInput(render_value=False), + required=False) def is_valid(self): - if not super(UserAccountForm, self).is_valid(): return False + if not super(UserAccountForm, self).is_valid(): + return False + + pw1 = self.cleaned_data['password1'] + pw2 = self.cleaned_data['password2'] + + if self.cleaned_data['password_current'] or pw1 or pw2: - if self.cleaned_data['password_current'] or self.cleaned_data['password1'] or self.cleaned_data['password2']: if self.cleaned_data['password_current'] == '': - return False #must give current password + return False # must give current password - if self.cleaned_data['password1'] == '': - return False #cant set empty password + if pw1 == '': + return False # cant set empty password - if self.cleaned_data['password1'] != self.cleaned_data['password2']: - return False #must confirm password + if pw1 != pw2: + return False # 5must confirm password return True class ProfileForm(forms.Form): - twitter = forms.CharField(label=_(u'Twitter'), required=False) - about = forms.CharField(label=_(u'A few words about you'), required=False, widget=forms.Textarea, help_text='You can use Markdown') + twitter = forms.CharField( + label=_(u'Twitter'), + required=False) + + about = forms.CharField( + label=_(u'A few words about you'), + required=False, + widget=forms.Textarea, + help_text='You can use Markdown') class FlattrForm(forms.Form): """ Per-user Flattr settings """ # Authentication token; empty or None when not signed in - token = forms.CharField(required=False, label=_('Token')) + token = forms.CharField( + required=False, + label=_('Token')) # Auto-flattring enabled - enable = forms.BooleanField(required=False, - label=_('Auto-Flattr played episodes')) + enable = forms.BooleanField( + required=False, + label=_('Auto-Flattr played episodes')) # Auto-flattr mygpo (or whatever the FLATTR_MYGPO_THING # in settings_prod.py is) on every other flattr flattr_mygpo = forms.BooleanField(required=False, label=_('Flattr us')) # username under which own content (eg podcast lists) should be published - username = forms.CharField(required=False, - label=_('Username for own content')) + username = forms.CharField( + required=False, + label=_('Username for own content')) class DeviceForm(forms.Form): @@ -68,12 +95,17 @@ class DeviceForm(forms.Form): type = forms.ChoiceField(choices=DEVICE_TYPES, label=_('Type')) uid = forms.CharField(max_length=50, label=_('Device ID')) + class PrivacyForm(forms.Form): """ Form for editing the privacy settings for a subscription. It is shown on a podcast page if the current user is subscribed to the podcast. """ - public = forms.BooleanField(required=False, label=_('Share this subscription with other users (public)')) + + public = forms.BooleanField( + required=False, + label=_('Share this subscription with other users (public)')) + class SyncForm(forms.Form): """ @@ -84,8 +116,9 @@ class SyncForm(forms.Form): def set_targets(self, sync_targets, label=''): targets = map(self.sync_target_choice, sync_targets) - self.fields['targets'] = forms.ChoiceField(choices=targets, label=label) - + self.fields['targets'] = forms.ChoiceField( + choices=targets, + label=label) def sync_target_choice(self, target): """ @@ -103,7 +136,6 @@ class SyncForm(forms.Form): elif isinstance(target, list): return (target[0].uid, ', '.join(d.name for d in target)) - def get_target(self): """ returns the target (device or device group) that has been selected @@ -118,11 +150,24 @@ class SyncForm(forms.Form): class ResendActivationForm(forms.Form): - username = forms.CharField(max_length=100, label=_('Please enter your username'), required=False) - email = forms.CharField(max_length=100, label=_('or the email address used while registering'), required=False) + username = forms.CharField( + max_length=100, + label=_('Please enter your username'), + required=False) + email = forms.CharField( + max_length=100, + label=_('or the email address used while registering'), + required=False) -class RestorePasswordForm(forms.Form): - username = forms.CharField(max_length=100, label=_('Username'), required=False) - email = forms.CharField(max_length=100, label=_('E-Mail address'), required=False) +class RestorePasswordForm(forms.Form): + username = forms.CharField( + max_length=100, + label=_('Username'), + required=False) + + email = forms.CharField( + max_length=100, + label=_('E-Mail address'), + required=False) diff --git a/mygpo/web/google.py b/mygpo/web/google.py index b155b11d..12ae507e 100644 --- a/mygpo/web/google.py +++ b/mygpo/web/google.py @@ -17,6 +17,7 @@ from django.conf import settings + def analytics(request): pid = settings.GOOGLE_ANALYTICS_PROPERTY_ID if pid: diff --git a/mygpo/web/heatmap.py b/mygpo/web/heatmap.py index ca63b584..917a9cc2 100644 --- a/mygpo/web/heatmap.py +++ b/mygpo/web/heatmap.py @@ -32,26 +32,25 @@ class EpisodeHeatmap(object): self.podcast_id = podcast_id if episode_id is not None and podcast_id is None: - raise ValueError('episode_id can only be used ' - 'if podcast_id is not None') + raise ValueError( + 'episode_id can only be used if podcast_id is not None') self.episode_id = episode_id if user_id is not None and episode_id is None: - raise ValueError('user_id can only be used ' - 'if episode_id is not None') + raise ValueError( + 'user_id can only be used if episode_id is not None') self.user_id = user_id self.duration = duration self.heatmap = None self.borders = None - def _query(self): """ Queries the database and stores the heatmap and its borders """ - self.heatmap, self.borders = get_heatmap(self.podcast_id, - self.episode_id, self.user_id) + self.heatmap, self.borders = get_heatmap( + self.podcast_id, self.episode_id, self.user_id) if self.borders and self.heatmap: # heatmap info doesn't reach until the end of the episode @@ -60,7 +59,6 @@ class EpisodeHeatmap(object): self.heatmap.append(0) self.borders.append(self.duration) - def query_if_required(): """ If required, queries the database before calling the function """ @@ -74,7 +72,6 @@ class EpisodeHeatmap(object): return tmp return decorator - @property @query_if_required() def max_plays(self): @@ -82,7 +79,6 @@ class EpisodeHeatmap(object): return max(self.heatmap) - @property @query_if_required() def sections(self): @@ -94,7 +90,6 @@ class EpisodeHeatmap(object): for i in range(len(self.heatmap)): yield (self.borders[i], self.borders[i+1], self.heatmap[i]) - @query_if_required() def __nonzero__(self): return any(self.heatmap) diff --git a/mygpo/web/logo.py b/mygpo/web/logo.py index 3415493b..40f52bbf 100644 --- a/mygpo/web/logo.py +++ b/mygpo/web/logo.py @@ -45,10 +45,8 @@ def _last_modified(request, size, prefix, filename): return None - class CoverArt(View): - @method_decorator(last_modified(_last_modified)) def get(self, request, size, prefix, filename): @@ -85,15 +83,16 @@ class CoverArt(View): if resized.mode == 'RGBA': background = Image.new('RGB', resized.size) draw = ImageDraw.Draw(background) - draw.rectangle((-1, -1, resized.size[0]+1, resized.size[1]+1), \ - fill=(255, 255, 255)) + draw.rectangle((-1, -1, resized.size[0]+1, resized.size[1]+1), + fill=(255, 255, 255)) del draw resized = Image.composite(resized, background, resized) io = StringIO.StringIO() try: - resized.save(io, 'JPEG', optimize=True, progression=True, quality=80) + resized.save(io, 'JPEG', optimize=True, progression=True, + quality=80) except IOError as ex: return self.send_file(original) @@ -105,7 +104,6 @@ class CoverArt(View): return self.send_file(target) - # the length of the prefix is defined here and in web/urls.py @staticmethod def get_prefix(filename): @@ -124,7 +122,6 @@ class CoverArt(View): def get_original(prefix, filename): return os.path.join(LOGO_DIR, 'original', prefix, filename) - @staticmethod def get_dir(filename): path = os.path.dirname(filename) @@ -137,7 +134,6 @@ class CoverArt(View): return path - def send_file(self, filename): resp = HttpResponse(content_type='image/jpeg') resp.status_code = 200 diff --git a/mygpo/web/tests.py b/mygpo/web/tests.py index 74e050e0..4f40da79 100644 --- a/mygpo/web/tests.py +++ b/mygpo/web/tests.py @@ -33,7 +33,6 @@ class SimpleWebTests(TestCase): self.auth_string = create_auth_string('test', 'pwd') - def test_access_parameterless_pages(self): pages = [ 'history', @@ -58,15 +57,13 @@ class SimpleWebTests(TestCase): self.access_pages(pages, [], True) - def test_access_podcast_pages(self): pages = ['podcast', ] - def access_pages(self, pages, args, login): if login: - self.client.post('/login/', - dict(login_username=self.user.username, pwd='pwd')) + self.client.post('/login/', dict( + login_username=self.user.username, pwd='pwd')) for page in pages: response = self.client.get(reverse(page, args=args), follow=True) @@ -78,4 +75,3 @@ def suite(): suite.addTest(doctest.DocTestSuite(mygpo.web.utils)) suite.addTest(unittest.TestLoader().loadTestsFromTestCase(SimpleWebTests)) return suite - diff --git a/mygpo/web/utils.py b/mygpo/web/utils.py index bd0bc3f8..2cb81d00 100644 --- a/mygpo/web/utils.py +++ b/mygpo/web/utils.py @@ -34,7 +34,7 @@ def sanitize_language_code(lang): return lang[:2].lower() -def sanitize_language_codes(langs): +def sanitize_language_codes(ls): """ expects a list of language codes and returns a unique lost of the first part of all items. obviously invalid entries are skipped @@ -46,7 +46,8 @@ def sanitize_language_codes(langs): ['de', 'en'] """ - return list(set([sanitize_language_code(l) for l in langs if l and RE_LANG.match(l)])) + ls = [sanitize_language_code(l) for l in ls if l and RE_LANG.match(l)] + return list(set(ls)) def get_language_names(lang): @@ -67,8 +68,6 @@ def get_language_names(lang): return res - - def get_page_list(start, total, cur, show_max): """ returns a list of pages to be linked for navigation in a paginated view @@ -101,7 +100,8 @@ def get_page_list(start, total, cur, show_max): ps.append(cur) if (total - cur) > show_max / 2: - add = show_max / 2 - len(ps) # for the first pages, show more pages at the beginning + # for the first pages, show more pages at the beginning + add = show_max / 2 - len(ps) ps.extend(range(cur + 1, cur + show_max / 4 + add)) ps.append('...') ps.extend(range(total - show_max / 4, total + 1)) @@ -124,8 +124,8 @@ def process_lang_params(request): def symbian_opml_changes(podcast): - podcast.description = (podcast.title or '') + '\n' \ - + (podcast.description or '') + podcast.description = (podcast.title or '') + '\n' + \ + (podcast.description or '') return podcast @@ -182,7 +182,8 @@ def get_podcast_group_link_target(group, view_name, add_args=[]): return reverse(view_name, args=args + add_args) -def get_episode_link_target(episode, podcast, view_name='episode', add_args=[]): +def get_episode_link_target(episode, podcast, view_name='episode', + add_args=[]): """ Returns the link-target for an Episode, preferring slugs over Ids automatically distringuishes between relational Episode objects and @@ -230,6 +231,7 @@ def fetch_episode_data(episodes, podcasts={}): # doesn't include the '@' because it's not stored as part of a twitter handle TWITTER_CHARS = string.ascii_letters + string.digits + '_' + def normalize_twitter(s): """ normalize user input that is supposed to be a Twitter handle """ return "".join(i for i in s if i in TWITTER_CHARS) -- 2.11.4.GIT