def export_priorites(self, template_path): """Export priority data into a new priority.xml file. Get the different ticket priority values from the enum table and save the result into a priority.xml file. """ # a list to return to the template with info about transaction successful_exports = list() # create the XML tree self.log.info("Creating priority XML file for template archive") root = ET.Element("ticket_priority", project=self.env.project_name, date=datetime.date.today().isoformat()) for priority in Priority.select(self.env): ET.SubElement(root, "priority_info", name=priority.name, value=str(priority.value)) successful_exports.append(priority.name) # create the xml file filename = os.path.join(template_path, 'priority.xml') ET.ElementTree(root).write(filename) self.log.info("File %s has been created at %s" % (filename, template_path)) return successful_exports
def _render_ics(self, req, milestones): req.send_response(200) req.send_header('Content-Type', 'text/calendar;charset=utf-8') buf = io.StringIO() from trac.ticket import Priority priorities = {} for priority in Priority.select(self.env): priorities[priority.name] = float(priority.value) def get_priority(ticket): value = priorities.get(ticket['priority']) if value: return int( (len(priorities) + 8 * value - 9) / (len(priorities) - 1)) def get_status(ticket): status = ticket['status'] if status == 'new' or status == 'reopened' and \ not ticket['owner']: return 'NEEDS-ACTION' elif status in ('assigned', 'reopened'): return 'IN-PROCESS' elif status == 'closed': if ticket['resolution'] == 'fixed': return 'COMPLETED' else: return 'CANCELLED' else: return '' def escape_value(text): s = ''.join(map(lambda c: '\\' + c if c in ';,\\' else c, text)) return '\\n'.join(re.split(r'[\r\n]+', s)) def write_prop(name, value, params={}): text = ';'.join([name] + [k + '=' + v for k, v in params.items()]) + \ ':' + escape_value(value) firstline = 1 text = to_unicode(text) while text: if not firstline: text = ' ' + text else: firstline = 0 buf.write(text[:75] + CRLF) text = text[75:] def write_date(name, value, params={}): params['VALUE'] = 'DATE' write_prop(name, format_date(value, '%Y%m%d', req.tz), params) def write_utctime(name, value, params={}): write_prop(name, format_datetime(value, '%Y%m%dT%H%M%SZ', utc), params) host = req.base_url[req.base_url.find('://') + 3:] user = req.args.get('user', 'anonymous') write_prop('BEGIN', 'VCALENDAR') write_prop('VERSION', '2.0') write_prop( 'PRODID', '-//Edgewall Software//NONSGML Trac %s//EN' % self.env.trac_version) write_prop('METHOD', 'PUBLISH') write_prop('X-WR-CALNAME', self.env.project_name + ' - ' + _("Roadmap")) write_prop('X-WR-CALDESC', self.env.project_description) write_prop('X-WR-TIMEZONE', str(req.tz)) all_tickets = get_tickets_for_all_milestones(self.env, field='owner') for milestone in milestones: uid = '<%s/milestone/%s@%s>' % (req.base_path, milestone.name, host) if milestone.due: write_prop('BEGIN', 'VEVENT') write_prop('UID', uid) write_utctime('DTSTAMP', milestone.due) write_date('DTSTART', milestone.due) write_prop('SUMMARY', _("Milestone %(name)s", name=milestone.name)) write_prop('URL', req.abs_href.milestone(milestone.name)) if milestone.description: write_prop('DESCRIPTION', milestone.description) write_prop('END', 'VEVENT') tickets = all_tickets.get(milestone.name) or [] tickets = apply_ticket_permissions(self.env, req, tickets) for tkt_id in [ ticket['id'] for ticket in tickets if ticket['owner'] == user ]: ticket = Ticket(self.env, tkt_id) write_prop('BEGIN', 'VTODO') write_prop('UID', '<%s/ticket/%s@%s>' % (req.base_path, tkt_id, host)) if milestone.due: write_prop('RELATED-TO', uid) write_date('DUE', milestone.due) write_prop( 'SUMMARY', _("Ticket #%(num)s: %(summary)s", num=ticket.id, summary=ticket['summary'])) write_prop('URL', req.abs_href.ticket(ticket.id)) write_prop('DESCRIPTION', ticket['description']) priority = get_priority(ticket) if priority: write_prop('PRIORITY', unicode(priority)) write_prop('STATUS', get_status(ticket)) if ticket['status'] == 'closed': for time, in self.env.db_query( """ SELECT time FROM ticket_change WHERE ticket=%s AND field='status' ORDER BY time desc LIMIT 1 """, (ticket.id, )): write_utctime('COMPLETED', from_utimestamp(time)) write_prop('END', 'VTODO') write_prop('END', 'VCALENDAR') ics_str = buf.getvalue().encode('utf-8') req.send_header('Content-Length', len(ics_str)) req.end_headers() req.write(ics_str) raise RequestDone
def __init__(self): self.log.info('version: %s - id: %s' % (__version__, str(__id__))) from trac.ticket import Priority for priority in Priority.select(self.env): self._priorities[priority.name] = int(priority.value)
def render_ics(self, req, db, milestones): req.send_response(200) req.send_header('Content-Type', 'text/calendar;charset=utf-8') buf = StringIO() from trac.ticket import Priority priorities = {} for priority in Priority.select(self.env): priorities[priority.name] = float(priority.value) def get_priority(ticket): value = priorities.get(ticket['priority']) if value: return int((len(priorities) + 8 * value - 9) / (len(priorities) - 1)) def get_status(ticket): status = ticket['status'] if status == 'new' or status == 'reopened' and not ticket['owner']: return 'NEEDS-ACTION' elif status == 'assigned' or status == 'reopened': return 'IN-PROCESS' elif status == 'closed': if ticket['resolution'] == 'fixed': return 'COMPLETED' else: return 'CANCELLED' else: return '' def escape_value(text): s = ''.join(map(lambda c: (c in ';,\\') and '\\' + c or c, text)) return '\\n'.join(re.split(r'[\r\n]+', s)) def write_prop(name, value, params={}): text = ';'.join([name] + [k + '=' + v for k, v in params.items()]) \ + ':' + escape_value(value) firstline = 1 while text: if not firstline: text = ' ' + text else: firstline = 0 buf.write(text[:75] + CRLF) text = text[75:] def write_date(name, value, params={}): params['VALUE'] = 'DATE' write_prop(name, format_date(value, '%Y%m%d', req.tz), params) def write_utctime(name, value, params={}): write_prop(name, format_datetime(value, '%Y%m%dT%H%M%SZ', utc), params) host = req.base_url[req.base_url.find('://') + 3:] user = req.args.get('user', 'anonymous') write_prop('BEGIN', 'VCALENDAR') write_prop('VERSION', '2.0') write_prop('PRODID', '-//Edgewall Software//NONSGML Trac %s//EN' % __version__) write_prop('METHOD', 'PUBLISH') write_prop('X-WR-CALNAME', self.env.project_name + ' - ' + _('Roadmap')) for milestone in milestones: uid = '<%s/milestone/%s@%s>' % (req.base_path, milestone.name, host) if milestone.due: write_prop('BEGIN', 'VEVENT') write_prop('UID', uid) write_utctime('DTSTAMP', milestone.due) write_date('DTSTART', milestone.due) write_prop('SUMMARY', _('Milestone %(name)s', name=milestone.name)) write_prop('URL', req.abs_href.milestone(milestone.name)) if milestone.description: write_prop('DESCRIPTION', milestone.description) write_prop('END', 'VEVENT') tickets = get_tickets_for_milestone(self.env, db, milestone.name, field='owner') tickets = apply_ticket_permissions(self.env, req, tickets) for tkt_id in [ticket['id'] for ticket in tickets if ticket['owner'] == user]: ticket = Ticket(self.env, tkt_id) write_prop('BEGIN', 'VTODO') write_prop('UID', '<%s/ticket/%s@%s>' % (req.base_path, tkt_id, host)) if milestone.due: write_prop('RELATED-TO', uid) write_date('DUE', milestone.due) write_prop('SUMMARY', _('Ticket #%(num)s: %(summary)s', num=ticket.id, summary=ticket['summary'])) write_prop('URL', req.abs_href.ticket(ticket.id)) write_prop('DESCRIPTION', ticket['description']) priority = get_priority(ticket) if priority: write_prop('PRIORITY', unicode(priority)) write_prop('STATUS', get_status(ticket)) if ticket['status'] == 'closed': cursor = db.cursor() cursor.execute("SELECT time FROM ticket_change " "WHERE ticket=%s AND field='status' " "ORDER BY time desc LIMIT 1", (ticket.id,)) row = cursor.fetchone() if row: write_utctime('COMPLETED', from_utimestamp(row[0])) write_prop('END', 'VTODO') write_prop('END', 'VCALENDAR') ics_str = buf.getvalue().encode('utf-8') req.send_header('Content-Length', len(ics_str)) req.end_headers() req.write(ics_str) raise RequestDone
def render_ics(self, req, db, milestones): req.send_response(200) req.send_header('Content-Type', 'text/calendar;charset=utf-8') req.end_headers() from trac.ticket import Priority priorities = {} for priority in Priority.select(self.env): priorities[priority.name] = float(priority.value) def get_priority(ticket): value = priorities.get(ticket['priority']) if value: return int(value * 9 / len(priorities)) def get_status(ticket): status = ticket['status'] if status == 'new' or status == 'reopened' and not ticket['owner']: return 'NEEDS-ACTION' elif status == 'assigned' or status == 'reopened': return 'IN-PROCESS' elif status == 'closed': if ticket['resolution'] == 'fixed': return 'COMPLETED' else: return 'CANCELLED' else: return '' def escape_value(text): s = ''.join(map(lambda c: (c in ';,\\') and '\\' + c or c, text)) return '\\n'.join(re.split(r'[\r\n]+', s)) def write_prop(name, value, params={}): text = ';'.join([name] + [k + '=' + v for k, v in params.items()]) \ + ':' + escape_value(value) firstline = 1 while text: if not firstline: text = ' ' + text else: firstline = 0 req.write(text[:75] + CRLF) text = text[75:] def write_date(name, value, params={}): params['VALUE'] = 'DATE' write_prop(name, strftime('%Y%m%d', value), params) def write_utctime(name, value, params={}): write_prop(name, strftime('%Y%m%dT%H%M%SZ', value), params) host = req.base_url[req.base_url.find('://') + 3:] user = req.args.get('user', 'anonymous') write_prop('BEGIN', 'VCALENDAR') write_prop('VERSION', '2.0') write_prop('PRODID', '-//Edgewall Software//NONSGML Trac %s//EN' % __version__) write_prop('METHOD', 'PUBLISH') write_prop('X-WR-CALNAME', self.config.get('project', 'name') + ' - Roadmap') for milestone in milestones: uid = '<%s/milestone/%s@%s>' % (req.base_path, milestone['name'], host) if milestone.has_key('due'): write_prop('BEGIN', 'VEVENT') write_prop('UID', uid) write_utctime('DTSTAMP', localtime(milestone['due'])) write_date('DTSTART', localtime(milestone['due'])) write_prop('SUMMARY', 'Milestone %s' % milestone['name']) write_prop('URL', req.base_url + '/milestone/' + milestone['name']) if milestone.has_key('description_source'): write_prop('DESCRIPTION', milestone['description_source']) write_prop('END', 'VEVENT') for tkt_id in [ ticket['id'] for ticket in milestone['tickets'] if ticket['owner'] == user ]: ticket = Ticket(self.env, tkt_id) write_prop('BEGIN', 'VTODO') write_prop('UID', '<%s/ticket/%s@%s>' % (req.base_path, tkt_id, host)) if milestone.has_key('due'): write_prop('RELATED-TO', uid) write_date('DUE', localtime(milestone['due'])) write_prop('SUMMARY', 'Ticket #%i: %s' % (ticket.id, ticket['summary'])) write_prop('URL', req.abs_href.ticket(ticket.id)) write_prop('DESCRIPTION', ticket['description']) priority = get_priority(ticket) if priority: write_prop('PRIORITY', unicode(priority)) write_prop('STATUS', get_status(ticket)) if ticket['status'] == 'closed': cursor = db.cursor() cursor.execute( "SELECT time FROM ticket_change " "WHERE ticket=%s AND field='status' " "ORDER BY time desc LIMIT 1", (ticket.id, )) row = cursor.fetchone() if row: write_utctime('COMPLETED', localtime(row[0])) write_prop('END', 'VTODO') write_prop('END', 'VCALENDAR')
def get_priorities(self): return [prio.name for prio in Priority.select(self.env)]
def render_ics(self, req, db, milestones): req.send_response(200) req.send_header('Content-Type', 'text/calendar;charset=utf-8') req.end_headers() from trac.ticket import Priority priorities = {} for priority in Priority.select(self.env): priorities[priority.name] = float(priority.value) def get_priority(ticket): value = priorities.get(ticket['priority']) if value: return int(value * 9 / len(priorities)) def get_status(ticket): status = ticket['status'] if status == 'new' or status == 'reopened' and not ticket['owner']: return 'NEEDS-ACTION' elif status == 'assigned' or status == 'reopened': return 'IN-PROCESS' elif status == 'closed': if ticket['resolution'] == 'fixed': return 'COMPLETED' else: return 'CANCELLED' else: return '' def escape_value(text): s = ''.join(map(lambda c: (c in ';,\\') and '\\' + c or c, text)) return '\\n'.join(re.split(r'[\r\n]+', s)) def write_prop(name, value, params={}): text = ';'.join([name] + [k + '=' + v for k, v in params.items()]) \ + ':' + escape_value(value) firstline = 1 while text: if not firstline: text = ' ' + text else: firstline = 0 req.write(text[:75] + CRLF) text = text[75:] def write_date(name, value, params={}): params['VALUE'] = 'DATE' write_prop(name, strftime('%Y%m%d', value), params) def write_utctime(name, value, params={}): write_prop(name, strftime('%Y%m%dT%H%M%SZ', value), params) host = req.base_url[req.base_url.find('://') + 3:] user = req.args.get('user', 'anonymous') write_prop('BEGIN', 'VCALENDAR') write_prop('VERSION', '2.0') write_prop('PRODID', '-//Edgewall Software//NONSGML Trac %s//EN' % __version__) write_prop('METHOD', 'PUBLISH') write_prop('X-WR-CALNAME', self.config.get('project', 'name') + ' - Roadmap') for milestone in milestones: uid = '<%s/milestone/%s@%s>' % (req.base_path, milestone['name'], host) if milestone.has_key('due'): write_prop('BEGIN', 'VEVENT') write_prop('UID', uid) write_utctime('DTSTAMP', localtime(milestone['due'])) write_date('DTSTART', localtime(milestone['due'])) write_prop('SUMMARY', 'Milestone %s' % milestone['name']) write_prop('URL', req.base_url + '/milestone/' + milestone['name']) if milestone.has_key('description_source'): write_prop('DESCRIPTION', milestone['description_source']) write_prop('END', 'VEVENT') for tkt_id in [ticket['id'] for ticket in milestone['tickets'] if ticket['owner'] == user]: ticket = Ticket(self.env, tkt_id) write_prop('BEGIN', 'VTODO') write_prop('UID', '<%s/ticket/%s@%s>' % (req.base_path, tkt_id, host)) if milestone.has_key('due'): write_prop('RELATED-TO', uid) write_date('DUE', localtime(milestone['due'])) write_prop('SUMMARY', u'티켓 #%i: %s' % (ticket.id, ticket['summary'])) write_prop('URL', req.abs_href.ticket(ticket.id)) write_prop('DESCRIPTION', ticket['description']) priority = get_priority(ticket) if priority: write_prop('PRIORITY', unicode(priority)) write_prop('STATUS', get_status(ticket)) if ticket['status'] == 'closed': cursor = db.cursor() cursor.execute("SELECT time FROM ticket_change " "WHERE ticket=%s AND field='status' " "ORDER BY time desc LIMIT 1", (ticket.id,)) row = cursor.fetchone() if row: write_utctime('COMPLETED', localtime(row[0])) write_prop('END', 'VTODO') write_prop('END', 'VCALENDAR')