You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2014/01/10 22:23:20 UTC

[24/36] PEP8 cleanup

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index fb8eaf7..c2e9097 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -54,6 +54,7 @@ from .timeline import ActivityNode, ActivityObject
 
 log = logging.getLogger(__name__)
 
+
 def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
     """
     Returns a bytestring version of 's', encoded as specified in 'encoding'.
@@ -73,7 +74,7 @@ def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
                 # know how to print itself properly. We shouldn't raise a
                 # further exception.
                 return ' '.join([smart_str(arg, encoding, strings_only,
-                        errors) for arg in s])
+                                           errors) for arg in s])
             return unicode(s).encode(encoding, errors)
     elif isinstance(s, unicode):
         r = s.encode(encoding, errors)
@@ -83,10 +84,12 @@ def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
     else:
         return s
 
+
 def generate_smart_str(params):
     for (key, value) in params:
         yield smart_str(key), smart_str(value)
 
+
 def urlencode(params):
     """
     A version of Python's urllib.urlencode() function that can operate on
@@ -102,12 +105,14 @@ class ApiAuthMixIn(object):
         try:
             # Validate timestamp
             timestamp = iso8601.parse_date(params['api_timestamp'])
-            timestamp_utc = timestamp.replace(tzinfo=None) - timestamp.utcoffset()
+            timestamp_utc = timestamp.replace(
+                tzinfo=None) - timestamp.utcoffset()
             if abs(datetime.utcnow() - timestamp_utc) > timedelta(minutes=10):
                 return False
             # Validate signature
             api_signature = params['api_signature']
-            params = sorted((k,v) for k,v in params.iteritems() if k != 'api_signature')
+            params = sorted((k, v)
+                            for k, v in params.iteritems() if k != 'api_signature')
             string_to_sign = path + '?' + urlencode(params)
             digest = hmac.new(self.secret_key, string_to_sign, hashlib.sha256)
             return digest.hexdigest() == api_signature
@@ -115,18 +120,23 @@ class ApiAuthMixIn(object):
             return False
 
     def sign_request(self, path, params):
-        if hasattr(params, 'items'): params = params.items()
+        if hasattr(params, 'items'):
+            params = params.items()
         has_api_key = has_api_timestamp = has_api_signature = False
-        for k,v in params:
-            if k == 'api_key': has_api_key = True
-            if k == 'api_timestamp': has_api_timestamp = True
-            if k == 'api_signature': has_api_signature = True
+        for k, v in params:
+            if k == 'api_key':
+                has_api_key = True
+            if k == 'api_timestamp':
+                has_api_timestamp = True
+            if k == 'api_signature':
+                has_api_signature = True
         if not has_api_key:
             params.append(('api_key', self.api_key))
         if not has_api_timestamp:
             params.append(('api_timestamp', datetime.utcnow().isoformat()))
         if not has_api_signature:
-            string_to_sign = urllib.quote(path) + '?' + urlencode(sorted(params))
+            string_to_sign = urllib.quote(path) + \
+                '?' + urlencode(sorted(params))
             digest = hmac.new(self.secret_key, string_to_sign, hashlib.sha256)
             params.append(('api_signature', digest.hexdigest()))
         return params
@@ -136,14 +146,15 @@ class ApiAuthMixIn(object):
 
 
 class ApiToken(MappedClass, ApiAuthMixIn):
+
     class __mongometa__:
-        name='api_token'
+        name = 'api_token'
         session = main_orm_session
-        unique_indexes = [ 'user_id' ]
+        unique_indexes = ['user_id']
 
     _id = FieldProperty(S.ObjectId)
     user_id = ForeignIdProperty('User')
-    api_key = FieldProperty(str, if_missing=lambda:str(uuid.uuid4()))
+    api_key = FieldProperty(str, if_missing=lambda: str(uuid.uuid4()))
     secret_key = FieldProperty(str, if_missing=h.cryptographic_nonce)
 
     user = RelationProperty('User')
@@ -154,17 +165,19 @@ class ApiToken(MappedClass, ApiAuthMixIn):
 
 
 class ApiTicket(MappedClass, ApiAuthMixIn):
+
     class __mongometa__:
-        name='api_ticket'
+        name = 'api_ticket'
         session = main_orm_session
     PREFIX = 'tck'
 
     _id = FieldProperty(S.ObjectId)
     user_id = ForeignIdProperty('User')
-    api_key = FieldProperty(str, if_missing=lambda: ApiTicket.PREFIX + h.nonce(20))
+    api_key = FieldProperty(
+        str, if_missing=lambda: ApiTicket.PREFIX + h.nonce(20))
     secret_key = FieldProperty(str, if_missing=h.cryptographic_nonce)
     expires = FieldProperty(datetime, if_missing=None)
-    capabilities = FieldProperty({str:None})
+    capabilities = FieldProperty({str: None})
     mod_date = FieldProperty(datetime, if_missing=datetime.utcnow)
 
     user = RelationProperty('User')
@@ -183,16 +196,18 @@ class ApiTicket(MappedClass, ApiAuthMixIn):
     def get_capability(self, key):
         return self.capabilities.get(key)
 
+
 class EmailAddress(MappedClass):
     re_format = re.compile('^.* <(.*)>$')
+
     class __mongometa__:
-        name='email_address'
+        name = 'email_address'
         session = main_orm_session
         indexes = [
             'claimed_by_user_id']
 
     _id = FieldProperty(str)
-    claimed_by_user_id=FieldProperty(S.ObjectId, if_missing=None)
+    claimed_by_user_id = FieldProperty(S.ObjectId, if_missing=None)
     confirmed = FieldProperty(bool)
     nonce = FieldProperty(str)
 
@@ -236,14 +251,16 @@ please visit the following URL:
             message_id=h.gen_message_id(),
             text=text)
 
+
 class OpenId(MappedClass):
+
     class __mongometa__:
-        name='openid'
+        name = 'openid'
         session = main_orm_session
 
     _id = FieldProperty(str)
-    claimed_by_user_id=FieldProperty(S.ObjectId, if_missing=None)
-    display_identifier=FieldProperty(str)
+    claimed_by_user_id = FieldProperty(S.ObjectId, if_missing=None)
+    display_identifier = FieldProperty(str)
 
     @classmethod
     def upsert(cls, url, display_identifier):
@@ -256,8 +273,9 @@ class OpenId(MappedClass):
 
     def claimed_by_user(self):
         if self.claimed_by_user_id:
