mirror of
https://github.com/kristoferssolo/FOSSDB.git
synced 2025-10-21 17:50:35 +00:00
Fix DetailView
Shows all fields of `Project` in `DetailView`
This commit is contained in:
parent
a1dbb90474
commit
3cfe95d214
@ -1,7 +1,5 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from fossdb.models import Project
|
|
||||||
|
|
||||||
|
|
||||||
class HostingPlatform(models.Model):
|
class HostingPlatform(models.Model):
|
||||||
name = models.CharField(max_length=100, unique=True)
|
name = models.CharField(max_length=100, unique=True)
|
||||||
@ -12,7 +10,7 @@ class HostingPlatform(models.Model):
|
|||||||
|
|
||||||
class ProjectHostingPlatform(models.Model):
|
class ProjectHostingPlatform(models.Model):
|
||||||
hosting_platform = models.ForeignKey(HostingPlatform, on_delete=models.CASCADE)
|
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)
|
url = models.URLField(unique=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|||||||
104
FOSSDB/apps/fossdb/migrations/0001_initial.py
Normal file
104
FOSSDB/apps/fossdb/migrations/0001_initial.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -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',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -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',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -1,5 +1,4 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from fossdb.models import Project
|
|
||||||
|
|
||||||
|
|
||||||
class ProgrammingLanguage(models.Model):
|
class ProgrammingLanguage(models.Model):
|
||||||
@ -10,9 +9,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)
|
||||||
programming_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.programming_language} | {self.percentage}%"
|
return f"{self.project.owner}/{self.project.name} | {self.programming_language} | {self.percentage}%"
|
||||||
|
|||||||
@ -1,12 +1,15 @@
|
|||||||
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
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.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
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 HostingPlatformForm
|
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
|
from .programming_language.forms import ProgrammingLanguageForm
|
||||||
|
from .programming_language.models import ProjectProgrammingLanguage
|
||||||
|
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
@ -25,21 +28,23 @@ class ProjectCreateView(LoginRequiredMixin, CreateView):
|
|||||||
redirect_field_name = "redirect_to"
|
redirect_field_name = "redirect_to"
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
form.instance.owner = self.request.user
|
response = None
|
||||||
response = super().form_valid(form)
|
with transaction.atomic():
|
||||||
|
form.instance.owner = self.request.user
|
||||||
|
response = super().form_valid(form)
|
||||||
|
|
||||||
hosting_platform_form = HostingPlatformForm(self.request.POST, instance=self.object)
|
hosting_platform_form = HostingPlatformForm(self.request.POST, instance=self.object)
|
||||||
if hosting_platform_form.is_valid():
|
if hosting_platform_form.is_valid():
|
||||||
hosting_platform = hosting_platform_form.save(commit=False)
|
hosting_platform = hosting_platform_form.save(commit=False)
|
||||||
hosting_platform.project = self.object
|
hosting_platform.project = self.object
|
||||||
hosting_platform.save()
|
hosting_platform.save()
|
||||||
|
|
||||||
# TODO: allow adding multiple languages
|
# TODO: allow adding multiple languages
|
||||||
programming_language_form = ProgrammingLanguageForm(self.request.POST, instance=self.object)
|
programming_language_form = ProgrammingLanguageForm(self.request.POST, instance=self.object)
|
||||||
if programming_language_form.is_valid():
|
if programming_language_form.is_valid():
|
||||||
programming_language = programming_language_form.save(commit=False)
|
programming_language = programming_language_form.save(commit=False)
|
||||||
programming_language.project = self.object
|
programming_language.project = self.object
|
||||||
programming_language.save()
|
programming_language.save()
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -73,25 +78,6 @@ class ProjectUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
|
|||||||
login_url = "/login/"
|
login_url = "/login/"
|
||||||
redirect_field_name = "redirect_to"
|
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):
|
def get_queryset(self):
|
||||||
queryset = super().get_queryset()
|
queryset = super().get_queryset()
|
||||||
return queryset.filter(owner__username=self.kwargs.get("username"))
|
return queryset.filter(owner__username=self.kwargs.get("username"))
|
||||||
|
|||||||
@ -1,11 +1,14 @@
|
|||||||
{% extends "layout.html" %}
|
{% extends "layout.html" %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% block title %}{{ project.name }}{% endblock %}
|
{% block title %}{{ project.owner }}/{{ project.name }}{% endblock %}
|
||||||
{% block meta %}{% endblock %}
|
{% block meta %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>@{{ project.owner.username }}</h2>
|
<h2>@{{ project.owner }}</h2>
|
||||||
<p>{{ project.name }}</p>
|
<h3>{{ project.name }}</h3>
|
||||||
<p>{{ project.description }}</p>
|
<p>{{ project.description }}</p>
|
||||||
|
<p>
|
||||||
|
<a href="{{ project.projecthostingplatform.url }}" target="_blank">{{ project.projecthostingplatform.hosting_platform }}</a>
|
||||||
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
{% for license in project.license.all %}
|
{% for license in project.license.all %}
|
||||||
<li>
|
<li>
|
||||||
@ -16,15 +19,8 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
{% for language in project.programming_language.all %}
|
{% for os in project.operating_system.all %}
|
||||||
<li>{{ language }}%</li>
|
<li>{{ os }}</li>
|
||||||
{% empty %}
|
|
||||||
<p>No language</p>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
<ul>
|
|
||||||
{% for os in project.oprating_system.all %}
|
|
||||||
<li>{{ os.version }}</li>
|
|
||||||
{% empty %}
|
{% empty %}
|
||||||
<p>No OS</p>
|
<p>No OS</p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -36,6 +32,13 @@
|
|||||||
<p>No tag</p>
|
<p>No tag</p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
<ul>
|
||||||
|
{% for language in project.projectprogramminglanguage_set.all %}
|
||||||
|
<li>{{ language.programming_language }} {{ language.percentage }}%</li>
|
||||||
|
{% empty %}
|
||||||
|
<p>No language</p>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
<p>{{ project.date_created|date:"d.m.Y, G:i" }}</p>
|
<p>{{ project.date_created|date:"d.m.Y, G:i" }}</p>
|
||||||
<button>
|
<button>
|
||||||
<a href="{% url 'project-update' project.owner project.name %}">Update</a>
|
<a href="{% url 'project-update' project.owner project.name %}">Update</a>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user