diff --git a/FOSSDB/apps/fossdb/admin.py b/FOSSDB/apps/fossdb/admin.py index 951a1ee..18d3918 100644 --- a/FOSSDB/apps/fossdb/admin.py +++ b/FOSSDB/apps/fossdb/admin.py @@ -13,9 +13,14 @@ class ProjectProgrammingLanguageInline(admin.TabularInline): extra = 1 +class ProjectHostingPlatformInline(admin.TabularInline): + model = ProjectHostingPlatform + extra = 1 + + class ProjectAdmin(admin.ModelAdmin): - inlines = [ProjectProgrammingLanguageInline] - list_display = ("name", "author", "_languages", "hosting_platform") + inlines = [ProjectHostingPlatformInline, ProjectProgrammingLanguageInline] + list_display = ("name", "author", "_languages") def _languages(self, object): return " | ".join( @@ -25,7 +30,6 @@ class ProjectAdmin(admin.ModelAdmin): models = ( HostingPlatform, - # ProjectHostingPlatform, # WARNING: remove this License, ProgrammingLanguage, Tag, diff --git a/FOSSDB/apps/fossdb/forms.py b/FOSSDB/apps/fossdb/forms.py index 04faa5a..9642f38 100644 --- a/FOSSDB/apps/fossdb/forms.py +++ b/FOSSDB/apps/fossdb/forms.py @@ -6,21 +6,19 @@ from .models import Project class ProjectForm(forms.ModelForm): - hosting_platform = forms.ModelChoiceField(queryset=HostingPlatform.objects.all()) - url = forms.URLField(max_length=100) class Meta: model = Project fields = ( "name", "description", - "url", - "hosting_platform", "license", "tag", "operating_system", ) + exclude = ("programming_language",) + widgets = { "name": forms.TextInput( attrs={ diff --git a/FOSSDB/apps/fossdb/hosting_platform/forms.py b/FOSSDB/apps/fossdb/hosting_platform/forms.py new file mode 100644 index 0000000..86aeb42 --- /dev/null +++ b/FOSSDB/apps/fossdb/hosting_platform/forms.py @@ -0,0 +1,11 @@ +from django import forms + +from .models import HostingPlatform, ProjectHostingPlatform + + +class ProjectHostingPlatformForm(forms.ModelForm): + hosting_platform = forms.ModelChoiceField(queryset=HostingPlatform.objects.all()) + + class Meta: + model = ProjectHostingPlatform + fields = ("hosting_platform", "url") diff --git a/FOSSDB/apps/fossdb/hosting_platform/models.py b/FOSSDB/apps/fossdb/hosting_platform/models.py index 49e3020..842f31f 100644 --- a/FOSSDB/apps/fossdb/hosting_platform/models.py +++ b/FOSSDB/apps/fossdb/hosting_platform/models.py @@ -1,5 +1,7 @@ from django.db import models +from fossdb.models import Project + class HostingPlatform(models.Model): name = models.CharField(max_length=100, unique=True) @@ -10,6 +12,7 @@ class HostingPlatform(models.Model): class ProjectHostingPlatform(models.Model): hosting_platform = models.ForeignKey(HostingPlatform, on_delete=models.CASCADE) + project = models.OneToOneField(Project, on_delete=models.CASCADE) url = models.URLField(unique=True) def __str__(self): diff --git a/FOSSDB/apps/fossdb/migrations/0001_initial.py b/FOSSDB/apps/fossdb/migrations/0001_initial.py index 7dd555f..51f11d8 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-16 16:30 +# Generated by Django 4.2.2 on 2023-06-25 16:15 from django.conf import settings from django.db import migrations, models @@ -19,33 +19,42 @@ class Migration(migrations.Migration): name='HostingPlatform', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('hosting_platform', models.CharField(max_length=100)), + ('name', models.CharField(max_length=100, unique=True)), ], ), migrations.CreateModel( name='License', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('short_name', models.CharField(max_length=50)), - ('full_name', models.CharField(blank=True, default='', max_length=100)), + ('short_name', models.CharField(max_length=50, unique=True)), + ('full_name', models.CharField(max_length=100, unique=True)), ('url', models.URLField(blank=True, default='')), - ('description', models.TextField(blank=True, default='')), + ('text', models.TextField(blank=True, default='')), ], ), migrations.CreateModel( name='OperatingSystem', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), + ('name', models.CharField(max_length=100, unique=True)), ('description', models.TextField(blank=True, default='')), - ('version', models.CharField(blank=True, max_length=50)), + ], + ), + migrations.CreateModel( + name='OperatingSystemVersion', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('version', models.CharField(blank=True, default='', max_length=50)), + ('codename', models.CharField(blank=True, default='', max_length=100)), + ('is_lts', models.BooleanField(blank=True, default=False)), + ('operating_system', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fossdb.operatingsystem')), ], ), migrations.CreateModel( name='ProgrammingLanguage', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('language', models.CharField(max_length=100)), + ('name', models.CharField(max_length=100, unique=True)), ], ), migrations.CreateModel( @@ -56,25 +65,19 @@ class Migration(migrations.Migration): ('description', models.TextField(blank=True, default='')), ('date_created', models.DateTimeField(auto_now_add=True)), ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('license', models.ManyToManyField(blank=True, to='fossdb.license')), + ('operating_system', models.ManyToManyField(blank=True, to='fossdb.operatingsystemversion')), ], ), migrations.CreateModel( name='Tag', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), + ('name', models.CharField(db_index=True, max_length=100, unique=True)), ('description', models.TextField(blank=True, default='')), ('icon', models.ImageField(blank=True, null=True, upload_to='types/icons/')), ], ), - migrations.CreateModel( - name='Star', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stars', to='fossdb.project')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), migrations.CreateModel( name='ProjectProgrammingLanguage', fields=[ @@ -88,39 +91,19 @@ class Migration(migrations.Migration): name='ProjectHostingPlatform', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('url', models.URLField()), + ('url', models.URLField(unique=True)), ('hosting_platform', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fossdb.hostingplatform')), - ('project', models.ForeignKey(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='hosting_platform', - field=models.ManyToManyField(related_name='projects', through='fossdb.ProjectHostingPlatform', to='fossdb.hostingplatform'), - ), - migrations.AddField( - model_name='project', - name='licenses', - field=models.ManyToManyField(to='fossdb.license'), - ), - migrations.AddField( - model_name='project', - name='os', - field=models.ManyToManyField(to='fossdb.operatingsystem'), - ), - migrations.AddField( - model_name='project', - name='programming_languages', - field=models.ManyToManyField(related_name='projects', through='fossdb.ProjectProgrammingLanguage', to='fossdb.programminglanguage'), - ), - migrations.AddField( - model_name='project', - name='star', - field=models.ManyToManyField(related_name='projects_star', to='fossdb.star'), + name='programming_language', + field=models.ManyToManyField(blank=True, through='fossdb.ProjectProgrammingLanguage', to='fossdb.programminglanguage'), ), migrations.AddField( model_name='project', name='tag', - field=models.ManyToManyField(to='fossdb.tag'), + field=models.ManyToManyField(blank=True, to='fossdb.tag'), ), ] diff --git a/FOSSDB/apps/fossdb/models.py b/FOSSDB/apps/fossdb/models.py index d8ee372..7b46207 100644 --- a/FOSSDB/apps/fossdb/models.py +++ b/FOSSDB/apps/fossdb/models.py @@ -3,7 +3,6 @@ import uuid from django.conf import settings from django.db import models -from .hosting_platform.models import ProjectHostingPlatform from .license.models import License from .operating_system.models import OperatingSystemVersion from .programming_language.models import ProgrammingLanguage @@ -21,12 +20,8 @@ class Project(models.Model): programming_language = models.ManyToManyField( ProgrammingLanguage, through="ProjectProgrammingLanguage", - related_name="projects", blank=True, ) - hosting_platform = models.ForeignKey( - ProjectHostingPlatform, on_delete=models.CASCADE - ) 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/views.py b/FOSSDB/apps/fossdb/views.py index 3d06ac4..9e85081 100644 --- a/FOSSDB/apps/fossdb/views.py +++ b/FOSSDB/apps/fossdb/views.py @@ -3,6 +3,7 @@ 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 .models import Project @@ -10,25 +11,29 @@ from .models import Project @login_required(login_url="login/") @permission_required("fossdb.add_project", login_url="login/", raise_exception=True) def add_project(request): - form = ProjectForm(request.POST or None) + project_form = ProjectForm(request.POST or None) + hosting_platform_form = ProjectHostingPlatformForm(request.POST or None) if request.method == "POST": - if form.is_valid(): - project = form.save(commit=False) + if project_form.is_valid() and hosting_platform_form.is_valid(): + project = project_form.save(commit=False) project.author = request.user - project_hosting_platform = ProjectHostingPlatform.objects.create( - hosting_platform=form.cleaned_data["hosting_platform"], - url=form.cleaned_data["url"], - ) - project.hosting_platform = project_hosting_platform project.save() - form.save_m2m() + project_hosting_platform = ProjectHostingPlatform( + hosting_platform=hosting_platform_form.cleaned_data["hosting_platform"], + project=project, + url=hosting_platform_form.cleaned_data["url"], + ) + project_hosting_platform.save() + + project_form.save_m2m() return redirect("index") context = { "title": "Add project", - "form": form, + "form": project_form, + "host_form": hosting_platform_form, } return render(request, "fossdb/add_project.html", context) diff --git a/templates/fossdb/add_project.html b/templates/fossdb/add_project.html index 962a08e..12b6134 100644 --- a/templates/fossdb/add_project.html +++ b/templates/fossdb/add_project.html @@ -6,6 +6,7 @@
{% endblock %}