Merge lp:~daker/loco-team-portal/fix.960695.common-app into lp:loco-team-portal

Proposed by Adnane Belmadiaf
Status: Merged
Approved by: Chris Johnston
Approved revision: 533
Merged at revision: 551
Proposed branch: lp:~daker/loco-team-portal/fix.960695.common-app
Merge into: lp:loco-team-portal
Diff against target: 704 lines (+128/-76)
11 files modified
loco_directory/common/context_processors.py (+14/-7)
loco_directory/common/forms.py (+4/-3)
loco_directory/common/launchpad.py (+1/-1)
loco_directory/common/management/commands/recoverdata.py (+16/-16)
loco_directory/common/mixins.py (+4/-5)
loco_directory/common/shortcuts.py (+11/-8)
loco_directory/common/templatetags/markup.py (+4/-1)
loco_directory/common/templatetags/teams_tags.py (+2/-1)
loco_directory/common/utils.py (+14/-11)
loco_directory/common/views.py (+56/-21)
loco_directory/common/widgets.py (+2/-2)
To merge this branch: bzr merge lp:~daker/loco-team-portal/fix.960695.common-app
Reviewer Review Type Date Requested Status
Chris Johnston Approve
Review via email: mp+108439@code.launchpad.net

Commit message

* Fixed the common app coding style

To post a comment you must log in.
Revision history for this message
Chris Johnston (cjohnston) wrote :

Text conflict in loco_directory/common/launchpad.py

