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)