changeset 167:ecc41e392805 draft

Replaced tabs with spaces, using untabify, to follow PEP8
author eriol-guest
date Wed, 06 Jul 2011 01:40:05 +0000
parents cfcd0eb96c1e
children e0f4dccd70f6
files bts_webui/amancay/ajax.py bts_webui/amancay/btsqueries.py bts_webui/amancay/bugs.py bts_webui/amancay/models.py bts_webui/amancay/registration.py bts_webui/amancay/search.py bts_webui/amancay/tables.py bts_webui/amancay/templatetags/bug_tags.py bts_webui/amancay/templatetags/template_filters.py bts_webui/amancay/templatetags/toolbox.py bts_webui/amancay/urls.py bts_webui/amancay/views.py bts_webui/settings.py bts_webui/urls.py
diffstat 14 files changed, 871 insertions(+), 871 deletions(-) [+]
line wrap: on
line diff
--- a/bts_webui/amancay/ajax.py
+++ b/bts_webui/amancay/ajax.py
@@ -4,203 +4,203 @@
 from amancay.bugs import handle_email
 
 def _add_item(request, item_type, new_item):
-	"""
-	Add the given item to either the session or user set.
-	"""
-	item_set = '%s_set' % item_type
+    """
+    Add the given item to either the session or user set.
+    """
+    item_set = '%s_set' % item_type
 
-	if request.user.is_authenticated():
-		item_set = getattr(request.user, item_set)
-		items = item_set.filter(**new_item)
+    if request.user.is_authenticated():
+        item_set = getattr(request.user, item_set)
+        items = item_set.filter(**new_item)
 
-		if items:
-			return False
-		else:
-			item_set.create(**new_item)
-			return True
-	else:
-		items = request.session.get(item_set, [])
-		new_item = new_item.values()[0]
+        if items:
+            return False
+        else:
+            item_set.create(**new_item)
+            return True
+    else:
+        items = request.session.get(item_set, [])
+        new_item = new_item.values()[0]
 
-		if new_item in items:
-			return False
-		else:
-			items.append(new_item)
-			request.session[item_set] = items
-			return True
+        if new_item in items:
+            return False
+        else:
+            items.append(new_item)
+            request.session[item_set] = items
+            return True
 
 def _remove_item(request, item_type, remove_item):
-	"""
-	Remove the given item from either the session or user set.
-	"""
-	item_set = '%s_set' % item_type
+    """
+    Remove the given item from either the session or user set.
+    """
+    item_set = '%s_set' % item_type
 
-	if request.user.is_authenticated():
-		item_set = getattr(request.user, item_set)
-		items = item_set.filter(**remove_item)
+    if request.user.is_authenticated():
+        item_set = getattr(request.user, item_set)
+        items = item_set.filter(**remove_item)
 
-		if items:
-			items[0].delete()
-			return True
-		else:
-			return False
-	else:
-		items = request.session.get(item_set, [])
-		remove_value = remove_item.values()[0]
+        if items:
+            items[0].delete()
+            return True
+        else:
+            return False
+    else:
+        items = request.session.get(item_set, [])
+        remove_value = remove_item.values()[0]
 
-		if remove_value in items:
-			items.remove(remove_value)
-			request.session[item_set] = items
-			return True
-		else:
-			return False
+        if remove_value in items:
+            items.remove(remove_value)
+            request.session[item_set] = items
+            return True
+        else:
+            return False
 
 def _get_post_or_get(request, item):
-	item = request.GET.get(item, None)
+    item = request.GET.get(item, None)
 
-	if not item:
-		item = request.POST.get(item, None)
+    if not item:
+        item = request.POST.get(item, None)
 
-	return item
+    return item
 
 def package_add(request):
-	"""
-	Add a package to our watched list.
-	"""
-	item = _get_post_or_get(request, 'id')
+    """
+    Add a package to our watched list.
+    """
+    item = _get_post_or_get(request, 'id')
 