-            result = User.query.get(_id=self.claimed_by_user_id, disabled=False)
-        else: # pragma no cover
+            result = User.query.get(
+                _id=self.claimed_by_user_id, disabled=False)
+        else:  # pragma no cover
             result = User.register(
                 dict(username=None, password=None,
                      display_name=self.display_identifier,
@@ -266,9 +284,11 @@ class OpenId(MappedClass):
             self.claimed_by_user_id = result._id
         return result
 
+
 class AuthGlobals(MappedClass):
+
     class __mongometa__:
-        name='auth_globals'
+        name = 'auth_globals'
         session = main_orm_session
 
     _id = FieldProperty(int)
@@ -277,12 +297,13 @@ class AuthGlobals(MappedClass):
     @classmethod
     def upsert(cls):
         r = cls.query.get()
-        if r is not None: return r
+        if r is not None:
+            return r
         try:
             r = cls(_id=0)
             session(r).flush(r)
             return r
-        except pymongo.errors.DuplicateKeyError: # pragma no cover
+        except pymongo.errors.DuplicateKeyError:  # pragma no cover
             session(r).flush(r)
             r = cls.query.get()
             return r
@@ -291,68 +312,70 @@ class AuthGlobals(MappedClass):
     def get_next_uid(cls):
         cls.upsert()
         g = cls.query.find_and_modify(
-            query={}, update={'$inc':{'next_uid': 1}},
+            query={}, update={'$inc': {'next_uid': 1}},
             new=True)
         return g.next_uid
 
 
 class User(MappedClass, ActivityNode, ActivityObject):
-    SALT_LEN=8
+    SALT_LEN = 8
+
     class __mongometa__:
-        name='user'
+        name = 'user'
         session = main_orm_session
-        indexes = [ 'tool_data.sfx.userid', 'tool_data.AuthPasswordReset.hash' ]
-        unique_indexes = [ 'username' ]
-
-    _id=FieldProperty(S.ObjectId)
-    sfx_userid=FieldProperty(S.Deprecated)
-    username=FieldProperty(str)
-    open_ids=FieldProperty([str])
-    email_addresses=FieldProperty([str])
-    password=FieldProperty(str)
-    projects=FieldProperty(S.Deprecated)
-    tool_preferences=FieldProperty({str:{str:None}}) # full mount point: prefs dict
-    tool_data = FieldProperty({str:{str:None}}) # entry point: prefs dict
-    display_name=FieldProperty(str)
-    disabled=FieldProperty(bool, if_missing=False)
+        indexes = ['tool_data.sfx.userid', 'tool_data.AuthPasswordReset.hash']
+        unique_indexes = ['username']
+
+    _id = FieldProperty(S.ObjectId)
+    sfx_userid = FieldProperty(S.Deprecated)
+    username = FieldProperty(str)
+    open_ids = FieldProperty([str])
+    email_addresses = FieldProperty([str])
+    password = FieldProperty(str)
+    projects = FieldProperty(S.Deprecated)
+    # full mount point: prefs dict
+    tool_preferences = FieldProperty({str: {str: None}})
+    tool_data = FieldProperty({str: {str: None}})  # entry point: prefs dict
+    display_name = FieldProperty(str)
+    disabled = FieldProperty(bool, if_missing=False)
     # Don't use directly, use get/set_pref() instead
-    preferences=FieldProperty(dict(
-            results_per_page=int,
-            email_address=str,
-            email_format=str,
-            disable_user_messages=bool))
-
-    #Personal data
-    sex=FieldProperty(
+    preferences = FieldProperty(dict(
+        results_per_page=int,
+        email_address=str,
+        email_format=str,
+        disable_user_messages=bool))
+
+    # Personal data
+    sex = FieldProperty(
         S.OneOf('Male', 'Female', 'Other', 'Unknown',
-        if_missing='Unknown'))
-    birthdate=FieldProperty(S.DateTime, if_missing=None)
+                if_missing='Unknown'))
+    birthdate = FieldProperty(S.DateTime, if_missing=None)
 
-    #Availability information
-    availability=FieldProperty([dict(
+    # Availability information
+    availability = FieldProperty([dict(
         week_day=str,
         start_time=dict(h=int, m=int),
         end_time=dict(h=int, m=int))])
-    localization=FieldProperty(dict(city=str,country=str))
-    timezone=FieldProperty(str)
-    sent_user_message_times=FieldProperty([S.DateTime])
-    inactiveperiod=FieldProperty([dict(
+    localization = FieldProperty(dict(city=str, country=str))
+    timezone = FieldProperty(str)
+    sent_user_message_times = FieldProperty([S.DateTime])
+    inactiveperiod = FieldProperty([dict(
         start_date=S.DateTime,
         end_date=S.DateTime)])
 
-    #Additional contacts
-    socialnetworks=FieldProperty([dict(socialnetwork=str,accounturl=str)])
-    telnumbers=FieldProperty([str])
-    skypeaccount=FieldProperty(str)
-    webpages=FieldProperty([str])
+    # Additional contacts
+    socialnetworks = FieldProperty([dict(socialnetwork=str, accounturl=str)])
+    telnumbers = FieldProperty([str])
+    skypeaccount = FieldProperty(str)
+    webpages = FieldProperty([str])
 
-    #Skills list
+    # Skills list
     skills = FieldProperty([dict(
-        category_id = S.ObjectId,
-        level = S.OneOf('low', 'high', 'medium'),
+        category_id=S.ObjectId,
+        level=S.OneOf('low', 'high', 'medium'),
         comment=str)])
 
-    #Statistics
+    # Statistics
     stats_id = FieldProperty(S.ObjectId, if_missing=None)
 
     def can_send_user_message(self):
@@ -366,7 +389,7 @@ class User(MappedClass, ActivityNode, ActivityObject):
         now = datetime.utcnow()
         time_interval = timedelta(seconds=g.user_message_time_interval)
         self.sent_user_message_times = [t for t in self.sent_user_message_times
-                if t + time_interval > now]
+                                        if t + time_interval > now]
         return len(self.sent_user_message_times) < g.user_message_max_messages
 
     def time_to_next_user_message(self):
@@ -379,14 +402,15 @@ class User(MappedClass, ActivityNode, ActivityObject):
         if self.can_send_user_message():
             return 0
         return self.sent_user_message_times[0] + \
-                timedelta(seconds=g.user_message_time_interval) - \
-                datetime.utcnow()
+            timedelta(seconds=g.user_message_time_interval) - \
+            datetime.utcnow()
 
     def send_user_message(self, user, subject, message, cc):
         """Send a user message (email) to ``user``.
 
         """
-        tmpl = g.jinja2_env.get_template('allura:ext/user_profile/templates/message.html')
+        tmpl = g.jinja2_env.get_template(
+            'allura:ext/user_profile/templates/message.html')
         tmpl_context = {
             'message_text': message,
             'site_name': config['site_name'],
@@ -438,7 +462,7 @@ class User(MappedClass, ActivityNode, ActivityObject):
 
     def remove_socialnetwork(self, socialnetwork, oldurl):
         for el in self.socialnetworks:
-            if el.socialnetwork==socialnetwork and el.accounturl==oldurl:
+            if el.socialnetwork == socialnetwork and el.accounturl == oldurl:
                 del self.socialnetworks[self.socialnetworks.index(el)]
                 return
 
@@ -447,7 +471,7 @@ class User(MappedClass, ActivityNode, ActivityObject):
 
     def remove_telephonenumber(self, oldvalue):
         for el in self.telnumbers:
-            if el==oldvalue:
+            if el == oldvalue:
                 del self.telnumbers[self.telnumbers.index(el)]
                 return
 
@@ -456,15 +480,15 @@ class User(MappedClass, ActivityNode, ActivityObject):
 
     def remove_webpage(self, oldvalue):
         for el in self.webpages:
-            if el==oldvalue:
+            if el == oldvalue:
                 del self.webpages[self.webpages.index(el)]
                 return
 
     def add_timeslot(self, weekday, starttime, endtime):
         self.availability.append(
-           dict(week_day=weekday,
-                start_time=starttime,
-                end_time=endtime))
+            dict(week_day=weekday,
+                 start_time=starttime,
+                 end_time=endtime))
 
     def remove_timeslot(self, weekday, starttime, endtime):
         oldel = dict(week_day=weekday, start_time=starttime, end_time=endtime)
@@ -475,8 +499,8 @@ class User(MappedClass, ActivityNode, ActivityObject):
 
     def add_inactive_period(self, startdate, enddate):
         self.inactiveperiod.append(
-           dict(start_date=startdate,
-                end_date=enddate))
+            dict(start_date=startdate,
+                 end_date=enddate))
 
     def remove_inactive_period(self, startdate, enddate):
         oldel = dict(start_date=startdate, end_date=enddate)
@@ -508,28 +532,28 @@ class User(MappedClass, ActivityNode, ActivityObject):
 
             dif_days_start = convtime1.weekday() - today.weekday()
             dif_days_end = convtime2.weekday() - today.weekday()
-            index = (week_day.index(t['week_day'])+dif_days_start) % 7
+            index = (week_day.index(t['week_day']) + dif_days_start) % 7
             week_day_start = week_day[index]
             week_day_end = week_day[index]
 
             if week_day_start == week_day_end:
                 retlist.append(dict(
-                    week_day = week_day_start,
-                    start_time = convtime1.time(),
-                    end_time = convtime2.time()))
+                    week_day=week_day_start,
+                    start_time=convtime1.time(),
+                    end_time=convtime2.time()))
             else:
                 retlist.append(dict(
-                    week_day = week_day_start,
-                    start_time = convtime1.time(),
-                    end_time = time(23, 59)))
+                    week_day=week_day_start,
+                    start_time=convtime1.time(),
+                    end_time=time(23, 59)))
                 retlist.append(dict(
-                    week_day = week_day_end,
-                    start_time = time(0, 0),
-                    end_time = convtime2.time()))
+                    week_day=week_day_end,
+                    start_time=time(0, 0),
+                    end_time=convtime2.time()))
 
         return sorted(
             retlist,
-            key=lambda k:(week_day.index(k['week_day']), k['start_time']))
+            key=lambda k: (week_day.index(k['week_day']), k['start_time']))
 
     def get_skills(self):
         from allura.model.project import TroveCategory
