gitea-migrator/migrator/views.py

118 lines
3.2 KiB
Python

from django.shortcuts import render, redirect
from django.http import JsonResponse, HttpResponse
from . import settings
from .helper import get_dict_from_query
from .models import *
from . import tasks
from .api import *
def migration_create(request):
if request.method == "POST":
projects = get_dict_from_query(request.POST,"projects")
migration = Migration(
gitlab_token = request.POST["gitlab_token"],
gitea_token = request.POST["gitea_token"],
username = request.POST["username"],
)
migration.save()
for project in projects:
repo = Repository(
migration = migration,
path_with_namespace = project
)
repo.save()
tasks.migrate_repository(repo.id)
return redirect("migration_progress", migration.id)
return render(request, "migration_create.html")
def migration_progess(request, migration_key):
try:
migration = Migration.objects.prefetch_related('repositories').get(pk=migration_key)
except Migration.DoesNotExist:
return redirect("migration_create")
return render(request, "migration_progress.html", {
'migration': migration,
})
def migration_status(request, migration_key):
repositories = Repository.objects.filter(
migration_id = migration_key,
).all()
data = []
for repo in repositories:
info = { 'id': repo.id, 'status': repo.result }
if repo.result == Status.ERROR:
info['message'] = repo.error_message
data.append(info)
return JsonResponse(data,safe=False)
def fetch_gitlab_projects(request):
gitlab_token = request.GET.get("gitlab_token", None)
if gitlab_token is None:
return JsonResponse({ 'error' : 'Missing token' })
gitlabapi = GitlabAPI(gitlab_token)
response = gitlabapi.get('/user')
if response.status_code != 200:
return JsonResponse({ 'error' : 'API error' })
data = response.json()
try:
username = data['username']
except KeyError:
return JsonResponse({ 'error' : 'API error' })
projects = []
page = 1
while True:
response = gitlabapi.get('/projects', params={
'owned': 1,
'page': page,
'per_page': 100,
})
if response.status_code != 200:
return JsonResponse({ 'error' : 'API error' })
data = response.json()
if len(data) == 0:
break
for gitlab_project in data:
try:
projects.append(gitlab_project['path_with_namespace'])
except KeyError:
return JsonResponse({ 'error' : 'API error' })
page+=1
return JsonResponse({
'username' : username,
'projects' : sorted(projects)
})
def check_gitea_access(request):
gitea_token = request.GET.get("gitea_token", None)
if gitea_token is None:
return JsonResponse({ 'success': False })
response = GiteaAPI(gitea_token).get('/user')
if response.status_code == 200:
return JsonResponse({ 'success': True })
else:
return JsonResponse({ 'success': False })