Added Project create view

This commit is contained in:
Kristofers Solo 2023-06-26 15:00:08 +00:00
parent dd9d2bee21
commit 2528d7d7ad
3 changed files with 48 additions and 43 deletions

View File

@ -4,7 +4,7 @@ from . import views
urlpatterns = [
path("", views.index, name="index"),
path("add/", views.add_project, name="add-project"),
path("add/", views.ProjectCreateView.as_view(), name="add-project"),
path("<str:username>/<str:project_name>/", views.ProjectDetailView.as_view(), name="project-detail"),
path("<str:username>/<str:project_name>/update/", views.ProjectUpdateView.as_view(), name="project-update"),
path("<str:username>/<str:project_name>/delete/", views.ProjectDeleteView.as_view(), name="project-delete"),

View File

@ -1,6 +1,5 @@
from django import forms
from django.conf import settings
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse_lazy
@ -14,41 +13,6 @@ from .programming_language.forms import ProgrammingLanguageForm
User = settings.AUTH_USER_MODEL
@login_required(login_url="login/")
@permission_required("fossdb.add_project", login_url="login/", raise_exception=True)
def add_project(request):
project_form = ProjectForm(request.POST or None)
hosting_platform_form = HostingPlatformForm(request.POST or None)
programming_language_form = ProgrammingLanguageForm(request.POST or None)
_forms: dict[str, forms.ModelForm] = {
"project_form": project_form,
"hosting_platform_form": hosting_platform_form,
"programming_language_form": programming_language_form,
}
if request.method == "POST":
if all([form.is_valid() for form in _forms.values()]):
project = project_form.save(commit=False)
project.author = request.user
project.save()
hosting_platform = hosting_platform_form.save(commit=False)
hosting_platform.project = project
hosting_platform.save()
# TODO: allow adding multiple languages
programming_language = programming_language_form.save(commit=False)
programming_language.project = project
programming_language.save()
project.save_m2m()
return redirect("index")
context = {"title": "Add project", **_forms}
return render(request, "fossdb/add_project.html", context)
def index(request):
context = {
"title": "FOSSDB",
@ -57,6 +21,39 @@ def index(request):
return render(request, "fossdb/index.html", context)
class ProjectCreateView(LoginRequiredMixin, CreateView):
model = Project
form_class = ProjectForm
template_name = "fossdb/add_project.html"
def form_valid(self, form):
form.instance.owner = self.request.user
response = super().form_valid(form)
hosting_platform_form = HostingPlatformForm(self.request.POST, instance=self.object)
if hosting_platform_form.is_valid():
hosting_platform = hosting_platform_form.save(commit=False)
hosting_platform.project = self.object
hosting_platform.save()
# TODO: allow adding multiple languages
programming_language_form = ProgrammingLanguageForm(self.request.POST, instance=self.object)
if programming_language_form.is_valid():
programming_language = programming_language_form.save(commit=False)
programming_language.project = self.object
programming_language.save()
return response
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Add project"
context["project_form"] = ProjectForm()
context["hosting_platform_form"] = HostingPlatformForm()
context["programming_language_form"] = ProgrammingLanguageForm()
return context
class ProjectDetailView(DetailView):
model = Project
template_name = "fossdb/detailed_view.html"

View File

@ -7,25 +7,33 @@
<p>{{ project.name }}</p>
<p>{{ project.description }}</p>
<ul>
{% for license in project.licenses.all %}
{% for license in project.license.all %}
<li>
<a href="{{ license.url }}">{{ license.short_name }}</a>
<a href="{{ license.url }}">{{ license }}</a>
</li>
{% empty %}
<p>No license</p>
{% endfor %}
</ul>
<ul>
{% for language in project.projectprogramminglanguage_set.all %}
<li>{{ language.language }} | {{ language.percentage }}&#37;</li>
{% for language in project.programming_language.all %}
<li>{{ language }}&#37;</li>
{% empty %}
<p>No language</p>
{% endfor %}
</ul>
<ul>
{% for tag in project.tag.all %}
<li>{{ tag.name }}</li>
{% for os in project.oprating_system.all %}
<li>{{ os.version }}</li>
{% empty %}
<p>No OS</p>
{% endfor %}
</ul>
<ul>
{% for tag in project.tag.all %}
<li>{{ tag }}</li>
{% empty %}
<p>No tag</p>
{% endfor %}
</ul>
<p>{{ project.date_created|date:"d.m.Y, G:i" }}</p>