@@ -549,9 +573,9 @@ class User(MappedClass, ActivityNode, ActivityObject):
             (starth, startm) = (start.get('h'), start.get('m'))
             (endh, endm) = (end.get('h'), end.get('m'))
             newdict = dict(
-                week_day  = el.get('week_day'),
-                start_time= time(starth,startm,0),
-                end_time  = time(endh,endm,0))
+                week_day=el.get('week_day'),
+                start_time=time(starth, startm, 0),
+                end_time=time(endh, endm, 0))
             retval.append(newdict)
         return retval
 
@@ -559,7 +583,7 @@ class User(MappedClass, ActivityNode, ActivityObject):
         retval = []
         for el in self.inactiveperiod:
             d1, d2 = (el.get('start_date'), el.get('end_date'))
-            newdict = dict(start_date = d1, end_date = d2)
+            newdict = dict(start_date=d1, end_date=d2)
             if include_past_periods or newdict['end_date'] > datetime.today():
                 retval.append(newdict)
         return retval
@@ -573,10 +597,11 @@ class User(MappedClass, ActivityNode, ActivityObject):
         try:
             private_project = self.private_project()
         except:
-            log.warn('Error getting/creating user-project for %s', self.username, exc_info=True)
+            log.warn('Error getting/creating user-project for %s',
+                     self.username, exc_info=True)
             private_project = None
         if private_project and private_project.icon:
-            icon_url = self.url()+'user_icon'
+            icon_url = self.url() + 'user_icon'
         elif self.preferences.email_address:
             icon_url = g.gravatar(self.preferences.email_address)
         return icon_url
@@ -584,7 +609,8 @@ class User(MappedClass, ActivityNode, ActivityObject):
     @classmethod
     def upsert(cls, username):
         u = cls.query.get(username=username)
-        if u is not None: return u
+        if u is not None:
+            return u
         try:
             u = cls(username=username)
             session(u).flush(u)
@@ -596,7 +622,8 @@ class User(MappedClass, ActivityNode, ActivityObject):
     @classmethod
     def by_email_address(cls, addr):
         ea = EmailAddress.query.get(_id=addr)
-        if ea is None: return None
+        if ea is None:
+            return None
         return ea.claimed_by_user()
 
     @classmethod
@@ -629,14 +656,16 @@ class User(MappedClass, ActivityNode, ActivityObject):
     def claim_openid(self, oid_url):
         oid_obj = OpenId.upsert(oid_url, self.get_pref('display_name'))
         oid_obj.claimed_by_user_id = self._id
-        if oid_url in self.open_ids: return
+        if oid_url in self.open_ids:
+            return
         self.open_ids.append(oid_url)
 
     def claim_address(self, email_address):
         addr = EmailAddress.canonical(email_address)
         email_addr = EmailAddress.upsert(addr)
         email_addr.claimed_by_user_id = self._id
-        if addr in self.email_addresses: return
+        if addr in self.email_addresses:
+            return
         self.email_addresses.append(addr)
 
     def claim_only_addresses(self, *addresses):
