diff options
author | Angel Velásquez <angvp@archlinux.org> | 2017-08-23 11:21:03 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-23 11:21:03 -0400 |
commit | dcc32265ce815882544c2e6568e4c75dc359fc85 (patch) | |
tree | 2b8a3e802f37160300745f1c510e9d56196bd1ef | |
parent | 5ce4d6ef59fd5ad6f46ab4eecacf6a6d76724407 (diff) | |
parent | 9de6b137b8a188f546f3446a7bc3bd7db6954327 (diff) | |
download | archweb-dcc32265ce815882544c2e6568e4c75dc359fc85.tar.gz archweb-dcc32265ce815882544c2e6568e4c75dc359fc85.zip |
Merge pull request #50 from jelly/refactor
Refactor and introduce Pylint to travisci
-rw-r--r-- | .pylintrc | 583 | ||||
-rw-r--r-- | .travis.yml | 3 | ||||
-rw-r--r-- | devel/forms.py | 2 | ||||
-rw-r--r-- | main/models.py | 3 | ||||
-rw-r--r-- | mirrors/tests.py | 2 | ||||
-rw-r--r-- | packages/templatetags/package_extras.py | 2 | ||||
-rw-r--r-- | packages/tests.py | 1 | ||||
-rw-r--r-- | packages/views/__init__.py | 4 | ||||
-rw-r--r-- | public/utils.py | 2 | ||||
-rw-r--r-- | public/views.py | 2 | ||||
-rw-r--r-- | releng/models.py | 1 | ||||
-rw-r--r-- | releng/tests.py | 3 | ||||
-rw-r--r-- | releng/views.py | 4 | ||||
-rw-r--r-- | urls.py | 6 |
14 files changed, 597 insertions, 21 deletions
diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 00000000..fc540ae7 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,583 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=env + +# Pickle collected data for later comparisons. +persistent=no + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Use multiple processes to speed up Pylint. +# DO NOT CHANGE THIS VALUES >1 HIDE RESULTS!!!!! +jobs=1 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist= + +# Allow optimization of some AST trees. This will activate a peephole AST +# optimizer, which will apply various small optimizations. For instance, it can +# be used to obtain the result of joining multiple strings with the addition +# operator. Joining a lot of strings can lead to a maximum recursion error in +# Pylint and this flag can prevent that. It has one side effect, the resulting +# AST will be different than the one from reality. +optimize-ast=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. See also the "--disable" option for examples. +disable=all + +enable=import-self, + reimported, + misplaced-future, + relative-import, + deprecated-module, + unpacking-non-sequence, + invalid-all-object, + undefined-all-variable, + used-before-assignment, + cell-var-from-loop, + global-variable-undefined, + redefined-builtin, + redefine-in-handler, + unused-import, + global-variable-not-assigned, + undefined-loop-variable, + global-statement, + global-at-module-level, + bad-open-mode, + redundant-unittest-assert, + boolean-datetime, + not-in-loop, + return-outside-function, + pointless-statement, + pointless-string-statement, + unnecessary-pass, + unreachable, + unnecessary-semicolon, + eval-used, + exec-used, + logging-unsupported-format, + logging-not-lazy, + unused-variable + +# Things we'd like to enable someday: +# redefined-outer-name (requires a bunch of work to clean up our code first) +# undefined-variable (re-enable when pylint fixes https://github.com/PyCQA/pylint/issues/760) +# no-name-in-module (giving us spurious warnings https://github.com/PyCQA/pylint/issues/73) +# unused-argument (need to clean up or code a lot, e.g. prefix unused_?) + +# Things we'd like to try. +# Procedure: +# 1. Enable a bunch. +# 2. See if there's spurious ones; if so disable. +# 3. Record above. +# 4. Remove from this list. + # deprecated-method, + # anomalous-unicode-escape-in-string, + # anomalous-backslash-in-string, + # not-in-loop, + # function-redefined, + # continue-in-finally, + # abstract-class-instantiated, + # star-needs-assignment-target, + # duplicate-argument-name, + # return-in-init, + # too-many-star-expressions, + # nonlocal-and-global, + # return-outside-function, + # return-arg-in-generator, + # invalid-star-assignment-target, + # bad-reversed-sequence, + # nonexistent-operator, + # yield-outside-function, + # init-is-generator, + # nonlocal-without-binding, + # lost-exception, + # assert-on-tuple, + # dangerous-default-value, + # duplicate-key, + # useless-else-on-loop, + # expression-not-assigned, + # confusing-with-statement, + # unnecessary-lambda, + # pointless-statement, + # pointless-string-statement, + # unnecessary-pass, + # unreachable, + # eval-used, + # exec-used, + # bad-builtin, + # using-constant-test, + # deprecated-lambda, + # bad-super-call, + # missing-super-argument, + # slots-on-old-class, + # super-on-old-class, + # property-on-old-class, + # not-an-iterable, + # not-a-mapping, + # format-needs-mapping, + # truncated-format-string, + # missing-format-string-key, + # mixed-format-string, + # too-few-format-args, + # bad-str-strip-call, + # too-many-format-args, + # bad-format-character, + # format-combined-specification, + # bad-format-string-key, + # bad-format-string, + # missing-format-attribute, + # missing-format-argument-key, + # unused-format-string-argument, + # unused-format-string-key, + # invalid-format-index, + # bad-indentation, + # mixed-indentation, + # unnecessary-semicolon, + # lowercase-l-suffix, + # fixme, + # invalid-encoded-data, + # unpacking-in-except, + # import-star-module-level, + # parameter-unpacking, + # long-suffix, + # old-octal-literal, + # old-ne-operator, + # backtick, + # old-raise-syntax, + # print-statement, + # metaclass-assignment, + # next-method-called, + # dict-iter-method, + # dict-view-method, + # indexing-exception, + # raising-string, + # standarderror-builtin, + # using-cmp-argument, + # cmp-method, + # coerce-method, + # delslice-method, + # getslice-method, + # hex-method, + # nonzero-method, + # oct-method, + # setslice-method, + # apply-builtin, + # basestring-builtin, + # buffer-builtin, + # cmp-builtin, + # coerce-builtin, + # old-division, + # execfile-builtin, + # file-builtin, + # filter-builtin-not-iterating, + # no-absolute-import, + # input-builtin, + # intern-builtin, + # long-builtin, + # map-builtin-not-iterating, + # range-builtin-not-iterating, + # raw_input-builtin, + # reduce-builtin, + # reload-builtin, + # round-builtin, + # unichr-builtin, + # unicode-builtin, + # xrange-builtin, + # zip-builtin-not-iterating, + # logging-format-truncated, + # logging-too-few-args, + # logging-too-many-args, + # logging-unsupported-format, + # logging-not-lazy, + # logging-format-interpolation, + # invalid-unary-operand-type, + # unsupported-binary-operation, + # no-member, + # not-callable, + # redundant-keyword-arg, + # assignment-from-no-return, + # assignment-from-none, + # not-context-manager, + # repeated-keyword, + # missing-kwoa, + # no-value-for-parameter, + # invalid-sequence-index, + # invalid-slice-index, + # too-many-function-args, + # unexpected-keyword-arg, + # unsupported-membership-test, + # unsubscriptable-object, + # access-member-before-definition, + # method-hidden, + # assigning-non-slot, + # duplicate-bases, + # inconsistent-mro, + # inherit-non-class, + # invalid-slots, + # invalid-slots-object, + # no-method-argument, + # no-self-argument, + # unexpected-special-method-signature, + # non-iterator-returned, + # protected-access, + # arguments-differ, + # attribute-defined-outside-init, + # no-init, + # abstract-method, + # signature-differs, + # bad-staticmethod-argument, + # non-parent-init-called, + # super-init-not-called, + # bad-except-order, + # catching-non-exception, + # bad-exception-context, + # notimplemented-raised, + # raising-bad-type, + # raising-non-exception, + # misplaced-bare-raise, + # duplicate-except, + # broad-except, + # nonstandard-exception, + # binary-op-exception, + # bare-except, + # not-async-context-manager, + # yield-inside-async-function, + +# ... +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=parseable + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=100 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )?<?https?://\S+>?$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). This supports can work +# with qualified names. +ignored-classes= + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=^_|^dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[BASIC] + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,input + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Regular expression matching correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for function names +function-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for variable names +variable-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct constant names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for attribute names +attr-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for argument names +argument-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Naming hint for class names +class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for method names +method-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[ELIF] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=5 + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception diff --git a/.travis.yml b/.travis.yml index 9fdb9a94..94cadeca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,12 @@ language: python python: - "2.7" -install: "pip install -r requirements.txt && pip install coveralls" +install: "pip install -r requirements.txt && pip install coveralls pylint" script: - python manage.py collectstatic --noinput - coverage run --rcfile .coveragerc manage.py test + - pylint *.py after_success: - coveralls diff --git a/devel/forms.py b/devel/forms.py index cd50eb50..73d725e5 100644 --- a/devel/forms.py +++ b/devel/forms.py @@ -73,7 +73,7 @@ class NewUserForm(forms.ModelForm): def save(self, commit=True): profile = super(NewUserForm, self).save(False) pwletters = ascii_letters + digits - password = ''.join([random.choice(pwletters) for _ in xrange(8)]) + password = ''.join([random.choice(pwletters) for _ in range(8)]) user = User.objects.create_user(username=self.cleaned_data['username'], email=self.cleaned_data['private_email'], password=password) user.first_name = self.cleaned_data['first_name'] diff --git a/main/models.py b/main/models.py index 1b95f3fa..9fe4b1fa 100644 --- a/main/models.py +++ b/main/models.py @@ -1,4 +1,3 @@ -from datetime import datetime from itertools import groupby from pgpdump import BinaryData @@ -249,7 +248,7 @@ class Package(models.Model): return (depend.deptype, p.pkgbase, p.repo.testing, p.repo.staging) filtered = [] - for (typ, pkgbase, _, _), dep_pkgs in groupby(requiredby, grouper): + for (typ, _, _, _), dep_pkgs in groupby(requiredby, grouper): dep_pkgs = list(dep_pkgs) if typ == 'D' or len(dep_pkgs) == 1: filtered.extend(dep_pkgs) diff --git a/mirrors/tests.py b/mirrors/tests.py index 47710e48..1261cf59 100644 --- a/mirrors/tests.py +++ b/mirrors/tests.py @@ -2,7 +2,7 @@ import json from django.test import TestCase -from models import MirrorUrl, MirrorProtocol, Mirror +from mirrors.models import MirrorUrl, MirrorProtocol, Mirror def create_mirror_url(): mirror = Mirror.objects.create(name='mirror1', admin_email='admin@archlinux.org') diff --git a/packages/templatetags/package_extras.py b/packages/templatetags/package_extras.py index 73a39092..f9aa086d 100644 --- a/packages/templatetags/package_extras.py +++ b/packages/templatetags/package_extras.py @@ -36,7 +36,7 @@ class BuildQueryStringNode(template.Node): @register.tag(name='buildsortqs') def do_buildsortqs(parser, token): try: - tagname, sortfield = token.split_contents() + _, sortfield = token.split_contents() except ValueError: raise template.TemplateSyntaxError( "%r tag requires a single argument" % token) diff --git a/packages/tests.py b/packages/tests.py index 5b916bfa..e7230e95 100644 --- a/packages/tests.py +++ b/packages/tests.py @@ -1,7 +1,6 @@ import unittest from django.test import TestCase -from main.models import Package, Arch, Repo from .alpm import AlpmAPI diff --git a/packages/views/__init__.py b/packages/views/__init__.py index 7941a265..634758f6 100644 --- a/packages/views/__init__.py +++ b/packages/views/__init__.py @@ -65,7 +65,7 @@ def update(request): ids = request.POST.getlist('pkgid') count = 0 - if request.POST.has_key('adopt'): + if 'adopt' in request.POST: repos = request.user.userprofile.allowed_repos.all() pkgs = Package.objects.filter(id__in=ids, repo__in=repos) disallowed_pkgs = Package.objects.filter(id__in=ids).exclude( @@ -87,7 +87,7 @@ def update(request): messages.info(request, "%d base packages adopted." % count) - elif request.POST.has_key('disown'): + elif 'disown' in request.POST: # allow disowning regardless of allowed repos, helps things like # [community] -> [extra] moves for pkg in Package.objects.filter(id__in=ids): diff --git a/public/utils.py b/public/utils.py index 11091883..248bd7d8 100644 --- a/public/utils.py +++ b/public/utils.py @@ -48,7 +48,7 @@ class RecentUpdate(object): by_arch = defaultdict(list) for package in self.others: by_arch[package.arch].append(package) - for arch, packages in by_arch.items(): + for _, packages in by_arch.items(): if len(packages) == 1: yield packages[0] else: diff --git a/public/views.py b/public/views.py index ad053b43..9afad7a2 100644 --- a/public/views.py +++ b/public/views.py @@ -2,7 +2,6 @@ from datetime import datetime import json from operator import attrgetter -from django.conf import settings from django.contrib.auth.models import User from django.db.models import Count, Q from django.http import HttpResponse @@ -115,7 +114,6 @@ def keys(request): signatures = frozenset(PGPSignature.objects.filter( not_expired, revoked__isnull=True).values_list('signer', 'signee')) - restrict = Q(signer__in=user_key_ids) & Q(signee__in=user_key_ids) cross_signatures = PGPSignature.objects.filter( not_expired, revoked__isnull=True).order_by('created') # filter in python so we aren't sending a crazy long query to the DB diff --git a/releng/models.py b/releng/models.py index c85ab547..6a0f15dc 100644 --- a/releng/models.py +++ b/releng/models.py @@ -10,7 +10,6 @@ from django.db import models from django.db.models.signals import pre_save from django.utils.safestring import mark_safe -from main.fields import PositiveBigIntegerField from main.utils import set_created_field, parse_markdown diff --git a/releng/tests.py b/releng/tests.py index 3c072095..0ed5f1fe 100644 --- a/releng/tests.py +++ b/releng/tests.py @@ -1,6 +1,3 @@ -import hashlib -from datetime import datetime - from django.test import TestCase from releng.models import Release diff --git a/releng/views.py b/releng/views.py index 70be9736..c3a10256 100644 --- a/releng/views.py +++ b/releng/views.py @@ -13,7 +13,7 @@ from django.views.generic import DetailView, ListView from .models import (Architecture, BootType, Bootloader, ClockChoice, Filesystem, HardwareType, InstallType, Iso, IsoType, Module, Source, Test, Release) -from mirrors.models import (Mirror, MirrorUrl, MirrorProtocol) +from mirrors.models import MirrorUrl def standard_field(model, empty_label=None, help_text=None, required=True): return forms.ModelChoiceField(queryset=model.objects.all(), @@ -282,7 +282,7 @@ def releases_json(request): def netboot_config(request): release_qs = Release.objects.filter(available=True).order_by('-release_date') - releases = [ release.version for release in release_qs ] + releases = [release.version for release in release_qs] mirrorurls = MirrorUrl.objects.filter(protocol__protocol='http', active=True, mirror__public=True, @@ -1,9 +1,9 @@ -from django.conf.urls import include, patterns, url +from django.conf.urls import include, patterns from django.contrib import admin from django.contrib.sitemaps import views as sitemap_views from django.views.decorators.cache import cache_page -from django.views.generic import TemplateView, RedirectView +from django.views.generic import TemplateView from feeds import PackageFeed, NewsFeed, ReleaseFeed import sitemaps @@ -19,7 +19,7 @@ our_sitemaps = { 'todolists': sitemaps.TodolistSitemap, } -news_sitemaps = { 'news': sitemaps.RecentNewsSitemap } +news_sitemaps = {'news': sitemaps.RecentNewsSitemap} urlpatterns = [] |