-	if _add_item(request, 'package', {'package_name': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _add_item(request, 'package', {'package_name': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def package_remove(request):
-	"""
-	Remove a package from the watched list.
-	"""
-	item = _get_post_or_get(request, 'id')
+    """
+    Remove a package from the watched list.
+    """
+    item = _get_post_or_get(request, 'id')
 
-	if _remove_item(request, 'package', {'package_name': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _remove_item(request, 'package', {'package_name': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def bug_add(request):
-	"""
-	Add a bug to our watched list.
-	"""
-	item = int(_get_post_or_get(request, 'id'))
+    """
+    Add a bug to our watched list.
+    """
+    item = int(_get_post_or_get(request, 'id'))
 
-	if _add_item(request, 'bug', {'number': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _add_item(request, 'bug', {'number': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def bug_remove(request):
-	"""
-	Remove a bug from the watched list.
-	"""
-	item = int(_get_post_or_get(request, 'id'))
+    """
+    Remove a bug from the watched list.
+    """
+    item = int(_get_post_or_get(request, 'id'))
 
-	if _remove_item(request, 'bug', {'number': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _remove_item(request, 'bug', {'number': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def maintainer_add(request):
-	"""
-	Add a maintainer to our watched list.
-	"""
-	item = _get_post_or_get(request, 'id')
+    """
+    Add a maintainer to our watched list.
+    """
+    item = _get_post_or_get(request, 'id')
 
-	if _add_item(request, 'maintaineremail', {'address': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _add_item(request, 'maintaineremail', {'address': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def maintainer_remove(request):
-	"""
-	Remove a maintainer from our watched list.
-	"""
-	item = _get_post_or_get(request, 'id')
+    """
+    Remove a maintainer from our watched list.
+    """
+    item = _get_post_or_get(request, 'id')
 
-	if _remove_item(request, 'maintaineremail', {'address': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _remove_item(request, 'maintaineremail', {'address': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def submitter_add(request):
-	"""
-	Add a submitter/user to our watched list.
-	"""
-	item = _get_post_or_get(request, 'id')
+    """
+    Add a submitter/user to our watched list.
+    """
+    item = _get_post_or_get(request, 'id')
 
-	if _add_item(request, 'submitteremail', {'address': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _add_item(request, 'submitteremail', {'address': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def submitter_remove(request):
-	"""
-	Remove a submitter/user from our watched list.
-	"""
-	item = _get_post_or_get(request, 'id')
+    """
+    Remove a submitter/user from our watched list.
+    """
+    item = _get_post_or_get(request, 'id')
 
-	if _remove_item(request, 'submitteremail', {'address': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _remove_item(request, 'submitteremail', {'address': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def user_add(request):
-	"""
-	Add a submitter/user to our watched list.
-	"""
-	item = _get_post_or_get(request, 'id')
+    """
+    Add a submitter/user to our watched list.
+    """
+    item = _get_post_or_get(request, 'id')
 
-	if _add_item(request, 'useremail', {'address': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _add_item(request, 'useremail', {'address': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def user_remove(request):
-	"""
-	Remove a submitter/user from our watched list.
-	"""
-	item = _get_post_or_get(request, 'id')
+    """
+    Remove a submitter/user from our watched list.
+    """
+    item = _get_post_or_get(request, 'id')
 
-	if _remove_item(request, 'useremail', {'address': item}):
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+    if _remove_item(request, 'useremail', {'address': item}):
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def _bug_toggle_subscribe(request, subscribe=True):
-	"""
-	Toggle subscription to a specific bug report.
-	"""
-	bug_number = request.GET['id']
+    """
+    Toggle subscription to a specific bug report.
+    """
+    bug_number = request.GET['id']
 
-	if subscribe:
-		action = 'subscribe'
-	else:
-		action = 'unsubscribe'
+    if subscribe:
+        action = 'subscribe'
+    else:
+        action = 'unsubscribe'
 
-	if request.user.is_authenticated():
-		to_address = ['%s-%s@bugs.debian.org' % (bug_number, action)]
+    if request.user.is_authenticated():
+        to_address = ['%s-%s@bugs.debian.org' % (bug_number, action)]
 
-		# FIXME: this never tells us if the email left the building
-		handle_email(request, to_address, '', '')
-		return HttpResponse(status=200)
-	else:
-		return HttpResponse(status=500)
+        # FIXME: this never tells us if the email left the building
+        handle_email(request, to_address, '', '')
+        return HttpResponse(status=200)
+    else:
+        return HttpResponse(status=500)
 
 def bug_subscribe(request):
-	"""
-	Subscribe to a specific bug report.
-	"""
-	return _bug_toggle_subscribe(request, subscribe=True)
+    """
+    Subscribe to a specific bug report.
+    """
+    return _bug_toggle_subscribe(request, subscribe=True)
 
 def bug_unsubscribe(request):
-	"""
-	Unsubscribe to a specific bug report.
-	"""
-	return _bug_toggle_subscribe(request, subscribe=False)
+    """
+    Unsubscribe to a specific bug report.
+    """
+    return _bug_toggle_subscribe(request, subscribe=False)
--- a/bts_webui/amancay/btsqueries.py
+++ b/bts_webui/amancay/btsqueries.py
@@ -2,36 +2,36 @@
 import SOAPpy
 
 class BtsQueries:
-	"""
-	Abstract class implementing stubs for the required BTS queries the
-	different implementations should support.
+    """
+    Abstract class implementing stubs for the required BTS queries the
+    different implementations should support.
 
-	"""
-	def get_bugs_status(self, bug_numbers):
-		"""
-		Returns an array with the status for all bug_numbers received.
-		"""
-		pass
+    """
+    def get_bugs_status(self, bug_numbers):
+        """
+        Returns an array with the status for all bug_numbers received.
+        """
+        pass
 
-	def get_packages_bugs(self, packages):
-		"""
-		Returns an array of bug numbers, for all received packages.
-		"""
-		pass
+    def get_packages_bugs(self, packages):
+        """
+        Returns an array of bug numbers, for all received packages.
+        """
+        pass
 
-	def get_submitters_bugs(self, emails):
-		"""
-		Returns an array of bug numbers, for which the emails received are
-		submitters.
-		"""
-		pass
+    def get_submitters_bugs(self, emails):
+        """
+        Returns an array of bug numbers, for which the emails received are
+        submitters.
+        """
+        pass
 
-	def get_maintainers_bugs(self, emails):
-		"""
-		Returns an array of bug numbers, for which the emails received are
-		maintainers.
-		"""
-		pass
+    def get_maintainers_bugs(self, emails):
+        """
+        Returns an array of bug numbers, for which the emails received are
+        maintainers.
+        """
+        pass
 
 # ************************ SOAP Queries *****************************
 # Uncomment those to enable debugging
@@ -39,59 +39,59 @@
 #server.config.dumpSOAPIn = 1
 
 class SoapQueries(BtsQueries):
-	"""
-	SOAP based BtsQueries class.
-	"""
-	def __init__(self):
-		#self.url = 'http://bugs.debian.org/cgi-bin/soap.cgi'
-		self.url = 'http://bugs-rietz.debian.org/cgi-bin/soap.cgi'
-		#self.url = 'http://bugs.donarmstrong.com/cgi-bin/soap.cgi'
-		self.ns = 'Debbugs/SOAP'
-		self.server = SOAPpy.SOAPProxy(self.url, self.ns)
+    """
+    SOAP based BtsQueries class.
+    """
+    def __init__(self):
+        #self.url = 'http://bugs.debian.org/cgi-bin/soap.cgi'
+        self.url = 'http://bugs-rietz.debian.org/cgi-bin/soap.cgi'
+        #self.url = 'http://bugs.donarmstrong.com/cgi-bin/soap.cgi'
+        self.ns = 'Debbugs/SOAP'
+        self.server = SOAPpy.SOAPProxy(self.url, self.ns)
 
-	def get_bugs_status(self, bug_numbers):
-		result = self.server.get_status(bug_numbers)
+    def get_bugs_status(self, bug_numbers):
+        result = self.server.get_status(bug_numbers)
 
-		# FIXME: looks like a bug in debbugs SOAP implementation
-		# empty results turn out as "" or " "
-		if result == "" or result == " ":
-			return []
+        # FIXME: looks like a bug in debbugs SOAP implementation
+        # empty results turn out as "" or " "
+        if result == "" or result == " ":
+            return []
 
-		if isinstance(result.item, list):
-			return [item.value for item in result.item]
-		else:
-			return [result.item.value]
+        if isinstance(result.item, list):
+            return [item.value for item in result.item]
+        else:
+            return [result.item.value]
 
-	def get_packages_bugs(self, packages):
-		result = self.server.get_bugs('package', packages)
-		return result
+    def get_packages_bugs(self, packages):
+        result = self.server.get_bugs('package', packages)
+        return result
 
-	def get_submitters_bugs(self, emails):
-		result = self.server.get_bugs('submitter', emails)
-		return result
+    def get_submitters_bugs(self, emails):
+        result = self.server.get_bugs('submitter', emails)
+        return result
 
-	def get_maintainers_bugs(self, emails):
-		result = self.server.get_bugs('maint', emails)
-		return result
+    def get_maintainers_bugs(self, emails):
+        result = self.server.get_bugs('maint', emails)
+        return result
 
-	def get_all_packages_bugs(self, packages):
-		# FIXME: Not in BtsQueries
-		pkg = self.server.get_bugs('package', packages)
-		src = self.server.get_bugs('src', packages)
-		# this gives us only unique elements
-		result = set(pkg + src)
+    def get_all_packages_bugs(self, packages):
+        # FIXME: Not in BtsQueries
+        pkg = self.server.get_bugs('package', packages)
+        src = self.server.get_bugs('src', packages)
+        # this gives us only unique elements
+        result = set(pkg + src)
 
-		return list(result)
+        return list(result)
 
-	def get_bug_log(self, bug):
-		# FIXME: Not in BtsQueries
-		result = self.server.get_bug_log(bug)
-		return result
+    def get_bug_log(self, bug):
+        # FIXME: Not in BtsQueries
+        result = self.server.get_bug_log(bug)
+        return result
 
-	def get_tagged_bugs(self, users):
-		# FIXME: Not in BtsQueries
-		# TODO: ask Don to allow many users at the same time
-		result = []
-		for user in users:
-			result = result + self.server.get_usertag(user)
-		return result
+    def get_tagged_bugs(self, users):
+        # FIXME: Not in BtsQueries
+        # TODO: ask Don to allow many users at the same time
+        result = []
+        for user in users:
+            result = result + self.server.get_usertag(user)
+        return result
--- a/bts_webui/amancay/bugs.py
+++ b/bts_webui/amancay/bugs.py
@@ -11,283 +11,283 @@
 from amancay.btsqueries import SoapQueries
 
 def bug(request, bug_number):
-	"""
-	Renders a bug page.
+    """
+    Renders a bug page.
 
-	If the given bug page has been reached as a result of a POST action, the
-	data sent will be processed by process_bug_post and the bug will be
-	rendered after that to the user.
-	"""
-	# Process post
-	info = process_bug_post(request, bug_number)
+    If the given bug page has been reached as a result of a POST action, the
+    data sent will be processed by process_bug_post and the bug will be
+    rendered after that to the user.
+    """
+    # Process post
+    info = process_bug_post(request, bug_number)
 
-	bug_number = int(bug_number)
+    bug_number = int(bug_number)
 
-	# FIXME: we need API
-	request.user.subscribed = False
-	queries = SoapQueries()
-	bug_status = queries.get_bugs_status(bug_number)[0]
-	bug_originator = email.Utils.parseaddr(bug_status['originator'])
-	bug_log = queries.get_bug_log(bug_number)
+    # FIXME: we need API
+    request.user.subscribed = False
+    queries = SoapQueries()
+    bug_status = queries.get_bugs_status(bug_number)[0]
+    bug_originator = email.Utils.parseaddr(bug_status['originator'])
+    bug_log = queries.get_bug_log(bug_number)
 
-	# having as a selected bug is not the same as subscribing
-	if request.user.is_authenticated():
-		bug_is_fav = bool(request.user.bug_set.filter(number=bug_number)[:1])
-	else:
-		bug_is_fav = bug_number in request.session.get('bug_set', [])
+    # having as a selected bug is not the same as subscribing
+    if request.user.is_authenticated():
+        bug_is_fav = bool(request.user.bug_set.filter(number=bug_number)[:1])
+    else:
+        bug_is_fav = bug_number in request.session.get('bug_set', [])
 
-	# Regular expressions to parse the mails
-	from_re = re.compile('^From: ?(.+)$', re.MULTILINE)
-	subject_re = re.compile('^Subject: ?(.+)$', re.MULTILINE)
-	date_re = re.compile('^Date: ?(.+)$', re.MULTILINE)
+    # Regular expressions to parse the mails
+    from_re = re.compile('^From: ?(.+)$', re.MULTILINE)
+    subject_re = re.compile('^Subject: ?(.+)$', re.MULTILINE)
+    date_re = re.compile('^Date: ?(.+)$', re.MULTILINE)
 
-	bug_messages = []
-	for item in bug_log:
-		message = {}
-		# Parse the header
-		from_value = from_re.findall(item['header'])
-		subject_value = subject_re.findall(item['header'])
-		date_value = date_re.findall(item['header'])
-		# Filter the values
-		if from_value:
-			e_from = email.Utils.parseaddr(from_value[0])
-			d_from = email.Header.decode_header(e_from[0])
-			if (d_from[0][1] != None):
-				message['from'] = [d_from[0][0].decode(d_from[0][1]), e_from[1]]
-			else:
-				message['from'] = [e_from[0], e_from[1]]
+    bug_messages = []
+    for item in bug_log:
+        message = {}
+        # Parse the header
+        from_value = from_re.findall(item['header'])
+        subject_value = subject_re.findall(item['header'])
+        date_value = date_re.findall(item['header'])
+        # Filter the values
+        if from_value:
+            e_from = email.Utils.parseaddr(from_value[0])
+            d_from = email.Header.decode_header(e_from[0])
+            if (d_from[0][1] != None):
+                message['from'] = [d_from[0][0].decode(d_from[0][1]), e_from[1]]
+            else:
+                message['from'] = [e_from[0], e_from[1]]
 
-			if not message['from'][0] and message['from'][1]:
-				message['from'][0] = message['from'][1]
+            if not message['from'][0] and message['from'][1]:
+                message['from'][0] = message['from'][1]
 
-		if subject_value:
-			message['subject'] = subject_value[0]
+        if subject_value:
+            message['subject'] = subject_value[0]
 
-		if date_value:
-			message['date'] = email.Utils.mktime_tz(email.Utils.parsedate_tz(
-													 date_value[0]))
+        if date_value:
+            message['date'] = email.Utils.mktime_tz(email.Utils.parsedate_tz(
+                                                     date_value[0]))
 
-		# Get the body
-		message['body'] = ''
-		content = item['header'] + '\n' + item['body']
-		content = email.message_from_string(content)
-		if content.is_multipart():
-			for part in content.walk():
-				if (part.get_content_maintype() == 'multipart'):
-					continue
-				if part['content-disposition'] and\
-				   part['content-disposition'][:10] == 'attachment':
-					message['body'] += '[attach: %s]' % part.get_filename()
-				else:
-					message['body'] += part.get_payload(decode=1) + '\n'
-		else:
-			message['body'] = content.get_payload(decode=1)
+        # Get the body
+        message['body'] = ''
+        content = item['header'] + '\n' + item['body']
+        content = email.message_from_string(content)
+        if content.is_multipart():
+            for part in content.walk():
+                if (part.get_content_maintype() == 'multipart'):
+                    continue
+                if part['content-disposition'] and\
+                   part['content-disposition'][:10] == 'attachment':
+                    message['body'] += '[attach: %s]' % part.get_filename()
+                else:
+                    message['body'] += part.get_payload(decode=1) + '\n'
+        else:
+            message['body'] = content.get_payload(decode=1)
 
-		bug_messages.append(message)
+        bug_messages.append(message)
 
-	return render_to_response('bug.html',
-							  {'bug_number': bug_number,
-							   'info_to_user': info,
-							   'bug_originator': bug_originator,
-							   'bug_status': bug_status,
-							   'bug_messages': bug_messages,
-							   'bug_is_fav': bug_is_fav},
-							  context_instance=RequestContext(request))
+    return render_to_response('bug.html',
+                              {'bug_number': bug_number,
+                               'info_to_user': info,
+                               'bug_originator': bug_originator,
+                               'bug_status': bug_status,
+                               'bug_messages': bug_messages,
+                               'bug_is_fav': bug_is_fav},
+                              context_instance=RequestContext(request))
 
 def process_bug_post(request, bug_number):
-	"""
-	Process the different forms based on presence of some fields.
-	"""
-	form_type = request.POST.get('form_type', None)
+    """
+    Process the different forms based on presence of some fields.
+    """
+    form_type = request.POST.get('form_type', None)
 
-	if not form_type:
-		return None
+    if not form_type:
+        return None
 
-	if form_type == 'comment':
-		return add_comment(request, bug_number)
-	elif form_type == 'reassign':
-		return reassign(request, bug_number)
-	elif form_type == 'retitle':
-		return retitle(request, bug_number)
-	elif form_type == 'close':
-		return close(request, bug_number)
-	elif form_type == 'severity':
-		return severity(request, bug_number)
-	elif form_type == 'subscribe':
-		return subscribe(request, bug_number)
-	elif form_type == 'owner':
-		return change_owner(request, bug_number)
-	else:
-		return None
+    if form_type == 'comment':
+        return add_comment(request, bug_number)
+    elif form_type == 'reassign':
+        return reassign(request, bug_number)
+    elif form_type == 'retitle':
+        return retitle(request, bug_number)
+    elif form_type == 'close':
+        return close(request, bug_number)
+    elif form_type == 'severity':
+        return severity(request, bug_number)
+    elif form_type == 'subscribe':
+        return subscribe(request, bug_number)
+    elif form_type == 'owner':
+        return change_owner(request, bug_number)
+    else:
+        return None
 
 def change_owner(request, bug_number):
-	new_owner_email = request.POST.get('new_owner_email')
+    new_owner_email = request.POST.get('new_owner_email')
 
-	to_address = ['control@bugs.debian.org',
-					'%s@bugs.debian.org' % bug_number]
-	text = 'owner %s %s' % (bug_number, new_owner_email)
-	text += '\nthanks\n\n'
+    to_address = ['control@bugs.debian.org',
+                    '%s@bugs.debian.org' % bug_number]
+    text = 'owner %s %s' % (bug_number, new_owner_email)
+    text += '\nthanks\n\n'
 
-	subject = 'Changing owner of Debian Bug #%s to %s' % (bug_number, new_owner_email)
+    subject = 'Changing owner of Debian Bug #%s to %s' % (bug_number, new_owner_email)
 
-	return handle_email(request, to_address, subject, text)
+    return handle_email(request, to_address, subject, text)
 
 def add_comment(request, bug_number):
-	subject = request.POST.get('subject')
-	comment = request.POST.get('comment')
+    subject = request.POST.get('subject')
+    comment = request.POST.get('comment')
 
-	if subject and comment:
-		to_address = ['%s@bugs.debian.org' % bug_number]
-		# If the user is registered, we send the mail.  If not, we store it, and
-		# validate the email
-		return handle_email(request, to_address, subject, comment)
-	else:
-		return 'You need to enter both the subject and the comment.'
+    if subject and comment:
+        to_address = ['%s@bugs.debian.org' % bug_number]
+        # If the user is registered, we send the mail.  If not, we store it, and
+        # validate the email
+        return handle_email(request, to_address, subject, comment)
+    else:
+        return 'You need to enter both the subject and the comment.'
 
 def reassign(request, bug_number):
-	package = request.POST.get('reassign_to')
-	version = request.POST.get('reassign_version')
-	comment = request.POST.get('reassign_comment')
+    package = request.POST.get('reassign_to')
+    version = request.POST.get('reassign_version')
+    comment = request.POST.get('reassign_comment')
 
-	if package:
-		to_address = ['control@bugs.debian.org',
-					  '%s@bugs.debian.org' % bug_number]
-		text = 'reassign %s %s' % (bug_number, package)
+    if package:
+        to_address = ['control@bugs.debian.org',
+                      '%s@bugs.debian.org' % bug_number]
+        text = 'reassign %s %s' % (bug_number, package)
 
-		if version:
-			text += ' %s' % version
-		text += '\nthanks\n\n'
+        if version:
+            text += ' %s' % version
+        text += '\nthanks\n\n'
 
-		if comment:
-			text += comment
-		subject = 'Reassigning Debian Bug #%s to Package %s' % (bug_number, package)
+        if comment:
+            text += comment
+        subject = 'Reassigning Debian Bug #%s to Package %s' % (bug_number, package)
 
-		return handle_email(request, to_address, subject, text)
-	else:
-		return None
+        return handle_email(request, to_address, subject, text)
+    else:
+        return None
 
 def retitle(request, bug_number):
-	new_title = request.POST.get('retitle_to')
-	comment = request.POST.get('retitle_comment')
+    new_title = request.POST.get('retitle_to')
+    comment = request.POST.get('retitle_comment')
 
-	if new_title:
-		to_address = ['control@bugs.debian.org',
-					  '%s@bugs.debian.org' % bug_number]
-		text = 'retitle %s %s' % (bug_number, new_title)
-		text += '\nthanks\n\n'
+    if new_title:
+        to_address = ['control@bugs.debian.org',
+                      '%s@bugs.debian.org' % bug_number]
+        text = 'retitle %s %s' % (bug_number, new_title)
+        text += '\nthanks\n\n'
 
-		if comment:
-			text += comment
-		subject = 'Retitling Debian Bug #%s ' % bug_number
+        if comment:
+            text += comment
+        subject = 'Retitling Debian Bug #%s ' % bug_number
 
-		return handle_email(request, to_address, subject, text)
-	else:
-		return None
+        return handle_email(request, to_address, subject, text)
+    else:
+        return None
 
 def close(request, bug_number):
-	version = request.POST.get('close_version')
-	comment = request.POST.get('close_comment')
+    version = request.POST.get('close_version')
+    comment = request.POST.get('close_comment')
 
-	if version:
-		to_address = ['%s-done@bugs.debian.org' % bug_number]
-		text = 'Version: %s\n\n' % version
+    if version:
+        to_address = ['%s-done@bugs.debian.org' % bug_number]
+        text = 'Version: %s\n\n' % version
 
-		if comment:
-			text += comment
-		subject = 'Closing Debian Bug #%s ' % bug_number
+        if comment:
+            text += comment
+        subject = 'Closing Debian Bug #%s ' % bug_number
 
-		return handle_email(request, to_address, subject, text)
-	else:
-		return None
+        return handle_email(request, to_address, subject, text)
+    else:
+        return None
 
 def severity(request, bug_number):
-	new_severity = request.POST.get('severity')
-	comment = request.POST.get('severity_comment')
+    new_severity = request.POST.get('severity')
+    comment = request.POST.get('severity_comment')
 
-	if new_severity:
-		to_address = ['control@bugs.debian.org',
-					  '%s@bugs.debian.org' % bug_number ]
-		text = 'severity %s %s' % (bug_number, new_severity)
-		text += '\nthanks\n\n'
+    if new_severity:
+        to_address = ['control@bugs.debian.org',
+                      '%s@bugs.debian.org' % bug_number ]
+        text = 'severity %s %s' % (bug_number, new_severity)
+        text += '\nthanks\n\n'
 
-		if comment:
-			text += comment
-		subject = 'Changing Debian Bug #%s\'s severity to %s ' % (bug_number, new_severity)
+        if comment:
+            text += comment
+        subject = 'Changing Debian Bug #%s\'s severity to %s ' % (bug_number, new_severity)
 
-		return handle_email(request, to_address, subject, text)
-	else:
-		return None
+        return handle_email(request, to_address, subject, text)
+    else:
+        return None
 
 def handle_email(request, to_address, subject, text):
-	"""
-	Sends an email to to_address if the user is authenticated, otherwise it
-	saves it in queue.
-	"""
-	if request.user.is_authenticated():
-		send_mail(subject, text, request.user.email, to_address)
-		return 'Your comment has been successfully sent'
-	else:
-		from_address = request.POST.get('from_email')
-		pending_message(from_address, to_address, subject, text)
-		return 'A mail has been sent to your address to validate it'
+    """
+    Sends an email to to_address if the user is authenticated, otherwise it
+    saves it in queue.
+    """
+    if request.user.is_authenticated():
+        send_mail(subject, text, request.user.email, to_address)
+        return 'Your comment has been successfully sent'
+    else:
+        from_address = request.POST.get('from_email')
+        pending_message(from_address, to_address, subject, text)
+        return 'A mail has been sent to your address to validate it'
 
 def pending_message(from_address, to_address, subject, comment):
-	"""
-	Create a pending message and send the activation email.
-	"""
-	import random, sha
-	from django.contrib.sites.models import Site
-	from django.conf import settings
+    """
+    Create a pending message and send the activation email.
+    """
+    import random, sha
+    from django.contrib.sites.models import Site
+    from django.conf import settings
 
-	# Store the email in the pending message db
-	salt = sha.new(str(random.random())).hexdigest()[:5]
-	activation_key = sha.new(salt+subject+from_address).hexdigest()
+    # Store the email in the pending message db
+    salt = sha.new(str(random.random())).hexdigest()[:5]
+    activation_key = sha.new(salt+subject+from_address).hexdigest()
 
-	# Fix the to_address if necessary
-	to_address = ','.join(to_address)
+    # Fix the to_address if necessary
+    to_address = ','.join(to_address)
 
-	# Prepare the message to send to the user
-	message = Pending_Messages(from_address=from_address,
-				to_address=to_address,
-				subject=subject,
-				comment=comment,
-				digest=activation_key)
-	message.save()
-	message_template = loader.get_template('activate_comment.txt')
-	message_context = Context({ 'activation_key': activation_key,
-								'subject': subject,
-								'text': comment,
-								'to_address': to_address,
-								'from_address': from_address,
-								'site_url': Site.objects.get_current().domain
-								})
-	message = message_template.render(message_context)
-	# Send the email to the user
-	subject = 'Activate the bug actions you prepared at Amancay'
-	send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [from_address])
+    # Prepare the message to send to the user
+    message = Pending_Messages(from_address=from_address,
+                to_address=to_address,
+                subject=subject,
+                comment=comment,
+                digest=activation_key)
+    message.save()
+    message_template = loader.get_template('activate_comment.txt')
+    message_context = Context({ 'activation_key': activation_key,
+                                'subject': subject,
+                                'text': comment,
+                                'to_address': to_address,
+                                'from_address': from_address,
+                                'site_url': Site.objects.get_current().domain
+                                })
+    message = message_template.render(message_context)
+    # Send the email to the user
+    subject = 'Activate the bug actions you prepared at Amancay'
+    send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [from_address])
 
 def activate_message(request, activation_key):
-	"""
-	Flushes emails in the message queue corresponding to a given
-	activation_key.
-	"""
-	# Make sure the key we're trying conforms to the pattern of a
-	# SHA1 hash; if it doesn't, no point even trying to look it up
-	# in the DB.
-	if re.match('[a-f0-9]{40}', activation_key):
-		try:
-			message = Pending_Messages.objects.filter(digest=activation_key)[0]
-			to_address = message.to_address.split(',')
-			send_mail(message.subject, message.comment, message.from_address, to_address)
-			message.delete()
-			status = 'Your message has now been successfully sent'
-		except SMTPRecipientsRefused:
-			status = 'Invalid destination: %s.' % message.to_address
-		except IndexError:
-			status = 'Invalid activation key'
-	else:
-		status = 'Malformed activation key'
+    """
+    Flushes emails in the message queue corresponding to a given
+    activation_key.
+    """
+    # Make sure the key we're trying conforms to the pattern of a
+    # SHA1 hash; if it doesn't, no point even trying to look it up
+    # in the DB.
+    if re.match('[a-f0-9]{40}', activation_key):
+        try:
+            message = Pending_Messages.objects.filter(digest=activation_key)[0]
+            to_address = message.to_address.split(',')
+            send_mail(message.subject, message.comment, message.from_address, to_address)
+            message.delete()
+            status = 'Your message has now been successfully sent'
+        except SMTPRecipientsRefused:
+            status = 'Invalid destination: %s.' % message.to_address
+        except IndexError:
+            status = 'Invalid activation key'
+    else:
+        status = 'Malformed activation key'
 
-	return render_to_response('search.html',
-							  {'info_to_user': status},
-							  context_instance=RequestContext(request))
+    return render_to_response('search.html',
+                              {'info_to_user': status},
+                              context_instance=RequestContext(request))
--- a/bts_webui/amancay/models.py
+++ b/bts_webui/amancay/models.py
@@ -3,42 +3,42 @@
 from django.db import models
 
 class Package(models.Model):
-	user = models.ForeignKey(User)
-	package_name = models.CharField(max_length=200)
+    user = models.ForeignKey(User)
+    package_name = models.CharField(max_length=200)
 
-	def __unicode__(self):
-		return self.package_name
+    def __unicode__(self):
+        return self.package_name
 
 class Bug(models.Model):
-	user = models.ForeignKey(User)
-	number = models.IntegerField()
+    user = models.ForeignKey(User)
+    number = models.IntegerField()
 
-	def __unicode__(self):
-		return str(self.number)
+    def __unicode__(self):
+        return str(self.number)
 
 class EmailItem(models.Model):
-	user = models.ForeignKey(User)
-	address = models.CharField(max_length=255)
+    user = models.ForeignKey(User)
+    address = models.CharField(max_length=255)
 
-	class Meta:
-		abstract = True
+    class Meta:
+        abstract = True
 
-	def __unicode__(self):
-		return self.address
+    def __unicode__(self):
+        return self.address
 
 class MaintainerEmail(EmailItem):
-	pass
+    pass
 
 class SubmitterEmail(EmailItem):
-	pass
+    pass
 
 class UserEmail(EmailItem):
-	pass
+    pass
 
 # Pending messages, to be sent when address is validated
 class Pending_Messages(models.Model):
-	from_address = models.CharField(max_length=255)
-	to_address = models.CharField(max_length=255)
-	subject = models.CharField(max_length=255)
-	comment = models.TextField()
-	digest = models.CharField(max_length=255)
+    from_address = models.CharField(max_length=255)
+    to_address = models.CharField(max_length=255)
+    subject = models.CharField(max_length=255)
+    comment = models.TextField()
+    digest = models.CharField(max_length=255)
--- a/bts_webui/amancay/registration.py
+++ b/bts_webui/amancay/registration.py
@@ -5,20 +5,20 @@
 from django.shortcuts import render_to_response
 
 def register(request):
-	"""
-	Render user registration form.
-	"""
-	form = UserCreationForm()
+    """
+    Render user registration form.
+    """
+    form = UserCreationForm()
 
-	if request.method == 'POST':
-		data = request.POST.copy()
-		errors = form.get_validation_errors(data)
-		if not errors:
-			new_user = form.save()
-			return HttpResponseRedirect('/accounts/created/')
-	else:
-		data = errors = {}
+    if request.method == 'POST':
+        data = request.POST.copy()
+        errors = form.get_validation_errors(data)
+        if not errors:
+            new_user = form.save()
+            return HttpResponseRedirect('/accounts/created/')
+    else:
+        data = errors = {}
 
-	return render_to_response('registration/register.html', {
-		'form' : forms.FormWrapper(form, data, errors)
-	})
+    return render_to_response('registration/register.html', {
+        'form' : forms.FormWrapper(form, data, errors)
+    })
--- a/bts_webui/amancay/search.py
+++ b/bts_webui/amancay/search.py
@@ -15,113 +15,113 @@
 
 PER_PAGE = 20
 def search(request):
-	"""
-	View: render the bug table resulting from the current search.
-	"""
-	package = request.GET.get('query')
-	bug_list = []
-	page = None
+    """
+    View: render the bug table resulting from the current search.
+    """
+    package = request.GET.get('query')
+    bug_list = []
+    page = None
 
-	if package:
-		queries = SoapQueries()
-		bugs = queries.get_all_packages_bugs(package)
-		bugs.sort(reverse=True)
+    if package:
+        queries = SoapQueries()
+        bugs = queries.get_all_packages_bugs(package)
+        bugs.sort(reverse=True)
 
-		# We use the django Paginator to divide objects in pages but note that
-		# the actual results are passed to the template as a separate list.
-		# This is because we would be wasting bandwidth in requesting all the
-		# objects again and again, only to feed them to the paginator and use its
-		# object_list property.
-		paginator = Paginator(bugs, PER_PAGE)
+        # We use the django Paginator to divide objects in pages but note that
+        # the actual results are passed to the template as a separate list.
+        # This is because we would be wasting bandwidth in requesting all the
+        # objects again and again, only to feed them to the paginator and use its
+        # object_list property.
+        paginator = Paginator(bugs, PER_PAGE)
 
-		try:
-			page = int(request.GET.get('page', '1'))
-		except ValueError:
-			page = 1
+        try:
+            page = int(request.GET.get('page', '1'))
+        except ValueError:
+            page = 1
 
-		# If page request (9999) is out of range, deliver last page of results.
-		try:
-			page = paginator.page(page)
-		except (EmptyPage, InvalidPage):
-			page = paginator.page(paginator.num_pages)
+        # If page request (9999) is out of range, deliver last page of results.
+        try:
+            page = paginator.page(page)
+        except (EmptyPage, InvalidPage):
+            page = paginator.page(paginator.num_pages)
 
-		bug_list = queries.get_bugs_status(page.object_list)
+        bug_list = queries.get_bugs_status(page.object_list)
 
-	return render_to_response('search.html',
-							  {'bug_list': bug_list,
-							   'query': package,
-							   'page': page,
-							   'title': 'Latest bugs in %s' % package},
-							  context_instance=RequestContext(request))
+    return render_to_response('search.html',
+                              {'bug_list': bug_list,
+                               'query': package,
+                               'page': page,
+                               'title': 'Latest bugs in %s' % package},
+                              context_instance=RequestContext(request))
 
 def store_search(request, search_id, bug_list, append=False, last_page=0, total=0):
-	"""
-	Stores a search into the search db, which is serving now as a preloader.
-	"""
-	searches = request.session.get('searches')
+    """
+    Stores a search into the search db, which is serving now as a preloader.
+    """
+    searches = request.session.get('searches')
 
-	if searches is None:
-		request.session['searches'] = {}
-		searches = request.session['searches']
+    if searches is None:
+        request.session['searches'] = {}
+        searches = request.session['searches']
 
-	if not searches.has_key(search_id):
-		searches[search_id] = {}
-	searches[search_id]['stamp'] = time.time()
-	searches[search_id]['last_page'] = last_page
+    if not searches.has_key(search_id):
+        searches[search_id] = {}
+    searches[search_id]['stamp'] = time.time()
+    searches[search_id]['last_page'] = last_page
 
-	if total:
-		searches[search_id]['total'] = total
+    if total:
+        searches[search_id]['total'] = total
 
-	if append:
-		if not searches[search_id].has_key('bugs'):
-			searches[search_id]['bugs'] = []
-	else:
-		searches[search_id]['bugs'] = []
+    if append:
+        if not searches[search_id].has_key('bugs'):
+            searches[search_id]['bugs'] = []
+    else:
+        searches[search_id]['bugs'] = []
 
-	searches[search_id]['bugs'].extend(bug_list)
+    searches[search_id]['bugs'].extend(bug_list)
 
 def retrieve_search(request, search_id, amount, page=0):
-	"""
-	Return a queued search.
-	"""
-	searches = request.session.get('searches')
+    """
+    Return a queued search.
+    """
+    searches = request.session.get('searches')
 
-	if searches is not None:
-		if searches.has_key(search_id):
-			if (time.time() - searches[search_id]['stamp']) < 900:
-				start = page * amount
-				searches[search_id]['last_page'] = 0
+    if searches is not None:
+        if searches.has_key(search_id):
+            if (time.time() - searches[search_id]['stamp']) < 900:
+                start = page * amount
+                searches[search_id]['last_page'] = 0
 
-				return searches[search_id]['bugs'][start:start+amount]
+                return searches[search_id]['bugs'][start:start+amount]
 
-	return None
+    return None
 
 
 class _ReadAhead(threading.Thread):
-	"""
-	ReadAhead class used to preload bug lists.
-	"""
-	# FIXME: what does this do precisely?
-	# FIXME: what about a cache?
-	def __init__(self, request, search_id, bugs, amount):
-		threading.Thread.__init__(self)
-		self.request = request
-		self.bugs = bugs
-		self.amount = amount
-		self.search_id = search_id
+    """
+    ReadAhead class used to preload bug lists.
+    """
+    # FIXME: what does this do precisely?
+    # FIXME: what about a cache?
+    def __init__(self, request, search_id, bugs, amount):
+        threading.Thread.__init__(self)
+        self.request = request
+        self.bugs = bugs
+        self.amount = amount
+        self.search_id = search_id
 
-	def run(self):
-		"""
-		Start the ReadAhead thread.
-		"""
-		start = self.amount
-		old_session = Session.objects.get(pk=self.request.session.session_key)
-		bug_number = len(self.bugs)
-		while start < bug_number:
-			bug_list = queries.get_bugs_status(self.bugs[start:start+self.amount])
-			store_search(self.request, self.search_id, bug_list, True)
-			start += self.amount
-			# FIXME: Ugly hack to make the session save
-			Session.objects.save(self.request.session.session_key,
-								 self.request.session._session,
-								 old_session.expire_date)
+    def run(self):
+        """
+        Start the ReadAhead thread.
+        """
+        start = self.amount
+        old_session = Session.objects.get(pk=self.request.session.session_key)
+        bug_number = len(self.bugs)
+        while start < bug_number:
+            bug_list = queries.get_bugs_status(self.bugs[start:start+self.amount])
+            store_search(self.request, self.search_id, bug_list, True)
+            start += self.amount
+            # FIXME: Ugly hack to make the session save
+            Session.objects.save(self.request.session.session_key,
+                                 self.request.session._session,
+                                 old_session.expire_date)
--- a/bts_webui/amancay/tables.py
+++ b/bts_webui/amancay/tables.py
@@ -9,141 +9,141 @@
 
 PER_PAGE = 10
 def _get_bug_list(request, view):
-	"""
-	Process the requested bug list corresponding to a given view.
-	"""
-	queries = SoapQueries()
-	bugs = bug_list = []
+    """
+    Process the requested bug list corresponding to a given view.
+    """
+    queries = SoapQueries()
+    bugs = bug_list = []
 
-	if view == 'received_bugs':
-		if request.user.is_authenticated():
-			user_emails = [e.address for e in request.user.useremail_set.all()]
-		else:
-			user_emails = request.session.get('maintaineremail_set', [])
+    if view == 'received_bugs':
+        if request.user.is_authenticated():
+            user_emails = [e.address for e in request.user.useremail_set.all()]
+        else:
+            user_emails = request.session.get('maintaineremail_set', [])
 
-		bugs = queries.get_maintainers_bugs(user_emails)
+        bugs = queries.get_maintainers_bugs(user_emails)
 
-	elif view == 'submitted_bugs':
-		if request.user.is_authenticated():
-			submitter_emails = [e.address for e in request.user.submitteremail_set.all()]
-		else:
-			submitter_emails = request.session.get('submitteremail_set', [])
+    elif view == 'submitted_bugs':
+        if request.user.is_authenticated():
+            submitter_emails = [e.address for e in request.user.submitteremail_set.all()]
+        else:
+            submitter_emails = request.session.get('submitteremail_set', [])
 
-		bugs = queries.get_submitters_bugs(submitter_emails)
+        bugs = queries.get_submitters_bugs(submitter_emails)
 
-	elif view == 'selected_bugs':
-		if request.user.is_authenticated():
-			bugs = [b.number for b in request.user.bug_set.all()]
-		else:
-			bugs = request.session.get('bug_set', [])
+    elif view == 'selected_bugs':
+        if request.user.is_authenticated():
+            bugs = [b.number for b in request.user.bug_set.all()]
+        else:
+            bugs = request.session.get('bug_set', [])
 
-	elif view == 'package_bugs':
-		if request.user.is_authenticated():
-			package_list = [p.package_name for p in request.user.package_set.all()]
-		else:
-			package_list = request.session.get('package_set', [])
+    elif view == 'package_bugs':
+        if request.user.is_authenticated():
+            package_list = [p.package_name for p in request.user.package_set.all()]
+        else:
+            package_list = request.session.get('package_set', [])
 
-		bugs = queries.get_packages_bugs(package_list)
+        bugs = queries.get_packages_bugs(package_list)
 
-	elif view == 'tagged_bugs':
-		if request.user.is_authenticated():
-			user_emails = [e.address for e in request.user.useremail_set.all()]
-		else:
-			user_emails = request.session.get('useremail_set', [])
+    elif view == 'tagged_bugs':
+        if request.user.is_authenticated():
+            user_emails = [e.address for e in request.user.useremail_set.all()]
+        else:
+            user_emails = request.session.get('useremail_set', [])
 
-		bugs = queries.get_tagged_bugs(user_emails)
+        bugs = queries.get_tagged_bugs(user_emails)
 
-	# We use the django Paginator to divide objects in pages but note that
-	# the actual results are passed to the template as a separate list.
-	# This is because we would be wasting bandwidth in requesting all the
-	# objects again and again, only to feed them to the paginator and use its
-	# object_list property.
-	paginator = Paginator(bugs, PER_PAGE)
+    # We use the django Paginator to divide objects in pages but note that
+    # the actual results are passed to the template as a separate list.
+    # This is because we would be wasting bandwidth in requesting all the
+    # objects again and again, only to feed them to the paginator and use its
+    # object_list property.
+    paginator = Paginator(bugs, PER_PAGE)
 
-	try:
-		page = int(request.GET.get('page', '1'))
-	except ValueError:
-		page = 1
+    try:
+        page = int(request.GET.get('page', '1'))
+    except ValueError:
+        page = 1
 
-	# If page request (9999) is out of range, deliver last page of results.
-	try:
-		page = paginator.page(page)
-	except (EmptyPage, InvalidPage):
-		page = paginator.page(paginator.num_pages)
+    # If page request (9999) is out of range, deliver last page of results.
+    try:
+        page = paginator.page(page)
+    except (EmptyPage, InvalidPage):
+        page = paginator.page(paginator.num_pages)
 
-	bugs = page.object_list
-	if bugs:
-		bug_list = queries.get_bugs_status(bugs)
-		bug_list.sort(key=lambda x: x.package)
+    bugs = page.object_list
+    if bugs:
+        bug_list = queries.get_bugs_status(bugs)
+        bug_list.sort(key=lambda x: x.package)
 
-	return {'bug_list': bug_list,
-			'current_view': view,
-			'page': page}
+    return {'bug_list': bug_list,
+            'current_view': view,
+            'page': page}
 
 def received_bugs(request):
-	"""
-	Render a table view for bugs we have received as maintainers.
-	"""
-	data_dict = _get_bug_list(request, 'received_bugs')
-	data_dict['title'] = 'Latest received bugs'
+    """
+    Render a table view for bugs we have received as maintainers.
+    """
+    data_dict = _get_bug_list(request, 'received_bugs')
+    data_dict['title'] = 'Latest received bugs'
 
-	return render_to_response('table.html',
-							  data_dict,
-							  context_instance=RequestContext(request))
+    return render_to_response('table.html',
+                              data_dict,
+                              context_instance=RequestContext(request))
 
 def submitted_bugs(request):
-	"""
-	Render a table view for bugs we have submitted ourselves.
-	"""
-	data_dict = _get_bug_list(request, 'submitted_bugs')
-	data_dict['title'] = 'Latest submitted bugs'
+    """
+    Render a table view for bugs we have submitted ourselves.
+    """
+    data_dict = _get_bug_list(request, 'submitted_bugs')
+    data_dict['title'] = 'Latest submitted bugs'
 
-	return render_to_response('table.html',
-							  data_dict,
-							  context_instance=RequestContext(request))
+    return render_to_response('table.html',
+                              data_dict,
+                              context_instance=RequestContext(request))
 
 def selected_bugs(request):
-	"""
-	Render a table view for bugs we are watching.
-	"""
-	data_dict = _get_bug_list(request, 'selected_bugs')
-	data_dict['title'] = 'Latest selected bugs'
+    """
+    Render a table view for bugs we are watching.
+    """
+    data_dict = _get_bug_list(request, 'selected_bugs')
+    data_dict['title'] = 'Latest selected bugs'
 
-	return render_to_response('table.html',
-							  data_dict,
-							  context_instance=RequestContext(request))
+    return render_to_response('table.html',
+                              data_dict,
+                              context_instance=RequestContext(request))
 
 def package_bugs(request):
-	"""
-	Render a table view for our watched packages.
-	"""
-	if request.user.is_authenticated():
-		package_list = [p.package_name for p in request.user.package_set.all()]
-	else:
-		package_list = request.session.get('package_set', [])
+    """
+    Render a table view for our watched packages.
+    """
+    if request.user.is_authenticated():
+        package_list = [p.package_name for p in request.user.package_set.all()]
+    else:
+        package_list = request.session.get('package_set', [])
 
-	data_dict = _get_bug_list(request, 'package_bugs')
-	data_dict['title'] = 'Latest bugs on selected packages'
+    data_dict = _get_bug_list(request, 'package_bugs')
+    data_dict['title'] = 'Latest bugs on selected packages'
 
-	for bug in data_dict['bug_list']:
-		if bug.package in package_list:
-			bug.pkg_fav = True
-		else:
-			bug.pkg_fav = False
+    for bug in data_dict['bug_list']:
+        if bug.package in package_list:
+            bug.pkg_fav = True
+        else:
+            bug.pkg_fav = False
 
-	return render_to_response('table.html',
-							  data_dict,
-							  context_instance=RequestContext(request))
+    return render_to_response('table.html',
+                              data_dict,
+                              context_instance=RequestContext(request))
 
 def tagged_bugs(request):
-	"""
-	Render a table view for bugs we have tagged.
-	"""
-	data_dict = _get_bug_list(request, 'tagged_bugs')
-	data_dict['title'] = 'Latest tagged bugs'
+    """
+    Render a table view for bugs we have tagged.
+    """
+    data_dict = _get_bug_list(request, 'tagged_bugs')
+    data_dict['title'] = 'Latest tagged bugs'
 
-	# TODO: fix this, bugs is a dict where every value is a dict of tags and
-	# bugs associated to one mail
-	return render_to_response('table.html',
-							  data_dict,
-							  context_instance=RequestContext(request))
+    # TODO: fix this, bugs is a dict where every value is a dict of tags and
+    # bugs associated to one mail
+    return render_to_response('table.html',
+                              data_dict,
+                              context_instance=RequestContext(request))
--- a/bts_webui/amancay/templatetags/bug_tags.py
+++ b/bts_webui/amancay/templatetags/bug_tags.py
@@ -8,27 +8,27 @@
 register = template.Library()
 
 def bug_tags_selector(context):
-	"""
-	Render tags checkboxes for the current bug.
-	"""
-	bug = context.get('bug_status')
-	if bug is None:
-		return None
+    """
+    Render tags checkboxes for the current bug.
+    """
+    bug = context.get('bug_status')
+    if bug is None:
+        return None
 
-	# We have a constant list of tags, so we can easily find out which ones are
-	# set and which ones are not.
-	active_tags = bug.tags.split(' ')
-	all_tags = [t for t in TAGS if t not in active_tags]
+    # We have a constant list of tags, so we can easily find out which ones are
+    # set and which ones are not.
+    active_tags = bug.tags.split(' ')
+    all_tags = [t for t in TAGS if t not in active_tags]
 
-	# all_tags could be [''], let's check it's not
-	if all_tags and all_tags[0] == '':
-		all_tags = []
+    # all_tags could be [''], let's check it's not
+    if all_tags and all_tags[0] == '':
+        all_tags = []
 
-	return {
-		'bug':			bug,
-		'all_tags':		all_tags,
-		'active_tags':	active_tags,
-		}
+    return {
+        'bug':          bug,
+        'all_tags':     all_tags,
+        'active_tags':  active_tags,
+        }
 
 register.inclusion_tag('bug_tags_selector.html',
-						takes_context=True)(bug_tags_selector)
+                        takes_context=True)(bug_tags_selector)
--- a/bts_webui/amancay/templatetags/template_filters.py
+++ b/bts_webui/amancay/templatetags/template_filters.py
@@ -4,46 +4,46 @@
 register = template.Library()
 
 def tstodate(value, arg=None):
-	"""
-	Convert a timestamp into a human readable date.
-	"""
-	if not value:
-		return ''
-	try:
-		value=float(value)
-	except:
-		return ''
-	if arg is None:
-		d = datetime.fromtimestamp(value)
-		now = datetime.now()
-		if (d.year != now.year):
-			# marga says:
-			return d.strftime("%d/%m/%y")
-		elif (d.month != now.month or d.day != now.day):
-			return d.strftime("%b %e")
-		#elif (d.month != now.month):
-		#	return d.strftime("%b %e")
-		#elif (d.day != now.day):
-		#	return d.strftime("%a %e")
-		else:
-			return d.strftime("%k:%M")
-	
-	return datetime.fromtimestamp(value).strftime(arg)
+    """
+    Convert a timestamp into a human readable date.
+    """
+    if not value:
+        return ''
+    try:
+        value=float(value)
+    except:
+        return ''
+    if arg is None:
+        d = datetime.fromtimestamp(value)
+        now = datetime.now()
+        if (d.year != now.year):
+            # marga says:
+            return d.strftime("%d/%m/%y")
+        elif (d.month != now.month or d.day != now.day):
+            return d.strftime("%b %e")
+        #elif (d.month != now.month):
+        #   return d.strftime("%b %e")
+        #elif (d.day != now.day):
+        #   return d.strftime("%a %e")
+        else:
+            return d.strftime("%k:%M")
+    
+    return datetime.fromtimestamp(value).strftime(arg)
 
 def tstodatetime(value, arg=None):
-	"""
-	Convert a timestamp into a datetime object.
-	"""
-	if not value:
-		return ''
-	try:
-		value=float(value)
-	except:
-		return ''
+    """
+    Convert a timestamp into a datetime object.
+    """
+    if not value:
+        return ''
+    try:
+        value=float(value)
+    except:
+        return ''
 
-	d = datetime.fromtimestamp(value)
+    d = datetime.fromtimestamp(value)
 
-	return d
+    return d
 
 register.filter(tstodate)
 register.filter(tstodatetime)
--- a/bts_webui/amancay/templatetags/toolbox.py
+++ b/bts_webui/amancay/templatetags/toolbox.py
@@ -4,76 +4,76 @@
 register = template.Library()
 
 def toolbox_widget(context):
-	"""
-	Render the toolbox widget.
-	"""
-	toolbox = {}
-	title = item_type = item_list = None
-	
-	request = context.get('request', None)
+    """
+    Render the toolbox widget.
+    """
+    toolbox = {}
+    title = item_type = item_list = None
+    
+    request = context.get('request', None)
 
-	# Fill the info according to the type of toolbox needed
-	if request.path.find('bugs/submitted') != -1:
-		title = 'Submitter emails'
-		item_type = 'submitter'
+    # Fill the info according to the type of toolbox needed
+    if request.path.find('bugs/submitted') != -1:
+        title = 'Submitter emails'
+        item_type = 'submitter'
 
-		if request.user.is_authenticated():
-			email_list = request.user.submitteremail_set.all()
-			item_list = [e.address for e in email_list]
-		else:
-			item_list = request.session.get('submitteremail_set')
-	
-	# Received bugs
-	elif request.path.find('bugs/received') != -1:
-		title = 'Maintainer emails'
-		item_type = 'maintainer'
+        if request.user.is_authenticated():
+            email_list = request.user.submitteremail_set.all()
+            item_list = [e.address for e in email_list]
+        else:
+            item_list = request.session.get('submitteremail_set')
+    
+    # Received bugs
+    elif request.path.find('bugs/received') != -1:
+        title = 'Maintainer emails'
+        item_type = 'maintainer'
 
-		if request.user.is_authenticated():
-			email_list = request.user.maintaineremail_set.all()
-			item_list = [e.address for e in email_list]
-		else:
-			item_list = request.session.get('maintaineremail_set')
-	
-	# Selected Packages
-	elif request.path.find('bugs/packages') != -1:
-		title = 'Selected Packages'
-		item_type = 'package'
+        if request.user.is_authenticated():
+            email_list = request.user.maintaineremail_set.all()
+            item_list = [e.address for e in email_list]
+        else:
+            item_list = request.session.get('maintaineremail_set')
+    
+    # Selected Packages
+    elif request.path.find('bugs/packages') != -1:
+        title = 'Selected Packages'
+        item_type = 'package'
 
-		if request.user.is_authenticated():
-			package_list = request.user.package_set.all()
-			item_list = [p.package_name for p in package_list]
-		else:
-			item_list = request.session.get('package_set')
+        if request.user.is_authenticated():
+            package_list = request.user.package_set.all()
+            item_list = [p.package_name for p in package_list]
+        else:
+            item_list = request.session.get('package_set')
 
-	# Selected bugs
-	elif request.path.find('bugs/selected') != -1:
-		title = 'Selected Bugs'
-		item_type = 'bug'
+    # Selected bugs
+    elif request.path.find('bugs/selected') != -1:
+        title = 'Selected Bugs'
+        item_type = 'bug'
 
-		if request.user.is_authenticated():
-			bug_list = request.user.bug_set.all()
-			item_list = [b.number for b in bug_list]
-		else:
-			item_list = request.session.get('bug_set')
-	
-	# Tagged bugs
-	elif request.path.find('bugs/tagged') != -1:
-		title = 'User emails'
-		item_type = 'user'
+        if request.user.is_authenticated():
+            bug_list = request.user.bug_set.all()
+            item_list = [b.number for b in bug_list]
+        else:
+            item_list = request.session.get('bug_set')
+    
+    # Tagged bugs
+    elif request.path.find('bugs/tagged') != -1:
+        title = 'User emails'
+        item_type = 'user'
 
-		if request.user.is_authenticated():
-			email_list = request.user.useremail_set.all()
-			item_list = [e.address for e in email_list]
-		else:
-			item_list = request.session.get('useremail_set')
+        if request.user.is_authenticated():
+            email_list = request.user.useremail_set.all()
+            item_list = [e.address for e in email_list]
+        else:
+            item_list = request.session.get('useremail_set')
 
-	toolbox['title'] = title
-	toolbox['item_type'] = item_type
-	toolbox['item_list'] = item_list
+    toolbox['title'] = title
+    toolbox['item_type'] = item_type
+    toolbox['item_list'] = item_list
 
-	return {
-		'toolbox':	toolbox,
-		}
+    return {
+        'toolbox':  toolbox,
+        }
 
 register.inclusion_tag('toolbox.html',
-						takes_context=True)(toolbox_widget)
+                        takes_context=True)(toolbox_widget)
--- a/bts_webui/amancay/urls.py
+++ b/bts_webui/amancay/urls.py
@@ -2,47 +2,47 @@
 from django.conf.urls.defaults import *
 
 urlpatterns = patterns('',
-	(r'^$',		'amancay.views.index',),
-	(r'^index',	'amancay.views.index',),
+    (r'^$',     'amancay.views.index',),
+    (r'^index', 'amancay.views.index',),
 
-	(r'^search',			'amancay.search.search',),
+    (r'^search',            'amancay.search.search',),
 
-	(r'^bugs/packages',		'amancay.tables.package_bugs',),
-	(r'^bugs/received',		'amancay.tables.received_bugs',),
-	(r'^bugs/selected',		'amancay.tables.selected_bugs',),
-	(r'^bugs/submitted',	'amancay.tables.submitted_bugs',),
-	(r'^bugs/tagged',		'amancay.tables.tagged_bugs',),
+    (r'^bugs/packages',     'amancay.tables.package_bugs',),
+    (r'^bugs/received',     'amancay.tables.received_bugs',),
+    (r'^bugs/selected',     'amancay.tables.selected_bugs',),
+    (r'^bugs/submitted',    'amancay.tables.submitted_bugs',),
+    (r'^bugs/tagged',       'amancay.tables.tagged_bugs',),
 
-	# Inside pages
-	(r'^(?P<bug_number>\d+)/?$',		'amancay.bugs.bug',),
-	(r'^bug/(?P<bug_number>\d+)',		'amancay.bugs.bug',),
-	(r'^package/(?P<package_name>\w+)',	'amancay.views.package',),
+    # Inside pages
+    (r'^(?P<bug_number>\d+)/?$',        'amancay.bugs.bug',),
+    (r'^bug/(?P<bug_number>\d+)',       'amancay.bugs.bug',),
+    (r'^package/(?P<package_name>\w+)', 'amancay.views.package',),
 
-	# Small pieces for AJAX
-	(r'^ajax/package/add/',		'amancay.ajax.package_add',),
-	(r'^ajax/bug/add/',			'amancay.ajax.bug_add',),
-	(r'^ajax/maintainer/add/',	'amancay.ajax.maintainer_add',),
-	(r'^ajax/submitter/add/',	'amancay.ajax.submitter_add',),
-	(r'^ajax/user/add/',		'amancay.ajax.user_add',),
+    # Small pieces for AJAX
+    (r'^ajax/package/add/',     'amancay.ajax.package_add',),
+    (r'^ajax/bug/add/',         'amancay.ajax.bug_add',),
+    (r'^ajax/maintainer/add/',  'amancay.ajax.maintainer_add',),
+    (r'^ajax/submitter/add/',   'amancay.ajax.submitter_add',),
+    (r'^ajax/user/add/',        'amancay.ajax.user_add',),
 
-	(r'^ajax/package/remove/',		'amancay.ajax.package_remove',),
-	(r'^ajax/bug/remove/',			'amancay.ajax.bug_remove',),
-	(r'^ajax/maintainer/remove/',	'amancay.ajax.maintainer_remove',),
-	(r'^ajax/submitter/remove/',	'amancay.ajax.submitter_remove',),
-	(r'^ajax/user/remove/',			'amancay.ajax.user_remove',),
+    (r'^ajax/package/remove/',      'amancay.ajax.package_remove',),
+    (r'^ajax/bug/remove/',          'amancay.ajax.bug_remove',),
+    (r'^ajax/maintainer/remove/',   'amancay.ajax.maintainer_remove',),
+    (r'^ajax/submitter/remove/',    'amancay.ajax.submitter_remove',),
+    (r'^ajax/user/remove/',         'amancay.ajax.user_remove',),
 
-	(r'^ajax/bug/subscribe/',	'amancay.ajax.bug_subscribe',),
-	(r'^ajax/bug/unsubscribe/', 'amancay.ajax.bug_unsubscribe',),
+    (r'^ajax/bug/subscribe/',   'amancay.ajax.bug_subscribe',),
+    (r'^ajax/bug/unsubscribe/', 'amancay.ajax.bug_unsubscribe',),
 
-	# Account Settings
-	#   (r'^account_settings', 'amancay.views.account_settings',),
+    # Account Settings
+    #   (r'^account_settings', 'amancay.views.account_settings',),
 
-	# Activate a pending message
-	(r'^send_message/(?P<activation_key>\w+)/$', 'amancay.bugs.activate_message',),
+    # Activate a pending message
+    (r'^send_message/(?P<activation_key>\w+)/$', 'amancay.bugs.activate_message',),
 
-	# MochiKit and other static pages
-	(r'^images/(.*)$', 'django.views.static.serve',
-		{'document_root': 'amancay/images/'}),
-	(r'^static/(.*)$', 'django.views.static.serve',
-		{'document_root': 'amancay/static/'}),
+    # MochiKit and other static pages
+    (r'^images/(.*)$', 'django.views.static.serve',
+        {'document_root': 'amancay/images/'}),
+    (r'^static/(.*)$', 'django.views.static.serve',
+        {'document_root': 'amancay/static/'}),
 )
--- a/bts_webui/amancay/views.py
+++ b/bts_webui/amancay/views.py
@@ -7,31 +7,31 @@
 from amancay.btsqueries import SoapQueries
 
 def index(request):
-	"""
-	Our pretty useless index page.
-	"""
+    """
+    Our pretty useless index page.
+    """
 
-	return render_to_response('home.html', {},
-							  context_instance=RequestContext(request))
+    return render_to_response('home.html', {},
+                              context_instance=RequestContext(request))
 
 def package(request, package_name):
-	"""
-	Individual package page.
-	"""
-	user = request.user
-	queries = SoapQueries()
+    """
+    Individual package page.
+    """
+    user = request.user
+    queries = SoapQueries()
 
-	bugs = queries.get_packages_bugs(package_name)
-	bugs.sort(reverse=True)
-	bug_list = queries.get_bugs_status(bugs)
+    bugs = queries.get_packages_bugs(package_name)
+    bugs.sort(reverse=True)
+    bug_list = queries.get_bugs_status(bugs)
 
-	# Check if it's AJAX or HTML
-	if request.GET.has_key('xhr'):
-		return HttpResponse(simplejson.dumps({"package": package_name,
-											  "bug_list": bug_list}),
-							mimetype='application/javascript')
-	else:
-		return render_to_response('package.html',
-								  {'package': package_name,
-								   'bug_list': bug_list},
-								  context_instance=RequestContext(request))
+    # Check if it's AJAX or HTML
+    if request.GET.has_key('xhr'):
+        return HttpResponse(simplejson.dumps({"package": package_name,
+                                              "bug_list": bug_list}),
+                            mimetype='application/javascript')
+    else:
+        return render_to_response('package.html',
+                                  {'package': package_name,
+                                   'bug_list': bug_list},
+                                  context_instance=RequestContext(request))
--- a/bts_webui/settings.py
+++ b/bts_webui/settings.py
@@ -62,9 +62,9 @@
 )
 
 TEMPLATE_CONTEXT_PROCESSORS = (
-	'django.core.context_processors.auth',
-	'django.core.context_processors.debug',
-	'django.core.context_processors.request',
+    'django.core.context_processors.auth',
+    'django.core.context_processors.debug',
+    'django.core.context_processors.request',
 )
 
 MIDDLEWARE_CLASSES = (
@@ -77,8 +77,8 @@
 ROOT_URLCONF = 'bts_webui.urls'
 
 TEMPLATE_DIRS = (
-	"amancay/templates/",
-	"registration/templates/"
+    "amancay/templates/",
+    "registration/templates/"
     # Put strings here, like "/home/html/django_templates".
     # Always use forward slashes, even on Windows.
 )
@@ -87,9 +87,9 @@
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
-	'django.contrib.humanize',
-	'django.contrib.admin',
-	'django.contrib.sites',
-	'bts_webui.amancay',
-	'bts_webui.registration'
+    'django.contrib.humanize',
+    'django.contrib.admin',
+    'django.contrib.sites',
+    'bts_webui.amancay',
+    'bts_webui.registration'
 )
--- a/bts_webui/urls.py
+++ b/bts_webui/urls.py
@@ -6,17 +6,17 @@
 
 urlpatterns = patterns('',
 
-	# The admin interface
-	(r'^admin/(.*)', admin.site.root),
+    # The admin interface
+    (r'^admin/(.*)', admin.site.root),
 
-	# The amancay app
-	(r'^amancay/', include('amancay.urls')),
+    # The amancay app
+    (r'^amancay/', include('amancay.urls')),
 
-	# The registration app
-	(r'^accounts/profile/', include('amancay.urls')),
-	(r'^accounts/', include('registration.urls')),
+    # The registration app
+    (r'^accounts/profile/', include('amancay.urls')),
+    (r'^accounts/', include('registration.urls')),
 
-	# amancay is the main site here.
-	(r'^/?', include('amancay.urls')),
+    # amancay is the main site here.
+    (r'^/?', include('amancay.urls')),
     
 )