@@ -644,12 +673,13 @@ class User(MappedClass, ActivityNode, ActivityObject):
         attribute to True on all.
         '''
         self.email_addresses = [
-            EmailAddress.canonical(a) for a in addresses ]
+            EmailAddress.canonical(a) for a in addresses]
         addresses = set(self.email_addresses)
         for addr in EmailAddress.query.find(
-            dict(claimed_by_user_id=self._id)):
+                dict(claimed_by_user_id=self._id)):
             if addr._id in addresses:
-                if not addr.confirmed: addr.confirmed = True
+                if not addr.confirmed:
+                    addr.confirmed = True
                 addresses.remove(addr._id)
             else:
                 addr.delete()
@@ -689,16 +719,21 @@ class User(MappedClass, ActivityNode, ActivityObject):
         n = self.neighborhood
         auth_provider = plugin.AuthenticationProvider.get(request)
         project_shortname = auth_provider.user_project_shortname(self)
-        p = M.Project.query.get(shortname=project_shortname, neighborhood_id=n._id)
+        p = M.Project.query.get(
+            shortname=project_shortname, neighborhood_id=n._id)
         if p and p.deleted:
-            # really delete it, since registering a new project would conflict with the "deleted" one
-            log.info('completely deleting user project (was already flagged as deleted) %s', project_shortname)
+            # really delete it, since registering a new project would conflict
+            # with the "deleted" one
+            log.info(
+                'completely deleting user project (was already flagged as deleted) %s',
+                project_shortname)
             p.delete()
             ThreadLocalORMSession.flush_all()
             p = None
         if not p and not self.is_anonymous():
             # create user-project on demand if it is missing
-            p = n.register_project(project_shortname, user=self, user_project=True)
+            p = n.register_project(
+                project_shortname, user=self, user_project=True)
         return p
 
     @property
@@ -714,8 +749,10 @@ class User(MappedClass, ActivityNode, ActivityObject):
         """
         if self.is_anonymous():
             return
-        reaching_role_ids = list(g.credentials.user_roles(user_id=self._id).reaching_ids_set)
-        reaching_roles = ProjectRole.query.find({'_id': {'$in': reaching_role_ids}}).all()
+        reaching_role_ids = list(
+            g.credentials.user_roles(user_id=self._id).reaching_ids_set)
+        reaching_roles = ProjectRole.query.find(
+            {'_id': {'$in': reaching_role_ids}}).all()
         if not role_name:
             named_roles = [r for r in reaching_roles
                            if r.name and r.project and not r.project.deleted]
@@ -724,7 +761,8 @@ class User(MappedClass, ActivityNode, ActivityObject):
                            if r.name == role_name and r.project and not r.project.deleted]
         seen_project_ids = set()
         for r in named_roles:
-            if r.project_id in seen_project_ids: continue
+            if r.project_id in seen_project_ids:
+                continue
             seen_project_ids.add(r.project_id)
             yield r.project
 
@@ -750,7 +788,7 @@ class User(MappedClass, ActivityNode, ActivityObject):
 
     @classmethod
     def withskill(cls, skill):
-        return cls.query.find({"skills.category_id" : skill._id})
+        return cls.query.find({"skills.category_id": skill._id})
 
     def __json__(self):
         return dict(
@@ -759,13 +797,17 @@ class User(MappedClass, ActivityNode, ActivityObject):
             url=h.absurl(self.url()),
         )
 
+
 class OldProjectRole(MappedClass):
+
     class __mongometa__:
         session = project_orm_session
-        name='user'
-        unique_indexes = [ ('user_id', 'project_id', 'name') ]
+        name = 'user'
+        unique_indexes = [('user_id', 'project_id', 'name')]
+
 
 class ProjectRole(MappedClass):
+
     """
     Per-project roles, called "Groups" in the UI.
     This can be a proxy for a single user.  It can also inherit roles.
@@ -778,13 +820,13 @@ class ProjectRole(MappedClass):
 
     class __mongometa__:
         session = main_orm_session
-        name='project_role'
-        unique_indexes = [ ('user_id', 'project_id', 'name') ]
+        name = 'project_role'
+        unique_indexes = [('user_id', 'project_id', 'name')]
         indexes = [
             ('user_id',),
-            ('project_id', 'name'), # used in ProjectRole.by_name()
+            ('project_id', 'name'),  # used in ProjectRole.by_name()
             ('roles',),
-            ]
+        ]
 
     _id = FieldProperty(S.ObjectId)
     user_id = ForeignIdProperty('User', if_missing=None)
@@ -800,34 +842,40 @@ class ProjectRole(MappedClass):
         super(ProjectRole, self).__init__(**kw)
 
     def display(self):
-        if self.name: return self.name
+        if self.name:
+            return self.name
         if self.user_id:
             u = self.user
-            if u.username: uname = u.username
-            elif u.get_pref('display_name'): uname = u.get_pref('display_name')
-            else: uname = u._id
+            if u.username:
+                uname = u.username
+            elif u.get_pref('display_name'):
+                uname = u.get_pref('display_name')
+            else:
+                uname = u._id
             return '*user-%s' % uname
-        return '**unknown name role: %s' % self._id # pragma no cover
+        return '**unknown name role: %s' % self._id  # pragma no cover
 
     @classmethod
     def by_user(cls, user, project=None, upsert=False):
-        if project is None: project = c.project
+        if project is None:
+            project = c.project
         if user.is_anonymous():
             return cls.anonymous(project)
         if upsert:
             return cls.upsert(
-                    user_id=user._id,
-                    project_id=project.root_project._id,
-                )
+                user_id=user._id,
+                project_id=project.root_project._id,
+            )
         else:
             return cls.query.get(
-                    user_id=user._id,
-                    project_id=project.root_project._id,
-                )
+                user_id=user._id,
+                project_id=project.root_project._id,
+            )
 
     @classmethod
     def by_name(cls, name, project=None):
-        if project is None: project = c.project
+        if project is None:
+            project = c.project
         if hasattr(project, 'root_project'):
             project = project.root_project
         if hasattr(project, '_id'):
@@ -850,7 +898,8 @@ class ProjectRole(MappedClass):
     @classmethod
     def upsert(cls, **kw):
         obj = cls.query.get(**kw)
-        if obj is not None: return obj
+        if obj is not None:
+            return obj
         try:
             obj = cls(**kw)
             session(obj).insert_now(obj, state(obj))
@@ -865,13 +914,13 @@ class ProjectRole(MappedClass):
             return '*' == self.name[0]
         if self.user_id:
             return True
-        return False # pragma no cover
+        return False  # pragma no cover
 
     @property
     def user(self):
         if (self.user_id is None
-            and self.name
-            and self.name != '*anonymous'):
+                and self.name
+                and self.name != '*anonymous'):
             return None
         return User.query.get(_id=self.user_id)
 
@@ -885,21 +934,21 @@ class ProjectRole(MappedClass):
         return self.query.find({'roles': self._id}).all()
 
     def child_roles(self):
-        to_check = []+self.roles
+        to_check = [] + self.roles
         found_roles = []
         while to_check:
             checking = to_check.pop()
             for role in self.query.find({'_id': checking}).all():
                 if role not in found_roles:
                     found_roles.append(role)
-                    to_check=to_check+role.roles
+                    to_check = to_check + role.roles
         return found_roles
 
     def users_with_role(self, project=None):
         if not project:
             project = c.project
         return self.query.find(dict(project_id=project._id,
-            user_id={'$ne': None}, roles=self._id)).all()
+                                    user_id={'$ne': None}, roles=self._id)).all()
 
 audit_log = collection(
     'audit_log', main_doc_session,
@@ -911,6 +960,7 @@ audit_log = collection(
     Field('url', str),
     Field('message', str))
 
+
 class AuditLog(object):
 
     @property
@@ -941,7 +991,7 @@ class AuditLog(object):
         return cls(project_id=project._id, user_id=user._id, url=url, message=message)
 
 main_orm_session.mapper(AuditLog, audit_log, properties=dict(
-        project_id=ForeignIdProperty('Project'),
-        project=RelationProperty('Project'),
-        user_id=ForeignIdProperty('User'),
-        user=RelationProperty('User')))
+    project_id=ForeignIdProperty('Project'),
+    project=RelationProperty('Project'),
+    user_id=ForeignIdProperty('User'),
+    user=RelationProperty('User')))

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index efa7b35..4815ceb 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -44,6 +44,7 @@ log = logging.getLogger(__name__)
 
 
 class Discussion(Artifact, ActivityObject):
+
     class __mongometa__:
         name = 'discussion'
     type_s = 'Discussion'
@@ -95,9 +96,9 @@ class Discussion(Artifact, ActivityObject):
     @LazyProperty
     def last_post(self):
         q = self.post_class().query.find(dict(
-                discussion_id=self._id,
-                status='ok'
-                ))\
+            discussion_id=self._id,
+            status='ok'
+        ))\
             .sort('timestamp', pymongo.DESCENDING)\
             .limit(1)
         return q.first()
@@ -132,6 +133,7 @@ class Discussion(Artifact, ActivityObject):
 
 
 class Thread(Artifact, ActivityObject):
+
     class __mongometa__:
         name = 'thread'
         indexes = [
@@ -141,7 +143,7 @@ class Thread(Artifact, ActivityObject):
              ('last_post_date', pymongo.DESCENDING),
              ('mod_date', pymongo.DESCENDING)),
             ('discussion_id',),
-            ]
+        ]
     type_s = 'Thread'
 
     _id = FieldProperty(str, if_missing=lambda: h.nonce(8))
@@ -174,7 +176,7 @@ class Thread(Artifact, ActivityObject):
                         attachments=[dict(bytes=attach.length,
                                           url=h.absurl(attach.url())) for attach in p.attachments])
                    for p in self.query_posts(status='ok', style='chronological', limit=limit, page=page)
-                ]
+                   ]
         )
 
     @property
@@ -193,7 +195,8 @@ class Thread(Artifact, ActivityObject):
                 session(thread).flush(thread)
                 return thread
             except DuplicateKeyError as err:
-                log.warning('Got DuplicateKeyError: attempt #%s, trying again. %s', i, err)
+                log.warning(
+                    'Got DuplicateKeyError: attempt #%s, trying again. %s', i, err)
                 if i == 4:
                     raise
                 session(thread).expunge(thread)
@@ -221,9 +224,9 @@ class Thread(Artifact, ActivityObject):
     @property
     def post_count(self):
         return Post.query.find(dict(
-                discussion_id=self.discussion_id,
-                thread_id=self._id,
-                status={'$in': ['ok', 'pending']})).count()
+            discussion_id=self.discussion_id,
+            thread_id=self._id,
+            status={'$in': ['ok', 'pending']})).count()
 
     def primary(self):
         if self.ref is None:
@@ -241,7 +244,8 @@ class Thread(Artifact, ActivityObject):
         if self.app.tool_label.lower() == 'tickets':
             link = p.url_paginated()
         if self.ref:
-            Feed.post(self.primary(), title=p.subject, description=p.text, link=link)
+            Feed.post(self.primary(), title=p.subject,
+                      description=p.text, link=link)
         return p
 
     def is_spam(self, post):
@@ -285,25 +289,25 @@ class Thread(Artifact, ActivityObject):
         ''' Notify moderators that a post needs approval [#2963] '''
         artifact = self.artifact or self
         subject = '[%s:%s] Moderation action required' % (
-                c.project.shortname, c.app.config.options.mount_point)
+            c.project.shortname, c.app.config.options.mount_point)
         author = post.author()
         url = self.discussion_class().query.get(_id=self.discussion_id).url()
         text = ('The following submission requires approval at %s before '
                 'it can be approved for posting:\n\n%s'
                 % (h.absurl(url + 'moderate'), post.text))
         n = Notification(
-                ref_id=artifact.index_id(),
-                topic='message',
-                link=artifact.url(),
-                _id=artifact.url() + post._id,
-                from_address=str(author._id) if author != User.anonymous()
-                                             else None,
-                reply_to_address=u'noreply@in.sf.net',
-                subject=subject,
-                text=text,
-                in_reply_to=post.parent_id,
-                author_id=author._id,
-                pubdate=datetime.utcnow())
+            ref_id=artifact.index_id(),
+            topic='message',
+            link=artifact.url(),
+            _id=artifact.url() + post._id,
+            from_address=str(author._id) if author != User.anonymous()
+            else None,
+            reply_to_address=u'noreply@in.sf.net',
+            subject=subject,
+            text=text,
+            in_reply_to=post.parent_id,
+            author_id=author._id,
+            pubdate=datetime.utcnow())
         users = self.app_config.project.users()
         for u in users:
             if (has_access(self, 'moderate', u)
@@ -318,7 +322,7 @@ class Thread(Artifact, ActivityObject):
     @property
     def last_post(self):
         q = self.post_class().query.find(dict(
-                thread_id=self._id)).sort('timestamp', pymongo.DESCENDING)
+            thread_id=self._id)).sort('timestamp', pymongo.DESCENDING)
         return q.first()
 
     def create_post_threads(self, posts):