review: Needs Fixing
Revision history for this message
Chris Johnston (cjohnston) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'loco_directory/common/context_processors.py'
--- loco_directory/common/context_processors.py 2011-04-15 15:05:40 +0000
+++ loco_directory/common/context_processors.py 2012-06-30 22:09:18 +0000
@@ -4,14 +4,16 @@
44
5from django.conf import settings5from django.conf import settings
66
7
7def loco_version(request):8def loco_version(request):
8 """9 """
9 add the loco version to template context processor. 10 add the loco version to template context processor.
10 """11 """
11 12
12 version = getattr(settings, 'VERSION_STRING', 'unknown')13 version = getattr(settings, 'VERSION_STRING', 'unknown')
13 return {'loco_version': version}14 return {'loco_version': version}
1415
16
15def google_api_key(request):17def google_api_key(request):
16 """18 """
17 Return the Google API Key or "" if none is defined.19 Return the Google API Key or "" if none is defined.
@@ -20,29 +22,34 @@
20 google_api_key = getattr(settings, 'GOOGLE_API_KEY', '')22 google_api_key = getattr(settings, 'GOOGLE_API_KEY', '')
21 return {'google_api_key': google_api_key}23 return {'google_api_key': google_api_key}
2224
25
23def flickr_api_key(request):26def flickr_api_key(request):
24 """27 """
25 Return the Flickr API Key or "" if none is defined.28 Return the Flickr API Key or "" if none is defined.
26 """29 """
27 30
28 flickr_api_key = getattr(settings, 'FLICKR_API_KEY', '')31 flickr_api_key = getattr(settings, 'FLICKR_API_KEY', '')
29 return {'flickr_api_key': flickr_api_key}32 return {'flickr_api_key': flickr_api_key}
30 33
34
31def pixie_api_key(request):35def pixie_api_key(request):
32 """36 """
33 Return the Pix.ie API Key or "" if none is defined.37 Return the Pix.ie API Key or "" if none is defined.
34 """38 """
35 39
36 pixie_api_key = getattr(settings, 'PIXIE_API_KEY', '')40 pixie_api_key = getattr(settings, 'PIXIE_API_KEY', '')
37 return {'pixie_api_key': pixie_api_key}41 return {'pixie_api_key': pixie_api_key}
3842
43
39def login_redirect(request):44def login_redirect(request):
40 return {'login_next': request.get_full_path()}45 return {'login_next': request.get_full_path()}
4146
47
42def url_base(request):48def url_base(request):
43 url = request.get_full_path().split('/')49 url = request.get_full_path().split('/')
44 return {'url_base': url[1]} 50 return {'url_base': url[1]}
45 51
52
46def site_search(request):53def site_search(request):
47 from common.forms import SiteSearchForm54 from common.forms import SiteSearchForm
48 search_form = SiteSearchForm(data=request.GET)55 search_form = SiteSearchForm(data=request.GET)
4956
=== modified file 'loco_directory/common/forms.py'
--- loco_directory/common/forms.py 2010-11-20 17:25:50 +0000
+++ loco_directory/common/forms.py 2012-06-30 22:09:18 +0000
@@ -2,12 +2,13 @@
2from django import forms2from django import forms
3from django.utils.translation import ugettext as _3from django.utils.translation import ugettext as _
44
5
5# Taken from http://djangosnippets.org/snippets/1732/6# Taken from http://djangosnippets.org/snippets/1732/
6class RenderableMixin(object):7class RenderableMixin(object):
7 """8 """
8 Mixin to render forms from a predefined template9 Mixin to render forms from a predefined template
9 """10 """
10 11
11 @property12 @property
12 def form_class_name(self):13 def form_class_name(self):
13 return '.'.join([self.__module__, self.__class__.__name__.lower()])14 return '.'.join([self.__module__, self.__class__.__name__.lower()])
@@ -23,7 +24,7 @@
2324
24 context_dict = dict(25 context_dict = dict(
25 non_field_errors=self.non_field_errors(),26 non_field_errors=self.non_field_errors(),
26 fields=[ forms.forms.BoundField(self, field, name) for name, field in self.fields.iteritems()],27 fields=[forms.forms.BoundField(self, field, name) for name, field in self.fields.iteritems()],
27 errors=self.errors,28 errors=self.errors,
28 data=self.data,29 data=self.data,
29 form=self,30 form=self,
@@ -40,6 +41,7 @@
40 Context(context_dict)41 Context(context_dict)
41 )42 )
4243
44
43class SiteSearchForm(forms.Form):45class SiteSearchForm(forms.Form):
44 """46 """
45 A Search form for the whole site47 A Search form for the whole site
@@ -49,4 +51,3 @@
49 def as_line(self):51 def as_line(self):
50 "Returns this form rendered. Only the fields. Nothing else HTML."52 "Returns this form rendered. Only the fields. Nothing else HTML."
51 return self._html_output(u'%(label)s %(errors)s%(field)s%(help_text)s', u'%s', '', u'%s', False)53 return self._html_output(u'%(label)s %(errors)s%(field)s%(help_text)s', u'%s', '', u'%s', False)
52
5354
=== modified file 'loco_directory/common/launchpad.py'
--- loco_directory/common/launchpad.py 2012-06-20 11:02:00 +0000
+++ loco_directory/common/launchpad.py 2012-06-30 22:09:18 +0000
@@ -38,7 +38,7 @@
38 if is_debug_user(user.username):38 if is_debug_user(user.username):
39 return True39 return True
40 if user.is_staff:40 if user.is_staff:
41 return True41 return True
42 lc_in_groups = user.groups.filter(name__exact='ubuntu-lococouncil')42 lc_in_groups = user.groups.filter(name__exact='ubuntu-lococouncil')
43 return (lc_in_groups.count() == 1)43 return (lc_in_groups.count() == 1)
4444
4545
=== modified file 'loco_directory/common/management/commands/recoverdata.py'
--- loco_directory/common/management/commands/recoverdata.py 2011-08-30 19:24:24 +0000
+++ loco_directory/common/management/commands/recoverdata.py 2012-06-30 22:09:18 +0000
@@ -13,6 +13,7 @@
13from venues.models import *13from venues.models import *
14from meetings.models import *14from meetings.models import *
1515
16
16class Command(BaseCommand):17class Command(BaseCommand):
17 args = 'dump_file'18 args = 'dump_file'
18 help = 'Attempt to recover missing data from a json dump'19 help = 'Attempt to recover missing data from a json dump'
@@ -22,13 +23,13 @@
22 print "You must supply a dumpfile"23 print "You must supply a dumpfile"
23 return24 return
24 dumpfile = args[0]25 dumpfile = args[0]
25 26
26 try:27 try:
27 json = open(dumpfile)28 json = open(dumpfile)
28 except:29 except:
29 print "Unable to open %s" % dumpfile30 print "Unable to open %s" % dumpfile
30 return31 return
31 32
32 try:33 try:
33 decoder = simplejson.JSONDecoder()34 decoder = simplejson.JSONDecoder()
34 data = decoder.decode(json.read())35 data = decoder.decode(json.read())
@@ -37,7 +38,7 @@
37 return38 return
38 finally:39 finally:
39 json.close()40 json.close()
40 41
41 print "Loading %s" % dumpfile42 print "Loading %s" % dumpfile
42 users = dict()43 users = dict()
43 profiles = dict()44 profiles = dict()
@@ -46,11 +47,11 @@
46 globalevents = dict()47 globalevents = dict()
47 teamevents = dict()48 teamevents = dict()
48 venues = dict()49 venues = dict()
49 basemeetings=dict()50 basemeetings = dict()
50 teammeetings = dict()51 teammeetings = dict()
51 agendaitems = dict()52 agendaitems = dict()
52 agendaitems_needparent = dict()53 agendaitems_needparent = dict()
53 54
54 # first pass we can collect user, teams and venues55 # first pass we can collect user, teams and venues
55 for record in data:56 for record in data:
56 # recover users57 # recover users
@@ -65,7 +66,7 @@
65 )66 )
66 if user_created:67 if user_created:
67 print "Created User: %s" % users[record['pk']].username68 print "Created User: %s" % users[record['pk']].username
68 69
69 # recover teams70 # recover teams
70 if record['model'] == 'teams.team':71 if record['model'] == 'teams.team':
71# print "Checking team %s (%s)" % (record['fields']['name'], record['fields']['lp_name'])72# print "Checking team %s (%s)" % (record['fields']['name'], record['fields']['lp_name'])
@@ -111,12 +112,12 @@
111 if record['model'] == 'events.baseevent':112 if record['model'] == 'events.baseevent':
112# print "Caching baseevent %s" % (record['fields']['name'],)113# print "Caching baseevent %s" % (record['fields']['name'],)
113 baseevents[record['pk']] = record['fields']114 baseevents[record['pk']] = record['fields']
114 115
115 # save base meeting116 # save base meeting
116 if record['model'] == 'meetings.basemeeting':117 if record['model'] == 'meetings.basemeeting':
117# print "Caching basemeeting %s" % (record['fields']['name'],)118# print "Caching basemeeting %s" % (record['fields']['name'],)
118 basemeetings[record['pk']] = record['fields']119 basemeetings[record['pk']] = record['fields']
119 120
120 # recover userprofile121 # recover userprofile
121 if record['model'] == 'userprofiles.userprofile':122 if record['model'] == 'userprofiles.userprofile':
122 if record['fields']['user'] in users:123 if record['fields']['user'] in users:
@@ -134,7 +135,6 @@
134 else:135 else:
135 print u"Failed to create missing userprofile, no such user: %s" % record['fields']['user']136 print u"Failed to create missing userprofile, no such user: %s" % record['fields']['user']
136137
137
138 # third pass we can collect global events and team meetings, using the138 # third pass we can collect global events and team meetings, using the
139 # baseevent and basemeeting data cached in the previous pass139 # baseevent and basemeeting data cached in the previous pass
140 for record in data:140 for record in data:
@@ -170,7 +170,7 @@
170 'logs': basemeeting['logs'],170 'logs': basemeeting['logs'],
171 'minutes': basemeeting['minutes'],171 'minutes': basemeeting['minutes'],
172 'date_created': basemeeting['date_created'],172 'date_created': basemeeting['date_created'],
173 'chair': profiles.get(basemeeting['chair'], None),#profile lookup173 'chair': profiles.get(basemeeting['chair'], None), # profile lookup
174 'meeting_tz': record['fields']['meeting_tz'],174 'meeting_tz': record['fields']['meeting_tz'],
175 }175 }
176 )176 )
@@ -190,14 +190,14 @@
190 name=baseevent['name'],190 name=baseevent['name'],
191 date_begin=baseevent['date_begin'],191 date_begin=baseevent['date_begin'],
192 date_end=baseevent['date_end'],192 date_end=baseevent['date_end'],
193 venue=venues.get(record['fields']['venue'], None), #venue lookup193 venue=venues.get(record['fields']['venue'], None), # venue lookup
194 channel=record['fields']['channel'],194 channel=record['fields']['channel'],
195 defaults={195 defaults={
196 'description': baseevent['description'],196 'description': baseevent['description'],
197 'announce': baseevent['announce'],197 'announce': baseevent['announce'],
198 'date_created': baseevent['date_created'],198 'date_created': baseevent['date_created'],
199 'contact': profiles.get(record['fields']['contact'], None), #profile lookup199 'contact': profiles.get(record['fields']['contact'], None), # profile lookup
200 'global_event': globalevents.get(record['fields']['global_event'], None), #global event lookup200 'global_event': globalevents.get(record['fields']['global_event'], None), # global event lookup
201 'registration': record['fields']['registration'],201 'registration': record['fields']['registration'],
202 }202 }
203 )203 )
@@ -219,7 +219,7 @@
219 created_date=record['fields']['created_date'],219 created_date=record['fields']['created_date'],
220 defaults={220 defaults={
221 'description': record['fields']['description'],221 'description': record['fields']['description'],
222 'parent': None, #saved for later lookup, since they aren't ordered222 'parent': None, # saved for later lookup, since they aren't ordered
223 'order': record['fields']['order'],223 'order': record['fields']['order'],
224 'log': record['fields']['log'],224 'log': record['fields']['log'],
225 }225 }
@@ -227,7 +227,7 @@
227 if ai_created and record['fields']['parent']:227 if ai_created and record['fields']['parent']:
228 agendaitems_needparent[record['pk']] = record['fields']['parent']228 agendaitems_needparent[record['pk']] = record['fields']['parent']
229 print u"Created AgendaItem %s: %s" % (agendaitems[record['pk']].pk, unicode(agendaitems[record['pk']].title).encode('ascii', 'ignore'))229 print u"Created AgendaItem %s: %s" % (agendaitems[record['pk']].pk, unicode(agendaitems[record['pk']].title).encode('ascii', 'ignore'))
230 230
231 # recover event attendee231 # recover event attendee
232 if record['model'] == 'events.attendee':232 if record['model'] == 'events.attendee':
233 if record['fields']['team_event'] in teamevents:233 if record['fields']['team_event'] in teamevents:
@@ -259,7 +259,7 @@
259 print u"Created TeamEvent Comment: %s on %s (%s)" % (comment.commenter_profile.user.username, unicode(comment.team_event.name).encode('ascii', 'ignore'), comment.team_event.pk)259 print u"Created TeamEvent Comment: %s on %s (%s)" % (comment.commenter_profile.user.username, unicode(comment.team_event.name).encode('ascii', 'ignore'), comment.team_event.pk)
260 else:260 else:
261 print u"Failed to create TeamEventComment, no such team event: %s" % record['fields']['team_event']261 print u"Failed to create TeamEventComment, no such team event: %s" % record['fields']['team_event']
262 262
263 # after fifth pass, set agendaitem parents263 # after fifth pass, set agendaitem parents
264 for agendaitem_id in agendaitems_needparent:264 for agendaitem_id in agendaitems_needparent:
265 parent_id = agendaitems_needparent[agendaitem_id]265 parent_id = agendaitems_needparent[agendaitem_id]
266266
=== modified file 'loco_directory/common/mixins.py'
--- loco_directory/common/mixins.py 2011-06-17 17:10:41 +0000
+++ loco_directory/common/mixins.py 2012-06-30 22:09:18 +0000
@@ -1,8 +1,9 @@
1import pytz1import pytz
22
3
3class LocalTimeMixin(object):4class LocalTimeMixin(object):
4 '''Provides methods for converting between UTC and localtime5 '''Provides methods for converting between UTC and localtime
5 6
6 Classes using this should provide the timezone string as self.tz7 Classes using this should provide the timezone string as self.tz
7 '''8 '''
89
@@ -13,19 +14,17 @@
13 except:14 except:
14 return pytz.utc15 return pytz.utc
15 timezone = property(get_timezone)16 timezone = property(get_timezone)
16 17
17 def tolocaltime(self, dt):18 def tolocaltime(self, dt):
18 'Converts a datetime in UTC to a datetime in this object\'s timezone'19 'Converts a datetime in UTC to a datetime in this object\'s timezone'
19 if dt is None:20 if dt is None:
20 return None21 return None
21 as_utc = pytz.utc.localize(dt)22 as_utc = pytz.utc.localize(dt)
22 return as_utc.astimezone(self.timezone)23 return as_utc.astimezone(self.timezone)
23 24
24 def fromlocaltime(self, dt):25 def fromlocaltime(self, dt):
25 'Converts a datetime in this object\'s timezone to a datetime in UTC'26 'Converts a datetime in this object\'s timezone to a datetime in UTC'
26 if dt is None:27 if dt is None:
27 return None28 return None
28 local = self.timezone.localize(dt)29 local = self.timezone.localize(dt)
29 return local.astimezone(pytz.utc)30 return local.astimezone(pytz.utc)
30
31
3231
=== modified file 'loco_directory/common/shortcuts.py'
--- loco_directory/common/shortcuts.py 2010-04-09 14:10:02 +0000
+++ loco_directory/common/shortcuts.py 2012-06-30 22:09:18 +0000
@@ -9,20 +9,22 @@
9from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect9from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
10from django.core import urlresolvers10from django.core import urlresolvers
1111
12
13# pylint: disable-msg=C0103
12def redirect(to, *args, **kwargs):14def redirect(to, *args, **kwargs):
13 """15 """
14 Returns an HttpResponseRedirect to the apropriate URL for the arguments16 Returns an HttpResponseRedirect to the apropriate URL for the arguments
15 passed.17 passed.
16 18
17 The arguments could be:19 The arguments could be:
18 20
19 * A model: the model's `get_absolute_url()` function will be called.21 * A model: the model's `get_absolute_url()` function will be called.
20 22
21 * A view name, possibly with arguments: `urlresolvers.reverse()` will23 * A view name, possibly with arguments: `urlresolvers.reverse()` will
22 be used to reverse-resolve the name.24 be used to reverse-resolve the name.
23 25
24 * A URL, which will be used as-is for the redirect location.26 * A URL, which will be used as-is for the redirect location.
25 27
26 By default issues a temporary redirect; pass permanent=True to issue a28 By default issues a temporary redirect; pass permanent=True to issue a
27 permanent redirect29 permanent redirect
28 """30 """
@@ -30,11 +32,11 @@
30 redirect_class = HttpResponsePermanentRedirect32 redirect_class = HttpResponsePermanentRedirect
31 else:33 else:
32 redirect_class = HttpResponseRedirect34 redirect_class = HttpResponseRedirect
33 35
34 # If it's a model, use get_absolute_url()36 # If it's a model, use get_absolute_url()
35 if hasattr(to, 'get_absolute_url'):37 if hasattr(to, 'get_absolute_url'):
36 return redirect_class(to.get_absolute_url())38 return redirect_class(to.get_absolute_url())
37 39
38 # Next try a reverse URL resolution.40 # Next try a reverse URL resolution.
39 try:41 try:
40 return redirect_class(urlresolvers.reverse(to, args=args, kwargs=kwargs))42 return redirect_class(urlresolvers.reverse(to, args=args, kwargs=kwargs))
@@ -42,7 +44,7 @@
42 # If this doesn't "feel" like a URL, re-raise.44 # If this doesn't "feel" like a URL, re-raise.
43 if '/' not in to and '.' not in to:45 if '/' not in to and '.' not in to:
44 raise46 raise
45 47
46 # Finally, fall back and assume it's a URL48 # Finally, fall back and assume it's a URL
47 return redirect_class(to)49 return redirect_class(to)
4850
@@ -64,6 +66,7 @@
64 raise AttributeError66 raise AttributeError
65 return sum67 return sum
6668
69
67def queryset_count(field, qs):70def queryset_count(field, qs):
68 """71 """
69 Returns the number of non-null the values in the given field of the queryset72 Returns the number of non-null the values in the given field of the queryset
7073
=== modified file 'loco_directory/common/templatetags/markup.py'
--- loco_directory/common/templatetags/markup.py 2012-02-07 14:36:29 +0000
+++ loco_directory/common/templatetags/markup.py 2012-06-30 22:09:18 +0000
@@ -20,6 +20,7 @@
2020
21register = template.Library()21register = template.Library()
2222
23
23@register.filter24@register.filter
24def textile(value):25def textile(value):
25 try:26 try:
@@ -31,6 +32,7 @@
31 else:32 else:
32 return mark_safe(force_unicode(textile.textile(smart_str(value), encoding='utf-8', output='utf-8')))33 return mark_safe(force_unicode(textile.textile(smart_str(value), encoding='utf-8', output='utf-8')))
3334
35
34@register.filter36@register.filter
35def markdown(value, arg=''):37def markdown(value, arg=''):
36 """38 """
@@ -68,13 +70,14 @@
6870
69 # Unicode support only in markdown v1.7 or above. Version_info71 # Unicode support only in markdown v1.7 or above. Version_info
70 # exist only in markdown v1.6.2rc-2 or above.72 # exist only in markdown v1.6.2rc-2 or above.
71 if getattr(markdown, "version_info", None) < (1,7):73 if getattr(markdown, "version_info", None) < (1, 7):
72 return mark_safe(force_unicode(markdown.markdown(smart_str(value), extensions, safe_mode=safe_mode)))74 return mark_safe(force_unicode(markdown.markdown(smart_str(value), extensions, safe_mode=safe_mode)))
73 else:75 else:
74 return mark_safe(markdown.markdown(force_unicode(value), extensions, safe_mode=safe_mode))76 return mark_safe(markdown.markdown(force_unicode(value), extensions, safe_mode=safe_mode))
75 else:77 else:
76 return mark_safe(force_unicode(markdown.markdown(smart_str(value))))78 return mark_safe(force_unicode(markdown.markdown(smart_str(value))))
7779
80
78@register.filter81@register.filter
79def restructuredtext(value):82def restructuredtext(value):
80 try:83 try:
8184
=== modified file 'loco_directory/common/templatetags/teams_tags.py'
--- loco_directory/common/templatetags/teams_tags.py 2011-06-19 13:55:34 +0000
+++ loco_directory/common/templatetags/teams_tags.py 2012-06-30 22:09:18 +0000
@@ -3,8 +3,9 @@
33
4register = template.Library()4register = template.Library()
55
6
6def irc(nickname):7def irc(nickname):
7 """ 8 """
8 Replace dots with underscores9 Replace dots with underscores
9 """10 """
10 return nickname.replace('.', '_')11 return nickname.replace('.', '_')
1112
=== modified file 'loco_directory/common/utils.py'
--- loco_directory/common/utils.py 2011-10-05 00:50:53 +0000
+++ loco_directory/common/utils.py 2012-06-30 22:09:18 +0000
@@ -6,6 +6,7 @@
66
7from django.conf import settings7from django.conf import settings
88
9
9def write_log(job_name, log):10def write_log(job_name, log):
10 stamp_dir = os.path.join(settings.PROJECT_PATH, 'data')11 stamp_dir = os.path.join(settings.PROJECT_PATH, 'data')
11 log_file = os.path.join(stamp_dir, "%s.log" % job_name)12 log_file = os.path.join(stamp_dir, "%s.log" % job_name)
@@ -15,6 +16,7 @@
15 f.write(log)16 f.write(log)
16 f.close()17 f.close()
1718
19
18def run_job(which, interval, args=None):20def run_job(which, interval, args=None):
19 stamp_dir = os.path.join(settings.PROJECT_PATH, 'data')21 stamp_dir = os.path.join(settings.PROJECT_PATH, 'data')
20 if not os.path.exists(stamp_dir):22 if not os.path.exists(stamp_dir):
@@ -24,7 +26,7 @@
24 datetime.datetime.utcfromtimestamp(os.path.getmtime(stamp_file)) + interval < datetime.datetime.now():26 datetime.datetime.utcfromtimestamp(os.path.getmtime(stamp_file)) + interval < datetime.datetime.now():
25 pwd = os.getcwd()27 pwd = os.getcwd()
26 os.chdir(settings.PROJECT_PATH)28 os.chdir(settings.PROJECT_PATH)
27 p = subprocess.Popen(["python", "manage.py", which], stdout=subprocess.PIPE, 29 p = subprocess.Popen(["python", "manage.py", which], stdout=subprocess.PIPE,
28 stderr=subprocess.STDOUT, close_fds=True)30 stderr=subprocess.STDOUT, close_fds=True)
29 log = p.stdout.read()31 log = p.stdout.read()
30 p.communicate()32 p.communicate()
@@ -33,6 +35,7 @@
33 os.utime(stamp_file, None)35 os.utime(stamp_file, None)
34 write_log(which, log)36 write_log(which, log)
3537
38
36def flat_list(some_list):39def flat_list(some_list):
37 """40 """
38 >>> reduce(lambda a,b: a.extend(b) or a, [[2,3],[6],[66,34]])41 >>> reduce(lambda a,b: a.extend(b) or a, [[2,3],[6],[66,34]])
@@ -40,9 +43,10 @@
40 """43 """
41 if not some_list:44 if not some_list:
42 return []45 return []
43 return reduce(lambda a,b: a.extend(b) or a, some_list)46 return reduce(lambda a, b: a.extend(b) or a, some_list)
44 47
4548
49# pylint: disable-msg=C0103
46def redirect(to, *args, **kwargs):50def redirect(to, *args, **kwargs):
47 from distutils.version import LooseVersion as V51 from distutils.version import LooseVersion as V
48 import django52 import django
@@ -62,10 +66,10 @@
62 if not os.path.exists(version_file):66 if not os.path.exists(version_file):
63 return "version unknown"67 return "version unknown"
6468
65 f = email.message_from_file(open(version_file))69 emai_msg = email.message_from_file(open(version_file))
66 version = f["version"]70 version = emai_msg["version"]
67 bzr_revno = f["revno"]71 bzr_revno = emai_msg["revno"]
68 72
69 if debug:73 if debug:
70 try:74 try:
71 from bzrlib.branch import Branch75 from bzrlib.branch import Branch
@@ -76,6 +80,7 @@
7680
77 return "version %s (rev %s)" % (version, bzr_revno)81 return "version %s (rev %s)" % (version, bzr_revno)
7882
83
79class simple_iterator(object):84class simple_iterator(object):
8085
81 def __init__(self, *args):86 def __init__(self, *args):
@@ -85,7 +90,7 @@
85 self.values.extend(deepcopy(args[0]))90 self.values.extend(deepcopy(args[0]))
86 else:91 else:
87 self.values.extend(deepcopy(args))92 self.values.extend(deepcopy(args))
88 93
89 def get_next_index(self):94 def get_next_index(self):
90 if self.index + 1 >= len(self.values):95 if self.index + 1 >= len(self.values):
91 self.index = 096 self.index = 0
@@ -101,5 +106,3 @@
101 def reset(self):106 def reset(self):
102 self.index = -1107 self.index = -1
103 return ''108 return ''
104
105
106109
=== modified file 'loco_directory/common/views.py'
--- loco_directory/common/views.py 2011-10-11 14:03:43 +0000
+++ loco_directory/common/views.py 2012-06-30 22:09:18 +0000
@@ -13,6 +13,7 @@
13 MissingUsernameViolation,13 MissingUsernameViolation,
14 )14 )
15except ImportError:15except ImportError:
16 # pylint: disable-msg=C0103
16 MissingPhysicalMultiFactor = None17 MissingPhysicalMultiFactor = None
17 MissingUsernameViolation = None18 MissingUsernameViolation = None
1819
@@ -25,7 +26,7 @@
25 team_meeting_count = TeamMeeting.objects.next_meetings().count()26 team_meeting_count = TeamMeeting.objects.next_meetings().count()
26 global_event_list = GlobalEvent.objects.next_events()[:5]27 global_event_list = GlobalEvent.objects.next_events()[:5]
27 articles = Article.objects.all()[:5]28 articles = Article.objects.all()[:5]
28 29
29 context = {'team_event_count': team_event_count,30 context = {'team_event_count': team_event_count,
30 'team_meeting_count': team_meeting_count,31 'team_meeting_count': team_meeting_count,
31 'global_event_list': global_event_list,32 'global_event_list': global_event_list,
@@ -35,36 +36,43 @@
35 return render_to_response('index.html', context,36 return render_to_response('index.html', context,
36 RequestContext(request))37 RequestContext(request))
3738
39
38def loco_council(request):40def loco_council(request):
39 context = {}41 context = {}
40 return render_to_response('loco_council.html', context,42 return render_to_response('loco_council.html', context,
41 RequestContext(request))43 RequestContext(request))
4244
45
43def about(request):46def about(request):
44 context = {}47 context = {}
45 return render_to_response('about.html', context,48 return render_to_response('about.html', context,
46 RequestContext(request))49 RequestContext(request))
4750
51
48def about_loco(request):52def about_loco(request):
49 context = {}53 context = {}
50 return render_to_response('about_loco.html', context,54 return render_to_response('about_loco.html', context,
51 RequestContext(request))55 RequestContext(request))
5256
57
53def loco_setup(request):58def loco_setup(request):
54 context = {}59 context = {}
55 return render_to_response('loco_setup.html', context,60 return render_to_response('loco_setup.html', context,
56 RequestContext(request))61 RequestContext(request))
5762
63
58def irc_chat(request):64def irc_chat(request):
59 context = {}65 context = {}
60 return render_to_response('irc_chat.html', context,66 return render_to_response('irc_chat.html', context,
61 RequestContext(request))67 RequestContext(request))
62 68
69
63def using_locodir(request):70def using_locodir(request):
64 context = {}71 context = {}
65 return render_to_response('using_locodir.html', context,72 return render_to_response('using_locodir.html', context,
66 RequestContext(request))73 RequestContext(request))
67 74
75
68def site_logout(request):76def site_logout(request):
69 logout(request)77 logout(request)
70 return HttpResponseRedirect('/')78 return HttpResponseRedirect('/')
@@ -74,17 +82,19 @@
74 """82 """
75 Change the language for a user83 Change the language for a user
76 """84 """
77 next = request.META.get('HTTP_REFERER', None)85 next_url = request.META.get('HTTP_REFERER', None)
78 if not next:86 if not next_url:
79 next = '/'87 next_url = '/'
80 response = HttpResponseRedirect(next)88 response = HttpResponseRedirect(next_url)
81 lang = request.GET.get('lang', '')89 lang = request.GET.get('lang', '')
82 if check_for_language(lang):90 if check_for_language(lang):
83 if hasattr(request, 'session'):91 if hasattr(request, 'session'):
84 request.session['django_language'] = lang92 request.session['django_language'] = lang
85 response.set_cookie(settings.LANGUAGE_COOKIE_NAME,lang)93 response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang)
86 return response94 return response
87 95
96
97# pylint: disable-msg=C0103
88def site_search(request):98def site_search(request):
89 from common.forms import SiteSearchForm99 from common.forms import SiteSearchForm
90 from common.utils import simple_iterator100 from common.utils import simple_iterator
@@ -110,17 +120,24 @@
110 'venues': venues,120 'venues': venues,
111 'meetings': meetings,121 'meetings': meetings,
112 'q': q,122 'q': q,
113 'colcycle' : simple_iterator('col_left', 'col_right'),123 'colcycle': simple_iterator('col_left', 'col_right'),
114 }124 }
115 return render_to_response('site_search.html', context,125 return render_to_response('site_search.html', context,
116 RequestContext(request))126 RequestContext(request))
117 127
128
129# pylint: disable-msg=C0103
118def search_teams(q):130def search_teams(q):
119 from teams.models import Team131 from teams.models import Team
120 from django.db.models import Q132 from django.db.models import Q
121 team_list = Team.objects.filter(Q(name__icontains=q) | Q(countries__name__icontains=q) | Q(city__icontains=q) | Q(languages__name__icontains=q)).order_by('name').distinct()133 team_list = Team.objects.filter(Q(name__icontains=q) |
134 Q(countries__name__icontains=q) |
135 Q(city__icontains=q) |
136 Q(languages__name__icontains=q)).order_by('name').distinct()
122 return team_list137 return team_list
123 138
139
140# pylint: disable-msg=C0103
124def search_global_events(q):141def search_global_events(q):
125 from events.models import GlobalEvent142 from events.models import GlobalEvent
126 from django.db.models import Q143 from django.db.models import Q
@@ -128,26 +145,43 @@
128 global_event_list = global_event_list.filter(Q(name__icontains=q)).distinct()145 global_event_list = global_event_list.filter(Q(name__icontains=q)).distinct()
129 return global_event_list146 return global_event_list
130147
148
149# pylint: disable-msg=C0103
131def search_team_events(q):150def search_team_events(q):
132 from events.models import TeamEvent151 from events.models import TeamEvent
133 from django.db.models import Q152 from django.db.models import Q
134 team_event_list = TeamEvent.objects.next_events()153 team_event_list = TeamEvent.objects.next_events()
135 team_event_list = team_event_list.filter(Q(name__icontains=q) | Q(teams__name__icontains=q) | Q(venue__name__icontains=q) | Q(venue__city__icontains=q) | Q(venue__country__name__icontains=q) | Q(global_event__name__icontains=q)).distinct()154 team_event_list = team_event_list.filter(Q(name__icontains=q) |
155 Q(teams__name__icontains=q) |
156 Q(venue__name__icontains=q) |
157 Q(venue__city__icontains=q) |
158 Q(venue__country__name__icontains=q) |
159 Q(global_event__name__icontains=q)).distinct()
136 return team_event_list160 return team_event_list
137 161
162
163# pylint: disable-msg=C0103
138def search_venues(q):164def search_venues(q):
139 from venues.models import Venue165 from venues.models import Venue
140 from django.db.models import Q166 from django.db.models import Q
141 venue_list = Venue.objects.filter(Q(name__icontains=q) | Q(country__name__icontains=q) | Q(city__icontains=q) | Q(address__icontains=q)).order_by('name').distinct()167 venue_list = Venue.objects.filter(Q(name__icontains=q) |
168 Q(country__name__icontains=q) |
169 Q(city__icontains=q) |
170 Q(address__icontains=q)).order_by('name').distinct()
142 return venue_list171 return venue_list
143 172
173
174# pylint: disable-msg=C0103
144def search_meetings(q):175def search_meetings(q):
145 from meetings.models import TeamMeeting176 from meetings.models import TeamMeeting
146 from django.db.models import Q177 from django.db.models import Q
147 meeting_list = TeamMeeting.objects.next_meetings()178 meeting_list = TeamMeeting.objects.next_meetings()
148 meeting_list = meeting_list.filter(Q(name__icontains=q) | Q(teams__name__icontains=q) | Q(agenda__title__icontains=q)).distinct()179 meeting_list = meeting_list.filter(Q(name__icontains=q) |
180 Q(teams__name__icontains=q) |
181 Q(agenda__title__icontains=q)).distinct()
149 return meeting_list182 return meeting_list
150 183
184
151def login_failure(request, message, status=403,185def login_failure(request, message, status=403,
152 template_name='login_failure.html',186 template_name='login_failure.html',
153 exception=None):187 exception=None):
@@ -159,9 +193,10 @@
159 if isinstance(exception, MissingPhysicalMultiFactor):193 if isinstance(exception, MissingPhysicalMultiFactor):
160 context['solution'] = 'Try logging in again using your Yubikey'194 context['solution'] = 'Try logging in again using your Yubikey'
161 elif isinstance(exception, MissingUsernameViolation):195 elif isinstance(exception, MissingUsernameViolation):
162 context['solution'] = 'You will need to create a <a href="https://launchpad.net/people/+me">Launchpad profile</a> to use the LoCo Teams Directory'196 context['solution'] = 'You will need to create a ' \
197 '<a href="https://launchpad.net/people/+me">' \
198 'Launchpad profile</a> to use the LoCo Teams Directory'
163199
164 data = render_to_string(template_name, context,200 data = render_to_string(template_name, context,
165 context_instance=RequestContext(request))201 context_instance=RequestContext(request))
166 return HttpResponse(data, status=status)202 return HttpResponse(data, status=status)
167
168203
=== modified file 'loco_directory/common/widgets.py'
--- loco_directory/common/widgets.py 2010-07-29 12:05:20 +0000
+++ loco_directory/common/widgets.py 2012-06-30 22:09:18 +0000
@@ -7,6 +7,7 @@
7from django.utils.safestring import mark_safe7from django.utils.safestring import mark_safe
8import copy8import copy
99
10
10class PopupRelatedFieldWidgetWrapper(forms.Widget):11class PopupRelatedFieldWidgetWrapper(forms.Widget):
11 """12 """
12 This class is a wrapper to a given widget to add the add icon for the13 This class is a wrapper to a given widget to add the add icon for the
@@ -29,7 +30,7 @@
2930
30 def _media(self):31 def _media(self):
31 wm = self.widget.media32 wm = self.widget.media
32 wm.add_js(['%sjs/admin/RelatedObjectLookups.js'%settings.ADMIN_MEDIA_PREFIX,])33 wm.add_js(['%sjs/admin/RelatedObjectLookups.js' % settings.ADMIN_MEDIA_PREFIX, ])
33 return wm34 return wm
34 media = property(_media)35 media = property(_media)
3536
@@ -55,4 +56,3 @@
5556
56 def id_for_label(self, id_):57 def id_for_label(self, id_):
57 return self.widget.id_for_label(id_)58 return self.widget.id_for_label(id_)
58

Subscribers

People subscribed via source and target branches