diff --git a/src/postorius/__init__.py b/src/postorius/__init__.py index c61a15b..9a7f1b3 100644 --- a/src/postorius/__init__.py +++ b/src/postorius/__init__.py @@ -17,4 +17,3 @@ # Postorius. If not, see . __version__ = '1.0.0a1' - diff --git a/src/postorius/context_processors.py b/src/postorius/context_processors.py index 694827d..d154682 100644 --- a/src/postorius/context_processors.py +++ b/src/postorius/context_processors.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 1998-2012 by the Free Software Foundation, Inc. +# Copyright (C) 2012 by the Free Software Foundation, Inc. # # This file is part of Postorius. # @@ -32,11 +32,9 @@ """ # extend_template (no page header/footer when requested via AJAX) if request.is_ajax(): - extend_template = "postorius/base_ajax.html" - else: + extend_template = "postorius/base_ajax.html" + else: extend_template = "postorius/base.html" - return { - 'MAILMAN_THEME': settings.MAILMAN_THEME, - 'extend_template': extend_template, - } + return {'MAILMAN_THEME': settings.MAILMAN_THEME, + 'extend_template': extend_template} diff --git a/src/postorius/fieldset_forms.py b/src/postorius/fieldset_forms.py index 7bfa337..d4abadc 100644 --- a/src/postorius/fieldset_forms.py +++ b/src/postorius/fieldset_forms.py @@ -21,9 +21,11 @@ from django.forms.forms import BoundField from django.forms.util import ErrorList + class FieldsetError(Exception): pass + class FieldsetForm(Form): """ Extends a standard form and adds fieldsets and the possibililty @@ -41,14 +43,16 @@ self.layout = self.Meta.layout else: self.layout = [["All"]] - self.layout[0][1:]=(self.fields.keys()) - + self.layout[0][1:] = (self.fields.keys()) + def as_div(self): """Render the form as a set of
s.""" output = "" #Adding Errors - try: output += str(self.errors["NON_FIELD_ERRORS"]) - except: pass + try: + output += str(self.errors["NON_FIELD_ERRORS"]) + except: + pass #create the fieldsets for index in range(len(self.layout)): output += self.create_fieldset(self.layout[index]) @@ -61,9 +65,10 @@ it should include. """ # Create the divs in each fieldset by calling create_divs. - return u'
%s%s
' % (field[0], + return u'
%s%s
' % ( + field[0], self.create_divs(field[1:])) - + def create_divs(self, fields): """Create a
for each field.""" output = "" @@ -73,17 +78,18 @@ field_instance = self.fields[field] except KeyError: # could not create the instance so throw an exception - # msg on a separate line since the line got too long + # msg on a separate line since the line got too long # otherwise msg = "Could not resolve form field '%s'." % field raise FieldsetError(msg) - # create a bound field containing all the necessary fields + # create a bound field containing all the necessary fields # from the form bound_field = BoundField(self, field_instance, field) - output += '
%(label)s%(help_text)s%(errors)s%(field)s
\n' % \ - {'class': bound_field.name, - 'label': bound_field.label, - 'help_text': bound_field.help_text, - 'errors': bound_field.errors, - 'field': unicode(bound_field)} + output += '
%(label)s%(help_text)s%' \ + '(errors)s%(field)s
\n' % \ + {'class': bound_field.name, + 'label': bound_field.label, + 'help_text': bound_field.help_text, + 'errors': bound_field.errors, + 'field': unicode(bound_field)} return output diff --git a/src/postorius/forms.py b/src/postorius/forms.py index b340d01..69d2f47 100644 --- a/src/postorius/forms.py +++ b/src/postorius/forms.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 1998-2012 by the Free Software Foundation, Inc. +# Copyright (C) 2012 by the Free Software Foundation, Inc. # # This file is part of Postorius. # @@ -21,31 +21,28 @@ from django.utils.translation import gettext as _ from fieldset_forms import FieldsetForm -#Fieldsets for use within the views + class DomainNew(FieldsetForm): - """ + """ Form field to add a new domain """ mail_host = forms.CharField( - label = _('Mail Host'), - error_messages = {'required': _('Please a domain name'), - 'invalid': _('Please enter a valid domain name.')}, - required = True - ) + label=_('Mail Host'), + error_messages={'required': _('Please a domain name'), + 'invalid': _('Please enter a valid domain name.')}, + required=True) web_host = forms.CharField( - label = _('Web Host'), - error_messages = {'required': _('Please a domain name'), - 'invalid': _('Please enter a valid domain name.')}, - required = True - ) + label=_('Web Host'), + error_messages={'required': _('Please a domain name'), + 'invalid': _('Please enter a valid domain name.')}, + required=True) description = forms.CharField( - label = _('Description'), - required = False - ) + label=_('Description'), + required=False) info = forms.CharField( - label = _('Information'), - required = False - ) + label=_('Information'), + required=False) + def clean_mail_host(self): mail_host = self.cleaned_data['mail_host'] try: @@ -56,85 +53,78 @@ def clean_web_host(self): web_host = self.cleaned_data['web_host'] - try: + try: validate_email('mail@' + web_host) - except: + except: raise forms.ValidationError(_("Please enter a valid Web Host")) return web_host - + class Meta: """ Class to handle the automatic insertion of fieldsets and divs. - - To use it: add a list for each wished fieldset. The first item in - the list should be the wished name of the fieldset, the following + + To use it: add a list for each wished fieldset. The first item in + the list should be the wished name of the fieldset, the following the fields that should be included in the fieldset. """ layout = [["Please enter Details", "mail_host", "web_host", - "description",]] + "description"]] - + class ListNew(FieldsetForm): """ - Form fields to add a new list. Languages are hard coded which should + Form fields to add a new list. Languages are hard coded which should be replaced by a REST lookup of available languages. - """ + """ listname = forms.CharField( - label = _('List Name'), - required = True, - error_messages = {'required': _('Please enter a name for your list.'), - 'invalid': _('Please enter a valid list name.')} - ) - + label=_('List Name'), + required=True, + error_messages={'required': _('Please enter a name for your list.'), + 'invalid': _('Please enter a valid list name.')}) mail_host = forms.ChoiceField() - list_owner = forms.EmailField( - label = _('Inital list owner address'), - error_messages = { - 'required': _("Please enter the list owner's email address."), - }, - required = True) + label=_('Inital list owner address'), + error_messages={ + 'required': _("Please enter the list owner's email address.")}, + required=True) advertised = forms.ChoiceField( - widget = forms.RadioSelect(), - label = _('Advertise this list?'), - error_messages = { - 'required': _("Please choose a list type."), - }, - required = True, - choices = ( + widget=forms.RadioSelect(), + label=_('Advertise this list?'), + error_messages={ + 'required': _("Please choose a list type.")}, + required=True, + choices=( (True, _("Advertise this list in list index")), - (False, _("Hide this list in list index")), - )) + (False, _("Hide this list in list index")))) description = forms.CharField( - label = _('Description'), - required = True) + label=_('Description'), + required=True) - def __init__(self,domain_choices, *args, **kwargs): - super(ListNew, self).__init__(*args, **kwargs) + def __init__(self, domain_choices, *args, **kwargs): + super(ListNew, self).__init__(*args, **kwargs) self.fields["mail_host"] = forms.ChoiceField( - widget = forms.Select(), - label = _('Mail Host'), - required = True, - choices = domain_choices, - error_messages = {'required': _("Choose an existing Domain."), - 'invalid':"ERROR-todo_forms.py" }#todo - ) - + widget=forms.Select(), + label=_('Mail Host'), + required=True, + choices=domain_choices, + error_messages={'required': _("Choose an existing Domain."), + 'invalid': "ERROR-todo_forms.py"}) + def clean_listname(self): - try: - validate_email(self.cleaned_data['listname']+'@example.net') - except: + try: + validate_email(self.cleaned_data['listname'] + '@example.net') + except: raise forms.ValidationError(_("Please enter a valid listname")) return self.cleaned_data['listname'] class Meta: """ Class to handle the automatic insertion of fieldsets and divs. - - To use it: add a list for each wished fieldset. The first item in - the list should be the wished name of the fieldset, the following + + To use it: add a list for each wished fieldset. The first item in + the list should be the wished name of the fieldset, the following the fields that should be included in the fieldset. """ layout = [["List Details", @@ -142,610 +132,527 @@ "mail_host", "list_owner", "description", - "advertised"],] + "advertised"], ] + class ListSubscribe(FieldsetForm): """Form fields to join an existing list. """ - email = forms.EmailField(label = _('Your email address'), - widget = forms.HiddenInput(), - error_messages = {'required': _('Please enter an email address.'), - 'invalid': _('Please enter a valid email address.')}) + email = forms.EmailField( + label=_('Your email address'), + widget=forms.HiddenInput(), + error_messages={'required': _('Please enter an email address.'), + 'invalid': _('Please enter a valid email address.')}) display_name = forms.CharField(label=_('Your name (optional)'), required=False) - + + class ListUnsubscribe(FieldsetForm): """Form fields to leave an existing list. """ - email = forms.EmailField(label = _('Your email address'), - widget = forms.HiddenInput(), - error_messages = { - 'required': _('Please enter an email address.'), + email = forms.EmailField( + label=_('Your email address'), + widget=forms.HiddenInput(), + error_messages={ + 'required': _('Please enter an email address.'), 'invalid': _('Please enter a valid email address.')}) + class ListSettings(FieldsetForm): """Form fields dealing with the list settings. """ choices = ((True, _('Yes')), (False, _('No'))) list_name = forms.CharField( - label = _('List Name'), - required = False, - ) + label=_('List Name'), + required=False) host_name = forms.CharField( - label = _('Domain host name'), - required = False, - ) + label=_('Domain host name'), + required=False) fqdn_listname = forms.CharField( - label = _('Fqdn listname'), - required = False, - ) + label=_('Fqdn listname'), + required=False) include_list_post_header = forms.TypedChoiceField( - coerce=lambda x: x =='True', + coerce=lambda x: x == 'True', choices=((True, _('Yes')), (False, _('No'))), - widget = forms.RadioSelect, - required = False, - label = _('Include list post header'), - ) + widget=forms.RadioSelect, + required=False, + label= _('Include list post header')) include_rfc2369_headers = forms.TypedChoiceField( - coerce=lambda x: x =='True', + coerce=lambda x: x == 'True', choices=((True, _('Yes')), (False, _('No'))), - widget = forms.RadioSelect, - required = False, - label = _('Include RFC2369 headers'), - ) + widget=forms.RadioSelect, + required=False, + label= _('Include RFC2369 headers')) autorespond_choices = ( ("none", _("No automatic response")), ("respond_and_discard", _("Respond and discard message")), - ("respond_and_continue", _("Respond and continue processing")), - ) + ("respond_and_continue", _("Respond and continue processing"))) autorespond_owner = forms.ChoiceField( - choices = autorespond_choices, - widget = forms.RadioSelect, - label = _('Autorespond to list owner'), - ) + choices=autorespond_choices, + widget=forms.RadioSelect, + label=_('Autorespond to list owner')) autoresponse_owner_text = forms.CharField( - label = _('Autoresponse owner text'), - widget = forms.Textarea(), - required = False, - ) + label=_('Autoresponse owner text'), + widget=forms.Textarea(), + required=False) autorespond_postings = forms.ChoiceField( - choices = autorespond_choices, - widget = forms.RadioSelect, - label = _('Autorespond postings'), - ) + choices=autorespond_choices, + widget=forms.RadioSelect, + label=_('Autorespond postings')) autoresponse_postings_text = forms.CharField( - label = _('Autoresponse postings text'), - widget = forms.Textarea(), - required = False, - ) + label=_('Autoresponse postings text'), + widget=forms.Textarea(), + required=False) autorespond_requests = forms.ChoiceField( - choices = autorespond_choices, - widget = forms.RadioSelect, - label = _('Autorespond requests'), - ) + choices=autorespond_choices, + widget=forms.RadioSelect, + label=_('Autorespond requests')) autoresponse_request_text = forms.CharField( - label = _('Autoresponse request text'), - widget = forms.Textarea(), - required = False, - ) + label=_('Autoresponse request text'), + widget=forms.Textarea(), + required=False) autoresponse_grace_period = forms.CharField( - label = _('Autoresponse grace period'), - ) + label=_('Autoresponse grace period')) bounces_address = forms.EmailField( - label = _('Bounces Address'), - required = False, - ) - #ban_list = forms.CharField( - #label = _('Ban list'), - #widget = forms.Textarea - #) - #bounce_info_stale_after = forms.CharField( - #label = _('Bounce info stale after'), - #) - #bounce_matching_headers = forms.CharField( - #label = _('Bounce matching headers'), - #) - #bounce_notify_owner_on_disable = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Bounce notify owner on disable'), - #) - #bounce_notify_owner_on_removal = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Bounce notify owner on removal'), - #) - #bounce_processing = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Bounce processing'), - #) - #bounce_score_threshold = forms.IntegerField( - #label = _('Bounce score threshold'), - #error_messages = { - #'invalid': _('Please provide an integer.') - #} - #) - #bounce_score_threshold = forms.IntegerField( - #label = _('Bounce score threshold'), - #error_messages = { - #'invalid': _('Please provide an integer.') - #} - #) - #bounce_unrecognized_goes_to_list_owner = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Bounce unrecognized goes to list owner'), - #) - #bounce_you_are_disabled_warnings = forms.IntegerField( - #label = _('Bounce you are disabled warnings'), - #error_messages = { - #'invalid': _('Please provide an integer.') - #} - #) - #bounce_you_are_disabled_warnings_interval = forms.CharField( - #label = _('Bounce you are disabled warnings interval'), - #) - #archive = forms.BooleanField( - #widget = forms.RadioSelect(choices=choices), - #required = False, - #label = _('Archive'), - #) - #archive_private = forms.BooleanField( - #widget = forms.RadioSelect(choices=choices), - #required = False, - #label = _('Private Archive'), - #) + label=_('Bounces Address'), + required=False) + # ban_list = forms.CharField( + # label=_('Ban list'), + # widget=forms.Textarea) + # bounce_info_stale_after = forms.CharField( + # label=_('Bounce info stale after') ) + # bounce_matching_headers = forms.CharField( + # label=_('Bounce matching headers')) + # bounce_notify_owner_on_disable = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Bounce notify owner on disable')) + # bounce_notify_owner_on_removal = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Bounce notify owner on removal')) + # bounce_processing = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Bounce processing')) + # bounce_score_threshold = forms.IntegerField( + # label=_('Bounce score threshold'), + # error_messages={ + # 'invalid': _('Please provide an integer.')}) + # bounce_score_threshold = forms.IntegerField( + # label=_('Bounce score threshold'), + # error_messages={ + # 'invalid': _('Please provide an integer.')}) + # bounce_unrecognized_goes_to_list_owner = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Bounce unrecognized goes to list owner')) + # bounce_you_are_disabled_warnings = forms.IntegerField( + # label=_('Bounce you are disabled warnings'), + # error_messages={ + # 'invalid': _('Please provide an integer.')}) + # bounce_you_are_disabled_warnings_interval = forms.CharField( + # label=_('Bounce you are disabled warnings interval')) + # archive = forms.BooleanField( + # widget=forms.RadioSelect(choices=choices), + # required=False, + # label=_('Archive')) + # archive_private = forms.BooleanField( + # widget=forms.RadioSelect(choices=choices), + # required=False, + # label=_('Private Archive')) advertised = forms.TypedChoiceField( - coerce=lambda x: x =='True', + coerce=lambda x: x == 'True', choices=((True, _('Yes')), (False, _('No'))), - widget = forms.RadioSelect, - label = _('Advertise the existance of this list?'), - ) + widget=forms.RadioSelect, + label=_('Advertise the existance of this list?')) filter_content = forms.TypedChoiceField( - coerce=lambda x: x =='True', + coerce=lambda x: x == 'True', choices=((True, _('Yes')), (False, _('No'))), - widget = forms.RadioSelect, - required = False, - label = _('Filter content'), - ) + widget=forms.RadioSelect, + required=False, + label=_('Filter content')) collapse_alternatives = forms.TypedChoiceField( - coerce=lambda x: x =='True', + coerce=lambda x: x == 'True', choices=((True, _('Yes')), (False, _('No'))), - widget = forms.RadioSelect, - required = False, - label = _('Collapse alternatives'), - ) + widget=forms.RadioSelect, + required=False, + label=_('Collapse alternatives')) convert_html_to_plaintext = forms.TypedChoiceField( - coerce=lambda x: x =='True', + coerce=lambda x: x == 'True', choices=((True, _('Yes')), (False, _('No'))), - widget = forms.RadioSelect, - required = False, - label = _('Convert html to plaintext'), - ) - #default_member_moderation = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Default member moderation'), - #) + widget=forms.RadioSelect, + required=False, + label=_('Convert html to plaintext')) + # default_member_moderation = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Default member moderation')) action_choices = ( ("hold", _("Hold for moderator")), ("reject", _("Reject (with notification)")), ("discard", _("Discard (no notification)")), ("accept", _("Accept")), - ("defer", _("Defer")), - ) + ("defer", _("Defer"))) default_member_action = forms.ChoiceField( - widget = forms.RadioSelect(), - label = _('Default action to take when a member posts to the list: '), - error_messages = { - 'required': _("Please choose a default member action."), - }, - required = True, - choices = action_choices, - ) + widget=forms.RadioSelect(), + label=_('Default action to take when a member posts to the list: '), + error_messages={ + 'required': _("Please choose a default member action.")}, + required=True, + choices=action_choices) default_nonmember_action = forms.ChoiceField( - widget = forms.RadioSelect(), - label = _('Default action to take when a non-member posts to the list: '), - error_messages = { - 'required': _("Please choose a default non-member action."), - }, - required = True, - choices = action_choices, - ) + widget=forms.RadioSelect(), + label=_('Default action to take when a non-member posts to the' + 'list: '), + error_messages={ + 'required': _("Please choose a default non-member action.")}, + required=True, + choices=action_choices) description = forms.CharField( - label = _('Description'), - widget = forms.Textarea() - ) - #digest_footer = forms.CharField( - #label = _('Digest footer'), - #) - #digest_header = forms.CharField( - #label = _('Digest header'), - #) - #digest_is_default = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Digest is default'), - #) - #digest_send_periodic = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Digest send periodic'), - #) + label=_('Description'), + widget=forms.Textarea()) + # digest_footer = forms.CharField( + # label=_('Digest footer')) + # digest_header = forms.CharField( + # label=_('Digest header')) + # digest_is_default = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Digest is default')) + # digest_send_periodic = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Digest send periodic')) digest_size_threshold = forms.DecimalField( - label = _('Digest size threshold'), + label=_('Digest size threshold'), ) - #digest_volume_frequency = forms.CharField( - #label = _('Digest volume frequency'), - #) - #digestable = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Digestable'), - #) + # digest_volume_frequency = forms.CharField( + # label=_('Digest volume frequency')) + # digestable = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Digestable')) digest_last_sent_at = forms.IntegerField( - label = _('Digest last sent at'), - error_messages = { - 'invalid': _('Please provide an integer.'), - }, - required = False, - ) - #discard_these_nonmembers = forms.CharField( - #label = _('Discard these nonmembers'), - #widget = forms.Textarea - #) - #emergency = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Emergency'), - #) - #encode_ascii_prefixes = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Encode ascii prefixes'), - #) + label=_('Digest last sent at'), + error_messages={ + 'invalid': _('Please provide an integer.')}, + required=False) + # discard_these_nonmembers = forms.CharField( + # label=_('Discard these nonmembers'), + # widget=forms.Textarea) + # emergency = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Emergency')) + # encode_ascii_prefixes = forms.BooleanField( + # widget=forms.RadioSelect(choices = choices), + # required=False, + # label=_('Encode ascii prefixes')) #first_strip_reply_to = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('First strip reply to'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('First strip reply to'), #) #forward_auto_discards = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Forward auto discards'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Forward auto discards'), #) #gateway_to_mail = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Gateway to mail'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Gateway to mail'), #) #gateway_to_news = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Gateway to news'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Gateway to news'), #) generic_nonmember_action = forms.IntegerField( - label = _('Generic nonmember action'), - error_messages = { + label=_('Generic nonmember action'), + error_messages={ 'invalid': _('Please provide an integer.') } ) #goodbye_msg = forms.CharField( - #label = _('Goodbye message'), + #label=_('Goodbye message'), #) #header_matches = forms.CharField( - #label = _('Header matches'), - #widget = forms.Textarea + #label=_('Header matches'), + #widget=forms.Textarea #) #hold_these_nonmembers = forms.CharField( - #label = _('Hold these nonmembers'), - #widget = forms.Textarea + #label=_('Hold these nonmembers'), + #widget=forms.Textarea #) #info = forms.CharField( - #label = _('Information'), + #label=_('Information'), #) #linked_newsgroup = forms.CharField( - #label = _('Linked newsgroup'), + #label=_('Linked newsgroup'), #) mail_host = forms.CharField( - label = _('Mail Host'), - error_messages = {'required': _('Please a domain name'), - 'invalid': _('Please enter a valid domain name.')}, - required = True - ) + label=_('Mail Host'), + error_messages={'required': _('Please a domain name'), + 'invalid': _('Please enter a valid domain name.')}, + required=True) #max_days_to_hold = forms.IntegerField( - #label = _('Maximum days to hold'), - #error_messages = { + #label=_('Maximum days to hold'), + #error_messages={ #'invalid': _('Please provide an integer.') #} #) #max_message_size = forms.IntegerField( - #label = _('Maximum message size'), - #error_messages = { + #label=_('Maximum message size'), + #error_messages={ #'invalid': _('Please provide an integer.') #} #) #max_num_recipients = forms.IntegerField( - #label = _('Maximum number of recipients'), - #error_messages = { + #label=_('Maximum number of recipients'), + #error_messages={ #'invalid': _('Please provide an integer.') #} #) #member_moderation_action = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Member moderation action'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Member moderation action'), #) #member_moderation_notice = forms.CharField( - #label = _('Member moderation notice'), + #label=_('Member moderation notice'), #) #mime_is_default_digest = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Mime is default digest'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Mime is default digest'), #) #moderator_password = forms.CharField( - #label = _('Moderator password'), - #widget = forms.PasswordInput, - #error_messages = {'required': _('Please enter your password.'), + #label=_('Moderator password'), + #widget=forms.PasswordInput, + #error_messages={'required': _('Please enter your password.'), #'invalid': _('Please enter a valid password.')}, #) #msg_footer = forms.CharField( - #label = _('Message footer'), + #label=_('Message footer'), #) #msg_header = forms.CharField( - #label = _('Message header'), + #label=_('Message header'), #) #new_member_options = forms.IntegerField( - #label = _('New member options'), - #error_messages = { + #label=_('New member options'), + #error_messages={ #'invalid': _('Please provide an integer.') #} #) #news_moderation = forms.CharField( - #label = _('News moderation'), + #label=_('News moderation'), #) #news_prefix_subject_too = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('News prefix subject too'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('News prefix subject too'), #) #nntp_host = forms.CharField( - #label = _('Nntp host'), + #label=_('Nntp host'), #) #nondigestable = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Nondigestable'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Nondigestable'), #) #nonmember_rejection_notice = forms.CharField( - #label = _('Nonmember rejection notice'), + #label=_('Nonmember rejection notice'), #) next_digest_number = forms.IntegerField( - label = _('Next digest number'), - error_messages = { + label=_('Next digest number'), + error_messages={ 'invalid': _('Please provide an integer.'), }, - required = False, + required=False, ) no_reply_address = forms.EmailField( - label = _('No reply address'), - required = False, + label=_('No reply address'), + required=False, ) #obscure_addresses = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Obscure addresses'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Obscure addresses'), #) #personalize = forms.CharField( - #label = _('Personalize'), + #label=_('Personalize'), #) posting_pipeline = forms.CharField( - label = _('Pipeline'), + label=_('Pipeline'), ) post_id = forms.IntegerField( - label = _('Post ID'), - error_messages = { + label=_('Post ID'), + error_messages={ 'invalid': _('Please provide an integer.'), }, - required = False, + required=False, ) #preferred_language = forms.CharField( - #label = _('Preferred language'), + #label=_('Preferred language'), #) #private_roster = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Private roster'), + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Private roster'), #) display_name = forms.CharField( - label = _('Display name'), + label=_('Display name'), ) #reject_these_nonmembers = forms.CharField( - #label = _('Reject these nonmembers'), - #widget = forms.Textarea + #label=_('Reject these nonmembers'), + #widget=forms.Textarea #) - reply_goes_to_list = forms.ChoiceField( - label = _('Reply goes to list'), - widget = forms.Select(), - error_messages = { - 'required': _("Please choose a reply-to action."), - }, - choices = ( + label=_('Reply goes to list'), + widget=forms.Select(), + error_messages={ + 'required': _("Please choose a reply-to action.")}, + choices=( ("no_munging", _("No Munging")), ("point_to_list", _("Reply goes to list")), - ("explicit_header", _("Explicit Reply-to header set")), - ), - ) + ("explicit_header", _("Explicit Reply-to header set")))) #reply_to_address = forms.EmailField( - #label = _('Reply to address'), - #) + #label=_('Reply to address')) #require_explicit_destination = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Require explicit destination'), - #) + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Require explicit destination')) #respond_to_post_requests = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Respond to post requests'), - #) + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Respond to post requests')) request_address = forms.EmailField( - label = _('Request address'), - required = False, - ) + label=_('Request address'), + required=False) #scrub_nondigest = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Scrub nondigest'), - #) + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Scrub nondigest')) #send_goodbye_msg = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Send goodbye message'), - #) + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Send goodbye message')) #send_reminders = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Send reminders'), - #) + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Send reminders')) send_welcome_message = forms.TypedChoiceField( - coerce=lambda x: x =='True', + coerce=lambda x: x == 'True', choices=((True, _('Yes')), (False, _('No'))), - widget = forms.RadioSelect, - required = False, - label = _('Send welcome message'), - ) + widget=forms.RadioSelect, + required=False, + label=_('Send welcome message')) #start_chain = forms.CharField( - #label = _('Start chain'), - #) + #label=_('Start chain')) #subject_prefix = forms.CharField( - #label = _('Subject prefix'), - #) + #label=_('Subject prefix')) #subscribe_auto_approval = forms.CharField( - #label = _('Subscribe auto approval'), - #widget = forms.Textarea - #) + #label=_('Subscribe auto approval'), + #widget=forms.Textarea) #subscribe_policy = forms.IntegerField( - #label = _('Subscribe policy'), - #error_messages = { - #'invalid': _('Please provide an integer.') - #} - #) + #label=_('Subscribe policy'), + #error_messages={ + #'invalid': _('Please provide an integer.')}) scheme = forms.CharField( - label = _('Scheme'), - required = False, - ) + label=_('Scheme'), + required=False) #topics = forms.CharField( - #label = _('Topics'), - #widget = forms.Textarea - #) + #label=_('Topics'), + #widget=forms.Textarea) #topics_bodylines_limit = forms.IntegerField( - #label = _('Topics bodylines limit'), - #error_messages = { - #'invalid': _('Please provide an integer.') - #} - #) + #label=_('Topics bodylines limit'), + #error_messages={ + #'invalid': _('Please provide an integer.')}) #topics_enabled = forms.BooleanField( - #widget = forms.RadioSelect(choices = choices), - #required = False, - #label = _('Topics enabled'), - #) + #widget=forms.RadioSelect(choices = choices), + #required=False, + #label=_('Topics enabled')#) #unsubscribe_policy = forms.IntegerField( - #label = _('Unsubscribe policy'), - #error_messages = { - #'invalid': _('Please provide an integer.') - #} - #) + #label=_('Unsubscribe policy'), + #error_messages={ + #'invalid': _('Please provide an integer.')}) #welcome_msg = forms.CharField( - #label = _('Welcome message'), - #) + #label=_('Welcome message')) #volume = forms.IntegerField( - # label = _('Volume'), - # required = False, - #) + # label=_('Volume'), + # required=False) #web_host = forms.CharField( - # label = _('Web host'), - # required = False, - #) + # label=_('Web host'), + # required=False) acceptable_aliases = forms.CharField( - widget = forms.Textarea(), - label = _("Acceptable aliases"), - required = False, - ) + widget=forms.Textarea(), + label=_("Acceptable aliases"), + required=False) admin_immed_notify = forms.BooleanField( - widget = forms.RadioSelect(choices = choices), - required = False, - label = _('Admin immed notify'), - ) + widget=forms.RadioSelect(choices=choices), + required=False, + label=_('Admin immed notify')) admin_notify_mchanges = forms.BooleanField( - widget = forms.RadioSelect(choices = choices), - required = False, - label = _('Admin notify mchanges'), - ) + widget=forms.RadioSelect(choices=choices), + required=False, + label=_('Admin notify mchanges')) administrivia = forms.BooleanField( - widget = forms.RadioSelect(choices = choices), - required = False, - label = _('Administrivia'), - ) + widget=forms.RadioSelect(choices=choices), + required=False, + label=_('Administrivia')) anonymous_list = forms.TypedChoiceField( - coerce=lambda x: x =='True', + coerce=lambda x: x == 'True', choices=((True, _('Yes')), (False, _('No'))), - widget = forms.RadioSelect, - required = False, - label = _('Anonymous list'), - ) + widget=forms.RadioSelect, + required=False, + label=_('Anonymous list')) created_at = forms.IntegerField( - label = _('Created at'), - widget = forms.HiddenInput(), - required = False, - ) + label=_('Created at'), + widget=forms.HiddenInput(), + required=False) join_address = forms.EmailField( - label = _('Join address'), - required = False, - ) + label=_('Join address'), + required=False) last_post_at = forms.IntegerField( - label = _('Last post at'), - required = False, - ) + label=_('Last post at'), + required=False) leave_address = forms.EmailField( - label = _('Leave address'), - required = False, - ) + label=_('Leave address'), + required=False) owner_address = forms.EmailField( - label = _('Owner Address'), - required = False, - ) + label=_('Owner Address'), + required=False) posting_address = forms.EmailField( - label = _('Posting Address'), - required = False, - ) + label=_('Posting Address'), + required=False) #Descriptions used in the Settings Overview Page section_descriptions = { - "List Identity":_("Basic identity settings for the list"), - "Automatic Responses":_("All options for Autoreply"), - "Alter Messages":_("Settings that modify member messages"), + "List Identity": _("Basic identity settings for the list"), + "Automatic Responses": _("All options for Autoreply"), + "Alter Messages": _("Settings that modify member messages"), "Digest": _("Digest-related options"), - "Message Acceptance": _("Options related to accepting messages"), - } + "Message Acceptance": _("Options related to accepting messages")} + def clean_acceptable_aliases(self): data = self.cleaned_data['acceptable_aliases'] return data.splitlines() - def __init__(self,visible_section,visible_option, *args, **kwargs): - super(ListSettings, self).__init__(*args, **kwargs) - #if settings:raise Exception(settings) #debug + + def __init__(self, visible_section, visible_option, *args, **kwargs): + super(ListSettings, self).__init__(*args, **kwargs) + # if settings: + # raise Exception(settings) # debug if visible_option: - options=[] + options = [] for option in self.layout: options += option[1:] if visible_option in options: - self.layout = [["",visible_option]] + self.layout = [["", visible_option]] if visible_section: - sections=[] + sections = [] for section in self.layout: - sections.append(section[0]) + sections.append(section[0]) if visible_section in sections: for section in self.layout: if section[0] == visible_section: @@ -753,127 +660,79 @@ try: if data: for section in self.layout: - for option in section[1:]: + for option in section[1:]: self.fields[option].initial = settings[option] except: - pass #empty form + pass # empty form + def truncate(self): """ - truncates the form to have only those fields which are in self.layout + truncates the form to have only those fields which are in self.layout """ - #delete form.fields which are not in the layout - used_options=[] + # delete form.fields which are not in the layout + used_options = [] for section in self.layout: used_options += section[1:] - + for key in self.fields.keys(): if not(key in used_options): - del self.fields[key] - + del self.fields[key] + class Meta: """Class to handle the automatic insertion of fieldsets and divs. - - To use it: add a list for each wished fieldset. The first item in - the list should be the wished name of the fieldset, the following + + To use it: add a list for each wished fieldset. The first item in + the list should be the wished name of the fieldset, the following the fields that should be included in the fieldset. - """ + """ # just a really temporary layout to see that it works. -- Anna layout = [ - ["List Identity", "display_name", "mail_host", "description", - "advertised"], - #"info", "list_name", "host_name", "list_id", "fqdn_listname", - #"http_etag", "volume", "web_host" + ["List Identity", "display_name", "mail_host", "description", + "advertised"], ["Automatic Responses", "autorespond_owner", "autoresponse_owner_text", "autorespond_postings", "autoresponse_postings_text", "autorespond_requests", "autoresponse_request_text", "autoresponse_grace_period", "send_welcome_message", "admin_immed_notify", "admin_notify_mchanges"], - ["Alter Messages", "filter_content", "collapse_alternatives", + ["Alter Messages", "filter_content", "collapse_alternatives", "convert_html_to_plaintext", "anonymous_list", "include_rfc2369_headers", "reply_goes_to_list", - "include_list_post_header", "posting_pipeline"], + "include_list_post_header", "posting_pipeline"], ["Digest", "digest_size_threshold"], - ["Message Acceptance", "acceptable_aliases", "administrivia", - "default_nonmember_action", "default_member_action"], - #["Bounce", "ban_list", - #"bounce_info_stale_after", "bounce_matching_headers", - # "bounce_notify_owner_on_disable", - #"bounce_notify_owner_on_removal", "bounce_processing", - #"bounce_score_threshold", - #"bounce_unrecognized_goes_to_list_owner", - #"bounce_you_are_disabled_warnings", - #"bounce_you_are_disabled_warnings_interval"], - #["Archiving", "archive"], - #["Content Filtering", "filter_content", "collapse_alternatives", - #"convert_html_to_plaintext"], - #"default_member_moderation", "scheme" - #["Digest", "digest_size_threshold"], #"next_digest_number", - #"last_post_at", "digest_last_sent_at", "digest_footer", - #"digest_header", "digest_is_default", - #"digest_send_periodic", "digest_size_threshold", - #"digest_volume_frequency", "digestable"], - #["Moderation","discard_these_nonmembers", "emergency", - #"generic_nonmember_action", "generic_nonmember_action", - #"member_moderation_action", "member_moderation_notice", - #"moderator_password", "hold_these_nonmembers"], - #["Message Text", "msg_header", "msg_footer", "welcome_msg", - #"goodbye_msg"], - #["Privacy", "advertised", "admin_immed_notify", - # "admin_notify_mchanges", "anonymous_list"], #"archive_private", - #"obscure_addresses", "private_roster", - #["Addresses", "bounces_address", "join_address", "leave_address", - #"no_reply_address", "owner_address", "posting_address", - #"request_address"], - #["Assorted", "acceptable_aliases", "administrivia", - #"posting_pipeline"] - #"post_id", "encode_ascii_prefixes", "first_strip_reply_to", - #"forward_auto_discards", "gateway_to_mail", "gateway_to_news", - #"header_matches", "linked_newsgroup", "max_days_to_hold", - #"max_message_size", "max_num_recipients", - #"mime_is_default_digest", "new_member_options", - #"news_moderation", "news_prefix_subject_too", "nntp_host", - #"nondigestable", "nonmember_rejection_notice", "personalize", - #"preferred_language", - #"reject_these_nonmembers", "reply_goes_to_list", - #"reply_to_address", "require_explicit_destination", - #"respond_to_post_requests", "scrub_nondigest", - #"send_goodbye_msg", "send_reminders", "send_welcome_msg", - #"start_chain", "subject_prefix", "subscribe_auto_approval", - #"subscribe_policy", "topics", "topics_bodylines_limit", - #"topics_enabled", "unsubscribe_policy"]] - ] + ["Message Acceptance", "acceptable_aliases", "administrivia", + "default_nonmember_action", "default_member_action"]] + class Login(FieldsetForm): """Form fields to let the user log in. """ user = forms.EmailField( - label = _('Email address'), - error_messages = {'required': _('Please enter an email address.'), - 'invalid': _('Please enter a valid email address.')}, - required = True, - ) + label=_('Email address'), + error_messages={'required': _('Please enter an email address.'), + 'invalid': _('Please enter a valid email address.')}, + required=True) password = forms.CharField( - label = _('Password'), - widget = forms.PasswordInput, - error_messages = {'required': _('Please enter your password.'), - 'invalid': _('Please enter a valid password.')}, - required = True, - ) + label=_('Password'), + widget=forms.PasswordInput, + error_messages={'required': _('Please enter your password.'), + 'invalid': _('Please enter a valid password.')}, + required=True) class Meta: """ Class to define the name of the fieldsets and what should be included in each. """ - layout = [["Login", "user", "password"],] + layout = [["Login", "user", "password"]] + class ListMassSubscription(FieldsetForm): """Form fields to masssubscribe users to a list. """ emails = forms.CharField( - label = _('Emails to mass subscribe'), - widget = forms.Textarea, + label=_('Emails to mass subscribe'), + widget=forms.Textarea, ) class Meta: @@ -881,142 +740,118 @@ Class to define the name of the fieldsets and what should be included in each. """ - layout = [["Mass subscription", "emails"],] + layout = [["Mass subscription", "emails"]] + class MembershipSettings(FieldsetForm): """Form handling the membership settings. """ - choices = ((True, _('Yes')), (False, _('No')),) + choices = ((True, _('Yes')), (False, _('No'))) acknowledge_posts = forms.BooleanField( - widget = forms.RadioSelect(choices = choices), - required = False, - label = _('Acknowledge posts'), - ) + widget=forms.RadioSelect(choices=choices), + required=False, + label=_('Acknowledge posts')) hide_address = forms.BooleanField( - widget = forms.RadioSelect(choices = choices), - required = False, - label = _('Hide address'), - ) + widget=forms.RadioSelect(choices=choices), + required=False, + label=_('Hide address')) receive_list_copy = forms.BooleanField( - widget = forms.RadioSelect(choices = choices), - required = False, - label = _('Receive list copy'), - ) + widget=forms.RadioSelect(choices=choices), + required=False, + label=_('Receive list copy')) receive_own_postings = forms.BooleanField( - widget = forms.RadioSelect(choices = choices), - required = False, - label = _('Receive own postings'), - ) + widget=forms.RadioSelect(choices=choices), + required=False, + label=_('Receive own postings')) delivery_mode = forms.ChoiceField( - widget = forms.Select(), - error_messages = { - 'required': _("Please choose a mode."), - }, - required = False, - choices = ( + widget=forms.Select(), + error_messages={ + 'required': _("Please choose a mode.")}, + required=False, + choices=( ("", _("Please choose")), - ("delivery_mode", "some mode..."), # TODO: this must later - # be dynalically changed to what modes the list offers - # (see the address field in __init__ in UserSettings for - # how to do this) - ), - label = _('Delivery mode'), - ) + ("delivery_mode", "some mode...")), + label=_('Delivery mode')) delivery_status = forms.ChoiceField( - widget = forms.Select(), - error_messages = { - 'required': _("Please choose a status."), - }, - required = False, - choices = ( + widget=forms.Select(), + error_messages={ + 'required': _("Please choose a status.")}, + required=False, + choices=( ("", _("Please choose")), - ("delivery_status", "some status..."), # TODO: this must - # later be dynalically changed to what statuses the list - # offers (see the address field in __init__ in UserSettings - # for how to do this) - ), - label = _('Delivery status'), - ) + ("delivery_status", "some status...")), + label=_('Delivery status')) class Meta: """ Class to define the name of the fieldsets and what should be included in each. """ - layout = [["Membership Settings", "acknowledge_posts", "hide_address", - "receive_list_copy", "receive_own_postings", - "delivery_mode", "delivery_status"],] + layout = [["Membership Settings", "acknowledge_posts", "hide_address", + "receive_list_copy", "receive_own_postings", + "delivery_mode", "delivery_status"]] + class UserSettings(FieldsetForm): """Form handling the user settings. """ def __init__(self, address_choices, *args, **kwargs): """ - Initialize the user settings with a field 'address' where + Initialize the user settings with a field 'address' where the values are set dynamically in the view. """ super(UserSettings, self).__init__(*args, **kwargs) - self.fields['address'] = forms.ChoiceField(choices=(address_choices), - widget = forms.Select(), - error_messages = {'required': _("Please choose an address."),}, - required = True, - label = _('Default email address'),) - - id = forms.IntegerField( # this should probably not be - # changeable... - label = _('ID'), - initial = 9, - widget = forms.HiddenInput(), - required = False, - error_messages = { - 'invalid': _('Please provide an integer ID.') - } - ) - mailing_list = forms.CharField( # not sure this needs to be here - label = _('Mailing list'), - widget = forms.HiddenInput(), - required = False, - ) - display_name =forms.CharField( - label = _('Display name'), - required = False, - ) + self.fields['address'] = forms.ChoiceField( + choices=(address_choices), + widget=forms.Select(), + error_messages={'required': _("Please choose an address.")}, + required=True, + label=_('Default email address')) + + id = forms.IntegerField( + label=_('ID'), + initial=9, + widget=forms.HiddenInput(), + required=False, + error_messages={ + 'invalid': _('Please provide an integer ID.')}) + mailing_list = forms.CharField( + label=_('Mailing list'), + widget=forms.HiddenInput(), + required=False) + display_name = forms.CharField( + label=_('Display name'), + required=False) preferred_language = forms.ChoiceField( - label = _('Default/Preferred language'), - widget = forms.Select(), - error_messages = { - 'required': _("Please choose a language."), - }, - required = False, - choices = ( + label=_('Default/Preferred language'), + widget=forms.Select(), + error_messages={ + 'required': _("Please choose a language.")}, + required=False, + choices=( ("", _("Please choose")), - ("English (USA)", "English (USA)"), # TODO: this must later - # be dynalically changed to what languages the list offers - # (see the address field in __init__ for how to do this) - ) - ) + ("English (USA)", "English (USA)"))) password = forms.CharField( - label = _('Change password'), - widget = forms.PasswordInput, - required = False, - error_messages = {'required': _('Please enter your password.'), - 'invalid': _('Please enter a valid password.')}, - ) + label=_('Change password'), + widget=forms.PasswordInput, + required=False, + error_messages={'required': _('Please enter your password.'), + 'invalid': _('Please enter a valid password.')}) conf_password = forms.CharField( - label = _('Confirm password'), - widget = forms.PasswordInput, - required = False, - error_messages = {'required': _('Please enter your password.'), - 'invalid': _('Please enter a valid password.')}, - ) + label=_('Confirm password'), + widget=forms.PasswordInput, + required=False, + error_messages={'required': _('Please enter your password.'), + 'invalid': _('Please enter a valid password.')}) class Meta: """ Class to define the name of the fieldsets and what should be included in each. """ - layout = [["User settings", "display_name", "password", - "conf_password", "preferred_language", "address"],] + layout = [["User settings", "display_name", "password", + "conf_password", "preferred_language", "address"]] + class ListDeleteForm(forms.Form): list_name = forms.EmailField(widget=forms.HiddenInput()) diff --git a/src/postorius/tests/__init__.py b/src/postorius/tests/__init__.py index 58acd95..e09dc1e 100644 --- a/src/postorius/tests/__init__.py +++ b/src/postorius/tests/__init__.py @@ -7,7 +7,7 @@ # the terms of the GNU General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) # any later version. -# Postorius is distributed in the hope that it will be useful, but WITHOUT +# Postorius is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. diff --git a/src/postorius/tests/setup.py b/src/postorius/tests/setup.py index f334c07..ed533f4 100644 --- a/src/postorius/tests/setup.py +++ b/src/postorius/tests/setup.py @@ -23,11 +23,13 @@ import subprocess from django.conf import settings + class Testobject: bindir = None vardir = None cfgfile = None + def setup_mm(testobject): os.environ['MAILMAN_TEST_BINDIR'] = settings.MAILMAN_TEST_BINDIR bindir = testobject.bindir = os.environ.get('MAILMAN_TEST_BINDIR') @@ -37,7 +39,7 @@ cfgfile = testobject.cfgfile = os.path.join(vardir, 'client_test.cfg') with open(cfgfile, 'w') as fp: print >> fp, """\ -[mailman] +[mailman] layout: tmpdir [paths.tmpdir] var_dir: {vardir} @@ -70,6 +72,7 @@ time.sleep(3) return testobject + def teardown_mm(testobject): bindir = testobject.bindir cfgfile = testobject.cfgfile diff --git a/src/postorius/tests/test_list_members.py b/src/postorius/tests/test_list_members.py index 688612a..a23eb69 100644 --- a/src/postorius/tests/test_list_members.py +++ b/src/postorius/tests/test_list_members.py @@ -7,7 +7,7 @@ # the terms of the GNU General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) # any later version. -# Postorius is distributed in the hope that it will be useful, but WITHOUT +# Postorius is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. @@ -22,12 +22,11 @@ class ListMembersViewTest(unittest.TestCase): """Tests for the ListMembersView.""" - + def setUp(self): from django.test.client import RequestFactory from postorius.tests.utils import create_mock_list, create_mock_member self.request_factory = RequestFactory() - # create a mock list with members list_name = 'foolist@example.org' self.mock_list = create_mock_list(dict( @@ -44,7 +43,6 @@ def test_get_list(self): """Test if list members are retreived correctly.""" from postorius.views import ListMembersView - # test get_list view = ListMembersView() with patch('mailman.client.Client.get_list') as mock: @@ -60,18 +58,23 @@ with patch('mailman.client.Client.get_list') as mock: mock.return_value = self.mock_list request = self.request_factory.get( - '/lists/foolist@example.org/members/') + '/lists/foolist@example.org/members/') # anonymous users should be redirected request.user = AnonymousUser() - response = ListMembersView.as_view()(request, 'foolist@example.org') + response = ListMembersView.as_view()(request, + 'foolist@example.org') self.assertEqual(response.status_code, 302) # logged in users should be redirected - request.user = User.objects.create_user('les', 'les@primus.org', 'pwd') - response = ListMembersView.as_view()(request, 'foolist@example.org') + request.user = User.objects.create_user('les', 'les@primus.org', + 'pwd') + response = ListMembersView.as_view()(request, + 'foolist@example.org') self.assertEqual(response.status_code, 302) # superusers should get the page - request.user = User.objects.create_superuser('su', 'su@sodo.org', 'pwd') - response = ListMembersView.as_view()(request, 'foolist@example.org') + request.user = User.objects.create_superuser('su', 'su@sodo.org', + 'pwd') + response = ListMembersView.as_view()(request, + 'foolist@example.org') self.assertEqual(response.status_code, 200) def tearDown(self): diff --git a/src/postorius/tests/test_utils.py b/src/postorius/tests/test_utils.py index db9ca0e..738acca 100644 --- a/src/postorius/tests/test_utils.py +++ b/src/postorius/tests/test_utils.py @@ -7,7 +7,7 @@ # the terms of the GNU General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) # any later version. -# Postorius is distributed in the hope that it will be useful, but WITHOUT +# Postorius is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. diff --git a/src/postorius/tests/utils.py b/src/postorius/tests/utils.py index a6d1831..7dc7a4c 100644 --- a/src/postorius/tests/utils.py +++ b/src/postorius/tests/utils.py @@ -7,7 +7,7 @@ # the terms of the GNU General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) # any later version. -# Postorius is distributed in the hope that it will be useful, but WITHOUT +# Postorius is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. @@ -17,15 +17,16 @@ from mock import patch, MagicMock + def create_mock_domain(properties=None): """Create and return a mocked Domain. - + :param properties: A dictionary of the domain's properties. :type properties: dict :return: A MagicMock object with the properties set. :rtype: MagicMock """ - mock_object = MagicMock(name='Domain') + mock_object = MagicMock(name='Domain') mock_object.base_url = '' mock_object.contact_address = '' mock_object.description = '' @@ -34,33 +35,35 @@ mock_object.lists = [] if properties is not None: for key in properties: - setattr(mock_object, key, properties[key]) + setattr(mock_object, key, properties[key]) return mock_object + def create_mock_list(properties=None): """Create and return a mocked List. - + :param properties: A dictionary of the list's properties. :type properties: dict :return: A MagicMock object with the properties set. :rtype: MagicMock """ - mock_object = MagicMock(name='List') + mock_object = MagicMock(name='List') if properties is not None: for key in properties: - setattr(mock_object, key, properties[key]) + setattr(mock_object, key, properties[key]) return mock_object + def create_mock_member(properties=None): """Create and return a mocked Member. - + :param properties: A dictionary of the member's properties. :type properties: dict :return: A MagicMock object with the properties set. :rtype: MagicMock """ - mock_object = MagicMock(name='Member') + mock_object = MagicMock(name='Member') if properties is not None: for key in properties: - setattr(mock_object, key, properties[key]) + setattr(mock_object, key, properties[key]) return mock_object diff --git a/src/postorius/urls.py b/src/postorius/urls.py index ac0e8d7..927d9a9 100644 --- a/src/postorius/urls.py +++ b/src/postorius/urls.py @@ -23,7 +23,8 @@ from postorius.views import ListMembersView -urlpatterns = patterns('postorius.views', +urlpatterns = patterns( + 'postorius.views', (r'^$', 'list_index'), # /account/ url(r'^accounts/login/$', 'user_login', name='user_login'), @@ -43,8 +44,8 @@ # /lists/ url(r'^lists/$', 'list_index', name='list_index'), url(r'^lists/new/$', 'list_new', name='list_new'), - url(r'^lists/(?P[^/]+)/members/$', ListMembersView.as_view(), - name='list_members'), + url(r'^lists/(?P[^/]+)/members/$', + ListMembersView.as_view(), name='list_members'), url(r'^lists/(?P[^/]+)/metrics$', 'list_metrics', name='list_metrics'), url(r'^lists/(?P[^/]+)/$', 'list_summary', @@ -57,27 +58,21 @@ 'list_subscriptions', name='list_subscriptions'), url(r'^lists/(?P[^/]+)/mass_subscribe/$', 'mass_subscribe', name='mass_subscribe'), - url(r'^lists/(?P[^/]+)/delete$', 'list_delete', - name='list_delete'), - url(r'^lists/(?P[^/]+)/held_messages/(?P[^/]+)/accept$', - 'accept_held_message', - name='accept_held_message'), - url(r'^lists/(?P[^/]+)/held_messages/(?P[^/]+)/discard$', - 'discard_held_message', - name='discard_held_message'), - url(r'^lists/(?P[^/]+)/held_messages/(?P[^/]+)/defer$', - 'defer_held_message', - name='defer_held_message'), - url(r'^lists/(?P[^/]+)/held_messages/(?P[^/]+)/reject$', - 'reject_held_message', - name='reject_held_message'), + url(r'^lists/(?P[^/]+)/delete$', + 'list_delete', name='list_delete'), + url(r'^lists/(?P[^/]+)/held_messages/(?P[^/]+)/' + 'accept$', 'accept_held_message', name='accept_held_message'), + url(r'^lists/(?P[^/]+)/held_messages/(?P[^/]+)/' + 'discard$', 'discard_held_message', name='discard_held_message'), + url(r'^lists/(?P[^/]+)/held_messages/(?P[^/]+)/' + 'defer$', 'defer_held_message', name='defer_held_message'), + url(r'^lists/(?P[^/]+)/held_messages/(?P[^/]+)/' + 'reject$', 'reject_held_message', name='reject_held_message'), url(r'^lists/(?P[^/]+)/held_messages$', - 'list_held_messages', - name='list_held_messages'), + 'list_held_messages', name='list_held_messages'), url(r'^user_settings/$', 'user_settings', kwargs={"tab": "user"}, name='user_settings'), - url(r'^lists/(?P[^/]+)/settings/(?P[^/]+)?(?:/(?P.*))?$', - 'list_settings', name='list_settings'), - ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - - + url(r'^lists/(?P[^/]+)/settings/(?P[^/]+)?' + '(?:/(?P.*))?$', 'list_settings', + name='list_settings'), +) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/src/postorius/utils.py b/src/postorius/utils.py index 698c6b6..b305a5a 100644 --- a/src/postorius/utils.py +++ b/src/postorius/utils.py @@ -22,16 +22,17 @@ def get_domain_name(request): """Extracts a domain name from the request object. - """ + """ if "HTTP_HOST" in request.META.keys(): return request.META["HTTP_HOST"].split(":")[0] return None + def render_api_error(request): """Renders an error template. Use if MailmanApiError is catched. """ - return render_to_response('postorius/errors/generic.html', - {'error': "REST API not found / Offline"}, - context_instance=RequestContext(request)) - + return render_to_response( + 'postorius/errors/generic.html', + {'error': "REST API not found / Offline"}, + context_instance=RequestContext(request))