@@ -337,10 +341,10 @@ class Thread(Artifact, ActivityObject):
                     timestamp=None, style='threaded', status=None):
         if timestamp:
             terms = dict(discussion_id=self.discussion_id, thread_id=self._id,
-                    status={'$in': ['ok', 'pending']}, timestamp=timestamp)
+                         status={'$in': ['ok', 'pending']}, timestamp=timestamp)
         else:
             terms = dict(discussion_id=self.discussion_id, thread_id=self._id,
-                    status={'$in': ['ok', 'pending']})
+                         status={'$in': ['ok', 'pending']})
         if status:
             terms['status'] = status
         q = self.post_class().query.find(terms)
@@ -371,10 +375,10 @@ class Thread(Artifact, ActivityObject):
     def index(self):
         result = Artifact.index(self)
         result.update(
-           title=self.subject or '(no subject)',
-           name_s=self.subject,
-           views_i=self.num_views,
-           text=self.subject)
+            title=self.subject or '(no subject)',
+            name_s=self.subject,
+            views_i=self.num_views,
+            text=self.subject)
         return result
 
     def _get_subscription(self):
@@ -400,6 +404,7 @@ class Thread(Artifact, ActivityObject):
 
 
 class PostHistory(Snapshot):
+
     class __mongometa__:
         name = 'post_history'
 
@@ -434,11 +439,13 @@ class PostHistory(Snapshot):
 
 
 class Post(Message, VersionedArtifact, ActivityObject):
+
     class __mongometa__:
         name = 'post'
         history_class = PostHistory
         indexes = [
-            ('discussion_id', 'status', 'timestamp'),  # used in general lookups, last_post, etc
+            # used in general lookups, last_post, etc
+            ('discussion_id', 'status', 'timestamp'),
             'thread_id'
         ]
     type_s = 'Post'
@@ -488,10 +495,10 @@ class Post(Message, VersionedArtifact, ActivityObject):
         artifact_access = True
         if self.thread.artifact:
             artifact_access = security.has_access(self.thread.artifact, perm,
-                    user, self.thread.artifact.project)
+                                                  user, self.thread.artifact.project)
 
         return artifact_access and security.has_access(self, perm, user,
-                self.project)
+                                                       self.project)
 
     @property
     def activity_extras(self):
@@ -500,7 +507,7 @@ class Post(Message, VersionedArtifact, ActivityObject):
         # strip all tags, and truncate near the 80 char mark
         LEN = 80
         summary = jinja2.Markup.escape(
-                g.markdown.cached_convert(self, 'text')).striptags()
+            g.markdown.cached_convert(self, 'text')).striptags()
         if len(summary) > LEN:
             split = max(summary.find(' ', LEN), LEN)
             summary = summary[:split] + '...'
@@ -595,6 +602,7 @@ class Post(Message, VersionedArtifact, ActivityObject):
             def find_i(posts):
                 '''Find the index number of this post in the display order'''
                 q = []
+
                 def traverse(posts):
                     for p in posts:
                         if p['post']._id == self._id:
@@ -617,7 +625,6 @@ class Post(Message, VersionedArtifact, ActivityObject):
             return '%s?limit=%s#%s' % (url, limit, slug)
         return '%s?limit=%s&page=%s#%s' % (url, limit, page, slug)
 
-
     def shorthand_id(self):
         if self.thread:
             return '%s#%s' % (self.thread.shorthand_id(), self.slug)
@@ -643,12 +650,13 @@ class Post(Message, VersionedArtifact, ActivityObject):
             return
         self.status = 'ok'
         author = self.author()
-        author_role = ProjectRole.by_user(author, project=self.project, upsert=True)
+        author_role = ProjectRole.by_user(
+            author, project=self.project, upsert=True)
         security.simple_grant(
             self.acl, author_role._id, 'moderate')
         self.commit()
         if (c.app.config.options.get('PostingPolicy') == 'ApproveOnceModerated'
-            and author._id != None):
+                and author._id != None):
             security.simple_grant(
                 self.acl, author_role._id, 'unmoderated_post')
         if notify:
@@ -663,7 +671,7 @@ class Post(Message, VersionedArtifact, ActivityObject):
             artifact.update_stats()
         if self.text:
             g.director.create_activity(author, 'posted', self, target=artifact,
-                    related_nodes=[self.app_config.project])
+                                       related_nodes=[self.app_config.project])
 
     def notify(self, file_info=None, check_dup=False):
         if self.project.notifications_disabled:
@@ -674,7 +682,8 @@ class Post(Message, VersionedArtifact, ActivityObject):
         if not n:
             n = Notification.post(artifact, 'message', post=self,
                                   file_info=file_info)
-        if not n: return
+        if not n:
+            return
         if (hasattr(artifact, "monitoring_email")
                 and artifact.monitoring_email):
             if hasattr(artifact, 'notify_post'):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/Allura/allura/model/filesystem.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/filesystem.py b/Allura/allura/model/filesystem.py
index dbe1aa7..54b7a18 100644
--- a/Allura/allura/model/filesystem.py
+++ b/Allura/allura/model/filesystem.py
@@ -33,24 +33,26 @@ from allura.lib import utils
 
 log = logging.getLogger(__name__)
 
-SUPPORTED_BY_PIL=set([
-        'image/jpg',
-        'image/jpeg',
-        'image/pjpeg',
-        'image/png',
-        'image/x-png',
-        'image/gif'])
+SUPPORTED_BY_PIL = set([
+    'image/jpg',
+    'image/jpeg',
+    'image/pjpeg',
+    'image/png',
+    'image/x-png',
+    'image/gif'])
+
 
 class File(MappedClass):
+
     class __mongometa__:
         session = project_orm_session
         name = 'fs'
-        indexes = [ 'filename' ]
+        indexes = ['filename']
 
     _id = FieldProperty(schema.ObjectId)
     file_id = FieldProperty(schema.ObjectId)
