def __unicode__(self): username = self.user.username if email_re.match(username): username = username.strip().rsplit('@', 1)[0] return username
def clean_emails(self, emails): email_values = emails.split(',') for email in email_values: if not email_re.match(email): raise ValidationError('%s is not a valid email address' % email) return email_values
def clean_email(self): """ If email is valid. """ email = self.cleaned_data['email'] if not simple_email_re.match(email): raise forms.ValidationError(_('Invalid email address')) return email
def clean(self): """ Validates that an active user exists with the given username / email address. """ username_or_email = self.clean_username_or_email() user = util.get_user_by_username_or_email(username_or_email) if not user: if simple_email_re.match(username_or_email): raise forms.ValidationError(self.error_messages['unknown_email']) else: raise forms.ValidationError(self.error_messages['unknown_username']) elif not user.is_active: if simple_email_re.match(username_or_email): raise forms.ValidationError(self.error_messages['unusable_email']) else: raise forms.ValidationError(self.error_messages['unusable_username']) self.cleaned_data["email"] = user.email return self.cleaned_data
def get_user_by_username_or_email(username_or_email): """ Returns a user given an email or username. """ User = get_user_model() try: if simple_email_re.match(username_or_email): user = User.objects.get(email__iexact=username_or_email) else: user = User.objects.get(username__iexact=username_or_email) except User.DoesNotExist: return None return user
def obfuscate(text): """Obfuscates the given text in case it is an email address. Based on the implementation used in addons.mozilla.org""" if not email_re.match(text): return text fallback = text[::-1] # reverse # inject junk somewhere i = random.randint(0, len(text) - 1) fallback = u"%s%s%s" % (escape(fallback[:i]), u'<span class="i">null</span>', escape(fallback[i:])) # replace @ and . fallback = fallback.replace("@", "@").replace(".", ".") title = '<span class="email">%s</span>' % fallback node = u'%s<span class="email hide">%s</span>' % (title, fallback) return mark_safe(node)
def signup(request): if request.method == "GET": return r2r("signup.jinja", request, locals()) else: email = request.POST['email'] password = request.POST['password'] if not email_re.match(email): error_msg = "Please enter a valid email address." return r2r("signup.jinja", request, locals()) if len(password) < 6: error_msg = "Please enter a password of at least 6 characters." return r2r("signup.jinja", request, locals()) if User.objects.filter(username=email).count(): error_msg = "An account with this email address already exists." return r2r("signup.jinja", request, locals()) user = User.objects.create_user(email, password=password) user.save() user = authenticate(username=email, password=password) login_user(request, user) return redirect("home")
def parse_url(word): """ If word is url, return a parsed version of it. :param word: string :return: None or parsed url """ url = None if simple_url_re.match(word): url = smart_urlquote(word) elif simple_url_2_re.match(word): url = smart_urlquote('http://%s' % word) elif not ':' in word and simple_email_re.match(word): local, domain = word.rsplit('@', 1) try: domain = domain.encode('idna').decode('ascii') except UnicodeError: return url = 'mailto:%s@%s' % (local, domain) if url: return urlparse.urlparse(url)
def urlify_markdown(text): """ Converts any URLs in text into markdown links. Works on http://, https://, www. links and links ending in .org, .net or .com. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. """ safe_input = isinstance(text, SafeData) words = word_split_re.split(force_unicode(text)) for i, word in enumerate(words): match = None if '.' in word or '@' in word or ':' in word: match = punctuation_re.match(word) if match: lead, middle, trail = match.groups() # Make URL we want to point to. url = None if middle.startswith('http://') or middle.startswith('https://'): url = urlquote(middle, safe='/&=:;#?+*') elif middle.startswith('www.') or ('@' not in middle and \ middle and middle[0] in string.ascii_letters + string.digits and \ (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))): url = urlquote('http://%s' % middle, safe='/&=:;#?+*') elif '@' in middle and not ':' in middle and simple_email_re.match(middle): url = 'mailto:%s' % middle nofollow_attr = '' # Make link. if url: words[i] = mark_safe('%s<%s>%s' % (lead, url, trail)) else: if safe_input: words[i] = mark_safe(word) elif safe_input: words[i] = mark_safe(word) return u''.join(words)
def convert_links(text, trim_url_limit=None, nofollow=False, autoescape=False): """ Finds URLs in text and attempts to handle correctly. Heavily based on django.utils.html.urlize With the additions of attempting to embed media links, particularly images. Works on http://, https://, www. links, and also on links ending in one of the original seven gTLDs (.com, .edu, .gov, .int, .mil, .net, and .org). Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. """ safe_input = isinstance(text, SafeData) words = word_split_re.split(force_text(text)) for i, word in enumerate(words): if '.' in word or ':' in word: # Deal with punctuation. lead, middle, trail = '', word, '' for punctuation in TRAILING_PUNCTUATION: if middle.endswith(punctuation): middle = middle[:-len(punctuation)] trail = punctuation + trail for opening, closing in WRAPPING_PUNCTUATION: if middle.startswith(opening): middle = middle[len(opening):] lead = lead + opening # Keep parentheses at the end only if they're balanced. if (middle.endswith(closing) and middle.count(closing) == middle.count(opening) + 1): middle = middle[:-len(closing)] trail = closing + trail # Make URL we want to point to. url = None if simple_url_re.match(middle): url = smart_urlquote(middle) elif simple_url_2_re.match(middle): url = smart_urlquote('http://%s' % middle) elif not ':' in middle and simple_email_re.match(middle): local, domain = middle.rsplit('@', 1) try: domain = domain.encode('idna').decode('ascii') except UnicodeError: continue if url: u = url.lower() if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) url = escape(url) # Photos if u.endswith('.jpg') or u.endswith('.gif') or u.endswith('.png'): middle = '<img src="%s">' % url # Youtube #'https://www.youtube.com/watch?v=gkqXgaUuxZg' elif 'youtube.com/watch' in url: parsed = urlparse.urlsplit(url) query = urlparse.parse_qs(parsed.query) token = query.get('v') if token and len(token) > 0: middle = '<iframe src="http://www.youtube.com/embed/%s" height="320" width="100%%"></iframe>' % token[0] else: middle = url elif 'youtu.be/' in url: try: token = url.rsplit('/', 1)[1] middle = '<iframe src="http://www.youtube.com/embed/' + token + '" height="320" width="100%%"></iframe>' except IndexError: middle = url words[i] = mark_safe('%s%s%s' % (lead, middle, trail)) else: if safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) elif safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) return ''.join(words)
def urlize_without_escaping_percent_signs(text, trim_url_limit=None, nofollow=False, autoescape=False): """ Converts any URLs in text into clickable links. Works on http://, https://, www. links and links ending in .org, .net or .com. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. If trim_url_limit is not None, the URLs in link text longer than this limit will truncated to trim_url_limit-3 characters and appended with an elipsis. If nofollow is True, the URLs in link text will get a rel="nofollow" attribute. If autoescape is True, the link text and URLs will get autoescaped. """ # I think this is a copy of a function in django.utils.html with one minor # change; see the comment below. trim_url = lambda x, limit=trim_url_limit: limit is not None and ( len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x safe_input = isinstance(text, SafeData) words = word_split_re.split(force_unicode(text)) nofollow_attr = nofollow and ' rel="nofollow"' or '' for i, word in enumerate(words): match = None if '.' in word or '@' in word or ':' in word: match = punctuation_re.match(word) if match: lead, middle, trail = match.groups() # Make URL we want to point to. url = None if middle.startswith('http://') or middle.startswith('https://'): # The only difference between this function and the one # included in django.utils.html is the percent sign below. url = urlquote(middle, safe='/%&=:;#?+*') elif middle.startswith('www.') or ('@' not in middle and middle and middle[0] in string.ascii_letters + string.digits and (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))): url = urlquote('http://%s' % middle, safe='/&=:;#?+*') elif '@' in middle and not ':' in middle and simple_email_re.match(middle): url = 'mailto:%s' % middle nofollow_attr = '' # Make link. if url: trimmed = trim_url(middle) if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) url, trimmed = escape(url), escape(trimmed) middle = '<a href="%s"%s>%s</a>' % (url, nofollow_attr, trimmed) words[i] = mark_safe('%s%s%s' % (lead, middle, trail)) else: if safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) elif safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) return u''.join(words)
def do_urlimagize(text, trim_url_limit=MAX_URL_LENGTH, nofollow=False, autoescape=False): """ Converts any URLs in text into clickable links. Works on http://, https://, www. links and links ending in .org, .net or .com. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. If trim_url_limit is not None, the URLs in link text longer than this limit will truncated to trim_url_limit-3 characters and appended with an elipsis. If nofollow is True, the URLs in link text will get a rel="nofollow" attribute. If autoescape is True, the link text and URLs will get autoescaped. """ trim_url = ( lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ("%s..." % x[: max(0, limit - 3)])) or x ) safe_input = isinstance(text, SafeData) words = word_split_re.split(force_unicode(text)) nofollow_attr = nofollow and ' rel="nofollow"' or "" for i, word in enumerate(words): match = None if "." in word or "@" in word or ":" in word: match = punctuation_re.match(word) if match: lead, middle, trail = match.groups() # Make URL we want to point to. url = None if middle.startswith("http://") or middle.startswith("https://"): url = urlquote(middle, safe="/&=:;#?+*") elif middle.startswith("www.") or ( "@" not in middle and middle and middle[0] in string.ascii_letters + string.digits and (middle.endswith(".org") or middle.endswith(".net") or middle.endswith(".com")) ): url = urlquote("http://%s" % middle, safe="/&=:;#?+*") elif "@" in middle and not ":" in middle and simple_email_re.match(middle): url = "mailto:%s" % middle nofollow_attr = "" # Make link. if url: trimmed = trim_url(middle) if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) url, trimmed = escape(url), escape(trimmed) if is_image(url): middle = '<a href="%s"><img class="image-inside-review" src="%s" alt="" /></a>' % (url, url) else: middle = '<a href="%s"%s>%s</a>' % (url, nofollow_attr, trimmed) words[i] = mark_safe("%s%s%s" % (lead, middle, trail)) else: if safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) elif safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) return u"".join(words)
def urlize_impl(text, trim_url_limit=None, nofollow=False, autoescape=False): """ Converts any URLs in text into clickable links. Works on http://, https://, www. links, and also on links ending in one of the original seven gTLDs (.com, .edu, .gov, .int, .mil, .net, and .org). Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. If trim_url_limit is not None, the URLs in link text longer than this limit will truncated to trim_url_limit-3 characters and appended with an elipsis. If nofollow is True, the URLs in link text will get a rel="nofollow" attribute. If autoescape is True, the link text and URLs will get autoescaped. """ trim_url = lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x safe_input = isinstance(text, SafeData) words = word_split_re.split(force_text(text)) for i, word in enumerate(words): match = None if '.' in word or '@' in word or ':' in word: # Deal with punctuation. lead, middle, trail = '', word, '' for punctuation in TRAILING_PUNCTUATION: if middle.endswith(punctuation): middle = middle[:-len(punctuation)] trail = punctuation + trail for opening, closing in WRAPPING_PUNCTUATION: if middle.startswith(opening): middle = middle[len(opening):] lead = lead + opening # Keep parentheses at the end only if they're balanced. if (middle.endswith(closing) and middle.count(closing) == middle.count(opening) + 1): middle = middle[:-len(closing)] trail = closing + trail # Make URL we want to point to. url = None nofollow_attr = ' rel="nofollow"' if nofollow else '' if simple_url_re.match(middle): url = smart_urlquote(middle) elif simple_url_2_re.match(middle): url = smart_urlquote('http://%s' % middle) elif not ':' in middle and simple_email_re.match(middle): local, domain = middle.rsplit('@', 1) try: domain = domain.encode('idna').decode('ascii') except UnicodeError: continue url = 'mailto:%s@%s' % (local, domain) nofollow_attr = '' # Make link. if url: trimmed = trim_url(middle) if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) url, trimmed = escape(url), escape(trimmed) # # Custom stuff for us # lowered = url.lower() is_image = (lowered.endswith('.jpg') or lowered.endswith('.gif') or lowered.endswith('.png')) class_attr = is_image and ' class="image"' or '' middle = '<a href="%s"%s%s>%s</a>' % (url, nofollow_attr, class_attr, trimmed) # # End custom stuff # words[i] = mark_safe('%s%s%s' % (lead, middle, trail)) else: if safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) elif safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) return ''.join(words)
def convert_links(text, trim_url_limit=None, nofollow=False, autoescape=False): """ Finds URLs in text and attempts to handle correctly. Heavily based on django.utils.html.urlize With the additions of attempting to embed media links, particularly images. Works on http://, https://, www. links, and also on links ending in one of the original seven gTLDs (.com, .edu, .gov, .int, .mil, .net, and .org). Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. """ safe_input = isinstance(text, SafeData) words = word_split_re.split(force_text(text)) for i, word in enumerate(words): if '.' in word or ':' in word: # Deal with punctuation. lead, middle, trail = '', word, '' for punctuation in TRAILING_PUNCTUATION: if middle.endswith(punctuation): middle = middle[:-len(punctuation)] trail = punctuation + trail for opening, closing in WRAPPING_PUNCTUATION: if middle.startswith(opening): middle = middle[len(opening):] lead = lead + opening # Keep parentheses at the end only if they're balanced. if (middle.endswith(closing) and middle.count(closing) == middle.count(opening) + 1): middle = middle[:-len(closing)] trail = closing + trail # Make URL we want to point to. url = None if simple_url_re.match(middle): url = smart_urlquote(middle) elif simple_url_2_re.match(middle): url = smart_urlquote('http://%s' % middle) elif not ':' in middle and simple_email_re.match(middle): local, domain = middle.rsplit('@', 1) try: domain = domain.encode('idna').decode('ascii') except UnicodeError: continue if url: u = url.lower() if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) url = escape(url) # Photos if u.endswith('.jpg') or u.endswith('.gif') or u.endswith( '.png'): middle = '<img src="%s">' % url # Youtube #'https://www.youtube.com/watch?v=gkqXgaUuxZg' elif 'youtube.com/watch' in url: parsed = urlparse.urlsplit(url) query = urlparse.parse_qs(parsed.query) token = query.get('v') if token and len(token) > 0: middle = '<iframe src="http://www.youtube.com/embed/%s" height="320" width="100%%"></iframe>' % token[ 0] else: middle = url elif 'youtu.be/' in url: try: token = url.rsplit('/', 1)[1] middle = '<iframe src="http://www.youtube.com/embed/' + token + '" height="320" width="100%%"></iframe>' except IndexError: middle = url words[i] = mark_safe('%s%s%s' % (lead, middle, trail)) else: if safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) elif safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) return ''.join(words)