Fix DetailView

Shows all fields of `Project` in `DetailView`
This commit is contained in:
Kristofers Solo 2023-06-27 09:45:11 +00:00
parent a1dbb90474
commit 3cfe95d214
8 changed files with 193 additions and 50 deletions

View File

@ -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):

View File

@ -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'),
),
]

View File

@ -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'),
),
]

View File

@ -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',
),
]

View File

@ -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',
),
]

View File

@ -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}%"

View File

@ -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,6 +28,8 @@ class ProjectCreateView(LoginRequiredMixin, CreateView):
redirect_field_name = "redirect_to"
def form_valid(self, form):
response = None
with transaction.atomic():
form.instance.owner = self.request.user
response = super().form_valid(form)
@ -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"))

View File

@ -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 %}
<h2>@{{ project.owner.username }}</h2>
<p>{{ project.name }}</p>
<h2>@{{ project.owner }}</h2>
<h3>{{ project.name }}</h3>
<p>{{ project.description }}</p>
<p>
<a href="{{ project.projecthostingplatform.url }}" target="_blank">{{ project.projecthostingplatform.hosting_platform }}</a>
</p>
<ul>
{% for license in project.license.all %}
<li>
@ -16,15 +19,8 @@
{% endfor %}
</ul>
<ul>
{% for language in project.programming_language.all %}
<li>{{ language }}&#37;</li>
{% empty %}
<p>No language</p>
{% endfor %}
</ul>
<ul>
{% for os in project.oprating_system.all %}
<li>{{ os.version }}</li>
{% for os in project.operating_system.all %}
<li>{{ os }}</li>
{% empty %}
<p>No OS</p>
{% endfor %}
@ -36,6 +32,13 @@
<p>No tag</p>
{% endfor %}
</ul>
<ul>
{% for language in project.projectprogramminglanguage_set.all %}
<li>{{ language.programming_language }} {{ language.percentage }}&#37;</li>
{% empty %}
<p>No language</p>
{% endfor %}
</ul>
<p>{{ project.date_created|date:"d.m.Y, G:i" }}</p>
<button>
<a href="{% url 'project-update' project.owner project.name %}">Update</a>