-    filename=FieldProperty(str, if_missing='unknown')
-    content_type=FieldProperty(str)
+    filename = FieldProperty(str, if_missing='unknown')
+    content_type = FieldProperty(str)
 
     def __init__(self, **kw):
         super(File, self).__init__(**kw)
@@ -78,7 +80,8 @@ class File(MappedClass):
         with obj.wfile() as fp_w:
             while True:
                 s = stream.read()
-                if not s: break
+                if not s:
+                    break
                 fp_w.write(s)
         return obj
 
@@ -116,25 +119,25 @@ class File(MappedClass):
 
     @classmethod
     def save_thumbnail(cls, filename, image,
-                   content_type,
-                   thumbnail_size=None,
-                   thumbnail_meta=None,
-                   square=False):
+                       content_type,
+                       thumbnail_size=None,
+                       thumbnail_meta=None,
+                       square=False):
         format = image.format
         height = image.size[0]
         width = image.size[1]
         if square and height != width:
             sz = max(width, height)
             if 'transparency' in image.info:
-                new_image = PIL.Image.new('RGBA', (sz,sz))
+                new_image = PIL.Image.new('RGBA', (sz, sz))
             else:
-                new_image = PIL.Image.new('RGB', (sz,sz), 'white')
+                new_image = PIL.Image.new('RGB', (sz, sz), 'white')
             if height < width:
                 # image is wider than tall, so center horizontally
-                new_image.paste(image, ((width-height)/2, 0))
+                new_image.paste(image, ((width - height) / 2, 0))
             elif height > width:
                 # image is taller than wide, so center vertically
-                new_image.paste(image, (0, (height-width)/2))
+                new_image.paste(image, (0, (height - width) / 2))
             image = new_image
 
         if thumbnail_size:
@@ -145,7 +148,8 @@ class File(MappedClass):
             filename=filename, content_type=content_type, **thumbnail_meta)
         with thumbnail.wfile() as fp_w:
             if 'transparency' in image.info:
-                image.save(fp_w, format, transparency=image.info['transparency'])
+                image.save(fp_w,
+                           format, transparency=image.info['transparency'])
             else:
                 image.save(fp_w, format)
 
@@ -162,7 +166,8 @@ class File(MappedClass):
         if content_type is None:
             content_type = utils.guess_mime_type(filename)
         if not content_type.lower() in SUPPORTED_BY_PIL:
-            log.debug('Content type %s from file %s not supported', content_type, filename)
+            log.debug('Content type %s from file %s not supported',
+                      content_type, filename)
             return None, None
 
         try:
@@ -179,7 +184,8 @@ class File(MappedClass):
             with original.wfile() as fp_w:
                 try:
                     if 'transparency' in image.info:
-                        image.save(fp_w, format, transparency=image.info['transparency'])
+                        image.save(fp_w,
+                                   format, transparency=image.info['transparency'])
                     else:
                         image.save(fp_w, format)
                 except Exception as e:
@@ -189,7 +195,8 @@ class File(MappedClass):
         else:
             original = None
 
-        thumbnail = cls.save_thumbnail(filename, image, content_type, thumbnail_size, thumbnail_meta, square)
+        thumbnail = cls.save_thumbnail(
+            filename, image, content_type, thumbnail_size, thumbnail_meta, square)
 
         return original, thumbnail
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/Allura/allura/model/index.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/index.py b/Allura/allura/model/index.py
index f7e3538..573414b 100644
--- a/Allura/allura/model/index.py
+++ b/Allura/allura/model/index.py
@@ -44,10 +44,10 @@ ArtifactReferenceDoc = collection(
     'artifact_reference', main_doc_session,
     Field('_id', str),
     Field('artifact_reference', dict(
-            cls=S.Binary(),
-            project_id=S.ObjectId(),
-            app_config_id=S.ObjectId(),
-            artifact_id=S.Anything(if_missing=None))),
+        cls=S.Binary(),
+        project_id=S.ObjectId(),
+        app_config_id=S.ObjectId(),
+        artifact_id=S.Anything(if_missing=None))),
     Field('references', [str], index=True),
     Index('artifact_reference.project_id'),  # used in ReindexCommand
 )
@@ -55,22 +55,28 @@ ArtifactReferenceDoc = collection(
 ShortlinkDoc = collection(
     'shortlink', main_doc_session,
     Field('_id', S.ObjectId()),
-    Field('ref_id', str, index=True),  # index needed for from_artifact() and index_tasks.py:del_artifacts
+    # index needed for from_artifact() and index_tasks.py:del_artifacts
+    Field('ref_id', str, index=True),
     Field('project_id', S.ObjectId()),
     Field('app_config_id', S.ObjectId()),
     Field('link', str),
     Field('url', str),
-    Index('project_id', 'link'), # used by from_links()  More helpful to have project_id first, for other queries
+    # used by from_links()  More helpful to have project_id first, for other
+    # queries
+    Index('project_id', 'link'),
 )
 
 # Class definitions
+
+
 class ArtifactReference(object):
 
     @classmethod
     def from_artifact(cls, artifact):
         '''Upsert logic to generate an ArtifactReference object from an artifact'''
         obj = cls.query.get(_id=artifact.index_id())
-        if obj is not None: return obj
+        if obj is not None:
+            return obj
         try:
             obj = cls(
                 _id=artifact.index_id(),
@@ -81,7 +87,7 @@ class ArtifactReference(object):
                     artifact_id=artifact._id))
             session(obj).flush(obj)
             return obj
-        except pymongo.errors.DuplicateKeyError: # pragma no cover
+        except pymongo.errors.DuplicateKeyError:  # pragma no cover
             session(obj).expunge(obj)
             return cls.query.get(_id=artifact.index_id())
 
@@ -97,7 +103,9 @@ class ArtifactReference(object):
             log.exception('Error loading artifact for %s: %r',
                           self._id, aref)
 
+
 class Shortlink(object):
+
     '''Collection mapping shorthand_ids for artifacts to ArtifactReferences'''
 
     # Regexes used to find shortlinks
