# -*- coding:utf-8 -*- ''' @Author:Robin @Email: 329080237@qq.com @Wechat: 15618110227 @File: api.py @Date: 2021/9/25 9:08 @Description: ''' from utils.public import * from .base import RequestGit from django.db import transaction import json, base64 @try_except def getReposTags(request, full_name): api = "/repos/"+ full_name +"/tags" res = RequestGit(request, api).get() data = json.loads(res.content) tagList = [ i['name'] for i in data ] return tagList def getLanguages(request, owner, repo): api = "/repos/{}/{}/languages".format(owner, repo) res = RequestGit(request, api).get() data = json.loads(res.text) tagList = [i for i in data] return tagList @try_except def search(request): args = ("id", "name", "repo_name", "userKey__username", "content", "userKey__avatar", "score", "level") items = Project.objects.exclude(private=1).values(*args).order_by("?")[:6] #console(items) # api = "/repos/search?page=1&limit=6" # res = RequestGit(request, api).get() # print(res.status_code) # data = json.loads(res.content) # items = data['data'] for i in items: i['tagList'] = getLanguages(request, i["userKey__username"], i["repo_name"]) i['stars_count'] = ProjectTriple.objects.filter(projectKey=i['id'], type=2).count() resData = { "items": list(items), "total": len(items) } #console(resData) return jsonData(data=resData) class CreateRepo: def __init__(self, request, data, owner=None, repo=None): self.userKey = request.session.get("user_id") self.data = data self.owner = owner self.repo = repo self.request = request def project(self): '''本地数据库创建项目''' groupKey = self.data.get("groupKey") if type(self.data.get("groupKey")) == list: groupKey = [x for x in groupKey if x is not None].pop() payload = { "name": self.data.get("name"), "repo_name": self.data.get("repo_name"), "content": self.data.get("content"), "userKey_id": self.userKey, "groupKey_id": groupKey, "private": self.data.get("private") } Project.objects.create(**payload) def repo_create(self): api = "/user/repos" payload = { "name": self.data.get("repo_name"), "description": self.data.get("content"), "private": self.data.get("private"), "license": self.data.get("license") } #console(data, payload) res = RequestGit(self.request, api).post(payload=payload) if res.status_code == 201: print('创建仓库成功') data = json.loads(res.text) else: print(res.text) raise Exception("创建项目失败!") return data def team(self): '''将圈子中所有成员拉到项目群组中''' username = self.request.session.get("username") # 拉取协助时排除自己 groupKey = self.data.get("groupKey") # 前端返回的是数组,所以要进行过滤处理 if type(self.data.get("groupKey")) == list: groupKey = [x for x in groupKey if x is not None].pop() usernameList = GroupUsers.objects.exclude(userKey__username=username).filter(groupKey=groupKey).values_list('userKey__username', flat=True) # console(usernameList) for i in usernameList: api = "/repos/{}/{}/collaborators/{}".format(self.owner, self.repo, i) RequestGit(self.request, api).put() @transaction.atomic def create(request): # 记录回滚点 sp = transaction.savepoint() try: data = json.loads(request.body) CreateRepo(request, data).project() # 创建本地数据 res = CreateRepo(request, data).repo_create() # 创建Gitea仓库 CreateRepo(request, data, res['owner']['login'], res['name']).team() # 创建协作团队 resData = {"owner": res['owner']['login'], "repo": res['name']} except: # 如以上三步操作发生异常时,回滚事务 transaction.savepoint_rollback(sp) raise Exception("创建项目失败!") return jsonData(data=resData) @try_except def getRepo(request, owner, repo): api = "/repos/"+owner+"/"+repo res = RequestGit(request, api).get() if res.status_code == 200: data = json.loads(res.text) else: print(res.text) raise Exception("获取项目信息失败!") return jsonData(data=data) @try_except def getBranches(request, owner, repo): '''获取项目分支列表''' api = "/repos/"+ owner +"/"+ repo +"/branches" res = RequestGit(request, api).get() if res.status_code == 200: data = json.loads(res.text) else: print(res.text) raise Exception("获取项目分支信息失败!") resData = { "items": data } return jsonData(data=resData) @try_except def getCommits(request, owner, repo): data = json.loads(request.GET.get("data")) api = "/repos/{}/{}/commits?sha={}".format(owner, repo, data['sha']) res = RequestGit(request, api).get() if res.status_code == 200: total = res.headers['X-Total'] else: print(res.text) raise Exception("获取提交数信息失败!") resData = { "total": total } #console(resData) return jsonData(data=resData) @try_except def readme(request, owner, repo, filepath): data = json.loads(request.GET.get("data")) api = "/repos/{}/{}/contents/{}?ref={}".format(owner, repo, filepath, data['ref']) res = RequestGit(request, api).get() if res.status_code == 200: data = json.loads(res.text) content = str(base64.b64decode(data['content']), encoding="utf-8") else: content = "" #print(res.text) #raise Exception("获取readme.md失败!") resData = { "content": content } return jsonData(data=resData) def getRepoTree(request, owner, repo): data = json.loads(request.GET.get("data")) ref = data.get("ref") filepath = data.get("filepath") if filepath: api = "/repos/{}/{}/contents/{}?ref={}".format(owner, repo, filepath, ref) else: api = "/repos/{}/{}/contents?ref={}".format(owner, repo, ref) res = RequestGit(request, api).get() items = [] if res.status_code == 200: data = json.loads(res.text) items = sorted(data, key=lambda x: x["type"]) resData = { "items": items } return jsonData(data=resData) def downloadZIP(request, owner, repo): data = json.loads(request.GET.get("data")) ref = data.get("ref") api = "/repos/{}/{}/archive/{}.zip".format(owner, repo, ref) res = RequestGit(request, api).get() if res.status_code == 200: print("下载") else: print(res.text) raise Exception("下载失败!") return jsonData() def lastCommit(request, owner, repo): data = json.loads(request.GET.get("data")) ref = data.get("ref") api = "/repos/{}/{}/commits?sha={}&page=1&limit=1".format(owner, repo, ref) res = RequestGit(request, api).get() if res.status_code == 200: data = json.loads(res.text) committer = data[0]['commit']['author'] userInfo = User.objects.filter(username=committer["name"]) committer["avatar_url"] = userInfo[0].avatar if userInfo else None committer["total"] = res.headers['X-Total-Count'] else: print(res.text) raise Exception("获取提交信息失败!") return jsonData(data=committer)