def get(self, username, reponame): try: repo = (Repo.select().join(User).alias("user") .where((User.name == username) & (Repo.name == reponame)) .get()) title = repo.user.name + "/" + repo.name timemap = self.get_query_argument("timemap", "false") == "true" datetime = self.get_query_argument("datetime", None) key = self.get_query_argument("key", None) index = self.get_query_argument("index", "false") == "true" if self.get_query_argument("datetime", None): datestr = self.get_query_argument("datetime") try: ts = date(datestr, QSDATEFMT) except ValueError: raise HTTPError(reason="Invalid format of datetime param", status_code=400) elif "Accept-Datetime" in self.request.headers: datestr = self.request.headers.get("Accept-Datetime") ts = date(datestr, RFC1123DATEFMT) else: ts = now() if key and not timemap: chain = revision_logic.get_chain_at_ts(repo, key, ts) # use ts of cset instead of now(), to make prev work if len(chain) != 0: ts = chain[-1].time cs_prev = revision_logic.get_cset_prev_before_ts(repo, key, ts) cs_next = revision_logic.get_cset_next_after_ts(repo, key, ts) if cs_prev: cs_prev_str = self.request.protocol + "://" + self.request.host + self.request.path + "?key=" + key + "&datetime=" + cs_prev.time.strftime(QSDATEFMT) else: cs_prev_str = "" if cs_next: cs_next_str = self.request.protocol + "://" + self.request.host + self.request.path + "?key=" + key + "&datetime=" + cs_next.time.strftime(QSDATEFMT) else: cs_next_str = "" commit_message = revision_logic.get_commit_message(repo, key, ts) self.render("repo/memento.html", repo=repo, key=key, datetime=datetime, cs_next_str=cs_next_str, cs_prev_str=cs_prev_str, commit_message=commit_message) elif key and timemap: self.render("repo/history.html", repo=repo, key=key) elif index: cs = (CSet.select(fn.distinct(CSet.hkey)).where((CSet.repo == repo) & (CSet.time <= ts)).alias("cs")) key_count = (HMap.select(HMap.val).join(cs, on=(HMap.sha == cs.c.hkey_id))).count() page = int(self.get_query_argument("page", "1")) hm = revision_logic.get_repo_index(repo, ts, page) self.render("repo/index.html", repo=repo, title=title, key_count=key_count, page_size=revision_logic.INDEX_PAGE_SIZE, hm=hm, current_page=page) else: hm = list(revision_logic.get_repo_index(repo, ts, 1, 5)) # cs = (CSet.select(fn.distinct(CSet.hkey)).where(CSet.repo == repo).limit(5).alias("cs")) # samples = (HMap.select(HMap.val).join(cs, on=(HMap.sha == cs.c.hkey_id))) self.render("repo/show.html", title=title, repo=repo, hm=hm) except Repo.DoesNotExist: raise HTTPError(reason="Repo not found.", status_code=404)
def __get_index(self, repo, ts): # Generate an index of all URIs contained in the dataset at the # provided point in time or in its current state. self.set_header("Vary", "accept-datetime") accept = self.request.headers.get("Accept", "") page = int(self.get_query_argument("page", "1")) hm = revision_logic.get_repo_index(repo, ts, page) if "text/plain" in accept: self.set_header("Content-Type", "text/plain") for h in hm: self.write(h.val + "\n") elif "application/json" in accept or "*/*" in accept: self.set_header("Content-Type", "application/json") repo_url = (self.request.protocol + "://" + self.request.host + "/" + repo.user.name + "/" + repo.name) first = None try: first = hm.next() except StopIteration: # No keys for repo # No need to raise an error, just return empty list in json pass self.write('{"username": '******', "repository": '+json_encode(repo.name)) self.write(', "keys": {"list":[') m = ('{{"key": "{0}", "uri": "'+repo_url+'?key={0}"}}') if first: self.write(m.format(first.val)) for h in hm: self.write("," + m.format(h.val)) self.write(']}') self.write('}')