##// END OF EJS Templates
sorted tags by date in tag view
sorted tags by date in tag view

File last commit:

r1115:fcb50549 merge beta
r1126:e6548981 beta
Show More
helpers.py
698 lines | 25.3 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
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
#21 added optional flag to disable gravatar, and use local icon
r1110 from rhodecode.lib import str2bool
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):
Added message tooltip into journal revisions in push....
r899 """Reset button
"""
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
: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):
added wrapping of long tooltips in index page
r905 """Special function just to wrap our text into nice formatted
autowrapped text
fixed @repo into :repo for docs...
r604 :param tooltip_title:
renamed project to rhodecode
r547 """
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 return wrap_paragraphs(escape(tooltip_title), trim_at)\
.replace('\n', '<br/>')
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 def activate(self):
reimplemented tooltip, refactored tooltip_title into title for proper html,...
r904 """Adds tooltip mechanism to the given Html all tooltips have to have
set class `tooltip` and set attribute `tooltip_title`.
Then a tooltip will be generated based on that. All with yui js tooltip
renamed project to rhodecode
r547 """
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 js = '''
YAHOO.util.Event.onDOMReady(function(){
function toolTipsId(){
var ids = [];
var tts = YAHOO.util.Dom.getElementsByClassName('tooltip');
for (var i = 0; i < tts.length; i++) {
reimplemented tooltip, refactored tooltip_title into title for proper html,...
r904 //if element doesn't not have and id autogenerate one for tooltip
renamed project to rhodecode
r547
if (!tts[i].id){
tts[i].id='tt'+i*100;
}
ids.push(tts[i].id);
}
return ids
};
var myToolTips = new YAHOO.widget.Tooltip("tooltip", {
context: toolTipsId(),
monitorresize:false,
xyoffset :[0,0],
autodismissdelay:300000,
hidedelay:5,
showdelay:20,
});
// Set the text for the tooltip just before we display it. Lazy method
myToolTips.contextTriggerEvent.subscribe(
function(type, args) {
var context = args[0];
reimplemented tooltip, refactored tooltip_title into title for proper html,...
r904 //positioning of tooltip
var tt_w = this.element.clientWidth;//tooltip width
var tt_h = this.element.clientHeight;//tooltip height
renamed project to rhodecode
r547
var context_w = context.offsetWidth;
var context_h = context.offsetHeight;
var pos_x = YAHOO.util.Dom.getX(context);
var pos_y = YAHOO.util.Dom.getY(context);
reimplemented tooltip, refactored tooltip_title into title for proper html,...
r904 var display_strategy = 'right';
renamed project to rhodecode
r547 var xy_pos = [0,0];
switch (display_strategy){
case 'top':
var cur_x = (pos_x+context_w/2)-(tt_w/2);
reimplemented tooltip, refactored tooltip_title into title for proper html,...
r904 var cur_y = (pos_y-tt_h-4);
renamed project to rhodecode
r547 xy_pos = [cur_x,cur_y];
break;
case 'bottom':
var cur_x = (pos_x+context_w/2)-(tt_w/2);
var cur_y = pos_y+context_h+4;
xy_pos = [cur_x,cur_y];
break;
case 'left':
var cur_x = (pos_x-tt_w-4);
var cur_y = pos_y-((tt_h/2)-context_h/2);
xy_pos = [cur_x,cur_y];
break;
case 'right':
var cur_x = (pos_x+context_w+4);
var cur_y = pos_y-((tt_h/2)-context_h/2);
xy_pos = [cur_x,cur_y];
break;
default:
var cur_x = (pos_x+context_w/2)-(tt_w/2);
var cur_y = pos_y-tt_h-4;
xy_pos = [cur_x,cur_y];
break;
}
this.cfg.setProperty("xy",xy_pos);
});
//Mouse out
myToolTips.contextMouseOutEvent.subscribe(
function(type, args) {
var context = args[0];
});
});
Hacking for git support,and new faster repo scan
r631 '''
renamed project to rhodecode
r547 return literal(js)
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):
replaced all decode('utf-8') instances with .decode('utf-8','replace') for more error prof setup,...
r1100 paths = paths.decode('utf-8', 'replace')
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%">' +
ls + '</pre></div></td><td class="code">')
else:
yield 0, ('<table class="%stable">' % self.cssclass +
'<tr><td class="linenos"><div class="linenodiv"><pre>' +
ls + '</pre></div></td><td class="code">')
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
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)))
def pygmentize_annotation(filenode, **kwargs):
Added message tooltip into journal revisions in push....
r899 """pygmentize function for annotation
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):
"""generator for getting n of evenly distributed colors using
hsv color and golden ratio. It always return same order of colors
:returns: RGB tuple
Hacking for git support,and new faster repo scan
r631 """
renamed project to rhodecode
r547 import colorsys
golden_ratio = 0.618033988749895
h = 0.22717784590367374
Fixed whoosh daemon, for depracated walk method
r947
renamed project to rhodecode
r547 for c in xrange(n):
h += golden_ratio
h %= 1
HSV_tuple = [h, 0.95, 0.95]
RGB_tuple = colorsys.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
renamed project to rhodecode
r547 def url_func(changeset):
tooltip_html = "<div style='font-size:0.8em'><b>Author:</b>" + \
Hacking for git support,and new faster repo scan
r631 " %s<br/><b>Date:</b> %s</b><br/><b>Message:</b> %s<br/></div>"
renamed project to rhodecode
r547 tooltip_html = tooltip_html % (changeset.author,
changeset.date,
tooltip(changeset.message))
fixed annotation bug, added history to annotation....
r662 lnk_format = '%5s:%s' % ('r%s' % changeset.revision,
short_id(changeset.raw_id))
renamed project to rhodecode
r547 uri = link_to(
lnk_format,
url('changeset_home', repo_name=changeset.repository.name,
Fixes for raw_id, needed for git...
r636 revision=changeset.raw_id),
style=get_color_string(changeset.raw_id),
renamed project to rhodecode
r547 class_='tooltip',
reimplemented tooltip, refactored tooltip_title into title for proper html,...
r904 title=tooltip_html
renamed project to rhodecode
r547 )
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 uri += '\n'
Hacking for git support,and new faster repo scan
r631 return uri
renamed project to rhodecode
r547 return literal(annotate_highlight(filenode, url_func, **kwargs))
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 def get_changeset_safe(repo, rev):
from vcs.backends.base import BaseRepository
from vcs.exceptions import RepositoryError
if not isinstance(repo, BaseRepository):
raise Exception('You must pass an Repository '
'object as first argument got %s', type(repo))
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 try:
cs = repo.get_changeset(rev)
except RepositoryError:
from rhodecode.lib.utils import EmptyChangeset
cs = EmptyChangeset()
return cs
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 #==============================================================================
renamed project to rhodecode
r547 # MERCURIAL FILTERS available via h.
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 #==============================================================================
renamed project to rhodecode
r547 from mercurial import util
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 from mercurial.templatefilters import person as _person
def _age(curdate):
"""turns a datetime into an age string."""
#48 rewrote action logger, translated action logger messages, added some extra messages. Linked and showed pushed revisions in logs
r660
updated setup for all newest versions...
r643 if not curdate:
return ''
renamed project to rhodecode
r547
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 from datetime import timedelta, datetime
updated setup for all newest versions...
r643
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 agescales = [("year", 3600 * 24 * 365),
fixed a bug when age of last change is less than one minute
r653 ("month", 3600 * 24 * 30),
("day", 3600 * 24),
("hour", 3600),
("minute", 60),
("second", 1), ]
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635
age = datetime.now() - curdate
age_seconds = (age.days * agescales[2][1]) + age.seconds
pos = 1
for scale in agescales:
if scale[1] <= age_seconds:
fixed a bug when age of last change is less than one minute
r653 if pos == 6:pos = 5
fixed deletion of repository on filesystem, works based on scm type for git and hg....
r668 return time_ago_in_words(curdate, agescales[pos][0]) + ' ' + _('ago')
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 pos += 1
fixed deletion of repository on filesystem, works based on scm type for git and hg....
r668 return _('just now')
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()
email = util.email
email_or_none = lambda x: util.email(x) if util.email(x) != x else None
person = lambda x: _person(x)
Fixes for raw_id, needed for git...
r636 short_id = lambda x: x[:12]
renamed project to rhodecode
r547
#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
Added message tooltip into journal revisions in push....
r899
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
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():
fixed vcs import....
r953 revs_limit = 5 #display this amount always
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
another major codes rewrite:...
r1045 repo, dbrepo = ScmModel().get(repo_name, retval='repo',
invalidation_list=[])
fixes fixes fixes ! optimized queries on journal...
r1040 message = lambda rev: get_changeset_safe(repo, rev).message
Added message tooltip into journal revisions in push....
r899
fixed vcs import....
r953 cs_links = " " + ', '.join ([link_to(rev,
url('changeset_home',
repo_name=repo_name,
revision=rev), title=tooltip(message(rev)),
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:
cs_links += html_tmpl % (_('and'), uniq_id, _('%s more') \
fixed vcs import....
r953 % (len(revs) - revs_limit),
_('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>'
fixed vcs import....
r953 cs_links += html_tmpl % (uniq_id, ', '.join([link_to(rev,
url('changeset_home',
repo_name=repo_name, revision=rev),
title=message(rev), class_='tooltip')
for rev in revs[revs_limit:revs_top_limit]]))
hidden compare view link for single revision push
r1024 if len(revs) > 1:
cs_links += compare_view
fixed vcs import....
r953 return 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),
#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',
#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):
#21 added optional flag to disable gravatar, and use local icon
r1110 if not str2bool(config['app_conf'].get('use_gravatar')):
return "/images/user%s.png" % size
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
email_address = email_address.encode('utf8', 'replace')
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
#==============================================================================
# REPO PAGER
#==============================================================================
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
self.page_count = ((self.item_count - 1) / self.items_per_page) + 1
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
self.first_item = max(0, (self.item_count) - (self.page * items_per_page))
Added branch filter to repo pager...
r1105 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)
renamed project to rhodecode
r547 def safe_unicode(str):
"""safe unicode function. In case of UnicodeDecode error we try to return
unicode with errors replace, if this failes we return unicode with
string_escape decoding """
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 try:
u_str = unicode(str)
except UnicodeDecodeError:
try:
u_str = unicode(str, 'utf-8', 'replace')
except UnicodeDecodeError:
#incase we have a decode error just represent as byte string
u_str = unicode(str(str).encode('string_escape'))
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 return u_str
moved tooltip function from the for loop and from templates to helpers
r990
def changed_tooltip(nodes):
if nodes:
pref = ': <br/> '
suf = ''
if len(nodes) > 30:
suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
replaced all decode('utf-8') instances with .decode('utf-8','replace') for more error prof setup,...
r1100 return literal(pref + '<br/> '.join([x.path.decode('utf-8', 'replace') for x in nodes[:30]]) + suf)
moved tooltip function from the for loop and from templates to helpers
r990 else:
return ': ' + _('No Files')