def delete(self, group_name): """DELETE /repo_groups/group_name: Delete an existing item""" # Forms posted to this method should contain a hidden field: # <input type="hidden" name="_method" value="DELETE" /> # Or using helpers: # h.form(url('repos_group', group_name=GROUP_NAME), method='delete') # url('repo_group_home', group_name=GROUP_NAME) gr = c.repo_group = RepoGroupModel()._get_repo_group(group_name) repos = gr.repositories.all() if repos: msg = ungettext( 'This group contains %(num)d repository and cannot be deleted', 'This group contains %(num)d repositories and cannot be' ' deleted', len(repos)) % { 'num': len(repos) } h.flash(msg, category='warning') return redirect(url('repo_groups')) children = gr.children.all() if children: msg = ungettext( 'This group contains %(num)d subgroup and cannot be deleted', 'This group contains %(num)d subgroups and cannot be deleted', len(children)) % { 'num': len(children) } h.flash(msg, category='warning') return redirect(url('repo_groups')) try: RepoGroupModel().delete(group_name) Session().commit() h.flash(_('Removed repository group %s') % group_name, category='success') # TODO: in future action_logger(, '', '', '', self.sa) except Exception: log.exception("Exception during deletion of repository group") h.flash( _('Error occurred during deletion of repository group %s') % group_name, category='error') return redirect(url('repo_groups'))
def test_pylons_lazy_translation_string(pylonsapp): data = {'label': _('hello')} data2 = {'label2': ungettext('singular', 'plural', 1)} assert json.dumps(data) == '{"label": "hello"}' assert json.dumps(data2) == '{"label2": "singular"}'
def age(prevdate, show_short_version=False, now=None): """ turns a datetime into an age string. If show_short_version is True, then it will generate a not so accurate but shorter string, example: 2days ago, instead of 2 days and 23 hours ago. :param prevdate: datetime object :param show_short_version: if it should aproximate the date and return a shorter string :rtype: unicode :returns: unicode words describing age """ now = now or datetime.datetime.now() order = ['year', 'month', 'day', 'hour', 'minute', 'second'] deltas = {} future = False if prevdate > now: now, prevdate = prevdate, now future = True if future: prevdate = prevdate.replace(microsecond=0) # Get date parts deltas from dateutil import relativedelta for part in order: d = relativedelta.relativedelta(now, prevdate) deltas[part] = getattr(d, part + 's') # Fix negative offsets (there is 1 second between 10:59:59 and 11:00:00, # not 1 hour, -59 minutes and -59 seconds) for num, length in [(5, 60), (4, 60), (3, 24)]: # seconds, minutes, hours part = order[num] carry_part = order[num - 1] if deltas[part] < 0: deltas[part] += length deltas[carry_part] -= 1 # Same thing for days except that the increment depends on the (variable) # number of days in the month month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if deltas['day'] < 0: if prevdate.month == 2 and (prevdate.year % 4 == 0 and (prevdate.year % 100 != 0 or prevdate.year % 400 == 0)): deltas['day'] += 29 else: deltas['day'] += month_lengths[prevdate.month - 1] deltas['month'] -= 1 if deltas['month'] < 0: deltas['month'] += 12 deltas['year'] -= 1 # Format the result fmt_funcs = { 'year': lambda d: ungettext(u'%d year', '%d years', d) % d, 'month': lambda d: ungettext(u'%d month', '%d months', d) % d, 'day': lambda d: ungettext(u'%d day', '%d days', d) % d, 'hour': lambda d: ungettext(u'%d hour', '%d hours', d) % d, 'minute': lambda d: ungettext(u'%d minute', '%d minutes', d) % d, 'second': lambda d: ungettext(u'%d second', '%d seconds', d) % d, } for i, part in enumerate(order): value = deltas[part] if value == 0: continue if i < 5: sub_part = order[i + 1] sub_value = deltas[sub_part] else: sub_value = 0 if sub_value == 0 or show_short_version: if future: return _(u'in %s') % fmt_funcs[part](value) else: return _(u'%s ago') % fmt_funcs[part](value) if future: return _(u'in %s and %s') % (fmt_funcs[part](value), fmt_funcs[sub_part](sub_value)) else: return _(u'%s and %s ago') % (fmt_funcs[part](value), fmt_funcs[sub_part](sub_value)) return _(u'just now')
def age(prevdate): """ turns a datetime into an age string. :param prevdate: datetime object :rtype: unicode :returns: unicode words describing age """ order = ['year', 'month', 'day', 'hour', 'minute', 'second'] deltas = {} future = False # Get date parts deltas now = datetime.datetime.now() if prevdate > now: now, prevdate = prevdate, now future = True for part in order: deltas[part] = getattr(now, part) - getattr(prevdate, part) # Fix negative offsets (there is 1 second between 10:59:59 and 11:00:00, # not 1 hour, -59 minutes and -59 seconds) for num, length in [(5, 60), (4, 60), (3, 24)]: # seconds, minutes, hours part = order[num] carry_part = order[num - 1] if deltas[part] < 0: deltas[part] += length deltas[carry_part] -= 1 # Same thing for days except that the increment depends on the (variable) # number of days in the month month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if deltas['day'] < 0: if prevdate.month == 2 and (prevdate.year % 4 == 0 and (prevdate.year % 100 != 0 or prevdate.year % 400 == 0)): deltas['day'] += 29 else: deltas['day'] += month_lengths[prevdate.month - 1] deltas['month'] -= 1 if deltas['month'] < 0: deltas['month'] += 12 deltas['year'] -= 1 # Format the result fmt_funcs = { 'year': lambda d: ungettext(u'%d year', '%d years', d) % d, 'month': lambda d: ungettext(u'%d month', '%d months', d) % d, 'day': lambda d: ungettext(u'%d day', '%d days', d) % d, 'hour': lambda d: ungettext(u'%d hour', '%d hours', d) % d, 'minute': lambda d: ungettext(u'%d minute', '%d minutes', d) % d, 'second': lambda d: ungettext(u'%d second', '%d seconds', d) % d, } for i, part in enumerate(order): value = deltas[part] if value == 0: continue if i < 5: sub_part = order[i + 1] sub_value = deltas[sub_part] else: sub_value = 0 if sub_value == 0: if future: return _(u'in %s') % fmt_funcs[part](value) else: return _(u'%s ago') % fmt_funcs[part](value) if future: return _(u'in %s and %s') % (fmt_funcs[part](value), fmt_funcs[sub_part](sub_value)) else: return _(u'%s and %s ago') % (fmt_funcs[part](value), fmt_funcs[sub_part](sub_value)) return _(u'just now')
def age(prevdate, now=None, show_short_version=False, show_suffix=True, short_format=False): """ Turns a datetime into an age string. If show_short_version is True, this generates a shorter string with an approximate age; ex. '1 day ago', rather than '1 day and 23 hours ago'. * IMPORTANT* Code of this function is written in special way so it's easier to backport it to javascript. If you mean to update it, please also update `jquery.timeago-extension.js` file :param prevdate: datetime object :param now: get current time, if not define we use `datetime.datetime.now()` :param show_short_version: if it should approximate the date and return a shorter string :param show_suffix: :param short_format: show short format, eg 2D instead of 2 days :rtype: unicode :returns: unicode words describing age """ from pylons.i18n.translation import _, ungettext def _get_relative_delta(now, prevdate): base = dateutil.relativedelta.relativedelta(now, prevdate) return { 'year': base.years, 'month': base.months, 'day': base.days, 'hour': base.hours, 'minute': base.minutes, 'second': base.seconds, } def _is_leap_year(year): return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) def get_month(prevdate): return prevdate.month def get_year(prevdate): return prevdate.year now = now or datetime.datetime.now() order = ['year', 'month', 'day', 'hour', 'minute', 'second'] deltas = {} future = False if prevdate > now: now_old = now now = prevdate prevdate = now_old future = True if future: prevdate = prevdate.replace(microsecond=0) # Get date parts deltas for part in order: rel_delta = _get_relative_delta(now, prevdate) deltas[part] = rel_delta[part] # Fix negative offsets (there is 1 second between 10:59:59 and 11:00:00, # not 1 hour, -59 minutes and -59 seconds) offsets = [[5, 60], [4, 60], [3, 24]] for element in offsets: # seconds, minutes, hours num = element[0] length = element[1] part = order[num] carry_part = order[num - 1] if deltas[part] < 0: deltas[part] += length deltas[carry_part] -= 1 # Same thing for days except that the increment depends on the (variable) # number of days in the month month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if deltas['day'] < 0: if get_month(prevdate) == 2 and _is_leap_year(get_year(prevdate)): deltas['day'] += 29 else: deltas['day'] += month_lengths[get_month(prevdate) - 1] deltas['month'] -= 1 if deltas['month'] < 0: deltas['month'] += 12 deltas['year'] -= 1 # Format the result if short_format: fmt_funcs = { 'year': lambda d: u'%dy' % d, 'month': lambda d: u'%dm' % d, 'day': lambda d: u'%dd' % d, 'hour': lambda d: u'%dh' % d, 'minute': lambda d: u'%dmin' % d, 'second': lambda d: u'%dsec' % d, } else: fmt_funcs = { 'year': lambda d: ungettext(u'%d year', '%d years', d) % d, 'month': lambda d: ungettext(u'%d month', '%d months', d) % d, 'day': lambda d: ungettext(u'%d day', '%d days', d) % d, 'hour': lambda d: ungettext(u'%d hour', '%d hours', d) % d, 'minute': lambda d: ungettext(u'%d minute', '%d minutes', d) % d, 'second': lambda d: ungettext(u'%d second', '%d seconds', d) % d, } i = 0 for part in order: value = deltas[part] if value != 0: if i < 5: sub_part = order[i + 1] sub_value = deltas[sub_part] else: sub_value = 0 if sub_value == 0 or show_short_version: _val = fmt_funcs[part](value) if future: if show_suffix: return _(u'in %s') % _val else: return _val else: if show_suffix: return _(u'%s ago') % _val else: return _val val = fmt_funcs[part](value) val_detail = fmt_funcs[sub_part](sub_value) if short_format: datetime_tmpl = u'%s, %s' if show_suffix: datetime_tmpl = _(u'%s, %s ago') if future: datetime_tmpl = _(u'in %s, %s') else: datetime_tmpl = _(u'%s and %s') if show_suffix: datetime_tmpl = _(u'%s and %s ago') if future: datetime_tmpl = _(u'in %s and %s') return datetime_tmpl % (val, val_detail) i += 1 return _(u'just now')