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 = [ urlpatterns = [
path("", views.index, name="index"), 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>/", 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>/update/", views.ProjectUpdateView.as_view(), name="project-update"),
path("<str:username>/<str:project_name>/delete/", views.ProjectDeleteView.as_view(), name="project-delete"), 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 import forms
from django.conf import settings 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.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse_lazy from django.urls import reverse_lazy
@ -14,41 +13,6 @@ from .programming_language.forms import ProgrammingLanguageForm
User = settings.AUTH_USER_MODEL 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): def index(request):
context = { context = {
"title": "FOSSDB", "title": "FOSSDB",
@ -57,6 +21,39 @@ def index(request):
return render(request, "fossdb/index.html", context) 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): class ProjectDetailView(DetailView):
model = Project model = Project
template_name = "fossdb/detailed_view.html" template_name = "fossdb/detailed_view.html"

View File

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