Add toml file to saved files on upload

This commit is contained in:
HugoNeveux 2020-04-30 19:21:01 +02:00
parent 45a819788b
commit b070f35d5e
6 changed files with 50 additions and 9 deletions

View File

@ -17,5 +17,5 @@ from django.urls import path
from . import views from . import views
urlpatterns = [ urlpatterns = [
path('download/<str:req_mod>/<str:req_ver>/', views.ModuleDownloadView.as_view(), name="api_dl") path('download/<str:req_mod>/<str:req_ver>/', views.ModuleDownloadView.as_view(), name="api_zip_dl")
] ]

View File

@ -14,3 +14,8 @@ class ModuleDownloadView(View):
response = HttpResponse(zf, content_type="application/force-download") response = HttpResponse(zf, content_type="application/force-download")
response['Content-Disposition'] = f'attachment; filename={module.name}-{version.ver}.zip' response['Content-Disposition'] = f'attachment; filename={module.name}-{version.ver}.zip'
return response return response
class TomlDownloadView(View):
def get(self, request, req_mod, req_ver):
module = get_object_or_404(module, name=req_mod)
version = get_object_or_404(Version, module=module, ver=req_ver)

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0 on 2020-04-29 14:15
from django.db import migrations, models
import store.models
class Migration(migrations.Migration):
dependencies = [
('store', '0009_version_readme'),
]
operations = [
migrations.AddField(
model_name='version',
name='toml',
field=models.FileField(null=True, upload_to=store.models.toml_upload_path),
),
]

View File

@ -16,6 +16,14 @@ def upload_path(instance, filename):
os.remove(os.path.join(settings.MEDIA_ROOT, path)) os.remove(os.path.join(settings.MEDIA_ROOT, path))
return path return path
def toml_upload_path(instance, filename):
path = os.path.join(
'modules', instance.module.name.lower(), instance.ver, instance.module.name+'.toml')
if os.path.isfile(os.path.join(settings.MEDIA_ROOT, path)):
# Delete file if already exists
os.remove(os.path.join(settings.MEDIA_ROOT, path))
return path
class Module(models.Model): class Module(models.Model):
name = models.CharField(max_length=255, unique=True) name = models.CharField(max_length=255, unique=True)
@ -35,6 +43,7 @@ class Version(models.Model):
metamodule = models.BooleanField(default=False) metamodule = models.BooleanField(default=False)
file = models.FileField(upload_to=upload_path) file = models.FileField(upload_to=upload_path)
readme = MarkdownxField(default="No readme provided.") readme = MarkdownxField(default="No readme provided.")
toml = models.FileField(upload_to=toml_upload_path, null=True)
def __str__(self): def __str__(self):
return self.ver return self.ver

View File

@ -40,7 +40,7 @@
</div> </div>
<div class="col bg-grey"> <div class="col bg-grey">
<p> <p>
<a href="{% url 'api_dl' req_mod=module.name req_ver=view_version.ver %}" class="btn btn-success"> <a href="{% url 'api_zip_dl' req_mod=module.name req_ver=view_version.ver %}" class="btn btn-success">
Download <span class="fas fa-download"></span> Download <span class="fas fa-download"></span>
</a> </a>
</p> </p>

View File

