From f34cf827c83483fbc4735d01f96fbc7fae984815 Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Sat, 8 Apr 2023 01:24:54 +0300 Subject: [PATCH] Added HostingPlatform --- FOSSDB_web/apps/fossdb/admin.py | 22 ++++++++++++------ FOSSDB_web/apps/fossdb/forms.py | 37 +++++++++++++++++++++++++++++-- FOSSDB_web/apps/fossdb/models.py | 17 ++++++++++++++ FOSSDB_web/apps/fossdb/views.py | 13 ++++++++--- templates/fossdb/add_project.html | 1 + 5 files changed, 78 insertions(+), 12 deletions(-) diff --git a/FOSSDB_web/apps/fossdb/admin.py b/FOSSDB_web/apps/fossdb/admin.py index 1c328f2..353a014 100644 --- a/FOSSDB_web/apps/fossdb/admin.py +++ b/FOSSDB_web/apps/fossdb/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin -from .models import (License, ProgrammingLanguage, Project, - ProjectProgrammingLanguage) +from .models import (HostingPlatform, License, ProgrammingLanguage, Project, + ProjectHostingPlatform, ProjectProgrammingLanguage) class ProjectProgrammingLanguageInline(admin.TabularInline): @@ -9,15 +9,23 @@ class ProjectProgrammingLanguageInline(admin.TabularInline): extra = 1 -class ProjectAdmin(admin.ModelAdmin): - inlines = [ProjectProgrammingLanguageInline] - list_display = ("author", "name", "get_languages") +class ProjectHostingPlatformInline(admin.TabularInline): + model = ProjectHostingPlatform + extra = 1 - def get_languages(self, object): + +class ProjectAdmin(admin.ModelAdmin): + inlines = [ProjectProgrammingLanguageInline, ProjectHostingPlatformInline] + list_display = ("author", "name", "_languages", "_hosting_platform") + + def _languages(self, object): return " | ".join([i.language.language for i in object.projectprogramminglanguage_set.all()]) + def _hosting_platform(self, object): + return " | ".join([i.hosting_platform.hosting_platform for i in object.projecthostingplatform_set.all()]) + admin.site.register(License) admin.site.register(ProgrammingLanguage) +admin.site.register(HostingPlatform) admin.site.register(Project, ProjectAdmin) -# admin.site.register(HostingPlatform) diff --git a/FOSSDB_web/apps/fossdb/forms.py b/FOSSDB_web/apps/fossdb/forms.py index c80ed03..9da02f4 100644 --- a/FOSSDB_web/apps/fossdb/forms.py +++ b/FOSSDB_web/apps/fossdb/forms.py @@ -1,7 +1,7 @@ from django import forms -from .models import (License, ProgrammingLanguage, Project, - ProjectProgrammingLanguage) +from .models import (HostingPlatform, License, ProgrammingLanguage, Project, + ProjectHostingPlatform, ProjectProgrammingLanguage) class ProjectForm(forms.ModelForm): @@ -28,3 +28,36 @@ class LicenseForm(forms.ModelForm): model = License fields = ["short_name", "full_name", "url", "description"] + +class ProgrammingLanguageForm(forms.ModelForm): + percentage = forms.IntegerField(min_value=0, max_value=100) + + class Meta: + model = ProgrammingLanguage + fields = ["language", "percentage"] + + +ProjectProgrammingLanguageFormSet = forms.inlineformset_factory( + Project, + ProjectProgrammingLanguage, + form=ProgrammingLanguageForm, + extra=1, + can_delete=True, +) + + +class HostingPlatformForm(forms.ModelForm): + url = forms.URLField() + + class Meta: + model = HostingPlatform + fields = ["hosting_platform", "url"] + + +ProjectHostingPlatformFormSet = forms.inlineformset_factory( + Project, + ProjectHostingPlatform, + form=HostingPlatformForm, + extra=1, + can_delete=False +) diff --git a/FOSSDB_web/apps/fossdb/models.py b/FOSSDB_web/apps/fossdb/models.py index 1fa7430..9485b59 100644 --- a/FOSSDB_web/apps/fossdb/models.py +++ b/FOSSDB_web/apps/fossdb/models.py @@ -28,12 +28,29 @@ class ProjectProgrammingLanguage(models.Model): return f"{self.project} | {self.language} | {self.percentage}%" +class HostingPlatform(models.Model): + hosting_platform = models.CharField(max_length=100) + + def __str__(self): + return self.hosting_platform + + +class ProjectHostingPlatform(models.Model): + project = models.ForeignKey("Project", on_delete=models.CASCADE) + hosting_platform = models.ForeignKey(HostingPlatform, on_delete=models.CASCADE) + url = models.URLField() + + def __str__(self): + return f"{self.project} | {self.hosting_platform}" + + class Project(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE) name = models.CharField(max_length=255, null=False) description = models.TextField() licenses = models.ManyToManyField(License) programming_languages = models.ManyToManyField(ProgrammingLanguage, through="ProjectProgrammingLanguage", related_name="projects") + hosting_platform = models.ManyToManyField(HostingPlatform, through="ProjectHostingPlatform", related_name="projects") date_created = models.DateTimeField(auto_now_add=True) def __str__(self): diff --git a/FOSSDB_web/apps/fossdb/views.py b/FOSSDB_web/apps/fossdb/views.py index 87c9b9f..19b6d09 100644 --- a/FOSSDB_web/apps/fossdb/views.py +++ b/FOSSDB_web/apps/fossdb/views.py @@ -1,7 +1,8 @@ from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import redirect, render -from .forms import ProjectForm, ProjectProgrammingLanguageFormSet +from .forms import (ProjectForm, ProjectHostingPlatformFormSet, + ProjectProgrammingLanguageFormSet) from .models import Project @@ -19,8 +20,9 @@ def add_project(request): if request.method == "POST": project_form = ProjectForm(request.POST) language_formset = ProjectProgrammingLanguageFormSet(request.POST, instance=Project()) + host_formset = ProjectHostingPlatformFormSet(request.POST, instance=Project()) - if project_form.is_valid() and language_formset.is_valid(): + if project_form.is_valid() and language_formset.is_valid() and host_formset.is_valid(): project = project_form.save(commit=False) project.author = request.user project.save() @@ -28,15 +30,20 @@ def add_project(request): language_formset.instance = project language_formset.save() + host_formset.instance = project + host_formset.save() + project_form.save_m2m() return redirect("/") else: project_form = ProjectForm() language_formset = ProjectProgrammingLanguageFormSet() + host_formset = ProjectHostingPlatformFormSet() context = { "title": "Add project", "project_form": project_form, - "language_formset": language_formset + "language_formset": language_formset, + "host_formset": host_formset, } return render(request, "fossdb/add_project.html", context) diff --git a/templates/fossdb/add_project.html b/templates/fossdb/add_project.html index f560f60..d414e16 100644 --- a/templates/fossdb/add_project.html +++ b/templates/fossdb/add_project.html @@ -16,6 +16,7 @@ {% endfor %} + {{ host_formset.as_p }} {% endblock %}