@@ -107,14 +115,14 @@ class Shortlink(object):
             (?P<artifact_id>.*)             # artifact ID
     \])'''
     re_link_1 = re.compile(r'\s' + _core_re, re.VERBOSE)
-    re_link_2 = re.compile(r'^' +  _core_re, re.VERBOSE)
+    re_link_2 = re.compile(r'^' + _core_re, re.VERBOSE)
 
     def __repr__(self):
         return '<Shortlink %s %s %s -> %s>' % (
-                    self.project_id,
-                    self.app_config_id,
-                    self.link,
-                    self.ref_id)
+            self.project_id,
+            self.app_config_id,
+            self.link,
+            self.ref_id)
 
     @classmethod
     def lookup(cls, link):
@@ -126,11 +134,11 @@ class Shortlink(object):
         if result is None:
             try:
                 result = cls(
-                    ref_id = a.index_id(),
-                    project_id = a.app_config.project_id,
-                    app_config_id = a.app_config._id)
+                    ref_id=a.index_id(),
+                    project_id=a.app_config.project_id,
+                    app_config_id=a.app_config._id)
                 session(result).flush(result)
-            except pymongo.errors.DuplicateKeyError: # pragma no cover
+            except pymongo.errors.DuplicateKeyError:  # pragma no cover
                 session(result).expunge(result)
                 result = cls.query.get(ref_id=a.index_id())
         result.link = a.shorthand_id()
@@ -146,7 +154,8 @@ class Shortlink(object):
         if len(links):
             result = {}
             # Parse all the links
-            parsed_links = dict((link, cls._parse_link(link)) for link in links)
+            parsed_links = dict((link, cls._parse_link(link))
+                                for link in links)
             links_by_artifact = defaultdict(list)
             project_ids = set()
             for link, d in parsed_links.items():
@@ -156,20 +165,20 @@ class Shortlink(object):
                 else:
                     result[link] = parsed_links.pop(link)
             q = cls.query.find(dict(
-                    link={'$in': links_by_artifact.keys()},
-                    project_id={'$in': list(project_ids)}
-                ), validate=False)
+                link={'$in': links_by_artifact.keys()},
+                project_id={'$in': list(project_ids)}
+            ), validate=False)
             matches_by_artifact = dict(
                 (link, list(matches))
-                for link, matches in groupby(q, key=lambda s:unquote(s.link)))
+                for link, matches in groupby(q, key=lambda s: unquote(s.link)))
             for link, d in parsed_links.iteritems():
                 matches = matches_by_artifact.get(unquote(d['artifact']), [])
                 matches = (
                     m for m in matches
                     if m.project.shortname == d['project'] and
-                       m.project.neighborhood_id == d['nbhd'] and
-                       m.app_config is not None and
-                       m.project.app_instance(m.app_config.options.mount_point))
+                    m.project.neighborhood_id == d['nbhd'] and
+                    m.app_config is not None and
+                    m.project.app_instance(m.app_config.options.mount_point))
                 if d['app']:
                     matches = (
                         m for m in matches
@@ -233,9 +242,9 @@ class Shortlink(object):
 # Mapper definitions
 mapper(ArtifactReference, ArtifactReferenceDoc, main_orm_session)
 mapper(Shortlink, ShortlinkDoc, main_orm_session, properties=dict(
-    ref_id = ForeignIdProperty(ArtifactReference),
-    project_id = ForeignIdProperty('Project'),
-    app_config_id = ForeignIdProperty('AppConfig'),
-    project = RelationProperty('Project'),
-    app_config = RelationProperty('AppConfig'),
-    ref = RelationProperty(ArtifactReference)))
+    ref_id=ForeignIdProperty(ArtifactReference),
+    project_id=ForeignIdProperty('Project'),
+    app_config_id=ForeignIdProperty('AppConfig'),
+    project=RelationProperty('Project'),
+    app_config=RelationProperty('AppConfig'),
+    ref=RelationProperty(ArtifactReference)))

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/Allura/allura/model/monq_model.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/monq_model.py b/Allura/allura/model/monq_model.py
index c5d3431..d4359f5 100644
--- a/Allura/allura/model/monq_model.py
+++ b/Allura/allura/model/monq_model.py
@@ -39,6 +39,7 @@ log = logging.getLogger(__name__)
 
 
 class MonQTask(MappedClass):
+
     '''Task to be executed by the taskd daemon.
 
     Properties
@@ -60,6 +61,7 @@ class MonQTask(MappedClass):
     '''
     states = ('ready', 'busy', 'error', 'complete', 'skipped')
     result_types = ('keep', 'forget')
+
     class __mongometa__:
         session = task_orm_session
         name = 'monq_task'
@@ -90,12 +92,12 @@ class MonQTask(MappedClass):
     task_name = FieldProperty(str)
     process = FieldProperty(str)
     context = FieldProperty(dict(
-            project_id=S.ObjectId,
-            app_config_id=S.ObjectId,
-            user_id=S.ObjectId,
-            notifications_disabled=bool))
+        project_id=S.ObjectId,
+        app_config_id=S.ObjectId,
+        user_id=S.ObjectId,
+        notifications_disabled=bool))
     args = FieldProperty([])
-    kwargs = FieldProperty({None:None})
+    kwargs = FieldProperty({None: None})
     result = FieldProperty(None, if_missing=None)
 
     def __repr__(self):
@@ -137,8 +139,10 @@ class MonQTask(MappedClass):
              priority=10,
              delay=0):
         '''Create a new task object based on the current context.'''
-        if args is None: args = ()
-        if kwargs is None: kwargs = {}
+        if args is None:
+            args = ()
+        if kwargs is None:
+            kwargs = {}
         task_name = '%s.%s' % (
             function.__module__,
             function.__name__)
@@ -148,12 +152,13 @@ class MonQTask(MappedClass):
             user_id=None,
             notifications_disabled=False)
         if getattr(c, 'project', None):
-            context['project_id']=c.project._id
-            context['notifications_disabled']=c.project.notifications_disabled
+            context['project_id'] = c.project._id
+            context[
+                'notifications_disabled'] = c.project.notifications_disabled
         if getattr(c, 'app', None):
-            context['app_config_id']=c.app.config._id
+            context['app_config_id'] = c.app.config._id
         if getattr(c, 'user', None):
-            context['user_id']=c.user._id
+            context['user_id'] = c.user._id
         obj = cls(
             state='ready',
             priority=priority,
@@ -182,8 +187,8 @@ class MonQTask(MappedClass):
         StopIteration, stop waiting for a task
         '''
         sort = [
-                ('priority', ming.DESCENDING),
-                ('time_queue', ming.ASCENDING)]
+            ('priority', ming.DESCENDING),
+            ('time_queue', ming.ASCENDING)]
         while True:
             try:
                 query = dict(state=state)
@@ -196,10 +201,11 @@ class MonQTask(MappedClass):
                         '$set': dict(
                             state='busy',
                             process=process)
-                        },
+                    },
                     new=True,
                     sort=sort)
-                if obj is not None: return obj
+                if obj is not None:
+                    return obj
             except pymongo.errors.OperationFailure, exc:
                 if 'No matching object found' not in exc.args[0]:
                     raise
@@ -215,7 +221,7 @@ class MonQTask(MappedClass):
         '''Mark all busy tasks older than a certain datetime as 'ready' again.
         Used to retry 'stuck' tasks.'''
         spec = dict(state='busy')
-        spec['time_start'] = {'$lt':older_than}
+        spec['time_start'] = {'$lt': older_than}
         cls.query.update(spec, {'$set': dict(state='ready')}, multi=True)
 
     @classmethod
@@ -227,7 +233,7 @@ class MonQTask(MappedClass):
     @classmethod
     def run_ready(cls, worker=None):
         '''Run all the tasks that are currently ready'''
-        i=0
+        i = 0
         for i, task in enumerate(cls.query.find(dict(state='ready')).all()):
             task.process = worker
             task()
@@ -250,8 +256,10 @@ class MonQTask(MappedClass):
             c.project = M.Project.query.get(_id=self.context.project_id)
             c.app = None
             if c.project:
-                c.project.notifications_disabled = self.context.get('notifications_disabled', False)
-                app_config = M.AppConfig.query.get(_id=self.context.app_config_id)
+                c.project.notifications_disabled = self.context.get(
+                    'notifications_disabled', False)
+                app_config = M.AppConfig.query.get(
+                    _id=self.context.app_config_id)
                 if app_config:
                     c.app = c.project.app_instance(app_config)
             c.user = M.User.query.get(_id=self.context.user_id)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/Allura/allura/model/neighborhood.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/neighborhood.py b/Allura/allura/model/neighborhood.py
index 7fd98e3..e2137e2 100644
--- a/Allura/allura/model/neighborhood.py
+++ b/Allura/allura/model/neighborhood.py
@@ -36,10 +36,12 @@ from .types import MarkdownCache
 
 log = logging.getLogger(__name__)
 
+
 class NeighborhoodFile(File):
+
     class __mongometa__:
         session = main_orm_session
-        indexes = [ 'neighborhood_id' ]
+        indexes = ['neighborhood_id']
 
     neighborhood_id = FieldProperty(S.ObjectId)
 
@@ -51,7 +53,9 @@ re_bgcolor_titlebar = re.compile('background\-color:([^;}]+);')
 re_color_titlebar = re.compile('color:([^;}]+);')
 re_icon_theme = re.compile('neo-icon-set-(ffffff|454545)-256x350.png')
 
