def _fetch_ticket(self): rts = RemoteTicketSystem(self.env) db = self.env.get_read_db() cursor = db.cursor() # Try to retrieve remote ticket from cache cursor.execute( '''SELECT %s FROM remote_tickets WHERE remote_name=%%s and id=%%s ''' % (', '.join(self.table_fields)), (self.remote_name, self.id)) row = cursor.fetchone() # Remote ticket not in cache if not row: self._refresh_ticket() self._cachetime = from_utimestamp(row[self.cachetime_pos]) ttl = timedelta(seconds=int(rts.cache_ttl) // 1000, microseconds=int(rts.cache_ttl) % 1000 * 1000) # Cached remote ticket is too old if self._cachetime < datetime.now(utc) - ttl: self._refresh_ticket() # Cached ticket is valid, populate instance for name, value in zip(self.remote_fields, row): if name in self.time_fields: self.values[name] = from_utimestamp(value) elif value is None: self.values[name] = empty else: self.values[name] = value
def _fetch_ticket(self): rts = RemoteTicketSystem(self.env) db = self.env.get_read_db() cursor = db.cursor() # Try to retrieve remote ticket from cache cursor.execute('''SELECT %s FROM remote_tickets WHERE remote_name=%%s and id=%%s ''' % (', '.join(self.table_fields)), (self.remote_name, self.id)) row = cursor.fetchone() # Remote ticket not in cache if not row: self._refresh_ticket() self._cachetime = from_utimestamp(row[self.cachetime_pos]) ttl = timedelta(seconds=int(rts.cache_ttl) // 1000, microseconds=int(rts.cache_ttl) % 1000 * 1000) # Cached remote ticket is too old if self._cachetime < datetime.now(utc) - ttl: self._refresh_ticket() # Cached ticket is valid, populate instance for name, value in zip(self.remote_fields, row): if name in self.time_fields: self.values[name] = from_utimestamp(value) elif value is None: self.values[name] = empty else: self.values[name] = value
def _do_add(self, filename, *arguments): # Get downloads API component. api = self.env[DownloadsApi] # Create context. context = Context('downloads-consoleadmin') db = self.env.get_db_cnx() context.cursor = db.cursor() context.req = FakeRequest(self.env, self.consoleadmin_user) # Be sure, we have correct path req_path = conf.getEnvironmentDownloadsPath(self.env) # Convert relative path to absolute. if not os.path.isabs(filename): filename = os.path.join(req_path, filename) # Open file object. file, filename, file_size = self._get_file(filename) # Create download dictionary from arbitrary attributes. download = {'file' : filename, 'size' : file_size, 'time' : to_timestamp(datetime.now(utc)), 'count' : 0} # Read optional attributes from arguments. for argument in arguments: # Check correct format. argument = argument.split("=") if len(argument) != 2: AdminCommandError(_('Invalid format of download attribute:' ' %(value)s', value = argument)) name, value = argument # Check known arguments. if not name in ('description', 'author', 'tags', 'component', 'version', 'platform', 'type'): raise AdminCommandError(_('Invalid download attribute: %(value)s', value = name)) # Transform platform and type name to ID. if name == 'platform': value = api.get_platform_by_name(context, value)['id'] elif name == 'type': value = api.get_type_by_name(context, value)['id'] # Add attribute to download. download[name] = value self.log.debug(download) # Upload file to DB and file storage. api.store_download(context, download, file) # Close input file and commit changes in DB. file.close() db.commit()
def validate_ticket(self, req, ticket): today = datetime.now().date() day_start = datetime(today.year, today.month, today.day, 0, 0 ,0 ,0, timezone(self.timezone_basis)) self.log.debug("LimitedTickets validate_ticket (ticket time: %s), restricted components: %s %s, %u", ticket['time'], self.limited_components, day_start, to_utimestamp(day_start)) if not 'TICKET_ADMIN' in req.perm or not self.admin_unlimited: # is new ticket for a limited component if not ticket.exists and ticket['component'] in self.limited_components: component = ticket['component'] reporter = ticket['reporter'] perday = self.limited_components[component] # check that the ticket doesn't violate the limit rows = self.env.db_query("SELECT count(id) FROM ticket WHERE reporter=%s" "and component=%s and time>%s", (reporter, component, to_utimestamp(day_start))) self.log.debug("Ticket Creation Attempt with restricted component: %s, rows: %s", component, rows) if rows and int(rows[0][0]) >= int(perday): return [(None, "Only %u ticket(s)/day allowed for %s" % (int(perday),component))] return []
def current_timestamp(): return to_timestamp(datetime.now(utc))
args = (self.remote_name, xmlrpc_addr, e.args) self.env.log.warn(log, *args) raise ResourceNotFound(msg % args, "Network error") except Exception,e: msg = ("Unknown exception contacting remote Trac '%s' at %s. " "Exception args: %s %s %s") args = (self.remote_name, xmlrpc_addr, e, type(e), e.args) self.env.log.error(msg, *args) raise # Convert from DateTime used by xmlrpclib to datetime used by trac for k in self.time_fields: tkt_vals[3][k] = parse_date(tkt_vals[3][k].value, utc) self.values.update(tkt_vals[3]) self._cachetime = datetime.now(utc) self.save() def __getitem__(self, name): return self.values.get(name) def __setitem__(self, name, value): self.values[name] = value def populate(self, values): field_names = [f['name'] for f in self.fields if f['name'] in values] for name in field_names: self[name] = values.get(name, '') def save(self, when=None):
def get_list(self, realm, wl, req, fields=None): db = self.env.get_db_cnx() cursor = db.cursor() context = Context.from_request(req) locale = getattr(req, 'locale', LC_TIME) ticketlist = [] extradict = {} if not fields: fields = set(self.default_fields['ticket']) else: fields = set(fields) if 'changetime' in fields: max_changetime = datetime(1970, 1, 1, tzinfo=utc) min_changetime = datetime.now(utc) if 'time' in fields: max_time = datetime(1970, 1, 1, tzinfo=utc) min_time = datetime.now(utc) for sid, last_visit in wl.get_watched_resources( 'ticket', req.authname): ticketdict = {} try: ticket = Ticket(self.env, sid, db) exists = ticket.exists except: exists = False if not exists: ticketdict['deleted'] = True if 'id' in fields: ticketdict['id'] = sid ticketdict['ID'] = '#' + sid if 'author' in fields: ticketdict['author'] = '?' if 'changetime' in fields: ticketdict['changedsincelastvisit'] = 1 ticketdict['changetime'] = '?' ticketdict['ichangetime'] = 0 if 'time' in fields: ticketdict['time'] = '?' ticketdict['itime'] = 0 if 'comment' in fields: ticketdict['comment'] = tag.strong(t_("deleted"), class_='deleted') if 'notify' in fields: ticketdict['notify'] = wl.is_notify(req, 'ticket', sid) if 'description' in fields: ticketdict['description'] = '' if 'owner' in fields: ticketdict['owner'] = '' if 'reporter' in fields: ticketdict['reporter'] = '' ticketlist.append(ticketdict) continue render_elt = lambda x: x if not (Chrome(self.env).show_email_addresses or \ 'EMAIL_VIEW' in req.perm(ticket.resource)): render_elt = obfuscate_email_address # Copy all requested fields from ticket if fields: for f in fields: ticketdict[f] = ticket.values.get(f, u'') else: ticketdict = ticket.values.copy() changetime = ticket.time_changed if wl.options['attachment_changes']: for attachment in Attachment.select(self.env, 'ticket', sid, db): if attachment.date > changetime: changetime = attachment.date if 'attachment' in fields: attachments = [] for attachment in Attachment.select(self.env, 'ticket', sid, db): wikitext = u'[attachment:"' + u':'.join([ attachment.filename, 'ticket', sid ]) + u'" ' + attachment.filename + u']' attachments.extend([ tag(', '), format_to_oneliner(self.env, context, wikitext, shorten=False) ]) if attachments: attachments.reverse() attachments.pop() ticketdict['attachment'] = moreless(attachments, 5) # Changes are special. Comment, commentnum and last author are included in them. if 'changes' in fields or 'author' in fields or 'comment' in fields or 'commentnum' in fields: changes = [] # If there are now changes the reporter is the last author author = ticket.values['reporter'] commentnum = u"0" comment = u"" want_changes = 'changes' in fields for date, cauthor, field, oldvalue, newvalue, permanent in ticket.get_changelog( changetime, db): author = cauthor if field == 'comment': if 'commentnum' in fields: ticketdict['commentnum'] = to_unicode(oldvalue) if 'comment' in fields: comment = to_unicode(newvalue) comment = moreless(comment, 200) ticketdict['comment'] = comment if not want_changes: break else: if want_changes: label = self.fields['ticket'].get(field, u'') if label: changes.extend([ tag( tag.strong(label), ' ', render_property_diff( self.env, req, ticket, field, oldvalue, newvalue)), tag('; ') ]) if want_changes: # Remove the last tag('; '): if changes: changes.pop() changes = moreless(changes, 5) ticketdict['changes'] = tag(changes) if 'id' in fields: ticketdict['id'] = sid ticketdict['ID'] = format_to_oneliner(self.env, context, '#' + sid, shorten=True) if 'cc' in fields: if render_elt == obfuscate_email_address: ticketdict['cc'] = ', '.join( [render_elt(c) for c in ticketdict['cc'].split(', ')]) if 'author' in fields: ticketdict['author'] = render_elt(author) if 'changetime' in fields: ichangetime = to_timestamp(changetime) ticketdict.update( changetime=format_datetime(changetime, locale=locale, tzinfo=req.tz), ichangetime=ichangetime, changedsincelastvisit=(last_visit < ichangetime and 1 or 0), changetime_delta=pretty_timedelta(changetime), changetime_link=req.href.timeline( precision='seconds', from_=trac_format_datetime(changetime, 'iso8601', tzinfo=req.tz))) if changetime > max_changetime: max_changetime = changetime if changetime < min_changetime: min_changetime = changetime if 'time' in fields: time = ticket.time_created ticketdict.update(time=format_datetime(time, locale=locale, tzinfo=req.tz), itime=to_timestamp(time), time_delta=pretty_timedelta(time), time_link=req.href.timeline( precision='seconds', from_=trac_format_datetime( time, 'iso8601', tzinfo=req.tz))) if time > max_time: max_time = time if time < min_time: min_time = time if 'description' in fields: description = ticket.values['description'] description = moreless(description, 200) ticketdict['description'] = description if 'notify' in fields: ticketdict['notify'] = wl.is_notify(req, 'ticket', sid) if 'owner' in fields: ticketdict['owner'] = render_elt(ticket.values['owner']) if 'reporter' in fields: ticketdict['reporter'] = render_elt(ticket.values['reporter']) if 'tags' in fields and self.tagsystem: tags = [] for t in self.tagsystem.get_tags(req, Resource('ticket', sid)): tags.extend( [tag.a(t, href=req.href('tags', q=t)), tag(', ')]) if tags: tags.pop() ticketdict['tags'] = moreless(tags, 10) ticketlist.append(ticketdict) if 'changetime' in fields: extradict['max_changetime'] = format_datetime(max_changetime, locale=locale, tzinfo=req.tz) extradict['min_changetime'] = format_datetime(min_changetime, locale=locale, tzinfo=req.tz) if 'time' in fields: extradict['max_time'] = format_datetime(max_time, locale=locale, tzinfo=req.tz) extradict['min_time'] = format_datetime(min_time, locale=locale, tzinfo=req.tz) return ticketlist, extradict
def current_timestamp(): return to_timestamp( datetime.now(utc) )
args = (self.remote_name, xmlrpc_addr, e.args) self.env.log.warn(log, *args) raise ResourceNotFound(msg % args, "Network error") except Exception, e: msg = ("Unknown exception contacting remote Trac '%s' at %s. " "Exception args: %s %s %s") args = (self.remote_name, xmlrpc_addr, e, type(e), e.args) self.env.log.error(msg, *args) raise # Convert from DateTime used by xmlrpclib to datetime used by trac for k in self.time_fields: tkt_vals[3][k] = parse_date(tkt_vals[3][k].value, utc) self.values.update(tkt_vals[3]) self._cachetime = datetime.now(utc) self.save() def __getitem__(self, name): return self.values.get(name) def __setitem__(self, name, value): self.values[name] = value def populate(self, values): field_names = [f['name'] for f in self.fields if f['name'] in values] for name in field_names: self[name] = values.get(name, '') def save(self, when=None): if when is None:
def get_list(self, realm, wl, req, fields=None): db = self.env.get_db_cnx() cursor = db.cursor() user = req.authname locale = getattr( req, 'locale', LC_TIME) context = Context.from_request(req) wikilist = [] extradict = {} if not fields: fields = set(self.default_fields['wiki']) else: fields = set(fields) if 'changetime' in fields: max_changetime = datetime(1970,1,1,tzinfo=utc) min_changetime = datetime.now(utc) for name, last_visit in wl.get_watched_resources( 'wiki', req.authname ): wikipage = WikiPage(self.env, name, db=db) wikidict = {} if not wikipage.exists: wikidict['deleted'] = True if 'name' in fields: wikidict['name'] = name if 'author' in fields: wikidict['author'] = '?' if 'changetime' in fields: wikidict['changedsincelastvisit'] = 1 wikidict['changetime'] = '?' wikidict['ichangetime'] = 0 if 'comment' in fields: wikidict['comment'] = tag.strong(t_("deleted"), class_='deleted') if 'notify' in fields: wikidict['notify'] = wl.is_notify(req, 'wiki', name) wikilist.append(wikidict) continue comment = wikipage.comment changetime = wikipage.time author = wikipage.author if wl.options['attachment_changes']: latest_attachment = None for attachment in Attachment.select(self.env, 'wiki', name, db): if attachment.date > changetime: latest_attachment = attachment if latest_attachment: changetime = latest_attachment.date author = latest_attachment.author if 'comment' in fields: wikitext = '[attachment:"' + ':'.join([latest_attachment.filename,'wiki',name]) + \ '" ' + latest_attachment.filename + ']' desc = latest_attachment.description comment = tag(tag_("Attachment %(attachment)s added",\ attachment=format_to_oneliner(self.env, context, wikitext, shorten=False)), desc and ': ' or '.', moreless(desc,10)) if 'attachment' in fields: attachments = [] for attachment in Attachment.select(self.env, 'wiki', name, db): wikitext = '[attachment:"' + ':'.join([attachment.filename,'wiki',name]) + '" ' + attachment.filename + ']' attachments.extend([tag(', '), format_to_oneliner(self.env, context, wikitext, shorten=False)]) if attachments: attachments.reverse() attachments.pop() ticketdict['attachment'] = moreless(attachments, 5) if 'name' in fields: wikidict['name'] = name if 'author' in fields: if not (Chrome(self.env).show_email_addresses or 'EMAIL_VIEW' in req.perm(wikipage.resource)): wikidict['author'] = obfuscate_email_address(author) else: wikidict['author'] = author if 'version' in fields: wikidict['version'] = unicode(wikipage.version) if 'changetime' in fields: wikidict['changetime'] = format_datetime( changetime, locale=locale, tzinfo=req.tz ) wikidict['ichangetime'] = to_timestamp( changetime ) wikidict['changedsincelastvisit'] = last_visit < wikidict['ichangetime'] and 1 or 0 wikidict['timedelta'] = pretty_timedelta( changetime ) wikidict['timeline_link'] = req.href.timeline(precision='seconds', from_=trac_format_datetime ( changetime, 'iso8601', tzinfo=req.tz)) if changetime > max_changetime: max_changetime = changetime if changetime < min_changetime: min_changetime = changetime if 'comment' in fields: comment = moreless(comment or "", 200) wikidict['comment'] = comment if 'notify' in fields: wikidict['notify'] = wl.is_notify(req, 'wiki', name) if 'readonly' in fields: wikidict['readonly'] = wikipage.readonly and t_("yes") or t_("no") if 'tags' in fields and self.tagsystem: tags = [] for t in self.tagsystem.get_tags(req, Resource('wiki', name)): tags.extend([tag.a(t,href=req.href('tags',q=t)), tag(', ')]) if tags: tags.pop() wikidict['tags'] = moreless(tags, 10) #if 'ipnr' in fields: # wikidict['ipnr'] = wikipage.ipnr, # Note: Not supported by Trac 0.12 wikilist.append(wikidict) if 'changetime' in fields: extradict['max_changetime'] = format_datetime( max_changetime, locale=locale, tzinfo=req.tz ) extradict['min_changetime'] = format_datetime( min_changetime, locale=locale, tzinfo=req.tz ) return wikilist, extradict
def get_list(self, realm, wl, req, fields=None): db = self.env.get_db_cnx() cursor = db.cursor() context = Context.from_request(req) locale = getattr( req, 'locale', LC_TIME) ticketlist = [] extradict = {} if not fields: fields = set(self.default_fields['ticket']) else: fields = set(fields) if 'changetime' in fields: max_changetime = datetime(1970,1,1,tzinfo=utc) min_changetime = datetime.now(utc) if 'time' in fields: max_time = datetime(1970,1,1,tzinfo=utc) min_time = datetime.now(utc) for sid,last_visit in wl.get_watched_resources( 'ticket', req.authname ): ticketdict = {} try: ticket = Ticket(self.env, sid, db) exists = ticket.exists except: exists = False if not exists: ticketdict['deleted'] = True if 'id' in fields: ticketdict['id'] = sid ticketdict['ID'] = '#' + sid if 'author' in fields: ticketdict['author'] = '?' if 'changetime' in fields: ticketdict['changedsincelastvisit'] = 1 ticketdict['changetime'] = '?' ticketdict['ichangetime'] = 0 if 'time' in fields: ticketdict['time'] = '?' ticketdict['itime'] = 0 if 'comment' in fields: ticketdict['comment'] = tag.strong(t_("deleted"), class_='deleted') if 'notify' in fields: ticketdict['notify'] = wl.is_notify(req, 'ticket', sid) if 'description' in fields: ticketdict['description'] = '' if 'owner' in fields: ticketdict['owner'] = '' if 'reporter' in fields: ticketdict['reporter'] = '' ticketlist.append(ticketdict) continue render_elt = lambda x: x if not (Chrome(self.env).show_email_addresses or \ 'EMAIL_VIEW' in req.perm(ticket.resource)): render_elt = obfuscate_email_address # Copy all requested fields from ticket if fields: for f in fields: ticketdict[f] = ticket.values.get(f,u'') else: ticketdict = ticket.values.copy() changetime = ticket.time_changed if wl.options['attachment_changes']: for attachment in Attachment.select(self.env, 'ticket', sid, db): if attachment.date > changetime: changetime = attachment.date if 'attachment' in fields: attachments = [] for attachment in Attachment.select(self.env, 'ticket', sid, db): wikitext = u'[attachment:"' + u':'.join([attachment.filename,'ticket',sid]) + u'" ' + attachment.filename + u']' attachments.extend([tag(', '), format_to_oneliner(self.env, context, wikitext, shorten=False)]) if attachments: attachments.reverse() attachments.pop() ticketdict['attachment'] = moreless(attachments, 5) # Changes are special. Comment, commentnum and last author are included in them. if 'changes' in fields or 'author' in fields or 'comment' in fields or 'commentnum' in fields: changes = [] # If there are now changes the reporter is the last author author = ticket.values['reporter'] commentnum = u"0" comment = u"" want_changes = 'changes' in fields for date,cauthor,field,oldvalue,newvalue,permanent in ticket.get_changelog(changetime,db): author = cauthor if field == 'comment': if 'commentnum' in fields: ticketdict['commentnum'] = to_unicode(oldvalue) if 'comment' in fields: comment = to_unicode(newvalue) comment = moreless(comment, 200) ticketdict['comment'] = comment if not want_changes: break else: if want_changes: label = self.fields['ticket'].get(field,u'') if label: changes.extend( [ tag(tag.strong(label), ' ', render_property_diff(self.env, req, ticket, field, oldvalue, newvalue) ), tag('; ') ]) if want_changes: # Remove the last tag('; '): if changes: changes.pop() changes = moreless(changes, 5) ticketdict['changes'] = tag(changes) if 'id' in fields: ticketdict['id'] = sid ticketdict['ID'] = format_to_oneliner(self.env, context, '#' + sid, shorten=True) if 'cc' in fields: if render_elt == obfuscate_email_address: ticketdict['cc'] = ', '.join([ render_elt(c) for c in ticketdict['cc'].split(', ') ]) if 'author' in fields: ticketdict['author'] = render_elt(author) if 'changetime' in fields: ichangetime = to_timestamp( changetime ) ticketdict.update( changetime = format_datetime( changetime, locale=locale, tzinfo=req.tz ), ichangetime = ichangetime, changedsincelastvisit = (last_visit < ichangetime and 1 or 0), changetime_delta = pretty_timedelta( changetime ), changetime_link = req.href.timeline(precision='seconds', from_=trac_format_datetime ( changetime, 'iso8601', tzinfo=req.tz))) if changetime > max_changetime: max_changetime = changetime if changetime < min_changetime: min_changetime = changetime if 'time' in fields: time = ticket.time_created ticketdict.update( time = format_datetime( time, locale=locale, tzinfo=req.tz ), itime = to_timestamp( time ), time_delta = pretty_timedelta( time ), time_link = req.href.timeline(precision='seconds', from_=trac_format_datetime ( time, 'iso8601', tzinfo=req.tz ))) if time > max_time: max_time = time if time < min_time: min_time = time if 'description' in fields: description = ticket.values['description'] description = moreless(description, 200) ticketdict['description'] = description if 'notify' in fields: ticketdict['notify'] = wl.is_notify(req, 'ticket', sid) if 'owner' in fields: ticketdict['owner'] = render_elt(ticket.values['owner']) if 'reporter' in fields: ticketdict['reporter'] = render_elt(ticket.values['reporter']) if 'tags' in fields and self.tagsystem: tags = [] for t in self.tagsystem.get_tags(req, Resource('ticket', sid)): tags.extend([tag.a(t,href=req.href('tags',q=t)), tag(', ')]) if tags: tags.pop() ticketdict['tags'] = moreless(tags, 10) ticketlist.append(ticketdict) if 'changetime' in fields: extradict['max_changetime'] = format_datetime( max_changetime, locale=locale, tzinfo=req.tz ) extradict['min_changetime'] = format_datetime( min_changetime, locale=locale, tzinfo=req.tz ) if 'time' in fields: extradict['max_time'] = format_datetime( max_time, locale=locale, tzinfo=req.tz ) extradict['min_time'] = format_datetime( min_time, locale=locale, tzinfo=req.tz ) return ticketlist, extradict
def _do_add(self, filename, *arguments): # Get downloads API component. api = self.env[DownloadsApi] # Create context. context = Context('downloads-consoleadmin') db = self.env.get_db_cnx() context.cursor = db.cursor() context.req = FakeRequest(self.env, self.consoleadmin_user) # Be sure, we have correct path req_path = conf.getEnvironmentDownloadsPath(self.env) # Convert relative path to absolute. if not os.path.isabs(filename): filename = os.path.join(req_path, filename) # Open file object. file, filename, file_size = self._get_file(filename) # Create download dictionary from arbitrary attributes. download = { 'file': filename, 'size': file_size, 'time': to_timestamp(datetime.now(utc)), 'count': 0 } # Read optional attributes from arguments. for argument in arguments: # Check correct format. argument = argument.split("=") if len(argument) != 2: AdminCommandError( _('Invalid format of download attribute:' ' %(value)s', value=argument)) name, value = argument # Check known arguments. if not name in ('description', 'author', 'tags', 'component', 'version', 'platform', 'type'): raise AdminCommandError( _('Invalid download attribute: %(value)s', value=name)) # Transform platform and type name to ID. if name == 'platform': value = api.get_platform_by_name(context, value)['id'] elif name == 'type': value = api.get_type_by_name(context, value)['id'] # Add attribute to download. download[name] = value self.log.debug(download) # Upload file to DB and file storage. api.store_download(context, download, file) # Close input file and commit changes in DB. file.close() db.commit()