def insert(cls, _name, _ts):
		version_query = AppVersion.all()
		version_query.filter('name =', _name.strip())
		versions = []
		versions = version_query.fetch(1)
		if versions:
			version = versions[0]
			if _ts and _ts.tzinfo == None:
				_ts = pytz.utc.localize(_ts)
			if pytz.utc.localize(version.lastIncident) < _ts:
				version.lastIncident = _ts
				logging.info("version " + version.name + " last incident: " + version.lastIncident.strftime(r"%d/%m/%Y %H:%M:%S %Z"))
			version.crashCount = version.crashCount + 1
			version.put()
			cacheId = "CrashReport%s_counter" % version.name
			memcache.set(cacheId, version.crashCount, 432000)
		else:
			def vcmp(x, y):
				gx = re.match(r'^([0-9.]+)((?:alpha|beta)?)((?:\d+)?)((?:\D.*)?)$', x).groups()
				gy = re.match(r'^([0-9.]+)((?:alpha|beta)?)((?:\d+)?)((?:\D.*)?)$', y).groups()
				revx = 0 if len(gx[2]) == 0 else int(gx[2])
				revy = 0 if len(gy[2]) == 0 else int(gy[2])
				return -cmp("%s%sz%04d%s" % (gx[0], gx[1], revx, gx[3]), "%s%sz%04d%s" % (gy[0], gy[1], revy, gy[3]))
			nv = AppVersion(name = _name.strip(), lastIncident = _ts, crashCount = 1)
			nv.put()
			cacheId = "CrashReport%s_counter" % nv.name
			memcache.set(cacheId, 1, 432000)
			Cnt.incr("AppVersion_counter")
			Lst.append('all_version_names_list', nv.name, vcmp)
	def get(self):
		versions = Lst.get('all_version_names_list')
		selectedVersion = self.request.get('filter_version', '')

		crashes = []
		crashes_query = CrashReport.all()
		bugId = self.request.get('bug_id')
		if not bugId and not selectedVersion:
			selectedVersion = versions[0]

		cacheId = "CrashReport"
		if selectedVersion:
			crashes_query.filter("versionName =", selectedVersion)
		if bugId:
			bug = Bug.get_by_id(long(bugId))
			crashes_query.filter("bugKey =", bug)
			cacheId += bugId
			if not selectedVersion:
				versions.insert(0, '')
		cacheId += selectedVersion
		cacheId += "_counter"
		crashes_query.order("-crashTime")

		logging.info("version: " + selectedVersion)
		page = int(self.request.get('page', 0))
		crashes = crashes_query.fetch(20, int(page)*20)
		template_values = {'crashes_list': crashes,
				'versions_list': versions,
				'filter_version': selectedVersion,
				'page_size': 20,
				'page': page,
				'bug_id': bugId}
		path = os.path.join(os.path.dirname(__file__), 'templates/crash_list.html')
		self.response.out.write(template.render(path, template_values))
    def insert(cls, _name, _ts):
        version_query = AppVersion.all()
        version_query.filter('name =', _name.strip())
        versions = []
        versions = version_query.fetch(1)
        if versions:
            version = versions[0]
            if _ts and _ts.tzinfo == None:
                _ts = pytz.utc.localize(_ts)
            if pytz.utc.localize(version.lastIncident) < _ts:
                version.lastIncident = _ts
                logging.info(
                    "version " + version.name + " last incident: " +
                    version.lastIncident.strftime(r"%d/%m/%Y %H:%M:%S %Z"))
            version.crashCount = version.crashCount + 1
            version.put()
            cacheId = "CrashReport%s_counter" % version.name
            memcache.set(cacheId, version.crashCount, 432000)
        else:

            def vcmp(x, y):
                gx = re.match(
                    r'^([0-9.]+)((?:alpha|beta)?)((?:\d+)?)((?:\D.*)?)$',
                    x).groups()
                gy = re.match(
                    r'^([0-9.]+)((?:alpha|beta)?)((?:\d+)?)((?:\D.*)?)$',
                    y).groups()
                revx = 0 if len(gx[2]) == 0 else int(gx[2])
                revy = 0 if len(gy[2]) == 0 else int(gy[2])
                return -cmp("%s%sz%04d%s" %
                            (gx[0], gx[1], revx, gx[3]), "%s%sz%04d%s" %
                            (gy[0], gy[1], revy, gy[3]))

            nv = AppVersion(name=_name.strip(), lastIncident=_ts, crashCount=1)
            nv.put()
            cacheId = "CrashReport%s_counter" % nv.name
            memcache.set(cacheId, 1, 432000)
            Cnt.incr("AppVersion_counter")
            Lst.append('all_version_names_list', nv.name, vcmp)
    def get(self):
        #versions_query = AppVersion.all()
        #versions_query.order("-activeFrom")
        #versions_objs = versions_query.fetch(2000)
        #versions = [v.name for v in versions_objs]
        #versions.insert(0, "all")
        versions = Lst.get('all_version_names_list')
        selectedVersion = self.request.get('filter_version', versions[0])

        bugs = []
        page = int(self.request.get('page', 0))
        #if selectedVersion != "all":
        crashes = []
        bugs_map = {}
        crashes_query = CrashReport.all()
        crashes_query.filter("versionName =", selectedVersion)
        crashes = crashes_query.fetch(1000000)
        for cr in crashes:
            if cr.bugKey.key().id() in bugs_map:
                bugs_map[cr.bugKey.key().id()].count += 1
                if bugs_map[cr.bugKey.key().id()].lastIncident < cr.crashTime:
                    bugs_map[cr.bugKey.key().id()].lastIncident = cr.crashTime
            else:
                bug = cr.bugKey
                bug.count = 1
                bug.lastIncident = cr.crashTime
                bugs_map[cr.bugKey.key().id()] = bug
        unsorted_bugs = bugs_map.values()
        bugs = sorted(unsorted_bugs, key=attrgetter('count'), reverse=True)
        # trim results to a single page
        bugs[(page + 1) * 20:] = []
        bugs[0:page * 20] = []
        #else:
        #	bugs_query = Bug.all()
        #	bugs_query.order("-count")
        #	bugs = bugs_query.fetch(20, int(page)*20)

        template_values = {
            'bugs_list': bugs,
            'versions_list': versions,
            'filter_version': selectedVersion,
            'page_size': 20,
            'page': page
        }

        path = os.path.join(os.path.dirname(__file__),
                            'templates/bug_list.html')
        self.response.out.write(template.render(path, template_values))
	def get(self):
		#versions_query = AppVersion.all()
		#versions_query.order("-activeFrom")
		#versions_objs = versions_query.fetch(2000)
		#versions = [v.name for v in versions_objs]
		#versions.insert(0, "all")
		versions = Lst.get('all_version_names_list')
		selectedVersion = self.request.get('filter_version', versions[0])

		bugs = []
		page = int(self.request.get('page', 0))
		#if selectedVersion != "all":
		crashes = []
		bugs_map = {}
		crashes_query = CrashReport.all()
		crashes_query.filter("versionName =", selectedVersion)
		crashes = crashes_query.fetch(1000000)
		for cr in crashes:
			if cr.bugKey.key().id() in bugs_map:
				bugs_map[cr.bugKey.key().id()].count += 1
				if bugs_map[cr.bugKey.key().id()].lastIncident < cr.crashTime:
					bugs_map[cr.bugKey.key().id()].lastIncident = cr.crashTime
			else:
				bug = cr.bugKey
				bug.count = 1
				bug.lastIncident = cr.crashTime
				bugs_map[cr.bugKey.key().id()] = bug
		unsorted_bugs = bugs_map.values()
		bugs = sorted(unsorted_bugs, key=attrgetter('count'), reverse=True)
		# trim results to a single page
		bugs[(page+1)*20:] = []
		bugs[0:page*20] = []
		#else:
		#	bugs_query = Bug.all()
		#	bugs_query.order("-count")
		#	bugs = bugs_query.fetch(20, int(page)*20)

		template_values = {'bugs_list': bugs,
				'versions_list': versions,
				'filter_version': selectedVersion,
				'page_size': 20,
				'page': page}

		path = os.path.join(os.path.dirname(__file__), 'templates/bug_list.html')
		self.response.out.write(template.render(path, template_values))
    def get(self):
        versions = Lst.get('all_version_names_list')
        selectedVersion = self.request.get('filter_version', '')

        crashes = []
        crashes_query = CrashReport.all()
        bugId = self.request.get('bug_id')
        if not bugId and not selectedVersion:
            selectedVersion = versions[0]

        cacheId = "CrashReport"
        if selectedVersion:
            crashes_query.filter("versionName =", selectedVersion)
        if bugId:
            bug = Bug.get_by_id(long(bugId))
            crashes_query.filter("bugKey =", bug)
            cacheId += bugId
            if not selectedVersion:
                versions.insert(0, '')
        cacheId += selectedVersion
        cacheId += "_counter"
        crashes_query.order("-crashTime")

        logging.info("version: " + selectedVersion)
        page = int(self.request.get('page', 0))
        crashes = crashes_query.fetch(20, int(page) * 20)
        template_values = {
            'crashes_list': crashes,
            'versions_list': versions,
            'filter_version': selectedVersion,
            'page_size': 20,
            'page': page,
            'bug_id': bugId
        }
        path = os.path.join(os.path.dirname(__file__),
                            'templates/crash_list.html')
        self.response.out.write(template.render(path, template_values))