+
 class Neighborhood(MappedClass):
+
     '''Provide a grouping of related projects.
 
     url_prefix - location of neighborhood (may include scheme and/or host)
@@ -60,11 +64,12 @@ class Neighborhood(MappedClass):
     class __mongometa__:
         session = main_orm_session
         name = 'neighborhood'
-        unique_indexes = [ 'url_prefix' ]
+        unique_indexes = ['url_prefix']
 
     _id = FieldProperty(S.ObjectId)
     name = FieldProperty(str)
-    url_prefix = FieldProperty(str) # e.g. http://adobe.openforge.com/ or projects/
+    # e.g. http://adobe.openforge.com/ or projects/
+    url_prefix = FieldProperty(str)
     shortname_prefix = FieldProperty(str, if_missing='')
     css = FieldProperty(str, if_missing='')
     homepage = FieldProperty(str, if_missing='')
@@ -107,7 +112,7 @@ class Neighborhood(MappedClass):
         if url.startswith('//'):
             try:
                 return request.scheme + ':' + url
-            except TypeError: # pragma no cover
+            except TypeError:  # pragma no cover
                 return 'http:' + url
         else:
             return url
@@ -154,12 +159,17 @@ class Neighborhood(MappedClass):
         return self.features['max_projects']
 
     def get_css_for_picker(self):
-        projecttitlefont = {'label': 'Project title, font', 'name': 'projecttitlefont', 'value':'', 'type': 'font'}
-        projecttitlecolor = {'label': 'Project title, color', 'name': 'projecttitlecolor', 'value':'', 'type': 'color'}
-        barontop = {'label': 'Bar on top', 'name': 'barontop', 'value': '', 'type': 'color'}
-        titlebarbackground = {'label': 'Title bar, background', 'name': 'titlebarbackground', 'value': '', 'type': 'color'}
-        titlebarcolor = {'label': 'Title bar, foreground', 'name': 'titlebarcolor', 'value': '', 'type': 'color',
-                         'additional': """<label>Icons theme:</label> <select name="css-addopt-icon-theme" class="add_opt">
+        projecttitlefont = {'label': 'Project title, font',
+                            'name': 'projecttitlefont', 'value': '', 'type': 'font'}
+        projecttitlecolor = {'label': 'Project title, color',
+                             'name': 'projecttitlecolor', 'value': '', 'type': 'color'}
+        barontop = {'label': 'Bar on top', 'name':
+                    'barontop', 'value': '', 'type': 'color'}
+        titlebarbackground = {'label': 'Title bar, background',
+                              'name': 'titlebarbackground', 'value': '', 'type': 'color'}
+        titlebarcolor = {
+            'label': 'Title bar, foreground', 'name': 'titlebarcolor', 'value': '', 'type': 'color',
+            'additional': """<label>Icons theme:</label> <select name="css-addopt-icon-theme" class="add_opt">
                         <option value="default">default</option>
                         <option value="dark"%(titlebarcolor_dark)s>dark</option>
                         <option value="white"%(titlebarcolor_white)s>white</option>
@@ -206,8 +216,9 @@ class Neighborhood(MappedClass):
                             elif icon_theme == "454545":
                                 titlebarcolor_white = ' selected="selected"'
 
-        titlebarcolor['additional'] = titlebarcolor['additional'] % {'titlebarcolor_dark': titlebarcolor_dark,
-                                                                     'titlebarcolor_white': titlebarcolor_white}
+        titlebarcolor[
+            'additional'] = titlebarcolor['additional'] % {'titlebarcolor_dark': titlebarcolor_dark,
+                                                           'titlebarcolor_white': titlebarcolor_white}
 
         styles_list = []
         styles_list.append(projecttitlefont)
@@ -226,32 +237,35 @@ class Neighborhood(MappedClass):
 
         css_text = ""
         if 'projecttitlefont' in css_form_dict and css_form_dict['projecttitlefont'] != '':
-           css_text += "/*projecttitlefont*/.project_title{font-family:%s;}\n" % (css_form_dict['projecttitlefont'])
+            css_text += "/*projecttitlefont*/.project_title{font-family:%s;}\n" % (
+                css_form_dict['projecttitlefont'])
 
         if 'projecttitlecolor' in css_form_dict and css_form_dict['projecttitlecolor'] != '':
-           css_text += "/*projecttitlecolor*/.project_title{color:%s;}\n" % (css_form_dict['projecttitlecolor'])
+            css_text += "/*projecttitlecolor*/.project_title{color:%s;}\n" % (
+                css_form_dict['projecttitlecolor'])
 
         if 'barontop' in css_form_dict and css_form_dict['barontop'] != '':
-           css_text += "/*barontop*/.pad h2.colored {background-color:%(bgcolor)s; background-image: none;}\n" % \
-                       {'bgcolor': css_form_dict['barontop']}
+            css_text += "/*barontop*/.pad h2.colored {background-color:%(bgcolor)s; background-image: none;}\n" % \
+                        {'bgcolor': css_form_dict['barontop']}
 
         if 'titlebarbackground' in css_form_dict and css_form_dict['titlebarbackground'] != '':
-           css_text += "/*titlebarbackground*/.pad h2.title{background-color:%(bgcolor)s; background-image: none;}\n" % \
-                       {'bgcolor': css_form_dict['titlebarbackground']}
+            css_text += "/*titlebarbackground*/.pad h2.title{background-color:%(bgcolor)s; background-image: none;}\n" % \
+                        {'bgcolor': css_form_dict['titlebarbackground']}
 
         if 'titlebarcolor' in css_form_dict and css_form_dict['titlebarcolor'] != '':
-           icon_theme = ''
-           if 'addopt-icon-theme' in css_form_dict:
-               if css_form_dict['addopt-icon-theme'] == "dark":
-                  icon_theme = ".pad h2.dark small b.ico {background-image: url('%s%s');}" % (
-                               g.theme_href(''),
-                               'images/neo-icon-set-ffffff-256x350.png')
-               elif css_form_dict['addopt-icon-theme'] == "white":
-                  icon_theme = ".pad h2.dark small b.ico {background-image: url('%s%s');}" % (
-                               g.theme_href(''),
-                               'images/neo-icon-set-454545-256x350.png')
-
-           css_text += "/*titlebarcolor*/.pad h2.title, .pad h2.title small a {color:%s;} %s\n" % (css_form_dict['titlebarcolor'], icon_theme)
+            icon_theme = ''
+            if 'addopt-icon-theme' in css_form_dict:
+                if css_form_dict['addopt-icon-theme'] == "dark":
+                    icon_theme = ".pad h2.dark small b.ico {background-image: url('%s%s');}" % (
+                                 g.theme_href(''),
+                        'images/neo-icon-set-ffffff-256x350.png')
+                elif css_form_dict['addopt-icon-theme'] == "white":
+                    icon_theme = ".pad h2.dark small b.ico {background-image: url('%s%s');}" % (
+                                 g.theme_href(''),
+                        'images/neo-icon-set-454545-256x350.png')
+
+            css_text += "/*titlebarcolor*/.pad h2.title, .pad h2.title small a {color:%s;} %s\n" % (
+                css_form_dict['titlebarcolor'], icon_theme)
 
         return css_text
 
@@ -262,7 +276,8 @@ class Neighborhood(MappedClass):
         if not self.anchored_tools:
             return dict()
         try:
-            anchored_tools = [at.strip() for at in self.anchored_tools.split(',')]
+            anchored_tools = [at.strip()
+                              for at in self.anchored_tools.split(',')]
             return OrderedDict((tool.split(':')[0].lower(), tool.split(':')[1]) for tool in anchored_tools)
         except Exception:
             log.warning("anchored_tools isn't valid", exc_info=True)