Пример #1
0
 def get(self):
     self.error(404)
     output = get_cache("error404")
     if output is None:        
         output = self.render("404.html")
         memcache.add("error404", output, 3600)
     self.response.out.write(output)
Пример #2
0
    def get(self):
        output = get_cache("projects_json")
        if output is None:
            projects = Project.all().order('-created_date').fetch(50)
            projects_data = {}

            for project in projects:
                data = {
                    'internal_url':
                    "%s/projects/%s/" % (settings.SYSTEM_URL, project.slug),
                    'created_date':
                    str(project.created_date)[0:19],
                    'open_issues':
                    project.open_issues.count(),
                    'closed_issues':
                    project.closed_issues.count(),
                }
                if project.url:
                    data['external_url'] = project.url
                projects_data[project.name] = data

            json = {
                'date': str(datetime.now())[0:19],
                'projects': projects_data,
            }

            output = simplejson.dumps(json)
            memcache.add("projects_json", output, 3600)
        self.response.headers[
            "Content-Type"] = "application/javascript; charset=utf8"
        self.response.out.write(output)
Пример #3
0
    def get(self):
        output = get_cache("projects_rss")
        if output is None:

            projects = Project.all().order('-created_date').fetch(20)
            rss = RSS2(
                title="GitBug projects",
                link="%s" % settings.SYSTEM_URL,
                description="A list of the latest 20 projects on GitBug",
                lastBuildDate=datetime.now())

            for project in projects:
                rss.items.append(
                    RSSItem(title=project.name,
                            link="%s/projects/%s/" %
                            (settings.SYSTEM_URL, project.slug),
                            description="",
                            pubDate=project.created_date))

            output = rss.to_xml()

            memcache.add("projects_rss", output, 3600)
        self.response.headers[
            "Content-Type"] = "application/rss+xml; charset=utf8"
        self.response.out.write(output)
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
 def get(self):
     self.error(404)
     user = users.get_current_user()
     output = None
     if not user:
         output = get_cache("error404")
     if output is None:
         output = self.render("404.html")
         if not user:
             memcache.add("error404", output, 3600)
     self.response.out.write(output)
Пример #7
0
 def get(self):
     output = get_cache("home")
     if output is None:
         items = Page.all().order('-publish_date').fetch(50)
         context = {
             "items": items,
             "title": "Hacker Posts",
         }
         # calculate the template path
         output = self.render("index.html", context)
         memcache.add("home", output, 3600)
     self.response.out.write(output)
Пример #8
0
    def get(self):
        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("faq")
        if output is None:
            output = self.render("faq.html")
            if not user:
                memcache.add("faq", output, 3600)
        self.response.out.write(output)
Пример #9
0
 def get(self):
     if users.get_current_user():
         # if we have a user then get their projects
         projects = Project.all().filter(
             'user ='******'-created_date').fetch(50)
         context = {
             'projects': projects,
         }
         output = self.render("index.html", context)
     else:
         # otherwise it's a static page so cache for a while
         output = get_cache("home")
         if output is None:
             output = self.render("home.html")
             memcache.add("home", output, 3600)
     self.response.out.write(output)
Пример #10
0
    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)
Пример #11
0
    def get(self, year, month=None, day=None):
        
        # we want a canonical url with the trailing slash
        # so if it's missing we need to throw a 301, adding the slash in 
        # the process
        if self.request.path[-1] != "/":
            self.redirect("%s/" % self.request.path, True)
            return

        output = get_cache("%s%s%s" % (year, month, day))
        if output is None:
            if not month:
                # we're dealing with a year only
                # check how many days in this year
                if isleap(int(year)):
                    days = 366
                else:
                    days = 365
                lower_limit = date(int(year), 1, 1)
                upper_limit = lower_limit + timedelta(days)
                title = year
            elif not day:
                # we have a month and year            
                lower_limit = date(int(year), int(month), 1)
                upper_limit = lower_limit + timedelta(monthrange(int(year), int(month))[1])
                title = "%s %s" % (lower_limit.strftime("%B"), year)
            else:
                # we have everything
                lower_limit = date(int(year), int(month), int(day))
                upper_limit = lower_limit + timedelta(1)
                title = "%s %s %s" % (lower_limit.strftime("%d"), lower_limit.strftime("%B"), year)
        
            items = Page.all()
            items.filter('publish_date >', lower_limit)
            items.filter('publish_date <', upper_limit)        
            items.order('-publish_date')
        
            context = {
                "items": items,
                "title": "News from %s" % title
            }
            output = self.render("list.html", context)
            memcache.add("%s%s%s" % (year, month, day), output, 3600)
        self.response.out.write(output)
Пример #12
0
 def get(self):
     
     # we want a canonical url with the trailing slash
     # so if it's missing we need to throw a 301, adding the slash in 
     # the process
     if self.request.path[-1] != "/":
         self.redirect("%s/" % self.request.path, True)
         return
     
     output = get_cache("tags")
     if output is None:
         tags = Tag.all().order('-date').fetch(300)
         context = {
             "tags": tags,
             "title": "Latest tags",
         }
         output = self.render("tags.html", context)
         memcache.add("tags", output, 3600)
     self.response.out.write(output)
Пример #13
0
    def get(self, slug):

        # we want a canonical url with the trailing slash
        # so if it's missing we need to throw a 301, adding the slash in 
        # the process
        if slug[-1] != "/":
            self.redirect("%s/" % slug, True)
            return

        output = get_cache(slug)
        if output is None:

            try:
                item = Page.gql("WHERE internal_url=:1", slug)[0]
            except IndexError:
                self.error(404)
                output = self.render("404.html", {"title": "Page not found"})
                self.response.out.write(output)
                return
        
            # get a list of related items based on taggings
            # remember to filter out the article we're on
            related = []
            for tag in item.tags:
                 related += (Tag.all().filter('name =', tag).filter('title !=', item.title))
            
            # we also need to deduplicate the list as sometimes items
            # will share tags
            seen = [] 
            deduped = []
            for related_item in related:
                if not related_item.url in seen:
                    deduped.append(related_item)
                    seen.append(related_item.url)
        
            context = {
                "item": item,
                "related": deduped,
                "title": item.title,
            }
            output = self.render("item.html", context)
            memcache.add(slug, output, 3600)
        self.response.out.write(output)
Пример #14
0
    def get(self):
        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("projects")
        if output is None:
            projects = Project.all().order('-created_date').fetch(50)
            context = {
                'projects': projects,
            }
            # calculate the template path
            output = self.render("projects.html", context)
            if not user:
                memcache.add("projects", output, 3600)
        self.response.out.write(output)
Пример #15
0
    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)
Пример #16
0
 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)
Пример #17
0
 def get(self, tag):
     
     # we want a canonical url with the trailing slash
     # so if it's missing we need to throw a 301, adding the slash in 
     # the process
     if self.request.path[-1] != "/":
         self.redirect("%s/" % self.request.path, True)
         return
     
     output = get_cache("%s" % tag)
     if output is None:
         items = Page.all()
         items.order('-publish_date')
         items.filter('tags = ', tag.replace("-", " "))
         context = {
             "items": items,
             "title": "Content tagged <strong>%s</strong>" % tag.replace("-", " "),
         }
         output = self.render("list.html", context)
         memcache.add("%s" % tag, output, 3600)
     self.response.out.write(output)
Пример #18
0
    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)