From 2528d7d7ad39f867eb6b42c0d395af5ea6e479b6 Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Mon, 26 Jun 2023 15:00:08 +0000 Subject: [PATCH] Added `Project` create view --- FOSSDB/apps/fossdb/urls.py | 2 +- FOSSDB/apps/fossdb/views.py | 69 ++++++++++++++--------------- templates/fossdb/detailed_view.html | 20 ++++++--- 3 files changed, 48 insertions(+), 43 deletions(-) diff --git a/FOSSDB/apps/fossdb/urls.py b/FOSSDB/apps/fossdb/urls.py index 7653018..c06a67b 100644 --- a/FOSSDB/apps/fossdb/urls.py +++ b/FOSSDB/apps/fossdb/urls.py @@ -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("//", views.ProjectDetailView.as_view(), name="project-detail"), path("//update/", views.ProjectUpdateView.as_view(), name="project-update"), path("//delete/", views.ProjectDeleteView.as_view(), name="project-delete"), diff --git a/FOSSDB/apps/fossdb/views.py b/FOSSDB/apps/fossdb/views.py index 8a29c1f..a152097 100644 --- a/FOSSDB/apps/fossdb/views.py +++ b/FOSSDB/apps/fossdb/views.py @@ -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" diff --git a/templates/fossdb/detailed_view.html b/templates/fossdb/detailed_view.html index ba842da..9c097bb 100644 --- a/templates/fossdb/detailed_view.html +++ b/templates/fossdb/detailed_view.html @@ -7,25 +7,33 @@

{{ project.name }}

{{ project.description }}

    - {% for language in project.projectprogramminglanguage_set.all %} -
  • {{ language.language }} | {{ language.percentage }}%
  • + {% for language in project.programming_language.all %} +
  • {{ language }}%
  • {% empty %}

    No language

    {% endfor %}
    - {% for tag in project.tag.all %} -
  • {{ tag.name }}
  • + {% for os in project.oprating_system.all %} +
  • {{ os.version }}
  • {% empty %} +

    No OS

    + {% endfor %} +
+
    + {% for tag in project.tag.all %} +
  • {{ tag }}
  • + {% empty %} +

    No tag

    {% endfor %}

{{ project.date_created|date:"d.m.Y, G:i" }}