def get(self, slug): output = get_cache("project_%s_rss" % slug) if output is None: project = Project.all().filter('slug =', slug).fetch(1)[0] # allow query string arguments to specify filters if self.request.get("open"): status_filter = True fixed = False elif self.request.get("closed"): status_filter = True fixed = True else: status_filter = None # if we have a filter then filter the results set if status_filter: issues = Issue.all().filter('project =', project).filter( 'fixed =', fixed).order('fixed').order('created_date') else: issues = Issue.all().filter( 'project =', project).order('fixed').order('created_date') # create the RSS feed rss = RSS2(title="Issues for %s on GitBug" % project.name, link="%s/%s/" % (settings.SYSTEM_URL, project.slug), description="", lastBuildDate=datetime.now()) # add an item for each issue for issue in issues: if issue.fixed: pubDate = issue.fixed_date title = "%s (%s)" % (issue.name, "Fixed") else: pubDate = issue.created_date title = issue.name rss.items.append( RSSItem(title=title, link="%s/projects%s" % (settings.SYSTEM_URL, issue.internal_url), description=issue.html, pubDate=pubDate)) # get the xml output = rss.to_xml() memcache.add("project_%s_rss" % slug, output, 3600) # send the correct headers self.response.headers[ "Content-Type"] = "application/rss+xml; charset=utf8" self.response.out.write(output)
def post(self, slug): "Create an issue against this project" project = Project.all().filter('slug =', slug).fetch(1)[0] # get details from the form name = self.request.get("name") description = self.request.get("description") email = self.request.get("email") try: if Issue.all().filter('name =', name).filter('project =', project).count() == 0: issue = Issue( name=name, description=description, project=project, ) if email: issue.email = email issue.put() mail.send_mail( sender="*****@*****.**", to=project.user.email(), subject="[GitBug] New bug added to %s" % project.name, body= """You requested to be emailed when a bug on GitBug was added: Issue name: %s Description: %s Thanks for using GitBug <http://gitbug.appspot.com>. A very simple issue tracker. """ % (issue.name, issue.description)) logging.info("issue created: %s in %s" % (name, project.name)) except Exception, e: logging.error("error adding issue: %s" % e)
def get(self, project_slug, issue_slug): if self.request.path[-1] != "/": self.redirect("%s/" % self.request.path, True) return # if we don't have a user then throw # an unauthorised error user = users.get_current_user() if not user: self.render_403() return issue = Issue.all().filter('internal_url =', "/%s/%s/" % (project_slug, issue_slug)).fetch(1)[0] if issue.project.user == user or users.is_current_user_admin(): context = { 'issue': issue, 'owner': True, } output = self.render("issue_delete.html", context) self.response.out.write(output) else: self.render_403() return
def post(self, slug): project = Project.all().filter('slug =', slug).fetch(1)[0] key = self.request.get("key") if key == project.key(): try: payload = self.request.get("payload") representation = simplejson.loads(payload) commits = representation['commits'] for commit in commits: message = commit['message'] search = GITBUG.search(message) if search: identifier = search.group()[7:] issue = Issue.all().filter( 'project =', project).filter('identifier =', int(identifier)).fetch(1)[0] issue.fixed = True issue.put() logging.info("issue updated via webhook: %s in %s" % (issue.name, issue.project.name)) except Exception, e: logging.error("webhook error: %s" % e)
def get(self, project_slug, issue_slug): if self.request.path[-1] != "/": self.redirect("%s/" % self.request.path, True) return user = users.get_current_user() output = None if not user: output = get_cache("/%s/%s/" % (project_slug, issue_slug)) if output is None: try: issue = Issue.all().filter( 'internal_url =', "/%s/%s/" % (project_slug, issue_slug)).fetch(1)[0] issues = Issue.all().filter('project =', issue.project).filter( 'fixed =', False).fetch(10) except IndexError: self.render_404() return on_list = False try: if user.email() in issue.project.other_users: on_list = True except: pass if issue.project.user == user or users.is_current_user_admin( ) or on_list: owner = True else: owner = False context = { 'issue': issue, 'issues': issues, 'owner': owner, } # calculate the template path output = self.render("issue.html", context) if not user: memcache.add("/%s/%s/" % (project_slug, issue_slug), output, 60) self.response.out.write(output)
def get(self, slug): output = get_cache("project_%s_json" % slug) if output is None: project = Project.all().filter('slug =', slug).fetch(1)[0] issues = Issue.all().filter( 'project =', project).order('fixed').order('created_date') issues_data = {} for issue in issues: # friendlier display of information if issue.fixed: status = "Fixed" else: status = "Open" # set structure of inner json data = { 'internal_url': "%s/projects%s" % (settings.SYSTEM_URL, issue.internal_url), 'created_date': str(project.created_date)[0:19], 'description': issue.html, 'status': status, 'identifier': "#gitbug%s" % issue.identifier, } if issue.fixed and issue.fixed_description: data['fixed_description'] = issue.fixed_description issues_data[issue.name] = data # set structure of outer json json = { 'date': str(datetime.now())[0:19], 'name': project.name, 'internal_url': "%s/projects/%s/" % (settings.SYSTEM_URL, project.slug), 'created_date': str(project.created_date)[0:19], 'issues': issues_data, } if project.url: json['external_url'] = project.url # create the json output = simplejson.dumps(json) # cache it memcache.add("project_%s_json" % slug, output, 3600) # send the correct headers self.response.headers[ "Content-Type"] = "application/javascript; charset=utf8" self.response.out.write(output)
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') issues = Issue.all().order('creation_date').fetch(30) success_type = self.request.get('success') success_msg = None if success_type == 'vote': success_msg = 'Your vote was successfully cast!' if success_type == 'updated': success_msg = 'Your vote was successfully updated!' created_by = Issue.issues_created_by(member=user,limit=20) voted_on = Issue.issues_voted_on(member=user,limit=20) #recent_results = [issue for issue in voted_on if issue.has_results] recent_voted = [issue for issue in voted_on if issue.is_active()] recent_results = Issue.recent_results(limit=20) self.response.out.write(template.render('templates/overview.html', locals()))
def get(self, project_slug, issue_slug): output = get_cache("/%s/%s.json" % (project_slug, issue_slug)) if output is None: issue = Issue.all().filter('internal_url =', "/%s/%s/" % (project_slug, issue_slug)).fetch(1)[0] if issue.fixed: status = "Fixed" else: status = "Open" json = { 'date': str(datetime.now())[0:19], 'name': issue.name, 'project': issue.project.name, 'project_url': "%s/projects/%s" % (settings.SYSTEM_URL, issue.project.slug), 'internal_url': "%s/projects/%s/" % (settings.SYSTEM_URL, issue.internal_url), 'created_date': str(issue.created_date)[0:19], 'description': issue.html, 'status': status, 'identifier': "#gitbug%s" % issue.identifier, } if issue.fixed and issue.fixed_description: json['fixed_description'] = issue.fixed_description output = simplejson.dumps(json) memcache.add("/%s/%s.json" % (project_slug, issue_slug), output, 3600) self.response.headers[ "Content-Type"] = "application/javascript; charset=utf8" self.response.out.write(output)
def get(self, slug): # we want canonocal urls so redirect to add a trailing slash if needed if self.request.path[-1] != "/": self.redirect("%s/" % self.request.path, True) return user = users.get_current_user() output = None # if not logged in then use a cached version if not user: output = get_cache("project_%s" % slug) # if we don't have a cached version or are logged in if output is None: try: project = Project.all().filter('slug =', slug).fetch(1)[0] issues = Issue.all().filter('project =', project) files = DatastoreFile.all().filter('project =', project) except IndexError: self.render_404() return logging.info("Files in this project: %d" % files.count()) # check to see if we have admin rights over this project if project.user == user or users.is_current_user_admin(): owner = True else: owner = False context = { 'project': project, 'issues': issues, 'owner': owner, 'files': files, } output = self.render("project.html", context) if not user: # only save a cached version if we're not logged in # so as to avoid revelaving user details memcache.add("project_%s" % slug, output, 3600) self.response.out.write(output)
def get(self): user = users.get_current_user() if user: logout_url = users.create_logout_url('/') else: login_url = users.create_login_url('/') issues = Issue.all().order('creation_date').fetch(30) success_type = self.request.get('success') success_msg = None if success_type == 'vote': success_msg = 'Your vote was successfully cast!' if success_type == 'updated': success_msg = 'Your vote was successfully updated!' created_by = Issue.issues_created_by(member=user, limit=20) voted_on = Issue.issues_voted_on(member=user, limit=20) #recent_results = [issue for issue in voted_on if issue.has_results] recent_voted = [issue for issue in voted_on if issue.is_active()] recent_results = Issue.recent_results(limit=20) self.response.out.write( template.render('templates/overview.html', locals()))
def post(self, project_slug, issue_slug): # if we don't have a user then throw # an unauthorised error user = users.get_current_user() if not user: self.render_403() return issue = Issue.all().filter('internal_url =', "/%s/%s/" % (project_slug, issue_slug)).fetch(1)[0] user = users.get_current_user() if issue.project.user == user: try: name = self.request.get("name") description = self.request.get("description") email = self.request.get("email") fixed = self.request.get("fixed") fixed_description = self.request.get("fixed_description") issue.name = name issue.description = description if email: issue.email = email else: issue.email = None issue.fixed = bool(fixed) if fixed: issue.fixed_description = fixed_description else: issue.fixed_description = None issue.put() logging.info("issue edited: %s in %s" % (issue.name, issue.project.name)) except Exception, e: logging.info("error editing issue: %s" % e)
def post(self, project_slug, issue_slug): # if we don't have a user then throw # an unauthorised error user = users.get_current_user() if not user: self.render_403() return issue = Issue.all().filter('internal_url =', "/%s/%s/" % (project_slug, issue_slug)).fetch(1)[0] user = users.get_current_user() if issue.project.user == user: try: name = self.request.get("name") description = self.request.get("description") email = self.request.get("email") fixed = self.request.get("fixed") priority = self.request.get("priority") fixed_description = self.request.get("fixed_description") issue.name = name issue.description = description issue.priority = priority if email: issue.email = email else: issue.email = None issue.fixed = bool(fixed) if fixed: issue.fixed_description = fixed_description else: issue.fixed_description = None issue.put() logging.info("issue edited: %s in %s" % (issue.name, issue.project.name)) except Exception, e: logging.info("error editing issue: %s" % e)
def post(self, project_slug, issue_slug): # if we don't have a user then throw # an unauthorised error user = users.get_current_user() if not user: self.render_403() return issue = Issue.all().filter('internal_url =', "/%s/%s/" % (project_slug, issue_slug)).fetch(1)[0] user = users.get_current_user() if issue.project.user == user: try: logging.info("deleted issue: %s in %s" % (issue.name, issue.project.name)) issue.delete() except Exception, e: logging.error("error deleting issue: %s" % e) self.redirect("/projects/%s" % issue.project.slug)
def get(self, slug): # we want canonocal urls so redirect to add a trailing slash if needed if self.request.path[-1] != "/": self.redirect("%s/" % self.request.path, True) return user = users.get_current_user() output = None # if not logged in then use a cached version if not user: output = get_cache("project_%s" % slug) # if we don't have a cached version or are logged in if output is None: try: project = Project.all().filter('slug =', slug).fetch(1)[0] issues = Issue.all().filter('project =', project) except IndexError: self.render_404() return # check to see if we have admin rights over this project if project.user == user or users.is_current_user_admin(): owner = True else: owner = False context = { 'project': project, 'issues': issues, 'owner': owner, } output = self.render("project.html", context) if not user: # only save a cached version if we're not logged in # so as to avoid revelaving user details memcache.add("project_%s" % slug, output, 3600) self.response.out.write(output)