from utils.forms import NextUrlField, UserNameField, UserEmailField, SetPasswordForm from django import forms from django.forms import ValidationError from models import User as MWUser from models import TITLE_CHOICES from django.contrib.auth.models import User from django.utils.translation import ugettext as _ from django.utils.safestring import mark_safe from django.contrib.formtools.wizard import FormWizard from forum.forms import EditUserEmailFeedsForm, SimpleEmailSubscribeForm from django.forms import ValidationError from recaptcha_django import ReCaptchaField from utils.forms import StrippedNonEmptyCharField from forum.templatetags import extra_tags as forum_extra_tags #make better translations in your language django.po EMAIL_FEED_CHOICES = ( ('y',_('okay, let\'s try!')), ('n',_('no OSQA community email please, thanks')) ) wiki_account_taken_msg = _('Wiki site already has this account, if it is yours perhaps you can ' 'just try to log in with it?
' 'Otherwise, please pick another login name.') class RegisterForm(SetPasswordForm, SimpleEmailSubscribeForm): login_name = UserNameField(label=_('Login name'), \ db_model=MWUser, \ db_field='user_name', \ error_messages={ \ 'required':_('Please enter login name above, it is required for the Wiki site'), \ 'taken': mark_safe(wiki_account_taken_msg) \ } ) next = NextUrlField() email = UserEmailField() screen_name = UserNameField(label=mark_safe(_('Please type your nickname below')), \ skip_clean=True, \ required=False) first_name = StrippedNonEmptyCharField(max_length=255,label=mark_safe(_('First name')), error_messages={'required':_('First name is required')} ) last_name = StrippedNonEmptyCharField(max_length=255,label=_('Last name'), error_messages={'required':_('Last name is required')} ) #cannot be just "title" because there would be a conflict with "title" field used for MW!!! user_title = forms.ChoiceField(choices=TITLE_CHOICES, label=_('Title (optional)')) use_separate_screen_name = forms.BooleanField( label=mark_safe(_('I prefer (or have to) to use a separate forum screen name')), required=False, ) #subscribe = forms.ChoiceField(widget=forms.widgets.RadioSelect, \ # error_messages={'required':_('please choose one of the options above')}, # choices= EMAIL_FEED_CHOICES) recaptcha = ReCaptchaField() class Media: css={'all':(forum_extra_tags.href('/content/style/mediawiki-login.css'),),} js=(forum_extra_tags.href('/content/js/mediawiki-login.js'),) def add_screen_name_error(self, err): if 'screen_name' in self.cleaned_data: del self.cleaned_data['screen_name'] error_list = self._errors.get('screen_name',forms.util.ErrorList([])) if isinstance(err, forms.util.ErrorList): error_list.extend(err) else: error_list.append(err) self._errors['screen_name'] = error_list def clean(self): #this method cleans screen_name and use_separate_screen_name screen_name = self.cleaned_data.get('screen_name', '') if 'use_separate_screen_name' in self.cleaned_data \ and self.cleaned_data['use_separate_screen_name']: if screen_name == '': msg = _('please enter an alternative screen name or uncheck the box above') self.add_screen_name_error(msg) else: try: screen_name = self.fields['screen_name'].clean(screen_name) self.final_clean_screen_name(screen_name) except ValidationError, e: self.add_screen_name_error(e) else: if screen_name != '': self.add_screen_name_error(_('sorry, to use alternative screen name, please confirm it by checking the box above')) else: #build screen name from first and last names first = self.cleaned_data.get('first_name',None) last = self.cleaned_data.get('last_name',None) if first and last: screen_name = u'%s %s' % (first,last) self.final_clean_screen_name(screen_name) return self.cleaned_data def final_clean_screen_name(self,name): try: u = User.objects.get(username=name) msg = _('Screen name %(real_name)s is somehow already taken on the forum.
' 'Unfortunately you will have to pick a separate screen name, but of course ' 'there is no need to change the first name and last name entries.
' 'Please send us your feedback if you feel there might be a mistake. ' 'Sorry for the inconvenience.')\ % {'real_name':name} self.add_screen_name_error(mark_safe(msg)) except: self.cleaned_data['screen_name'] = name #overridden validation for UserNameField def clean_login_name(self): try: MWUser.objects.get(user_name=self.cleaned_data['login_name']) del self.cleaned_data['login_name'] raise ValidationError(_('sorry this login name is already taken, please try another')) except: return self.cleaned_data['login_name'] class RegisterFormWizard(FormWizard): def done(self, request, form_list): data = form_list[0].cleaned_data login_name = data['login_name'] password = data['password'] first_name = data['first_name'] last_name = data['last_name'] screen_name = data['screen_name'] email = data['email'] subscribe = data['subscribe'] next = data['next'] #register mediawiki user mwu = MWUser( user_name=login_name, user_password=password, user_first_name = first_name, user_last_name = last_name, user_email = email ) mwu.save() #register local user User.objects.create_user(screen_name, email, password) u = authenticate(username=screen_name, password=password) u.mediawiki_user = mwu u.save() #save email feed settings EFF = EditUserEmailFeedsForm if subscribe == 'y': email_settings_form = EFF() else: email_settings_form = EFF(initial=EFF.NO_EMAIL_INITIAL) email_settings_form.save(u) #create welcome message u.message_set.create(message=_('Welcome to Q&A forum!')) return HttpResponseRedirect(next) def get_template(self, step): if step == 0: return 'mediawiki/mediawiki_signup.html' elif step == 1: return 'notarobot.html'