##// END OF EJS Templates
implements #291 email notification sent to all admin users
implements #291 email notification sent to all admin users

File last commit:

r1629:2196aa27 beta
r1642:c0d8171a default
Show More
helpers.py
672 lines | 23.6 KiB | text/x-python | PythonLexer
renamed project to rhodecode
r547 """Helper functions
Consists of functions to typically be used within templates, but also
available to Controllers. This module is available to both as 'h'.
"""
implemented user dashboards, and following system.
r734 import random
import hashlib
fixed line number look
r966 import StringIO
fixed problem with int. chars in gravatars
r1101 import urllib
fixed issues with repo pager
r1422 import math
fixed problem with int. chars in gravatars
r1101
simplified str2bool, and moved safe_unicode out of helpers since it was not html specific function
r1154 from datetime import datetime
renamed project to rhodecode
r547 from pygments.formatters import HtmlFormatter
from pygments import highlight as code_highlight
#21 added optional flag to disable gravatar, and use local icon
r1110 from pylons import url, request, config
renamed project to rhodecode
r547 from pylons.i18n.translation import _, ungettext
Code refactor number 2
r1022
renamed project to rhodecode
r547 from webhelpers.html import literal, HTML, escape
from webhelpers.html.tools import *
from webhelpers.html.builder import make_tag
from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \
end_form, file, form, hidden, image, javascript_link, link_to, link_to_if, \
link_to_unless, ol, required_legend, select, stylesheet_link, submit, text, \
password, textarea, title, ul, xml_declaration, radio
from webhelpers.html.tools import auto_link, button_to, highlight, js_obfuscate, \
mail_to, strip_links, strip_tags, tag_re
from webhelpers.number import format_byte_size, format_bit_size
from webhelpers.pylonslib import Flash as _Flash
from webhelpers.pylonslib.secure_form import secure_form
from webhelpers.text import chop_at, collapse, convert_accented_entities, \
convert_misc_entities, lchop, plural, rchop, remove_formatting, \
replace_whitespace, urlify, truncate, wrap_paragraphs
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 from webhelpers.date import time_ago_in_words
Added dedicated repo pager to support reversed new way slicing method of vcs and get_changesets method
r1098 from webhelpers.paginate import Page
fixes #65, Added reset buttons to edit forms
r698 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
convert_boolean_attrs, NotGiven
fixed problem with int. chars in gravatars
r1101 from vcs.utils.annotate import annotate_highlight
from rhodecode.lib.utils import repo_name_slug
Code cleanup...
r1466 from rhodecode.lib import str2bool, safe_unicode, safe_str,get_changeset_safe
fixed problem with int. chars in gravatars
r1101
fixes #65, Added reset buttons to edit forms
r698 def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
simplified str2bool, and moved safe_unicode out of helpers since it was not html specific function
r1154 """
Reset button
Added message tooltip into journal revisions in push....
r899 """
fixes #65, Added reset buttons to edit forms
r698 _set_input_attrs(attrs, type, name, value)
_set_id_attr(attrs, id, name)
convert_boolean_attrs(attrs, ["disabled"])
return HTML.input(**attrs)
reset = _reset
implemented user dashboards, and following system.
r734
def get_token():
"""Return the current authentication token, creating one if one doesn't
already exist.
"""
token_key = "_authentication_token"
from pylons import session
if not token_key in session:
try:
token = hashlib.sha1(str(random.getrandbits(128))).hexdigest()
except AttributeError: # Python < 2.4
token = hashlib.sha1(str(random.randrange(2 ** 128))).hexdigest()
session[token_key] = token
if hasattr(session, 'save'):
session.save()
return session[token_key]
renamed project to rhodecode
r547 class _GetError(object):
Added message tooltip into journal revisions in push....
r899 """Get error from form_errors, and represent it as span wrapped error
message
source code cleanup: remove trailing white space, normalize file endings
r1203
Added message tooltip into journal revisions in push....
r899 :param field_name: field to fetch errors for
:param form_errors: form errors dict
"""
renamed project to rhodecode
r547
def __call__(self, field_name, form_errors):
tmpl = """<span class="error_msg">%s</span>"""
if form_errors and form_errors.has_key(field_name):
return literal(tmpl % form_errors.get(field_name))
get_error = _GetError()
class _ToolTip(object):
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 def __call__(self, tooltip_title, trim_at=50):
source code cleanup: remove trailing white space, normalize file endings
r1203 """Special function just to wrap our text into nice formatted
added wrapping of long tooltips in index page
r905 autowrapped text
source code cleanup: remove trailing white space, normalize file endings
r1203
fixed @repo into :repo for docs...
r604 :param tooltip_title:
renamed project to rhodecode
r547 """
wrap_paragraph was to slow for toolip generation and was removed.
r1352 return escape(tooltip_title)
renamed project to rhodecode
r547 tooltip = _ToolTip()
class _FilesBreadCrumbs(object):
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 def __call__(self, repo_name, rev, paths):
fixes for #99, added casting to unicode for int chars as utf-8 files
r955 if isinstance(paths, str):
fixes for issues #137 and #116 safe_unicode is now default for handling file names
r1176 paths = safe_unicode(paths)
renamed project to rhodecode
r547 url_l = [link_to(repo_name, url('files_home',
repo_name=repo_name,
revision=rev, f_path=''))]
paths_l = paths.split('/')
fixed python2.5 incompatible enumerate calls
r740 for cnt, p in enumerate(paths_l):
renamed project to rhodecode
r547 if p != '':
url_l.append(link_to(p, url('files_home',
repo_name=repo_name,
revision=rev,
fixed python2.5 incompatible enumerate calls
r740 f_path='/'.join(paths_l[:cnt + 1]))))
renamed project to rhodecode
r547
return literal('/'.join(url_l))
files_breadcrumbs = _FilesBreadCrumbs()
Added message tooltip into journal revisions in push....
r899
renamed project to rhodecode
r547 class CodeHtmlFormatter(HtmlFormatter):
fixed line number look
r966 """My code Html Formatter for source codes
"""
renamed project to rhodecode
r547
def wrap(self, source, outfile):
return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
def _wrap_code(self, source):
fixed python2.5 incompatible enumerate calls
r740 for cnt, it in enumerate(source):
renamed project to rhodecode
r547 i, t = it
fixed line number look
r966 t = '<div id="L%s">%s</div>' % (cnt + 1, t)
renamed project to rhodecode
r547 yield i, t
fixed line number look
r966
def _wrap_tablelinenos(self, inner):
dummyoutfile = StringIO.StringIO()
lncount = 0
for t, line in inner:
if t:
lncount += 1
dummyoutfile.write(line)
fl = self.linenostart
mw = len(str(lncount + fl - 1))
sp = self.linenospecial
st = self.linenostep
la = self.lineanchors
aln = self.anchorlinenos
nocls = self.noclasses
if sp:
lines = []
for i in range(fl, fl + lncount):
if i % st == 0:
if i % sp == 0:
if aln:
lines.append('<a href="#%s%d" class="special">%*d</a>' %
(la, i, mw, i))
else:
lines.append('<span class="special">%*d</span>' % (mw, i))
else:
if aln:
lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
else:
lines.append('%*d' % (mw, i))
else:
lines.append('')
ls = '\n'.join(lines)
else:
lines = []
for i in range(fl, fl + lncount):
if i % st == 0:
if aln:
lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
else:
lines.append('%*d' % (mw, i))
else:
lines.append('')
ls = '\n'.join(lines)
# in case you wonder about the seemingly redundant <div> here: since the
# content in the other cell also is wrapped in a div, some browsers in
# some configurations seem to mess up the formatting...
if nocls:
yield 0, ('<table class="%stable">' % self.cssclass +
'<tr><td><div class="linenodiv" '
'style="background-color: #f0f0f0; padding-right: 10px">'
'<pre style="line-height: 125%">' +
Fixed problem with anchor link positioning when passed in ranges....
r1320 ls + '</pre></div></td><td id="hlcode" class="code">')
fixed line number look
r966 else:
yield 0, ('<table class="%stable">' % self.cssclass +
'<tr><td class="linenos"><div class="linenodiv"><pre>' +
Fixed problem with anchor link positioning when passed in ranges....
r1320 ls + '</pre></div></td><td id="hlcode" class="code">')
fixed line number look
r966 yield 0, dummyoutfile.getvalue()
yield 0, '</td></tr></table>'
renamed project to rhodecode
r547 def pygmentize(filenode, **kwargs):
Added message tooltip into journal revisions in push....
r899 """pygmentize function using pygments
source code cleanup: remove trailing white space, normalize file endings
r1203
fixed @repo into :repo for docs...
r604 :param filenode:
renamed project to rhodecode
r547 """
Added message tooltip into journal revisions in push....
r899
renamed project to rhodecode
r547 return literal(code_highlight(filenode.content,
filenode.lexer, CodeHtmlFormatter(**kwargs)))
changes for #56
r1171 def pygmentize_annotation(repo_name, filenode, **kwargs):
Added message tooltip into journal revisions in push....
r899 """pygmentize function for annotation
source code cleanup: remove trailing white space, normalize file endings
r1203
fixed @repo into :repo for docs...
r604 :param filenode:
renamed project to rhodecode
r547 """
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 color_dict = {}
Fixed whoosh daemon, for depracated walk method
r947 def gen_color(n=10000):
source code cleanup: remove trailing white space, normalize file endings
r1203 """generator for getting n of evenly distributed colors using
Fixed whoosh daemon, for depracated walk method
r947 hsv color and golden ratio. It always return same order of colors
source code cleanup: remove trailing white space, normalize file endings
r1203
Fixed whoosh daemon, for depracated walk method
r947 :returns: RGB tuple
Hacking for git support,and new faster repo scan
r631 """
removed colorsys import
r1461
def hsv_to_rgb(h, s, v):
if s == 0.0: return v, v, v
i = int(h * 6.0) # XXX assume int() truncates!
f = (h * 6.0) - i
p = v * (1.0 - s)
q = v * (1.0 - s * f)
t = v * (1.0 - s * (1.0 - f))
i = i % 6
if i == 0: return v, t, p
if i == 1: return q, v, p
if i == 2: return p, v, t
if i == 3: return p, q, v
if i == 4: return t, p, v
if i == 5: return v, p, q
renamed project to rhodecode
r547 golden_ratio = 0.618033988749895
h = 0.22717784590367374
Fixed whoosh daemon, for depracated walk method
r947
Fixed problem with anchor link positioning when passed in ranges....
r1320 for _ in xrange(n):
renamed project to rhodecode
r547 h += golden_ratio
h %= 1
HSV_tuple = [h, 0.95, 0.95]
removed colorsys import
r1461 RGB_tuple = hsv_to_rgb(*HSV_tuple)
Hacking for git support,and new faster repo scan
r631 yield map(lambda x:str(int(x * 256)), RGB_tuple)
renamed project to rhodecode
r547
cgenerator = gen_color()
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 def get_color_string(cs):
if color_dict.has_key(cs):
col = color_dict[cs]
else:
col = color_dict[cs] = cgenerator.next()
return "color: rgb(%s)! important;" % (', '.join(col))
Hacking for git support,and new faster repo scan
r631
changes for #56
r1171 def url_func(repo_name):
wrap_paragraph was to slow for toolip generation and was removed.
r1352
changes for #56
r1171 def _url_func(changeset):
wrap_paragraph was to slow for toolip generation and was removed.
r1352 author = changeset.author
date = changeset.date
message = tooltip(changeset.message)
Hacking for git support,and new faster repo scan
r631
wrap_paragraph was to slow for toolip generation and was removed.
r1352 tooltip_html = ("<div style='font-size:0.8em'><b>Author:</b>"
" %s<br/><b>Date:</b> %s</b><br/><b>Message:"
"</b> %s<br/></div>")
tooltip_html = tooltip_html % (author, date, message)
changes for #56
r1171 lnk_format = '%5s:%s' % ('r%s' % changeset.revision,
short_id(changeset.raw_id))
uri = link_to(
lnk_format,
url('changeset_home', repo_name=repo_name,
revision=changeset.raw_id),
style=get_color_string(changeset.raw_id),
class_='tooltip',
title=tooltip_html
)
Hacking for git support,and new faster repo scan
r631
changes for #56
r1171 uri += '\n'
return uri
return _url_func
return literal(annotate_highlight(filenode, url_func(repo_name), **kwargs))
Hacking for git support,and new faster repo scan
r631
fixed following js snipet. It' can be called multiple times now next to each repository...
r999 def is_following_repo(repo_name, user_id):
from rhodecode.model.scm import ScmModel
return ScmModel().is_following_repo(repo_name, user_id)
renamed project to rhodecode
r547 flash = _Flash()
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 #==============================================================================
Make rhodecode use author/username filter from vcs instead of mercurial
r1356 # SCM FILTERS available via h.
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 #==============================================================================
Make rhodecode use author/username filter from vcs instead of mercurial
r1356 from vcs.utils import author_name, author_email
Fixes issue #201...
r1373 from rhodecode.lib import credentials_filter, age as _age
renamed project to rhodecode
r547
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 age = lambda x:_age(x)
renamed project to rhodecode
r547 capitalize = lambda x: x.capitalize()
Make rhodecode use author/username filter from vcs instead of mercurial
r1356 email = author_email
email_or_none = lambda x: email(x) if email(x) != x else None
person = lambda x: author_name(x)
Fixes for raw_id, needed for git...
r636 short_id = lambda x: x[:12]
Fixes issue #201...
r1373 hide_credentials = lambda x: ''.join(credentials_filter(x))
#48 rewrote action logger, translated action logger messages, added some extra messages. Linked and showed pushed revisions in logs
r660
Added ldap info on admin users, added bool2icon helper for nicer representation of...
r712 def bool2icon(value):
Added message tooltip into journal revisions in push....
r899 """Returns True/False values represented as small html image of true/false
Added ldap info on admin users, added bool2icon helper for nicer representation of...
r712 icons
source code cleanup: remove trailing white space, normalize file endings
r1203
Added ldap info on admin users, added bool2icon helper for nicer representation of...
r712 :param value: bool value
"""
if value is True:
removed obsolete _static flag from url, and fixed urls in webhelpers
r1050 return HTML.tag('img', src=url("/images/icons/accept.png"),
alt=_('True'))
Added ldap info on admin users, added bool2icon helper for nicer representation of...
r712
if value is False:
removed obsolete _static flag from url, and fixed urls in webhelpers
r1050 return HTML.tag('img', src=url("/images/icons/cancel.png"),
alt=_('False'))
Added ldap info on admin users, added bool2icon helper for nicer representation of...
r712
return value
fixed unicode problems with file paths....
r1087 def action_parser(user_log, feed=False):
"""This helper will action_map the specified string action into translated
#48 rewrote action logger, translated action logger messages, added some extra messages. Linked and showed pushed revisions in logs
r660 fancy names with icons and links
source code cleanup: remove trailing white space, normalize file endings
r1203
Added message tooltip into journal revisions in push....
r899 :param user_log: user log instance
fixed unicode problems with file paths....
r1087 :param feed: use output for feeds (no html and fancy icons)
#48 rewrote action logger, translated action logger messages, added some extra messages. Linked and showed pushed revisions in logs
r660 """
Added message tooltip into journal revisions in push....
r899
#48 rewrote action logger, translated action logger messages, added some extra messages. Linked and showed pushed revisions in logs
r660 action = user_log.action
action logger upgrade, for working with migrations
r840 action_params = ' '
#48 rewrote action logger, translated action logger messages, added some extra messages. Linked and showed pushed revisions in logs
r660
x = action.split(':')
if len(x) > 1:
action, action_params = x
Added fork name to journal...
r718 def get_cs_links():
Javascripts rewrite: updated yui to latest 2.9, simplified ajax loading for multiple pages. Removed YUI dev package
r1421 revs_limit = 3 #display this amount always
fixed vcs import....
r953 revs_top_limit = 50 #show upto this amount of changesets hidden
revs = action_params.split(',')
repo_name = user_log.repository.repo_name
another major codes rewrite:...
r1045
fixed vcs import....
r953 from rhodecode.model.scm import ScmModel
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 repo = user_log.repository.scm_instance
another major codes rewrite:...
r1045
fixes fixes fixes ! optimized queries on journal...
r1040 message = lambda rev: get_changeset_safe(repo, rev).message
Removed all string concat for exchange of ''.join()
r1359 cs_links = []
cs_links.append(" " + ', '.join ([link_to(rev,
fixed vcs import....
r953 url('changeset_home',
repo_name=repo_name,
revision=rev), title=tooltip(message(rev)),
Removed all string concat for exchange of ''.join()
r1359 class_='tooltip') for rev in revs[:revs_limit] ]))
Added compare view into journal, fixed wrong function call to show compare view
r1009
compare_view = (' <div class="compare_view tooltip" title="%s">'
'<a href="%s">%s</a> '
'</div>' % (_('Show all combined changesets %s->%s' \
% (revs[0], revs[-1])),
url('changeset_home', repo_name=repo_name,
revision='%s...%s' % (revs[0], revs[-1])
),
_('compare view'))
)
fixed vcs import....
r953 if len(revs) > revs_limit:
uniq_id = revs[0]
html_tmpl = ('<span> %s '
fixes for journal, added paging now it's possible to view whole journal...
r995 '<a class="show_more" id="_%s" href="#more">%s</a> '
fixed vcs import....
r953 '%s</span>')
fixed unicode problems with file paths....
r1087 if not feed:
Removed all string concat for exchange of ''.join()
r1359 cs_links.append(html_tmpl % (_('and'), uniq_id, _('%s more') \
fixed vcs import....
r953 % (len(revs) - revs_limit),
Removed all string concat for exchange of ''.join()
r1359 _('revisions')))
added icons to journal, extend show more to actually show more pushed revisions,
r808
fixed unicode problems with file paths....
r1087 if not feed:
html_tmpl = '<span id="%s" style="display:none"> %s </span>'
else:
html_tmpl = '<span id="%s"> %s </span>'
Removed all string concat for exchange of ''.join()
r1359 cs_links.append(html_tmpl % (uniq_id, ', '.join([link_to(rev,
fixed vcs import....
r953 url('changeset_home',
repo_name=repo_name, revision=rev),
title=message(rev), class_='tooltip')
Removed all string concat for exchange of ''.join()
r1359 for rev in revs[revs_limit:revs_top_limit]])))
hidden compare view link for single revision push
r1024 if len(revs) > 1:
Removed all string concat for exchange of ''.join()
r1359 cs_links.append(compare_view)
return ''.join(cs_links)
implemented user dashboards, and following system.
r734
Added fork name to journal...
r718 def get_fork_name():
fixed vcs import....
r953 repo_name = action_params
updated changelog, small fix for journal
r1055 return _('fork name ') + str(link_to(action_params, url('summary_home',
another major codes rewrite:...
r1045 repo_name=repo_name,)))
fixed vcs import....
r953
fixed unicode problems with file paths....
r1087 action_map = {'user_deleted_repo':(_('[deleted] repository'), None),
Updated new Journal with users and dates aggregates
r1041 'user_created_repo':(_('[created] repository'), None),
updated changelog, small fix for journal
r1055 'user_forked_repo':(_('[forked] repository'), get_fork_name),
Updated new Journal with users and dates aggregates
r1041 'user_updated_repo':(_('[updated] repository'), None),
'admin_deleted_repo':(_('[delete] repository'), None),
'admin_created_repo':(_('[created] repository'), None),
'admin_forked_repo':(_('[forked] repository'), None),
'admin_updated_repo':(_('[updated] repository'), None),
fixed journal look & feel
r1052 'push':(_('[pushed] into'), get_cs_links),
logged local commit with special action via action_logger,
r1312 'push_local':(_('[committed via RhodeCode] into'), get_cs_links),
#109, added manual pull of changes for repositories that have remote location filled in....
r1114 'push_remote':(_('[pulled from remote] into'), get_cs_links),
typo fix for journal action
r1053 'pull':(_('[pulled] from'), None),
Updated new Journal with users and dates aggregates
r1041 'started_following_repo':(_('[started following] repository'), None),
'stopped_following_repo':(_('[stopped following] repository'), None),
added action loggers to following repositories,...
r735 }
#48 rewrote action logger, translated action logger messages, added some extra messages. Linked and showed pushed revisions in logs
r660
fixed unicode problems with file paths....
r1087 action_str = action_map.get(action, action)
if feed:
action = action_str[0].replace('[', '').replace(']', '')
else:
action = action_str[0].replace('[', '<span class="journal_highlight">')\
fixed vcs import....
r953 .replace(']', '</span>')
#109, added manual pull of changes for repositories that have remote location filled in....
r1114
fixed journal look & feel
r1052 action_params_func = lambda :""
#109, added manual pull of changes for repositories that have remote location filled in....
r1114 if callable(action_str[1]):
fixed journal look & feel
r1052 action_params_func = action_str[1]
fixed vcs import....
r953
fixed journal look & feel
r1052 return [literal(action), action_params_func]
added icons to journal, extend show more to actually show more pushed revisions,
r808
def action_parser_icon(user_log):
action = user_log.action
action_params = None
x = action.split(':')
if len(x) > 1:
action, action_params = x
#109, added manual pull of changes for repositories that have remote location filled in....
r1114 tmpl = """<img src="%s%s" alt="%s"/>"""
added icons to journal, extend show more to actually show more pushed revisions,
r808 map = {'user_deleted_repo':'database_delete.png',
'user_created_repo':'database_add.png',
'user_forked_repo':'arrow_divide.png',
'user_updated_repo':'database_edit.png',
'admin_deleted_repo':'database_delete.png',
Added message tooltip into journal revisions in push....
r899 'admin_created_repo':'database_add.png',
added icons to journal, extend show more to actually show more pushed revisions,
r808 'admin_forked_repo':'arrow_divide.png',
'admin_updated_repo':'database_edit.png',
'push':'script_add.png',
logged local commit with special action via action_logger,
r1312 'push_local':'script_edit.png',
#109, added manual pull of changes for repositories that have remote location filled in....
r1114 'push_remote':'connect.png',
added icons to journal, extend show more to actually show more pushed revisions,
r808 'pull':'down_16.png',
'started_following_repo':'heart_add.png',
'stopped_following_repo':'heart_delete.png',
}
removed obsolete _static flag from url, and fixed urls in webhelpers
r1050 return literal(tmpl % ((url('/images/icons/')),
map.get(action, action), action))
#48 rewrote action logger, translated action logger messages, added some extra messages. Linked and showed pushed revisions in logs
r660
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 #==============================================================================
renamed project to rhodecode
r547 # PERMS
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 #==============================================================================
renamed project to rhodecode
r547 from rhodecode.lib.auth import HasPermissionAny, HasPermissionAll, \
HasRepoPermissionAny, HasRepoPermissionAll
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 #==============================================================================
renamed project to rhodecode
r547 # GRAVATAR URL
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 #==============================================================================
renamed project to rhodecode
r547
def gravatar_url(email_address, size=30):
Anonymous user shouldn't use gravatar, changed gravatar into regular hosted image.
r1330 if not str2bool(config['app_conf'].get('use_gravatar')) or \
email_address == 'anonymous@rhodecode.org':
Liad Shani
Fixed user avatar display when gravatar use is disabled
r1478 return url("/images/user%s.png" % size)
#21 added optional flag to disable gravatar, and use local icon
r1110
patched gravatar url generation to properly support new https force flag from settings.
r946 ssl_enabled = 'https' == request.environ.get('wsgi.url_scheme')
renamed project to rhodecode
r547 default = 'identicon'
baseurl_nossl = "http://www.gravatar.com/avatar/"
baseurl_ssl = "https://secure.gravatar.com/avatar/"
baseurl = baseurl_ssl if ssl_enabled else baseurl_nossl
Hacking for git support,and new faster repo scan
r631
fixed problem with int. chars in gravatars
r1101 if isinstance(email_address, unicode):
#hashlib crashes on unicode items
Unicode fixes, added safe_str method for global str() operations +better test sandboxing
r1401 email_address = safe_str(email_address)
renamed project to rhodecode
r547 # construct the url
gravatar_url = baseurl + hashlib.md5(email_address.lower()).hexdigest() + "?"
gravatar_url += urllib.urlencode({'d':default, 's':str(size)})
return gravatar_url
Added dedicated repo pager to support reversed new way slicing method of vcs and get_changesets method
r1098
#==============================================================================
When creating a remote repository, with credentials filled, it's good to hide username and password from the clone url. Only administrators can see this in repository settings page
r1342 # REPO PAGER, PAGER FOR REPOSITORY
Added dedicated repo pager to support reversed new way slicing method of vcs and get_changesets method
r1098 #==============================================================================
class RepoPage(Page):
def __init__(self, collection, page=1, items_per_page=20,
Added branch filter to repo pager...
r1105 item_count=None, url=None, branch_name=None, **kwargs):
Added dedicated repo pager to support reversed new way slicing method of vcs and get_changesets method
r1098
"""Create a "RepoPage" instance. special pager for paging
repository
"""
self._url_generator = url
# Safe the kwargs class-wide so they can be used in the pager() method
self.kwargs = kwargs
# Save a reference to the collection
self.original_collection = collection
self.collection = collection
# The self.page is the number of the current page.
# The first page has the number 1!
try:
self.page = int(page) # make it int() if we get it as a string
except (ValueError, TypeError):
self.page = 1
self.items_per_page = items_per_page
# Unless the user tells us how many items the collections has
# we calculate that ourselves.
if item_count is not None:
self.item_count = item_count
else:
self.item_count = len(self.collection)
# Compute the number of the first and last available page
if self.item_count > 0:
self.first_page = 1
fixed issues with repo pager
r1422 self.page_count = int(math.ceil(float(self.item_count) /
self.items_per_page))
Added dedicated repo pager to support reversed new way slicing method of vcs and get_changesets method
r1098 self.last_page = self.first_page + self.page_count - 1
# Make sure that the requested page number is the range of valid pages
if self.page > self.last_page:
self.page = self.last_page
elif self.page < self.first_page:
self.page = self.first_page
# Note: the number of items on this page can be less than
# items_per_page if the last page is not full
fixed issues with repo pager
r1422 self.first_item = max(0, (self.item_count) - (self.page *
items_per_page))
self.last_item = ((self.item_count - 1) - items_per_page *
(self.page - 1))
Added dedicated repo pager to support reversed new way slicing method of vcs and get_changesets method
r1098
iterator = self.collection.get_changesets(start=self.first_item,
end=self.last_item,
Added branch filter to repo pager...
r1105 reverse=True,
branch_name=branch_name)
Added dedicated repo pager to support reversed new way slicing method of vcs and get_changesets method
r1098 self.items = list(iterator)
# Links to previous and next page
if self.page > self.first_page:
self.previous_page = self.page - 1
else:
self.previous_page = None
if self.page < self.last_page:
self.next_page = self.page + 1
else:
self.next_page = None
# No items available
else:
self.first_page = None
self.page_count = 0
self.last_page = None
self.first_item = None
self.last_item = None
self.previous_page = None
self.next_page = None
self.items = []
# This is a subclass of the 'list' type. Initialise the list now.
list.__init__(self, self.items)
moved tooltip function from the for loop and from templates to helpers
r990 def changed_tooltip(nodes):
When creating a remote repository, with credentials filled, it's good to hide username and password from the clone url. Only administrators can see this in repository settings page
r1342 """
Generates a html string for changed nodes in changeset page.
It limits the output to 30 entries
:param nodes: LazyNodesGenerator
"""
moved tooltip function from the for loop and from templates to helpers
r990 if nodes:
pref = ': <br/> '
suf = ''
if len(nodes) > 30:
suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
Implemented --stat for changelog
r1257 return literal(pref + '<br/> '.join([safe_unicode(x.path)
for x in nodes[:30]]) + suf)
moved tooltip function from the for loop and from templates to helpers
r990 else:
return ': ' + _('No Files')
Changes for repo groups
r1159
def repo_link(groups_and_repos):
When creating a remote repository, with credentials filled, it's good to hide username and password from the clone url. Only administrators can see this in repository settings page
r1342 """
Makes a breadcrumbs link to repo within a group
joins &raquo; on each group to create a fancy link
ex::
group >> subgroup >> repo
:param groups_and_repos:
"""
Changes for repo groups
r1159 groups, repo_name = groups_and_repos
if not groups:
return repo_name
else:
def make_link(group):
unified generation of repo groups choices...
r1547 return link_to(group.name, url('repos_group_home',
group_name=group.group_name))
Changes for repo groups
r1159 return literal(' &raquo; '.join(map(make_link, groups)) + \
" &raquo; " + repo_name)
Implemented --stat for changelog
r1257
def fancy_file_stats(stats):
When creating a remote repository, with credentials filled, it's good to hide username and password from the clone url. Only administrators can see this in repository settings page
r1342 """
Displays a fancy two colored bar for number of added/deleted
lines of code on file
:param stats: two element list of added/deleted lines of code
"""
Implemented --stat for changelog
r1257 a, d, t = stats[0], stats[1], stats[0] + stats[1]
width = 100
fixed possible float division, and changeset ranges bug introduced in stat changeset.
r1258 unit = float(width) / (t or 1)
Implemented --stat for changelog
r1257
When creating a remote repository, with credentials filled, it's good to hide username and password from the clone url. Only administrators can see this in repository settings page
r1342 # needs > 9% of width to be visible or 0 to be hidden
a_p = max(9, unit * a) if a > 0 else 0
d_p = max(9, unit * d) if d > 0 else 0
Implemented --stat for changelog
r1257 p_sum = a_p + d_p
if p_sum > width:
#adjust the percentage to be == 100% since we adjusted to 9
if a_p > d_p:
a_p = a_p - (p_sum - width)
else:
d_p = d_p - (p_sum - width)
a_v = a if a > 0 else ''
d_v = d if d > 0 else ''
def cgen(l_type):
mapping = {'tr':'top-right-rounded-corner',
'tl':'top-left-rounded-corner',
'br':'bottom-right-rounded-corner',
'bl':'bottom-left-rounded-corner'}
map_getter = lambda x:mapping[x]
if l_type == 'a' and d_v:
#case when added and deleted are present
return ' '.join(map(map_getter, ['tl', 'bl']))
if l_type == 'a' and not d_v:
return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
if l_type == 'd' and a_v:
return ' '.join(map(map_getter, ['tr', 'br']))
if l_type == 'd' and not a_v:
return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
d_a = '<div class="added %s" style="width:%s%%">%s</div>' % (cgen('a'),
a_p, a_v)
d_d = '<div class="deleted %s" style="width:%s%%">%s</div>' % (cgen('d'),
d_p, d_v)
return literal('<div style="width:%spx">%s%s</div>' % (width, d_a, d_d))
Links in summary page are now active
r1438
def urlify_text(text):
import re
url_pat = re.compile(r'(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)')
def url_func(match_obj):
url_full = match_obj.groups()[0]
return '<a href="%(url)s">%(url)s</a>' % ({'url':url_full})
return literal(url_pat.sub(url_func, text))