@ -2,18 +2,18 @@ from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render, get_object_or_404 from django.shortcuts import render, get_object_or_404
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils import timezone from django.utils import timezone
from bootstrap_modal_forms.generic import BSModalCreateView, BSModalLoginView
from .forms import CustomUserCreationForm, CustomAuthenticationForm
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
from django.views.generic.list import ListView from django.views.generic.list import ListView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.views import View from django.views import View
from .forms import FileFieldForm from django.http import HttpResponse, JsonResponse
from django.utils import timezone
from django.core.files import File
from bootstrap_modal_forms.generic import BSModalCreateView, BSModalLoginView
from .forms import CustomUserCreationForm, CustomAuthenticationForm, FileFieldForm
from .models import Module, Version, Dependency from .models import Module, Version, Dependency
from PDMI import settings from PDMI import settings
from packaging.specifiers import SpecifierSet from packaging.specifiers import SpecifierSet
from django.http import HttpResponse, JsonResponse
from django.utils import timezone
from markdownx.utils import markdownify from markdownx.utils import markdownify
import os import os
import zipfile import zipfile
@ -23,6 +23,7 @@ import magic
REQUIRED_FIELDS = ['name', 'description', 'version', 'bot_version'] REQUIRED_FIELDS = ['name', 'description', 'version', 'bot_version']
class SignUpView(BSModalCreateView): class SignUpView(BSModalCreateView):
form_class = CustomUserCreationForm form_class = CustomUserCreationForm
template_name = 'store/signup_modal.html' template_name = 'store/signup_modal.html'
@ -36,6 +37,7 @@ class CustomLoginView(BSModalLoginView):
success_message = 'Success: You were successfully logged in.' success_message = 'Success: You were successfully logged in.'
extra_content = dict(success_url=reverse_lazy('index')) extra_content = dict(success_url=reverse_lazy('index'))
class ModuleListView(ListView): class ModuleListView(ListView):
model = Module model = Module
paginate_by = 100 paginate_by = 100
@ -45,6 +47,7 @@ class ModuleListView(ListView):
context['now'] = timezone.now() context['now'] = timezone.now()
return context return context
class ModuleDetailView(View): class ModuleDetailView(View):
def get(self, request, pk, req_ver="latest"): def get(self, request, pk, req_ver="latest"):
module = get_object_or_404(Module, id=pk) module = get_object_or_404(Module, id=pk)
@ -53,7 +56,8 @@ class ModuleDetailView(View):
for version in versions: for version in versions:
deps.append(Dependency.objects.filter(version=version)) deps.append(Dependency.objects.filter(version=version))
if req_ver == "latest": if req_ver == "latest":
view_version = Version.objects.filter(module=module).order_by('-id')[0] view_version = Version.objects.filter(
module=module).order_by('-id')[0]
else: else:
view_version = Version.objects.get(module=module, ver=req_ver) view_version = Version.objects.get(module=module, ver=req_ver)
return render(request, 'store/module_detail.html', { return render(request, 'store/module_detail.html', {
@ -88,9 +92,11 @@ class UploadView(LoginRequiredMixin, FormView):
with zipfile.ZipFile(zip_path, 'r') as zip: # Unzip archive with zipfile.ZipFile(zip_path, 'r') as zip: # Unzip archive
zip.extractall(extract_path) zip.extractall(extract_path)
with open(os.path.join(extract_path, 'infos.toml'), 'r') as f: with open(os.path.join(extract_path, 'infos.toml'), 'r') as f:
# Reading and parsing toml file # Reading and parsing toml file
module_info = toml.loads(f.read()) module_info = toml.loads(f.read())
toml_file = File(open(os.path.join(extract_path, 'infos.toml'), 'r'))
if os.path.isfile(os.path.join(extract_path, 'README.md')): if os.path.isfile(os.path.join(extract_path, 'README.md')):
with open(os.path.join(extract_path, 'README.md'), 'r') as f: with open(os.path.join(extract_path, 'README.md'), 'r') as f:
# Reading README.md file # Reading README.md file
@ -121,13 +127,15 @@ class UploadView(LoginRequiredMixin, FormView):
version.metamodule = module_info['metamodule'] version.metamodule = module_info['metamodule']
version.bot_ver = module_info['bot_version'] version.bot_ver = module_info['bot_version']
version.readme = readme version.readme = readme
version.toml = toml_file
else: else:
version = Version(module=module, ver=module_info['version'], version = Version(module=module, ver=module_info['version'],
bot_ver=module_info['bot_version'], bot_ver=module_info['bot_version'],
metamodule=module_info['metamodule'], metamodule=module_info['metamodule'],
file=file, readme=readme) file=file, readme=readme, toml=toml_file)
module.save() module.save()
version.save() version.save()
toml_file.close()
for dependency in module_info['dependencies']: for dependency in module_info['dependencies']:
if not Dependency.objects.filter(version=version, dep_module=dependency, if not Dependency.objects.filter(version=version, dep_module=dependency,
dep_version=module_info['dependencies'][dependency]).exists(): dep_version=module_info['dependencies'][dependency]).exists():