diff --git a/FOSSDB/apps/fossdb/hosting_platform/models.py b/FOSSDB/apps/fossdb/hosting_platform/models.py index 842f31f..62874e5 100644 --- a/FOSSDB/apps/fossdb/hosting_platform/models.py +++ b/FOSSDB/apps/fossdb/hosting_platform/models.py @@ -1,7 +1,5 @@ from django.db import models -from fossdb.models import Project - class HostingPlatform(models.Model): name = models.CharField(max_length=100, unique=True) @@ -12,7 +10,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) + 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 new file mode 100644 index 0000000..f7e9410 --- /dev/null +++ b/FOSSDB/apps/fossdb/migrations/0001_initial.py @@ -0,0 +1,104 @@ +# Generated by Django 4.2.2 on 2023-06-26 17:16 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='HostingPlatform', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('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, unique=True)), + ('full_name', models.CharField(max_length=100, unique=True)), + ('url', models.URLField(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, unique=True)), + ('description', models.TextField(blank=True, default='')), + ], + ), + 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')), + ('name', models.CharField(max_length=100, unique=True)), + ], + ), + migrations.CreateModel( + name='Project', + fields=[ + ('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)), + ('license', models.ManyToManyField(blank=True, to='fossdb.license')), + ('operating_system', models.ManyToManyField(blank=True, to='fossdb.operatingsystemversion')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('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='ProjectProgrammingLanguage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('percentage', models.PositiveIntegerField()), + ('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')), + ], + ), + migrations.CreateModel( + name='ProjectHostingPlatform', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField(unique=True)), + ('hosting_platform', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fossdb.hostingplatform')), + ('project', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='fossdb.project')), + ], + ), + migrations.AddField( + model_name='project', + name='tag', + field=models.ManyToManyField(blank=True, to='fossdb.tag'), + ), + ] diff --git a/FOSSDB/apps/fossdb/migrations/0002_project_proggramming_language.py b/FOSSDB/apps/fossdb/migrations/0002_project_proggramming_language.py new file mode 100644 index 0000000..bbfd090 --- /dev/null +++ b/FOSSDB/apps/fossdb/migrations/0002_project_proggramming_language.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-06-26 17:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='proggramming_language', + field=models.ManyToManyField(blank=True, through='fossdb.ProjectProgrammingLanguage', to='fossdb.programminglanguage'), + ), + ] diff --git a/FOSSDB/apps/fossdb/migrations/0003_rename_proggramming_language_project_programming_language.py b/FOSSDB/apps/fossdb/migrations/0003_rename_proggramming_language_project_programming_language.py new file mode 100644 index 0000000..ba7467c --- /dev/null +++ b/FOSSDB/apps/fossdb/migrations/0003_rename_proggramming_language_project_programming_language.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-06-26 17:43 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0002_project_proggramming_language'), + ] + + operations = [ + migrations.RenameField( + model_name='project', + old_name='proggramming_language', + new_name='programming_language', + ), + ] diff --git a/FOSSDB/apps/fossdb/migrations/0004_remove_project_programming_language.py b/FOSSDB/apps/fossdb/migrations/0004_remove_project_programming_language.py new file mode 100644 index 0000000..aa9b3c5 --- /dev/null +++ b/FOSSDB/apps/fossdb/migrations/0004_remove_project_programming_language.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.2 on 2023-06-26 17:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0003_rename_proggramming_language_project_programming_language'), + ] + + operations = [ + migrations.RemoveField( + model_name='project', + name='programming_language', + ), + ] diff --git a/FOSSDB/apps/fossdb/programming_language/models.py b/FOSSDB/apps/fossdb/programming_language/models.py index 7c62a0d..853b793 100644 --- a/FOSSDB/apps/fossdb/programming_language/models.py +++ b/FOSSDB/apps/fossdb/programming_language/models.py @@ -1,5 +1,4 @@ from django.db import models -from fossdb.models import Project class ProgrammingLanguage(models.Model): @@ -10,9 +9,9 @@ class ProgrammingLanguage(models.Model): class ProjectProgrammingLanguage(models.Model): - project = models.ForeignKey(Project, 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.programming_language} | {self.percentage}%" + return f"{self.project.owner}/{self.project.name} | {self.programming_language} | {self.percentage}%" diff --git a/FOSSDB/apps/fossdb/views.py b/FOSSDB/apps/fossdb/views.py index 5d8b5e7..ac25d58 100644 --- a/FOSSDB/apps/fossdb/views.py +++ b/FOSSDB/apps/fossdb/views.py @@ -1,12 +1,15 @@ from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin +from django.db import transaction from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse_lazy from django.views.generic import CreateView, DeleteView, DetailView, UpdateView from .forms import ProjectForm from .hosting_platform.forms import HostingPlatformForm +from .hosting_platform.models import ProjectHostingPlatform from .models import Project from .programming_language.forms import ProgrammingLanguageForm +from .programming_language.models import ProjectProgrammingLanguage def index(request): @@ -25,21 +28,23 @@ class ProjectCreateView(LoginRequiredMixin, CreateView): redirect_field_name = "redirect_to" def form_valid(self, form): - form.instance.owner = self.request.user - response = super().form_valid(form) + response = None + with transaction.atomic(): + 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() + 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() + # 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 @@ -73,25 +78,6 @@ class ProjectUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): login_url = "/login/" redirect_field_name = "redirect_to" - 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_queryset(self): queryset = super().get_queryset() return queryset.filter(owner__username=self.kwargs.get("username")) diff --git a/templates/fossdb/detailed_view.html b/templates/fossdb/detailed_view.html index 9c097bb..b3ffc73 100644 --- a/templates/fossdb/detailed_view.html +++ b/templates/fossdb/detailed_view.html @@ -1,11 +1,14 @@ {% extends "layout.html" %} {% load static %} -{% block title %}{{ project.name }}{% endblock %} +{% block title %}{{ project.owner }}/{{ project.name }}{% endblock %} {% block meta %}{% endblock %} {% block content %} -

@{{ project.owner.username }}

-

{{ project.name }}

+

@{{ project.owner }}

+

{{ project.name }}

{{ project.description }}

+

+ {{ project.projecthostingplatform.hosting_platform }} +

- +

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