Added ProgrammingLanguage input field

Users can now add programming language and percentage to the project.

### TODO
- [ ] Allow users to add multiple languages
This commit is contained in:
Kristofers Solo 2023-06-26 14:01:17 +00:00
parent fd5dd8bf55
commit d3931e52aa
8 changed files with 35 additions and 43 deletions

View File

@ -23,9 +23,7 @@ class ProjectAdmin(admin.ModelAdmin):
list_display = ("name", "author", "_languages") list_display = ("name", "author", "_languages")
def _languages(self, object): def _languages(self, object):
return " | ".join( return " | ".join([i.programming_language.name for i in object.projectprogramminglanguage_set.all()])
[i.language.name for i in object.projectprogramminglanguage_set.all()]
)
models = ( models = (

View File

@ -4,7 +4,6 @@ from .models import Project
class ProjectForm(forms.ModelForm): class ProjectForm(forms.ModelForm):
class Meta: class Meta:
model = Project model = Project
fields = ( fields = (
@ -15,8 +14,6 @@ class ProjectForm(forms.ModelForm):
"operating_system", "operating_system",
) )
exclude = ("programming_language",)
widgets = { widgets = {
"name": forms.TextInput( "name": forms.TextInput(
attrs={ attrs={

View File

@ -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.conf import settings
from django.db import migrations, models from django.db import migrations, models
@ -60,7 +60,7 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='Project', name='Project',
fields=[ 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)), ('name', models.CharField(max_length=255)),
('description', models.TextField(blank=True, default='')), ('description', models.TextField(blank=True, default='')),
('date_created', models.DateTimeField(auto_now_add=True)), ('date_created', models.DateTimeField(auto_now_add=True)),
@ -83,7 +83,7 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('percentage', models.PositiveIntegerField()), ('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')), ('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')), ('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( migrations.AddField(
model_name='project', model_name='project',
name='tag', name='tag',

View File

@ -5,23 +5,17 @@ from django.db import models
from .license.models import License from .license.models import License
from .operating_system.models import OperatingSystemVersion from .operating_system.models import OperatingSystemVersion
from .programming_language.models import ProgrammingLanguage
from .tag.models import Tag from .tag.models import Tag
User = settings.AUTH_USER_MODEL User = settings.AUTH_USER_MODEL
class Project(models.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) author = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
description = models.TextField(blank=True, default="") description = models.TextField(blank=True, default="")
license = models.ManyToManyField(License, blank=True) license = models.ManyToManyField(License, blank=True)
programming_language = models.ManyToManyField(
ProgrammingLanguage,
through="ProjectProgrammingLanguage",
blank=True,
)
tag = models.ManyToManyField(Tag, blank=True) tag = models.ManyToManyField(Tag, blank=True)
operating_system = models.ManyToManyField(OperatingSystemVersion, blank=True) operating_system = models.ManyToManyField(OperatingSystemVersion, blank=True)
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)

View File

@ -1,24 +1,23 @@
from django import forms from django import forms
from django.forms import inlineformset_factory
from fossdb.models import Project
from .models import ProgrammingLanguage, ProjectProgrammingLanguage from .models import ProgrammingLanguage, ProjectProgrammingLanguage
class ProgrammingLanguageForm(forms.ModelForm): class ProgrammingLanguageForm(forms.ModelForm):
programming_language = forms.ModelChoiceField(
queryset=ProgrammingLanguage.objects.all()
)
class Meta: class Meta:
model = ProjectProgrammingLanguage model = ProjectProgrammingLanguage
fields = ("programming_language", "percentage") fields = (
"programming_language",
"percentage",
ProjectProgrammingLanguageFormSet = inlineformset_factory( )
Project, widgets = {
ProjectProgrammingLanguage, "programming_language": forms.Select(
form=ProgrammingLanguageForm, choices=ProgrammingLanguage.objects.all(),
extra=1, ),
can_delete=True, "percentage": forms.NumberInput(
) attrs={
"min": "0",
"max": "100",
}
),
}

View File

@ -1,4 +1,5 @@
from django.db import models from django.db import models
from fossdb.models import Project
class ProgrammingLanguage(models.Model): class ProgrammingLanguage(models.Model):
@ -9,9 +10,9 @@ class ProgrammingLanguage(models.Model):
class ProjectProgrammingLanguage(models.Model): class ProjectProgrammingLanguage(models.Model):
project = models.ForeignKey("Project", on_delete=models.CASCADE) project = models.ForeignKey(Project, on_delete=models.CASCADE)
language = models.ForeignKey(ProgrammingLanguage, on_delete=models.CASCADE) programming_language = models.ForeignKey(ProgrammingLanguage, on_delete=models.CASCADE)
percentage = models.PositiveIntegerField() percentage = models.PositiveIntegerField()
def __str__(self): def __str__(self):
return f"{self.project} | {self.language} | {self.percentage}%" return f"{self.project} | {self.programming_language} | {self.percentage}%"

View File

@ -1,11 +1,12 @@
from django import forms
from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.decorators import login_required, permission_required
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.views.generic import CreateView, DeleteView, DetailView, UpdateView from django.views.generic import CreateView, DeleteView, DetailView, UpdateView
from .forms import ProjectForm from .forms import ProjectForm
from .hosting_platform.forms import ProjectHostingPlatformForm from .hosting_platform.forms import HostingPlatformForm
from .hosting_platform.models import ProjectHostingPlatform
from .models import Project from .models import Project
from .programming_language.forms import ProgrammingLanguageForm
@login_required(login_url="login/") @login_required(login_url="login/")
@ -13,10 +14,12 @@ from .models import Project
def add_project(request): def add_project(request):
project_form = ProjectForm(request.POST or None) project_form = ProjectForm(request.POST or None)
hosting_platform_form = HostingPlatformForm(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] = { _forms: dict[str, forms.ModelForm] = {
"project_form": project_form, "project_form": project_form,
"hosting_platform_form": hosting_platform_form, "hosting_platform_form": hosting_platform_form,
"programming_language_form": programming_language_form,
} }
if request.method == "POST": if request.method == "POST":
@ -29,8 +32,11 @@ def add_project(request):
hosting_platform.project = project hosting_platform.project = project
hosting_platform.save() 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") return redirect("index")
context = {"title": "Add project", **_forms} context = {"title": "Add project", **_forms}

View File

@ -7,6 +7,8 @@
{% csrf_token %} {% csrf_token %}
{{ project_form.as_p }} {{ project_form.as_p }}
{{ hosting_platform_form.as_table }} {{ hosting_platform_form.as_table }}
<br />
{{ programming_language_form.as_table }}
<button type="submit">Submit</button> <button type="submit">Submit</button>
</form> </form>
{% endblock %} {% endblock %}