From 78ece5b783539e5cb223870e95eb1b2f24fa78a7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 7 Oct 2020 17:58:01 +0200 Subject: [PATCH] accepting alternative email addresses --- rowers/models.py | 73 ++++++++++++++++++++++++++++++++++++++- rowers/views/userviews.py | 3 ++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/rowers/models.py b/rowers/models.py index 0471b72f..22169084 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -131,6 +131,56 @@ class TemplateListField(models.TextField): value = self._get_val_from_obj(obj) return self.get_deb_prep_value(value) +# model for Emails field +class AlternativeEmails(models.TextField): + def __init__(self, *args, **kwargs): + self.token = kwargs.pop('token',',') + super(AlternativeEmails, self).__init__(*args,**kwargs) + + def to_python(self, value): + if not value: return + if isinstance(value, list): + return value + # remove double quotes and brackets + value = re.sub(r'u\"','',value) + value = re.sub(r'u\'','',value) + value = re.sub(r'\\','',value) + value = re.sub(r'\"','',value) + value = re.sub(r'\'','',value) + value = re.sub(r'\[','',value) + value = re.sub(r'\]','',value) + value = re.sub(r'\[\[','[',value) + value = re.sub(r'\]\]',']',value) + value = re.sub(r'\ \ ',' ',value) + value = re.sub(r', ',',',value) + + return value.split(self.token) + + def from_db_value(self,value, expression, connection): + if value is None: + return value + if isinstance(value, list): + return value + return value.split(self.token) + + def get_db_prep_value(self, value, connection, prepared=False): + if not value: return + assert(isinstance(value, list) or isinstance(value, tuple)) + newlist = [] + for s in value: + + try: + validate_email(s) + newlist.append(s) + except ValidationError: + pass + + return self.token.join([str(s) for s in newlist]) + + def value_to_string(self, obj): + value = self._get_val_from_obj(obj) + return self.get_deb_prep_value(value) + # model for Power Zone names class PowerZonesField(models.TextField): # __metaclass__ = models.SubfieldBase @@ -804,6 +854,8 @@ class Rower(models.Model): 'Pwr TR', 'Pwr AN']) + emailalternatives = AlternativeEmails(default=[],null=True,blank=True,verbose_name='Alternative Email addresses (separate with ",")') + # Site Settings workflowleftpanel = TemplateListField(default=defaultleft) workflowmiddlepanel = TemplateListField(default=defaultmiddle) @@ -3677,7 +3729,7 @@ class AccountRowerForm(ModelForm): 'getimportantemails', 'defaulttimezone','showfavoritechartnotes', 'defaultlandingpage', - 'offercoaching','autojoin'] + 'offercoaching','autojoin','emailalternatives'] widgets = { 'birthdate': SelectDateWidget( @@ -3686,10 +3738,29 @@ class AccountRowerForm(ModelForm): } def __init__(self, *args, **kwargs): + super(AccountRowerForm, self).__init__(*args, **kwargs) if 'coach' not in self.instance.rowerplan: self.fields.pop('offercoaching') + self.initial['emailalternatives'] = ', '.join(self.instance.emailalternatives) + + def clean(self): + cd = self.cleaned_data + z = "".join(cd['emailalternatives'].split()).split(',') + emailalternatives = [] + for addr in z: + try: + print(addr) + validate_email(addr) + match = User.objects.filter(email__iexact=addr) + if match.count() == 0: + emailalternatives.append(addr) + except ValidationError: + pass + + self.cleaned_data['emailalternatives'] = emailalternatives + # Form to set static chart settings class StaticChartRowerForm(ModelForm): class Meta: diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index 88e3a9c0..caa61060 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -415,6 +415,7 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): u.email = email resetbounce = True + emailalternatives = cd['emailalternatives'] u.save() r.defaulttimezone=defaulttimezone @@ -428,6 +429,8 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): r.sex = sex r.birthdate = birthdate r.autojoin = autojoin + r.emailalternatives = emailalternatives + if resetbounce and r.emailbounced: r.emailbounced = False