diff --git a/FOSSDB/apps/fossdb/admin.py b/FOSSDB/apps/fossdb/admin.py index 18d3918..161c5fd 100644 --- a/FOSSDB/apps/fossdb/admin.py +++ b/FOSSDB/apps/fossdb/admin.py @@ -23,9 +23,7 @@ class ProjectAdmin(admin.ModelAdmin): list_display = ("name", "author", "_languages") def _languages(self, object): - return " | ".join( - [i.language.name for i in object.projectprogramminglanguage_set.all()] - ) + return " | ".join([i.programming_language.name for i in object.projectprogramminglanguage_set.all()]) models = ( diff --git a/FOSSDB/apps/fossdb/forms.py b/FOSSDB/apps/fossdb/forms.py index 6bd50be..8416109 100644 --- a/FOSSDB/apps/fossdb/forms.py +++ b/FOSSDB/apps/fossdb/forms.py @@ -4,7 +4,6 @@ from .models import Project class ProjectForm(forms.ModelForm): - class Meta: model = Project fields = ( @@ -15,8 +14,6 @@ class ProjectForm(forms.ModelForm): "operating_system", ) - exclude = ("programming_language",) - widgets = { "name": forms.TextInput( attrs={ diff --git a/FOSSDB/apps/fossdb/migrations/0001_initial.py b/FOSSDB/apps/fossdb/migrations/0001_initial.py index 51f11d8..ba092d8 100644 --- a/FOSSDB/apps/fossdb/migrations/0001_initial.py +++ b/FOSSDB/apps/fossdb/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.2 on 2023-06-25 16:15 +# Generated by Django 4.2.2 on 2023-06-26 13:46 from django.conf import settings from django.db import migrations, models @@ -60,7 +60,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Project', fields=[ - ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255)), ('description', models.TextField(blank=True, default='')), ('date_created', models.DateTimeField(auto_now_add=True)), @@ -83,7 +83,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('percentage', models.PositiveIntegerField()), - ('language', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fossdb.programminglanguage')), + ('programming_language', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fossdb.programminglanguage')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fossdb.project')), ], ), @@ -96,11 +96,6 @@ class Migration(migrations.Migration): ('project', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='fossdb.project')), ], ), - migrations.AddField( - model_name='project', - name='programming_language', - field=models.ManyToManyField(blank=True, through='fossdb.ProjectProgrammingLanguage', to='fossdb.programminglanguage'), - ), migrations.AddField( model_name='project', name='tag', diff --git a/FOSSDB/apps/fossdb/models.py b/FOSSDB/apps/fossdb/models.py index 7b46207..5fb8572 100644 --- a/FOSSDB/apps/fossdb/models.py +++ b/FOSSDB/apps/fossdb/models.py @@ -5,23 +5,17 @@ from django.db import models from .license.models import License from .operating_system.models import OperatingSystemVersion -from .programming_language.models import ProgrammingLanguage from .tag.models import Tag User = settings.AUTH_USER_MODEL class Project(models.Model): - uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, verbose_name="ID") author = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True) name = models.CharField(max_length=255) description = models.TextField(blank=True, default="") license = models.ManyToManyField(License, blank=True) - programming_language = models.ManyToManyField( - ProgrammingLanguage, - through="ProjectProgrammingLanguage", - blank=True, - ) tag = models.ManyToManyField(Tag, blank=True) operating_system = models.ManyToManyField(OperatingSystemVersion, blank=True) date_created = models.DateTimeField(auto_now_add=True) diff --git a/FOSSDB/apps/fossdb/programming_language/forms.py b/FOSSDB/apps/fossdb/programming_language/forms.py index eee0c01..4d29eb5 100644 --- a/FOSSDB/apps/fossdb/programming_language/forms.py +++ b/FOSSDB/apps/fossdb/programming_language/forms.py @@ -1,24 +1,23 @@ from django import forms -from django.forms import inlineformset_factory -from fossdb.models import Project from .models import ProgrammingLanguage, ProjectProgrammingLanguage class ProgrammingLanguageForm(forms.ModelForm): - programming_language = forms.ModelChoiceField( - queryset=ProgrammingLanguage.objects.all() - ) - class Meta: model = ProjectProgrammingLanguage - fields = ("programming_language", "percentage") - - -ProjectProgrammingLanguageFormSet = inlineformset_factory( - Project, - ProjectProgrammingLanguage, - form=ProgrammingLanguageForm, - extra=1, - can_delete=True, -) + fields = ( + "programming_language", + "percentage", + ) + widgets = { + "programming_language": forms.Select( + choices=ProgrammingLanguage.objects.all(), + ), + "percentage": forms.NumberInput( + attrs={ + "min": "0", + "max": "100", + } + ), + } diff --git a/FOSSDB/apps/fossdb/programming_language/models.py b/FOSSDB/apps/fossdb/programming_language/models.py index ef787db..7c62a0d 100644 --- a/FOSSDB/apps/fossdb/programming_language/models.py +++ b/FOSSDB/apps/fossdb/programming_language/models.py @@ -1,4 +1,5 @@ from django.db import models +from fossdb.models import Project class ProgrammingLanguage(models.Model): @@ -9,9 +10,9 @@ class ProgrammingLanguage(models.Model): class ProjectProgrammingLanguage(models.Model): - project = models.ForeignKey("Project", on_delete=models.CASCADE) - language = models.ForeignKey(ProgrammingLanguage, on_delete=models.CASCADE) + project = models.ForeignKey(Project, on_delete=models.CASCADE) + programming_language = models.ForeignKey(ProgrammingLanguage, on_delete=models.CASCADE) percentage = models.PositiveIntegerField() def __str__(self): - return f"{self.project} | {self.language} | {self.percentage}%" + return f"{self.project} | {self.programming_language} | {self.percentage}%" diff --git a/FOSSDB/apps/fossdb/views.py b/FOSSDB/apps/fossdb/views.py index a7fdb7f..9cc57aa 100644 --- a/FOSSDB/apps/fossdb/views.py +++ b/FOSSDB/apps/fossdb/views.py @@ -1,11 +1,12 @@ +from django import forms from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import redirect, render from django.views.generic import CreateView, DeleteView, DetailView, UpdateView from .forms import ProjectForm -from .hosting_platform.forms import ProjectHostingPlatformForm -from .hosting_platform.models import ProjectHostingPlatform +from .hosting_platform.forms import HostingPlatformForm from .models import Project +from .programming_language.forms import ProgrammingLanguageForm @login_required(login_url="login/") @@ -13,10 +14,12 @@ from .models import Project 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": @@ -29,8 +32,11 @@ def add_project(request): 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_form.save_m2m() return redirect("index") context = {"title": "Add project", **_forms} diff --git a/templates/fossdb/add_project.html b/templates/fossdb/add_project.html index d8db375..b25bbd7 100644 --- a/templates/fossdb/add_project.html +++ b/templates/fossdb/add_project.html @@ -7,6 +7,8 @@ {% csrf_token %} {{ project_form.as_p }} {{ hosting_platform_form.as_table }} +
+ {{ programming_language_form.as_table }} {% endblock %}